fmsystem-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Fmsystem-commits] [12881] update form-validator from upstream


From: Sigurd Nes
Subject: [Fmsystem-commits] [12881] update form-validator from upstream
Date: Fri, 20 Mar 2015 13:41:36 +0000

Revision: 12881
          http://svn.sv.gnu.org/viewvc/?view=rev&root=fmsystem&revision=12881
Author:   sigurdne
Date:     2015-03-20 13:41:35 +0000 (Fri, 20 Mar 2015)
Log Message:
-----------
update form-validator from upstream

Modified Paths:
--------------
    branches/dev-syncromind/phpgwapi/js/form-validator/date.dev.js
    branches/dev-syncromind/phpgwapi/js/form-validator/date.js
    branches/dev-syncromind/phpgwapi/js/form-validator/file.dev.js
    branches/dev-syncromind/phpgwapi/js/form-validator/file.js
    branches/dev-syncromind/phpgwapi/js/form-validator/form-test.html
    branches/dev-syncromind/phpgwapi/js/form-validator/html5.dev.js
    branches/dev-syncromind/phpgwapi/js/form-validator/html5.js
    branches/dev-syncromind/phpgwapi/js/form-validator/jquery.form-validator.js
    
branches/dev-syncromind/phpgwapi/js/form-validator/jquery.form-validator.min.js
    branches/dev-syncromind/phpgwapi/js/form-validator/location.dev.js
    branches/dev-syncromind/phpgwapi/js/form-validator/location.js
    branches/dev-syncromind/phpgwapi/js/form-validator/qunit.html
    branches/dev-syncromind/phpgwapi/js/form-validator/security.dev.js
    branches/dev-syncromind/phpgwapi/js/form-validator/security.js
    branches/dev-syncromind/phpgwapi/js/form-validator/sweden.dev.js
    branches/dev-syncromind/phpgwapi/js/form-validator/sweden.js
    branches/dev-syncromind/phpgwapi/js/form-validator/uk.dev.js
    branches/dev-syncromind/phpgwapi/js/form-validator/uk.js

Added Paths:
-----------
    branches/dev-syncromind/phpgwapi/js/form-validator/jsconf.dev.js
    branches/dev-syncromind/phpgwapi/js/form-validator/jsconf.js

Modified: branches/dev-syncromind/phpgwapi/js/form-validator/date.dev.js
===================================================================
--- branches/dev-syncromind/phpgwapi/js/form-validator/date.dev.js      
2015-03-20 09:01:00 UTC (rev 12880)
+++ branches/dev-syncromind/phpgwapi/js/form-validator/date.dev.js      
2015-03-20 13:41:35 UTC (rev 12881)
@@ -10,7 +10,7 @@
  *
  * @website http://formvalidator.net/#location-validators
  * @license Dual licensed under the MIT or GPL Version 2 licenses
- * @version 2.2.beta.13
+ * @version 2.2.beta.58
  */
 (function($) {
 

Modified: branches/dev-syncromind/phpgwapi/js/form-validator/date.js
===================================================================
--- branches/dev-syncromind/phpgwapi/js/form-validator/date.js  2015-03-20 
09:01:00 UTC (rev 12880)
+++ branches/dev-syncromind/phpgwapi/js/form-validator/date.js  2015-03-20 
13:41:35 UTC (rev 12881)
@@ -1 +1 @@
-(function($){$.formUtils.addValidator({name:"time",validatorFunction:function(time){if(time.match(/^(\d{2}):(\d{2})$/)===null){return
 false}else{var hours=parseInt(time.split(":")[0],10);var 
minutes=parseInt(time.split(":")[1],10);if(hours>23||minutes>59){return 
false}}return 
true},errorMessage:"",errorMessageKey:"badTime"});$.formUtils.addValidator({name:"birthdate",validatorFunction:function(val,$el,conf){var
 
dateFormat="yyyy-mm-dd";if($el.valAttr("format")){dateFormat=$el.valAttr("format")}else
 if(typeof conf.dateFormat!="undefined"){dateFormat=conf.dateFormat}var 
inputDate=$.formUtils.parseDate(val,dateFormat);if(!inputDate){return false}var 
d=new Date;var currentYear=d.getFullYear();var year=inputDate[0];var 
month=inputDate[1];var day=inputDate[2];if(year===currentYear){var 
currentMonth=d.getMonth()+1;if(month===currentMonth){var 
currentDay=d.getDate();return day<=currentDay}else{return 
month<currentMonth}}else{return 
year<currentYear&&year>currentYear-124}},errorMessage:"",errorMessageKey:"badDate"})})(jQuery);
\ No newline at end of file
+(function($){$.formUtils.addValidator({name:"time",validatorFunction:function(time){if(time.match(/^(\d{2}):(\d{2})$/)===null){return
 false}else{var hours=parseInt(time.split(":")[0],10);var 
minutes=parseInt(time.split(":")[1],10);if(hours>23||minutes>59){return 
false}}return 
true},errorMessage:"",errorMessageKey:"badTime"});$.formUtils.addValidator({name:"birthdate",validatorFunction:function(val,$el,conf){var
 
dateFormat="yyyy-mm-dd";if($el.valAttr("format")){dateFormat=$el.valAttr("format")}else
 if(typeof conf.dateFormat!="undefined"){dateFormat=conf.dateFormat}var 
inputDate=$.formUtils.parseDate(val,dateFormat);if(!inputDate){return false}var 
d=new Date;var currentYear=d.getFullYear();var year=inputDate[0];var 
month=inputDate[1];var day=inputDate[2];if(year===currentYear){var 
currentMonth=d.getMonth()+1;if(month===currentMonth){var 
currentDay=d.getDate();return day<=currentDay}else{return 
month<currentMonth}}else{return 
year<currentYear&&year>currentYear-124}},errorMessage:"",errorMessageKey:"badDate"})})(jQuery);

Modified: branches/dev-syncromind/phpgwapi/js/form-validator/file.dev.js
===================================================================
--- branches/dev-syncromind/phpgwapi/js/form-validator/file.dev.js      
2015-03-20 09:01:00 UTC (rev 12880)
+++ branches/dev-syncromind/phpgwapi/js/form-validator/file.dev.js      
2015-03-20 13:41:35 UTC (rev 12881)
@@ -10,16 +10,18 @@
  *
  * @website http://formvalidator.net/
  * @license Dual licensed under the MIT or GPL Version 2 licenses
- * @version 2.2.beta.13
+ * @version 2.2.beta.58
  */
 (function($, window) {
 
+    'use strict';
+
     var SUPPORTS_FILE_READER = typeof window.FileReader != 'undefined',
 
         /**
          * @return {Array}
          */
-        _getTypes = function($input) {
+            _getTypes = function($input) {
             var allowedTypes = $.split( ($input.valAttr('allowing') || 
'').toLowerCase() );
 
             if( $.inArray('jpg', allowedTypes) > -1 && $.inArray('jpeg', 
allowedTypes) == -1)
@@ -30,9 +32,21 @@
         },
 
         /**
+         * @param {Object} obj
+         * @param {String} key
+         * @param {String} insert
+         * @param {Object} lang
+         */
+            _generateErrorMsg = function(obj, key, insert, lang) {
+            var msg = lang[key];
+            obj.errorMessageKey = ''; // only use message attached to this 
object
+            obj.errorMessage = msg.replace('\%s', insert);
+        },
+
+        /**
          * @param {String} msg
          */
-        _log = function(msg) {
+            _log = function(msg) {
             if( window.console && window.console.log ) {
                 window.console.log(msg);
             }
@@ -43,37 +57,41 @@
      */
     $.formUtils.addValidator({
         name : 'mime',
-        validatorFunction : function(str, $input) {
-            var files = $input.get(0).files || [];
+        validatorFunction : function(str, $input, conf, language) {
 
             if( SUPPORTS_FILE_READER ) {
                 var valid = true,
+                    files = $input.get(0).files || [],
                     mime = '',
                     allowedTypes = _getTypes($input);
 
-                $.each(files, function(i, file) {
-                    valid = false;
-                    mime = file.type || '';
-                    $.each(allowedTypes, function(j, type) {
-                        valid = mime.indexOf(type) > -1;
-                        if( valid ) {
-                            return false;
-                        }
+                if( files.length ) {
+                    $.each(files, function(i, file) {
+                        valid = false;
+                        mime = file.type || '';
+                        $.each(allowedTypes, function(j, type) {
+                            valid = mime.indexOf(type) > -1;
+                            if( valid ) {
+                                return false;
+                            }
+                        });
+                        return valid;
                     });
-                    return valid;
-                });
 
-                if( !valid ) {
-                    _log('Trying to upload a file with mime type '+mime+' 
which is not allowed');
+                    if( !valid ) {
+                        _log('Trying to upload a file with mime type '+mime+' 
which is not allowed');
+                        _generateErrorMsg(this, 'wrongFileType', 
allowedTypes.join(', '), language);
+                    }
                 }
+
                 return valid;
-                
+
             } else {
                 _log('FileReader not supported by browser, will check file 
extension');
                 return 
$.formUtils.validators.validate_extension.validatorFunction(str, $input);
             }
         },
-        errorMessage : 'The file you are trying to upload is of wrong type',
+        errorMessage : '',
         errorMessageKey: 'wrongFileType'
     });
 
@@ -82,21 +100,24 @@
      */
     $.formUtils.addValidator({
         name : 'extension',
-        validatorFunction : function(value, $input) {
+        validatorFunction : function(value, $input, conf, language) {
             var valid = true,
-                types = _getTypes($input);
+                _this = this,
+                allowedTypes = _getTypes($input);
 
-            $.each($input.get(0).files || [], function(i, file) {
-                var val = file.value,
+            $.each($input.get(0).files || [value], function(i, file) {
+                var val = typeof file == 'string' ? file : (file.value || 
file.fileName || file.name),
                     ext = val.substr( val.lastIndexOf('.')+1 );
-                if( $.inArray(ext.toLowerCase(), types) == -1 ) {
+
+                if( $.inArray(ext.toLowerCase(), allowedTypes) == -1 ) {
                     valid = false;
+                    _generateErrorMsg(_this, 'wrongFileType', 
allowedTypes.join(', '), language);
                     return false;
                 }
             });
             return valid;
         },
-        errorMessage : 'The file you are trying to upload is of wrong type',
+        errorMessage : '',
         errorMessageKey: 'wrongFileType'
     });
 
@@ -105,7 +126,7 @@
      */
     $.formUtils.addValidator({
         name : 'size',
-        validatorFunction : function(val, $input) {
+        validatorFunction : function(val, $input, conf, language) {
             var maxSize = $input.valAttr('max-size');
             if( !maxSize ) {
                 _log('Input "'+$input.attr('name')+'" is missing 
data-validation-max-size attribute');
@@ -116,13 +137,18 @@
 
             var maxBytes = $.formUtils.convertSizeNameToBytes(maxSize),
                 valid = true;
+
             $.each($input.get(0).files || [], function(i, file) {
                 valid = file.size <= maxBytes;
                 return valid;
             });
+
+            if( !valid ) {
+                _generateErrorMsg(this, 'wrongFileSize', maxSize, language);
+            }
             return valid;
         },
-        errorMessage : 'The file you are trying to upload is too large',
+        errorMessage : '',
         errorMessageKey: 'wrongFileSize'
     });
 
@@ -162,7 +188,7 @@
             $(this)
                 .removeClass('error')
                 .parent()
-                    .find('.form-error').remove();
+                .find('.form-error').remove();
         });
     });
 

Modified: branches/dev-syncromind/phpgwapi/js/form-validator/file.js
===================================================================
--- branches/dev-syncromind/phpgwapi/js/form-validator/file.js  2015-03-20 
09:01:00 UTC (rev 12880)
+++ branches/dev-syncromind/phpgwapi/js/form-validator/file.js  2015-03-20 
13:41:35 UTC (rev 12881)
@@ -1 +1 @@
-(function($,window){var SUPPORTS_FILE_READER=typeof 
window.FileReader!="undefined",_getTypes=function($input){var 
allowedTypes=$.split(($input.valAttr("allowing")||"").toLowerCase());if($.inArray("jpg",allowedTypes)>-1&&$.inArray("jpeg",allowedTypes)==-1)allowedTypes.push("jpeg");else
 
if($.inArray("jpeg",allowedTypes)>-1&&$.inArray("jpg",allowedTypes)==-1)allowedTypes.push("jpg");return
 
allowedTypes},_log=function(msg){if(window.console&&window.console.log){window.console.log(msg)}};$.formUtils.addValidator({name:"mime",validatorFunction:function(str,$input){var
 files=$input.get(0).files||[];if(SUPPORTS_FILE_READER){var 
valid=true,mime="",allowedTypes=_getTypes($input);$.each(files,function(i,file){valid=false;mime=file.type||"";$.each(allowedTypes,function(j,type){valid=mime.indexOf(type)>-1;if(valid){return
 false}});return valid});if(!valid){_log("Trying to upload a file with mime 
type "+mime+" which is not allowed")}return valid}else{_log("FileReader not 
supported by browser, will check file extension");return 
$.formUtils.validators.validate_extension.validatorFunction(str,$input)}},errorMessage:"The
 file you are trying to upload is of wrong 
type",errorMessageKey:"wrongFileType"});$.formUtils.addValidator({name:"extension",validatorFunction:function(value,$input){var
 
valid=true,types=_getTypes($input);$.each($input.get(0).files||[],function(i,file){var
 
val=file.value,ext=val.substr(val.lastIndexOf(".")+1);if($.inArray(ext.toLowerCase(),types)==-1){valid=false;return
 false}});return valid},errorMessage:"The file you are trying to upload is of 
wrong 
type",errorMessageKey:"wrongFileType"});$.formUtils.addValidator({name:"size",validatorFunction:function(val,$input){var
 maxSize=$input.valAttr("max-size");if(!maxSize){_log('Input 
"'+$input.attr("name")+'" is missing data-validation-max-size 
attribute');return true}else if(!SUPPORTS_FILE_READER){return true}var 
maxBytes=$.formUtils.convertSizeNameToBytes(maxSize),valid=true;$.each($input.get(0).files||[],function(i,file){valid=file.size<=maxBytes;return
 valid});return valid},errorMessage:"The file you are trying to upload is too 
large",errorMessageKey:"wrongFileSize"});$.formUtils.convertSizeNameToBytes=function(sizeName){sizeName=sizeName.toUpperCase();if(sizeName.substr(sizeName.length-1,1)=="M"){return
 parseInt(sizeName.substr(0,sizeName.length-1),10)*1024*1024}else 
if(sizeName.substr(sizeName.length-2,2)=="MB"){return 
parseInt(sizeName.substr(0,sizeName.length-2),10)*1024*1024}else 
if(sizeName.substr(sizeName.length-2,2)=="KB"){return 
parseInt(sizeName.substr(0,sizeName.length-2),10)*1024}else 
if(sizeName.substr(sizeName.length-1,1)=="B"){return 
parseInt(sizeName.substr(0,sizeName.length-1),10)}else{return 
parseInt(sizeName,10)}};$(window).one("validatorsLoaded 
formValidationSetup",function(evt,$form){var 
$inputs;if($form){$inputs=$form.find('input[type="file"]')}else{$inputs=$('input[type="file"]')}$inputs.filter("*[data-validation]").bind("change",function(){$(this).removeClass("error").parent().find(".form-error").remove()})})})(jQuery,window);
\ No newline at end of file
+(function($,window){"use strict";var SUPPORTS_FILE_READER=typeof 
window.FileReader!="undefined",_getTypes=function($input){var 
allowedTypes=$.split(($input.valAttr("allowing")||"").toLowerCase());if($.inArray("jpg",allowedTypes)>-1&&$.inArray("jpeg",allowedTypes)==-1)allowedTypes.push("jpeg");else
 
if($.inArray("jpeg",allowedTypes)>-1&&$.inArray("jpg",allowedTypes)==-1)allowedTypes.push("jpg");return
 allowedTypes},_generateErrorMsg=function(obj,key,insert,lang){var 
msg=lang[key];obj.errorMessageKey="";obj.errorMessage=msg.replace("%s",insert)},_log=function(msg){if(window.console&&window.console.log){window.console.log(msg)}};$.formUtils.addValidator({name:"mime",validatorFunction:function(str,$input,conf,language){if(SUPPORTS_FILE_READER){var
 
valid=true,files=$input.get(0).files||[],mime="",allowedTypes=_getTypes($input);if(files.length){$.each(files,function(i,file){valid=false;mime=file.type||"";$.each(allowedTypes,function(j,type){valid=mime.indexOf(type)>-1;if(valid){return
 false}});return valid});if(!valid){_log("Trying to upload a file with mime 
type "+mime+" which is not 
allowed");_generateErrorMsg(this,"wrongFileType",allowedTypes.join(", 
"),language)}}return valid}else{_log("FileReader not supported by browser, will 
check file extension");return 
$.formUtils.validators.validate_extension.validatorFunction(str,$input)}},errorMessage:"",errorMessageKey:"wrongFileType"});$.formUtils.addValidator({name:"extension",validatorFunction:function(value,$input,conf,language){var
 
valid=true,_this=this,allowedTypes=_getTypes($input);$.each($input.get(0).files||[value],function(i,file){var
 val=typeof 
file=="string"?file:file.value||file.fileName||file.name,ext=val.substr(val.lastIndexOf(".")+1);if($.inArray(ext.toLowerCase(),allowedTypes)==-1){valid=false;_generateErrorMsg(_this,"wrongFileType",allowedTypes.join(",
 "),language);return false}});return 
valid},errorMessage:"",errorMessageKey:"wrongFileType"});$.formUtils.addValidator({name:"size",validatorFunction:function(val,$input,conf,language){var
 maxSize=$input.valAttr("max-size");if(!maxSize){_log('Input 
"'+$input.attr("name")+'" is missing data-validation-max-size 
attribute');return true}else if(!SUPPORTS_FILE_READER){return true}var 
maxBytes=$.formUtils.convertSizeNameToBytes(maxSize),valid=true;$.each($input.get(0).files||[],function(i,file){valid=file.size<=maxBytes;return
 
valid});if(!valid){_generateErrorMsg(this,"wrongFileSize",maxSize,language)}return
 
valid},errorMessage:"",errorMessageKey:"wrongFileSize"});$.formUtils.convertSizeNameToBytes=function(sizeName){sizeName=sizeName.toUpperCase();if(sizeName.substr(sizeName.length-1,1)=="M"){return
 parseInt(sizeName.substr(0,sizeName.length-1),10)*1024*1024}else 
if(sizeName.substr(sizeName.length-2,2)=="MB"){return 
parseInt(sizeName.substr(0,sizeName.length-2),10)*1024*1024}else 
if(sizeName.substr(sizeName.length-2,2)=="KB"){return 
parseInt(sizeName.substr(0,sizeName.length-2),10)*1024}else 
if(sizeName.substr(sizeName.length-1,1)=="B"){return 
parseInt(sizeName.substr(0,sizeName.length-1),10)}else{return 
parseInt(sizeName,10)}};$(window).one("validatorsLoaded 
formValidationSetup",function(evt,$form){var 
$inputs;if($form){$inputs=$form.find('input[type="file"]')}else{$inputs=$('input[type="file"]')}$inputs.filter("*[data-validation]").bind("change",function(){$(this).removeClass("error").parent().find(".form-error").remove()})})})(jQuery,window);

Modified: branches/dev-syncromind/phpgwapi/js/form-validator/form-test.html
===================================================================
--- branches/dev-syncromind/phpgwapi/js/form-validator/form-test.html   
2015-03-20 09:01:00 UTC (rev 12880)
+++ branches/dev-syncromind/phpgwapi/js/form-validator/form-test.html   
2015-03-20 13:41:35 UTC (rev 12881)
@@ -71,7 +71,7 @@
     <form action="" id="form-a" role="form">
         <div class="form-group">
             <label class="control-label" for="inline-suggestions">Inline 
suggestions</label>
-            <input name="inline suggestions" type="text" 
id="inline-suggestions" class="form-control" data-suggestions="Monkey, Horse, 
Fox, Tiger, Elephant" />
+            <input name="inline suggestions" type="text" 
id="inline-suggestions" class="form-control" data-suggestions="Monkey, Horse, 
Hound, Fox, Tiger, Elephant" />
         </div>
 
         <div class="form-group">
@@ -88,8 +88,8 @@
             <label class="control-label">Year</label>
             <input name="birth" class="form-control"
                    data-validation="date"
-                   data-validation-format="yyyy-mm-dd"
-                   data-suggestions="2014-01-15,2014-01-16,2014-01-17" />
+                   data-validation-format="yyyy/mm/dd"
+                   data-suggestions="2014/01/15,2014/01/16,2014/01/17" />
         </div>
 
         <div class="form-group">
@@ -164,7 +164,7 @@
         <div class="form-group">
             <label class="control-label">Server validation</label>
             <input class="form-control" name="code" value="secret"
-                   data-validation-help="The word is &quot;secret&quot;"
+                   data-validation-helssp="The word is &quot;secret&quot;"
                    data-validation="server"
                    
data-validation-url="http://formvalidator.net/validate-email.php"; />
         </div>
@@ -172,12 +172,20 @@
             <label class="control-label">File validation</label>
             <input type="file" name="some-file1" class="form-control"
                    data-validation="size mime required"
-                   data-validation-size-error-msg="The file cant be larger 
than 400kb"
+                   data-validation-error-msg-size="The file cant be larger 
than 400kb"
                    data-validation-error-msg="You must upload an image file 
(max 400 kb)"
                    data-validation-allowing="jpg, png, ico"
                    data-validation-max-size="400kb" />
         </div>
         <div class="form-group">
+            <label class="control-label">File name</label>
+            <input type="text" name="some-file2" class="form-control"
+                   data-validation="extension required"
+                   data-validation-error-msg="You must write a file name with 
extension jpg|png|ico"
+                   data-validation-allowing="jpg, png, ico"
+                    />
+        </div>
+        <div class="form-group">
             <label class="control-label">
                 Callback validation, set this value to &quot;1&quot; and
                 validation will fail
@@ -205,16 +213,17 @@
                 <input type="checkbox" name="box" value="5" /> 5
             </label>
         </div>
+
         <p style="line-height: 200%">
             <input type="submit" class="button">
             <br />
             <button class="button" type="button"
-                    onclick="alert('From a is ' + ( $('#form-a').isValid({}, 
{}, false) ? 'VALID':'NOT VALID'));">
+                    onclick="alert('Form a is ' + ( $('#form-a').isValid({}, 
{}, false) ? 'VALID':'NOT VALID'));">
                 Test validation via js (<strong>without error 
messages</strong>)
             </button>
             <br />
             <button class="button" type="button"
-                    onclick="alert('From a is ' + ( $('#form-a').isValid() ? 
'VALID':'NOT VALID'));">
+                    onclick="alert('Form a is ' + ( $('#form-a').isValid() ? 
'VALID':'NOT VALID'));">
                 Test validation via js (showing error messages)
             </button>
             <br />
@@ -372,9 +381,7 @@
                 }
             },
             onError : function($form) {
-                if( !$.formUtils.haltValidation ) {
-                    alert('Invalid '+$form.attr('id'));
-                }
+                alert('Invalid '+$form.attr('id'));
             },
             onSuccess : function($form) {
                 alert('Valid '+$form.attr('id'));
@@ -394,10 +401,10 @@
     $.formUtils.loadModules('date'+dev+'.js', false, false);
 
     $('input')
-        .on('zbeforeValidation', function() {
+        .on('beforeValidation', function() {
             console.log('About to validate input "'+this.name+'"');
         })
-        .on('validationz', function(evt, isValid) {
+        .on('validation', function(evt, isValid) {
             var validationResult = '';
             if( isValid === null ) {
                 validationResult = 'not validated';

Modified: branches/dev-syncromind/phpgwapi/js/form-validator/html5.dev.js
===================================================================
--- branches/dev-syncromind/phpgwapi/js/form-validator/html5.dev.js     
2015-03-20 09:01:00 UTC (rev 12880)
+++ branches/dev-syncromind/phpgwapi/js/form-validator/html5.dev.js     
2015-03-20 13:41:35 UTC (rev 12881)
@@ -17,7 +17,7 @@
  *
  * @website http://formvalidator.net/
  * @license Dual licensed under the MIT or GPL Version 2 licenses
- * @version 2.2.beta.13
+ * @version 2.2.beta.58
  */
 (function($, window) {
 

Modified: branches/dev-syncromind/phpgwapi/js/form-validator/html5.js
===================================================================
--- branches/dev-syncromind/phpgwapi/js/form-validator/html5.js 2015-03-20 
09:01:00 UTC (rev 12880)
+++ branches/dev-syncromind/phpgwapi/js/form-validator/html5.js 2015-03-20 
13:41:35 UTC (rev 12881)
@@ -1 +1 @@
-(function($,window){"use strict";var SUPPORTS_PLACEHOLDER="placeholder"in 
document.createElement("INPUT"),SUPPORTS_DATALIST="options"in 
document.createElement("DATALIST");$(window).bind("validatorsLoaded 
formValidationSetup",function(evt,$form){if(!$form){$form=$("form")}var 
hasLoadedDateModule=false;$form.each(function(){var 
$f=$(this),$formInputs=$f.find("input,textarea,select"),foundHtml5Rule=false;$formInputs.each(function(){var
 
validation=[],$input=$(this),isRequired=$input.attr("required"),attrs={};switch(($input.attr("type")||"").toLowerCase()){case"time":validation.push("time");if(!$.formUtils.validators.validate_date&&!hasLoadedDateModule){hasLoadedDateModule=true;$.formUtils.loadModules("date")}break;case"url":validation.push("url");break;case"email":validation.push("email");break;case"date":validation.push("date");break;case"number":validation.push("number");var
 
max=$input.attr("max"),min=$input.attr("min");if(min||max){if(!min)min=0;if(!max)max=9007199254740992;attrs["data-validation-allowing"]="range["+min+";"+max+"]";if(min.indexOf("-")===0||max.indexOf("-")===0){attrs["data-validation-allowing"]+=",negative"}if(min.indexOf(".")>-1||max.indexOf(".")>-1){attrs["data-validation-allowing"]+=",float"}}break}if($input.attr("pattern")){validation.push("custom");attrs["data-validation-regexp"]=$input.attr("pattern")}if($input.attr("maxlength")){validation.push("length");attrs["data-validation-length"]="max"+$input.attr("maxlength")}if(!SUPPORTS_DATALIST&&$input.attr("list")){var
 suggestions=[];$("#"+$input.attr("list")+" option").each(function(){var 
$opt=$(this);suggestions.push($opt.attr("value")||$opt.text())});$.formUtils.suggest($input,suggestions)}if(validation.length){if(!isRequired){attrs["data-validation-optional"]="true"}foundHtml5Rule=true;$input.attr("data-validation",validation.join("
 
"));$.each(attrs,function(attrName,attrVal){$input.attr(attrName,attrVal)})}});if(foundHtml5Rule){$f.trigger("html5ValidationAttrsFound")}if(!SUPPORTS_PLACEHOLDER){$formInputs.filter("input[placeholder]").each(function(){this.defaultValue=this.getAttribute("placeholder");$(this).bind("focus",function(){if(this.value==this.defaultValue){this.value="";$(this).removeClass("showing-placeholder")}}).bind("blur",function(){if($.trim(this.value)==""){this.value=this.defaultValue;$(this).addClass("showing-placeholder")}})})}})})})(jQuery,window);
\ No newline at end of file
+(function($,window){"use strict";var SUPPORTS_PLACEHOLDER="placeholder"in 
document.createElement("INPUT"),SUPPORTS_DATALIST="options"in 
document.createElement("DATALIST");$(window).bind("validatorsLoaded 
formValidationSetup",function(evt,$form){if(!$form){$form=$("form")}var 
hasLoadedDateModule=false;$form.each(function(){var 
$f=$(this),$formInputs=$f.find("input,textarea,select"),foundHtml5Rule=false;$formInputs.each(function(){var
 
validation=[],$input=$(this),isRequired=$input.attr("required"),attrs={};switch(($input.attr("type")||"").toLowerCase()){case"time":validation.push("time");if(!$.formUtils.validators.validate_date&&!hasLoadedDateModule){hasLoadedDateModule=true;$.formUtils.loadModules("date")}break;case"url":validation.push("url");break;case"email":validation.push("email");break;case"date":validation.push("date");break;case"number":validation.push("number");var
 
max=$input.attr("max"),min=$input.attr("min");if(min||max){if(!min)min=0;if(!max)max=9007199254740992;attrs["data-validation-allowing"]="range["+min+";"+max+"]";if(min.indexOf("-")===0||max.indexOf("-")===0){attrs["data-validation-allowing"]+=",negative"}if(min.indexOf(".")>-1||max.indexOf(".")>-1){attrs["data-validation-allowing"]+=",float"}}break}if($input.attr("pattern")){validation.push("custom");attrs["data-validation-regexp"]=$input.attr("pattern")}if($input.attr("maxlength")){validation.push("length");attrs["data-validation-length"]="max"+$input.attr("maxlength")}if(!SUPPORTS_DATALIST&&$input.attr("list")){var
 suggestions=[];$("#"+$input.attr("list")+" option").each(function(){var 
$opt=$(this);suggestions.push($opt.attr("value")||$opt.text())});$.formUtils.suggest($input,suggestions)}if(validation.length){if(!isRequired){attrs["data-validation-optional"]="true"}foundHtml5Rule=true;$input.attr("data-validation",validation.join("
 
"));$.each(attrs,function(attrName,attrVal){$input.attr(attrName,attrVal)})}});if(foundHtml5Rule){$f.trigger("html5ValidationAttrsFound")}if(!SUPPORTS_PLACEHOLDER){$formInputs.filter("input[placeholder]").each(function(){this.defaultValue=this.getAttribute("placeholder");$(this).bind("focus",function(){if(this.value==this.defaultValue){this.value="";$(this).removeClass("showing-placeholder")}}).bind("blur",function(){if($.trim(this.value)==""){this.value=this.defaultValue;$(this).addClass("showing-placeholder")}})})}})})})(jQuery,window);

Modified: 
branches/dev-syncromind/phpgwapi/js/form-validator/jquery.form-validator.js
===================================================================
--- branches/dev-syncromind/phpgwapi/js/form-validator/jquery.form-validator.js 
2015-03-20 09:01:00 UTC (rev 12880)
+++ branches/dev-syncromind/phpgwapi/js/form-validator/jquery.form-validator.js 
2015-03-20 13:41:35 UTC (rev 12881)
@@ -5,7 +5,7 @@
 *
 * @website http://formvalidator.net/
 * @license Dual licensed under the MIT or GPL Version 2 licenses
-* @version 2.2.beta.13
+* @version 2.2.beta.58
 */
 (function($) {
 
@@ -13,14 +13,17 @@
 
     var $window = $(window),
         _applyErrorStyle = function($elem, conf) {
-            var $parent = $elem.parent();
             $elem
                 .addClass(conf.errorElementClass)
                 .removeClass('valid');
-            if($parent.hasClass("input-group")) $parent = $parent.parent();
+
+            var $parent = $elem.parent();
+            if($parent.hasClass("input-group"))
+                $parent = $parent.parent();
             
-            $parent.addClass('has-error') .removeClass('has-success'); 
//twitter bs
-                
+            $parent
+               .addClass(conf.inputParentClassOnError)
+                .removeClass(conf.inputParentClassOnSuccess);
 
             if(conf.borderColorOnError !== '') {
                 $elem.css('border-color', conf.borderColorOnError);
@@ -28,25 +31,29 @@
         },
         _removeErrorStyle = function($elem, conf) {
             $elem.each(function() {
-                _setInlineErrorMessage($(this), '', conf, 
conf.errorMessagePosition);
-                var $parent = $(this).parent();
-                
-                if($parent.hasClass("input-group")) $parent = $parent.parent();
-                $(this)
+                var $this = $(this),
+                    $parent = $this.parent();
+
+                if($parent.hasClass("input-group"))
+                    $parent = $parent.parent();
+
+                _setInlineErrorMessage($this, '', conf, 
conf.errorMessagePosition);
+
+                $this
                     .removeClass('valid')
                     .removeClass(conf.errorElementClass)
                     .css('border-color', '');
+
                 $parent
-                    .removeClass('has-error')
-                    .removeClass('has-success')
-                    .find('.'+conf.errorMessageClass) // remove inline error 
message
+                    .removeClass(conf.inputParentClassOnError)
+                           .removeClass(conf.inputParentClassOnSuccess)
+                    .find('.'+conf.errorMessageClass) // remove inline span 
holding error message
                         .remove();
             });
         },
         _setInlineErrorMessage = function($input, mess, conf, 
$messageContainer) {
             var custom = _getInlineErrorElement($input);
-            var $parent = $input.parent();
-            if($parent.hasClass("input-group")) $parent = $parent.parent();
+            
             if( custom ) {
                 custom.innerHTML = mess;
             }
@@ -71,6 +78,8 @@
                 }
             }
             else {
+               var $parent = $input.parent();
+                   if($parent.hasClass("input-group")) $parent = 
$parent.parent();
                 var $mess = 
$parent.find('.'+conf.errorMessageClass+'.help-block');
                 if( $mess.length == 0 ) {
                     $mess = 
$('<span></span>').addClass('help-block').addClass(conf.errorMessageClass);
@@ -106,6 +115,13 @@
             .bind('blur.validation', function() {
                 $(this).validateInputOnBlur(language, settings, true, 'blur');
             });
+        if(settings.validateCheckboxRadioOnClick) {
+        // bind click event to validate on click for radio & checkboxes for 
nice UX
+        
this.find('input[type=checkbox][data-validation],input[type=radio][data-validation]')
+            .bind('click.validation', function() {
+                $(this).validateInputOnBlur(language, settings, true, 'click');
+            });
+        }
 
         return this;
     };
@@ -120,7 +136,7 @@
         
this.find('input[data-validation][data-validation-event],textarea[data-validation][data-validation-event],select[data-validation][data-validation-event]')
                        .each(function(){
                                var $el = $(this),
-                                   etype = $el.attr("data-validation-event");
+                                   etype = $el.valAttr("event");
                                if (etype){
                                        $el.bind(etype + ".validation", 
function(){
                                $(this).validateInputOnBlur(language, settings, 
true, etype);
@@ -198,6 +214,7 @@
     * @return {jQuery}
     */
     $.fn.validateInputOnBlur = function(language, conf, attachKeyupEvent, 
eventType) {
+
         $.formUtils.eventType = eventType;
 
         if( (this.valAttr('suggestion-nr') || this.valAttr('postpone') || 
this.hasClass('hasDatepicker')) && !window.postponedValidation ) {
@@ -235,7 +252,8 @@
             $elem
                 .addClass('valid')
                 .parent()
-                    .addClass('has-success'); // twitter bs
+                    .addClass(conf.inputParentClassOnSuccess); 
+                    
         } else if(validation !== null) {
 
             _applyErrorStyle($elem, conf);
@@ -274,7 +292,7 @@
     };
 
     /**
-     * Function that validate all inputs in given element
+     * Function that validates all inputs in active form
      *
      * @param {Object} [language]
      * @param {Object} [conf]
@@ -294,6 +312,14 @@
         language = $.extend({}, $.formUtils.LANG, language || {});
         displayError = displayError !== false;
 
+        if($.formUtils.errorDisplayPreventedWhenHalted) {
+            // isValid() was called programmatically with argument 
displayError set
+            // to false when the validation was halted by any of the validators
+            delete $.formUtils.errorDisplayPreventedWhenHalted
+            displayError = false;
+        }
+
+
         $.formUtils.isValidatingEntireForm = true;
         $.formUtils.haltValidation = false;
 
@@ -304,18 +330,18 @@
          * @para {jQuery} $elem
          */
         var addErrorMessage = function(mess, $elem) {
-            // validate server side will return null as error message before 
the server is requested
-            if(mess !== null) {
-                if ($.inArray(mess, errorMessages) < 0) {
-                    errorMessages.push(mess);
-                }
-                errorInputs.push($elem);
-                $elem.attr('current-error', mess);
-                if( displayError )
-                    _applyErrorStyle($elem, conf);
+            if ($.inArray(mess, errorMessages) < 0) {
+                errorMessages.push(mess);
             }
+            errorInputs.push($elem);
+            $elem.attr('current-error', mess);
+            if( displayError )
+                _applyErrorStyle($elem, conf);
         },
 
+        /** Holds inputs (of type checkox or radio) already validated, to 
prevent recheck of mulitple checkboxes & radios */
+        checkedInputs = [],
+       
         /** Error messages for this validation */
         errorMessages = [],
 
@@ -347,10 +373,16 @@
 
         // Validate element values
         
$form.find('input,textarea,select').filter(':not([type="submit"],[type="button"])').each(function()
 {
-            var $elem = $(this);
-            var elementType = $elem.attr('type');
-            if (!ignoreInput($elem.attr('name'), elementType)) {
+            var $elem = $(this),
+                elementType = $elem.attr('type'),
+                isCheckboxOrRadioBtn = elementType == 'radio' || elementType 
== 'checkbox',
+                elementName = $elem.attr('name');
 
+            if (!ignoreInput(elementName, elementType) && 
(!isCheckboxOrRadioBtn || $.inArray(elementName, checkedInputs) < 0) ) {
+
+                if( isCheckboxOrRadioBtn )
+                    checkedInputs.push(elementName);
+
                 var validation = $.formUtils.validateInput(
                                 $elem,
                                 language,
@@ -359,22 +391,18 @@
                                 'submit'
                             );
 
-                // Run element validation callback
-                if( typeof conf.onElementValidate == 'function' ) {
-                    conf.onElementValidate((validation === true), $elem, 
$form, validation);
-                }
-
-                if(validation !== true) {
-                    addErrorMessage(validation, $elem);
-                } else {
-                    $elem
-                        .valAttr('current-error', false)
-                        .addClass('valid')
-                        .parent()
+                if(validation != null) {
+                    if(validation !== true) {
+                        addErrorMessage(validation, $elem);
+                    } else {
+                        $elem
+                            .valAttr('current-error', false)
+                            .addClass('valid')
+                            .parent()
                             .addClass('has-success');
+                    }
                 }
             }
-
         });
 
         // Run validation callback
@@ -422,6 +450,10 @@
             return false;
         }
 
+        if( !displayError && $.formUtils.haltValidation ) {
+            $.formUtils.errorDisplayPreventedWhenHalted = true;
+        }
+
         return !$.formUtils.haltValidation;
     };
 
@@ -468,32 +500,34 @@
 
     /**
      * A bit smarter split function
+     * delimiter can be space, comma, dash or pipe
      * @param {String} val
      * @param {Function|String} [func]
-     * @param {String} [delim]
      * @returns {Array|void}
      */
-    $.split = function(val, func, delim) {
+    $.split = function(val, func) {
         if( typeof func != 'function' ) {
-            // return string
+            // return array
             if( !val )
                 return [];
             var values = [];
-            $.each(val.split(func ? func:','), function(i,str) {
-                str = $.trim(str);
-                if( str.length )
-                    values.push(str);
-            });
+            $.each(val.split(func ? func: /[,|\-\s]\s*/g ),
+                function(i,str) {
+                    str = $.trim(str);
+                    if( str.length )
+                        values.push(str);
+                }
+            );
             return values;
         } else if( val ) {
-            // use callback on each
-            if( !delim )
-                delim = ',';
-            $.each(val.split(delim), function(i, str) {
-                str = $.trim(str);
-                if( str.length )
-                    return func(str, i);
-            });
+            // exec callback func on each
+            $.each(val.split(/[,|\-\s]\s*/g),
+                function(i, str) {
+                    str = $.trim(str);
+                    if( str.length )
+                        return func(str, i);
+                }
+            );
         }
     };
 
@@ -510,6 +544,7 @@
                         */
             validateOnEvent : true,
             validateOnBlur : true,
+            validateCheckboxRadioOnClick : true,
             showHelpOnFocus : true,
             addSuggestions : true,
             modules : '',
@@ -517,7 +552,7 @@
             language : false,
             onSuccess : false,
             onError : false,
-            onElementValidate : false
+            onElementValidate : false,
         });
 
         conf = $.extend(defaultConf, conf || {});
@@ -543,22 +578,34 @@
             $form.bind('submit.validation', function() {
                 var $form = $(this);
 
+                if( $.formUtils.haltValidation ) {
+                    // pressing several times on submit button while 
validation is halted
+                    return false;
+                }
+
                 if($.formUtils.isLoadingModules) {
                     setTimeout(function() {
                         $form.trigger('submit.validation');
                     }, 200);
                     return false;
                 }
+
                 var valid = $form.isValid(conf.language, conf);
-                if( valid && typeof conf.onSuccess == 'function') {
-                    var callbackResponse = conf.onSuccess($form);
-                    if( callbackResponse === false )
-                        return false;
-                } else if ( !valid && typeof conf.onError == 'function' ) {
-                    conf.onError($form);
+
+                if( $.formUtils.haltValidation ) {
+                    // Validation got halted by one of the validators
                     return false;
                 } else {
-                    return valid;
+                    if( valid && typeof conf.onSuccess == 'function') {
+                        var callbackResponse = conf.onSuccess($form);
+                        if( callbackResponse === false )
+                            return false;
+                    } else if ( !valid && typeof conf.onError == 'function' ) {
+                        conf.onError($form);
+                        return false;
+                    } else {
+                        return valid;
+                    }
                 }
             })
             .bind('reset.validation', function() {
@@ -580,10 +627,9 @@
                     $form.validateOnBlur(conf.language, conf);
                 })
             }
-                       if( conf.validateOnEvent ){
-                $form.validateOnEvent(conf.language, conf);
-                       }
-
+            if( conf.validateOnEvent ){
+              $form.validateOnEvent(conf.language, conf);
+                             }
         });
 
         if( conf.modules != '' ) {
@@ -620,7 +666,9 @@
                 scrollToTopOnError : true,
                 dateFormat : 'yyyy-mm-dd',
                 addValidClassOnAll : false, // whether or not to apply 
class="valid" even if the input wasn't validated
-                decimalSeparator : '.'
+                decimalSeparator : '.',
+                inputParentClassOnError : 'has-error', // twitter-bootstrap 
default class name
+                inputParentClassOnSuccess : 'has-success' // twitter-bootstrap 
default class name
             }
         },
 
@@ -853,12 +901,13 @@
                 var validator = $.formUtils.validators[rule];
 
                 if( validator && typeof validator['validatorFunction'] == 
'function' ) {
+                    
                     // special change of element for checkbox_group rule
                     if ( rule == 'validate_checkbox_group' ) {
-                        // set element to first in group, so error msg is set 
only once
+                        // set element to first in group, so error msg attr 
doesn't need to be set on all elements in group
                             $elem = $("[name='"+$elem.attr('name')+"']:eq(0)");
                     }
-
+                    
                     var isValid = null;
                     if( eventContext != 'keyup' || validator.validateOnKeyUp ) 
{
                         isValid = validator.validatorFunction(value, $elem, 
conf, language, $form);
@@ -886,15 +935,24 @@
 
             }, ' ');
 
+            var result;
+
             if( typeof validationErrorMsg == 'string' ) {
                 $elem.trigger('validation', false);
-                return validationErrorMsg;
+                result = validationErrorMsg;
             } else if( validationErrorMsg === null && !conf.addValidClassOnAll 
) {
-                return null;
+                result = null;
             } else {
                 $elem.trigger('validation', true);
-                return true;
+                result = true;
             }
+
+            // Run element validation callback
+            if( typeof conf.onElementValidate == 'function' && result !== null 
) {
+                conf.onElementValidate((result === true), $elem, $form, 
validationErrorMsg);
+            }
+
+            return result;
         },
 
        /**
@@ -908,7 +966,7 @@
         parseDate : function(val, dateFormat) {
             var divider = dateFormat.replace(/[a-zA-Z]/gi, '').substring(0,1),
                 regexp = '^',
-                formatParts = dateFormat.split(divider),
+                formatParts = dateFormat.split(divider || null),
                 matches, day, month, year;
 
             $.each(formatParts, function(i, part) {
@@ -1019,7 +1077,7 @@
         numericRangeCheck : function(value, rangeAllowed) 
         {
             // split by dash
-            var range = $.split(rangeAllowed, '-');
+            var range = $.split(rangeAllowed);
             // min or max
             var minmax = parseInt(rangeAllowed.substr(3),10)
             // range ?
@@ -1287,8 +1345,8 @@
             badNumberOfSelectedOptionsEnd : ' answers',
             badAlphaNumeric : 'The input value can only contain alphanumeric 
characters ',
             badAlphaNumericExtra: ' and ',
-            wrongFileSize : 'The file you are trying to upload is too large',
-            wrongFileType : 'The file you are trying to upload is of wrong 
type',
+            wrongFileSize : 'The file you are trying to upload is too large 
(max %s)',
+            wrongFileType : 'Only files of type %s is allowed',
             groupCheckedRangeStart : 'Please choose between ',
             groupCheckedTooFewStart : 'Please choose at least ',
             groupCheckedTooManyStart : 'Please choose a maximum of ',
@@ -1314,7 +1372,7 @@
             var emailParts = email.toLowerCase().split('@');
             if( emailParts.length == 2 ) {
                 return 
$.formUtils.validators.validate_domain.validatorFunction(emailParts[1]) &&
-                        !(/[^\w\+\.\-]/.test(emailParts[0]));
+                        !(/[^\w\+\.\-]/.test(emailParts[0])) && 
emailParts[0].length > 0;
             }
 
             return false;
@@ -1328,97 +1386,14 @@
     */
     $.formUtils.addValidator({
         name : 'domain',
-        validatorFunction : function(val, $input) {
-
-            var topDomains =  ['.ac', '.ad', '.ae', '.aero', '.af', '.ag', 
'.ai', '.al', '.am', '.an', '.ao',
-                        '.aq', '.ar', '.arpa', '.as', '.asia', '.at', '.au', 
'.aw', '.ax', '.az', '.ba', '.bb',
-                        '.bd', '.be', '.bf', '.bg', '.bh', '.bi', '.bike', 
'.biz', '.bj', '.bm', '.bn', '.bo',
-                        '.br', '.bs', '.bt', '.bv', '.bw', '.by', '.bz', 
'.ca', '.camera', '.cat', '.cc', '.cd',
-                        '.cf', '.cg', '.ch', '.ci', '.ck', '.cl', '.clothing', 
'.cm', '.cn', '.co', '.com',
-                        '.construction', '.contractors', '.coop', '.cr', 
'.cu', '.cv', '.cw', '.cx', '.cy', '.cz',
-                        '.de', '.diamonds', '.directory', '.dj', '.dk', '.dm', 
'.do', '.dz', '.ec', '.edu', '.ee',
-                        '.eg', '.enterprises', '.equipment', '.er', '.es', 
'.estate', '.et', '.eu', '.fi', '.fj',
-                        '.fk', '.fm', '.fo', '.fr', '.ga', '.gallery', '.gb', 
'.gd', '.ge', '.gf', '.gg', '.gh',
-                        '.gi', '.gl', '.gm', '.gn', '.gov', '.gp', '.gq', 
'.gr', '.graphics', '.gs', '.gt', '.gu',
-                        '.guru', '.gw', '.gy', '.hk', '.hm', '.hn', 
'.holdings', '.hr', '.ht', '.hu', '.id', '.ie',
-                        '.il', '.im', '.in', '.info', '.int', '.io', '.iq', 
'.ir', '.is', '.it', '.je', '.jm', '.jo',
-                        '.jobs', '.jp', '.ke', '.kg', '.kh', '.ki', 
'.kitchen', '.km', '.kn', '.kp', '.kr', '.kw',
-                        '.ky', '.kz', '.la', '.land', '.lb', '.lc', '.li', 
'.lighting', '.lk', '.lr', '.ls', '.lt',
-                        '.lu', '.lv', '.ly', '.ma', '.mc', '.md', '.me', 
'.menu', '.mg', '.mh', '.mil', '.mk', '.ml',
-                        '.mm', '.mn', '.mo', '.mobi', '.mp', '.mq', '.mr', 
'.ms', '.mt', '.mu', '.museum', '.mv',
-                        '.mw', '.mx', '.my', '.mz', '.na', '.name', '.nc', 
'.ne', '.net', '.nf', '.ng', '.ni',
-                        '.nl', '.no', '.np', '.nr', '.nu', '.nz', '.om', 
'.org', '.pa', '.pe', '.pf', '.pg', '.ph',
-                        '.photography', '.pk', '.pl', '.plumbing', '.pm', 
'.pn', '.post', '.pr', '.pro', '.ps', '.pt',
-                        '.pw', '.py', '.qa', '.re', '.ro', '.rs', '.ru', 
'.rw', '.sa', '.sb', '.sc', '.sd', '.se',
-                        '.sexy', '.sg', '.sh', '.si', '.singles', '.sj', 
'.sk', '.sl', '.sm', '.sn', '.so', '.sr',
-                        '.st', '.su', '.sv', '.sx', '.sy', '.sz', '.tattoo', 
'.tc', '.td', '.technology', '.tel', '.tf',
-                        '.tg', '.th', '.tips', '.tj', '.tk', '.tl', '.tm', 
'.tn', '.to', '.today', '.tp', '.tr', '.travel',
-                        '.tt', '.tv', '.tw', '.tz', '.ua', '.ug', '.uk', 
'.uno', '.us', '.uy', '.uz', '.va', '.vc', '.ve',
-                        '.ventures', '.vg', '.vi', '.vn', '.voyage', '.vu', 
'.wf', '.ws', '.xn--3e0b707e', '.xn--45brj9c',
-                        '.xn--80ao21a', '.xn--80asehdb', '.xn--80aswg', 
'.xn--90a3ac', '.xn--clchc0ea0b2g2a9gcd', '.xn--fiqs8s',
-                        '.xn--fiqz9s', '.xn--fpcrj9c3d', '.xn--fzc2c9e2c', 
'.xn--gecrj9c', '.xn--h2brj9c', '.xn--j1amh',
-                        '.xn--j6w193g', '.xn--kprw13d', '.xn--kpry57d', 
'.xn--l1acc', '.xn--lgbbat1ad8j', '.xn--mgb9awbf',
-                        '.xn--mgba3a4f16a', '.xn--mgbaam7a8h', 
'.xn--mgbayh7gpa', '.xn--mgbbh1a71e', '.xn--mgbc0a9azcg',
-                        '.xn--mgberp4a5d4ar', '.xn--mgbx4cd0ab', 
'.xn--ngbc5azd', '.xn--o3cw4h', '.xn--ogbpf8fl', '.xn--p1ai',
-                        '.xn--pgbs0dh', '.xn--q9jyb4c', '.xn--s9brj9c', 
'.xn--unup4y', '.xn--wgbh1c', '.xn--wgbl6a',
-                        '.xn--xkc2al3hye2a', '.xn--xkc2dl3a5ee0h', 
'.xn--yfro4i67o', '.xn--ygbi2ammx', '.xxx', '.ye',
-                        '.yt', '.za', '.zm', '.zw'],
-
-                ukTopDomains = ['co', 'me', 'ac', 'gov', 'judiciary','ltd', 
'mod', 'net', 'nhs', 'nic',
-                        'org', 'parliament', 'plc', 'police', 'sch', 'bl', 
'british-library', 'jet','nls'],
-
-                dot = val.lastIndexOf('.'),
-                domain = val.substring(0, dot),
-                ext = val.substring(dot, val.length),
-                hasTopDomain = false;
-
-            for (var i = 0; i < topDomains.length; i++) {
-                if (topDomains[i] === ext) {
-                    if(ext==='.uk') {
-                        //Run Extra Checks for UK Domain Names
-                        var domainParts = val.split('.');
-                        var tld2 = domainParts[domainParts.length-2];
-                        for(var j = 0; j < ukTopDomains.length; j++) {
-                            if(ukTopDomains[j] === tld2) {
-                                hasTopDomain = true;
-                                break;
-                            }
-                        }
-
-                        if(hasTopDomain)
-                            break;
-
-                    } else {
-                        hasTopDomain = true;
-                        break;
-                    }
-                }
-            }
-
-            if (!hasTopDomain) {
-                return false;
-            } else if (dot < 2 || dot > 57) {
-                return $.inArray(val, ['i.net', 'q.com', 'q.net', 'x.com', 
'x.org', 'z.com', 'w.org']) > -1;
-            } else {
-                var firstChar = domain.substring(0, 1),
-                    lastChar = domain.substring(domain.length - 1, 
domain.length);
-
-                if (firstChar === '-' || firstChar === '.' || lastChar === '-' 
|| lastChar === '.') {
-                    return false;
-                }
-                if (domain.split('..').length > 1) {
-                    return false;
-                }
-                if (domain.replace(/[-\da-z\.]/g, '') !== '') {
-                    return false;
-                }
-            }
-
-            if(typeof $input !== 'undefined') {
-                $input.val(val);
-            }
-
-            return true;
+        validatorFunction : function(val) {
+            return val.length > 0 &&
+                    val.length <= 253 && // Including sub domains
+                    !(/[^a-zA-Z0-9]/.test(val.substr(-2))) &&
+                    !(/[^a-zA-Z]/.test(val.substr(0,1))) &&
+                    !(/[^a-zA-Z0-9\.\-]/.test(val)) &&
+                    val.split('..').length == 1 &&
+                    val.split('.').length > 1;
         },
         errorMessage : '',
         errorMessageKey: 'badDomain'
@@ -1453,8 +1428,7 @@
                 type = $el.attr('type');
 
             if(lengthAllowed == undefined) {
-                var elementType = $el.get(0).nodeName;
-                alert('Please add attribute "data-validation-length" to 
'+elementType+' named '+$el.attr('name'));
+                alert('Please add attribute "data-validation-length" to 
'+$el[0].nodeName+' named '+$el.attr('name'));
                 return true;
             }
 
@@ -1501,8 +1475,9 @@
             // - General improvements made by Stéphane Moureau 
<https://github.com/TraderStf>
             var urlFilter = 
/^(https?|ftp):\/\/((((\w|-|\.|~|[\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])(\w|-|\.|~|[\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])(\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/(((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|\[|\]|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#(((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i;
             if( urlFilter.test(url) ) {
-                var domain = url.split('://')[1];
-                var domainSlashPos = domain.indexOf('/');
+                var domain = url.split('://')[1],
+                    domainSlashPos = domain.indexOf('/');
+
                 if(domainSlashPos > -1)
                     domain = domain.substr(0, domainSlashPos);
 
@@ -1543,9 +1518,7 @@
                 }
                 
                 if(steps != "") 
-               {
-                   allowsSteps = true;
-               }
+                       allowsSteps = true;
 
                 if( decimalSeparator == ',' ) {
                     if( val.indexOf('.') > -1 ) {
@@ -1576,7 +1549,7 @@
         validatorFunction : function(val, $el, conf, language) {
             var patternStart = '^([a-zA-Z0-9',
                 patternEnd = ']+)$',
-                additionalChars = $el.attr('data-validation-allowing'),
+                additionalChars = $el.valAttr('allowing'),
                 pattern = '';
 
             if( additionalChars ) {
@@ -1617,14 +1590,7 @@
     $.formUtils.addValidator({
         name : 'date',
         validatorFunction : function(date, $el, conf) {
-            var dateFormat = 'yyyy-mm-dd';
-            if($el.valAttr('format')) {
-                dateFormat = $el.valAttr('format');
-            }
-            else if( conf.dateFormat ) {
-                dateFormat = conf.dateFormat;
-            }
-
+            var dateFormat = $el.valAttr('format') || conf.dateFormat || 
'yyyy-mm-dd';
             return $.formUtils.parseDate(date, dateFormat) !== false;
         },
         errorMessage : '',
@@ -1643,20 +1609,24 @@
     $.formUtils.addValidator({
         name : 'checkbox_group',
         validatorFunction : function(val, $el, conf, lang, $form)
-        {   // preset return var
-            var checkResult = true;
-            // get name of element. since it is a checkbox group, all 
checkboxes will have same name
-            var elname = $el.attr('name');
-            // get count of checked checkboxes with this name
-            var checkedCount = 
$("input[type=checkbox][name^='"+elname+"']:checked", $form).length;
-            // get el attr that specs qty required / allowed
-            var qtyAllowed = $el.valAttr('qty');
+        {
+            // preset return var
+            var checkResult = true,
+                // get name of element. since it is a checkbox group, all 
checkboxes will have same name
+                elname = $el.attr('name'),
+                // get count of checked checkboxes with this name
+                checkedCount = 
$("input[type=checkbox][name^='"+elname+"']:checked", $form).length,
+                // get el attr that specs qty required / allowed
+                qtyAllowed = $el.valAttr('qty');
+
             if (qtyAllowed == undefined) {
                 var elementType = $el.get(0).nodeName;
                 alert('Attribute "data-validation-qty" is missing from 
'+elementType+' named '+$el.attr('name'));
             }
+
             // call Utility function to check if count is above min, below 
max, within range etc.
             var qtyCheckResults = $.formUtils.numericRangeCheck(checkedCount, 
qtyAllowed) ;
+
             // results will be array, [0]=result str, [1]=qty int
             switch(qtyCheckResults[0] ) {   
                 // outside allowed range
@@ -1679,8 +1649,7 @@
                     checkResult = true;
             }
             
-        return checkResult;
-        
+            return checkResult;
         }
      //   errorMessage : '', // set above in switch statement
      //   errorMessageKey: '' // not used

Modified: 
branches/dev-syncromind/phpgwapi/js/form-validator/jquery.form-validator.min.js
===================================================================
--- 
branches/dev-syncromind/phpgwapi/js/form-validator/jquery.form-validator.min.js 
    2015-03-20 09:01:00 UTC (rev 12880)
+++ 
branches/dev-syncromind/phpgwapi/js/form-validator/jquery.form-validator.min.js 
    2015-03-20 13:41:35 UTC (rev 12881)
@@ -5,7 +5,6 @@
 *
 * @website http://formvalidator.net/
 * @license Dual licensed under the MIT or GPL Version 2 licenses
-* @version 2.2.beta.13
+* @version 2.2.beta.58
 */
-(function($){"use strict";var 
$window=$(window),_applyErrorStyle=function($elem,conf){var 
$parent=$elem.parent();$elem.addClass(conf.errorElementClass).removeClass("valid");if($parent.hasClass("input-group"))$parent=$parent.parent();$parent.addClass("has-error").removeClass("has-success");if(conf.borderColorOnError!==""){$elem.css("border-color",conf.borderColorOnError)}},_removeErrorStyle=function($elem,conf){$elem.each(function(){_setInlineErrorMessage($(this),"",conf,conf.errorMessagePosition);var
 
$parent=$(this).parent();if($parent.hasClass("input-group"))$parent=$parent.parent();$(this).removeClass("valid").removeClass(conf.errorElementClass).css("border-color","");$parent.removeClass("has-error").removeClass("has-success").find("."+conf.errorMessageClass).remove()})},_setInlineErrorMessage=function($input,mess,conf,$messageContainer){var
 custom=_getInlineErrorElement($input);var 
$parent=$input.parent();if($parent.hasClass("input-group"))$parent=$parent.parent();if(custom){custom.innerHTML=mess}else
 if(typeof $messageContainer=="object"){var 
$found=false;$messageContainer.find("."+conf.errorMessageClass).each(function(){if(this.inputReferer==$input[0]){$found=$(this);return
 false}});if($found){if(!mess){$found.remove()}else{$found.html(mess)}}else{var 
$mess=$('<div 
class="'+conf.errorMessageClass+'">'+mess+"</div>");$mess[0].inputReferer=$input[0];$messageContainer.prepend($mess)}}else{var
 
$mess=$parent.find("."+conf.errorMessageClass+".help-block");if($mess.length==0){$mess=$("<span></span>").addClass("help-block").addClass(conf.errorMessageClass);$mess.appendTo($parent)}$mess.html(mess)}},_getInlineErrorElement=function($input,conf){return
 
document.getElementById($input.attr("name")+"_err_msg")},_templateMessage=function($form,title,errorMessages,conf){var
 
messages=conf.errorMessageTemplate.messages.replace(/\{errorTitle\}/g,title);var
 
fields=[];$.each(errorMessages,function(i,msg){fields.push(conf.errorMessageTemplate.field.replace(/\{msg\}/g,msg))});messages=messages.replace(/\{fields\}/g,fields.join(""));var
 
container=conf.errorMessageTemplate.container.replace(/\{errorMessageClass\}/g,conf.errorMessageClass);container=container.replace(/\{messages\}/g,messages);$form.children().eq(0).before(container)};$.fn.validateOnBlur=function(language,settings){this.find("input[data-validation],textarea[data-validation],select[data-validation]").bind("blur.validation",function(){$(this).validateInputOnBlur(language,settings,true,"blur")});return
 
this};$.fn.validateOnEvent=function(language,settings){this.find("input[data-validation][data-validation-event],textarea[data-validation][data-validation-event],select[data-validation][data-validation-event]").each(function(){var
 
$el=$(this),etype=$el.attr("data-validation-event");if(etype){$el.bind(etype+".validation",function(){$(this).validateInputOnBlur(language,settings,true,etype)})}});return
 
this};$.fn.showHelpOnFocus=function(attrName){if(!attrName){attrName="data-validation-help"}this.find(".has-help-txt").valAttr("has-keyup-event",false).removeClass("has-help-txt");this.find("textarea,input").each(function(){var
 
$elem=$(this),className="jquery_form_help_"+($elem.attr("name")||"").replace(/(:|\.|\[|\])/g,""),help=$elem.attr(attrName);if(help){$elem.addClass("has-help-txt").unbind("focus.help").bind("focus.help",function(){var
 $help=$elem.parent().find("."+className);if($help.length==0){$help=$("<span 
/>").addClass(className).addClass("help").addClass("help-block").text(help).hide();$elem.after($help)}$help.fadeIn()}).unbind("blur.help").bind("blur.help",function(){$(this).parent().find("."+className).fadeOut("slow")})}});return
 
this};$.fn.validateInputOnBlur=function(language,conf,attachKeyupEvent,eventType){$.formUtils.eventType=eventType;if((this.valAttr("suggestion-nr")||this.valAttr("postpone")||this.hasClass("hasDatepicker"))&&!window.postponedValidation){var
 
_self=this,postponeTime=this.valAttr("postpone")||200;window.postponedValidation=function(){_self.validateInputOnBlur(language,conf,attachKeyupEvent,eventType);window.postponedValidation=false};setTimeout(function(){if(window.postponedValidation){window.postponedValidation()}},postponeTime);return
 
this}language=$.extend({},$.formUtils.LANG,language||{});_removeErrorStyle(this,conf);var
 
$elem=this,$form=$elem.closest("form"),validationRule=$elem.attr(conf.validationRuleAttribute),validation=$.formUtils.validateInput($elem,language,$.extend({},conf,{errorMessagePosition:"element"}),$form,eventType);if(validation===true){$elem.addClass("valid").parent().addClass("has-success")}else
 
if(validation!==null){_applyErrorStyle($elem,conf);_setInlineErrorMessage($elem,validation,conf,conf.errorMessagePosition);if(attachKeyupEvent){$elem.unbind("keyup.validation").bind("keyup.validation",function(){$(this).validateInputOnBlur(language,conf,false,"keyup")})}}return
 this};$.fn.valAttr=function(name,val){if(val===undefined){return 
this.attr("data-validation-"+name)}else if(val===false||val===null){return 
this.removeAttr("data-validation-"+name)}else{if(name.length>0)name="-"+name;return
 
this.attr("data-validation"+name,val)}};$.fn.isValid=function(language,conf,displayError){if($.formUtils.isLoadingModules){var
 
$self=this;setTimeout(function(){$self.isValid(language,conf,displayError)},200);return
 
null}conf=$.extend({},$.formUtils.defaultConfig(),conf||{});language=$.extend({},$.formUtils.LANG,language||{});displayError=displayError!==false;$.formUtils.isValidatingEntireForm=true;$.formUtils.haltValidation=false;var
 
addErrorMessage=function(mess,$elem){if(mess!==null){if($.inArray(mess,errorMessages)<0){errorMessages.push(mess)}errorInputs.push($elem);$elem.attr("current-error",mess);if(displayError)_applyErrorStyle($elem,conf)}},errorMessages=[],errorInputs=[],$form=this,ignoreInput=function(name,type){if(type==="submit"||type==="button"||type=="reset"){return
 true}return 
$.inArray(name,conf.ignore||[])>-1};if(displayError){$form.find("."+conf.errorMessageClass+".alert").remove();_removeErrorStyle($form.find("."+conf.errorElementClass+",.valid"),conf)}$form.find("input,textarea,select").filter(':not([type="submit"],[type="button"])').each(function(){var
 $elem=$(this);var 
elementType=$elem.attr("type");if(!ignoreInput($elem.attr("name"),elementType)){var
 
validation=$.formUtils.validateInput($elem,language,conf,$form,"submit");if(typeof
 
conf.onElementValidate=="function"){conf.onElementValidate(validation===true,$elem,$form,validation)}if(validation!==true){addErrorMessage(validation,$elem)}else{$elem.valAttr("current-error",false).addClass("valid").parent().addClass("has-success")}}});if(typeof
 conf.onValidate=="function"){var 
errors=conf.onValidate($form);if($.isArray(errors)){$.each(errors,function(i,err){addErrorMessage(err.message,err.element)})}else
 
if(errors&&errors.element&&errors.message){addErrorMessage(errors.message,errors.element)}}$.formUtils.isValidatingEntireForm=false;if(!$.formUtils.haltValidation&&errorInputs.length>0){if(displayError){if(conf.errorMessagePosition==="top"){_templateMessage($form,language.errorTitle,errorMessages,conf)}else
 if(conf.errorMessagePosition==="custom"){if(typeof 
conf.errorMessageCustom==="function"){conf.errorMessageCustom($form,language.errorTitle,errorMessages,conf)}}else{$.each(errorInputs,function(i,$input){_setInlineErrorMessage($input,$input.attr("current-error"),conf,conf.errorMessagePosition)})}if(conf.scrollToTopOnError){$window.scrollTop($form.offset().top-20)}}return
 
false}return!$.formUtils.haltValidation};$.fn.validateForm=function(language,conf){if(window.console&&typeof
 window.console.warn=="function"){window.console.warn("Use of deprecated 
function $.validateForm, use $.isValid instead")}return 
this.isValid(language,conf,true)};$.fn.restrictLength=function(maxLengthElement){new
 $.formUtils.lengthRestriction(this,maxLengthElement);return 
this};$.fn.addSuggestions=function(settings){var 
sugs=false;this.find("input").each(function(){var 
$field=$(this);sugs=$.split($field.attr("data-suggestions"));if(sugs.length>0&&!$field.hasClass("has-suggestions")){$.formUtils.suggest($field,sugs,settings);$field.addClass("has-suggestions")}});return
 this};$.split=function(val,func,delim){if(typeof 
func!="function"){if(!val)return[];var 
values=[];$.each(val.split(func?func:","),function(i,str){str=$.trim(str);if(str.length)values.push(str)});return
 values}else 
if(val){if(!delim)delim=",";$.each(val.split(delim),function(i,str){str=$.trim(str);if(str.length)return
 func(str,i)})}};$.validate=function(conf){var 
defaultConf=$.extend($.formUtils.defaultConfig(),{form:"form",validateOnEvent:true,validateOnBlur:true,showHelpOnFocus:true,addSuggestions:true,modules:"",onModulesLoaded:null,language:false,onSuccess:false,onError:false,onElementValidate:false});conf=$.extend(defaultConf,conf||{});$(conf.form).each(function(i,form){var
 
$form=$(form);$window.trigger("formValidationSetup",[$form]);$form.find(".has-help-txt").unbind("focus.validation").unbind("blur.validation");$form.removeClass("has-validation-callback").unbind("submit.validation").unbind("reset.validation").find("input[data-validation],textarea[data-validation]").unbind("blur.validation");$form.bind("submit.validation",function(){var
 
$form=$(this);if($.formUtils.isLoadingModules){setTimeout(function(){$form.trigger("submit.validation")},200);return
 false}var valid=$form.isValid(conf.language,conf);if(valid&&typeof 
conf.onSuccess=="function"){var 
callbackResponse=conf.onSuccess($form);if(callbackResponse===false)return 
false}else if(!valid&&typeof 
conf.onError=="function"){conf.onError($form);return false}else{return 
valid}}).bind("reset.validation",function(){$(this).find("."+conf.errorMessageClass+".alert").remove();_removeErrorStyle($(this).find("."+conf.errorElementClass+",.valid"),conf)}).addClass("has-validation-callback");if(conf.showHelpOnFocus){$form.showHelpOnFocus()}if(conf.addSuggestions){$form.addSuggestions()}if(conf.validateOnBlur){$form.validateOnBlur(conf.language,conf);$form.bind("html5ValidationAttrsFound",function(){$form.validateOnBlur(conf.language,conf)})}if(conf.validateOnEvent){$form.validateOnEvent(conf.language,conf)}});if(conf.modules!=""){if(typeof
 
conf.onModulesLoaded=="function"){$window.one("validatorsLoaded",conf.onModulesLoaded)}$.formUtils.loadModules(conf.modules)}};$.formUtils={defaultConfig:function(){return{ignore:[],errorElementClass:"error",borderColorOnError:"red",errorMessageClass:"form-error",validationRuleAttribute:"data-validation",validationErrorMsgAttribute:"data-validation-error-msg",errorMessagePosition:"element",errorMessageTemplate:{container:'<div
 class="{errorMessageClass} alert 
alert-danger">{messages}</div>',messages:"<strong>{errorTitle}</strong><ul>{fields}</ul>",field:"<li>{msg}</li>"},errorMessageCustom:_templateMessage,scrollToTopOnError:true,dateFormat:"yyyy-mm-dd",addValidClassOnAll:false,decimalSeparator:"."}},validators:{},_events:{load:[],valid:[],invalid:[]},haltValidation:false,isValidatingEntireForm:false,addValidator:function(validator){var
 
name=validator.name.indexOf("validate_")===0?validator.name:"validate_"+validator.name;if(validator.validateOnKeyUp===undefined)validator.validateOnKeyUp=true;this.validators[name]=validator},isLoadingModules:false,loadedModules:{},loadModules:function(modules,path,fireEvent){if(fireEvent===undefined)fireEvent=true;if($.formUtils.isLoadingModules){setTimeout(function(){$.formUtils.loadModules(modules,path,fireEvent)});return}var
 hasLoadedAnyModule=false,loadModuleScripts=function(modules,path){var 
moduleList=$.split(modules),numModules=moduleList.length,moduleLoadedCallback=function(){numModules--;if(numModules==0){$.formUtils.isLoadingModules=false;if(fireEvent&&hasLoadedAnyModule){$window.trigger("validatorsLoaded")}}};if(numModules>0){$.formUtils.isLoadingModules=true}var
 cacheSuffix="?__="+(new 
Date).getTime(),appendToElement=document.getElementsByTagName("head")[0]||document.getElementsByTagName("body")[0];$.each(moduleList,function(i,modName){modName=$.trim(modName);if(modName.length==0){moduleLoadedCallback()}else{var
 
scriptUrl=path+modName+(modName.substr(-3)==".js"?"":".js"),script=document.createElement("SCRIPT");if(scriptUrl
 in 
$.formUtils.loadedModules){moduleLoadedCallback()}else{$.formUtils.loadedModules[scriptUrl]=1;hasLoadedAnyModule=true;script.type="text/javascript";script.onload=moduleLoadedCallback;script.src=scriptUrl+(scriptUrl.substr(-7)==".dev.js"?cacheSuffix:"");script.onreadystatechange=function(){if(this.readyState=="complete"||this.readyState=="loaded"){moduleLoadedCallback();this.onload=null;this.onreadystatechange=null}};appendToElement.appendChild(script)}}})};if(path){loadModuleScripts(modules,path)}else{var
 findScriptPathAndLoadModules=function(){var 
foundPath=false;$("script").each(function(){if(this.src){var 
scriptName=this.src.substr(this.src.lastIndexOf("/")+1,this.src.length);if(scriptName.indexOf("jquery.form-validator.js")>-1||scriptName.indexOf("jquery.form-validator.min.js")>-1){foundPath=this.src.substr(0,this.src.lastIndexOf("/"))+"/";if(foundPath=="/")foundPath="";return
 false}}});if(foundPath!==false){loadModuleScripts(modules,foundPath);return 
true}return 
false};if(!findScriptPathAndLoadModules()){$(findScriptPathAndLoadModules)}}},validateInput:function($elem,language,conf,$form,eventContext){if($elem.attr("disabled"))return
 null;$elem.trigger("beforeValidation");var 
value=$elem.val()||"",optional=$elem.valAttr("optional"),validationDependsOnCheckedInput=false,validationDependentInputIsChecked=false,validateIfCheckedElement=false,validateIfCheckedElementName=$elem.valAttr("if-checked");if(validateIfCheckedElementName!=null){validationDependsOnCheckedInput=true;validateIfCheckedElement=$form.find('input[name="'+validateIfCheckedElementName+'"]');if(validateIfCheckedElement.prop("checked")){validationDependentInputIsChecked=true}}if(!value&&optional==="true"||validationDependsOnCheckedInput&&!validationDependentInputIsChecked){return
 conf.addValidClassOnAll?true:null}var 
validationRules=$elem.attr(conf.validationRuleAttribute),validationErrorMsg=true;if(!validationRules){return
 
conf.addValidClassOnAll?true:null}$.split(validationRules,function(rule){if(rule.indexOf("validate_")!==0){rule="validate_"+rule}var
 validator=$.formUtils.validators[rule];if(validator&&typeof 
validator["validatorFunction"]=="function"){if(rule=="validate_checkbox_group"){$elem=$("[name='"+$elem.attr("name")+"']:eq(0)")}var
 
isValid=null;if(eventContext!="keyup"||validator.validateOnKeyUp){isValid=validator.validatorFunction(value,$elem,conf,language,$form)}if(!isValid){validationErrorMsg=null;if(isValid!==null){validationErrorMsg=$elem.attr(conf.validationErrorMsgAttribute+"-"+rule.replace("validate_",""));if(!validationErrorMsg){validationErrorMsg=$elem.attr(conf.validationErrorMsgAttribute);if(!validationErrorMsg){validationErrorMsg=language[validator.errorMessageKey];if(!validationErrorMsg)validationErrorMsg=validator.errorMessage}}}return
 false}}else{throw new Error('Using undefined validator "'+rule+'"')}}," 
");if(typeof 
validationErrorMsg=="string"){$elem.trigger("validation",false);return 
validationErrorMsg}else 
if(validationErrorMsg===null&&!conf.addValidClassOnAll){return 
null}else{$elem.trigger("validation",true);return 
true}},parseDate:function(val,dateFormat){var 
divider=dateFormat.replace(/[a-zA-Z]/gi,"").substring(0,1),regexp="^",formatParts=dateFormat.split(divider),matches,day,month,year;$.each(formatParts,function(i,part){regexp+=(i>0?"\\"+divider:"")+"(\\d{"+part.length+"})"});regexp+="$";matches=val.match(new
 RegExp(regexp));if(matches===null){return false}var 
findDateUnit=function(unit,formatParts,matches){for(var 
i=0;i<formatParts.length;i++){if(formatParts[i].substring(0,1)===unit){return 
$.formUtils.parseDateInt(matches[i+1])}}return-1};month=findDateUnit("m",formatParts,matches);day=findDateUnit("d",formatParts,matches);year=findDateUnit("y",formatParts,matches);if(month===2&&day>28&&(year%4!==0||year%100===0&&year%400!==0)||month===2&&day>29&&(year%4===0||year%100!==0&&year%400===0)||month>12||month===0){return
 
false}if(this.isShortMonth(month)&&day>30||!this.isShortMonth(month)&&day>31||day===0){return
 
false}return[year,month,day]},parseDateInt:function(val){if(val.indexOf("0")===0){val=val.replace("0","")}return
 parseInt(val,10)},isShortMonth:function(m){return 
m%2===0&&m<7||m%2!==0&&m>7},lengthRestriction:function($inputElement,$maxLengthElement){var
 
maxChars=parseInt($maxLengthElement.text(),10),charsLeft=0,countCharacters=function(){var
 numChars=$inputElement.val().length;if(numChars>maxChars){var 
currScrollTopPos=$inputElement.scrollTop();$inputElement.val($inputElement.val().substring(0,maxChars));$inputElement.scrollTop(currScrollTopPos)}charsLeft=maxChars-numChars;if(charsLeft<0)charsLeft=0;$maxLengthElement.text(charsLeft)};$($inputElement).bind("keydown
 keyup keypress focus blur",countCharacters).bind("cut 
paste",function(){setTimeout(countCharacters,100)});$(document).bind("ready",countCharacters)},numericRangeCheck:function(value,rangeAllowed){var
 range=$.split(rangeAllowed,"-");var 
minmax=parseInt(rangeAllowed.substr(3),10);if(range.length==2&&(value<parseInt(range[0],10)||value>parseInt(range[1],10))){return["out",range[0],range[1]]}else
 if(rangeAllowed.indexOf("min")===0&&value<minmax){return["min",minmax]}else 
if(rangeAllowed.indexOf("max")===0&&value>minmax){return["max",minmax]}return["ok"]},_numSuggestionElements:0,_selectedSuggestion:null,_previousTypedVal:null,suggest:function($elem,suggestions,settings){var
 
conf={css:{maxHeight:"150px",background:"#FFF",lineHeight:"150%",textDecoration:"underline",overflowX:"hidden",overflowY:"auto",border:"#CCC
 solid 
1px",borderTop:"none",cursor:"pointer"},activeSuggestionCSS:{background:"#E9E9E9"}},setSuggsetionPosition=function($suggestionContainer,$input){var
 
offset=$input.offset();$suggestionContainer.css({width:$input.outerWidth(),left:offset.left+"px",top:offset.top+$input.outerHeight()+"px"})};if(settings)$.extend(conf,settings);conf.css["position"]="absolute";conf.css["z-index"]=9999;$elem.attr("autocomplete","off");if(this._numSuggestionElements===0){$window.bind("resize",function(){$(".jquery-form-suggestions").each(function(){var
 
$container=$(this),suggestID=$container.attr("data-suggest-container");setSuggsetionPosition($container,$(".suggestions-"+suggestID).eq(0))})})}this._numSuggestionElements++;var
 onSelectSuggestion=function($el){var 
suggestionId=$el.valAttr("suggestion-nr");$.formUtils._selectedSuggestion=null;$.formUtils._previousTypedVal=null;$(".jquery-form-suggestion-"+suggestionId).fadeOut("fast")};$elem.data("suggestions",suggestions).valAttr("suggestion-nr",this._numSuggestionElements).unbind("focus.suggest").bind("focus.suggest",function(){$(this).trigger("keyup");$.formUtils._selectedSuggestion=null}).unbind("keyup.suggest").bind("keyup.suggest",function(){var
 
$input=$(this),foundSuggestions=[],val=$.trim($input.val()).toLocaleLowerCase();if(val==$.formUtils._previousTypedVal){return}else{$.formUtils._previousTypedVal=val}var
 
hasTypedSuggestion=false,suggestionId=$input.valAttr("suggestion-nr"),$suggestionContainer=$(".jquery-form-suggestion-"+suggestionId);$suggestionContainer.scrollTop(0);if(val!=""){var
 
findPartial=val.length>2;$.each($input.data("suggestions"),function(i,suggestion){var
 
lowerCaseVal=suggestion.toLocaleLowerCase();if(lowerCaseVal==val){foundSuggestions.push("<strong>"+suggestion+"</strong>");hasTypedSuggestion=true;return
 false}else 
if(lowerCaseVal.indexOf(val)===0||findPartial&&lowerCaseVal.indexOf(val)>-1){foundSuggestions.push(suggestion.replace(new
 
RegExp(val,"gi"),"<strong>$&</strong>"))}})}if(hasTypedSuggestion||foundSuggestions.length==0&&$suggestionContainer.length>0){$suggestionContainer.hide()}else
 
if(foundSuggestions.length>0&&$suggestionContainer.length==0){$suggestionContainer=$("<div></div>").css(conf.css).appendTo("body");$elem.addClass("suggestions-"+suggestionId);$suggestionContainer.attr("data-suggest-container",suggestionId).addClass("jquery-form-suggestions").addClass("jquery-form-suggestion-"+suggestionId)}else
 
if(foundSuggestions.length>0&&!$suggestionContainer.is(":visible")){$suggestionContainer.show()}if(foundSuggestions.length>0&&val.length!=foundSuggestions[0].length){setSuggsetionPosition($suggestionContainer,$input);$suggestionContainer.html("");$.each(foundSuggestions,function(i,text){$("<div></div>").append(text).css({overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",padding:"5px"}).addClass("form-suggest-element").appendTo($suggestionContainer).click(function(){$input.focus();$input.val($(this).text());onSelectSuggestion($input)})})}}).unbind("keydown.validation").bind("keydown.validation",function(e){var
 
code=e.keyCode?e.keyCode:e.which,suggestionId,$suggestionContainer,$input=$(this);if(code==13&&$.formUtils._selectedSuggestion!==null){suggestionId=$input.valAttr("suggestion-nr");$suggestionContainer=$(".jquery-form-suggestion-"+suggestionId);if($suggestionContainer.length>0){var
 
newText=$suggestionContainer.find("div").eq($.formUtils._selectedSuggestion).text();$input.val(newText);onSelectSuggestion($input);e.preventDefault()}}else{suggestionId=$input.valAttr("suggestion-nr");$suggestionContainer=$(".jquery-form-suggestion-"+suggestionId);var
 
$suggestions=$suggestionContainer.children();if($suggestions.length>0&&$.inArray(code,[38,40])>-1){if(code==38){if($.formUtils._selectedSuggestion===null)$.formUtils._selectedSuggestion=$suggestions.length-1;else
 
$.formUtils._selectedSuggestion--;if($.formUtils._selectedSuggestion<0)$.formUtils._selectedSuggestion=$suggestions.length-1}else
 
if(code==40){if($.formUtils._selectedSuggestion===null)$.formUtils._selectedSuggestion=0;else
 
$.formUtils._selectedSuggestion++;if($.formUtils._selectedSuggestion>$suggestions.length-1)$.formUtils._selectedSuggestion=0}var
 
containerInnerHeight=$suggestionContainer.innerHeight(),containerScrollTop=$suggestionContainer.scrollTop(),suggestionHeight=$suggestionContainer.children().eq(0).outerHeight(),activeSuggestionPosY=suggestionHeight*$.formUtils._selectedSuggestion;if(activeSuggestionPosY<containerScrollTop||activeSuggestionPosY>containerScrollTop+containerInnerHeight){$suggestionContainer.scrollTop(activeSuggestionPosY)}$suggestions.removeClass("active-suggestion").css("background","none").eq($.formUtils._selectedSuggestion).addClass("active-suggestion").css(conf.activeSuggestionCSS);e.preventDefault();return
 
false}}}).unbind("blur.suggest").bind("blur.suggest",function(){onSelectSuggestion($(this))});return
 $elem},LANG:{errorTitle:"Form submission failed!",requiredFields:"You have not 
answered all required fields",badTime:"You have not given a correct 
time",badEmail:"You have not given a correct e-mail address",badTelephone:"You 
have not given a correct phone number",badSecurityAnswer:"You have not given a 
correct answer to the security question",badDate:"You have not given a correct 
date",lengthBadStart:"The input value must be between ",lengthBadEnd:" 
characters",lengthTooLongStart:"The input value is longer than 
",lengthTooShortStart:"The input value is shorter than ",notConfirmed:"Input 
values could not be confirmed",badDomain:"Incorrect domain value",badUrl:"The 
input value is not a correct URL",badCustomVal:"The input value is 
incorrect",badInt:"The input value was not a correct 
number",badSecurityNumber:"Your social security number was 
incorrect",badUKVatAnswer:"Incorrect UK VAT Number",badStrength:"The password 
isn't strong enough",badNumberOfSelectedOptionsStart:"You have to choose at 
least ",badNumberOfSelectedOptionsEnd:" answers",badAlphaNumeric:"The input 
value can only contain alphanumeric characters ",badAlphaNumericExtra:" and 
",wrongFileSize:"The file you are trying to upload is too 
large",wrongFileType:"The file you are trying to upload is of wrong 
type",groupCheckedRangeStart:"Please choose between 
",groupCheckedTooFewStart:"Please choose at least 
",groupCheckedTooManyStart:"Please choose a maximum of ",groupCheckedEnd:" 
item(s)",badCreditCard:"The credit card number is not correct",badCVV:"The CVV 
number was not 
correct"}};$.formUtils.addValidator({name:"email",validatorFunction:function(email){var
 emailParts=email.toLowerCase().split("@");if(emailParts.length==2){return 
$.formUtils.validators.validate_domain.validatorFunction(emailParts[1])&&!/[^\w\+\.\-]/.test(emailParts[0])}return
 
false},errorMessage:"",errorMessageKey:"badEmail"});$.formUtils.addValidator({name:"domain",validatorFunction:function(val,$input){var
 
topDomains=[".ac",".ad",".ae",".aero",".af",".ag",".ai",".al",".am",".an",".ao",".aq",".ar",".arpa",".as",".asia",".at",".au",".aw",".ax",".az",".ba",".bb",".bd",".be",".bf",".bg",".bh",".bi",".bike",".biz",".bj",".bm",".bn",".bo",".br",".bs",".bt",".bv",".bw",".by",".bz",".ca",".camera",".cat",".cc",".cd",".cf",".cg",".ch",".ci",".ck",".cl",".clothing",".cm",".cn",".co",".com",".construction",".contractors",".coop",".cr",".cu",".cv",".cw",".cx",".cy",".cz",".de",".diamonds",".directory",".dj",".dk",".dm",".do",".dz",".ec",".edu",".ee",".eg",".enterprises",".equipment",".er",".es",".estate",".et",".eu",".fi",".fj",".fk",".fm",".fo",".fr",".ga",".gallery",".gb",".gd",".ge",".gf",".gg",".gh",".gi",".gl",".gm",".gn",".gov",".gp",".gq",".gr",".graphics",".gs",".gt",".gu",".guru",".gw",".gy",".hk",".hm",".hn",".holdings",".hr",".ht",".hu",".id",".ie",".il",".im",".in",".info",".int",".io",".iq",".ir",".is",".it",".je",".jm",".jo",".jobs",".jp",".ke",".kg",".kh",".ki",".kitchen",".km",".kn",".kp",".kr",".kw",".ky",".kz",".la",".land",".lb",".lc",".li",".lighting",".lk",".lr",".ls",".lt",".lu",".lv",".ly",".ma",".mc",".md",".me",".menu",".mg",".mh",".mil",".mk",".ml",".mm",".mn",".mo",".mobi",".mp",".mq",".mr",".ms",".mt",".mu",".museum",".mv",".mw",".mx",".my",".mz",".na",".name",".nc",".ne",".net",".nf",".ng",".ni",".nl",".no",".np",".nr",".nu",".nz",".om",".org",".pa",".pe",".pf",".pg",".ph",".photography",".pk",".pl",".plumbing",".pm",".pn",".post",".pr",".pro",".ps",".pt",".pw",".py",".qa",".re",".ro",".rs",".ru",".rw",".sa",".sb",".sc",".sd",".se",".sexy",".sg",".sh",".si",".singles",".sj",".sk",".sl",".sm",".sn",".so",".sr",".st",".su",".sv",".sx",".sy",".sz",".tattoo",".tc",".td",".technology",".tel",".tf",".tg",".th",".tips",".tj",".tk",".tl",".tm",".tn",".to",".today",".tp",".tr",".travel",".tt",".tv",".tw",".tz",".ua",".ug",".uk",".uno",".us",".uy",".uz",".va",".vc",".ve",".ventures",".vg",".vi",".vn",".voyage",".vu",".wf",".ws",".xn--3e0b707e",".xn--45brj9c",".xn--80ao21a",".xn--80asehdb",".xn--80aswg",".xn--90a3ac",".xn--clchc0ea0b2g2a9gcd",".xn--fiqs8s",".xn--fiqz9s",".xn--fpcrj9c3d",".xn--fzc2c9e2c",".xn--gecrj9c",".xn--h2brj9c",".xn--j1amh",".xn--j6w193g",".xn--kprw13d",".xn--kpry57d",".xn--l1acc",".xn--lgbbat1ad8j",".xn--mgb9awbf",".xn--mgba3a4f16a",".xn--mgbaam7a8h",".xn--mgbayh7gpa",".xn--mgbbh1a71e",".xn--mgbc0a9azcg",".xn--mgberp4a5d4ar",".xn--mgbx4cd0ab",".xn--ngbc5azd",".xn--o3cw4h",".xn--ogbpf8fl",".xn--p1ai",".xn--pgbs0dh",".xn--q9jyb4c",".xn--s9brj9c",".xn--unup4y",".xn--wgbh1c",".xn--wgbl6a",".xn--xkc2al3hye2a",".xn--xkc2dl3a5ee0h",".xn--yfro4i67o",".xn--ygbi2ammx",".xxx",".ye",".yt",".za",".zm",".zw"],ukTopDomains=["co","me","ac","gov","judiciary","ltd","mod","net","nhs","nic","org","parliament","plc","police","sch","bl","british-library","jet","nls"],dot=val.lastIndexOf("."),domain=val.substring(0,dot),ext=val.substring(dot,val.length),hasTopDomain=false;for(var
 i=0;i<topDomains.length;i++){if(topDomains[i]===ext){if(ext===".uk"){var 
domainParts=val.split(".");var tld2=domainParts[domainParts.length-2];for(var 
j=0;j<ukTopDomains.length;j++){if(ukTopDomains[j]===tld2){hasTopDomain=true;break}}if(hasTopDomain)break}else{hasTopDomain=true;break}}}if(!hasTopDomain){return
 false}else if(dot<2||dot>57){return 
$.inArray(val,["i.net","q.com","q.net","x.com","x.org","z.com","w.org"])>-1}else{var
 
firstChar=domain.substring(0,1),lastChar=domain.substring(domain.length-1,domain.length);if(firstChar==="-"||firstChar==="."||lastChar==="-"||lastChar==="."){return
 false}if(domain.split("..").length>1){return 
false}if(domain.replace(/[-\da-z\.]/g,"")!==""){return false}}if(typeof 
$input!=="undefined"){$input.val(val)}return 
true},errorMessage:"",errorMessageKey:"badDomain"});$.formUtils.addValidator({name:"required",validatorFunction:function(val,$el,config,language,$form){switch($el.attr("type")){case"checkbox":return
 $el.is(":checked");case"radio":return 
$form.find('input[name="'+$el.attr("name")+'"]').filter(":checked").length>0;default:return
 
$.trim(val)!==""}},errorMessage:"",errorMessageKey:"requiredFields"});$.formUtils.addValidator({name:"length",validatorFunction:function(val,$el,conf,lang){var
 
lengthAllowed=$el.valAttr("length"),type=$el.attr("type");if(lengthAllowed==undefined){var
 elementType=$el.get(0).nodeName;alert('Please add attribute 
"data-validation-length" to '+elementType+" named "+$el.attr("name"));return 
true}var 
len=type=="file"&&$el.get(0).files!==undefined?$el.get(0).files.length:val.length,lengthCheckResults=$.formUtils.numericRangeCheck(len,lengthAllowed),checkResult;switch(lengthCheckResults[0]){case"out":this.errorMessage=lang.lengthBadStart+lengthAllowed+lang.lengthBadEnd;checkResult=false;break;case"min":this.errorMessage=lang.lengthTooShortStart+lengthCheckResults[1]+lang.lengthBadEnd;checkResult=false;break;case"max":this.errorMessage=lang.lengthTooLongStart+lengthCheckResults[1]+lang.lengthBadEnd;checkResult=false;break;default:checkResult=true}return
 
checkResult},errorMessage:"",errorMessageKey:""});$.formUtils.addValidator({name:"url",validatorFunction:function(url){var
 
urlFilter=/^(https?|ftp):\/\/((((\w|-|\.|~|[\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])(\w|-|\.|~|[\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])(\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/(((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|\[|\]|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#(((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i;if(urlFilter.test(url)){var
 domain=url.split("://")[1];var 
domainSlashPos=domain.indexOf("/");if(domainSlashPos>-1)domain=domain.substr(0,domainSlashPos);return
 $.formUtils.validators.validate_domain.validatorFunction(domain)}return 
false},errorMessage:"",errorMessageKey:"badUrl"});$.formUtils.addValidator({name:"number",validatorFunction:function(val,$el,conf){if(val!==""){var
 
allowing=$el.valAttr("allowing")||"",decimalSeparator=$el.valAttr("decimal-separator")||conf.decimalSeparator,allowsRange=false,begin,end,steps=$el.valAttr("step")||"",allowsSteps=false;if(allowing.indexOf("number")==-1)allowing+=",number";if(allowing.indexOf("negative")>-1&&val.indexOf("-")===0){val=val.substr(1)}if(allowing.indexOf("range")>-1){begin=parseFloat(allowing.substring(allowing.indexOf("[")+1,allowing.indexOf(";")));end=parseFloat(allowing.substring(allowing.indexOf(";")+1,allowing.indexOf("]")));allowsRange=true}if(steps!=""){allowsSteps=true}if(decimalSeparator==","){if(val.indexOf(".")>-1){return
 
false}val=val.replace(",",".")}if(allowing.indexOf("number")>-1&&val.replace(/[0-9]/g,"")===""&&(!allowsRange||val>=begin&&val<=end)&&(!allowsSteps||val%steps==0)){return
 true}if(allowing.indexOf("float")>-1&&val.match(new 
RegExp("^([0-9]+)\\.([0-9]+)$"))!==null&&(!allowsRange||val>=begin&&val<=end)&&(!allowsSteps||val%steps==0)){return
 true
-}}return 
false},errorMessage:"",errorMessageKey:"badInt"});$.formUtils.addValidator({name:"alphanumeric",validatorFunction:function(val,$el,conf,language){var
 
patternStart="^([a-zA-Z0-9",patternEnd="]+)$",additionalChars=$el.attr("data-validation-allowing"),pattern="";if(additionalChars){pattern=patternStart+additionalChars+patternEnd;var
 extra=additionalChars.replace(/\\/g,"");if(extra.indexOf(" 
")>-1){extra=extra.replace(" ","");extra+=" and spaces 
"}this.errorMessage=language.badAlphaNumeric+language.badAlphaNumericExtra+extra}else{pattern=patternStart+patternEnd;this.errorMessage=language.badAlphaNumeric}return
 new 
RegExp(pattern).test(val)},errorMessage:"",errorMessageKey:""});$.formUtils.addValidator({name:"custom",validatorFunction:function(val,$el,conf){var
 regexp=new RegExp($el.valAttr("regexp"));return 
regexp.test(val)},errorMessage:"",errorMessageKey:"badCustomVal"});$.formUtils.addValidator({name:"date",validatorFunction:function(date,$el,conf){var
 
dateFormat="yyyy-mm-dd";if($el.valAttr("format")){dateFormat=$el.valAttr("format")}else
 if(conf.dateFormat){dateFormat=conf.dateFormat}return 
$.formUtils.parseDate(date,dateFormat)!==false},errorMessage:"",errorMessageKey:"badDate"});$.formUtils.addValidator({name:"checkbox_group",validatorFunction:function(val,$el,conf,lang,$form){var
 checkResult=true;var elname=$el.attr("name");var 
checkedCount=$("input[type=checkbox][name^='"+elname+"']:checked",$form).length;var
 qtyAllowed=$el.valAttr("qty");if(qtyAllowed==undefined){var 
elementType=$el.get(0).nodeName;alert('Attribute "data-validation-qty" is 
missing from '+elementType+" named "+$el.attr("name"))}var 
qtyCheckResults=$.formUtils.numericRangeCheck(checkedCount,qtyAllowed);switch(qtyCheckResults[0]){case"out":this.errorMessage=lang.groupCheckedRangeStart+qtyAllowed+lang.groupCheckedEnd;checkResult=false;break;case"min":this.errorMessage=lang.groupCheckedTooFewStart+qtyCheckResults[1]+lang.groupCheckedEnd;checkResult=false;break;case"max":this.errorMessage=lang.groupCheckedTooManyStart+qtyCheckResults[1]+lang.groupCheckedEnd;checkResult=false;break;default:checkResult=true}return
 checkResult}})})(jQuery);
\ No newline at end of file
+(function($){"use strict";var 
$window=$(window),_applyErrorStyle=function($elem,conf){$elem.addClass(conf.errorElementClass).removeClass("valid");var
 
$parent=$elem.parent();if($parent.hasClass("input-group"))$parent=$parent.parent();$parent.addClass(conf.inputParentClassOnError).removeClass(conf.inputParentClassOnSuccess);if(conf.borderColorOnError!==""){$elem.css("border-color",conf.borderColorOnError)}},_removeErrorStyle=function($elem,conf){$elem.each(function(){var
 
$this=$(this),$parent=$this.parent();if($parent.hasClass("input-group"))$parent=$parent.parent();_setInlineErrorMessage($this,"",conf,conf.errorMessagePosition);$this.removeClass("valid").removeClass(conf.errorElementClass).css("border-color","");$parent.removeClass(conf.inputParentClassOnError).removeClass(conf.inputParentClassOnSuccess).find("."+conf.errorMessageClass).remove()})},_setInlineErrorMessage=function($input,mess,conf,$messageContainer){var
 custom=_getInlineErrorElement($input);if(custom){custom.innerHTML=mess}else 
if(typeof $messageContainer=="object"){var 
$found=false;$messageContainer.find("."+conf.errorMessageClass).each(function(){if(this.inputReferer==$input[0]){$found=$(this);return
 false}});if($found){if(!mess){$found.remove()}else{$found.html(mess)}}else{var 
$mess=$('<div 
class="'+conf.errorMessageClass+'">'+mess+"</div>");$mess[0].inputReferer=$input[0];$messageContainer.prepend($mess)}}else{var
 
$parent=$input.parent();if($parent.hasClass("input-group"))$parent=$parent.parent();var
 
$mess=$parent.find("."+conf.errorMessageClass+".help-block");if($mess.length==0){$mess=$("<span></span>").addClass("help-block").addClass(conf.errorMessageClass);$mess.appendTo($parent)}$mess.html(mess)}},_getInlineErrorElement=function($input,conf){return
 
document.getElementById($input.attr("name")+"_err_msg")},_templateMessage=function($form,title,errorMessages,conf){var
 
messages=conf.errorMessageTemplate.messages.replace(/\{errorTitle\}/g,title);var
 
fields=[];$.each(errorMessages,function(i,msg){fields.push(conf.errorMessageTemplate.field.replace(/\{msg\}/g,msg))});messages=messages.replace(/\{fields\}/g,fields.join(""));var
 
container=conf.errorMessageTemplate.container.replace(/\{errorMessageClass\}/g,conf.errorMessageClass);container=container.replace(/\{messages\}/g,messages);$form.children().eq(0).before(container)};$.fn.validateOnBlur=function(language,settings){this.find("input[data-validation],textarea[data-validation],select[data-validation]").bind("blur.validation",function(){$(this).validateInputOnBlur(language,settings,true,"blur")});if(settings.validateCheckboxRadioOnClick){this.find("input[type=checkbox][data-validation],input[type=radio][data-validation]").bind("click.validation",function(){$(this).validateInputOnBlur(language,settings,true,"click")})}return
 
this};$.fn.validateOnEvent=function(language,settings){this.find("input[data-validation][data-validation-event],textarea[data-validation][data-validation-event],select[data-validation][data-validation-event]").each(function(){var
 
$el=$(this),etype=$el.valAttr("event");if(etype){$el.bind(etype+".validation",function(){$(this).validateInputOnBlur(language,settings,true,etype)})}});return
 
this};$.fn.showHelpOnFocus=function(attrName){if(!attrName){attrName="data-validation-help"}this.find(".has-help-txt").valAttr("has-keyup-event",false).removeClass("has-help-txt");this.find("textarea,input").each(function(){var
 
$elem=$(this),className="jquery_form_help_"+($elem.attr("name")||"").replace(/(:|\.|\[|\])/g,""),help=$elem.attr(attrName);if(help){$elem.addClass("has-help-txt").unbind("focus.help").bind("focus.help",function(){var
 $help=$elem.parent().find("."+className);if($help.length==0){$help=$("<span 
/>").addClass(className).addClass("help").addClass("help-block").text(help).hide();$elem.after($help)}$help.fadeIn()}).unbind("blur.help").bind("blur.help",function(){$(this).parent().find("."+className).fadeOut("slow")})}});return
 
this};$.fn.validateInputOnBlur=function(language,conf,attachKeyupEvent,eventType){$.formUtils.eventType=eventType;if((this.valAttr("suggestion-nr")||this.valAttr("postpone")||this.hasClass("hasDatepicker"))&&!window.postponedValidation){var
 
_self=this,postponeTime=this.valAttr("postpone")||200;window.postponedValidation=function(){_self.validateInputOnBlur(language,conf,attachKeyupEvent,eventType);window.postponedValidation=false};setTimeout(function(){if(window.postponedValidation){window.postponedValidation()}},postponeTime);return
 
this}language=$.extend({},$.formUtils.LANG,language||{});_removeErrorStyle(this,conf);var
 
$elem=this,$form=$elem.closest("form"),validationRule=$elem.attr(conf.validationRuleAttribute),validation=$.formUtils.validateInput($elem,language,$.extend({},conf,{errorMessagePosition:"element"}),$form,eventType);if(validation===true){$elem.addClass("valid").parent().addClass(conf.inputParentClassOnSuccess)}else
 
if(validation!==null){_applyErrorStyle($elem,conf);_setInlineErrorMessage($elem,validation,conf,conf.errorMessagePosition);if(attachKeyupEvent){$elem.unbind("keyup.validation").bind("keyup.validation",function(){$(this).validateInputOnBlur(language,conf,false,"keyup")})}}return
 this};$.fn.valAttr=function(name,val){if(val===undefined){return 
this.attr("data-validation-"+name)}else if(val===false||val===null){return 
this.removeAttr("data-validation-"+name)}else{if(name.length>0)name="-"+name;return
 
this.attr("data-validation"+name,val)}};$.fn.isValid=function(language,conf,displayError){if($.formUtils.isLoadingModules){var
 
$self=this;setTimeout(function(){$self.isValid(language,conf,displayError)},200);return
 
null}conf=$.extend({},$.formUtils.defaultConfig(),conf||{});language=$.extend({},$.formUtils.LANG,language||{});displayError=displayError!==false;if($.formUtils.errorDisplayPreventedWhenHalted){delete
 
$.formUtils.errorDisplayPreventedWhenHalted;displayError=false}$.formUtils.isValidatingEntireForm=true;$.formUtils.haltValidation=false;var
 
addErrorMessage=function(mess,$elem){if($.inArray(mess,errorMessages)<0){errorMessages.push(mess)}errorInputs.push($elem);$elem.attr("current-error",mess);if(displayError)_applyErrorStyle($elem,conf)},checkedInputs=[],errorMessages=[],errorInputs=[],$form=this,ignoreInput=function(name,type){if(type==="submit"||type==="button"||type=="reset"){return
 true}return 
$.inArray(name,conf.ignore||[])>-1};if(displayError){$form.find("."+conf.errorMessageClass+".alert").remove();_removeErrorStyle($form.find("."+conf.errorElementClass+",.valid"),conf)}$form.find("input,textarea,select").filter(':not([type="submit"],[type="button"])').each(function(){var
 
$elem=$(this),elementType=$elem.attr("type"),isCheckboxOrRadioBtn=elementType=="radio"||elementType=="checkbox",elementName=$elem.attr("name");if(!ignoreInput(elementName,elementType)&&(!isCheckboxOrRadioBtn||$.inArray(elementName,checkedInputs)<0)){if(isCheckboxOrRadioBtn)checkedInputs.push(elementName);var
 
validation=$.formUtils.validateInput($elem,language,conf,$form,"submit");if(validation!=null){if(validation!==true){addErrorMessage(validation,$elem)}else{$elem.valAttr("current-error",false).addClass("valid").parent().addClass("has-success")}}}});if(typeof
 conf.onValidate=="function"){var 
errors=conf.onValidate($form);if($.isArray(errors)){$.each(errors,function(i,err){addErrorMessage(err.message,err.element)})}else
 
if(errors&&errors.element&&errors.message){addErrorMessage(errors.message,errors.element)}}$.formUtils.isValidatingEntireForm=false;if(!$.formUtils.haltValidation&&errorInputs.length>0){if(displayError){if(conf.errorMessagePosition==="top"){_templateMessage($form,language.errorTitle,errorMessages,conf)}else
 if(conf.errorMessagePosition==="custom"){if(typeof 
conf.errorMessageCustom==="function"){conf.errorMessageCustom($form,language.errorTitle,errorMessages,conf)}}else{$.each(errorInputs,function(i,$input){_setInlineErrorMessage($input,$input.attr("current-error"),conf,conf.errorMessagePosition)})}if(conf.scrollToTopOnError){$window.scrollTop($form.offset().top-20)}}return
 
false}if(!displayError&&$.formUtils.haltValidation){$.formUtils.errorDisplayPreventedWhenHalted=true}return!$.formUtils.haltValidation};$.fn.validateForm=function(language,conf){if(window.console&&typeof
 window.console.warn=="function"){window.console.warn("Use of deprecated 
function $.validateForm, use $.isValid instead")}return 
this.isValid(language,conf,true)};$.fn.restrictLength=function(maxLengthElement){new
 $.formUtils.lengthRestriction(this,maxLengthElement);return 
this};$.fn.addSuggestions=function(settings){var 
sugs=false;this.find("input").each(function(){var 
$field=$(this);sugs=$.split($field.attr("data-suggestions"));if(sugs.length>0&&!$field.hasClass("has-suggestions")){$.formUtils.suggest($field,sugs,settings);$field.addClass("has-suggestions")}});return
 this};$.split=function(val,func){if(typeof 
func!="function"){if(!val)return[];var 
values=[];$.each(val.split(func?func:/[,|\-\s]\s*/g),function(i,str){str=$.trim(str);if(str.length)values.push(str)});return
 values}else 
if(val){$.each(val.split(/[,|\-\s]\s*/g),function(i,str){str=$.trim(str);if(str.length)return
 func(str,i)})}};$.validate=function(conf){var 
defaultConf=$.extend($.formUtils.defaultConfig(),{form:"form",validateOnEvent:true,validateOnBlur:true,validateCheckboxRadioOnClick:true,showHelpOnFocus:true,addSuggestions:true,modules:"",onModulesLoaded:null,language:false,onSuccess:false,onError:false,onElementValidate:false});conf=$.extend(defaultConf,conf||{});$(conf.form).each(function(i,form){var
 
$form=$(form);$window.trigger("formValidationSetup",[$form]);$form.find(".has-help-txt").unbind("focus.validation").unbind("blur.validation");$form.removeClass("has-validation-callback").unbind("submit.validation").unbind("reset.validation").find("input[data-validation],textarea[data-validation]").unbind("blur.validation");$form.bind("submit.validation",function(){var
 $form=$(this);if($.formUtils.haltValidation){return 
false}if($.formUtils.isLoadingModules){setTimeout(function(){$form.trigger("submit.validation")},200);return
 false}var 
valid=$form.isValid(conf.language,conf);if($.formUtils.haltValidation){return 
false}else{if(valid&&typeof conf.onSuccess=="function"){var 
callbackResponse=conf.onSuccess($form);if(callbackResponse===false)return 
false}else if(!valid&&typeof 
conf.onError=="function"){conf.onError($form);return false}else{return 
valid}}}).bind("reset.validation",function(){$(this).find("."+conf.errorMessageClass+".alert").remove();_removeErrorStyle($(this).find("."+conf.errorElementClass+",.valid"),conf)}).addClass("has-validation-callback");if(conf.showHelpOnFocus){$form.showHelpOnFocus()}if(conf.addSuggestions){$form.addSuggestions()}if(conf.validateOnBlur){$form.validateOnBlur(conf.language,conf);$form.bind("html5ValidationAttrsFound",function(){$form.validateOnBlur(conf.language,conf)})}if(conf.validateOnEvent){$form.validateOnEvent(conf.language,conf)}});if(conf.modules!=""){if(typeof
 
conf.onModulesLoaded=="function"){$window.one("validatorsLoaded",conf.onModulesLoaded)}$.formUtils.loadModules(conf.modules)}};$.formUtils={defaultConfig:function(){return{ignore:[],errorElementClass:"error",borderColorOnError:"red",errorMessageClass:"form-error",validationRuleAttribute:"data-validation",validationErrorMsgAttribute:"data-validation-error-msg",errorMessagePosition:"element",errorMessageTemplate:{container:'<div
 class="{errorMessageClass} alert 
alert-danger">{messages}</div>',messages:"<strong>{errorTitle}</strong><ul>{fields}</ul>",field:"<li>{msg}</li>"},errorMessageCustom:_templateMessage,scrollToTopOnError:true,dateFormat:"yyyy-mm-dd",addValidClassOnAll:false,decimalSeparator:".",inputParentClassOnError:"has-error",inputParentClassOnSuccess:"has-success"}},validators:{},_events:{load:[],valid:[],invalid:[]},haltValidation:false,isValidatingEntireForm:false,addValidator:function(validator){var
 
name=validator.name.indexOf("validate_")===0?validator.name:"validate_"+validator.name;if(validator.validateOnKeyUp===undefined)validator.validateOnKeyUp=true;this.validators[name]=validator},isLoadingModules:false,loadedModules:{},loadModules:function(modules,path,fireEvent){if(fireEvent===undefined)fireEvent=true;if($.formUtils.isLoadingModules){setTimeout(function(){$.formUtils.loadModules(modules,path,fireEvent)});return}var
 hasLoadedAnyModule=false,loadModuleScripts=function(modules,path){var 
moduleList=$.split(modules),numModules=moduleList.length,moduleLoadedCallback=function(){numModules--;if(numModules==0){$.formUtils.isLoadingModules=false;if(fireEvent&&hasLoadedAnyModule){$window.trigger("validatorsLoaded")}}};if(numModules>0){$.formUtils.isLoadingModules=true}var
 cacheSuffix="?__="+(new 
Date).getTime(),appendToElement=document.getElementsByTagName("head")[0]||document.getElementsByTagName("body")[0];$.each(moduleList,function(i,modName){modName=$.trim(modName);if(modName.length==0){moduleLoadedCallback()}else{var
 
scriptUrl=path+modName+(modName.substr(-3)==".js"?"":".js"),script=document.createElement("SCRIPT");if(scriptUrl
 in 
$.formUtils.loadedModules){moduleLoadedCallback()}else{$.formUtils.loadedModules[scriptUrl]=1;hasLoadedAnyModule=true;script.type="text/javascript";script.onload=moduleLoadedCallback;script.src=scriptUrl+(scriptUrl.substr(-7)==".dev.js"?cacheSuffix:"");script.onreadystatechange=function(){if(this.readyState=="complete"||this.readyState=="loaded"){moduleLoadedCallback();this.onload=null;this.onreadystatechange=null}};appendToElement.appendChild(script)}}})};if(path){loadModuleScripts(modules,path)}else{var
 findScriptPathAndLoadModules=function(){var 
foundPath=false;$('script[src*="form-validator"]').each(function(){foundPath=this.src.substr(0,this.src.lastIndexOf("/"))+"/";if(foundPath=="/")foundPath="";return
 false});if(foundPath!==false){loadModuleScripts(modules,foundPath);return 
true}return 
false};if(!findScriptPathAndLoadModules()){$(findScriptPathAndLoadModules)}}},validateInput:function($elem,language,conf,$form,eventContext){if($elem.attr("disabled"))return
 null;$elem.trigger("beforeValidation");var 
value=$elem.val()||"",optional=$elem.valAttr("optional"),validationDependsOnCheckedInput=false,validationDependentInputIsChecked=false,validateIfCheckedElement=false,validateIfCheckedElementName=$elem.valAttr("if-checked");if(validateIfCheckedElementName!=null){validationDependsOnCheckedInput=true;validateIfCheckedElement=$form.find('input[name="'+validateIfCheckedElementName+'"]');if(validateIfCheckedElement.prop("checked")){validationDependentInputIsChecked=true}}if(!value&&optional==="true"||validationDependsOnCheckedInput&&!validationDependentInputIsChecked){return
 conf.addValidClassOnAll?true:null}var 
validationRules=$elem.attr(conf.validationRuleAttribute),validationErrorMsg=true;if(!validationRules){return
 
conf.addValidClassOnAll?true:null}$.split(validationRules,function(rule){if(rule.indexOf("validate_")!==0){rule="validate_"+rule}var
 validator=$.formUtils.validators[rule];if(validator&&typeof 
validator["validatorFunction"]=="function"){if(rule=="validate_checkbox_group"){$elem=$("[name='"+$elem.attr("name")+"']:eq(0)")}var
 
isValid=null;if(eventContext!="keyup"||validator.validateOnKeyUp){isValid=validator.validatorFunction(value,$elem,conf,language,$form)}if(!isValid){validationErrorMsg=null;if(isValid!==null){validationErrorMsg=$elem.attr(conf.validationErrorMsgAttribute+"-"+rule.replace("validate_",""));if(!validationErrorMsg){validationErrorMsg=$elem.attr(conf.validationErrorMsgAttribute);if(!validationErrorMsg){validationErrorMsg=language[validator.errorMessageKey];if(!validationErrorMsg)validationErrorMsg=validator.errorMessage}}}return
 false}}else{throw new Error('Using undefined validator "'+rule+'"')}}," ");var 
result;if(typeof 
validationErrorMsg=="string"){$elem.trigger("validation",false);result=validationErrorMsg}else
 
if(validationErrorMsg===null&&!conf.addValidClassOnAll){result=null}else{$elem.trigger("validation",true);result=true}if(typeof
 
conf.onElementValidate=="function"&&result!==null){conf.onElementValidate(result===true,$elem,$form,validationErrorMsg)}return
 result},parseDate:function(val,dateFormat){var 
divider=dateFormat.replace(/[a-zA-Z]/gi,"").substring(0,1),regexp="^",formatParts=dateFormat.split(divider||null),matches,day,month,year;$.each(formatParts,function(i,part){regexp+=(i>0?"\\"+divider:"")+"(\\d{"+part.length+"})"});regexp+="$";matches=val.match(new
 RegExp(regexp));if(matches===null){return false}var 
findDateUnit=function(unit,formatParts,matches){for(var 
i=0;i<formatParts.length;i++){if(formatParts[i].substring(0,1)===unit){return 
$.formUtils.parseDateInt(matches[i+1])}}return-1};month=findDateUnit("m",formatParts,matches);day=findDateUnit("d",formatParts,matches);year=findDateUnit("y",formatParts,matches);if(month===2&&day>28&&(year%4!==0||year%100===0&&year%400!==0)||month===2&&day>29&&(year%4===0||year%100!==0&&year%400===0)||month>12||month===0){return
 
false}if(this.isShortMonth(month)&&day>30||!this.isShortMonth(month)&&day>31||day===0){return
 
false}return[year,month,day]},parseDateInt:function(val){if(val.indexOf("0")===0){val=val.replace("0","")}return
 parseInt(val,10)},isShortMonth:function(m){return 
m%2===0&&m<7||m%2!==0&&m>7},lengthRestriction:function($inputElement,$maxLengthElement){var
 
maxChars=parseInt($maxLengthElement.text(),10),charsLeft=0,countCharacters=function(){var
 numChars=$inputElement.val().length;if(numChars>maxChars){var 
currScrollTopPos=$inputElement.scrollTop();$inputElement.val($inputElement.val().substring(0,maxChars));$inputElement.scrollTop(currScrollTopPos)}charsLeft=maxChars-numChars;if(charsLeft<0)charsLeft=0;$maxLengthElement.text(charsLeft)};$($inputElement).bind("keydown
 keyup keypress focus blur",countCharacters).bind("cut 
paste",function(){setTimeout(countCharacters,100)});$(document).bind("ready",countCharacters)},numericRangeCheck:function(value,rangeAllowed){var
 range=$.split(rangeAllowed);var 
minmax=parseInt(rangeAllowed.substr(3),10);if(range.length==2&&(value<parseInt(range[0],10)||value>parseInt(range[1],10))){return["out",range[0],range[1]]}else
 if(rangeAllowed.indexOf("min")===0&&value<minmax){return["min",minmax]}else 
if(rangeAllowed.indexOf("max")===0&&value>minmax){return["max",minmax]}return["ok"]},_numSuggestionElements:0,_selectedSuggestion:null,_previousTypedVal:null,suggest:function($elem,suggestions,settings){var
 
conf={css:{maxHeight:"150px",background:"#FFF",lineHeight:"150%",textDecoration:"underline",overflowX:"hidden",overflowY:"auto",border:"#CCC
 solid 
1px",borderTop:"none",cursor:"pointer"},activeSuggestionCSS:{background:"#E9E9E9"}},setSuggsetionPosition=function($suggestionContainer,$input){var
 
offset=$input.offset();$suggestionContainer.css({width:$input.outerWidth(),left:offset.left+"px",top:offset.top+$input.outerHeight()+"px"})};if(settings)$.extend(conf,settings);conf.css["position"]="absolute";conf.css["z-index"]=9999;$elem.attr("autocomplete","off");if(this._numSuggestionElements===0){$window.bind("resize",function(){$(".jquery-form-suggestions").each(function(){var
 
$container=$(this),suggestID=$container.attr("data-suggest-container");setSuggsetionPosition($container,$(".suggestions-"+suggestID).eq(0))})})}this._numSuggestionElements++;var
 onSelectSuggestion=function($el){var 
suggestionId=$el.valAttr("suggestion-nr");$.formUtils._selectedSuggestion=null;$.formUtils._previousTypedVal=null;$(".jquery-form-suggestion-"+suggestionId).fadeOut("fast")};$elem.data("suggestions",suggestions).valAttr("suggestion-nr",this._numSuggestionElements).unbind("focus.suggest").bind("focus.suggest",function(){$(this).trigger("keyup");$.formUtils._selectedSuggestion=null}).unbind("keyup.suggest").bind("keyup.suggest",function(){var
 
$input=$(this),foundSuggestions=[],val=$.trim($input.val()).toLocaleLowerCase();if(val==$.formUtils._previousTypedVal){return}else{$.formUtils._previousTypedVal=val}var
 
hasTypedSuggestion=false,suggestionId=$input.valAttr("suggestion-nr"),$suggestionContainer=$(".jquery-form-suggestion-"+suggestionId);$suggestionContainer.scrollTop(0);if(val!=""){var
 
findPartial=val.length>2;$.each($input.data("suggestions"),function(i,suggestion){var
 
lowerCaseVal=suggestion.toLocaleLowerCase();if(lowerCaseVal==val){foundSuggestions.push("<strong>"+suggestion+"</strong>");hasTypedSuggestion=true;return
 false}else 
if(lowerCaseVal.indexOf(val)===0||findPartial&&lowerCaseVal.indexOf(val)>-1){foundSuggestions.push(suggestion.replace(new
 
RegExp(val,"gi"),"<strong>$&</strong>"))}})}if(hasTypedSuggestion||foundSuggestions.length==0&&$suggestionContainer.length>0){$suggestionContainer.hide()}else
 
if(foundSuggestions.length>0&&$suggestionContainer.length==0){$suggestionContainer=$("<div></div>").css(conf.css).appendTo("body");$elem.addClass("suggestions-"+suggestionId);$suggestionContainer.attr("data-suggest-container",suggestionId).addClass("jquery-form-suggestions").addClass("jquery-form-suggestion-"+suggestionId)}else
 
if(foundSuggestions.length>0&&!$suggestionContainer.is(":visible")){$suggestionContainer.show()}if(foundSuggestions.length>0&&val.length!=foundSuggestions[0].length){setSuggsetionPosition($suggestionContainer,$input);$suggestionContainer.html("");$.each(foundSuggestions,function(i,text){$("<div></div>").append(text).css({overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",padding:"5px"}).addClass("form-suggest-element").appendTo($suggestionContainer).click(function(){$input.focus();$input.val($(this).text());onSelectSuggestion($input)})})}}).unbind("keydown.validation").bind("keydown.validation",function(e){var
 
code=e.keyCode?e.keyCode:e.which,suggestionId,$suggestionContainer,$input=$(this);if(code==13&&$.formUtils._selectedSuggestion!==null){suggestionId=$input.valAttr("suggestion-nr");$suggestionContainer=$(".jquery-form-suggestion-"+suggestionId);if($suggestionContainer.length>0){var
 
newText=$suggestionContainer.find("div").eq($.formUtils._selectedSuggestion).text();$input.val(newText);onSelectSuggestion($input);e.preventDefault()}}else{suggestionId=$input.valAttr("suggestion-nr");$suggestionContainer=$(".jquery-form-suggestion-"+suggestionId);var
 
$suggestions=$suggestionContainer.children();if($suggestions.length>0&&$.inArray(code,[38,40])>-1){if(code==38){if($.formUtils._selectedSuggestion===null)$.formUtils._selectedSuggestion=$suggestions.length-1;else
 
$.formUtils._selectedSuggestion--;if($.formUtils._selectedSuggestion<0)$.formUtils._selectedSuggestion=$suggestions.length-1}else
 
if(code==40){if($.formUtils._selectedSuggestion===null)$.formUtils._selectedSuggestion=0;else
 
$.formUtils._selectedSuggestion++;if($.formUtils._selectedSuggestion>$suggestions.length-1)$.formUtils._selectedSuggestion=0}var
 
containerInnerHeight=$suggestionContainer.innerHeight(),containerScrollTop=$suggestionContainer.scrollTop(),suggestionHeight=$suggestionContainer.children().eq(0).outerHeight(),activeSuggestionPosY=suggestionHeight*$.formUtils._selectedSuggestion;if(activeSuggestionPosY<containerScrollTop||activeSuggestionPosY>containerScrollTop+containerInnerHeight){$suggestionContainer.scrollTop(activeSuggestionPosY)}$suggestions.removeClass("active-suggestion").css("background","none").eq($.formUtils._selectedSuggestion).addClass("active-suggestion").css(conf.activeSuggestionCSS);e.preventDefault();return
 
false}}}).unbind("blur.suggest").bind("blur.suggest",function(){onSelectSuggestion($(this))});return
 $elem},LANG:{errorTitle:"Form submission failed!",requiredFields:"You have not 
answered all required fields",badTime:"You have not given a correct 
time",badEmail:"You have not given a correct e-mail address",badTelephone:"You 
have not given a correct phone number",badSecurityAnswer:"You have not given a 
correct answer to the security question",badDate:"You have not given a correct 
date",lengthBadStart:"The input value must be between ",lengthBadEnd:" 
characters",lengthTooLongStart:"The input value is longer than 
",lengthTooShortStart:"The input value is shorter than ",notConfirmed:"Input 
values could not be confirmed",badDomain:"Incorrect domain value",badUrl:"The 
input value is not a correct URL",badCustomVal:"The input value is 
incorrect",badInt:"The input value was not a correct 
number",badSecurityNumber:"Your social security number was 
incorrect",badUKVatAnswer:"Incorrect UK VAT Number",badStrength:"The password 
isn't strong enough",badNumberOfSelectedOptionsStart:"You have to choose at 
least ",badNumberOfSelectedOptionsEnd:" answers",badAlphaNumeric:"The input 
value can only contain alphanumeric characters ",badAlphaNumericExtra:" and 
",wrongFileSize:"The file you are trying to upload is too large (max 
%s)",wrongFileType:"Only files of type %s is 
allowed",groupCheckedRangeStart:"Please choose between 
",groupCheckedTooFewStart:"Please choose at least 
",groupCheckedTooManyStart:"Please choose a maximum of ",groupCheckedEnd:" 
item(s)",badCreditCard:"The credit card number is not correct",badCVV:"The CVV 
number was not 
correct"}};$.formUtils.addValidator({name:"email",validatorFunction:function(email){var
 emailParts=email.toLowerCase().split("@");if(emailParts.length==2){return 
$.formUtils.validators.validate_domain.validatorFunction(emailParts[1])&&!/[^\w\+\.\-]/.test(emailParts[0])&&emailParts[0].length>0}return
 
false},errorMessage:"",errorMessageKey:"badEmail"});$.formUtils.addValidator({name:"domain",validatorFunction:function(val){return
 
val.length>0&&val.length<=253&&!/[^a-zA-Z0-9]/.test(val.substr(-2))&&!/[^a-zA-Z]/.test(val.substr(0,1))&&!/[^a-zA-Z0-9\.\-]/.test(val)&&val.split("..").length==1&&val.split(".").length>1},errorMessage:"",errorMessageKey:"badDomain"});$.formUtils.addValidator({name:"required",validatorFunction:function(val,$el,config,language,$form){switch($el.attr("type")){case"checkbox":return
 $el.is(":checked");case"radio":return 
$form.find('input[name="'+$el.attr("name")+'"]').filter(":checked").length>0;default:return
 
$.trim(val)!==""}},errorMessage:"",errorMessageKey:"requiredFields"});$.formUtils.addValidator({name:"length",validatorFunction:function(val,$el,conf,lang){var
 
lengthAllowed=$el.valAttr("length"),type=$el.attr("type");if(lengthAllowed==undefined){alert('Please
 add attribute "data-validation-length" to '+$el[0].nodeName+" named 
"+$el.attr("name"));return true}var 
len=type=="file"&&$el.get(0).files!==undefined?$el.get(0).files.length:val.length,lengthCheckResults=$.formUtils.numericRangeCheck(len,lengthAllowed),checkResult;switch(lengthCheckResults[0]){case"out":this.errorMessage=lang.lengthBadStart+lengthAllowed+lang.lengthBadEnd;checkResult=false;break;case"min":this.errorMessage=lang.lengthTooShortStart+lengthCheckResults[1]+lang.lengthBadEnd;checkResult=false;break;case"max":this.errorMessage=lang.lengthTooLongStart+lengthCheckResults[1]+lang.lengthBadEnd;checkResult=false;break;default:checkResult=true}return
 
checkResult},errorMessage:"",errorMessageKey:""});$.formUtils.addValidator({name:"url",validatorFunction:function(url){var
 
urlFilter=/^(https?|ftp):\/\/((((\w|-|\.|~|[\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])(\w|-|\.|~|[\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])(\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/(((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|\[|\]|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#(((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i;if(urlFilter.test(url)){var
 
domain=url.split("://")[1],domainSlashPos=domain.indexOf("/");if(domainSlashPos>-1)domain=domain.substr(0,domainSlashPos);return
 $.formUtils.validators.validate_domain.validatorFunction(domain)}return 
false},errorMessage:"",errorMessageKey:"badUrl"});$.formUtils.addValidator({name:"number",validatorFunction:function(val,$el,conf){if(val!==""){var
 
allowing=$el.valAttr("allowing")||"",decimalSeparator=$el.valAttr("decimal-separator")||conf.decimalSeparator,allowsRange=false,begin,end,steps=$el.valAttr("step")||"",allowsSteps=false;if(allowing.indexOf("number")==-1)allowing+=",number";if(allowing.indexOf("negative")>-1&&val.indexOf("-")===0){val=val.substr(1)}if(allowing.indexOf("range")>-1){begin=parseFloat(allowing.substring(allowing.indexOf("[")+1,allowing.indexOf(";")));end=parseFloat(allowing.substring(allowing.indexOf(";")+1,allowing.indexOf("]")));allowsRange=true}if(steps!="")allowsSteps=true;if(decimalSeparator==","){if(val.indexOf(".")>-1){return
 
false}val=val.replace(",",".")}if(allowing.indexOf("number")>-1&&val.replace(/[0-9]/g,"")===""&&(!allowsRange||val>=begin&&val<=end)&&(!allowsSteps||val%steps==0)){return
 true}if(allowing.indexOf("float")>-1&&val.match(new 
RegExp("^([0-9]+)\\.([0-9]+)$"))!==null&&(!allowsRange||val>=begin&&val<=end)&&(!allowsSteps||val%steps==0)){return
 true}}return 
false},errorMessage:"",errorMessageKey:"badInt"});$.formUtils.addValidator({name:"alphanumeric",validatorFunction:function(val,$el,conf,language){var
 
patternStart="^([a-zA-Z0-9",patternEnd="]+)$",additionalChars=$el.valAttr("allowing"),pattern="";if(additionalChars){pattern=patternStart+additionalChars+patternEnd;var
 extra=additionalChars.replace(/\\/g,"");if(extra.indexOf(" 
")>-1){extra=extra.replace(" ","");extra+=" and spaces 
"}this.errorMessage=language.badAlphaNumeric+language.badAlphaNumericExtra+extra}else{pattern=patternStart+patternEnd;this.errorMessage=language.badAlphaNumeric}return
 new 
RegExp(pattern).test(val)},errorMessage:"",errorMessageKey:""});$.formUtils.addValidator({name:"custom",validatorFunction:function(val,$el,conf){var
 regexp=new RegExp($el.valAttr("regexp"));return 
regexp.test(val)},errorMessage:"",errorMessageKey:"badCustomVal"});$.formUtils.addValidator({name:"date",validatorFunction:function(date,$el,conf){var
 dateFormat=$el.valAttr("format")||conf.dateFormat||"yyyy-mm-dd";return 
$.formUtils.parseDate(date,dateFormat)!==false},errorMessage:"",errorMessageKey:"badDate"});$.formUtils.addValidator({name:"checkbox_group",validatorFunction:function(val,$el,conf,lang,$form){var
 
checkResult=true,elname=$el.attr("name"),checkedCount=$("input[type=checkbox][name^='"+elname+"']:checked",$form).length,qtyAllowed=$el.valAttr("qty");if(qtyAllowed==undefined){var
 elementType=$el.get(0).nodeName;alert('Attribute "data-validation-qty" is 
missing from '+elementType+" named "+$el.attr("name"))}var 
qtyCheckResults=$.formUtils.numericRangeCheck(checkedCount,qtyAllowed);switch(qtyCheckResults[0]){case"out":this.errorMessage=lang.groupCheckedRangeStart+qtyAllowed+lang.groupCheckedEnd;checkResult=false;break;case"min":this.errorMessage=lang.groupCheckedTooFewStart+qtyCheckResults[1]+lang.groupCheckedEnd;checkResult=false;break;case"max":this.errorMessage=lang.groupCheckedTooManyStart+qtyCheckResults[1]+lang.groupCheckedEnd;checkResult=false;break;default:checkResult=true}return
 checkResult}})})(jQuery);

Added: branches/dev-syncromind/phpgwapi/js/form-validator/jsconf.dev.js
===================================================================
--- branches/dev-syncromind/phpgwapi/js/form-validator/jsconf.dev.js            
                (rev 0)
+++ branches/dev-syncromind/phpgwapi/js/form-validator/jsconf.dev.js    
2015-03-20 13:41:35 UTC (rev 12881)
@@ -0,0 +1,40 @@
+/**
+ * jQuery Form Validator Module: JSconf
+ * ------------------------------------------
+ * Created by Victor Jonsson <http://www.victorjonsson.se>
+ *
+ * This module makes it possible to configure form validation using javascript
+ *
+ * @website http://formvalidator.net/#location-validators
+ * @license Dual licensed under the MIT or GPL Version 2 licenses
+ * @version 2.2.beta.58
+ */
+(function($) {
+
+  "use strict";
+
+  $.setupValidation = function(conf) {
+    var $forms = $(conf.form || 'form');
+    $.each(conf.validate || conf.validation || {}, function(elemRef, attr) {
+        var $elem;
+        if( elemRef[0] == '#' ) {
+          $elem = $(elemRef);
+        } else if( elemRef[0] == '.' ) {
+          $elem = $forms.find(elemRef);
+        } else {
+          $elem = $forms.find('*[name="' +elemRef+ '"]');
+        }
+
+        $elem.attr('data-validation', attr.validation);
+
+        $.each(attr, function(name, val) {
+          if( name != 'validation' ) {
+            $elem.attr('data-validation-'+name, typeof val == 'string' ? val : 
'true');
+          }
+        });
+    });
+
+    $.validate(conf);
+  };
+
+})(jQuery);

Added: branches/dev-syncromind/phpgwapi/js/form-validator/jsconf.js
===================================================================
--- branches/dev-syncromind/phpgwapi/js/form-validator/jsconf.js                
                (rev 0)
+++ branches/dev-syncromind/phpgwapi/js/form-validator/jsconf.js        
2015-03-20 13:41:35 UTC (rev 12881)
@@ -0,0 +1 @@
+(function($){"use strict";$.setupValidation=function(conf){var 
$forms=$(conf.form||"form");$.each(conf.validate||conf.validation||{},function(elemRef,attr){var
 $elem;if(elemRef[0]=="#"){$elem=$(elemRef)}else 
if(elemRef[0]=="."){$elem=$forms.find(elemRef)}else{$elem=$forms.find('*[name="'+elemRef+'"]')}$elem.attr("data-validation",attr.validation);$.each(attr,function(name,val){if(name!="validation"){$elem.attr("data-validation-"+name,typeof
 val=="string"?val:"true")}})});$.validate(conf)}})(jQuery);

Modified: branches/dev-syncromind/phpgwapi/js/form-validator/location.dev.js
===================================================================
--- branches/dev-syncromind/phpgwapi/js/form-validator/location.dev.js  
2015-03-20 09:01:00 UTC (rev 12880)
+++ branches/dev-syncromind/phpgwapi/js/form-validator/location.dev.js  
2015-03-20 13:41:35 UTC (rev 12881)
@@ -10,7 +10,7 @@
  *
  * @website http://formvalidator.net/#location-validators
  * @license Dual licensed under the MIT or GPL Version 2 licenses
- * @version 2.2.beta.13
+ * @version 2.2.beta.58
  */
 (function($) {
 

Modified: branches/dev-syncromind/phpgwapi/js/form-validator/location.js
===================================================================
--- branches/dev-syncromind/phpgwapi/js/form-validator/location.js      
2015-03-20 09:01:00 UTC (rev 12880)
+++ branches/dev-syncromind/phpgwapi/js/form-validator/location.js      
2015-03-20 13:41:35 UTC (rev 12881)
@@ -1 +1 @@
-(function($){$.formUtils.addValidator({name:"country",validatorFunction:function(str){return
 
$.inArray(str.toLowerCase(),this.countries)>-1},countries:["afghanistan","albania","algeria","american
 samoa","andorra","angola","anguilla","antarctica","antigua and 
barbuda","arctic ocean","argentina","armenia","aruba","ashmore and cartier 
islands","atlantic 
ocean","australia","austria","azerbaijan","bahamas","bahrain","baltic 
sea","baker island","bangladesh","barbados","bassas da 
india","belarus","belgium","belize","benin","bermuda","bhutan","bolivia","borneo","bosnia
 and herzegovina","botswana","bouvet island","brazil","british virgin 
islands","brunei","bulgaria","burkina 
faso","burundi","cambodia","cameroon","canada","cape verde","cayman 
islands","central african republic","chad","chile","china","christmas 
island","clipperton island","cocos islands","colombia","comoros","cook 
islands","coral sea islands","costa rica","croatia","cuba","cyprus","czech 
republic","democratic republic of the 
congo","denmark","djibouti","dominica","dominican republic","east 
timor","ecuador","egypt","el salvador","equatorial 
guinea","eritrea","estonia","ethiopia","europa island","falkland 
islands","faroe islands","fiji","finland","france","french guiana","french 
polynesia","french southern and antarctic lands","gabon","gambia","gaza 
strip","georgia","germany","ghana","gibraltar","glorioso 
islands","greece","greenland","grenada","guadeloupe","guam","guatemala","guernsey","guinea","guinea-bissau","guyana","haiti","heard
 island and mcdonald islands","honduras","hong kong","howland 
island","hungary","iceland","india","indian 
ocean","indonesia","iran","iraq","ireland","isle of 
man","israel","italy","jamaica","jan mayen","japan","jarvis 
island","jersey","johnston atoll","jordan","juan de nova 
island","kazakhstan","kenya","kerguelen archipelago","kingman 
reef","kiribati","kosovo","kuwait","kyrgyzstan","laos","latvia","lebanon","lesotho","liberia","libya","liechtenstein","lithuania","luxembourg","macau","macedonia","madagascar","malawi","malaysia","maldives","mali","malta","marshall
 islands","martinique","mauritania","mauritius","mayotte","mediterranean 
sea","mexico","micronesia","midway 
islands","moldova","monaco","mongolia","montenegro","montserrat","morocco","mozambique","myanmar","namibia","nauru","navassa
 island","nepal","netherlands","netherlands antilles","new caledonia","new 
zealand","nicaragua","niger","nigeria","niue","norfolk island","north 
korea","north sea","northern mariana islands","norway","oman","pacific 
ocean","pakistan","palau","palmyra atoll","panama","papua new guinea","paracel 
islands","paraguay","peru","philippines","pitcairn 
islands","poland","portugal","puerto rico","qatar","republic of the 
congo","reunion","romania","ross sea","russia","rwanda","saint helena","saint 
kitts and nevis","saint lucia","saint pierre and miquelon","saint vincent and 
the grenadines","samoa","san marino","sao tome and principe","saudi 
arabia","senegal","serbia","seychelles","sierra 
leone","singapore","slovakia","slovenia","solomon islands","somalia","south 
africa","south georgia and the south sandwich islands","south korea","southern 
ocean","spain","spratly islands","sri 
lanka","sudan","suriname","svalbard","swaziland","sweden","switzerland","syria","taiwan","tajikistan","tanzania","tasman
 sea","thailand","togo","tokelau","tonga","trinidad and tobago","tromelin 
island","tunisia","turkey","turkmenistan","turks and caicos 
islands","tuvalu","uganda","ukraine","united arab emirates","united 
kingdom","uruguay","usa","uzbekistan","vanuatu","venezuela","viet nam","virgin 
islands","wake island","wallis and futuna","west bank","western 
sahara","yemen","zambia","zimbabwe"],errorMessage:"",errorMessageKey:"badCustomVal"});$.formUtils.addValidator({name:"federatestate",validatorFunction:function(str){return
 
$.inArray(str.toLowerCase(),this.states)>-1},states:["alabama","alaska","arizona","arkansas","california","colorado","connecticut","delaware","florida","georgia","hawaii","idaho","illinois","indiana","iowa","kansas","kentucky","louisiana","maine","maryland","district
 of 
columbia","massachusetts","michigan","minnesota","mississippi","missouri","montana","nebraska","nevada","new
 hampshire","new jersey","new mexico","new york","north carolina","north 
dakota","ohio","oklahoma","oregon","pennsylvania","rhode island","south 
carolina","south 
dakota","tennessee","texas","utah","vermont","virginia","washington","west 
virginia","wisconsin","wyoming"],errorMessage:"",errorMessageKey:"badCustomVal"});$.formUtils.addValidator({name:"longlat",validatorFunction:function(str){var
 regexp=/^[+-]?\d+\.\d+, ?[+-]?\d+\.\d+$/;return 
regexp.test(str)},errorMessage:"",errorMessageKey:"badCustomVal"});var 
_makeSortedList=function(listItems){var 
newList=[];$.each(listItems,function(i,v){newList.push(v.substr(0,1).toUpperCase()+v.substr(1,v.length))});newList.sort();return
 newList};$.fn.suggestCountry=function(settings){var 
country=_makeSortedList($.formUtils.validators.validate_country.countries);return
 
$.formUtils.suggest(this,country,settings)};$.fn.suggestState=function(settings){var
 
states=_makeSortedList($.formUtils.validators.validate_federatestate.states);return
 $.formUtils.suggest(this,states,settings)}})(jQuery);
\ No newline at end of file
+(function($){$.formUtils.addValidator({name:"country",validatorFunction:function(str){return
 
$.inArray(str.toLowerCase(),this.countries)>-1},countries:["afghanistan","albania","algeria","american
 samoa","andorra","angola","anguilla","antarctica","antigua and 
barbuda","arctic ocean","argentina","armenia","aruba","ashmore and cartier 
islands","atlantic 
ocean","australia","austria","azerbaijan","bahamas","bahrain","baltic 
sea","baker island","bangladesh","barbados","bassas da 
india","belarus","belgium","belize","benin","bermuda","bhutan","bolivia","borneo","bosnia
 and herzegovina","botswana","bouvet island","brazil","british virgin 
islands","brunei","bulgaria","burkina 
faso","burundi","cambodia","cameroon","canada","cape verde","cayman 
islands","central african republic","chad","chile","china","christmas 
island","clipperton island","cocos islands","colombia","comoros","cook 
islands","coral sea islands","costa rica","croatia","cuba","cyprus","czech 
republic","democratic republic of the 
congo","denmark","djibouti","dominica","dominican republic","east 
timor","ecuador","egypt","el salvador","equatorial 
guinea","eritrea","estonia","ethiopia","europa island","falkland 
islands","faroe islands","fiji","finland","france","french guiana","french 
polynesia","french southern and antarctic lands","gabon","gambia","gaza 
strip","georgia","germany","ghana","gibraltar","glorioso 
islands","greece","greenland","grenada","guadeloupe","guam","guatemala","guernsey","guinea","guinea-bissau","guyana","haiti","heard
 island and mcdonald islands","honduras","hong kong","howland 
island","hungary","iceland","india","indian 
ocean","indonesia","iran","iraq","ireland","isle of 
man","israel","italy","jamaica","jan mayen","japan","jarvis 
island","jersey","johnston atoll","jordan","juan de nova 
island","kazakhstan","kenya","kerguelen archipelago","kingman 
reef","kiribati","kosovo","kuwait","kyrgyzstan","laos","latvia","lebanon","lesotho","liberia","libya","liechtenstein","lithuania","luxembourg","macau","macedonia","madagascar","malawi","malaysia","maldives","mali","malta","marshall
 islands","martinique","mauritania","mauritius","mayotte","mediterranean 
sea","mexico","micronesia","midway 
islands","moldova","monaco","mongolia","montenegro","montserrat","morocco","mozambique","myanmar","namibia","nauru","navassa
 island","nepal","netherlands","netherlands antilles","new caledonia","new 
zealand","nicaragua","niger","nigeria","niue","norfolk island","north 
korea","north sea","northern mariana islands","norway","oman","pacific 
ocean","pakistan","palau","palmyra atoll","panama","papua new guinea","paracel 
islands","paraguay","peru","philippines","pitcairn 
islands","poland","portugal","puerto rico","qatar","republic of the 
congo","reunion","romania","ross sea","russia","rwanda","saint helena","saint 
kitts and nevis","saint lucia","saint pierre and miquelon","saint vincent and 
the grenadines","samoa","san marino","sao tome and principe","saudi 
arabia","senegal","serbia","seychelles","sierra 
leone","singapore","slovakia","slovenia","solomon islands","somalia","south 
africa","south georgia and the south sandwich islands","south korea","southern 
ocean","spain","spratly islands","sri 
lanka","sudan","suriname","svalbard","swaziland","sweden","switzerland","syria","taiwan","tajikistan","tanzania","tasman
 sea","thailand","togo","tokelau","tonga","trinidad and tobago","tromelin 
island","tunisia","turkey","turkmenistan","turks and caicos 
islands","tuvalu","uganda","ukraine","united arab emirates","united 
kingdom","uruguay","usa","uzbekistan","vanuatu","venezuela","viet nam","virgin 
islands","wake island","wallis and futuna","west bank","western 
sahara","yemen","zambia","zimbabwe"],errorMessage:"",errorMessageKey:"badCustomVal"});$.formUtils.addValidator({name:"federatestate",validatorFunction:function(str){return
 
$.inArray(str.toLowerCase(),this.states)>-1},states:["alabama","alaska","arizona","arkansas","california","colorado","connecticut","delaware","florida","georgia","hawaii","idaho","illinois","indiana","iowa","kansas","kentucky","louisiana","maine","maryland","district
 of 
columbia","massachusetts","michigan","minnesota","mississippi","missouri","montana","nebraska","nevada","new
 hampshire","new jersey","new mexico","new york","north carolina","north 
dakota","ohio","oklahoma","oregon","pennsylvania","rhode island","south 
carolina","south 
dakota","tennessee","texas","utah","vermont","virginia","washington","west 
virginia","wisconsin","wyoming"],errorMessage:"",errorMessageKey:"badCustomVal"});$.formUtils.addValidator({name:"longlat",validatorFunction:function(str){var
 regexp=/^[+-]?\d+\.\d+, ?[+-]?\d+\.\d+$/;return 
regexp.test(str)},errorMessage:"",errorMessageKey:"badCustomVal"});var 
_makeSortedList=function(listItems){var 
newList=[];$.each(listItems,function(i,v){newList.push(v.substr(0,1).toUpperCase()+v.substr(1,v.length))});newList.sort();return
 newList};$.fn.suggestCountry=function(settings){var 
country=_makeSortedList($.formUtils.validators.validate_country.countries);return
 
$.formUtils.suggest(this,country,settings)};$.fn.suggestState=function(settings){var
 
states=_makeSortedList($.formUtils.validators.validate_federatestate.states);return
 $.formUtils.suggest(this,states,settings)}})(jQuery);

Modified: branches/dev-syncromind/phpgwapi/js/form-validator/qunit.html
===================================================================
--- branches/dev-syncromind/phpgwapi/js/form-validator/qunit.html       
2015-03-20 09:01:00 UTC (rev 12880)
+++ branches/dev-syncromind/phpgwapi/js/form-validator/qunit.html       
2015-03-20 13:41:35 UTC (rev 12881)
@@ -52,9 +52,9 @@
 
         var message;
         if( typeof obj.val == 'string' ) {
-            message  = 'Check that '+obj.val+' is '+(obj.isValid ? 
'valid':'invalid');
+            message  = 'Check that "'+obj.val+'" is '+(obj.isValid ? 
'valid':'invalid');
         } else {
-            message = 'Check that input[value='+obj.val.attr('value')+'] is 
'+(obj.isValid ? 'valid':'invalid');
+            message = 'Check that input[value="'+obj.val.attr('value')+'"] is 
'+(obj.isValid ? 'valid':'invalid');
         }
 
         if( result === null && obj.isValid ) {
@@ -116,7 +116,7 @@
                 {val: 'address@hidden', isValid : true},
                 {val: 'address@hidden', isValid : true},
                 {val: 'address@hidden', isValid : true},
-                {val: 'address@hidden', isValid : false},
+                {val: 'address@hidden', isValid : true},
                 {val: '@sdsd.xxz', isValid : false},
                 {val: 'sasas@', isValid : false},
                 {val: 'sasas.se', isValid : false},
@@ -139,10 +139,9 @@
                 {val: 'klsdmfklsmdf', isValid: false},
                 {val: 'http://google.se', isValid: true},
                 {val: 'https://google.se/test/?arge=hej_&arg[]=123', isValid: 
true},
-                {val: 'http://google.xxx/test/test.jsp', isValid: true},
-                {val: 'http://google.xxy', isValid: false},
-                {val: 'http://google.xxy/test/test.jsp', isValid: false},
                 {val: 'http://google.test.de', isValid: true},
+                {val: 'http://test.xn--fiqz9s', isValid: true},
+                {val: 'http://test.youtube', isValid: true},
                 {val: 'http://google.test.co.uk/', isValid: true}
             ];
 
@@ -163,15 +162,17 @@
                 {val:'domain.xxx', isValid:true},
                 {val:'domain.com', isValid:true},
                 {val:'www.domain.com', isValid:true},
+                {val:'test.xn--fiqz9s', isValid:true},
+                {val:'test..xn--fiqz9s', isValid:false},
                 {val:'q.com', isValid:true},
-                {val:'v.com', isValid:false},
                 {val:'amazone.website.tippit.de', isValid:true},
                 {val:'amazone.website.co.uk', isValid:true},
                 {val:'http://domain.se', isValid:false},
                 {val:'http://www.domain.se', isValid:false},
                 {val:'http://www.domain.se/', isValid:false},
                 {val:'domain.com/', isValid:false},
-                {val:'', isValid:false}
+                {val:'', isValid:false},
+                {val:'asdfasdf', isValid:false}
             ];
 
             $.each(links, function(i, obj) {
@@ -211,7 +212,11 @@
                 {val:'asdXAvs1', isValid:true},
                 {val:'a  b', isValid:false},
                 {val:'a-_ bäöåA', isValid:false},
+                {val:'abbb', isValid:true},
+                {val:'a,bbb', isValid:false},
+                {val:input('a,bbb', {'allowing':',', '':'alphanumeric'}), 
isValid:true},
                 {val:input('a b', {'allowing':' ', '':'alphanumeric'}), 
isValid:true},
+                {val:input('', {'allowing':' ', length:'3-12', '':'length 
alphanumeric'}), isValid:false},
                 {val:input('a-_ bäöåÖA', {'allowing':' -_öäåÄÖÅ', 
'':'alphanumeric'}), isValid:true}
             ];
 
@@ -244,6 +249,32 @@
             });
         });
 
+        test('isValid()', function() {
+
+            $form.empty();
+            $form.append(input('4000000000000002', {'allowing':'visa', 
'':'creditcard'}));
+            $form.append(input('', {'optional':'true', '':'alphanumeric'}));
+            $form.append(input('', 'alphanumeric'));
+            $form.append(input('4000000000000002', 'alphanumeric'));
+
+            equal(
+                $form.isValid(false, false, false),
+                false
+            );
+
+            $form.empty();
+            $form.append(input('4000000000000002', {'allowing':'visa', 
'':'creditcard'}));
+            $form.append(input('', {'optional':'true', '':'alphanumeric'}));
+            $form.append(input('fff', 'alphanumeric'));
+            $form.append(input('4000000000000002', 'alphanumeric'));
+
+            equal(
+                $form.isValid(false, false, false),
+                true
+            );
+
+        });
+
         /*
          * CVV VALIDATION
          */
@@ -253,6 +284,7 @@
 
             var links = [
                 {val:'012', isValid:true},
+                {val:'0124', isValid:false},
                 {val:'000', isValid:true},
                 {val:'01', isValid:false},
                 {val:'a12', isValid:false}
@@ -261,11 +293,33 @@
             $.each(links, function(i, obj) {
                 runTest(obj, 'cvv');
             });
+
+            // check with amex only
+            var $cCard = input('', {'allowing':'amex', '':'creditcard'}),
+                $cvv = input('1234', 'cvv'),
+                result;
+
+            // let the validator know which type of card we're validating
+            $.formUtils.validateInput($cCard, $.formUtils.LANG, 
$.formUtils.defaultConfig(), $form)
+
+            result = $.formUtils.validateInput($cvv, $.formUtils.LANG, 
$.formUtils.defaultConfig(), $form);
+            equal(
+                true,
+                result
+            );
+
+            $cvv.val('123');
+            result = $.formUtils.validateInput($cvv, $.formUtils.LANG, 
$.formUtils.defaultConfig(), $form);
+            equal(
+                'string',
+                typeof result
+            );
+
         });
 
 
         /*
-         * ALPHANUMERIC VALIDATION
+         * DISABLED VALIDATION
          */
         test("Do not validate disabled", function() {
             clearForm();

Modified: branches/dev-syncromind/phpgwapi/js/form-validator/security.dev.js
===================================================================
--- branches/dev-syncromind/phpgwapi/js/form-validator/security.dev.js  
2015-03-20 09:01:00 UTC (rev 12880)
+++ branches/dev-syncromind/phpgwapi/js/form-validator/security.dev.js  
2015-03-20 13:41:35 UTC (rev 12881)
@@ -13,7 +13,7 @@
  *  - cvv
  *
  * @website http://formvalidator.net/#security-validators
- * @version 2.2.beta.13
+ * @version 2.2.beta.58
  */
 (function($, window) {
 
@@ -55,31 +55,37 @@
         errorMessageKey: 'notConfirmed'
     });
 
+    var creditCards = {
+            'amex' : [15,15],
+            'diners_club' : [14,14],
+            'cjb' : [16,16],
+            'laser' : [16,19],
+            'visa' : [16,16],
+            'mastercard' : [16,16],
+            'maestro' : [12,19],
+            'discover' : [16,16]
+        },
+        checkOnlyAmex = false,
+        allowsAmex = false;
+
     /*
      * Credit card
      */
     $.formUtils.addValidator({
         name : 'creditcard',
         validatorFunction : function(value, $el, config, language, $form) {
-            var cards = {
-                'amex' : [15,15],
-                'diners_club' : [14,14],
-                'cjb' : [16,16],
-                'laser' : [16,19],
-                'visa' : [16,16],
-                'mastercard' : [16,16],
-                'maestro' : [12,19],
-                'discover' : [16,16]
-            },
-            allowing = $.split( $el.valAttr('allowing') || '' );
+            var allowing = $.split( $el.valAttr('allowing') || '' );
 
+            // Setup for cvv validation
+            allowsAmex = $.inArray('amex', allowing) > -1;
+            checkOnlyAmex = allowsAmex && allowing.length == 1;
 
             // Correct length
             if( allowing.length > 0 ) {
                 var hasValidLength = false;
                 $.each(allowing, function(i, cardName) {
-                    if( cardName in cards) {
-                        if( value.length >= cards[cardName][0] && value.length 
<= cards[cardName][1]) {
+                    if( cardName in creditCards) {
+                        if( value.length >= creditCards[cardName][0] && 
value.length <= creditCards[cardName][1]) {
                             hasValidLength = true;
                             return false;
                         }
@@ -126,7 +132,17 @@
     $.formUtils.addValidator({
         name : 'cvv',
         validatorFunction : function(val) {
-            return val.replace(/[0-9]/g, '') === '' && (val + '').length == 3;
+            if( val.replace(/[0-9]/g, '') === '' ) {
+                val = val + '';
+                if( checkOnlyAmex ) {
+                    return val.length == 4;
+                } else if( allowsAmex ) {
+                    return val.length == 3 || val.length == 4;
+                } else {
+                    return val.length == 3;
+                }
+            }
+            return false;
         },
         errorMessage : '',
         errorMessageKey: 'badCVV'
@@ -317,13 +333,21 @@
     });
 
     var requestServer = function(serverURL, $element, val, conf, callback) {
+        var reqParams = $element.valAttr('req-params');
+        if( !reqParams )
+            reqParams = {};
+        if( typeof reqParams == 'string' ) {
+            reqParams = $.parseJSON(reqParams);
+        }
+        reqParams[$element.valAttr('param-name') || $element.attr('name')] = 
val;
+
         $.ajax({
             url : serverURL,
             type : 'POST',
             cache : false,
-            data : $element.attr('name')+'='+val,
+            data : reqParams,
             dataType : 'json',
-            error : function(error) {
+            error : function(error, err) {
                 alert('Server validation failed due to: '+error.statusText);
                 if( window.JSON && window.JSON.stringify ) {
                     alert(window.JSON.stringify(error));
@@ -337,8 +361,6 @@
                     $element.valAttr('backend-invalid', 'true');
                     if(response.message)
                         $element.attr(conf.validationErrorMsgAttribute, 
response.message);
-                    else
-                        $element.removeAttr(conf.validationErrorMsgAttribute);
                 }
 
                 if( !$element.valAttr('has-keyup-event') ) {
@@ -348,8 +370,7 @@
                             if( evt.keyCode != 9 && evt.keyCode != 16 ) {
                                 $(this)
                                     .valAttr('backend-valid', false)
-                                    .valAttr('backend-invalid', false)
-                                    
.removeAttr(conf.validationErrorMsgAttribute);
+                                    .valAttr('backend-invalid', false);
                             }
                         });
                 }
@@ -396,12 +417,14 @@
                 return null;
 
             if($.formUtils.isValidatingEntireForm) {
+
                 $form
                     .bind('submit', disableFormSubmit)
                     .addClass('validating-server-side')
                     .addClass('on-blur');
 
                 $el.addClass('validating-server-side');
+                $.formUtils.haltValidation = true;
 
                 requestServer(serverURL, $el, val, conf, function() {
                     $form
@@ -415,10 +438,10 @@
                     $el.valAttr('value-length', val.length);
 
                     // fire submission again!
+                    $.formUtils.haltValidation = false;
                     $form.trigger('submit');
                 });
 
-                $.formUtils.haltValidation = true;
                 return null;
 
             } else {

Modified: branches/dev-syncromind/phpgwapi/js/form-validator/security.js
===================================================================
--- branches/dev-syncromind/phpgwapi/js/form-validator/security.js      
2015-03-20 09:01:00 UTC (rev 12880)
+++ branches/dev-syncromind/phpgwapi/js/form-validator/security.js      
2015-03-20 13:41:35 UTC (rev 12881)
@@ -1 +1 @@

@@ Diff output truncated at 153600 characters. @@



reply via email to

[Prev in Thread] Current Thread [Next in Thread]