u.y2)},n.solveCubic=function(e,t,r,n,i){t/=e,r/=e,n/=e;var a,o,s,l,u,c,d,h;return o=(3*r-t*t)/9,s=-(27*n)+t*(9*r-2*(t*t)),s/=54,a=o*o*o+s*s,i[1]=0,d=t/3,a>0?(u=s+Math.sqrt(a),u=0>u?-Math.pow(-u,1/3):Math.pow(u,1/3),c=s-Math.sqrt(a),c=0>c?-Math.pow(-c,1/3):Math.pow(c,1/3),i[0]=-d+u+c,d+=(u+c)/2,i[4]=i[2]=-d,d=Math.sqrt(3)*(-c+u)/2,i[3]=d,void(i[5]=-d)):(i[5]=i[3]=0,0===a?(h=0>s?-Math.pow(-s,1/3):Math.pow(s,1/3),i[0]=-d+2*h,void(i[4]=i[2]=-(h+d))):(o=-o,l=o*o*o,l=Math.acos(s/Math.sqrt(l)),h=2*Math.sqrt(o),i[0]=-d+h*Math.cos(l/3),i[2]=-d+h*Math.cos((l+2*Math.PI)/3),void(i[4]=-d+h*Math.cos((l+4*Math.PI)/3))))},n.sqdistToQuadraticBezier=function(e,t,r,n,i,a,o,s){var l=1*r*r-4*r*i+2*r*o+4*i*i-4*i*o+o*o+n*n-4*n*a+2*n*s+4*a*a-4*a*s+s*s,u=9*r*i-3*r*r-3*r*o-6*i*i+3*i*o+9*n*a-3*n*n-3*n*s-6*a*a+3*a*s,c=3*r*r-6*r*i+r*o-r*e+2*i*i+2*i*e-o*e+3*n*n-6*n*a+n*s-n*t+2*a*a+2*a*t-s*t,d=1*r*i-r*r+r*e-i*e+n*a-n*n+n*t-a*t,h=[];this.solveCubic(l,u,c,d,h);for(var p=1e-7,f=[],v=0;6>v;v+=2)Math.abs(h[v+1])=0&&h[v]<=1&&f.push(h[v]);f.push(1),f.push(0);for(var g,y,m,b,x=-1,w=0;w=0?x>b&&(x=b,g=f[w]):(x=b,g=f[w]);return x},n.sqdistToFiniteLine=function(e,t,r,n,i,a){var o=[e-r,t-n],s=[i-r,a-n],l=s[0]*s[0]+s[1]*s[1],u=o[0]*o[0]+o[1]*o[1],c=o[0]*s[0]+o[1]*s[1],d=c*c/l;return 0>c?u:d>l?(e-i)*(e-i)+(t-a)*(t-a):u-d},n.pointInsidePolygonPoints=function(e,t,r){for(var n,i,a,o,s,l=0,u=0,c=0;c=e&&e>=a||e>=n&&a>=e))continue;s=(e-n)/(a-n)*(o-i)+i,s>t&&l++,t>s&&u++}return l%2!==0},n.pointInsidePolygon=function(e,t,r,i,a,o,s,l,u){var c,d=new Array(r.length);null!=l[0]?(c=Math.atan(l[1]/l[0]),l[0]<0?c+=Math.PI/2:c=-c-Math.PI/2):c=l;for(var h=Math.cos(-c),p=Math.sin(-c),f=0;f0){var g=this.expandPolygon(d,-u);v=this.joinLines(g)}else v=d;return n.pointInsidePolygonPoints(e,t,v)},n.joinLines=function(e){for(var t,r,n,i,a,o,s,l,u=new Array(e.length/2),c=0;cu)return[];var c=u/l;return[(r-e)*c+e,(n-t)*c+t]},n.intersectLineCircle=function(e,t,r,n,i,a,o){var s=[r-e,n-t],l=[i,a],u=[e-i,t-a],c=s[0]*s[0]+s[1]*s[1],d=2*(u[0]*s[0]+u[1]*s[1]),l=u[0]*u[0]+u[1]*u[1]-o*o,h=d*d-4*c*l;if(0>h)return[];var p=(-d+Math.sqrt(h))/(2*c),f=(-d-Math.sqrt(h))/(2*c),v=Math.min(p,f),g=Math.max(p,f),y=[];if(v>=0&&1>=v&&y.push(v),g>=0&&1>=g&&y.push(g),0===y.length)return[];var m=y[0]*s[0]+e,b=y[0]*s[1]+t;if(y.length>1){if(y[0]==y[1])return[m,b];var x=y[1]*s[0]+e,w=y[1]*s[1]+t;return[m,b,x,w]}return[m,b]},n.findCircleNearPoint=function(e,t,r,n,i){var a=n-e,o=i-t,s=Math.sqrt(a*a+o*o),l=a/s,u=o/s;return[e+l*r,t+u*r]},n.findMaxSqDistanceToOrigin=function(e){for(var t,r=1e-6,n=0;nr&&(r=t);return r},n.midOfThree=function(e,t,r){return e>=t&&r>=e||e>=r&&t>=e?e:t>=e&&r>=t||t>=r&&e>=t?t:r},n.finiteLinesIntersect=function(e,t,r,n,i,a,o,s,l){var u=e-i,c=r-e,d=o-i,h=t-a,p=n-t,f=s-a,v=d*h-f*u,g=c*h-p*u,y=f*c-d*p;if(0!==y){var m=v/y,b=g/y,x=.001,w=0-x,E=1+x;return m>=w&&E>=m&&b>=w&&E>=b?[e+m*c,t+m*p]:l?[e+m*c,t+m*p]:[]}return 0===v||0===g?this.midOfThree(e,r,o)===o?[o,s]:this.midOfThree(e,r,i)===i?[i,a]:this.midOfThree(i,o,r)===r?[r,n]:[]:[]},n.polygonIntersectLine=function(e,t,r,i,a,o,s,l){for(var u,c=[],d=new Array(r.length),h=0;h0){var f=n.expandPolygon(d,-l);p=n.joinLines(f)}else p=d;for(var v,g,y,m,h=0;ha&&(a=1e-5),[t[0]+a*n[0],t[1]+a*n[1]]},n.generateUnitNgonPointsFitToSquare=function(e,t){var r=n.generateUnitNgonPoints(e,t);return r=n.fitPolygonToSquare(r)},n.fitPolygonToSquare=function(e){for(var t,r,n=e.length/2,i=1/0,a=1/0,o=-(1/0),s=-(1/0),l=0;n>l;l++)t=e[2*l],r=e[2*l+1],i=Math.min(i,t),o=Math.max(o,t),a=Math.min(a,r),s=Math.max(s,r);for(var u=2/(o-i),c=2/(s-a),l=0;n>l;l++)t=e[2*l]=e[2*l]*u,r=e[2*l+1]=e[2*l+1]*c,i=Math.min(i,t),o=Math.max(o,t),a=Math.min(a,r),s=Math.max(s,r);if(-1>a)for(var l=0;n>l;l++)r=e[2*l+1]=e[2*l+1]+(-1-a);return e},n.generateUnitNgonPoints=function(e,t){var r=1/e*2*Math.PI,n=e%2===0?Math.PI/2+r/2:Math.PI/2;n+=t;for(var i,a,o,s=new Array(2*e),l=0;e>l;l++)i=l*r+n,a=s[2*l]=Math.cos(i),o=s[2*l+1]=Math.sin(-i);return s},n.getRoundRectangleRadius=function(e,t){return Math.min(e/4,t/4,8)},t.exports=n},{}],86:[function(e,t,r){/*!
+Embeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable
+Copyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com)
+Licensed under The MIT License (http://opensource.org/licenses/MIT)
+*/
+"use strict";var n=0,i=1,a=2,o=function(e){return this instanceof o?(this.id="Thenable/1.0.7",this.state=n,this.fulfillValue=void 0,this.rejectReason=void 0,this.onFulfilled=[],this.onRejected=[],this.proxy={then:this.then.bind(this)},void("function"==typeof e&&e.call(this,this.fulfill.bind(this),this.reject.bind(this)))):new o(e)};o.prototype={fulfill:function(e){return s(this,i,"fulfillValue",e)},reject:function(e){return s(this,a,"rejectReason",e)},then:function(e,t){var r=this,n=new o;return r.onFulfilled.push(c(e,n,"fulfill")),r.onRejected.push(c(t,n,"reject")),l(r),n.proxy}};var s=function(e,t,r,i){return e.state===n&&(e.state=t,e[r]=i,l(e)),e},l=function(e){e.state===i?u(e,"onFulfilled",e.fulfillValue):e.state===a&&u(e,"onRejected",e.rejectReason)},u=function(e,t,r){if(0!==e[t].length){var n=e[t];e[t]=[];var i=function(){for(var e=0;e\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:'"(?:\\\\"|[^"])+"|'+"'(?:\\\\'|[^'])+'",number:i.regex.number,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$"};l.variable="(?:[\\w-]|(?:\\\\"+l.metaChar+"))+",l.value=l.string+"|"+l.number,l.className=l.variable,l.id=l.variable;for(var u=function(e){return e.replace(new RegExp("\\\\("+l.metaChar+")","g"),function(e,t,r,n){return t})},c=l.comparatorOp.split("|"),d=0;d=0||"="!==h&&(l.comparatorOp+="|\\!"+h)}var p=[{name:"group",query:!0,regex:"(node|edge|\\*)",populate:function(e){this.group="*"===e?e:e+"s"}},{name:"state",query:!0,regex:"(:selected|:unselected|:locked|:unlocked|:visible|:hidden|:transparent|:grabbed|:free|:removed|:inside|:grabbable|:ungrabbable|:animated|:unanimated|:selectable|:unselectable|:orphan|:nonorphan|:parent|:child|:loop|:simple|:active|:inactive|:touch|:backgrounding|:nonbackgrounding)",populate:function(e){this.colonSelectors.push(e)}},{name:"id",query:!0,regex:"\\#("+l.id+")",populate:function(e){this.ids.push(u(e))}},{name:"className",query:!0,regex:"\\.("+l.className+")",populate:function(e){this.classes.push(u(e))}},{name:"dataExists",query:!0,regex:"\\[\\s*("+l.variable+")\\s*\\]",populate:function(e){this.data.push({field:u(e)})}},{name:"dataCompare",query:!0,regex:"\\[\\s*("+l.variable+")\\s*("+l.comparatorOp+")\\s*("+l.value+")\\s*\\]",populate:function(e,t,r){var n=null!=new RegExp("^"+l.string+"$").exec(r);r=n?r.substring(1,r.length-1):parseFloat(r),this.data.push({field:u(e),operator:t,value:r})}},{name:"dataBool",query:!0,regex:"\\[\\s*("+l.boolOp+")\\s*("+l.variable+")\\s*\\]",populate:function(e,t){this.data.push({field:u(t),operator:e})}},{name:"metaCompare",query:!0,regex:"\\[\\[\\s*("+l.meta+")\\s*("+l.comparatorOp+")\\s*("+l.number+")\\s*\\]\\]",populate:function(e,t,r){this.meta.push({field:u(e),operator:t,value:parseFloat(r)})}},{name:"nextQuery",separator:!0,regex:l.separator,populate:function(){t[++d]=r(),s=null}},{name:"child",separator:!0,regex:l.child,populate:function(){var e=r();e.parent=this,e.subject=s,t[d]=e}},{name:"descendant",separator:!0,regex:l.descendant,populate:function(){var e=r();e.ancestor=this,e.subject=s,t[d]=e}},{name:"subject",modifier:!0,regex:l.subject,populate:function(){return null!=s&&this.subject!=this?(i.error("Redefinition of subject in selector `"+e+"`"),!1):(s=this,void(this.subject=this))}}];t._private.selectorText=e;var f=e,d=0,v=function(e){for(var t,r,i,a=0;a=0&&(d=d.toLowerCase(),h=h.toLowerCase(),s=s.replace("@",""),p=!0);var f=!1;s.indexOf("!")>=0&&(s=s.replace("!",""),f=!0),p&&(l=h.toLowerCase(),c=d.toLowerCase());var v=!1;switch(s){case"*=":a=d.indexOf(h)>=0;break;case"$=":a=d.indexOf(h,d.length-h.length)>=0;break;case"^=":a=0===d.indexOf(h);break;case"=":a=c===l;break;case">":v=!0,a=c>l;break;case">=":v=!0,a=c>=l;break;case"<":v=!0,a=l>c;break;case"<=":v=!0,a=l>=c;break;default:a=!1}!f||null==c&&v||(a=!a)}else if(null!=s)switch(s){case"?":a=t.fieldTruthy(u);break;case"!":a=!t.fieldTruthy(u);break;case"^":a=t.fieldUndefined(u)}else a=!t.fieldUndefined(u);if(!a){r=!1;break}}return r},v=f({name:"data",fieldValue:function(e){return r.data[e]},fieldUndefined:function(e){return void 0===r.data[e]},fieldTruthy:function(e){return!!r.data[e]}});if(!v)return!1;var g=f({name:"meta",fieldValue:function(e){return t[e]()},fieldUndefined:function(e){return null==t[e]()},fieldTruthy:function(e){return!!t[e]()}});if(!g)return!1;if(null!=e.collection){var y=e.collection.hasElementWithId(t.id());if(!y)return!1}if(null!=e.filter&&0===t.collection().filter(e.filter).size())return!1;var m=function(e,t){if(null!=e){var r=!1;if(!i.hasCompoundNodes())return!1;t=t();for(var n=0;n "+n),null!=e.ancestor&&(n=r(e.ancestor)+" "+n),null!=e.child&&(n+=" > "+r(e.child)),null!=e.descendant&&(n+=" "+r(e.descendant)),n},i=0;i1&&i0;if(h||p){var f;h&&p?f=u.properties:h?f=u.properties:p&&(f=u.mappedProperties);for(var v=0;v0){n=!0;break}}t.hasPie=n;var o=e.pstyle("text-transform").strValue,s=e.pstyle("label").strValue,l=e.pstyle("source-label").strValue,u=e.pstyle("target-label").strValue,c=e.pstyle("font-style").strValue,a=e.pstyle("font-size").pfValue+"px",d=e.pstyle("font-family").strValue,h=e.pstyle("font-weight").strValue,p=e.pstyle("text-valign").strValue,f=e.pstyle("text-valign").strValue,v=e.pstyle("text-outline-width").pfValue,g=e.pstyle("text-wrap").strValue,y=e.pstyle("text-max-width").pfValue,m=c+"$"+a+"$"+d+"$"+h+"$"+o+"$"+p+"$"+f+"$"+v+"$"+g+"$"+y;t.labelStyleKey=m,t.sourceLabelKey=m+"$"+l,t.targetLabelKey=m+"$"+u,t.labelKey=m+"$"+s,t.fontKey=c+"$"+h+"$"+a+"$"+d,t.styleKey=Date.now()}},a.applyParsedProperty=function(e,t){var r,a,o=this,s=t,l=e._private.style,u=o.types,c=o.properties[s.name].type,d=s.bypass,h=l[s.name],p=h&&h.bypass,f=e._private;if("curve-style"===t.name&&"haystack"===t.value&&e.isEdge()&&(e.isLoop()||e.source().isParent()||e.target().isParent())&&(s=t=this.parse(t.name,"bezier",d)),s["delete"])return l[s.name]=void 0,!0;if(s.deleteBypassed)return h?h.bypass?(h.bypassed=void 0,!0):!1:!0;if(s.deleteBypass)return h?h.bypass?(l[s.name]=h.bypassed,!0):!1:!0;var v=function(){n.error("Do not assign mappings to elements without corresponding data (e.g. ele `"+e.id()+"` for property `"+s.name+"` with data field `"+s.field+"`); try a `["+s.field+"]` selector to limit scope to elements with `"+s.field+"` defined")};switch(s.mapped){case u.mapData:case u.mapLayoutData:case u.mapScratch:var r,g=s.mapped===u.mapLayoutData,y=s.mapped===u.mapScratch,m=s.field.split(".");r=y||g?f.scratch:f.data;for(var b=0;bw?w=0:w>1&&(w=1),c.color){var E=s.valueMin[0],_=s.valueMax[0],P=s.valueMin[1],S=s.valueMax[1],k=s.valueMin[2],T=s.valueMax[2],D=null==s.valueMin[3]?1:s.valueMin[3],C=null==s.valueMax[3]?1:s.valueMax[3],M=[Math.round(E+(_-E)*w),Math.round(P+(S-P)*w),Math.round(k+(T-k)*w),Math.round(D+(C-D)*w)];a={bypass:s.bypass,name:s.name,value:M,strValue:"rgb("+M[0]+", "+M[1]+", "+M[2]+")"}}else{if(!c.number)return!1;var N=s.valueMin+(s.valueMax-s.valueMin)*w;a=this.parse(s.name,N,s.bypass,!0)}a||(a=this.parse(s.name,h.strValue,s.bypass,!0)),a||v(),a.mapping=s,s=a;break;case u.data:case u.layoutData:case u.scratch:var r,g=s.mapped===u.layoutData,y=s.mapped===u.scratch,m=s.field.split(".");if(r=y||g?f.scratch:f.data)for(var b=0;b0&&s>0){for(var u={},c=!1,d=0;d0&&e.delay(l),e.animate({css:u},{duration:s,easing:e.pstyle("transition-timing-function").value,queue:!1,complete:function(){r||n.removeBypasses(e,o),a.transitioning=!1}})}else a.transitioning&&(e.stop(),this.removeBypasses(e,o),a.transitioning=!1)},t.exports=a},{"../is":83,"../util":100}],89:[function(e,t,r){"use strict";var n=e("../is"),i=e("../util"),a={};a.applyBypass=function(e,t,r,a){var o=this,s=[],l=!0;if("*"===t||"**"===t){if(void 0!==r)for(var u=0;uh.max)return null;var B={name:e,value:t,strValue:""+t+(D?D:""),units:D,bypass:r};return h.unitless||"px"!==D&&"em"!==D?B.pfValue=t:B.pfValue="px"!==D&&D?this.getEmSizeInPixels()*t:t,"ms"!==D&&"s"!==D||(B.pfValue="ms"===D?t:1e3*t),"deg"!==D&&"rad"!==D||(B.pfValue="rad"===D?t:a.deg2rad(t)),B}if(h.propList){var z=[],I=""+t;if("none"===I);else{for(var L=I.split(","),O=0;O node").css({shape:"rectangle","padding-top":10,"padding-right":10,"padding-left":10,"padding-bottom":10,"background-color":"#eee","border-color":"#ccc","border-width":1}).selector("edge").css({width:3,"curve-style":"haystack"}).selector(":selected").css({"background-color":"#0169D9","line-color":"#0169D9","source-arrow-color":"#0169D9","target-arrow-color":"#0169D9","mid-source-arrow-color":"#0169D9","mid-target-arrow-color":"#0169D9"}).selector("node:parent:selected").css({"background-color":"#CCE1F9","border-color":"#aec8e5"}).selector(":active").css({"overlay-color":"black","overlay-padding":10,"overlay-opacity":.25}).selector("core").css({"selection-box-color":"#ddd","selection-box-opacity":.65,"selection-box-border-color":"#aaa","selection-box-border-width":1,"active-bg-color":"black","active-bg-opacity":.15,"active-bg-size":30,"outside-texture-bg-color":"#000","outside-texture-bg-opacity":.125}),this.defaultLength=this.length},t.exports=i},{"../util":100}],96:[function(e,t,r){"use strict";var n=e("../util"),i=e("../selector"),a={};a.applyFromString=function(e){function t(){c=c.length>a.length?c.substr(a.length):""}function r(){o=o.length>s.length?o.substr(s.length):""}var a,o,s,l=this,u=this,c=""+e;for(c=c.replace(/[\/][*](\s|.)+?[*][\/]/g,"");;){var d=c.match(/^\s*$/);if(d)break;var h=c.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!h){n.error("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+c);break}a=h[0];var p=h[1];if("core"!==p){var f=new i(p);if(f._private.invalid){n.error("Skipping parsing of block: Invalid selector found in string stylesheet: "+p),t();continue}}var v=h[2],g=!1;o=v;for(var y=[];;){var d=o.match(/^\s*$/);if(d)break;var m=o.match(/^\s*(.+?)\s*:\s*(.+?)\s*;/);if(!m){n.error("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+v),g=!0;break}s=m[0];var b=m[1],x=m[2],w=l.properties[b];if(w){var E=u.parse(b,x);E?(y.push({name:b,val:x}),r()):(n.error("Skipping property: Invalid property definition in: "+s),r())}else n.error("Skipping property: Invalid property name in: "+s),r()}if(g){t();break}u.selector(p);for(var _=0;_1?", "+JSON.stringify(r):"")+" );"," "," resolve = origResolve;"," resolve( res.length > 0 ? res : ret );","}"].join("\n"))}};util.extend(thdfn,{reduce:defineFnal({name:"reduce"}),reduceRight:defineFnal({name:"reduceRight"}),map:defineFnal({name:"map"})});var fn=thdfn;fn.promise=fn.run,fn.terminate=fn.halt=fn.stop,fn.include=fn.require,util.extend(thdfn,{on:define.on(),one:define.on({unbindSelfOnTrigger:!0}),off:define.off(),trigger:define.trigger()}),define.eventAliasesOn(thdfn),module.exports=Thread},{"./define":44,"./event":45,"./is":83,"./promise":86,"./util":100,"./window":107,child_process:void 0,path:void 0}],99:[function(e,t,r){"use strict";var n=e("../is");t.exports={hex2tuple:function(e){if((4===e.length||7===e.length)&&"#"===e[0]){var t,r,n,i=4===e.length,a=16;return i?(t=parseInt(e[1]+e[1],a),r=parseInt(e[2]+e[2],a),n=parseInt(e[3]+e[3],a)):(t=parseInt(e[1]+e[2],a),r=parseInt(e[3]+e[4],a),n=parseInt(e[5]+e[6],a)),[t,r,n]}},hsl2tuple:function(e){function t(e,t,r){return 0>r&&(r+=1),r>1&&(r-=1),1/6>r?e+6*(t-e)*r:.5>r?t:2/3>r?e+(t-e)*(2/3-r)*6:e}var r,n,i,a,o,s,l,u,c=new RegExp("^"+this.regex.hsla+"$").exec(e);if(c){if(n=parseInt(c[1]),0>n?n=(360- -1*n%360)%360:n>360&&(n%=360),n/=360,i=parseFloat(c[2]),0>i||i>100)return;if(i/=100,a=parseFloat(c[3]),0>a||a>100)return;if(a/=100,o=c[4],void 0!==o&&(o=parseFloat(o),0>o||o>1))return;if(0===i)s=l=u=Math.round(255*a);else{var d=.5>a?a*(1+i):a+i-a*i,h=2*a-d;s=Math.round(255*t(h,d,n+1/3)),l=Math.round(255*t(h,d,n)),u=Math.round(255*t(h,d,n-1/3))}r=[s,l,u,o]}return r},rgb2tuple:function(e){var t,r=new RegExp("^"+this.regex.rgba+"$").exec(e);if(r){t=[];for(var n=[],i=1;3>=i;i++){var a=r[i];if("%"===a[a.length-1]&&(n[i]=!0),a=parseFloat(a),n[i]&&(a=a/100*255),0>a||a>255)return;t.push(Math.floor(a))}var o=n[1]||n[2]||n[3],s=n[1]&&n[2]&&n[3];if(o&&!s)return;var l=r[4];if(void 0!==l){if(l=parseFloat(l),0>l||l>1)return;t.push(l)}}return t},colorname2tuple:function(e){return this.colors[e.toLowerCase()]},color2tuple:function(e){return(n.array(e)?e:null)||this.colorname2tuple(e)||this.hex2tuple(e)||this.rgb2tuple(e)||this.hsl2tuple(e)},colors:{transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}}},{"../is":83}],100:[function(e,t,r){"use strict";var n=e("../is"),i=e("../math"),a={trueify:function(){return!0},falsify:function(){return!1},zeroify:function(){return 0},noop:function(){},error:function(e){console.error?(console.error.apply(console,arguments),console.trace&&console.trace()):(console.log.apply(console,arguments),console.trace&&console.trace())},clone:function(e){return this.extend({},e)},copy:function(e){return null==e?e:n.array(e)?e.slice():n.plainObject(e)?this.clone(e):e},uuid:function(e,t){for(t=e="";e++<36;t+=51*e&52?(15^e?8^Math.random()*(20^e?16:4):4).toString(16):"-");return t}};a.makeBoundingBox=i.makeBoundingBox.bind(i),a._staticEmptyObject={},a.staticEmptyObject=function(){return a._staticEmptyObject},a.extend=null!=Object.assign?Object.assign:function(e){for(var t=arguments,r=1;r=0&&(e[n]!==t||(e.splice(n,1),r));n--);},a.clearArray=function(e){e.splice(0,e.length)},a.getPrefixedProperty=function(e,t,r){return r&&(t=this.prependCamel(r,t)),e[t]},a.setPrefixedProperty=function(e,t,r,n){r&&(t=this.prependCamel(r,t)),e[t]=n},[e("./colors"),e("./maps"),{memoize:e("./memoize")},e("./regex"),e("./strings"),e("./timing")].forEach(function(e){a.extend(a,e)}),t.exports=a},{"../is":83,"../math":85,"./colors":99,"./maps":101,"./memoize":102,"./regex":103,"./strings":104,"./timing":105}],101:[function(e,t,r){"use strict";var n=e("../is");t.exports={mapEmpty:function(e){var t=!0;return null!=e?0===Object.keys(e).length:t},pushMap:function(e){var t=this.getMap(e);null==t?this.setMap(this.extend({},e,{value:[e.value]})):t.push(e.value)},setMap:function(e){for(var t,r=e.map,i=e.keys,a=i.length,o=0;a>o;o++){var t=i[o];n.plainObject(t)&&this.error("Tried to set map with object key"),oa;a++){var o=r[a];if(n.plainObject(o)&&this.error("Tried to get map with object key"),t=t[o],null==t)return t}return t},deleteMap:function(e){for(var t=e.map,r=e.keys,i=r.length,a=e.keepChildren,o=0;i>o;o++){var s=r[o];n.plainObject(s)&&this.error("Tried to delete map with object key");var l=o===e.keys.length-1;if(l)if(a)for(var u=Object.keys(t),c=0;c=r){a&&clearTimeout(a);var i=c;a=u=c=void 0,i&&(h=d.now(),o=e.apply(l,n),u||a||(n=l=null))}else u=setTimeout(g,r)},y=function(){u&&clearTimeout(u),a=u=c=void 0,(f||p!==t)&&(h=d.now(),o=e.apply(l,n),u||a||(n=l=null))};return function(){if(n=arguments,s=d.now(),l=this,c=f&&(u||!v),p===!1)var r=v&&!u;else{a||v||(h=s);var i=p-(s-h),m=0>=i;m?(a&&(a=clearTimeout(a)),h=s,o=e.apply(l,n)):a||(a=setTimeout(y,i))}return m&&u?u=clearTimeout(u):u||t===p||(u=setTimeout(g,t)),r&&(m=!0,o=e.apply(l,n)),!m||u||a||(n=l=null),o}}},t.exports=o},{"../is":83,"../window":107}],106:[function(e,t,r){t.exports="2.7.8"},{}],107:[function(e,t,r){t.exports="undefined"==typeof window?null:window},{}]},{},[82])(82)});
\ No newline at end of file
diff --git a/styles/bootstrap/datepicker/css/datepicker.css b/styles/bootstrap/datepicker/css/datepicker.css
index 410e13e93..4e1a785e8 100644
--- a/styles/bootstrap/datepicker/css/datepicker.css
+++ b/styles/bootstrap/datepicker/css/datepicker.css
@@ -8,7 +8,7 @@
*
*/
.datepicker {
- padding: 4px;
+ _padding: 4px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
diff --git a/styles/bootstrap/validate/additional-methods.js b/styles/bootstrap/validate/additional-methods.js
new file mode 100644
index 000000000..7342e9753
--- /dev/null
+++ b/styles/bootstrap/validate/additional-methods.js
@@ -0,0 +1,1069 @@
+/*!
+ * jQuery Validation Plugin v1.15.1
+ *
+ * http://jqueryvalidation.org/
+ *
+ * Copyright (c) 2016 Jörn Zaefferer
+ * Released under the MIT license
+ */
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "./jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+( function() {
+
+ function stripHtml( value ) {
+
+ // Remove html tags and space chars
+ return value.replace( /<.[^<>]*?>/g, " " ).replace( / | /gi, " " )
+
+ // Remove punctuation
+ .replace( /[.(),;:!?%#$'\"_+=\/\-“”’]*/g, "" );
+ }
+
+ $.validator.addMethod( "maxWords", function( value, element, params ) {
+ return this.optional( element ) || stripHtml( value ).match( /\b\w+\b/g ).length <= params;
+ }, $.validator.format( "Please enter {0} words or less." ) );
+
+ $.validator.addMethod( "minWords", function( value, element, params ) {
+ return this.optional( element ) || stripHtml( value ).match( /\b\w+\b/g ).length >= params;
+ }, $.validator.format( "Please enter at least {0} words." ) );
+
+ $.validator.addMethod( "rangeWords", function( value, element, params ) {
+ var valueStripped = stripHtml( value ),
+ regex = /\b\w+\b/g;
+ return this.optional( element ) || valueStripped.match( regex ).length >= params[ 0 ] && valueStripped.match( regex ).length <= params[ 1 ];
+ }, $.validator.format( "Please enter between {0} and {1} words." ) );
+
+}() );
+
+// Accept a value from a file input based on a required mimetype
+$.validator.addMethod( "accept", function( value, element, param ) {
+
+ // Split mime on commas in case we have multiple types we can accept
+ var typeParam = typeof param === "string" ? param.replace( /\s/g, "" ) : "image/*",
+ optionalValue = this.optional( element ),
+ i, file, regex;
+
+ // Element is optional
+ if ( optionalValue ) {
+ return optionalValue;
+ }
+
+ if ( $( element ).attr( "type" ) === "file" ) {
+
+ // Escape string to be used in the regex
+ // see: http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
+ // Escape also "/*" as "/.*" as a wildcard
+ typeParam = typeParam
+ .replace( /[\-\[\]\/\{\}\(\)\+\?\.\\\^\$\|]/g, "\\$&" )
+ .replace( /,/g, "|" )
+ .replace( /\/\*/g, "/.*" );
+
+ // Check if the element has a FileList before checking each file
+ if ( element.files && element.files.length ) {
+ regex = new RegExp( ".?(" + typeParam + ")$", "i" );
+ for ( i = 0; i < element.files.length; i++ ) {
+ file = element.files[ i ];
+
+ // Grab the mimetype from the loaded file, verify it matches
+ if ( !file.type.match( regex ) ) {
+ return false;
+ }
+ }
+ }
+ }
+
+ // Either return true because we've validated each file, or because the
+ // browser does not support element.files and the FileList feature
+ return true;
+}, $.validator.format( "Please enter a value with a valid mimetype." ) );
+
+$.validator.addMethod( "alphanumeric", function( value, element ) {
+ return this.optional( element ) || /^\w+$/i.test( value );
+}, "Letters, numbers, and underscores only please" );
+
+/*
+ * Dutch bank account numbers (not 'giro' numbers) have 9 digits
+ * and pass the '11 check'.
+ * We accept the notation with spaces, as that is common.
+ * acceptable: 123456789 or 12 34 56 789
+ */
+$.validator.addMethod( "bankaccountNL", function( value, element ) {
+ if ( this.optional( element ) ) {
+ return true;
+ }
+ if ( !( /^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test( value ) ) ) {
+ return false;
+ }
+
+ // Now '11 check'
+ var account = value.replace( / /g, "" ), // Remove spaces
+ sum = 0,
+ len = account.length,
+ pos, factor, digit;
+ for ( pos = 0; pos < len; pos++ ) {
+ factor = len - pos;
+ digit = account.substring( pos, pos + 1 );
+ sum = sum + factor * digit;
+ }
+ return sum % 11 === 0;
+}, "Please specify a valid bank account number" );
+
+$.validator.addMethod( "bankorgiroaccountNL", function( value, element ) {
+ return this.optional( element ) ||
+ ( $.validator.methods.bankaccountNL.call( this, value, element ) ) ||
+ ( $.validator.methods.giroaccountNL.call( this, value, element ) );
+}, "Please specify a valid bank or giro account number" );
+
+/**
+ * BIC is the business identifier code (ISO 9362). This BIC check is not a guarantee for authenticity.
+ *
+ * BIC pattern: BBBBCCLLbbb (8 or 11 characters long; bbb is optional)
+ *
+ * Validation is case-insensitive. Please make sure to normalize input yourself.
+ *
+ * BIC definition in detail:
+ * - First 4 characters - bank code (only letters)
+ * - Next 2 characters - ISO 3166-1 alpha-2 country code (only letters)
+ * - Next 2 characters - location code (letters and digits)
+ * a. shall not start with '0' or '1'
+ * b. second character must be a letter ('O' is not allowed) or digit ('0' for test (therefore not allowed), '1' denoting passive participant, '2' typically reverse-billing)
+ * - Last 3 characters - branch code, optional (shall not start with 'X' except in case of 'XXX' for primary office) (letters and digits)
+ */
+$.validator.addMethod( "bic", function( value, element ) {
+ return this.optional( element ) || /^([A-Z]{6}[A-Z2-9][A-NP-Z1-9])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test( value.toUpperCase() );
+}, "Please specify a valid BIC code" );
+
+/*
+ * Código de identificación fiscal ( CIF ) is the tax identification code for Spanish legal entities
+ * Further rules can be found in Spanish on http://es.wikipedia.org/wiki/C%C3%B3digo_de_identificaci%C3%B3n_fiscal
+ */
+$.validator.addMethod( "cifES", function( value ) {
+ "use strict";
+
+ var num = [],
+ controlDigit, sum, i, count, tmp, secondDigit;
+
+ value = value.toUpperCase();
+
+ // Quick format test
+ if ( !value.match( "((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)" ) ) {
+ return false;
+ }
+
+ for ( i = 0; i < 9; i++ ) {
+ num[ i ] = parseInt( value.charAt( i ), 10 );
+ }
+
+ // Algorithm for checking CIF codes
+ sum = num[ 2 ] + num[ 4 ] + num[ 6 ];
+ for ( count = 1; count < 8; count += 2 ) {
+ tmp = ( 2 * num[ count ] ).toString();
+ secondDigit = tmp.charAt( 1 );
+
+ sum += parseInt( tmp.charAt( 0 ), 10 ) + ( secondDigit === "" ? 0 : parseInt( secondDigit, 10 ) );
+ }
+
+ /* The first (position 1) is a letter following the following criteria:
+ * A. Corporations
+ * B. LLCs
+ * C. General partnerships
+ * D. Companies limited partnerships
+ * E. Communities of goods
+ * F. Cooperative Societies
+ * G. Associations
+ * H. Communities of homeowners in horizontal property regime
+ * J. Civil Societies
+ * K. Old format
+ * L. Old format
+ * M. Old format
+ * N. Nonresident entities
+ * P. Local authorities
+ * Q. Autonomous bodies, state or not, and the like, and congregations and religious institutions
+ * R. Congregations and religious institutions (since 2008 ORDER EHA/451/2008)
+ * S. Organs of State Administration and regions
+ * V. Agrarian Transformation
+ * W. Permanent establishments of non-resident in Spain
+ */
+ if ( /^[ABCDEFGHJNPQRSUVW]{1}/.test( value ) ) {
+ sum += "";
+ controlDigit = 10 - parseInt( sum.charAt( sum.length - 1 ), 10 );
+ value += controlDigit;
+ return ( num[ 8 ].toString() === String.fromCharCode( 64 + controlDigit ) || num[ 8 ].toString() === value.charAt( value.length - 1 ) );
+ }
+
+ return false;
+
+}, "Please specify a valid CIF number." );
+
+/*
+ * Brazillian CPF number (Cadastrado de Pessoas Físicas) is the equivalent of a Brazilian tax registration number.
+ * CPF numbers have 11 digits in total: 9 numbers followed by 2 check numbers that are being used for validation.
+ */
+$.validator.addMethod( "cpfBR", function( value ) {
+
+ // Removing special characters from value
+ value = value.replace( /([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g, "" );
+
+ // Checking value to have 11 digits only
+ if ( value.length !== 11 ) {
+ return false;
+ }
+
+ var sum = 0,
+ firstCN, secondCN, checkResult, i;
+
+ firstCN = parseInt( value.substring( 9, 10 ), 10 );
+ secondCN = parseInt( value.substring( 10, 11 ), 10 );
+
+ checkResult = function( sum, cn ) {
+ var result = ( sum * 10 ) % 11;
+ if ( ( result === 10 ) || ( result === 11 ) ) {
+ result = 0;
+ }
+ return ( result === cn );
+ };
+
+ // Checking for dump data
+ if ( value === "" ||
+ value === "00000000000" ||
+ value === "11111111111" ||
+ value === "22222222222" ||
+ value === "33333333333" ||
+ value === "44444444444" ||
+ value === "55555555555" ||
+ value === "66666666666" ||
+ value === "77777777777" ||
+ value === "88888888888" ||
+ value === "99999999999"
+ ) {
+ return false;
+ }
+
+ // Step 1 - using first Check Number:
+ for ( i = 1; i <= 9; i++ ) {
+ sum = sum + parseInt( value.substring( i - 1, i ), 10 ) * ( 11 - i );
+ }
+
+ // If first Check Number (CN) is valid, move to Step 2 - using second Check Number:
+ if ( checkResult( sum, firstCN ) ) {
+ sum = 0;
+ for ( i = 1; i <= 10; i++ ) {
+ sum = sum + parseInt( value.substring( i - 1, i ), 10 ) * ( 12 - i );
+ }
+ return checkResult( sum, secondCN );
+ }
+ return false;
+
+}, "Please specify a valid CPF number" );
+
+// http://jqueryvalidation.org/creditcard-method/
+// based on http://en.wikipedia.org/wiki/Luhn_algorithm
+$.validator.addMethod( "creditcard", function( value, element ) {
+ if ( this.optional( element ) ) {
+ return "dependency-mismatch";
+ }
+
+ // Accept only spaces, digits and dashes
+ if ( /[^0-9 \-]+/.test( value ) ) {
+ return false;
+ }
+
+ var nCheck = 0,
+ nDigit = 0,
+ bEven = false,
+ n, cDigit;
+
+ value = value.replace( /\D/g, "" );
+
+ // Basing min and max length on
+ // http://developer.ean.com/general_info/Valid_Credit_Card_Types
+ if ( value.length < 13 || value.length > 19 ) {
+ return false;
+ }
+
+ for ( n = value.length - 1; n >= 0; n-- ) {
+ cDigit = value.charAt( n );
+ nDigit = parseInt( cDigit, 10 );
+ if ( bEven ) {
+ if ( ( nDigit *= 2 ) > 9 ) {
+ nDigit -= 9;
+ }
+ }
+
+ nCheck += nDigit;
+ bEven = !bEven;
+ }
+
+ return ( nCheck % 10 ) === 0;
+}, "Please enter a valid credit card number." );
+
+/* NOTICE: Modified version of Castle.Components.Validator.CreditCardValidator
+ * Redistributed under the the Apache License 2.0 at http://www.apache.org/licenses/LICENSE-2.0
+ * Valid Types: mastercard, visa, amex, dinersclub, enroute, discover, jcb, unknown, all (overrides all other settings)
+ */
+$.validator.addMethod( "creditcardtypes", function( value, element, param ) {
+ if ( /[^0-9\-]+/.test( value ) ) {
+ return false;
+ }
+
+ value = value.replace( /\D/g, "" );
+
+ var validTypes = 0x0000;
+
+ if ( param.mastercard ) {
+ validTypes |= 0x0001;
+ }
+ if ( param.visa ) {
+ validTypes |= 0x0002;
+ }
+ if ( param.amex ) {
+ validTypes |= 0x0004;
+ }
+ if ( param.dinersclub ) {
+ validTypes |= 0x0008;
+ }
+ if ( param.enroute ) {
+ validTypes |= 0x0010;
+ }
+ if ( param.discover ) {
+ validTypes |= 0x0020;
+ }
+ if ( param.jcb ) {
+ validTypes |= 0x0040;
+ }
+ if ( param.unknown ) {
+ validTypes |= 0x0080;
+ }
+ if ( param.all ) {
+ validTypes = 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080;
+ }
+ if ( validTypes & 0x0001 && /^(5[12345])/.test( value ) ) { // Mastercard
+ return value.length === 16;
+ }
+ if ( validTypes & 0x0002 && /^(4)/.test( value ) ) { // Visa
+ return value.length === 16;
+ }
+ if ( validTypes & 0x0004 && /^(3[47])/.test( value ) ) { // Amex
+ return value.length === 15;
+ }
+ if ( validTypes & 0x0008 && /^(3(0[012345]|[68]))/.test( value ) ) { // Dinersclub
+ return value.length === 14;
+ }
+ if ( validTypes & 0x0010 && /^(2(014|149))/.test( value ) ) { // Enroute
+ return value.length === 15;
+ }
+ if ( validTypes & 0x0020 && /^(6011)/.test( value ) ) { // Discover
+ return value.length === 16;
+ }
+ if ( validTypes & 0x0040 && /^(3)/.test( value ) ) { // Jcb
+ return value.length === 16;
+ }
+ if ( validTypes & 0x0040 && /^(2131|1800)/.test( value ) ) { // Jcb
+ return value.length === 15;
+ }
+ if ( validTypes & 0x0080 ) { // Unknown
+ return true;
+ }
+ return false;
+}, "Please enter a valid credit card number." );
+
+/**
+ * Validates currencies with any given symbols by @jameslouiz
+ * Symbols can be optional or required. Symbols required by default
+ *
+ * Usage examples:
+ * currency: ["£", false] - Use false for soft currency validation
+ * currency: ["$", false]
+ * currency: ["RM", false] - also works with text based symbols such as "RM" - Malaysia Ringgit etc
+ *
+ *
+ *
+ * Soft symbol checking
+ * currencyInput: {
+ * currency: ["$", false]
+ * }
+ *
+ * Strict symbol checking (default)
+ * currencyInput: {
+ * currency: "$"
+ * //OR
+ * currency: ["$", true]
+ * }
+ *
+ * Multiple Symbols
+ * currencyInput: {
+ * currency: "$,£,¢"
+ * }
+ */
+$.validator.addMethod( "currency", function( value, element, param ) {
+ var isParamString = typeof param === "string",
+ symbol = isParamString ? param : param[ 0 ],
+ soft = isParamString ? true : param[ 1 ],
+ regex;
+
+ symbol = symbol.replace( /,/g, "" );
+ symbol = soft ? symbol + "]" : symbol + "]?";
+ regex = "^[" + symbol + "([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$";
+ regex = new RegExp( regex );
+ return this.optional( element ) || regex.test( value );
+
+}, "Please specify a valid currency" );
+
+$.validator.addMethod( "dateFA", function( value, element ) {
+ return this.optional( element ) || /^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test( value );
+}, $.validator.messages.date );
+
+/**
+ * Return true, if the value is a valid date, also making this formal check dd/mm/yyyy.
+ *
+ * @example $.validator.methods.date("01/01/1900")
+ * @result true
+ *
+ * @example $.validator.methods.date("01/13/1990")
+ * @result false
+ *
+ * @example $.validator.methods.date("01.01.1900")
+ * @result false
+ *
+ * @example
+ * @desc Declares an optional input element whose value must be a valid date.
+ *
+ * @name $.validator.methods.dateITA
+ * @type Boolean
+ * @cat Plugins/Validate/Methods
+ */
+$.validator.addMethod( "dateITA", function( value, element ) {
+ var check = false,
+ re = /^\d{1,2}\/\d{1,2}\/\d{4}$/,
+ adata, gg, mm, aaaa, xdata;
+ if ( re.test( value ) ) {
+ adata = value.split( "/" );
+ gg = parseInt( adata[ 0 ], 10 );
+ mm = parseInt( adata[ 1 ], 10 );
+ aaaa = parseInt( adata[ 2 ], 10 );
+ xdata = new Date( Date.UTC( aaaa, mm - 1, gg, 12, 0, 0, 0 ) );
+ if ( ( xdata.getUTCFullYear() === aaaa ) && ( xdata.getUTCMonth() === mm - 1 ) && ( xdata.getUTCDate() === gg ) ) {
+ check = true;
+ } else {
+ check = false;
+ }
+ } else {
+ check = false;
+ }
+ return this.optional( element ) || check;
+}, $.validator.messages.date );
+
+$.validator.addMethod( "dateNL", function( value, element ) {
+ return this.optional( element ) || /^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test( value );
+}, $.validator.messages.date );
+
+// Older "accept" file extension method. Old docs: http://docs.jquery.com/Plugins/Validation/Methods/accept
+$.validator.addMethod( "extension", function( value, element, param ) {
+ param = typeof param === "string" ? param.replace( /,/g, "|" ) : "png|jpe?g|gif";
+ return this.optional( element ) || value.match( new RegExp( "\\.(" + param + ")$", "i" ) );
+}, $.validator.format( "Please enter a value with a valid extension." ) );
+
+/**
+ * Dutch giro account numbers (not bank numbers) have max 7 digits
+ */
+$.validator.addMethod( "giroaccountNL", function( value, element ) {
+ return this.optional( element ) || /^[0-9]{1,7}$/.test( value );
+}, "Please specify a valid giro account number" );
+
+/**
+ * IBAN is the international bank account number.
+ * It has a country - specific format, that is checked here too
+ *
+ * Validation is case-insensitive. Please make sure to normalize input yourself.
+ */
+$.validator.addMethod( "iban", function( value, element ) {
+
+ // Some quick simple tests to prevent needless work
+ if ( this.optional( element ) ) {
+ return true;
+ }
+
+ // Remove spaces and to upper case
+ var iban = value.replace( / /g, "" ).toUpperCase(),
+ ibancheckdigits = "",
+ leadingZeroes = true,
+ cRest = "",
+ cOperator = "",
+ countrycode, ibancheck, charAt, cChar, bbanpattern, bbancountrypatterns, ibanregexp, i, p;
+
+ // Check for IBAN code length.
+ // It contains:
+ // country code ISO 3166-1 - two letters,
+ // two check digits,
+ // Basic Bank Account Number (BBAN) - up to 30 chars
+ var minimalIBANlength = 5;
+ if ( iban.length < minimalIBANlength ) {
+ return false;
+ }
+
+ // Check the country code and find the country specific format
+ countrycode = iban.substring( 0, 2 );
+ bbancountrypatterns = {
+ "AL": "\\d{8}[\\dA-Z]{16}",
+ "AD": "\\d{8}[\\dA-Z]{12}",
+ "AT": "\\d{16}",
+ "AZ": "[\\dA-Z]{4}\\d{20}",
+ "BE": "\\d{12}",
+ "BH": "[A-Z]{4}[\\dA-Z]{14}",
+ "BA": "\\d{16}",
+ "BR": "\\d{23}[A-Z][\\dA-Z]",
+ "BG": "[A-Z]{4}\\d{6}[\\dA-Z]{8}",
+ "CR": "\\d{17}",
+ "HR": "\\d{17}",
+ "CY": "\\d{8}[\\dA-Z]{16}",
+ "CZ": "\\d{20}",
+ "DK": "\\d{14}",
+ "DO": "[A-Z]{4}\\d{20}",
+ "EE": "\\d{16}",
+ "FO": "\\d{14}",
+ "FI": "\\d{14}",
+ "FR": "\\d{10}[\\dA-Z]{11}\\d{2}",
+ "GE": "[\\dA-Z]{2}\\d{16}",
+ "DE": "\\d{18}",
+ "GI": "[A-Z]{4}[\\dA-Z]{15}",
+ "GR": "\\d{7}[\\dA-Z]{16}",
+ "GL": "\\d{14}",
+ "GT": "[\\dA-Z]{4}[\\dA-Z]{20}",
+ "HU": "\\d{24}",
+ "IS": "\\d{22}",
+ "IE": "[\\dA-Z]{4}\\d{14}",
+ "IL": "\\d{19}",
+ "IT": "[A-Z]\\d{10}[\\dA-Z]{12}",
+ "KZ": "\\d{3}[\\dA-Z]{13}",
+ "KW": "[A-Z]{4}[\\dA-Z]{22}",
+ "LV": "[A-Z]{4}[\\dA-Z]{13}",
+ "LB": "\\d{4}[\\dA-Z]{20}",
+ "LI": "\\d{5}[\\dA-Z]{12}",
+ "LT": "\\d{16}",
+ "LU": "\\d{3}[\\dA-Z]{13}",
+ "MK": "\\d{3}[\\dA-Z]{10}\\d{2}",
+ "MT": "[A-Z]{4}\\d{5}[\\dA-Z]{18}",
+ "MR": "\\d{23}",
+ "MU": "[A-Z]{4}\\d{19}[A-Z]{3}",
+ "MC": "\\d{10}[\\dA-Z]{11}\\d{2}",
+ "MD": "[\\dA-Z]{2}\\d{18}",
+ "ME": "\\d{18}",
+ "NL": "[A-Z]{4}\\d{10}",
+ "NO": "\\d{11}",
+ "PK": "[\\dA-Z]{4}\\d{16}",
+ "PS": "[\\dA-Z]{4}\\d{21}",
+ "PL": "\\d{24}",
+ "PT": "\\d{21}",
+ "RO": "[A-Z]{4}[\\dA-Z]{16}",
+ "SM": "[A-Z]\\d{10}[\\dA-Z]{12}",
+ "SA": "\\d{2}[\\dA-Z]{18}",
+ "RS": "\\d{18}",
+ "SK": "\\d{20}",
+ "SI": "\\d{15}",
+ "ES": "\\d{20}",
+ "SE": "\\d{20}",
+ "CH": "\\d{5}[\\dA-Z]{12}",
+ "TN": "\\d{20}",
+ "TR": "\\d{5}[\\dA-Z]{17}",
+ "AE": "\\d{3}\\d{16}",
+ "GB": "[A-Z]{4}\\d{14}",
+ "VG": "[\\dA-Z]{4}\\d{16}"
+ };
+
+ bbanpattern = bbancountrypatterns[ countrycode ];
+
+ // As new countries will start using IBAN in the
+ // future, we only check if the countrycode is known.
+ // This prevents false negatives, while almost all
+ // false positives introduced by this, will be caught
+ // by the checksum validation below anyway.
+ // Strict checking should return FALSE for unknown
+ // countries.
+ if ( typeof bbanpattern !== "undefined" ) {
+ ibanregexp = new RegExp( "^[A-Z]{2}\\d{2}" + bbanpattern + "$", "" );
+ if ( !( ibanregexp.test( iban ) ) ) {
+ return false; // Invalid country specific format
+ }
+ }
+
+ // Now check the checksum, first convert to digits
+ ibancheck = iban.substring( 4, iban.length ) + iban.substring( 0, 4 );
+ for ( i = 0; i < ibancheck.length; i++ ) {
+ charAt = ibancheck.charAt( i );
+ if ( charAt !== "0" ) {
+ leadingZeroes = false;
+ }
+ if ( !leadingZeroes ) {
+ ibancheckdigits += "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf( charAt );
+ }
+ }
+
+ // Calculate the result of: ibancheckdigits % 97
+ for ( p = 0; p < ibancheckdigits.length; p++ ) {
+ cChar = ibancheckdigits.charAt( p );
+ cOperator = "" + cRest + "" + cChar;
+ cRest = cOperator % 97;
+ }
+ return cRest === 1;
+}, "Please specify a valid IBAN" );
+
+$.validator.addMethod( "integer", function( value, element ) {
+ return this.optional( element ) || /^-?\d+$/.test( value );
+}, "A positive or negative non-decimal number please" );
+
+$.validator.addMethod( "ipv4", function( value, element ) {
+ return this.optional( element ) || /^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test( value );
+}, "Please enter a valid IP v4 address." );
+
+$.validator.addMethod( "ipv6", function( value, element ) {
+ return this.optional( element ) || /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test( value );
+}, "Please enter a valid IP v6 address." );
+
+$.validator.addMethod( "lettersonly", function( value, element ) {
+ return this.optional( element ) || /^[a-z]+$/i.test( value );
+}, "Letters only please" );
+
+$.validator.addMethod( "letterswithbasicpunc", function( value, element ) {
+ return this.optional( element ) || /^[a-z\-.,()'"\s]+$/i.test( value );
+}, "Letters or punctuation only please" );
+
+$.validator.addMethod( "mobileNL", function( value, element ) {
+ return this.optional( element ) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test( value );
+}, "Please specify a valid mobile number" );
+
+/* For UK phone functions, do the following server side processing:
+ * Compare original input with this RegEx pattern:
+ * ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$
+ * Extract $1 and set $prefix to '+44' if $1 is '44', otherwise set $prefix to '0'
+ * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.
+ * A number of very detailed GB telephone number RegEx patterns can also be found at:
+ * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
+ */
+$.validator.addMethod( "mobileUK", function( phone_number, element ) {
+ phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" );
+ return this.optional( element ) || phone_number.length > 9 &&
+ phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/ );
+}, "Please specify a valid mobile number" );
+
+/*
+ * The número de identidad de extranjero ( NIE )is a code used to identify the non-nationals in Spain
+ */
+$.validator.addMethod( "nieES", function( value ) {
+ "use strict";
+
+ value = value.toUpperCase();
+
+ // Basic format test
+ if ( !value.match( "((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)" ) ) {
+ return false;
+ }
+
+ // Test NIE
+ //T
+ if ( /^[T]{1}/.test( value ) ) {
+ return ( value[ 8 ] === /^[T]{1}[A-Z0-9]{8}$/.test( value ) );
+ }
+
+ //XYZ
+ if ( /^[XYZ]{1}/.test( value ) ) {
+ return (
+ value[ 8 ] === "TRWAGMYFPDXBNJZSQVHLCKE".charAt(
+ value.replace( "X", "0" )
+ .replace( "Y", "1" )
+ .replace( "Z", "2" )
+ .substring( 0, 8 ) % 23
+ )
+ );
+ }
+
+ return false;
+
+}, "Please specify a valid NIE number." );
+
+/*
+ * The Número de Identificación Fiscal ( NIF ) is the way tax identification used in Spain for individuals
+ */
+$.validator.addMethod( "nifES", function( value ) {
+ "use strict";
+
+ value = value.toUpperCase();
+
+ // Basic format test
+ if ( !value.match( "((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)" ) ) {
+ return false;
+ }
+
+ // Test NIF
+ if ( /^[0-9]{8}[A-Z]{1}$/.test( value ) ) {
+ return ( "TRWAGMYFPDXBNJZSQVHLCKE".charAt( value.substring( 8, 0 ) % 23 ) === value.charAt( 8 ) );
+ }
+
+ // Test specials NIF (starts with K, L or M)
+ if ( /^[KLM]{1}/.test( value ) ) {
+ return ( value[ 8 ] === String.fromCharCode( 64 ) );
+ }
+
+ return false;
+
+}, "Please specify a valid NIF number." );
+
+$.validator.addMethod( "notEqualTo", function( value, element, param ) {
+ return this.optional( element ) || !$.validator.methods.equalTo.call( this, value, element, param );
+}, "Please enter a different value, values must not be the same." );
+
+$.validator.addMethod( "nowhitespace", function( value, element ) {
+ return this.optional( element ) || /^\S+$/i.test( value );
+}, "No white space please" );
+
+/**
+* Return true if the field value matches the given format RegExp
+*
+* @example $.validator.methods.pattern("AR1004",element,/^AR\d{4}$/)
+* @result true
+*
+* @example $.validator.methods.pattern("BR1004",element,/^AR\d{4}$/)
+* @result false
+*
+* @name $.validator.methods.pattern
+* @type Boolean
+* @cat Plugins/Validate/Methods
+*/
+$.validator.addMethod( "pattern", function( value, element, param ) {
+ if ( this.optional( element ) ) {
+ return true;
+ }
+ if ( typeof param === "string" ) {
+ param = new RegExp( "^(?:" + param + ")$" );
+ }
+ return param.test( value );
+}, "Invalid format." );
+
+/**
+ * Dutch phone numbers have 10 digits (or 11 and start with +31).
+ */
+$.validator.addMethod( "phoneNL", function( value, element ) {
+ return this.optional( element ) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test( value );
+}, "Please specify a valid phone number." );
+
+/* For UK phone functions, do the following server side processing:
+ * Compare original input with this RegEx pattern:
+ * ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$
+ * Extract $1 and set $prefix to '+44' if $1 is '44', otherwise set $prefix to '0'
+ * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.
+ * A number of very detailed GB telephone number RegEx patterns can also be found at:
+ * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
+ */
+$.validator.addMethod( "phoneUK", function( phone_number, element ) {
+ phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" );
+ return this.optional( element ) || phone_number.length > 9 &&
+ phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/ );
+}, "Please specify a valid phone number" );
+
+/**
+ * Matches US phone number format
+ *
+ * where the area code may not start with 1 and the prefix may not start with 1
+ * allows '-' or ' ' as a separator and allows parens around area code
+ * some people may want to put a '1' in front of their number
+ *
+ * 1(212)-999-2345 or
+ * 212 999 2344 or
+ * 212-999-0983
+ *
+ * but not
+ * 111-123-5434
+ * and not
+ * 212 123 4567
+ */
+$.validator.addMethod( "phoneUS", function( phone_number, element ) {
+ phone_number = phone_number.replace( /\s+/g, "" );
+ return this.optional( element ) || phone_number.length > 9 &&
+ phone_number.match( /^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]([02-9]\d|1[02-9])-?\d{4}$/ );
+}, "Please specify a valid phone number" );
+
+/* For UK phone functions, do the following server side processing:
+ * Compare original input with this RegEx pattern:
+ * ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$
+ * Extract $1 and set $prefix to '+44' if $1 is '44', otherwise set $prefix to '0'
+ * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.
+ * A number of very detailed GB telephone number RegEx patterns can also be found at:
+ * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
+ */
+
+// Matches UK landline + mobile, accepting only 01-3 for landline or 07 for mobile to exclude many premium numbers
+$.validator.addMethod( "phonesUK", function( phone_number, element ) {
+ phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" );
+ return this.optional( element ) || phone_number.length > 9 &&
+ phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/ );
+}, "Please specify a valid uk phone number" );
+
+/**
+ * Matches a valid Canadian Postal Code
+ *
+ * @example jQuery.validator.methods.postalCodeCA( "H0H 0H0", element )
+ * @result true
+ *
+ * @example jQuery.validator.methods.postalCodeCA( "H0H0H0", element )
+ * @result false
+ *
+ * @name jQuery.validator.methods.postalCodeCA
+ * @type Boolean
+ * @cat Plugins/Validate/Methods
+ */
+$.validator.addMethod( "postalCodeCA", function( value, element ) {
+ return this.optional( element ) || /^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] *\d[ABCEGHJKLMNPRSTVWXYZ]\d$/i.test( value );
+}, "Please specify a valid postal code" );
+
+/*
+* Valida CEPs do brasileiros:
+*
+* Formatos aceitos:
+* 99999-999
+* 99.999-999
+* 99999999
+*/
+$.validator.addMethod( "postalcodeBR", function( cep_value, element ) {
+ return this.optional( element ) || /^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test( cep_value );
+}, "Informe um CEP válido." );
+
+/* Matches Italian postcode (CAP) */
+$.validator.addMethod( "postalcodeIT", function( value, element ) {
+ return this.optional( element ) || /^\d{5}$/.test( value );
+}, "Please specify a valid postal code" );
+
+$.validator.addMethod( "postalcodeNL", function( value, element ) {
+ return this.optional( element ) || /^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test( value );
+}, "Please specify a valid postal code" );
+
+// Matches UK postcode. Does not match to UK Channel Islands that have their own postcodes (non standard UK)
+$.validator.addMethod( "postcodeUK", function( value, element ) {
+ return this.optional( element ) || /^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test( value );
+}, "Please specify a valid UK postcode" );
+
+/*
+ * Lets you say "at least X inputs that match selector Y must be filled."
+ *
+ * The end result is that neither of these inputs:
+ *
+ *
+ *
+ *
+ * ...will validate unless at least one of them is filled.
+ *
+ * partnumber: {require_from_group: [1,".productinfo"]},
+ * description: {require_from_group: [1,".productinfo"]}
+ *
+ * options[0]: number of fields that must be filled in the group
+ * options[1]: CSS selector that defines the group of conditionally required fields
+ */
+$.validator.addMethod( "require_from_group", function( value, element, options ) {
+ var $fields = $( options[ 1 ], element.form ),
+ $fieldsFirst = $fields.eq( 0 ),
+ validator = $fieldsFirst.data( "valid_req_grp" ) ? $fieldsFirst.data( "valid_req_grp" ) : $.extend( {}, this ),
+ isValid = $fields.filter( function() {
+ return validator.elementValue( this );
+ } ).length >= options[ 0 ];
+
+ // Store the cloned validator for future validation
+ $fieldsFirst.data( "valid_req_grp", validator );
+
+ // If element isn't being validated, run each require_from_group field's validation rules
+ if ( !$( element ).data( "being_validated" ) ) {
+ $fields.data( "being_validated", true );
+ $fields.each( function() {
+ validator.element( this );
+ } );
+ $fields.data( "being_validated", false );
+ }
+ return isValid;
+}, $.validator.format( "Please fill at least {0} of these fields." ) );
+
+/*
+ * Lets you say "either at least X inputs that match selector Y must be filled,
+ * OR they must all be skipped (left blank)."
+ *
+ * The end result, is that none of these inputs:
+ *
+ *
+ *
+ *
+ *
+ * ...will validate unless either at least two of them are filled,
+ * OR none of them are.
+ *
+ * partnumber: {skip_or_fill_minimum: [2,".productinfo"]},
+ * description: {skip_or_fill_minimum: [2,".productinfo"]},
+ * color: {skip_or_fill_minimum: [2,".productinfo"]}
+ *
+ * options[0]: number of fields that must be filled in the group
+ * options[1]: CSS selector that defines the group of conditionally required fields
+ *
+ */
+$.validator.addMethod( "skip_or_fill_minimum", function( value, element, options ) {
+ var $fields = $( options[ 1 ], element.form ),
+ $fieldsFirst = $fields.eq( 0 ),
+ validator = $fieldsFirst.data( "valid_skip" ) ? $fieldsFirst.data( "valid_skip" ) : $.extend( {}, this ),
+ numberFilled = $fields.filter( function() {
+ return validator.elementValue( this );
+ } ).length,
+ isValid = numberFilled === 0 || numberFilled >= options[ 0 ];
+
+ // Store the cloned validator for future validation
+ $fieldsFirst.data( "valid_skip", validator );
+
+ // If element isn't being validated, run each skip_or_fill_minimum field's validation rules
+ if ( !$( element ).data( "being_validated" ) ) {
+ $fields.data( "being_validated", true );
+ $fields.each( function() {
+ validator.element( this );
+ } );
+ $fields.data( "being_validated", false );
+ }
+ return isValid;
+}, $.validator.format( "Please either skip these fields or fill at least {0} of them." ) );
+
+/* Validates US States and/or Territories by @jdforsythe
+ * Can be case insensitive or require capitalization - default is case insensitive
+ * Can include US Territories or not - default does not
+ * Can include US Military postal abbreviations (AA, AE, AP) - default does not
+ *
+ * Note: "States" always includes DC (District of Colombia)
+ *
+ * Usage examples:
+ *
+ * This is the default - case insensitive, no territories, no military zones
+ * stateInput: {
+ * caseSensitive: false,
+ * includeTerritories: false,
+ * includeMilitary: false
+ * }
+ *
+ * Only allow capital letters, no territories, no military zones
+ * stateInput: {
+ * caseSensitive: false
+ * }
+ *
+ * Case insensitive, include territories but not military zones
+ * stateInput: {
+ * includeTerritories: true
+ * }
+ *
+ * Only allow capital letters, include territories and military zones
+ * stateInput: {
+ * caseSensitive: true,
+ * includeTerritories: true,
+ * includeMilitary: true
+ * }
+ *
+ */
+$.validator.addMethod( "stateUS", function( value, element, options ) {
+ var isDefault = typeof options === "undefined",
+ caseSensitive = ( isDefault || typeof options.caseSensitive === "undefined" ) ? false : options.caseSensitive,
+ includeTerritories = ( isDefault || typeof options.includeTerritories === "undefined" ) ? false : options.includeTerritories,
+ includeMilitary = ( isDefault || typeof options.includeMilitary === "undefined" ) ? false : options.includeMilitary,
+ regex;
+
+ if ( !includeTerritories && !includeMilitary ) {
+ regex = "^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$";
+ } else if ( includeTerritories && includeMilitary ) {
+ regex = "^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$";
+ } else if ( includeTerritories ) {
+ regex = "^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$";
+ } else {
+ regex = "^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$";
+ }
+
+ regex = caseSensitive ? new RegExp( regex ) : new RegExp( regex, "i" );
+ return this.optional( element ) || regex.test( value );
+}, "Please specify a valid state" );
+
+// TODO check if value starts with <, otherwise don't try stripping anything
+$.validator.addMethod( "strippedminlength", function( value, element, param ) {
+ return $( value ).text().length >= param;
+}, $.validator.format( "Please enter at least {0} characters" ) );
+
+$.validator.addMethod( "time", function( value, element ) {
+ return this.optional( element ) || /^([01]\d|2[0-3]|[0-9])(:[0-5]\d){1,2}$/.test( value );
+}, "Please enter a valid time, between 00:00 and 23:59" );
+
+$.validator.addMethod( "time12h", function( value, element ) {
+ return this.optional( element ) || /^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test( value );
+}, "Please enter a valid time in 12-hour am/pm format" );
+
+// Same as url, but TLD is optional
+$.validator.addMethod( "url2", function( value, element ) {
+ return this.optional( element ) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test( value );
+}, $.validator.messages.url );
+
+/**
+ * Return true, if the value is a valid vehicle identification number (VIN).
+ *
+ * Works with all kind of text inputs.
+ *
+ * @example
+ * @desc Declares a required input element whose value must be a valid vehicle identification number.
+ *
+ * @name $.validator.methods.vinUS
+ * @type Boolean
+ * @cat Plugins/Validate/Methods
+ */
+$.validator.addMethod( "vinUS", function( v ) {
+ if ( v.length !== 17 ) {
+ return false;
+ }
+
+ var LL = [ "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" ],
+ VL = [ 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 7, 9, 2, 3, 4, 5, 6, 7, 8, 9 ],
+ FL = [ 8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2 ],
+ rs = 0,
+ i, n, d, f, cd, cdv;
+
+ for ( i = 0; i < 17; i++ ) {
+ f = FL[ i ];
+ d = v.slice( i, i + 1 );
+ if ( i === 8 ) {
+ cdv = d;
+ }
+ if ( !isNaN( d ) ) {
+ d *= f;
+ } else {
+ for ( n = 0; n < LL.length; n++ ) {
+ if ( d.toUpperCase() === LL[ n ] ) {
+ d = VL[ n ];
+ d *= f;
+ if ( isNaN( cdv ) && n === 8 ) {
+ cdv = LL[ n ];
+ }
+ break;
+ }
+ }
+ }
+ rs += d;
+ }
+ cd = rs % 11;
+ if ( cd === 10 ) {
+ cd = "X";
+ }
+ if ( cd === cdv ) {
+ return true;
+ }
+ return false;
+}, "The specified vehicle identification number (VIN) is invalid." );
+
+$.validator.addMethod( "zipcodeUS", function( value, element ) {
+ return this.optional( element ) || /^\d{5}(-\d{4})?$/.test( value );
+}, "The specified US ZIP Code is invalid" );
+
+$.validator.addMethod( "ziprange", function( value, element ) {
+ return this.optional( element ) || /^90[2-5]\d\{2\}-\d{4}$/.test( value );
+}, "Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx" );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/additional-methods.min.js b/styles/bootstrap/validate/additional-methods.min.js
new file mode 100644
index 000000000..b06943e6f
--- /dev/null
+++ b/styles/bootstrap/validate/additional-methods.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","./jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){!function(){function b(a){return a.replace(/<.[^<>]*?>/g," ").replace(/ | /gi," ").replace(/[.(),;:!?%#$'\"_+=\/\-“”’]*/g,"")}a.validator.addMethod("maxWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length<=d},a.validator.format("Please enter {0} words or less.")),a.validator.addMethod("minWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length>=d},a.validator.format("Please enter at least {0} words.")),a.validator.addMethod("rangeWords",function(a,c,d){var e=b(a),f=/\b\w+\b/g;return this.optional(c)||e.match(f).length>=d[0]&&e.match(f).length<=d[1]},a.validator.format("Please enter between {0} and {1} words."))}(),a.validator.addMethod("accept",function(b,c,d){var e,f,g,h="string"==typeof d?d.replace(/\s/g,""):"image/*",i=this.optional(c);if(i)return i;if("file"===a(c).attr("type")&&(h=h.replace(/[\-\[\]\/\{\}\(\)\+\?\.\\\^\$\|]/g,"\\$&").replace(/,/g,"|").replace(/\/\*/g,"/.*"),c.files&&c.files.length))for(g=new RegExp(".?("+h+")$","i"),e=0;e,.\/? ])+/g,""),11!==a.length)return!1;var b,c,d,e,f=0;if(b=parseInt(a.substring(9,10),10),c=parseInt(a.substring(10,11),10),d=function(a,b){var c=10*a%11;return 10!==c&&11!==c||(c=0),c===b},""===a||"00000000000"===a||"11111111111"===a||"22222222222"===a||"33333333333"===a||"44444444444"===a||"55555555555"===a||"66666666666"===a||"77777777777"===a||"88888888888"===a||"99999999999"===a)return!1;for(e=1;e<=9;e++)f+=parseInt(a.substring(e-1,e),10)*(11-e);if(d(f,b)){for(f=0,e=1;e<=10;e++)f+=parseInt(a.substring(e-1,e),10)*(12-e);return d(f,c)}return!1},"Please specify a valid CPF number"),a.validator.addMethod("creditcard",function(a,b){if(this.optional(b))return"dependency-mismatch";if(/[^0-9 \-]+/.test(a))return!1;var c,d,e=0,f=0,g=!1;if(a=a.replace(/\D/g,""),a.length<13||a.length>19)return!1;for(c=a.length-1;c>=0;c--)d=a.charAt(c),f=parseInt(d,10),g&&(f*=2)>9&&(f-=9),e+=f,g=!g;return e%10===0},"Please enter a valid credit card number."),a.validator.addMethod("creditcardtypes",function(a,b,c){if(/[^0-9\-]+/.test(a))return!1;a=a.replace(/\D/g,"");var d=0;return c.mastercard&&(d|=1),c.visa&&(d|=2),c.amex&&(d|=4),c.dinersclub&&(d|=8),c.enroute&&(d|=16),c.discover&&(d|=32),c.jcb&&(d|=64),c.unknown&&(d|=128),c.all&&(d=255),1&d&&/^(5[12345])/.test(a)?16===a.length:2&d&&/^(4)/.test(a)?16===a.length:4&d&&/^(3[47])/.test(a)?15===a.length:8&d&&/^(3(0[012345]|[68]))/.test(a)?14===a.length:16&d&&/^(2(014|149))/.test(a)?15===a.length:32&d&&/^(6011)/.test(a)?16===a.length:64&d&&/^(3)/.test(a)?16===a.length:64&d&&/^(2131|1800)/.test(a)?15===a.length:!!(128&d)},"Please enter a valid credit card number."),a.validator.addMethod("currency",function(a,b,c){var d,e="string"==typeof c,f=e?c:c[0],g=!!e||c[1];return f=f.replace(/,/g,""),f=g?f+"]":f+"]?",d="^["+f+"([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$",d=new RegExp(d),this.optional(b)||d.test(a)},"Please specify a valid currency"),a.validator.addMethod("dateFA",function(a,b){return this.optional(b)||/^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test(a)},a.validator.messages.date),a.validator.addMethod("dateITA",function(a,b){var c,d,e,f,g,h=!1,i=/^\d{1,2}\/\d{1,2}\/\d{4}$/;return i.test(a)?(c=a.split("/"),d=parseInt(c[0],10),e=parseInt(c[1],10),f=parseInt(c[2],10),g=new Date(Date.UTC(f,e-1,d,12,0,0,0)),h=g.getUTCFullYear()===f&&g.getUTCMonth()===e-1&&g.getUTCDate()===d):h=!1,this.optional(b)||h},a.validator.messages.date),a.validator.addMethod("dateNL",function(a,b){return this.optional(b)||/^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test(a)},a.validator.messages.date),a.validator.addMethod("extension",function(a,b,c){return c="string"==typeof c?c.replace(/,/g,"|"):"png|jpe?g|gif",this.optional(b)||a.match(new RegExp("\\.("+c+")$","i"))},a.validator.format("Please enter a value with a valid extension.")),a.validator.addMethod("giroaccountNL",function(a,b){return this.optional(b)||/^[0-9]{1,7}$/.test(a)},"Please specify a valid giro account number"),a.validator.addMethod("iban",function(a,b){if(this.optional(b))return!0;var c,d,e,f,g,h,i,j,k,l=a.replace(/ /g,"").toUpperCase(),m="",n=!0,o="",p="",q=5;if(l.length9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/)},"Please specify a valid mobile number"),a.validator.addMethod("nieES",function(a){"use strict";return a=a.toUpperCase(),!!a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)")&&(/^[T]{1}/.test(a)?a[8]===/^[T]{1}[A-Z0-9]{8}$/.test(a):!!/^[XYZ]{1}/.test(a)&&a[8]==="TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.replace("X","0").replace("Y","1").replace("Z","2").substring(0,8)%23))},"Please specify a valid NIE number."),a.validator.addMethod("nifES",function(a){"use strict";return a=a.toUpperCase(),!!a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)")&&(/^[0-9]{8}[A-Z]{1}$/.test(a)?"TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.substring(8,0)%23)===a.charAt(8):!!/^[KLM]{1}/.test(a)&&a[8]===String.fromCharCode(64))},"Please specify a valid NIF number."),a.validator.addMethod("notEqualTo",function(b,c,d){return this.optional(c)||!a.validator.methods.equalTo.call(this,b,c,d)},"Please enter a different value, values must not be the same."),a.validator.addMethod("nowhitespace",function(a,b){return this.optional(b)||/^\S+$/i.test(a)},"No white space please"),a.validator.addMethod("pattern",function(a,b,c){return!!this.optional(b)||("string"==typeof c&&(c=new RegExp("^(?:"+c+")$")),c.test(a))},"Invalid format."),a.validator.addMethod("phoneNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid phone number."),a.validator.addMethod("phoneUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/)},"Please specify a valid phone number"),a.validator.addMethod("phoneUS",function(a,b){return a=a.replace(/\s+/g,""),this.optional(b)||a.length>9&&a.match(/^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]([02-9]\d|1[02-9])-?\d{4}$/)},"Please specify a valid phone number"),a.validator.addMethod("phonesUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/)},"Please specify a valid uk phone number"),a.validator.addMethod("postalCodeCA",function(a,b){return this.optional(b)||/^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] *\d[ABCEGHJKLMNPRSTVWXYZ]\d$/i.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postalcodeBR",function(a,b){return this.optional(b)||/^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test(a)},"Informe um CEP válido."),a.validator.addMethod("postalcodeIT",function(a,b){return this.optional(b)||/^\d{5}$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postalcodeNL",function(a,b){return this.optional(b)||/^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postcodeUK",function(a,b){return this.optional(b)||/^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test(a)},"Please specify a valid UK postcode"),a.validator.addMethod("require_from_group",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_req_grp")?f.data("valid_req_grp"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length>=d[0];return f.data("valid_req_grp",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),h},a.validator.format("Please fill at least {0} of these fields.")),a.validator.addMethod("skip_or_fill_minimum",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_skip")?f.data("valid_skip"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length,i=0===h||h>=d[0];return f.data("valid_skip",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),i},a.validator.format("Please either skip these fields or fill at least {0} of them.")),a.validator.addMethod("stateUS",function(a,b,c){var d,e="undefined"==typeof c,f=!e&&"undefined"!=typeof c.caseSensitive&&c.caseSensitive,g=!e&&"undefined"!=typeof c.includeTerritories&&c.includeTerritories,h=!e&&"undefined"!=typeof c.includeMilitary&&c.includeMilitary;return d=g||h?g&&h?"^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":g?"^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":"^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$":"^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$",d=f?new RegExp(d):new RegExp(d,"i"),this.optional(b)||d.test(a)},"Please specify a valid state"),a.validator.addMethod("strippedminlength",function(b,c,d){return a(b).text().length>=d},a.validator.format("Please enter at least {0} characters")),a.validator.addMethod("time",function(a,b){return this.optional(b)||/^([01]\d|2[0-3]|[0-9])(:[0-5]\d){1,2}$/.test(a)},"Please enter a valid time, between 00:00 and 23:59"),a.validator.addMethod("time12h",function(a,b){return this.optional(b)||/^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test(a)},"Please enter a valid time in 12-hour am/pm format"),a.validator.addMethod("url2",function(a,b){return this.optional(b)||/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(a)},a.validator.messages.url),a.validator.addMethod("vinUS",function(a){if(17!==a.length)return!1;var b,c,d,e,f,g,h=["A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z"],i=[1,2,3,4,5,6,7,8,1,2,3,4,5,7,9,2,3,4,5,6,7,8,9],j=[8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2],k=0;for(b=0;b<17;b++){if(e=j[b],d=a.slice(b,b+1),8===b&&(g=d),isNaN(d)){for(c=0;c" )
+ .attr( "name", validator.submitButton.name )
+ .val( $( validator.submitButton ).val() )
+ .appendTo( validator.currentForm );
+ }
+ result = validator.settings.submitHandler.call( validator, validator.currentForm, event );
+ if ( validator.submitButton ) {
+
+ // And clean up afterwards; thanks to no-block-scope, hidden can be referenced
+ hidden.remove();
+ }
+ if ( result !== undefined ) {
+ return result;
+ }
+ return false;
+ }
+ return true;
+ }
+
+ // Prevent submit for invalid forms or custom submit handlers
+ if ( validator.cancelSubmit ) {
+ validator.cancelSubmit = false;
+ return handle();
+ }
+ if ( validator.form() ) {
+ if ( validator.pendingRequest ) {
+ validator.formSubmitted = true;
+ return false;
+ }
+ return handle();
+ } else {
+ validator.focusInvalid();
+ return false;
+ }
+ } );
+ }
+
+ return validator;
+ },
+
+ // http://jqueryvalidation.org/valid/
+ valid: function() {
+ var valid, validator, errorList;
+
+ if ( $( this[ 0 ] ).is( "form" ) ) {
+ valid = this.validate().form();
+ } else {
+ errorList = [];
+ valid = true;
+ validator = $( this[ 0 ].form ).validate();
+ this.each( function() {
+ valid = validator.element( this ) && valid;
+ if ( !valid ) {
+ errorList = errorList.concat( validator.errorList );
+ }
+ } );
+ validator.errorList = errorList;
+ }
+ return valid;
+ },
+
+ // http://jqueryvalidation.org/rules/
+ rules: function( command, argument ) {
+ var element = this[ 0 ],
+ settings, staticRules, existingRules, data, param, filtered;
+
+ // If nothing is selected, return empty object; can't chain anyway
+ if ( element == null || element.form == null ) {
+ return;
+ }
+
+ if ( command ) {
+ settings = $.data( element.form, "validator" ).settings;
+ staticRules = settings.rules;
+ existingRules = $.validator.staticRules( element );
+ switch ( command ) {
+ case "add":
+ $.extend( existingRules, $.validator.normalizeRule( argument ) );
+
+ // Remove messages from rules, but allow them to be set separately
+ delete existingRules.messages;
+ staticRules[ element.name ] = existingRules;
+ if ( argument.messages ) {
+ settings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );
+ }
+ break;
+ case "remove":
+ if ( !argument ) {
+ delete staticRules[ element.name ];
+ return existingRules;
+ }
+ filtered = {};
+ $.each( argument.split( /\s/ ), function( index, method ) {
+ filtered[ method ] = existingRules[ method ];
+ delete existingRules[ method ];
+ if ( method === "required" ) {
+ $( element ).removeAttr( "aria-required" );
+ }
+ } );
+ return filtered;
+ }
+ }
+
+ data = $.validator.normalizeRules(
+ $.extend(
+ {},
+ $.validator.classRules( element ),
+ $.validator.attributeRules( element ),
+ $.validator.dataRules( element ),
+ $.validator.staticRules( element )
+ ), element );
+
+ // Make sure required is at front
+ if ( data.required ) {
+ param = data.required;
+ delete data.required;
+ data = $.extend( { required: param }, data );
+ $( element ).attr( "aria-required", "true" );
+ }
+
+ // Make sure remote is at back
+ if ( data.remote ) {
+ param = data.remote;
+ delete data.remote;
+ data = $.extend( data, { remote: param } );
+ }
+
+ return data;
+ }
+} );
+
+// Custom selectors
+$.extend( $.expr[ ":" ], {
+
+ // http://jqueryvalidation.org/blank-selector/
+ blank: function( a ) {
+ return !$.trim( "" + $( a ).val() );
+ },
+
+ // http://jqueryvalidation.org/filled-selector/
+ filled: function( a ) {
+ var val = $( a ).val();
+ return val !== null && !!$.trim( "" + val );
+ },
+
+ // http://jqueryvalidation.org/unchecked-selector/
+ unchecked: function( a ) {
+ return !$( a ).prop( "checked" );
+ }
+} );
+
+// Constructor for validator
+$.validator = function( options, form ) {
+ this.settings = $.extend( true, {}, $.validator.defaults, options );
+ this.currentForm = form;
+ this.init();
+};
+
+// http://jqueryvalidation.org/jQuery.validator.format/
+$.validator.format = function( source, params ) {
+ if ( arguments.length === 1 ) {
+ return function() {
+ var args = $.makeArray( arguments );
+ args.unshift( source );
+ return $.validator.format.apply( this, args );
+ };
+ }
+ if ( params === undefined ) {
+ return source;
+ }
+ if ( arguments.length > 2 && params.constructor !== Array ) {
+ params = $.makeArray( arguments ).slice( 1 );
+ }
+ if ( params.constructor !== Array ) {
+ params = [ params ];
+ }
+ $.each( params, function( i, n ) {
+ source = source.replace( new RegExp( "\\{" + i + "\\}", "g" ), function() {
+ return n;
+ } );
+ } );
+ return source;
+};
+
+$.extend( $.validator, {
+
+ defaults: {
+ messages: {},
+ groups: {},
+ rules: {},
+ errorClass: "error",
+ pendingClass: "pending",
+ validClass: "valid",
+ errorElement: "label",
+ focusCleanup: false,
+ focusInvalid: true,
+ errorContainer: $( [] ),
+ errorLabelContainer: $( [] ),
+ onsubmit: true,
+ ignore: ":hidden",
+ ignoreTitle: false,
+ onfocusin: function( element ) {
+ this.lastActive = element;
+
+ // Hide error label and remove error class on focus if enabled
+ if ( this.settings.focusCleanup ) {
+ if ( this.settings.unhighlight ) {
+ this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
+ }
+ this.hideThese( this.errorsFor( element ) );
+ }
+ },
+ onfocusout: function( element ) {
+ if ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {
+ this.element( element );
+ }
+ },
+ onkeyup: function( element, event ) {
+
+ // Avoid revalidate the field when pressing one of the following keys
+ // Shift => 16
+ // Ctrl => 17
+ // Alt => 18
+ // Caps lock => 20
+ // End => 35
+ // Home => 36
+ // Left arrow => 37
+ // Up arrow => 38
+ // Right arrow => 39
+ // Down arrow => 40
+ // Insert => 45
+ // Num lock => 144
+ // AltGr key => 225
+ var excludedKeys = [
+ 16, 17, 18, 20, 35, 36, 37,
+ 38, 39, 40, 45, 144, 225
+ ];
+
+ if ( event.which === 9 && this.elementValue( element ) === "" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {
+ return;
+ } else if ( element.name in this.submitted || element.name in this.invalid ) {
+ this.element( element );
+ }
+ },
+ onclick: function( element ) {
+
+ // Click on selects, radiobuttons and checkboxes
+ if ( element.name in this.submitted ) {
+ this.element( element );
+
+ // Or option elements, check parent select in that case
+ } else if ( element.parentNode.name in this.submitted ) {
+ this.element( element.parentNode );
+ }
+ },
+ highlight: function( element, errorClass, validClass ) {
+ if ( element.type === "radio" ) {
+ this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
+ } else {
+ $( element ).addClass( errorClass ).removeClass( validClass );
+ }
+ },
+ unhighlight: function( element, errorClass, validClass ) {
+ if ( element.type === "radio" ) {
+ this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
+ } else {
+ $( element ).removeClass( errorClass ).addClass( validClass );
+ }
+ }
+ },
+
+ // http://jqueryvalidation.org/jQuery.validator.setDefaults/
+ setDefaults: function( settings ) {
+ $.extend( $.validator.defaults, settings );
+ },
+
+ messages: {
+ required: "This field is required.",
+ remote: "Please fix this field.",
+ email: "Please enter a valid email address.",
+ url: "Please enter a valid URL.",
+ date: "Please enter a valid date.",
+ dateISO: "Please enter a valid date (ISO).",
+ number: "Please enter a valid number.",
+ digits: "Please enter only digits.",
+ equalTo: "Please enter the same value again.",
+ maxlength: $.validator.format( "Please enter no more than {0} characters." ),
+ minlength: $.validator.format( "Please enter at least {0} characters." ),
+ rangelength: $.validator.format( "Please enter a value between {0} and {1} characters long." ),
+ range: $.validator.format( "Please enter a value between {0} and {1}." ),
+ max: $.validator.format( "Please enter a value less than or equal to {0}." ),
+ min: $.validator.format( "Please enter a value greater than or equal to {0}." ),
+ step: $.validator.format( "Please enter a multiple of {0}." )
+ },
+
+ autoCreateRanges: false,
+
+ prototype: {
+
+ init: function() {
+ this.labelContainer = $( this.settings.errorLabelContainer );
+ this.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );
+ this.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );
+ this.submitted = {};
+ this.valueCache = {};
+ this.pendingRequest = 0;
+ this.pending = {};
+ this.invalid = {};
+ this.reset();
+
+ var groups = ( this.groups = {} ),
+ rules;
+ $.each( this.settings.groups, function( key, value ) {
+ if ( typeof value === "string" ) {
+ value = value.split( /\s/ );
+ }
+ $.each( value, function( index, name ) {
+ groups[ name ] = key;
+ } );
+ } );
+ rules = this.settings.rules;
+ $.each( rules, function( key, value ) {
+ rules[ key ] = $.validator.normalizeRule( value );
+ } );
+
+ function delegate( event ) {
+
+ // Set form expando on contenteditable
+ if ( !this.form && this.hasAttribute( "contenteditable" ) ) {
+ this.form = $( this ).closest( "form" )[ 0 ];
+ }
+
+ var validator = $.data( this.form, "validator" ),
+ eventType = "on" + event.type.replace( /^validate/, "" ),
+ settings = validator.settings;
+ if ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {
+ settings[ eventType ].call( validator, this, event );
+ }
+ }
+
+ $( this.currentForm )
+ .on( "focusin.validate focusout.validate keyup.validate",
+ ":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " +
+ "[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " +
+ "[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " +
+ "[type='radio'], [type='checkbox'], [contenteditable]", delegate )
+
+ // Support: Chrome, oldIE
+ // "select" is provided as event.target when clicking a option
+ .on( "click.validate", "select, option, [type='radio'], [type='checkbox']", delegate );
+
+ if ( this.settings.invalidHandler ) {
+ $( this.currentForm ).on( "invalid-form.validate", this.settings.invalidHandler );
+ }
+
+ // Add aria-required to any Static/Data/Class required fields before first validation
+ // Screen readers require this attribute to be present before the initial submission http://www.w3.org/TR/WCAG-TECHS/ARIA2.html
+ $( this.currentForm ).find( "[required], [data-rule-required], .required" ).attr( "aria-required", "true" );
+ },
+
+ // http://jqueryvalidation.org/Validator.form/
+ form: function() {
+ this.checkForm();
+ $.extend( this.submitted, this.errorMap );
+ this.invalid = $.extend( {}, this.errorMap );
+ if ( !this.valid() ) {
+ $( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
+ }
+ this.showErrors();
+ return this.valid();
+ },
+
+ checkForm: function() {
+ this.prepareForm();
+ for ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {
+ this.check( elements[ i ] );
+ }
+ return this.valid();
+ },
+
+ // http://jqueryvalidation.org/Validator.element/
+ element: function( element ) {
+ var cleanElement = this.clean( element ),
+ checkElement = this.validationTargetFor( cleanElement ),
+ v = this,
+ result = true,
+ rs, group;
+
+ if ( checkElement === undefined ) {
+ delete this.invalid[ cleanElement.name ];
+ } else {
+ this.prepareElement( checkElement );
+ this.currentElements = $( checkElement );
+
+ // If this element is grouped, then validate all group elements already
+ // containing a value
+ group = this.groups[ checkElement.name ];
+ if ( group ) {
+ $.each( this.groups, function( name, testgroup ) {
+ if ( testgroup === group && name !== checkElement.name ) {
+ cleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );
+ if ( cleanElement && cleanElement.name in v.invalid ) {
+ v.currentElements.push( cleanElement );
+ result = v.check( cleanElement ) && result;
+ }
+ }
+ } );
+ }
+
+ rs = this.check( checkElement ) !== false;
+ result = result && rs;
+ if ( rs ) {
+ this.invalid[ checkElement.name ] = false;
+ } else {
+ this.invalid[ checkElement.name ] = true;
+ }
+
+ if ( !this.numberOfInvalids() ) {
+
+ // Hide error containers on last error
+ this.toHide = this.toHide.add( this.containers );
+ }
+ this.showErrors();
+
+ // Add aria-invalid status for screen readers
+ $( element ).attr( "aria-invalid", !rs );
+ }
+
+ return result;
+ },
+
+ // http://jqueryvalidation.org/Validator.showErrors/
+ showErrors: function( errors ) {
+ if ( errors ) {
+ var validator = this;
+
+ // Add items to error list and map
+ $.extend( this.errorMap, errors );
+ this.errorList = $.map( this.errorMap, function( message, name ) {
+ return {
+ message: message,
+ element: validator.findByName( name )[ 0 ]
+ };
+ } );
+
+ // Remove items from success list
+ this.successList = $.grep( this.successList, function( element ) {
+ return !( element.name in errors );
+ } );
+ }
+ if ( this.settings.showErrors ) {
+ this.settings.showErrors.call( this, this.errorMap, this.errorList );
+ } else {
+ this.defaultShowErrors();
+ }
+ },
+
+ // http://jqueryvalidation.org/Validator.resetForm/
+ resetForm: function() {
+ if ( $.fn.resetForm ) {
+ $( this.currentForm ).resetForm();
+ }
+ this.invalid = {};
+ this.submitted = {};
+ this.prepareForm();
+ this.hideErrors();
+ var elements = this.elements()
+ .removeData( "previousValue" )
+ .removeAttr( "aria-invalid" );
+
+ this.resetElements( elements );
+ },
+
+ resetElements: function( elements ) {
+ var i;
+
+ if ( this.settings.unhighlight ) {
+ for ( i = 0; elements[ i ]; i++ ) {
+ this.settings.unhighlight.call( this, elements[ i ],
+ this.settings.errorClass, "" );
+ this.findByName( elements[ i ].name ).removeClass( this.settings.validClass );
+ }
+ } else {
+ elements
+ .removeClass( this.settings.errorClass )
+ .removeClass( this.settings.validClass );
+ }
+ },
+
+ numberOfInvalids: function() {
+ return this.objectLength( this.invalid );
+ },
+
+ objectLength: function( obj ) {
+ /* jshint unused: false */
+ var count = 0,
+ i;
+ for ( i in obj ) {
+ if ( obj[ i ] ) {
+ count++;
+ }
+ }
+ return count;
+ },
+
+ hideErrors: function() {
+ this.hideThese( this.toHide );
+ },
+
+ hideThese: function( errors ) {
+ errors.not( this.containers ).text( "" );
+ this.addWrapper( errors ).hide();
+ },
+
+ valid: function() {
+ return this.size() === 0;
+ },
+
+ size: function() {
+ return this.errorList.length;
+ },
+
+ focusInvalid: function() {
+ if ( this.settings.focusInvalid ) {
+ try {
+ $( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )
+ .filter( ":visible" )
+ .focus()
+
+ // Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
+ .trigger( "focusin" );
+ } catch ( e ) {
+
+ // Ignore IE throwing errors when focusing hidden elements
+ }
+ }
+ },
+
+ findLastActive: function() {
+ var lastActive = this.lastActive;
+ return lastActive && $.grep( this.errorList, function( n ) {
+ return n.element.name === lastActive.name;
+ } ).length === 1 && lastActive;
+ },
+
+ elements: function() {
+ var validator = this,
+ rulesCache = {};
+
+ // Select all valid inputs inside the form (no submit or reset buttons)
+ return $( this.currentForm )
+ .find( "input, select, textarea, [contenteditable]" )
+ .not( ":submit, :reset, :image, :disabled" )
+ .not( this.settings.ignore )
+ .filter( function() {
+ var name = this.name || $( this ).attr( "name" ); // For contenteditable
+ if ( !name && validator.settings.debug && window.console ) {
+ console.error( "%o has no name assigned", this );
+ }
+
+ // Set form expando on contenteditable
+ if ( this.hasAttribute( "contenteditable" ) ) {
+ this.form = $( this ).closest( "form" )[ 0 ];
+ }
+
+ // Select only the first element for each name, and only those with rules specified
+ if ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {
+ return false;
+ }
+
+ rulesCache[ name ] = true;
+ return true;
+ } );
+ },
+
+ clean: function( selector ) {
+ return $( selector )[ 0 ];
+ },
+
+ errors: function() {
+ var errorClass = this.settings.errorClass.split( " " ).join( "." );
+ return $( this.settings.errorElement + "." + errorClass, this.errorContext );
+ },
+
+ resetInternals: function() {
+ this.successList = [];
+ this.errorList = [];
+ this.errorMap = {};
+ this.toShow = $( [] );
+ this.toHide = $( [] );
+ },
+
+ reset: function() {
+ this.resetInternals();
+ this.currentElements = $( [] );
+ },
+
+ prepareForm: function() {
+ this.reset();
+ this.toHide = this.errors().add( this.containers );
+ },
+
+ prepareElement: function( element ) {
+ this.reset();
+ this.toHide = this.errorsFor( element );
+ },
+
+ elementValue: function( element ) {
+ var $element = $( element ),
+ type = element.type,
+ val, idx;
+
+ if ( type === "radio" || type === "checkbox" ) {
+ return this.findByName( element.name ).filter( ":checked" ).val();
+ } else if ( type === "number" && typeof element.validity !== "undefined" ) {
+ return element.validity.badInput ? "NaN" : $element.val();
+ }
+
+ if ( element.hasAttribute( "contenteditable" ) ) {
+ val = $element.text();
+ } else {
+ val = $element.val();
+ }
+
+ if ( type === "file" ) {
+
+ // Modern browser (chrome & safari)
+ if ( val.substr( 0, 12 ) === "C:\\fakepath\\" ) {
+ return val.substr( 12 );
+ }
+
+ // Legacy browsers
+ // Unix-based path
+ idx = val.lastIndexOf( "/" );
+ if ( idx >= 0 ) {
+ return val.substr( idx + 1 );
+ }
+
+ // Windows-based path
+ idx = val.lastIndexOf( "\\" );
+ if ( idx >= 0 ) {
+ return val.substr( idx + 1 );
+ }
+
+ // Just the file name
+ return val;
+ }
+
+ if ( typeof val === "string" ) {
+ return val.replace( /\r/g, "" );
+ }
+ return val;
+ },
+
+ check: function( element ) {
+ element = this.validationTargetFor( this.clean( element ) );
+
+ var rules = $( element ).rules(),
+ rulesCount = $.map( rules, function( n, i ) {
+ return i;
+ } ).length,
+ dependencyMismatch = false,
+ val = this.elementValue( element ),
+ result, method, rule;
+
+ // If a normalizer is defined for this element, then
+ // call it to retreive the changed value instead
+ // of using the real one.
+ // Note that `this` in the normalizer is `element`.
+ if ( typeof rules.normalizer === "function" ) {
+ val = rules.normalizer.call( element, val );
+
+ if ( typeof val !== "string" ) {
+ throw new TypeError( "The normalizer should return a string value." );
+ }
+
+ // Delete the normalizer from rules to avoid treating
+ // it as a pre-defined method.
+ delete rules.normalizer;
+ }
+
+ for ( method in rules ) {
+ rule = { method: method, parameters: rules[ method ] };
+ try {
+ result = $.validator.methods[ method ].call( this, val, element, rule.parameters );
+
+ // If a method indicates that the field is optional and therefore valid,
+ // don't mark it as valid when there are no other rules
+ if ( result === "dependency-mismatch" && rulesCount === 1 ) {
+ dependencyMismatch = true;
+ continue;
+ }
+ dependencyMismatch = false;
+
+ if ( result === "pending" ) {
+ this.toHide = this.toHide.not( this.errorsFor( element ) );
+ return;
+ }
+
+ if ( !result ) {
+ this.formatAndAdd( element, rule );
+ return false;
+ }
+ } catch ( e ) {
+ if ( this.settings.debug && window.console ) {
+ console.log( "Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e );
+ }
+ if ( e instanceof TypeError ) {
+ e.message += ". Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.";
+ }
+
+ throw e;
+ }
+ }
+ if ( dependencyMismatch ) {
+ return;
+ }
+ if ( this.objectLength( rules ) ) {
+ this.successList.push( element );
+ }
+ return true;
+ },
+
+ // Return the custom message for the given element and validation method
+ // specified in the element's HTML5 data attribute
+ // return the generic message if present and no method specific message is present
+ customDataMessage: function( element, method ) {
+ return $( element ).data( "msg" + method.charAt( 0 ).toUpperCase() +
+ method.substring( 1 ).toLowerCase() ) || $( element ).data( "msg" );
+ },
+
+ // Return the custom message for the given element name and validation method
+ customMessage: function( name, method ) {
+ var m = this.settings.messages[ name ];
+ return m && ( m.constructor === String ? m : m[ method ] );
+ },
+
+ // Return the first defined argument, allowing empty strings
+ findDefined: function() {
+ for ( var i = 0; i < arguments.length; i++ ) {
+ if ( arguments[ i ] !== undefined ) {
+ return arguments[ i ];
+ }
+ }
+ return undefined;
+ },
+
+ // The second parameter 'rule' used to be a string, and extended to an object literal
+ // of the following form:
+ // rule = {
+ // method: "method name",
+ // parameters: "the given method parameters"
+ // }
+ //
+ // The old behavior still supported, kept to maintain backward compatibility with
+ // old code, and will be removed in the next major release.
+ defaultMessage: function( element, rule ) {
+ if ( typeof rule === "string" ) {
+ rule = { method: rule };
+ }
+
+ var message = this.findDefined(
+ this.customMessage( element.name, rule.method ),
+ this.customDataMessage( element, rule.method ),
+
+ // 'title' is never undefined, so handle empty string as undefined
+ !this.settings.ignoreTitle && element.title || undefined,
+ $.validator.messages[ rule.method ],
+ "Warning: No message defined for " + element.name + ""
+ ),
+ theregex = /\$?\{(\d+)\}/g;
+ if ( typeof message === "function" ) {
+ message = message.call( this, rule.parameters, element );
+ } else if ( theregex.test( message ) ) {
+ message = $.validator.format( message.replace( theregex, "{$1}" ), rule.parameters );
+ }
+
+ return message;
+ },
+
+ formatAndAdd: function( element, rule ) {
+ var message = this.defaultMessage( element, rule );
+
+ this.errorList.push( {
+ message: message,
+ element: element,
+ method: rule.method
+ } );
+
+ this.errorMap[ element.name ] = message;
+ this.submitted[ element.name ] = message;
+ },
+
+ addWrapper: function( toToggle ) {
+ if ( this.settings.wrapper ) {
+ toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
+ }
+ return toToggle;
+ },
+
+ defaultShowErrors: function() {
+ var i, elements, error;
+ for ( i = 0; this.errorList[ i ]; i++ ) {
+ error = this.errorList[ i ];
+ if ( this.settings.highlight ) {
+ this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
+ }
+ this.showLabel( error.element, error.message );
+ }
+ if ( this.errorList.length ) {
+ this.toShow = this.toShow.add( this.containers );
+ }
+ if ( this.settings.success ) {
+ for ( i = 0; this.successList[ i ]; i++ ) {
+ this.showLabel( this.successList[ i ] );
+ }
+ }
+ if ( this.settings.unhighlight ) {
+ for ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {
+ this.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );
+ }
+ }
+ this.toHide = this.toHide.not( this.toShow );
+ this.hideErrors();
+ this.addWrapper( this.toShow ).show();
+ },
+
+ validElements: function() {
+ return this.currentElements.not( this.invalidElements() );
+ },
+
+ invalidElements: function() {
+ return $( this.errorList ).map( function() {
+ return this.element;
+ } );
+ },
+
+ showLabel: function( element, message ) {
+ var place, group, errorID, v,
+ error = this.errorsFor( element ),
+ elementID = this.idOrName( element ),
+ describedBy = $( element ).attr( "aria-describedby" );
+
+ if ( error.length ) {
+
+ // Refresh error/success class
+ error.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );
+
+ // Replace message on existing label
+ error.html( message );
+ } else {
+
+ // Create error element
+ error = $( "<" + this.settings.errorElement + ">" )
+ .attr( "id", elementID + "-error" )
+ .addClass( this.settings.errorClass )
+ .html( message || "" );
+
+ // Maintain reference to the element to be placed into the DOM
+ place = error;
+ if ( this.settings.wrapper ) {
+
+ // Make sure the element is visible, even in IE
+ // actually showing the wrapped element is handled elsewhere
+ place = error.hide().show().wrap( "<" + this.settings.wrapper + "/>" ).parent();
+ }
+ if ( this.labelContainer.length ) {
+ this.labelContainer.append( place );
+ } else if ( this.settings.errorPlacement ) {
+ this.settings.errorPlacement.call( this, place, $( element ) );
+ } else {
+ place.insertAfter( element );
+ }
+
+ // Link error back to the element
+ if ( error.is( "label" ) ) {
+
+ // If the error is a label, then associate using 'for'
+ error.attr( "for", elementID );
+
+ // If the element is not a child of an associated label, then it's necessary
+ // to explicitly apply aria-describedby
+ } else if ( error.parents( "label[for='" + this.escapeCssMeta( elementID ) + "']" ).length === 0 ) {
+ errorID = error.attr( "id" );
+
+ // Respect existing non-error aria-describedby
+ if ( !describedBy ) {
+ describedBy = errorID;
+ } else if ( !describedBy.match( new RegExp( "\\b" + this.escapeCssMeta( errorID ) + "\\b" ) ) ) {
+
+ // Add to end of list if not already present
+ describedBy += " " + errorID;
+ }
+ $( element ).attr( "aria-describedby", describedBy );
+
+ // If this element is grouped, then assign to all elements in the same group
+ group = this.groups[ element.name ];
+ if ( group ) {
+ v = this;
+ $.each( v.groups, function( name, testgroup ) {
+ if ( testgroup === group ) {
+ $( "[name='" + v.escapeCssMeta( name ) + "']", v.currentForm )
+ .attr( "aria-describedby", error.attr( "id" ) );
+ }
+ } );
+ }
+ }
+ }
+ if ( !message && this.settings.success ) {
+ error.text( "" );
+ if ( typeof this.settings.success === "string" ) {
+ error.addClass( this.settings.success );
+ } else {
+ this.settings.success( error, element );
+ }
+ }
+ this.toShow = this.toShow.add( error );
+ },
+
+ errorsFor: function( element ) {
+ var name = this.escapeCssMeta( this.idOrName( element ) ),
+ describer = $( element ).attr( "aria-describedby" ),
+ selector = "label[for='" + name + "'], label[for='" + name + "'] *";
+
+ // 'aria-describedby' should directly reference the error element
+ if ( describer ) {
+ selector = selector + ", #" + this.escapeCssMeta( describer )
+ .replace( /\s+/g, ", #" );
+ }
+
+ return this
+ .errors()
+ .filter( selector );
+ },
+
+ // See https://api.jquery.com/category/selectors/, for CSS
+ // meta-characters that should be escaped in order to be used with JQuery
+ // as a literal part of a name/id or any selector.
+ escapeCssMeta: function( string ) {
+ return string.replace( /([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g, "\\$1" );
+ },
+
+ idOrName: function( element ) {
+ return this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );
+ },
+
+ validationTargetFor: function( element ) {
+
+ // If radio/checkbox, validate first element in group instead
+ if ( this.checkable( element ) ) {
+ element = this.findByName( element.name );
+ }
+
+ // Always apply ignore filter
+ return $( element ).not( this.settings.ignore )[ 0 ];
+ },
+
+ checkable: function( element ) {
+ return ( /radio|checkbox/i ).test( element.type );
+ },
+
+ findByName: function( name ) {
+ return $( this.currentForm ).find( "[name='" + this.escapeCssMeta( name ) + "']" );
+ },
+
+ getLength: function( value, element ) {
+ switch ( element.nodeName.toLowerCase() ) {
+ case "select":
+ return $( "option:selected", element ).length;
+ case "input":
+ if ( this.checkable( element ) ) {
+ return this.findByName( element.name ).filter( ":checked" ).length;
+ }
+ }
+ return value.length;
+ },
+
+ depend: function( param, element ) {
+ return this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;
+ },
+
+ dependTypes: {
+ "boolean": function( param ) {
+ return param;
+ },
+ "string": function( param, element ) {
+ return !!$( param, element.form ).length;
+ },
+ "function": function( param, element ) {
+ return param( element );
+ }
+ },
+
+ optional: function( element ) {
+ var val = this.elementValue( element );
+ return !$.validator.methods.required.call( this, val, element ) && "dependency-mismatch";
+ },
+
+ startRequest: function( element ) {
+ if ( !this.pending[ element.name ] ) {
+ this.pendingRequest++;
+ $( element ).addClass( this.settings.pendingClass );
+ this.pending[ element.name ] = true;
+ }
+ },
+
+ stopRequest: function( element, valid ) {
+ this.pendingRequest--;
+
+ // Sometimes synchronization fails, make sure pendingRequest is never < 0
+ if ( this.pendingRequest < 0 ) {
+ this.pendingRequest = 0;
+ }
+ delete this.pending[ element.name ];
+ $( element ).removeClass( this.settings.pendingClass );
+ if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {
+ $( this.currentForm ).submit();
+ this.formSubmitted = false;
+ } else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {
+ $( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
+ this.formSubmitted = false;
+ }
+ },
+
+ previousValue: function( element, method ) {
+ method = typeof method === "string" && method || "remote";
+
+ return $.data( element, "previousValue" ) || $.data( element, "previousValue", {
+ old: null,
+ valid: true,
+ message: this.defaultMessage( element, { method: method } )
+ } );
+ },
+
+ // Cleans up all forms and elements, removes validator-specific events
+ destroy: function() {
+ this.resetForm();
+
+ $( this.currentForm )
+ .off( ".validate" )
+ .removeData( "validator" )
+ .find( ".validate-equalTo-blur" )
+ .off( ".validate-equalTo" )
+ .removeClass( "validate-equalTo-blur" );
+ }
+
+ },
+
+ classRuleSettings: {
+ required: { required: true },
+ email: { email: true },
+ url: { url: true },
+ date: { date: true },
+ dateISO: { dateISO: true },
+ number: { number: true },
+ digits: { digits: true },
+ creditcard: { creditcard: true }
+ },
+
+ addClassRules: function( className, rules ) {
+ if ( className.constructor === String ) {
+ this.classRuleSettings[ className ] = rules;
+ } else {
+ $.extend( this.classRuleSettings, className );
+ }
+ },
+
+ classRules: function( element ) {
+ var rules = {},
+ classes = $( element ).attr( "class" );
+
+ if ( classes ) {
+ $.each( classes.split( " " ), function() {
+ if ( this in $.validator.classRuleSettings ) {
+ $.extend( rules, $.validator.classRuleSettings[ this ] );
+ }
+ } );
+ }
+ return rules;
+ },
+
+ normalizeAttributeRule: function( rules, type, method, value ) {
+
+ // Convert the value to a number for number inputs, and for text for backwards compability
+ // allows type="date" and others to be compared as strings
+ if ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
+ value = Number( value );
+
+ // Support Opera Mini, which returns NaN for undefined minlength
+ if ( isNaN( value ) ) {
+ value = undefined;
+ }
+ }
+
+ if ( value || value === 0 ) {
+ rules[ method ] = value;
+ } else if ( type === method && type !== "range" ) {
+
+ // Exception: the jquery validate 'range' method
+ // does not test for the html5 'range' type
+ rules[ method ] = true;
+ }
+ },
+
+ attributeRules: function( element ) {
+ var rules = {},
+ $element = $( element ),
+ type = element.getAttribute( "type" ),
+ method, value;
+
+ for ( method in $.validator.methods ) {
+
+ // Support for in both html5 and older browsers
+ if ( method === "required" ) {
+ value = element.getAttribute( method );
+
+ // Some browsers return an empty string for the required attribute
+ // and non-HTML5 browsers might have required="" markup
+ if ( value === "" ) {
+ value = true;
+ }
+
+ // Force non-HTML5 browsers to return bool
+ value = !!value;
+ } else {
+ value = $element.attr( method );
+ }
+
+ this.normalizeAttributeRule( rules, type, method, value );
+ }
+
+ // 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs
+ if ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {
+ delete rules.maxlength;
+ }
+
+ return rules;
+ },
+
+ dataRules: function( element ) {
+ var rules = {},
+ $element = $( element ),
+ type = element.getAttribute( "type" ),
+ method, value;
+
+ for ( method in $.validator.methods ) {
+ value = $element.data( "rule" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );
+ this.normalizeAttributeRule( rules, type, method, value );
+ }
+ return rules;
+ },
+
+ staticRules: function( element ) {
+ var rules = {},
+ validator = $.data( element.form, "validator" );
+
+ if ( validator.settings.rules ) {
+ rules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};
+ }
+ return rules;
+ },
+
+ normalizeRules: function( rules, element ) {
+
+ // Handle dependency check
+ $.each( rules, function( prop, val ) {
+
+ // Ignore rule when param is explicitly false, eg. required:false
+ if ( val === false ) {
+ delete rules[ prop ];
+ return;
+ }
+ if ( val.param || val.depends ) {
+ var keepRule = true;
+ switch ( typeof val.depends ) {
+ case "string":
+ keepRule = !!$( val.depends, element.form ).length;
+ break;
+ case "function":
+ keepRule = val.depends.call( element, element );
+ break;
+ }
+ if ( keepRule ) {
+ rules[ prop ] = val.param !== undefined ? val.param : true;
+ } else {
+ $.data( element.form, "validator" ).resetElements( $( element ) );
+ delete rules[ prop ];
+ }
+ }
+ } );
+
+ // Evaluate parameters
+ $.each( rules, function( rule, parameter ) {
+ rules[ rule ] = $.isFunction( parameter ) && rule !== "normalizer" ? parameter( element ) : parameter;
+ } );
+
+ // Clean number parameters
+ $.each( [ "minlength", "maxlength" ], function() {
+ if ( rules[ this ] ) {
+ rules[ this ] = Number( rules[ this ] );
+ }
+ } );
+ $.each( [ "rangelength", "range" ], function() {
+ var parts;
+ if ( rules[ this ] ) {
+ if ( $.isArray( rules[ this ] ) ) {
+ rules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];
+ } else if ( typeof rules[ this ] === "string" ) {
+ parts = rules[ this ].replace( /[\[\]]/g, "" ).split( /[\s,]+/ );
+ rules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];
+ }
+ }
+ } );
+
+ if ( $.validator.autoCreateRanges ) {
+
+ // Auto-create ranges
+ if ( rules.min != null && rules.max != null ) {
+ rules.range = [ rules.min, rules.max ];
+ delete rules.min;
+ delete rules.max;
+ }
+ if ( rules.minlength != null && rules.maxlength != null ) {
+ rules.rangelength = [ rules.minlength, rules.maxlength ];
+ delete rules.minlength;
+ delete rules.maxlength;
+ }
+ }
+
+ return rules;
+ },
+
+ // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
+ normalizeRule: function( data ) {
+ if ( typeof data === "string" ) {
+ var transformed = {};
+ $.each( data.split( /\s/ ), function() {
+ transformed[ this ] = true;
+ } );
+ data = transformed;
+ }
+ return data;
+ },
+
+ // http://jqueryvalidation.org/jQuery.validator.addMethod/
+ addMethod: function( name, method, message ) {
+ $.validator.methods[ name ] = method;
+ $.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];
+ if ( method.length < 3 ) {
+ $.validator.addClassRules( name, $.validator.normalizeRule( name ) );
+ }
+ },
+
+ // http://jqueryvalidation.org/jQuery.validator.methods/
+ methods: {
+
+ // http://jqueryvalidation.org/required-method/
+ required: function( value, element, param ) {
+
+ // Check if dependency is met
+ if ( !this.depend( param, element ) ) {
+ return "dependency-mismatch";
+ }
+ if ( element.nodeName.toLowerCase() === "select" ) {
+
+ // Could be an array for select-multiple or a string, both are fine this way
+ var val = $( element ).val();
+ return val && val.length > 0;
+ }
+ if ( this.checkable( element ) ) {
+ return this.getLength( value, element ) > 0;
+ }
+ return value.length > 0;
+ },
+
+ // http://jqueryvalidation.org/email-method/
+ email: function( value, element ) {
+
+ // From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address
+ // Retrieved 2014-01-14
+ // If you have a problem with this implementation, report a bug against the above spec
+ // Or use custom methods to implement your own email validation
+ return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
+ },
+
+ // http://jqueryvalidation.org/url-method/
+ url: function( value, element ) {
+
+ // Copyright (c) 2010-2013 Diego Perini, MIT licensed
+ // https://gist.github.com/dperini/729294
+ // see also https://mathiasbynens.be/demo/url-regex
+ // modified to allow protocol-relative URLs
+ return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test( value );
+ },
+
+ // http://jqueryvalidation.org/date-method/
+ date: function( value, element ) {
+ return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );
+ },
+
+ // http://jqueryvalidation.org/dateISO-method/
+ dateISO: function( value, element ) {
+ return this.optional( element ) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );
+ },
+
+ // http://jqueryvalidation.org/number-method/
+ number: function( value, element ) {
+ return this.optional( element ) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value );
+ },
+
+ // http://jqueryvalidation.org/digits-method/
+ digits: function( value, element ) {
+ return this.optional( element ) || /^\d+$/.test( value );
+ },
+
+ // http://jqueryvalidation.org/minlength-method/
+ minlength: function( value, element, param ) {
+ var length = $.isArray( value ) ? value.length : this.getLength( value, element );
+ return this.optional( element ) || length >= param;
+ },
+
+ // http://jqueryvalidation.org/maxlength-method/
+ maxlength: function( value, element, param ) {
+ var length = $.isArray( value ) ? value.length : this.getLength( value, element );
+ return this.optional( element ) || length <= param;
+ },
+
+ // http://jqueryvalidation.org/rangelength-method/
+ rangelength: function( value, element, param ) {
+ var length = $.isArray( value ) ? value.length : this.getLength( value, element );
+ return this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );
+ },
+
+ // http://jqueryvalidation.org/min-method/
+ min: function( value, element, param ) {
+ return this.optional( element ) || value >= param;
+ },
+
+ // http://jqueryvalidation.org/max-method/
+ max: function( value, element, param ) {
+ return this.optional( element ) || value <= param;
+ },
+
+ // http://jqueryvalidation.org/range-method/
+ range: function( value, element, param ) {
+ return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
+ },
+
+ // http://jqueryvalidation.org/step-method/
+ step: function( value, element, param ) {
+ var type = $( element ).attr( "type" ),
+ errorMessage = "Step attribute on input type " + type + " is not supported.",
+ supportedTypes = [ "text", "number", "range" ],
+ re = new RegExp( "\\b" + type + "\\b" ),
+ notSupported = type && !re.test( supportedTypes.join() ),
+ decimalPlaces = function( num ) {
+ var match = ( "" + num ).match( /(?:\.(\d+))?$/ );
+ if ( !match ) {
+ return 0;
+ }
+
+ // Number of digits right of decimal point.
+ return match[ 1 ] ? match[ 1 ].length : 0;
+ },
+ toInt = function( num ) {
+ return Math.round( num * Math.pow( 10, decimals ) );
+ },
+ valid = true,
+ decimals;
+
+ // Works only for text, number and range input types
+ // TODO find a way to support input types date, datetime, datetime-local, month, time and week
+ if ( notSupported ) {
+ throw new Error( errorMessage );
+ }
+
+ decimals = decimalPlaces( param );
+
+ // Value can't have too many decimals
+ if ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {
+ valid = false;
+ }
+
+ return this.optional( element ) || valid;
+ },
+
+ // http://jqueryvalidation.org/equalTo-method/
+ equalTo: function( value, element, param ) {
+
+ // Bind to the blur event of the target in order to revalidate whenever the target field is updated
+ var target = $( param );
+ if ( this.settings.onfocusout && target.not( ".validate-equalTo-blur" ).length ) {
+ target.addClass( "validate-equalTo-blur" ).on( "blur.validate-equalTo", function() {
+ $( element ).valid();
+ } );
+ }
+ return value === target.val();
+ },
+
+ // http://jqueryvalidation.org/remote-method/
+ remote: function( value, element, param, method ) {
+ if ( this.optional( element ) ) {
+ return "dependency-mismatch";
+ }
+
+ method = typeof method === "string" && method || "remote";
+
+ var previous = this.previousValue( element, method ),
+ validator, data, optionDataString;
+
+ if ( !this.settings.messages[ element.name ] ) {
+ this.settings.messages[ element.name ] = {};
+ }
+ previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];
+ this.settings.messages[ element.name ][ method ] = previous.message;
+
+ param = typeof param === "string" && { url: param } || param;
+ optionDataString = $.param( $.extend( { data: value }, param.data ) );
+ if ( previous.old === optionDataString ) {
+ return previous.valid;
+ }
+
+ previous.old = optionDataString;
+ validator = this;
+ this.startRequest( element );
+ data = {};
+ data[ element.name ] = value;
+ $.ajax( $.extend( true, {
+ mode: "abort",
+ port: "validate" + element.name,
+ dataType: "json",
+ data: data,
+ context: validator.currentForm,
+ success: function( response ) {
+ var valid = response === true || response === "true",
+ errors, message, submitted;
+
+ validator.settings.messages[ element.name ][ method ] = previous.originalMessage;
+ if ( valid ) {
+ submitted = validator.formSubmitted;
+ validator.resetInternals();
+ validator.toHide = validator.errorsFor( element );
+ validator.formSubmitted = submitted;
+ validator.successList.push( element );
+ validator.invalid[ element.name ] = false;
+ validator.showErrors();
+ } else {
+ errors = {};
+ message = response || validator.defaultMessage( element, { method: method, parameters: value } );
+ errors[ element.name ] = previous.message = message;
+ validator.invalid[ element.name ] = true;
+ validator.showErrors( errors );
+ }
+ previous.valid = valid;
+ validator.stopRequest( element, valid );
+ }
+ }, param ) );
+ return "pending";
+ }
+ }
+
+} );
+
+// Ajax mode: abort
+// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
+// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
+
+var pendingRequests = {},
+ ajax;
+
+// Use a prefilter if available (1.5+)
+if ( $.ajaxPrefilter ) {
+ $.ajaxPrefilter( function( settings, _, xhr ) {
+ var port = settings.port;
+ if ( settings.mode === "abort" ) {
+ if ( pendingRequests[ port ] ) {
+ pendingRequests[ port ].abort();
+ }
+ pendingRequests[ port ] = xhr;
+ }
+ } );
+} else {
+
+ // Proxy ajax
+ ajax = $.ajax;
+ $.ajax = function( settings ) {
+ var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
+ port = ( "port" in settings ? settings : $.ajaxSettings ).port;
+ if ( mode === "abort" ) {
+ if ( pendingRequests[ port ] ) {
+ pendingRequests[ port ].abort();
+ }
+ pendingRequests[ port ] = ajax.apply( this, arguments );
+ return pendingRequests[ port ];
+ }
+ return ajax.apply( this, arguments );
+ };
+}
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/jquery.validate.min.js b/styles/bootstrap/validate/jquery.validate.min.js
new file mode 100644
index 000000000..aef4affec
--- /dev/null
+++ b/styles/bootstrap/validate/jquery.validate.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.on("click.validate",":submit",function(b){c.settings.submitHandler&&(c.submitButton=b.target),a(this).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(this).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.on("submit.validate",function(b){function d(){var d,e;return!c.settings.submitHandler||(c.submitButton&&(d=a("").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),e=c.settings.submitHandler.call(c,c.currentForm,b),c.submitButton&&d.remove(),void 0!==e&&e)}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is("form")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,b||(d=d.concat(c.errorList))}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0];if(null!=j&&null!=j.form){if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(b,c){i[c]=f[c],delete f[c],"required"===c&&a(j).removeAttr("aria-required")}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g),a(j).attr("aria-required","true")),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}}),a.extend(a.expr[":"],{blank:function(b){return!a.trim(""+a(b).val())},filled:function(b){var c=a(b).val();return null!==c&&!!a.trim(""+c)},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:void 0===c?b:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&""===this.elementValue(b)||a.inArray(c.keyCode,d)!==-1||(b.name in this.submitted||b.name in this.invalid)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}."),step:a.validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){!this.form&&this.hasAttribute("contenteditable")&&(this.form=a(this).closest("form")[0]);var c=a.data(this.form,"validator"),d="on"+b.type.replace(/^validate/,""),e=c.settings;e[d]&&!a(this).is(e.ignore)&&e[d].call(c,this,b)}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){d[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).on("focusin.validate focusout.validate keyup.validate",":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable]",b).on("click.validate","select, option, [type='radio'], [type='checkbox']",b),this.settings.invalidHandler&&a(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler),a(this.currentForm).find("[required], [data-rule-required], .required").attr("aria-required","true")},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c,d,e=this.clean(b),f=this.validationTargetFor(e),g=this,h=!0;return void 0===f?delete this.invalid[e.name]:(this.prepareElement(f),this.currentElements=a(f),d=this.groups[f.name],d&&a.each(this.groups,function(a,b){b===d&&a!==f.name&&(e=g.validationTargetFor(g.clean(g.findByName(a))),e&&e.name in g.invalid&&(g.currentElements.push(e),h=g.check(e)&&h))}),c=this.check(f)!==!1,h=h&&c,c?this.invalid[f.name]=!1:this.invalid[f.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),a(b).attr("aria-invalid",!c)),h},showErrors:function(b){if(b){var c=this;a.extend(this.errorMap,b),this.errorList=a.map(this.errorMap,function(a,b){return{message:a,element:c.findByName(b)[0]}}),this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var b=this.elements().removeData("previousValue").removeAttr("aria-invalid");this.resetElements(b)},resetElements:function(a){var b;if(this.settings.unhighlight)for(b=0;a[b];b++)this.settings.unhighlight.call(this,a[b],this.settings.errorClass,""),this.findByName(a[b].name).removeClass(this.settings.validClass);else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)a[b]&&c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(a){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea, [contenteditable]").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var d=this.name||a(this).attr("name");return!d&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),this.hasAttribute("contenteditable")&&(this.form=a(this).closest("form")[0]),!(d in c||!b.objectLength(a(this).rules()))&&(c[d]=!0,!0)})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([])},reset:function(){this.resetInternals(),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d,e=a(b),f=b.type;return"radio"===f||"checkbox"===f?this.findByName(b.name).filter(":checked").val():"number"===f&&"undefined"!=typeof b.validity?b.validity.badInput?"NaN":e.val():(c=b.hasAttribute("contenteditable")?e.text():e.val(),"file"===f?"C:\\fakepath\\"===c.substr(0,12)?c.substr(12):(d=c.lastIndexOf("/"),d>=0?c.substr(d+1):(d=c.lastIndexOf("\\"),d>=0?c.substr(d+1):c)):"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f=a(b).rules(),g=a.map(f,function(a,b){return b}).length,h=!1,i=this.elementValue(b);if("function"==typeof f.normalizer){if(i=f.normalizer.call(b,i),"string"!=typeof i)throw new TypeError("The normalizer should return a string value.");delete f.normalizer}for(d in f){e={method:d,parameters:f[d]};try{if(c=a.validator.methods[d].call(this,i,b,e.parameters),"dependency-mismatch"===c&&1===g){h=!0;continue}if(h=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(a){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",a),a instanceof TypeError&&(a.message+=". Exception occurred when checking element "+b.id+", check the '"+e.method+"' method."),a}}if(!h)return this.objectLength(f)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;aWarning: No message defined for "+b.name+""),e=/\$?\{(\d+)\}/g;return"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),d},formatAndAdd:function(a,b){var c=this.defaultMessage(a,b);this.errorList.push({message:c,element:a,method:b.method}),this.errorMap[a.name]=c,this.submitted[a.name]=c},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g,h=this.errorsFor(b),i=this.idOrName(b),j=a(b).attr("aria-describedby");h.length?(h.removeClass(this.settings.validClass).addClass(this.settings.errorClass),h.html(c)):(h=a("<"+this.settings.errorElement+">").attr("id",i+"-error").addClass(this.settings.errorClass).html(c||""),d=h,this.settings.wrapper&&(d=h.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement.call(this,d,a(b)):d.insertAfter(b),h.is("label")?h.attr("for",i):0===h.parents("label[for='"+this.escapeCssMeta(i)+"']").length&&(f=h.attr("id"),j?j.match(new RegExp("\\b"+this.escapeCssMeta(f)+"\\b"))||(j+=" "+f):j=f,a(b).attr("aria-describedby",j),e=this.groups[b.name],e&&(g=this,a.each(g.groups,function(b,c){c===e&&a("[name='"+g.escapeCssMeta(b)+"']",g.currentForm).attr("aria-describedby",h.attr("id"))})))),!c&&this.settings.success&&(h.text(""),"string"==typeof this.settings.success?h.addClass(this.settings.success):this.settings.success(h,b)),this.toShow=this.toShow.add(h)},errorsFor:function(b){var c=this.escapeCssMeta(this.idOrName(b)),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+this.escapeCssMeta(d).replace(/\s+/g,", #")),this.errors().filter(e)},escapeCssMeta:function(a){return a.replace(/([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g,"\\$1")},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+this.escapeCssMeta(b)+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return!this.dependTypes[typeof a]||this.dependTypes[typeof a](a,b)},dependTypes:{boolean:function(a){return a},string:function(b,c){return!!a(b,c.form).length},function:function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(b){this.pending[b.name]||(this.pendingRequest++,a(b).addClass(this.settings.pendingClass),this.pending[b.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass),c&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(a(this.currentForm).submit(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b,c){return c="string"==typeof c&&c||"remote",a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,{method:c})})},destroy:function(){this.resetForm(),a(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("validate-equalTo-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max|step/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&"range"!==b&&(a[c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0===e.param||e.param:(a.data(c.form,"validator").resetElements(a(c)),delete b[d])}}),a.each(b,function(d,e){b[d]=a.isFunction(e)&&"normalizer"!==d?e(c):e}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var c;b[this]&&(a.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(c=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(c[0]),Number(c[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(a)},date:function(a,b){return this.optional(b)||!/Invalid|NaN/.test(new Date(a).toString())},dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},minlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d},maxlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e<=d},rangelength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d[0]&&e<=d[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||a<=c},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},step:function(b,c,d){var e,f=a(c).attr("type"),g="Step attribute on input type "+f+" is not supported.",h=["text","number","range"],i=new RegExp("\\b"+f+"\\b"),j=f&&!i.test(h.join()),k=function(a){var b=(""+a).match(/(?:\.(\d+))?$/);return b&&b[1]?b[1].length:0},l=function(a){return Math.round(a*Math.pow(10,e))},m=!0;if(j)throw new Error(g);return e=k(d),(k(b)>e||l(b)%l(d)!==0)&&(m=!1),this.optional(c)||m},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-equalTo-blur").length&&e.addClass("validate-equalTo-blur").on("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d,e){if(this.optional(c))return"dependency-mismatch";e="string"==typeof e&&e||"remote";var f,g,h,i=this.previousValue(c,e);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),i.originalMessage=i.originalMessage||this.settings.messages[c.name][e],this.settings.messages[c.name][e]=i.message,d="string"==typeof d&&{url:d}||d,h=a.param(a.extend({data:b},d.data)),i.old===h?i.valid:(i.old=h,f=this,this.startRequest(c),g={},g[c.name]=b,a.ajax(a.extend(!0,{mode:"abort",port:"validate"+c.name,dataType:"json",data:g,context:f.currentForm,success:function(a){var d,g,h,j=a===!0||"true"===a;f.settings.messages[c.name][e]=i.originalMessage,j?(h=f.formSubmitted,f.resetInternals(),f.toHide=f.errorsFor(c),f.formSubmitted=h,f.successList.push(c),f.invalid[c.name]=!1,f.showErrors()):(d={},g=a||f.defaultMessage(c,{method:e,parameters:b}),d[c.name]=i.message=g,f.invalid[c.name]=!0,f.showErrors(d)),i.valid=j,f.stopRequest(c,j)}},d)),"pending")}}});var b,c={};a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,d){var e=a.port;"abort"===a.mode&&(c[e]&&c[e].abort(),c[e]=d)}):(b=a.ajax,a.ajax=function(d){var e=("mode"in d?d:a.ajaxSettings).mode,f=("port"in d?d:a.ajaxSettings).port;return"abort"===e?(c[f]&&c[f].abort(),c[f]=b.apply(this,arguments),c[f]):b.apply(this,arguments)})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_ar.js b/styles/bootstrap/validate/localization/messages_ar.js
new file mode 100644
index 000000000..1b9d32654
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_ar.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: AR (Arabic; العربية)
+ */
+$.extend( $.validator.messages, {
+ required: "هذا الحقل إلزامي",
+ remote: "يرجى تصحيح هذا الحقل للمتابعة",
+ email: "رجاء إدخال عنوان بريد إلكتروني صحيح",
+ url: "رجاء إدخال عنوان موقع إلكتروني صحيح",
+ date: "رجاء إدخال تاريخ صحيح",
+ dateISO: "رجاء إدخال تاريخ صحيح (ISO)",
+ number: "رجاء إدخال عدد بطريقة صحيحة",
+ digits: "رجاء إدخال أرقام فقط",
+ creditcard: "رجاء إدخال رقم بطاقة ائتمان صحيح",
+ equalTo: "رجاء إدخال نفس القيمة",
+ extension: "رجاء إدخال ملف بامتداد موافق عليه",
+ maxlength: $.validator.format( "الحد الأقصى لعدد الحروف هو {0}" ),
+ minlength: $.validator.format( "الحد الأدنى لعدد الحروف هو {0}" ),
+ rangelength: $.validator.format( "عدد الحروف يجب أن يكون بين {0} و {1}" ),
+ range: $.validator.format( "رجاء إدخال عدد قيمته بين {0} و {1}" ),
+ max: $.validator.format( "رجاء إدخال عدد أقل من أو يساوي (0}" ),
+ min: $.validator.format( "رجاء إدخال عدد أكبر من أو يساوي (0}" )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_ar.min.js b/styles/bootstrap/validate/localization/messages_ar.min.js
new file mode 100644
index 000000000..06d3aa4c6
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_ar.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"هذا الحقل إلزامي",remote:"يرجى تصحيح هذا الحقل للمتابعة",email:"رجاء إدخال عنوان بريد إلكتروني صحيح",url:"رجاء إدخال عنوان موقع إلكتروني صحيح",date:"رجاء إدخال تاريخ صحيح",dateISO:"رجاء إدخال تاريخ صحيح (ISO)",number:"رجاء إدخال عدد بطريقة صحيحة",digits:"رجاء إدخال أرقام فقط",creditcard:"رجاء إدخال رقم بطاقة ائتمان صحيح",equalTo:"رجاء إدخال نفس القيمة",extension:"رجاء إدخال ملف بامتداد موافق عليه",maxlength:a.validator.format("الحد الأقصى لعدد الحروف هو {0}"),minlength:a.validator.format("الحد الأدنى لعدد الحروف هو {0}"),rangelength:a.validator.format("عدد الحروف يجب أن يكون بين {0} و {1}"),range:a.validator.format("رجاء إدخال عدد قيمته بين {0} و {1}"),max:a.validator.format("رجاء إدخال عدد أقل من أو يساوي (0}"),min:a.validator.format("رجاء إدخال عدد أكبر من أو يساوي (0}")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_bg.js b/styles/bootstrap/validate/localization/messages_bg.js
new file mode 100644
index 000000000..714763078
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_bg.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: BG (Bulgarian; български език)
+ */
+$.extend( $.validator.messages, {
+ required: "Полето е задължително.",
+ remote: "Моля, въведете правилната стойност.",
+ email: "Моля, въведете валиден email.",
+ url: "Моля, въведете валидно URL.",
+ date: "Моля, въведете валидна дата.",
+ dateISO: "Моля, въведете валидна дата (ISO).",
+ number: "Моля, въведете валиден номер.",
+ digits: "Моля, въведете само цифри.",
+ creditcard: "Моля, въведете валиден номер на кредитна карта.",
+ equalTo: "Моля, въведете същата стойност отново.",
+ extension: "Моля, въведете стойност с валидно разширение.",
+ maxlength: $.validator.format( "Моля, въведете повече от {0} символа." ),
+ minlength: $.validator.format( "Моля, въведете поне {0} символа." ),
+ rangelength: $.validator.format( "Моля, въведете стойност с дължина между {0} и {1} символа." ),
+ range: $.validator.format( "Моля, въведете стойност между {0} и {1}." ),
+ max: $.validator.format( "Моля, въведете стойност по-малка или равна на {0}." ),
+ min: $.validator.format( "Моля, въведете стойност по-голяма или равна на {0}." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_bg.min.js b/styles/bootstrap/validate/localization/messages_bg.min.js
new file mode 100644
index 000000000..b149ddbe4
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_bg.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Полето е задължително.",remote:"Моля, въведете правилната стойност.",email:"Моля, въведете валиден email.",url:"Моля, въведете валидно URL.",date:"Моля, въведете валидна дата.",dateISO:"Моля, въведете валидна дата (ISO).",number:"Моля, въведете валиден номер.",digits:"Моля, въведете само цифри.",creditcard:"Моля, въведете валиден номер на кредитна карта.",equalTo:"Моля, въведете същата стойност отново.",extension:"Моля, въведете стойност с валидно разширение.",maxlength:a.validator.format("Моля, въведете повече от {0} символа."),minlength:a.validator.format("Моля, въведете поне {0} символа."),rangelength:a.validator.format("Моля, въведете стойност с дължина между {0} и {1} символа."),range:a.validator.format("Моля, въведете стойност между {0} и {1}."),max:a.validator.format("Моля, въведете стойност по-малка или равна на {0}."),min:a.validator.format("Моля, въведете стойност по-голяма или равна на {0}.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_bn_BD.js b/styles/bootstrap/validate/localization/messages_bn_BD.js
new file mode 100644
index 000000000..ee0ef2aae
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_bn_BD.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: bn_BD (Bengali, Bangladesh)
+ */
+$.extend( $.validator.messages, {
+ required: "এই তথ্যটি আবশ্যক।",
+ remote: "এই তথ্যটি ঠিক করুন।",
+ email: "অনুগ্রহ করে একটি সঠিক মেইল ঠিকানা লিখুন।",
+ url: "অনুগ্রহ করে একটি সঠিক লিঙ্ক দিন।",
+ date: "তারিখ সঠিক নয়।",
+ dateISO: "অনুগ্রহ করে একটি সঠিক (ISO) তারিখ লিখুন।",
+ number: "অনুগ্রহ করে একটি সঠিক নম্বর লিখুন।",
+ digits: "এখানে শুধু সংখ্যা ব্যবহার করা যাবে।",
+ creditcard: "অনুগ্রহ করে একটি ক্রেডিট কার্ডের সঠিক নম্বর লিখুন।",
+ equalTo: "একই মান আবার লিখুন।",
+ extension: "সঠিক ধরনের ফাইল আপলোড করুন।",
+ maxlength: $.validator.format( "{0}টির বেশি অক্ষর লেখা যাবে না।" ),
+ minlength: $.validator.format( "{0}টির কম অক্ষর লেখা যাবে না।" ),
+ rangelength: $.validator.format( "{0} থেকে {1} টি অক্ষর সম্বলিত মান লিখুন।" ),
+ range: $.validator.format( "{0} থেকে {1} এর মধ্যে একটি মান ব্যবহার করুন।" ),
+ max: $.validator.format( "অনুগ্রহ করে {0} বা তার চাইতে কম মান ব্যবহার করুন।" ),
+ min: $.validator.format( "অনুগ্রহ করে {0} বা তার চাইতে বেশি মান ব্যবহার করুন।" )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_bn_BD.min.js b/styles/bootstrap/validate/localization/messages_bn_BD.min.js
new file mode 100644
index 000000000..3b7517cd0
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_bn_BD.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"এই তথ্যটি আবশ্যক।",remote:"এই তথ্যটি ঠিক করুন।",email:"অনুগ্রহ করে একটি সঠিক মেইল ঠিকানা লিখুন।",url:"অনুগ্রহ করে একটি সঠিক লিঙ্ক দিন।",date:"তারিখ সঠিক নয়।",dateISO:"অনুগ্রহ করে একটি সঠিক (ISO) তারিখ লিখুন।",number:"অনুগ্রহ করে একটি সঠিক নম্বর লিখুন।",digits:"এখানে শুধু সংখ্যা ব্যবহার করা যাবে।",creditcard:"অনুগ্রহ করে একটি ক্রেডিট কার্ডের সঠিক নম্বর লিখুন।",equalTo:"একই মান আবার লিখুন।",extension:"সঠিক ধরনের ফাইল আপলোড করুন।",maxlength:a.validator.format("{0}টির বেশি অক্ষর লেখা যাবে না।"),minlength:a.validator.format("{0}টির কম অক্ষর লেখা যাবে না।"),rangelength:a.validator.format("{0} থেকে {1} টি অক্ষর সম্বলিত মান লিখুন।"),range:a.validator.format("{0} থেকে {1} এর মধ্যে একটি মান ব্যবহার করুন।"),max:a.validator.format("অনুগ্রহ করে {0} বা তার চাইতে কম মান ব্যবহার করুন।"),min:a.validator.format("অনুগ্রহ করে {0} বা তার চাইতে বেশি মান ব্যবহার করুন।")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_ca.js b/styles/bootstrap/validate/localization/messages_ca.js
new file mode 100644
index 000000000..42127ab7d
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_ca.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: CA (Catalan; català)
+ */
+$.extend( $.validator.messages, {
+ required: "Aquest camp és obligatori.",
+ remote: "Si us plau, omple aquest camp.",
+ email: "Si us plau, escriu una adreça de correu-e vàlida",
+ url: "Si us plau, escriu una URL vàlida.",
+ date: "Si us plau, escriu una data vàlida.",
+ dateISO: "Si us plau, escriu una data (ISO) vàlida.",
+ number: "Si us plau, escriu un número enter vàlid.",
+ digits: "Si us plau, escriu només dígits.",
+ creditcard: "Si us plau, escriu un número de tarjeta vàlid.",
+ equalTo: "Si us plau, escriu el mateix valor de nou.",
+ extension: "Si us plau, escriu un valor amb una extensió acceptada.",
+ maxlength: $.validator.format( "Si us plau, no escriguis més de {0} caracters." ),
+ minlength: $.validator.format( "Si us plau, no escriguis menys de {0} caracters." ),
+ rangelength: $.validator.format( "Si us plau, escriu un valor entre {0} i {1} caracters." ),
+ range: $.validator.format( "Si us plau, escriu un valor entre {0} i {1}." ),
+ max: $.validator.format( "Si us plau, escriu un valor menor o igual a {0}." ),
+ min: $.validator.format( "Si us plau, escriu un valor major o igual a {0}." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_ca.min.js b/styles/bootstrap/validate/localization/messages_ca.min.js
new file mode 100644
index 000000000..7b114077f
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_ca.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Aquest camp és obligatori.",remote:"Si us plau, omple aquest camp.",email:"Si us plau, escriu una adreça de correu-e vàlida",url:"Si us plau, escriu una URL vàlida.",date:"Si us plau, escriu una data vàlida.",dateISO:"Si us plau, escriu una data (ISO) vàlida.",number:"Si us plau, escriu un número enter vàlid.",digits:"Si us plau, escriu només dígits.",creditcard:"Si us plau, escriu un número de tarjeta vàlid.",equalTo:"Si us plau, escriu el mateix valor de nou.",extension:"Si us plau, escriu un valor amb una extensió acceptada.",maxlength:a.validator.format("Si us plau, no escriguis més de {0} caracters."),minlength:a.validator.format("Si us plau, no escriguis menys de {0} caracters."),rangelength:a.validator.format("Si us plau, escriu un valor entre {0} i {1} caracters."),range:a.validator.format("Si us plau, escriu un valor entre {0} i {1}."),max:a.validator.format("Si us plau, escriu un valor menor o igual a {0}."),min:a.validator.format("Si us plau, escriu un valor major o igual a {0}.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_cs.js b/styles/bootstrap/validate/localization/messages_cs.js
new file mode 100644
index 000000000..011905ed1
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_cs.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: CS (Czech; čeština, český jazyk)
+ */
+$.extend( $.validator.messages, {
+ required: "Tento údaj je povinný.",
+ remote: "Prosím, opravte tento údaj.",
+ email: "Prosím, zadejte platný e-mail.",
+ url: "Prosím, zadejte platné URL.",
+ date: "Prosím, zadejte platné datum.",
+ dateISO: "Prosím, zadejte platné datum (ISO).",
+ number: "Prosím, zadejte číslo.",
+ digits: "Prosím, zadávejte pouze číslice.",
+ creditcard: "Prosím, zadejte číslo kreditní karty.",
+ equalTo: "Prosím, zadejte znovu stejnou hodnotu.",
+ extension: "Prosím, zadejte soubor se správnou příponou.",
+ maxlength: $.validator.format( "Prosím, zadejte nejvíce {0} znaků." ),
+ minlength: $.validator.format( "Prosím, zadejte nejméně {0} znaků." ),
+ rangelength: $.validator.format( "Prosím, zadejte od {0} do {1} znaků." ),
+ range: $.validator.format( "Prosím, zadejte hodnotu od {0} do {1}." ),
+ max: $.validator.format( "Prosím, zadejte hodnotu menší nebo rovnu {0}." ),
+ min: $.validator.format( "Prosím, zadejte hodnotu větší nebo rovnu {0}." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_cs.min.js b/styles/bootstrap/validate/localization/messages_cs.min.js
new file mode 100644
index 000000000..0c632dc25
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_cs.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Tento údaj je povinný.",remote:"Prosím, opravte tento údaj.",email:"Prosím, zadejte platný e-mail.",url:"Prosím, zadejte platné URL.",date:"Prosím, zadejte platné datum.",dateISO:"Prosím, zadejte platné datum (ISO).",number:"Prosím, zadejte číslo.",digits:"Prosím, zadávejte pouze číslice.",creditcard:"Prosím, zadejte číslo kreditní karty.",equalTo:"Prosím, zadejte znovu stejnou hodnotu.",extension:"Prosím, zadejte soubor se správnou příponou.",maxlength:a.validator.format("Prosím, zadejte nejvíce {0} znaků."),minlength:a.validator.format("Prosím, zadejte nejméně {0} znaků."),rangelength:a.validator.format("Prosím, zadejte od {0} do {1} znaků."),range:a.validator.format("Prosím, zadejte hodnotu od {0} do {1}."),max:a.validator.format("Prosím, zadejte hodnotu menší nebo rovnu {0}."),min:a.validator.format("Prosím, zadejte hodnotu větší nebo rovnu {0}.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_da.js b/styles/bootstrap/validate/localization/messages_da.js
new file mode 100644
index 000000000..b232a6c0b
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_da.js
@@ -0,0 +1,32 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: DA (Danish; dansk)
+ */
+$.extend( $.validator.messages, {
+ required: "Dette felt er påkrævet.",
+ maxlength: $.validator.format( "Indtast højst {0} tegn." ),
+ minlength: $.validator.format( "Indtast mindst {0} tegn." ),
+ rangelength: $.validator.format( "Indtast mindst {0} og højst {1} tegn." ),
+ email: "Indtast en gyldig email-adresse.",
+ url: "Indtast en gyldig URL.",
+ date: "Indtast en gyldig dato.",
+ number: "Indtast et tal.",
+ digits: "Indtast kun cifre.",
+ equalTo: "Indtast den samme værdi igen.",
+ range: $.validator.format( "Angiv en værdi mellem {0} og {1}." ),
+ max: $.validator.format( "Angiv en værdi der højst er {0}." ),
+ min: $.validator.format( "Angiv en værdi der mindst er {0}." ),
+ creditcard: "Indtast et gyldigt kreditkortnummer."
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_da.min.js b/styles/bootstrap/validate/localization/messages_da.min.js
new file mode 100644
index 000000000..293c0759c
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_da.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Dette felt er påkrævet.",maxlength:a.validator.format("Indtast højst {0} tegn."),minlength:a.validator.format("Indtast mindst {0} tegn."),rangelength:a.validator.format("Indtast mindst {0} og højst {1} tegn."),email:"Indtast en gyldig email-adresse.",url:"Indtast en gyldig URL.",date:"Indtast en gyldig dato.",number:"Indtast et tal.",digits:"Indtast kun cifre.",equalTo:"Indtast den samme værdi igen.",range:a.validator.format("Angiv en værdi mellem {0} og {1}."),max:a.validator.format("Angiv en værdi der højst er {0}."),min:a.validator.format("Angiv en værdi der mindst er {0}."),creditcard:"Indtast et gyldigt kreditkortnummer."})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_de.js b/styles/bootstrap/validate/localization/messages_de.js
new file mode 100644
index 000000000..00cf31d7c
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_de.js
@@ -0,0 +1,32 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: DE (German, Deutsch)
+ */
+$.extend( $.validator.messages, {
+ required: "Dieses Feld ist ein Pflichtfeld.",
+ maxlength: $.validator.format( "Geben Sie bitte maximal {0} Zeichen ein." ),
+ minlength: $.validator.format( "Geben Sie bitte mindestens {0} Zeichen ein." ),
+ rangelength: $.validator.format( "Geben Sie bitte mindestens {0} und maximal {1} Zeichen ein." ),
+ email: "Geben Sie bitte eine gültige E-Mail Adresse ein.",
+ url: "Geben Sie bitte eine gültige URL ein.",
+ date: "Bitte geben Sie ein gültiges Datum ein.",
+ number: "Geben Sie bitte eine Nummer ein.",
+ digits: "Geben Sie bitte nur Ziffern ein.",
+ equalTo: "Bitte denselben Wert wiederholen.",
+ range: $.validator.format( "Geben Sie bitte einen Wert zwischen {0} und {1} ein." ),
+ max: $.validator.format( "Geben Sie bitte einen Wert kleiner oder gleich {0} ein." ),
+ min: $.validator.format( "Geben Sie bitte einen Wert größer oder gleich {0} ein." ),
+ creditcard: "Geben Sie bitte eine gültige Kreditkarten-Nummer ein."
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_de.min.js b/styles/bootstrap/validate/localization/messages_de.min.js
new file mode 100644
index 000000000..cc01dc0eb
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_de.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Dieses Feld ist ein Pflichtfeld.",maxlength:a.validator.format("Geben Sie bitte maximal {0} Zeichen ein."),minlength:a.validator.format("Geben Sie bitte mindestens {0} Zeichen ein."),rangelength:a.validator.format("Geben Sie bitte mindestens {0} und maximal {1} Zeichen ein."),email:"Geben Sie bitte eine gültige E-Mail Adresse ein.",url:"Geben Sie bitte eine gültige URL ein.",date:"Bitte geben Sie ein gültiges Datum ein.",number:"Geben Sie bitte eine Nummer ein.",digits:"Geben Sie bitte nur Ziffern ein.",equalTo:"Bitte denselben Wert wiederholen.",range:a.validator.format("Geben Sie bitte einen Wert zwischen {0} und {1} ein."),max:a.validator.format("Geben Sie bitte einen Wert kleiner oder gleich {0} ein."),min:a.validator.format("Geben Sie bitte einen Wert größer oder gleich {0} ein."),creditcard:"Geben Sie bitte eine gültige Kreditkarten-Nummer ein."})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_el.js b/styles/bootstrap/validate/localization/messages_el.js
new file mode 100644
index 000000000..64fc3f66f
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_el.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: EL (Greek; ελληνικά)
+ */
+$.extend( $.validator.messages, {
+ required: "Αυτό το πεδίο είναι υποχρεωτικό.",
+ remote: "Παρακαλώ διορθώστε αυτό το πεδίο.",
+ email: "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση email.",
+ url: "Παρακαλώ εισάγετε ένα έγκυρο URL.",
+ date: "Παρακαλώ εισάγετε μια έγκυρη ημερομηνία.",
+ dateISO: "Παρακαλώ εισάγετε μια έγκυρη ημερομηνία (ISO).",
+ number: "Παρακαλώ εισάγετε έναν έγκυρο αριθμό.",
+ digits: "Παρακαλώ εισάγετε μόνο αριθμητικά ψηφία.",
+ creditcard: "Παρακαλώ εισάγετε έναν έγκυρο αριθμό πιστωτικής κάρτας.",
+ equalTo: "Παρακαλώ εισάγετε την ίδια τιμή ξανά.",
+ extension: "Παρακαλώ εισάγετε μια τιμή με έγκυρη επέκταση αρχείου.",
+ maxlength: $.validator.format( "Παρακαλώ εισάγετε μέχρι και {0} χαρακτήρες." ),
+ minlength: $.validator.format( "Παρακαλώ εισάγετε τουλάχιστον {0} χαρακτήρες." ),
+ rangelength: $.validator.format( "Παρακαλώ εισάγετε μια τιμή με μήκος μεταξύ {0} και {1} χαρακτήρων." ),
+ range: $.validator.format( "Παρακαλώ εισάγετε μια τιμή μεταξύ {0} και {1}." ),
+ max: $.validator.format( "Παρακαλώ εισάγετε μια τιμή μικρότερη ή ίση του {0}." ),
+ min: $.validator.format( "Παρακαλώ εισάγετε μια τιμή μεγαλύτερη ή ίση του {0}." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_el.min.js b/styles/bootstrap/validate/localization/messages_el.min.js
new file mode 100644
index 000000000..38feba18c
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_el.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Αυτό το πεδίο είναι υποχρεωτικό.",remote:"Παρακαλώ διορθώστε αυτό το πεδίο.",email:"Παρακαλώ εισάγετε μια έγκυρη διεύθυνση email.",url:"Παρακαλώ εισάγετε ένα έγκυρο URL.",date:"Παρακαλώ εισάγετε μια έγκυρη ημερομηνία.",dateISO:"Παρακαλώ εισάγετε μια έγκυρη ημερομηνία (ISO).",number:"Παρακαλώ εισάγετε έναν έγκυρο αριθμό.",digits:"Παρακαλώ εισάγετε μόνο αριθμητικά ψηφία.",creditcard:"Παρακαλώ εισάγετε έναν έγκυρο αριθμό πιστωτικής κάρτας.",equalTo:"Παρακαλώ εισάγετε την ίδια τιμή ξανά.",extension:"Παρακαλώ εισάγετε μια τιμή με έγκυρη επέκταση αρχείου.",maxlength:a.validator.format("Παρακαλώ εισάγετε μέχρι και {0} χαρακτήρες."),minlength:a.validator.format("Παρακαλώ εισάγετε τουλάχιστον {0} χαρακτήρες."),rangelength:a.validator.format("Παρακαλώ εισάγετε μια τιμή με μήκος μεταξύ {0} και {1} χαρακτήρων."),range:a.validator.format("Παρακαλώ εισάγετε μια τιμή μεταξύ {0} και {1}."),max:a.validator.format("Παρακαλώ εισάγετε μια τιμή μικρότερη ή ίση του {0}."),min:a.validator.format("Παρακαλώ εισάγετε μια τιμή μεγαλύτερη ή ίση του {0}.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_es.js b/styles/bootstrap/validate/localization/messages_es.js
new file mode 100644
index 000000000..f374dee5e
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_es.js
@@ -0,0 +1,38 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: ES (Spanish; Español)
+ */
+$.extend( $.validator.messages, {
+ required: "Este campo es obligatorio.",
+ remote: "Por favor, rellena este campo.",
+ email: "Por favor, escribe una dirección de correo válida.",
+ url: "Por favor, escribe una URL válida.",
+ date: "Por favor, escribe una fecha válida.",
+ dateISO: "Por favor, escribe una fecha (ISO) válida.",
+ number: "Por favor, escribe un número válido.",
+ digits: "Por favor, escribe sólo dígitos.",
+ creditcard: "Por favor, escribe un número de tarjeta válido.",
+ equalTo: "Por favor, escribe el mismo valor de nuevo.",
+ extension: "Por favor, escribe un valor con una extensión aceptada.",
+ maxlength: $.validator.format( "Por favor, no escribas más de {0} caracteres." ),
+ minlength: $.validator.format( "Por favor, no escribas menos de {0} caracteres." ),
+ rangelength: $.validator.format( "Por favor, escribe un valor entre {0} y {1} caracteres." ),
+ range: $.validator.format( "Por favor, escribe un valor entre {0} y {1}." ),
+ max: $.validator.format( "Por favor, escribe un valor menor o igual a {0}." ),
+ min: $.validator.format( "Por favor, escribe un valor mayor o igual a {0}." ),
+ nifES: "Por favor, escribe un NIF válido.",
+ nieES: "Por favor, escribe un NIE válido.",
+ cifES: "Por favor, escribe un CIF válido."
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_es.min.js b/styles/bootstrap/validate/localization/messages_es.min.js
new file mode 100644
index 000000000..6321d03d2
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_es.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Este campo es obligatorio.",remote:"Por favor, rellena este campo.",email:"Por favor, escribe una dirección de correo válida.",url:"Por favor, escribe una URL válida.",date:"Por favor, escribe una fecha válida.",dateISO:"Por favor, escribe una fecha (ISO) válida.",number:"Por favor, escribe un número válido.",digits:"Por favor, escribe sólo dígitos.",creditcard:"Por favor, escribe un número de tarjeta válido.",equalTo:"Por favor, escribe el mismo valor de nuevo.",extension:"Por favor, escribe un valor con una extensión aceptada.",maxlength:a.validator.format("Por favor, no escribas más de {0} caracteres."),minlength:a.validator.format("Por favor, no escribas menos de {0} caracteres."),rangelength:a.validator.format("Por favor, escribe un valor entre {0} y {1} caracteres."),range:a.validator.format("Por favor, escribe un valor entre {0} y {1}."),max:a.validator.format("Por favor, escribe un valor menor o igual a {0}."),min:a.validator.format("Por favor, escribe un valor mayor o igual a {0}."),nifES:"Por favor, escribe un NIF válido.",nieES:"Por favor, escribe un NIE válido.",cifES:"Por favor, escribe un CIF válido."})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_es_AR.js b/styles/bootstrap/validate/localization/messages_es_AR.js
new file mode 100644
index 000000000..9180abdb8
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_es_AR.js
@@ -0,0 +1,39 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: ES (Spanish; Español)
+ * Region: AR (Argentina)
+ */
+$.extend( $.validator.messages, {
+ required: "Este campo es obligatorio.",
+ remote: "Por favor, completá este campo.",
+ email: "Por favor, escribí una dirección de correo válida.",
+ url: "Por favor, escribí una URL válida.",
+ date: "Por favor, escribí una fecha válida.",
+ dateISO: "Por favor, escribí una fecha (ISO) válida.",
+ number: "Por favor, escribí un número entero válido.",
+ digits: "Por favor, escribí sólo dígitos.",
+ creditcard: "Por favor, escribí un número de tarjeta válido.",
+ equalTo: "Por favor, escribí el mismo valor de nuevo.",
+ extension: "Por favor, escribí un valor con una extensión aceptada.",
+ maxlength: $.validator.format( "Por favor, no escribas más de {0} caracteres." ),
+ minlength: $.validator.format( "Por favor, no escribas menos de {0} caracteres." ),
+ rangelength: $.validator.format( "Por favor, escribí un valor entre {0} y {1} caracteres." ),
+ range: $.validator.format( "Por favor, escribí un valor entre {0} y {1}." ),
+ max: $.validator.format( "Por favor, escribí un valor menor o igual a {0}." ),
+ min: $.validator.format( "Por favor, escribí un valor mayor o igual a {0}." ),
+ nifES: "Por favor, escribí un NIF válido.",
+ nieES: "Por favor, escribí un NIE válido.",
+ cifES: "Por favor, escribí un CIF válido."
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_es_AR.min.js b/styles/bootstrap/validate/localization/messages_es_AR.min.js
new file mode 100644
index 000000000..dcd87a6c0
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_es_AR.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Este campo es obligatorio.",remote:"Por favor, completá este campo.",email:"Por favor, escribí una dirección de correo válida.",url:"Por favor, escribí una URL válida.",date:"Por favor, escribí una fecha válida.",dateISO:"Por favor, escribí una fecha (ISO) válida.",number:"Por favor, escribí un número entero válido.",digits:"Por favor, escribí sólo dígitos.",creditcard:"Por favor, escribí un número de tarjeta válido.",equalTo:"Por favor, escribí el mismo valor de nuevo.",extension:"Por favor, escribí un valor con una extensión aceptada.",maxlength:a.validator.format("Por favor, no escribas más de {0} caracteres."),minlength:a.validator.format("Por favor, no escribas menos de {0} caracteres."),rangelength:a.validator.format("Por favor, escribí un valor entre {0} y {1} caracteres."),range:a.validator.format("Por favor, escribí un valor entre {0} y {1}."),max:a.validator.format("Por favor, escribí un valor menor o igual a {0}."),min:a.validator.format("Por favor, escribí un valor mayor o igual a {0}."),nifES:"Por favor, escribí un NIF válido.",nieES:"Por favor, escribí un NIE válido.",cifES:"Por favor, escribí un CIF válido."})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_es_PE.js b/styles/bootstrap/validate/localization/messages_es_PE.js
new file mode 100644
index 000000000..6130a629d
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_es_PE.js
@@ -0,0 +1,39 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: ES (Spanish; Español)
+ * Region: PE (Perú)
+ */
+$.extend( $.validator.messages, {
+ required: "Este campo es obligatorio.",
+ remote: "Por favor, llene este campo.",
+ email: "Por favor, escriba un correo electrónico válido.",
+ url: "Por favor, escriba una URL válida.",
+ date: "Por favor, escriba una fecha válida.",
+ dateISO: "Por favor, escriba una fecha (ISO) válida.",
+ number: "Por favor, escriba un número válido.",
+ digits: "Por favor, escriba sólo dígitos.",
+ creditcard: "Por favor, escriba un número de tarjeta válido.",
+ equalTo: "Por favor, escriba el mismo valor de nuevo.",
+ extension: "Por favor, escriba un valor con una extensión permitida.",
+ maxlength: $.validator.format( "Por favor, no escriba más de {0} caracteres." ),
+ minlength: $.validator.format( "Por favor, no escriba menos de {0} caracteres." ),
+ rangelength: $.validator.format( "Por favor, escriba un valor entre {0} y {1} caracteres." ),
+ range: $.validator.format( "Por favor, escriba un valor entre {0} y {1}." ),
+ max: $.validator.format( "Por favor, escriba un valor menor o igual a {0}." ),
+ min: $.validator.format( "Por favor, escriba un valor mayor o igual a {0}." ),
+ nifES: "Por favor, escriba un NIF válido.",
+ nieES: "Por favor, escriba un NIE válido.",
+ cifES: "Por favor, escriba un CIF válido."
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_es_PE.min.js b/styles/bootstrap/validate/localization/messages_es_PE.min.js
new file mode 100644
index 000000000..55eb7346b
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_es_PE.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Este campo es obligatorio.",remote:"Por favor, llene este campo.",email:"Por favor, escriba un correo electrónico válido.",url:"Por favor, escriba una URL válida.",date:"Por favor, escriba una fecha válida.",dateISO:"Por favor, escriba una fecha (ISO) válida.",number:"Por favor, escriba un número válido.",digits:"Por favor, escriba sólo dígitos.",creditcard:"Por favor, escriba un número de tarjeta válido.",equalTo:"Por favor, escriba el mismo valor de nuevo.",extension:"Por favor, escriba un valor con una extensión permitida.",maxlength:a.validator.format("Por favor, no escriba más de {0} caracteres."),minlength:a.validator.format("Por favor, no escriba menos de {0} caracteres."),rangelength:a.validator.format("Por favor, escriba un valor entre {0} y {1} caracteres."),range:a.validator.format("Por favor, escriba un valor entre {0} y {1}."),max:a.validator.format("Por favor, escriba un valor menor o igual a {0}."),min:a.validator.format("Por favor, escriba un valor mayor o igual a {0}."),nifES:"Por favor, escriba un NIF válido.",nieES:"Por favor, escriba un NIE válido.",cifES:"Por favor, escriba un CIF válido."})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_et.js b/styles/bootstrap/validate/localization/messages_et.js
new file mode 100644
index 000000000..f63118bae
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_et.js
@@ -0,0 +1,33 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: ET (Estonian; eesti, eesti keel)
+ */
+$.extend( $.validator.messages, {
+ required: "See väli peab olema täidetud.",
+ maxlength: $.validator.format( "Palun sisestage vähem kui {0} tähemärki." ),
+ minlength: $.validator.format( "Palun sisestage vähemalt {0} tähemärki." ),
+ rangelength: $.validator.format( "Palun sisestage väärtus vahemikus {0} kuni {1} tähemärki." ),
+ email: "Palun sisestage korrektne e-maili aadress.",
+ url: "Palun sisestage korrektne URL.",
+ date: "Palun sisestage korrektne kuupäev.",
+ dateISO: "Palun sisestage korrektne kuupäev (YYYY-MM-DD).",
+ number: "Palun sisestage korrektne number.",
+ digits: "Palun sisestage ainult numbreid.",
+ equalTo: "Palun sisestage sama väärtus uuesti.",
+ range: $.validator.format( "Palun sisestage väärtus vahemikus {0} kuni {1}." ),
+ max: $.validator.format( "Palun sisestage väärtus, mis on väiksem või võrdne arvuga {0}." ),
+ min: $.validator.format( "Palun sisestage väärtus, mis on suurem või võrdne arvuga {0}." ),
+ creditcard: "Palun sisestage korrektne krediitkaardi number."
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_et.min.js b/styles/bootstrap/validate/localization/messages_et.min.js
new file mode 100644
index 000000000..991fdd4d2
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_et.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"See väli peab olema täidetud.",maxlength:a.validator.format("Palun sisestage vähem kui {0} tähemärki."),minlength:a.validator.format("Palun sisestage vähemalt {0} tähemärki."),rangelength:a.validator.format("Palun sisestage väärtus vahemikus {0} kuni {1} tähemärki."),email:"Palun sisestage korrektne e-maili aadress.",url:"Palun sisestage korrektne URL.",date:"Palun sisestage korrektne kuupäev.",dateISO:"Palun sisestage korrektne kuupäev (YYYY-MM-DD).",number:"Palun sisestage korrektne number.",digits:"Palun sisestage ainult numbreid.",equalTo:"Palun sisestage sama väärtus uuesti.",range:a.validator.format("Palun sisestage väärtus vahemikus {0} kuni {1}."),max:a.validator.format("Palun sisestage väärtus, mis on väiksem või võrdne arvuga {0}."),min:a.validator.format("Palun sisestage väärtus, mis on suurem või võrdne arvuga {0}."),creditcard:"Palun sisestage korrektne krediitkaardi number."})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_eu.js b/styles/bootstrap/validate/localization/messages_eu.js
new file mode 100644
index 000000000..0dc5daddd
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_eu.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: EU (Basque; euskara, euskera)
+ */
+$.extend( $.validator.messages, {
+ required: "Eremu hau beharrezkoa da.",
+ remote: "Mesedez, bete eremu hau.",
+ email: "Mesedez, idatzi baliozko posta helbide bat.",
+ url: "Mesedez, idatzi baliozko URL bat.",
+ date: "Mesedez, idatzi baliozko data bat.",
+ dateISO: "Mesedez, idatzi baliozko (ISO) data bat.",
+ number: "Mesedez, idatzi baliozko zenbaki oso bat.",
+ digits: "Mesedez, idatzi digituak soilik.",
+ creditcard: "Mesedez, idatzi baliozko txartel zenbaki bat.",
+ equalTo: "Mesedez, idatzi berdina berriro ere.",
+ extension: "Mesedez, idatzi onartutako luzapena duen balio bat.",
+ maxlength: $.validator.format( "Mesedez, ez idatzi {0} karaktere baino gehiago." ),
+ minlength: $.validator.format( "Mesedez, ez idatzi {0} karaktere baino gutxiago." ),
+ rangelength: $.validator.format( "Mesedez, idatzi {0} eta {1} karaktere arteko balio bat." ),
+ range: $.validator.format( "Mesedez, idatzi {0} eta {1} arteko balio bat." ),
+ max: $.validator.format( "Mesedez, idatzi {0} edo txikiagoa den balio bat." ),
+ min: $.validator.format( "Mesedez, idatzi {0} edo handiagoa den balio bat." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_eu.min.js b/styles/bootstrap/validate/localization/messages_eu.min.js
new file mode 100644
index 000000000..33d1ed9b6
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_eu.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Eremu hau beharrezkoa da.",remote:"Mesedez, bete eremu hau.",email:"Mesedez, idatzi baliozko posta helbide bat.",url:"Mesedez, idatzi baliozko URL bat.",date:"Mesedez, idatzi baliozko data bat.",dateISO:"Mesedez, idatzi baliozko (ISO) data bat.",number:"Mesedez, idatzi baliozko zenbaki oso bat.",digits:"Mesedez, idatzi digituak soilik.",creditcard:"Mesedez, idatzi baliozko txartel zenbaki bat.",equalTo:"Mesedez, idatzi berdina berriro ere.",extension:"Mesedez, idatzi onartutako luzapena duen balio bat.",maxlength:a.validator.format("Mesedez, ez idatzi {0} karaktere baino gehiago."),minlength:a.validator.format("Mesedez, ez idatzi {0} karaktere baino gutxiago."),rangelength:a.validator.format("Mesedez, idatzi {0} eta {1} karaktere arteko balio bat."),range:a.validator.format("Mesedez, idatzi {0} eta {1} arteko balio bat."),max:a.validator.format("Mesedez, idatzi {0} edo txikiagoa den balio bat."),min:a.validator.format("Mesedez, idatzi {0} edo handiagoa den balio bat.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_fa.js b/styles/bootstrap/validate/localization/messages_fa.js
new file mode 100644
index 000000000..bbb9aea9e
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_fa.js
@@ -0,0 +1,38 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: FA (Persian; فارسی)
+ */
+$.extend( $.validator.messages, {
+ required: "تکمیل این فیلد اجباری است.",
+ remote: "لطفا این فیلد را تصحیح کنید.",
+ email: ".لطفا یک ایمیل صحیح وارد کنید",
+ url: "لطفا آدرس صحیح وارد کنید.",
+ date: "لطفا یک تاریخ صحیح وارد کنید",
+ dateFA: "لطفا یک تاریخ صحیح وارد کنید",
+ dateISO: "لطفا تاریخ صحیح وارد کنید (ISO).",
+ number: "لطفا عدد صحیح وارد کنید.",
+ digits: "لطفا تنها رقم وارد کنید",
+ creditcard: "لطفا کریدیت کارت صحیح وارد کنید.",
+ equalTo: "لطفا مقدار برابری وارد کنید",
+ extension: "لطفا مقداری وارد کنید که ",
+ maxlength: $.validator.format( "لطفا بیشتر از {0} حرف وارد نکنید." ),
+ minlength: $.validator.format( "لطفا کمتر از {0} حرف وارد نکنید." ),
+ rangelength: $.validator.format( "لطفا مقداری بین {0} تا {1} حرف وارد کنید." ),
+ range: $.validator.format( "لطفا مقداری بین {0} تا {1} حرف وارد کنید." ),
+ max: $.validator.format( "لطفا مقداری کمتر از {0} وارد کنید." ),
+ min: $.validator.format( "لطفا مقداری بیشتر از {0} وارد کنید." ),
+ minWords: $.validator.format( "لطفا حداقل {0} کلمه وارد کنید." ),
+ maxWords: $.validator.format( "لطفا حداکثر {0} کلمه وارد کنید." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_fa.min.js b/styles/bootstrap/validate/localization/messages_fa.min.js
new file mode 100644
index 000000000..b1391ef9f
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_fa.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"تکمیل این فیلد اجباری است.",remote:"لطفا این فیلد را تصحیح کنید.",email:".لطفا یک ایمیل صحیح وارد کنید",url:"لطفا آدرس صحیح وارد کنید.",date:"لطفا یک تاریخ صحیح وارد کنید",dateFA:"لطفا یک تاریخ صحیح وارد کنید",dateISO:"لطفا تاریخ صحیح وارد کنید (ISO).",number:"لطفا عدد صحیح وارد کنید.",digits:"لطفا تنها رقم وارد کنید",creditcard:"لطفا کریدیت کارت صحیح وارد کنید.",equalTo:"لطفا مقدار برابری وارد کنید",extension:"لطفا مقداری وارد کنید که ",maxlength:a.validator.format("لطفا بیشتر از {0} حرف وارد نکنید."),minlength:a.validator.format("لطفا کمتر از {0} حرف وارد نکنید."),rangelength:a.validator.format("لطفا مقداری بین {0} تا {1} حرف وارد کنید."),range:a.validator.format("لطفا مقداری بین {0} تا {1} حرف وارد کنید."),max:a.validator.format("لطفا مقداری کمتر از {0} وارد کنید."),min:a.validator.format("لطفا مقداری بیشتر از {0} وارد کنید."),minWords:a.validator.format("لطفا حداقل {0} کلمه وارد کنید."),maxWords:a.validator.format("لطفا حداکثر {0} کلمه وارد کنید.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_fi.js b/styles/bootstrap/validate/localization/messages_fi.js
new file mode 100644
index 000000000..9b031972c
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_fi.js
@@ -0,0 +1,33 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: FI (Finnish; suomi, suomen kieli)
+ */
+$.extend( $.validator.messages, {
+ required: "Tämä kenttä on pakollinen.",
+ email: "Syötä oikea sähköpostiosoite.",
+ url: "Syötä oikea URL-osoite.",
+ date: "Syötä oikea päivämäärä.",
+ dateISO: "Syötä oikea päivämäärä muodossa VVVV-KK-PP.",
+ number: "Syötä luku.",
+ creditcard: "Syötä voimassa oleva luottokorttinumero.",
+ digits: "Syötä pelkästään numeroita.",
+ equalTo: "Syötä sama arvo uudestaan.",
+ maxlength: $.validator.format( "Voit syöttää enintään {0} merkkiä." ),
+ minlength: $.validator.format( "Vähintään {0} merkkiä." ),
+ rangelength: $.validator.format( "Syötä vähintään {0} ja enintään {1} merkkiä." ),
+ range: $.validator.format( "Syötä arvo väliltä {0}–{1}." ),
+ max: $.validator.format( "Syötä arvo, joka on enintään {0}." ),
+ min: $.validator.format( "Syötä arvo, joka on vähintään {0}." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_fi.min.js b/styles/bootstrap/validate/localization/messages_fi.min.js
new file mode 100644
index 000000000..e40fe7ca3
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_fi.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Tämä kenttä on pakollinen.",email:"Syötä oikea sähköpostiosoite.",url:"Syötä oikea URL-osoite.",date:"Syötä oikea päivämäärä.",dateISO:"Syötä oikea päivämäärä muodossa VVVV-KK-PP.",number:"Syötä luku.",creditcard:"Syötä voimassa oleva luottokorttinumero.",digits:"Syötä pelkästään numeroita.",equalTo:"Syötä sama arvo uudestaan.",maxlength:a.validator.format("Voit syöttää enintään {0} merkkiä."),minlength:a.validator.format("Vähintään {0} merkkiä."),rangelength:a.validator.format("Syötä vähintään {0} ja enintään {1} merkkiä."),range:a.validator.format("Syötä arvo väliltä {0}–{1}."),max:a.validator.format("Syötä arvo, joka on enintään {0}."),min:a.validator.format("Syötä arvo, joka on vähintään {0}.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_fr.js b/styles/bootstrap/validate/localization/messages_fr.js
new file mode 100644
index 000000000..326cb4915
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_fr.js
@@ -0,0 +1,61 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: FR (French; français)
+ */
+$.extend( $.validator.messages, {
+ required: "Ce champ est obligatoire.",
+ remote: "Veuillez corriger ce champ.",
+ email: "Veuillez fournir une adresse électronique valide.",
+ url: "Veuillez fournir une adresse URL valide.",
+ date: "Veuillez fournir une date valide.",
+ dateISO: "Veuillez fournir une date valide (ISO).",
+ number: "Veuillez fournir un numéro valide.",
+ digits: "Veuillez fournir seulement des chiffres.",
+ creditcard: "Veuillez fournir un numéro de carte de crédit valide.",
+ equalTo: "Veuillez fournir encore la même valeur.",
+ extension: "Veuillez fournir une valeur avec une extension valide.",
+ maxlength: $.validator.format( "Veuillez fournir au plus {0} caractères." ),
+ minlength: $.validator.format( "Veuillez fournir au moins {0} caractères." ),
+ rangelength: $.validator.format( "Veuillez fournir une valeur qui contient entre {0} et {1} caractères." ),
+ range: $.validator.format( "Veuillez fournir une valeur entre {0} et {1}." ),
+ max: $.validator.format( "Veuillez fournir une valeur inférieure ou égale à {0}." ),
+ min: $.validator.format( "Veuillez fournir une valeur supérieure ou égale à {0}." ),
+ maxWords: $.validator.format( "Veuillez fournir au plus {0} mots." ),
+ minWords: $.validator.format( "Veuillez fournir au moins {0} mots." ),
+ rangeWords: $.validator.format( "Veuillez fournir entre {0} et {1} mots." ),
+ letterswithbasicpunc: "Veuillez fournir seulement des lettres et des signes de ponctuation.",
+ alphanumeric: "Veuillez fournir seulement des lettres, nombres, espaces et soulignages.",
+ lettersonly: "Veuillez fournir seulement des lettres.",
+ nowhitespace: "Veuillez ne pas inscrire d'espaces blancs.",
+ ziprange: "Veuillez fournir un code postal entre 902xx-xxxx et 905-xx-xxxx.",
+ integer: "Veuillez fournir un nombre non décimal qui est positif ou négatif.",
+ vinUS: "Veuillez fournir un numéro d'identification du véhicule (VIN).",
+ dateITA: "Veuillez fournir une date valide.",
+ time: "Veuillez fournir une heure valide entre 00:00 et 23:59.",
+ phoneUS: "Veuillez fournir un numéro de téléphone valide.",
+ phoneUK: "Veuillez fournir un numéro de téléphone valide.",
+ mobileUK: "Veuillez fournir un numéro de téléphone mobile valide.",
+ strippedminlength: $.validator.format( "Veuillez fournir au moins {0} caractères." ),
+ email2: "Veuillez fournir une adresse électronique valide.",
+ url2: "Veuillez fournir une adresse URL valide.",
+ creditcardtypes: "Veuillez fournir un numéro de carte de crédit valide.",
+ ipv4: "Veuillez fournir une adresse IP v4 valide.",
+ ipv6: "Veuillez fournir une adresse IP v6 valide.",
+ require_from_group: "Veuillez fournir au moins {0} de ces champs.",
+ nifES: "Veuillez fournir un numéro NIF valide.",
+ nieES: "Veuillez fournir un numéro NIE valide.",
+ cifES: "Veuillez fournir un numéro CIF valide.",
+ postalCodeCA: "Veuillez fournir un code postal valide."
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_fr.min.js b/styles/bootstrap/validate/localization/messages_fr.min.js
new file mode 100644
index 000000000..aa3742f5c
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_fr.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Ce champ est obligatoire.",remote:"Veuillez corriger ce champ.",email:"Veuillez fournir une adresse électronique valide.",url:"Veuillez fournir une adresse URL valide.",date:"Veuillez fournir une date valide.",dateISO:"Veuillez fournir une date valide (ISO).",number:"Veuillez fournir un numéro valide.",digits:"Veuillez fournir seulement des chiffres.",creditcard:"Veuillez fournir un numéro de carte de crédit valide.",equalTo:"Veuillez fournir encore la même valeur.",extension:"Veuillez fournir une valeur avec une extension valide.",maxlength:a.validator.format("Veuillez fournir au plus {0} caractères."),minlength:a.validator.format("Veuillez fournir au moins {0} caractères."),rangelength:a.validator.format("Veuillez fournir une valeur qui contient entre {0} et {1} caractères."),range:a.validator.format("Veuillez fournir une valeur entre {0} et {1}."),max:a.validator.format("Veuillez fournir une valeur inférieure ou égale à {0}."),min:a.validator.format("Veuillez fournir une valeur supérieure ou égale à {0}."),maxWords:a.validator.format("Veuillez fournir au plus {0} mots."),minWords:a.validator.format("Veuillez fournir au moins {0} mots."),rangeWords:a.validator.format("Veuillez fournir entre {0} et {1} mots."),letterswithbasicpunc:"Veuillez fournir seulement des lettres et des signes de ponctuation.",alphanumeric:"Veuillez fournir seulement des lettres, nombres, espaces et soulignages.",lettersonly:"Veuillez fournir seulement des lettres.",nowhitespace:"Veuillez ne pas inscrire d'espaces blancs.",ziprange:"Veuillez fournir un code postal entre 902xx-xxxx et 905-xx-xxxx.",integer:"Veuillez fournir un nombre non décimal qui est positif ou négatif.",vinUS:"Veuillez fournir un numéro d'identification du véhicule (VIN).",dateITA:"Veuillez fournir une date valide.",time:"Veuillez fournir une heure valide entre 00:00 et 23:59.",phoneUS:"Veuillez fournir un numéro de téléphone valide.",phoneUK:"Veuillez fournir un numéro de téléphone valide.",mobileUK:"Veuillez fournir un numéro de téléphone mobile valide.",strippedminlength:a.validator.format("Veuillez fournir au moins {0} caractères."),email2:"Veuillez fournir une adresse électronique valide.",url2:"Veuillez fournir une adresse URL valide.",creditcardtypes:"Veuillez fournir un numéro de carte de crédit valide.",ipv4:"Veuillez fournir une adresse IP v4 valide.",ipv6:"Veuillez fournir une adresse IP v6 valide.",require_from_group:"Veuillez fournir au moins {0} de ces champs.",nifES:"Veuillez fournir un numéro NIF valide.",nieES:"Veuillez fournir un numéro NIE valide.",cifES:"Veuillez fournir un numéro CIF valide.",postalCodeCA:"Veuillez fournir un code postal valide."})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_ge.js b/styles/bootstrap/validate/localization/messages_ge.js
new file mode 100644
index 000000000..bf5fcf094
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_ge.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/**
+ * @author @tatocaster
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: GE (Georgian; ქართული)
+ */
+$.extend( $.validator.messages, {
+ required: "ეს ველი სავალდებულოა",
+ remote: "გთხოვთ შეასწოროთ.",
+ email: "გთხოვთ შეიყვანოთ სწორი ფორმატით.",
+ url: "გთხოვთ შეიყვანოთ სწორი ფორმატით.",
+ date: "გთხოვთ შეიყვანოთ სწორი თარიღი.",
+ dateISO: "გთხოვთ შეიყვანოთ სწორი ფორმატით (ISO).",
+ number: "გთხოვთ შეიყვანოთ რიცხვი.",
+ digits: "დაშვებულია მხოლოდ ციფრები.",
+ creditcard: "გთხოვთ შეიყვანოთ სწორი ფორმატის ბარათის კოდი.",
+ equalTo: "გთხოვთ შეიყვანოთ იგივე მნიშვნელობა.",
+ maxlength: $.validator.format( "გთხოვთ შეიყვანოთ არა უმეტეს {0} სიმბოლოსი." ),
+ minlength: $.validator.format( "შეიყვანეთ მინიმუმ {0} სიმბოლო." ),
+ rangelength: $.validator.format( "გთხოვთ შეიყვანოთ {0} -დან {1} -მდე რაოდენობის სიმბოლოები." ),
+ range: $.validator.format( "შეიყვანეთ {0} -სა {1} -ს შორის." ),
+ max: $.validator.format( "გთხოვთ შეიყვანოთ მნიშვნელობა ნაკლები ან ტოლი {0} -ს." ),
+ min: $.validator.format( "გთხოვთ შეიყვანოთ მნიშვნელობა მეტი ან ტოლი {0} -ს." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_ge.min.js b/styles/bootstrap/validate/localization/messages_ge.min.js
new file mode 100644
index 000000000..24c3a9a0c
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_ge.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"ეს ველი სავალდებულოა",remote:"გთხოვთ შეასწოროთ.",email:"გთხოვთ შეიყვანოთ სწორი ფორმატით.",url:"გთხოვთ შეიყვანოთ სწორი ფორმატით.",date:"გთხოვთ შეიყვანოთ სწორი თარიღი.",dateISO:"გთხოვთ შეიყვანოთ სწორი ფორმატით (ISO).",number:"გთხოვთ შეიყვანოთ რიცხვი.",digits:"დაშვებულია მხოლოდ ციფრები.",creditcard:"გთხოვთ შეიყვანოთ სწორი ფორმატის ბარათის კოდი.",equalTo:"გთხოვთ შეიყვანოთ იგივე მნიშვნელობა.",maxlength:a.validator.format("გთხოვთ შეიყვანოთ არა უმეტეს {0} სიმბოლოსი."),minlength:a.validator.format("შეიყვანეთ მინიმუმ {0} სიმბოლო."),rangelength:a.validator.format("გთხოვთ შეიყვანოთ {0} -დან {1} -მდე რაოდენობის სიმბოლოები."),range:a.validator.format("შეიყვანეთ {0} -სა {1} -ს შორის."),max:a.validator.format("გთხოვთ შეიყვანოთ მნიშვნელობა ნაკლები ან ტოლი {0} -ს."),min:a.validator.format("გთხოვთ შეიყვანოთ მნიშვნელობა მეტი ან ტოლი {0} -ს.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_gl.js b/styles/bootstrap/validate/localization/messages_gl.js
new file mode 100644
index 000000000..cc13d910c
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_gl.js
@@ -0,0 +1,40 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: GL (Galician; Galego)
+ */
+( function( $ ) {
+ $.extend( $.validator.messages, {
+ required: "Este campo é obrigatorio.",
+ remote: "Por favor, cubre este campo.",
+ email: "Por favor, escribe unha dirección de correo válida.",
+ url: "Por favor, escribe unha URL válida.",
+ date: "Por favor, escribe unha data válida.",
+ dateISO: "Por favor, escribe unha data (ISO) válida.",
+ number: "Por favor, escribe un número válido.",
+ digits: "Por favor, escribe só díxitos.",
+ creditcard: "Por favor, escribe un número de tarxeta válido.",
+ equalTo: "Por favor, escribe o mesmo valor de novo.",
+ extension: "Por favor, escribe un valor cunha extensión aceptada.",
+ maxlength: $.validator.format( "Por favor, non escribas máis de {0} caracteres." ),
+ minlength: $.validator.format( "Por favor, non escribas menos de {0} caracteres." ),
+ rangelength: $.validator.format( "Por favor, escribe un valor entre {0} e {1} caracteres." ),
+ range: $.validator.format( "Por favor, escribe un valor entre {0} e {1}." ),
+ max: $.validator.format( "Por favor, escribe un valor menor ou igual a {0}." ),
+ min: $.validator.format( "Por favor, escribe un valor maior ou igual a {0}." ),
+ nifES: "Por favor, escribe un NIF válido.",
+ nieES: "Por favor, escribe un NIE válido.",
+ cifES: "Por favor, escribe un CIF válido."
+ } );
+}( jQuery ) );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_gl.min.js b/styles/bootstrap/validate/localization/messages_gl.min.js
new file mode 100644
index 000000000..4eed007c1
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_gl.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){!function(a){a.extend(a.validator.messages,{required:"Este campo é obrigatorio.",remote:"Por favor, cubre este campo.",email:"Por favor, escribe unha dirección de correo válida.",url:"Por favor, escribe unha URL válida.",date:"Por favor, escribe unha data válida.",dateISO:"Por favor, escribe unha data (ISO) válida.",number:"Por favor, escribe un número válido.",digits:"Por favor, escribe só díxitos.",creditcard:"Por favor, escribe un número de tarxeta válido.",equalTo:"Por favor, escribe o mesmo valor de novo.",extension:"Por favor, escribe un valor cunha extensión aceptada.",maxlength:a.validator.format("Por favor, non escribas máis de {0} caracteres."),minlength:a.validator.format("Por favor, non escribas menos de {0} caracteres."),rangelength:a.validator.format("Por favor, escribe un valor entre {0} e {1} caracteres."),range:a.validator.format("Por favor, escribe un valor entre {0} e {1}."),max:a.validator.format("Por favor, escribe un valor menor ou igual a {0}."),min:a.validator.format("Por favor, escribe un valor maior ou igual a {0}."),nifES:"Por favor, escribe un NIF válido.",nieES:"Por favor, escribe un NIE válido.",cifES:"Por favor, escribe un CIF válido."})}(jQuery)});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_he.js b/styles/bootstrap/validate/localization/messages_he.js
new file mode 100644
index 000000000..aa725a149
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_he.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: HE (Hebrew; עברית)
+ */
+$.extend( $.validator.messages, {
+ required: "השדה הזה הינו שדה חובה",
+ remote: "נא לתקן שדה זה",
+ email: "נא למלא כתובת דוא\"ל חוקית",
+ url: "נא למלא כתובת אינטרנט חוקית",
+ date: "נא למלא תאריך חוקי",
+ dateISO: "נא למלא תאריך חוקי (ISO)",
+ number: "נא למלא מספר",
+ digits: "נא למלא רק מספרים",
+ creditcard: "נא למלא מספר כרטיס אשראי חוקי",
+ equalTo: "נא למלא את אותו ערך שוב",
+ extension: "נא למלא ערך עם סיומת חוקית",
+ maxlength: $.validator.format( ".נא לא למלא יותר מ- {0} תווים" ),
+ minlength: $.validator.format( "נא למלא לפחות {0} תווים" ),
+ rangelength: $.validator.format( "נא למלא ערך בין {0} ל- {1} תווים" ),
+ range: $.validator.format( "נא למלא ערך בין {0} ל- {1}" ),
+ max: $.validator.format( "נא למלא ערך קטן או שווה ל- {0}" ),
+ min: $.validator.format( "נא למלא ערך גדול או שווה ל- {0}" )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_he.min.js b/styles/bootstrap/validate/localization/messages_he.min.js
new file mode 100644
index 000000000..fefe7ad25
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_he.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"השדה הזה הינו שדה חובה",remote:"נא לתקן שדה זה",email:'נא למלא כתובת דוא"ל חוקית',url:"נא למלא כתובת אינטרנט חוקית",date:"נא למלא תאריך חוקי",dateISO:"נא למלא תאריך חוקי (ISO)",number:"נא למלא מספר",digits:"נא למלא רק מספרים",creditcard:"נא למלא מספר כרטיס אשראי חוקי",equalTo:"נא למלא את אותו ערך שוב",extension:"נא למלא ערך עם סיומת חוקית",maxlength:a.validator.format(".נא לא למלא יותר מ- {0} תווים"),minlength:a.validator.format("נא למלא לפחות {0} תווים"),rangelength:a.validator.format("נא למלא ערך בין {0} ל- {1} תווים"),range:a.validator.format("נא למלא ערך בין {0} ל- {1}"),max:a.validator.format("נא למלא ערך קטן או שווה ל- {0}"),min:a.validator.format("נא למלא ערך גדול או שווה ל- {0}")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_hr.js b/styles/bootstrap/validate/localization/messages_hr.js
new file mode 100644
index 000000000..68e600bdd
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_hr.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: HR (Croatia; hrvatski jezik)
+ */
+$.extend( $.validator.messages, {
+ required: "Ovo polje je obavezno.",
+ remote: "Ovo polje treba popraviti.",
+ email: "Unesite ispravnu e-mail adresu.",
+ url: "Unesite ispravan URL.",
+ date: "Unesite ispravan datum.",
+ dateISO: "Unesite ispravan datum (ISO).",
+ number: "Unesite ispravan broj.",
+ digits: "Unesite samo brojeve.",
+ creditcard: "Unesite ispravan broj kreditne kartice.",
+ equalTo: "Unesite ponovo istu vrijednost.",
+ extension: "Unesite vrijednost sa ispravnom ekstenzijom.",
+ maxlength: $.validator.format( "Maksimalni broj znakova je {0} ." ),
+ minlength: $.validator.format( "Minimalni broj znakova je {0} ." ),
+ rangelength: $.validator.format( "Unesite vrijednost između {0} i {1} znakova." ),
+ range: $.validator.format( "Unesite vrijednost između {0} i {1}." ),
+ max: $.validator.format( "Unesite vrijednost manju ili jednaku {0}." ),
+ min: $.validator.format( "Unesite vrijednost veću ili jednaku {0}." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_hr.min.js b/styles/bootstrap/validate/localization/messages_hr.min.js
new file mode 100644
index 000000000..c721176d9
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_hr.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Ovo polje je obavezno.",remote:"Ovo polje treba popraviti.",email:"Unesite ispravnu e-mail adresu.",url:"Unesite ispravan URL.",date:"Unesite ispravan datum.",dateISO:"Unesite ispravan datum (ISO).",number:"Unesite ispravan broj.",digits:"Unesite samo brojeve.",creditcard:"Unesite ispravan broj kreditne kartice.",equalTo:"Unesite ponovo istu vrijednost.",extension:"Unesite vrijednost sa ispravnom ekstenzijom.",maxlength:a.validator.format("Maksimalni broj znakova je {0} ."),minlength:a.validator.format("Minimalni broj znakova je {0} ."),rangelength:a.validator.format("Unesite vrijednost između {0} i {1} znakova."),range:a.validator.format("Unesite vrijednost između {0} i {1}."),max:a.validator.format("Unesite vrijednost manju ili jednaku {0}."),min:a.validator.format("Unesite vrijednost veću ili jednaku {0}.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_hu.js b/styles/bootstrap/validate/localization/messages_hu.js
new file mode 100644
index 000000000..093c432f5
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_hu.js
@@ -0,0 +1,34 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: HU (Hungarian; Magyar)
+ */
+$.extend( $.validator.messages, {
+ required: "Kötelező megadni.",
+ maxlength: $.validator.format( "Legfeljebb {0} karakter hosszú legyen." ),
+ minlength: $.validator.format( "Legalább {0} karakter hosszú legyen." ),
+ rangelength: $.validator.format( "Legalább {0} és legfeljebb {1} karakter hosszú legyen." ),
+ email: "Érvényes e-mail címnek kell lennie.",
+ url: "Érvényes URL-nek kell lennie.",
+ date: "Dátumnak kell lennie.",
+ number: "Számnak kell lennie.",
+ digits: "Csak számjegyek lehetnek.",
+ equalTo: "Meg kell egyeznie a két értéknek.",
+ range: $.validator.format( "{0} és {1} közé kell esnie." ),
+ max: $.validator.format( "Nem lehet nagyobb, mint {0}." ),
+ min: $.validator.format( "Nem lehet kisebb, mint {0}." ),
+ creditcard: "Érvényes hitelkártyaszámnak kell lennie.",
+ remote: "Kérem javítsa ki ezt a mezőt.",
+ dateISO: "Kérem írjon be egy érvényes dátumot (ISO)."
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_hu.min.js b/styles/bootstrap/validate/localization/messages_hu.min.js
new file mode 100644
index 000000000..8656cf1cc
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_hu.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Kötelező megadni.",maxlength:a.validator.format("Legfeljebb {0} karakter hosszú legyen."),minlength:a.validator.format("Legalább {0} karakter hosszú legyen."),rangelength:a.validator.format("Legalább {0} és legfeljebb {1} karakter hosszú legyen."),email:"Érvényes e-mail címnek kell lennie.",url:"Érvényes URL-nek kell lennie.",date:"Dátumnak kell lennie.",number:"Számnak kell lennie.",digits:"Csak számjegyek lehetnek.",equalTo:"Meg kell egyeznie a két értéknek.",range:a.validator.format("{0} és {1} közé kell esnie."),max:a.validator.format("Nem lehet nagyobb, mint {0}."),min:a.validator.format("Nem lehet kisebb, mint {0}."),creditcard:"Érvényes hitelkártyaszámnak kell lennie.",remote:"Kérem javítsa ki ezt a mezőt.",dateISO:"Kérem írjon be egy érvényes dátumot (ISO)."})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_hy_AM.js b/styles/bootstrap/validate/localization/messages_hy_AM.js
new file mode 100644
index 000000000..7e6fafa57
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_hy_AM.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: HY_AM (Armenian; հայերեն լեզու)
+ */
+$.extend( $.validator.messages, {
+ required: "Պարտադիր լրացման դաշտ",
+ remote: "Ներմուծեք ճիշտ արժեքը",
+ email: "Ներմուծեք վավեր էլեկտրոնային փոստի հասցե",
+ url: "Ներմուծեք վավեր URL",
+ date: "Ներմուծեք վավեր ամսաթիվ",
+ dateISO: "Ներմուծեք ISO ֆորմատով վավեր ամսաթիվ։",
+ number: "Ներմուծեք թիվ",
+ digits: "Ներմուծեք միայն թվեր",
+ creditcard: "Ներմուծեք ճիշտ բանկային քարտի համար",
+ equalTo: "Ներմուծեք միևնուն արժեքը ևս մեկ անգամ",
+ extension: "Ընտրեք ճիշտ ընդլանումով ֆայլ",
+ maxlength: $.validator.format( "Ներմուծեք ոչ ավել քան {0} նիշ" ),
+ minlength: $.validator.format( "Ներմուծեք ոչ պակաս քան {0} նիշ" ),
+ rangelength: $.validator.format( "Ներմուծեք {0}֊ից {1} երկարությամբ արժեք" ),
+ range: $.validator.format( "Ներմուծեք թիվ {0}֊ից {1} միջակայքում" ),
+ max: $.validator.format( "Ներմուծեք թիվ, որը փոքր կամ հավասար է {0}֊ին" ),
+ min: $.validator.format( "Ներմուծեք թիվ, որը մեծ կամ հավասար է {0}֊ին" )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_hy_AM.min.js b/styles/bootstrap/validate/localization/messages_hy_AM.min.js
new file mode 100644
index 000000000..f8acc5847
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_hy_AM.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Պարտադիր լրացման դաշտ",remote:"Ներմուծեք ճիշտ արժեքը",email:"Ներմուծեք վավեր էլեկտրոնային փոստի հասցե",url:"Ներմուծեք վավեր URL",date:"Ներմուծեք վավեր ամսաթիվ",dateISO:"Ներմուծեք ISO ֆորմատով վավեր ամսաթիվ։",number:"Ներմուծեք թիվ",digits:"Ներմուծեք միայն թվեր",creditcard:"Ներմուծեք ճիշտ բանկային քարտի համար",equalTo:"Ներմուծեք միևնուն արժեքը ևս մեկ անգամ",extension:"Ընտրեք ճիշտ ընդլանումով ֆայլ",maxlength:a.validator.format("Ներմուծեք ոչ ավել քան {0} նիշ"),minlength:a.validator.format("Ներմուծեք ոչ պակաս քան {0} նիշ"),rangelength:a.validator.format("Ներմուծեք {0}֊ից {1} երկարությամբ արժեք"),range:a.validator.format("Ներմուծեք թիվ {0}֊ից {1} միջակայքում"),max:a.validator.format("Ներմուծեք թիվ, որը փոքր կամ հավասար է {0}֊ին"),min:a.validator.format("Ներմուծեք թիվ, որը մեծ կամ հավասար է {0}֊ին")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_id.js b/styles/bootstrap/validate/localization/messages_id.js
new file mode 100644
index 000000000..398fd71f5
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_id.js
@@ -0,0 +1,34 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: ID (Indonesia; Indonesian)
+ */
+$.extend( $.validator.messages, {
+ required: "Kolom ini diperlukan.",
+ remote: "Harap benarkan kolom ini.",
+ email: "Silakan masukkan format email yang benar.",
+ url: "Silakan masukkan format URL yang benar.",
+ date: "Silakan masukkan format tanggal yang benar.",
+ dateISO: "Silakan masukkan format tanggal(ISO) yang benar.",
+ number: "Silakan masukkan angka yang benar.",
+ digits: "Harap masukan angka saja.",
+ creditcard: "Harap masukkan format kartu kredit yang benar.",
+ equalTo: "Harap masukkan nilai yg sama dengan sebelumnya.",
+ maxlength: $.validator.format( "Input dibatasi hanya {0} karakter." ),
+ minlength: $.validator.format( "Input tidak kurang dari {0} karakter." ),
+ rangelength: $.validator.format( "Panjang karakter yg diizinkan antara {0} dan {1} karakter." ),
+ range: $.validator.format( "Harap masukkan nilai antara {0} dan {1}." ),
+ max: $.validator.format( "Harap masukkan nilai lebih kecil atau sama dengan {0}." ),
+ min: $.validator.format( "Harap masukkan nilai lebih besar atau sama dengan {0}." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_id.min.js b/styles/bootstrap/validate/localization/messages_id.min.js
new file mode 100644
index 000000000..399597c07
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_id.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Kolom ini diperlukan.",remote:"Harap benarkan kolom ini.",email:"Silakan masukkan format email yang benar.",url:"Silakan masukkan format URL yang benar.",date:"Silakan masukkan format tanggal yang benar.",dateISO:"Silakan masukkan format tanggal(ISO) yang benar.",number:"Silakan masukkan angka yang benar.",digits:"Harap masukan angka saja.",creditcard:"Harap masukkan format kartu kredit yang benar.",equalTo:"Harap masukkan nilai yg sama dengan sebelumnya.",maxlength:a.validator.format("Input dibatasi hanya {0} karakter."),minlength:a.validator.format("Input tidak kurang dari {0} karakter."),rangelength:a.validator.format("Panjang karakter yg diizinkan antara {0} dan {1} karakter."),range:a.validator.format("Harap masukkan nilai antara {0} dan {1}."),max:a.validator.format("Harap masukkan nilai lebih kecil atau sama dengan {0}."),min:a.validator.format("Harap masukkan nilai lebih besar atau sama dengan {0}.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_is.js b/styles/bootstrap/validate/localization/messages_is.js
new file mode 100644
index 000000000..d99e3a1b4
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_is.js
@@ -0,0 +1,33 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: IS (Icelandic; íslenska)
+ */
+$.extend( $.validator.messages, {
+ required: "Þessi reitur er nauðsynlegur.",
+ remote: "Lagaðu þennan reit.",
+ maxlength: $.validator.format( "Sláðu inn mest {0} stafi." ),
+ minlength: $.validator.format( "Sláðu inn minnst {0} stafi." ),
+ rangelength: $.validator.format( "Sláðu inn minnst {0} og mest {1} stafi." ),
+ email: "Sláðu inn gilt netfang.",
+ url: "Sláðu inn gilda vefslóð.",
+ date: "Sláðu inn gilda dagsetningu.",
+ number: "Sláðu inn tölu.",
+ digits: "Sláðu inn tölustafi eingöngu.",
+ equalTo: "Sláðu sama gildi inn aftur.",
+ range: $.validator.format( "Sláðu inn gildi milli {0} og {1}." ),
+ max: $.validator.format( "Sláðu inn gildi sem er minna en eða jafnt og {0}." ),
+ min: $.validator.format( "Sláðu inn gildi sem er stærra en eða jafnt og {0}." ),
+ creditcard: "Sláðu inn gilt greiðslukortanúmer."
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_is.min.js b/styles/bootstrap/validate/localization/messages_is.min.js
new file mode 100644
index 000000000..139dfdd27
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_is.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Þessi reitur er nauðsynlegur.",remote:"Lagaðu þennan reit.",maxlength:a.validator.format("Sláðu inn mest {0} stafi."),minlength:a.validator.format("Sláðu inn minnst {0} stafi."),rangelength:a.validator.format("Sláðu inn minnst {0} og mest {1} stafi."),email:"Sláðu inn gilt netfang.",url:"Sláðu inn gilda vefslóð.",date:"Sláðu inn gilda dagsetningu.",number:"Sláðu inn tölu.",digits:"Sláðu inn tölustafi eingöngu.",equalTo:"Sláðu sama gildi inn aftur.",range:a.validator.format("Sláðu inn gildi milli {0} og {1}."),max:a.validator.format("Sláðu inn gildi sem er minna en eða jafnt og {0}."),min:a.validator.format("Sláðu inn gildi sem er stærra en eða jafnt og {0}."),creditcard:"Sláðu inn gilt greiðslukortanúmer."})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_it.js b/styles/bootstrap/validate/localization/messages_it.js
new file mode 100644
index 000000000..5db4444e4
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_it.js
@@ -0,0 +1,39 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: IT (Italian; Italiano)
+ */
+$.extend( $.validator.messages, {
+ required: "Campo obbligatorio",
+ remote: "Controlla questo campo",
+ email: "Inserisci un indirizzo email valido",
+ url: "Inserisci un indirizzo web valido",
+ date: "Inserisci una data valida",
+ dateISO: "Inserisci una data valida (ISO)",
+ number: "Inserisci un numero valido",
+ digits: "Inserisci solo numeri",
+ creditcard: "Inserisci un numero di carta di credito valido",
+ equalTo: "Il valore non corrisponde",
+ extension: "Inserisci un valore con un'estensione valida",
+ maxlength: $.validator.format( "Non inserire più di {0} caratteri" ),
+ minlength: $.validator.format( "Inserisci almeno {0} caratteri" ),
+ rangelength: $.validator.format( "Inserisci un valore compreso tra {0} e {1} caratteri" ),
+ range: $.validator.format( "Inserisci un valore compreso tra {0} e {1}" ),
+ max: $.validator.format( "Inserisci un valore minore o uguale a {0}" ),
+ min: $.validator.format( "Inserisci un valore maggiore o uguale a {0}" ),
+ nifES: "Inserisci un NIF valido",
+ nieES: "Inserisci un NIE valido",
+ cifES: "Inserisci un CIF valido",
+ currency: "Inserisci una valuta valida"
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_it.min.js b/styles/bootstrap/validate/localization/messages_it.min.js
new file mode 100644
index 000000000..eea8251b4
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_it.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Campo obbligatorio",remote:"Controlla questo campo",email:"Inserisci un indirizzo email valido",url:"Inserisci un indirizzo web valido",date:"Inserisci una data valida",dateISO:"Inserisci una data valida (ISO)",number:"Inserisci un numero valido",digits:"Inserisci solo numeri",creditcard:"Inserisci un numero di carta di credito valido",equalTo:"Il valore non corrisponde",extension:"Inserisci un valore con un'estensione valida",maxlength:a.validator.format("Non inserire più di {0} caratteri"),minlength:a.validator.format("Inserisci almeno {0} caratteri"),rangelength:a.validator.format("Inserisci un valore compreso tra {0} e {1} caratteri"),range:a.validator.format("Inserisci un valore compreso tra {0} e {1}"),max:a.validator.format("Inserisci un valore minore o uguale a {0}"),min:a.validator.format("Inserisci un valore maggiore o uguale a {0}"),nifES:"Inserisci un NIF valido",nieES:"Inserisci un NIE valido",cifES:"Inserisci un CIF valido",currency:"Inserisci una valuta valida"})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_ja.js b/styles/bootstrap/validate/localization/messages_ja.js
new file mode 100644
index 000000000..648fd263f
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_ja.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: JA (Japanese; 日本語)
+ */
+$.extend( $.validator.messages, {
+ required: "このフィールドは必須です。",
+ remote: "このフィールドを修正してください。",
+ email: "有効なEメールアドレスを入力してください。",
+ url: "有効なURLを入力してください。",
+ date: "有効な日付を入力してください。",
+ dateISO: "有効な日付(ISO)を入力してください。",
+ number: "有効な数字を入力してください。",
+ digits: "数字のみを入力してください。",
+ creditcard: "有効なクレジットカード番号を入力してください。",
+ equalTo: "同じ値をもう一度入力してください。",
+ extension: "有効な拡張子を含む値を入力してください。",
+ maxlength: $.validator.format( "{0} 文字以内で入力してください。" ),
+ minlength: $.validator.format( "{0} 文字以上で入力してください。" ),
+ rangelength: $.validator.format( "{0} 文字から {1} 文字までの値を入力してください。" ),
+ range: $.validator.format( "{0} から {1} までの値を入力してください。" ),
+ max: $.validator.format( "{0} 以下の値を入力してください。" ),
+ min: $.validator.format( "{0} 以上の値を入力してください。" )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_ja.min.js b/styles/bootstrap/validate/localization/messages_ja.min.js
new file mode 100644
index 000000000..d25c4286c
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_ja.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"このフィールドは必須です。",remote:"このフィールドを修正してください。",email:"有効なEメールアドレスを入力してください。",url:"有効なURLを入力してください。",date:"有効な日付を入力してください。",dateISO:"有効な日付(ISO)を入力してください。",number:"有効な数字を入力してください。",digits:"数字のみを入力してください。",creditcard:"有効なクレジットカード番号を入力してください。",equalTo:"同じ値をもう一度入力してください。",extension:"有効な拡張子を含む値を入力してください。",maxlength:a.validator.format("{0} 文字以内で入力してください。"),minlength:a.validator.format("{0} 文字以上で入力してください。"),rangelength:a.validator.format("{0} 文字から {1} 文字までの値を入力してください。"),range:a.validator.format("{0} から {1} までの値を入力してください。"),max:a.validator.format("{0} 以下の値を入力してください。"),min:a.validator.format("{0} 以上の値を入力してください。")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_ka.js b/styles/bootstrap/validate/localization/messages_ka.js
new file mode 100644
index 000000000..c8e9feff4
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_ka.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: KA (Georgian; ქართული)
+ */
+$.extend( $.validator.messages, {
+ required: "ამ ველის შევსება აუცილებელია.",
+ remote: "გთხოვთ მიუთითოთ სწორი მნიშვნელობა.",
+ email: "გთხოვთ მიუთითოთ ელ-ფოსტის კორექტული მისამართი.",
+ url: "გთხოვთ მიუთითოთ კორექტული URL.",
+ date: "გთხოვთ მიუთითოთ კორექტული თარიღი.",
+ dateISO: "გთხოვთ მიუთითოთ კორექტული თარიღი ISO ფორმატში.",
+ number: "გთხოვთ მიუთითოთ ციფრი.",
+ digits: "გთხოვთ მიუთითოთ მხოლოდ ციფრები.",
+ creditcard: "გთხოვთ მიუთითოთ საკრედიტო ბარათის კორექტული ნომერი.",
+ equalTo: "გთხოვთ მიუთითოთ ასეთივე მნიშვნელობა კიდევ ერთხელ.",
+ extension: "გთხოვთ აირჩიოთ ფაილი კორექტული გაფართოებით.",
+ maxlength: $.validator.format( "დასაშვებია არაუმეტეს {0} სიმბოლო." ),
+ minlength: $.validator.format( "აუცილებელია შეიყვანოთ მინიმუმ {0} სიმბოლო." ),
+ rangelength: $.validator.format( "ტექსტში სიმბოლოების რაოდენობა უნდა იყოს {0}-დან {1}-მდე." ),
+ range: $.validator.format( "გთხოვთ შეიყვანოთ ციფრი {0}-დან {1}-მდე." ),
+ max: $.validator.format( "გთხოვთ შეიყვანოთ ციფრი რომელიც ნაკლებია ან უდრის {0}-ს." ),
+ min: $.validator.format( "გთხოვთ შეიყვანოთ ციფრი რომელიც მეტია ან უდრის {0}-ს." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_ka.min.js b/styles/bootstrap/validate/localization/messages_ka.min.js
new file mode 100644
index 000000000..94179c5e4
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_ka.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"ამ ველის შევსება აუცილებელია.",remote:"გთხოვთ მიუთითოთ სწორი მნიშვნელობა.",email:"გთხოვთ მიუთითოთ ელ-ფოსტის კორექტული მისამართი.",url:"გთხოვთ მიუთითოთ კორექტული URL.",date:"გთხოვთ მიუთითოთ კორექტული თარიღი.",dateISO:"გთხოვთ მიუთითოთ კორექტული თარიღი ISO ფორმატში.",number:"გთხოვთ მიუთითოთ ციფრი.",digits:"გთხოვთ მიუთითოთ მხოლოდ ციფრები.",creditcard:"გთხოვთ მიუთითოთ საკრედიტო ბარათის კორექტული ნომერი.",equalTo:"გთხოვთ მიუთითოთ ასეთივე მნიშვნელობა კიდევ ერთხელ.",extension:"გთხოვთ აირჩიოთ ფაილი კორექტული გაფართოებით.",maxlength:a.validator.format("დასაშვებია არაუმეტეს {0} სიმბოლო."),minlength:a.validator.format("აუცილებელია შეიყვანოთ მინიმუმ {0} სიმბოლო."),rangelength:a.validator.format("ტექსტში სიმბოლოების რაოდენობა უნდა იყოს {0}-დან {1}-მდე."),range:a.validator.format("გთხოვთ შეიყვანოთ ციფრი {0}-დან {1}-მდე."),max:a.validator.format("გთხოვთ შეიყვანოთ ციფრი რომელიც ნაკლებია ან უდრის {0}-ს."),min:a.validator.format("გთხოვთ შეიყვანოთ ციფრი რომელიც მეტია ან უდრის {0}-ს.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_kk.js b/styles/bootstrap/validate/localization/messages_kk.js
new file mode 100644
index 000000000..5f2e97844
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_kk.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: KK (Kazakh; қазақ тілі)
+ */
+$.extend( $.validator.messages, {
+ required: "Бұл өрісті міндетті түрде толтырыңыз.",
+ remote: "Дұрыс мағына енгізуіңізді сұраймыз.",
+ email: "Нақты электронды поштаңызды енгізуіңізді сұраймыз.",
+ url: "Нақты URL-ды енгізуіңізді сұраймыз.",
+ date: "Нақты URL-ды енгізуіңізді сұраймыз.",
+ dateISO: "Нақты ISO форматымен сәйкес датасын енгізуіңізді сұраймыз.",
+ number: "Күнді енгізуіңізді сұраймыз.",
+ digits: "Тек қана сандарды енгізуіңізді сұраймыз.",
+ creditcard: "Несие картасының нөмірін дұрыс енгізуіңізді сұраймыз.",
+ equalTo: "Осы мәнді қайта енгізуіңізді сұраймыз.",
+ extension: "Файлдың кеңейтуін дұрыс таңдаңыз.",
+ maxlength: $.validator.format( "Ұзындығы {0} символдан көр болмасын." ),
+ minlength: $.validator.format( "Ұзындығы {0} символдан аз болмасын." ),
+ rangelength: $.validator.format( "Ұзындығы {0}-{1} дейін мән енгізуіңізді сұраймыз." ),
+ range: $.validator.format( "Пожалуйста, введите число от {0} до {1}. - {0} - {1} санын енгізуіңізді сұраймыз." ),
+ max: $.validator.format( "{0} аз немесе тең санын енгізуіңіді сұраймыз." ),
+ min: $.validator.format( "{0} көп немесе тең санын енгізуіңізді сұраймыз." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_kk.min.js b/styles/bootstrap/validate/localization/messages_kk.min.js
new file mode 100644
index 000000000..5ac8d2313
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_kk.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Бұл өрісті міндетті түрде толтырыңыз.",remote:"Дұрыс мағына енгізуіңізді сұраймыз.",email:"Нақты электронды поштаңызды енгізуіңізді сұраймыз.",url:"Нақты URL-ды енгізуіңізді сұраймыз.",date:"Нақты URL-ды енгізуіңізді сұраймыз.",dateISO:"Нақты ISO форматымен сәйкес датасын енгізуіңізді сұраймыз.",number:"Күнді енгізуіңізді сұраймыз.",digits:"Тек қана сандарды енгізуіңізді сұраймыз.",creditcard:"Несие картасының нөмірін дұрыс енгізуіңізді сұраймыз.",equalTo:"Осы мәнді қайта енгізуіңізді сұраймыз.",extension:"Файлдың кеңейтуін дұрыс таңдаңыз.",maxlength:a.validator.format("Ұзындығы {0} символдан көр болмасын."),minlength:a.validator.format("Ұзындығы {0} символдан аз болмасын."),rangelength:a.validator.format("Ұзындығы {0}-{1} дейін мән енгізуіңізді сұраймыз."),range:a.validator.format("Пожалуйста, введите число от {0} до {1}. - {0} - {1} санын енгізуіңізді сұраймыз."),max:a.validator.format("{0} аз немесе тең санын енгізуіңіді сұраймыз."),min:a.validator.format("{0} көп немесе тең санын енгізуіңізді сұраймыз.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_ko.js b/styles/bootstrap/validate/localization/messages_ko.js
new file mode 100644
index 000000000..93920ae6e
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_ko.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: KO (Korean; 한국어)
+ */
+$.extend( $.validator.messages, {
+ required: "필수 항목입니다.",
+ remote: "항목을 수정하세요.",
+ email: "유효하지 않은 E-Mail주소입니다.",
+ url: "유효하지 않은 URL입니다.",
+ date: "올바른 날짜를 입력하세요.",
+ dateISO: "올바른 날짜(ISO)를 입력하세요.",
+ number: "유효한 숫자가 아닙니다.",
+ digits: "숫자만 입력 가능합니다.",
+ creditcard: "신용카드 번호가 바르지 않습니다.",
+ equalTo: "같은 값을 다시 입력하세요.",
+ extension: "올바른 확장자가 아닙니다.",
+ maxlength: $.validator.format( "{0}자를 넘을 수 없습니다. " ),
+ minlength: $.validator.format( "{0}자 이상 입력하세요." ),
+ rangelength: $.validator.format( "문자 길이가 {0} 에서 {1} 사이의 값을 입력하세요." ),
+ range: $.validator.format( "{0} 에서 {1} 사이의 값을 입력하세요." ),
+ max: $.validator.format( "{0} 이하의 값을 입력하세요." ),
+ min: $.validator.format( "{0} 이상의 값을 입력하세요." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_ko.min.js b/styles/bootstrap/validate/localization/messages_ko.min.js
new file mode 100644
index 000000000..f241aaf92
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_ko.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"필수 항목입니다.",remote:"항목을 수정하세요.",email:"유효하지 않은 E-Mail주소입니다.",url:"유효하지 않은 URL입니다.",date:"올바른 날짜를 입력하세요.",dateISO:"올바른 날짜(ISO)를 입력하세요.",number:"유효한 숫자가 아닙니다.",digits:"숫자만 입력 가능합니다.",creditcard:"신용카드 번호가 바르지 않습니다.",equalTo:"같은 값을 다시 입력하세요.",extension:"올바른 확장자가 아닙니다.",maxlength:a.validator.format("{0}자를 넘을 수 없습니다. "),minlength:a.validator.format("{0}자 이상 입력하세요."),rangelength:a.validator.format("문자 길이가 {0} 에서 {1} 사이의 값을 입력하세요."),range:a.validator.format("{0} 에서 {1} 사이의 값을 입력하세요."),max:a.validator.format("{0} 이하의 값을 입력하세요."),min:a.validator.format("{0} 이상의 값을 입력하세요.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_lt.js b/styles/bootstrap/validate/localization/messages_lt.js
new file mode 100644
index 000000000..87c3ec86c
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_lt.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: LT (Lithuanian; lietuvių kalba)
+ */
+$.extend( $.validator.messages, {
+ required: "Šis laukas yra privalomas.",
+ remote: "Prašau pataisyti šį lauką.",
+ email: "Prašau įvesti teisingą elektroninio pašto adresą.",
+ url: "Prašau įvesti teisingą URL.",
+ date: "Prašau įvesti teisingą datą.",
+ dateISO: "Prašau įvesti teisingą datą (ISO).",
+ number: "Prašau įvesti teisingą skaičių.",
+ digits: "Prašau naudoti tik skaitmenis.",
+ creditcard: "Prašau įvesti teisingą kreditinės kortelės numerį.",
+ equalTo: "Prašau įvestį tą pačią reikšmę dar kartą.",
+ extension: "Prašau įvesti reikšmę su teisingu plėtiniu.",
+ maxlength: $.validator.format( "Prašau įvesti ne daugiau kaip {0} simbolių." ),
+ minlength: $.validator.format( "Prašau įvesti bent {0} simbolius." ),
+ rangelength: $.validator.format( "Prašau įvesti reikšmes, kurių ilgis nuo {0} iki {1} simbolių." ),
+ range: $.validator.format( "Prašau įvesti reikšmę intervale nuo {0} iki {1}." ),
+ max: $.validator.format( "Prašau įvesti reikšmę mažesnę arba lygią {0}." ),
+ min: $.validator.format( "Prašau įvesti reikšmę didesnę arba lygią {0}." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_lt.min.js b/styles/bootstrap/validate/localization/messages_lt.min.js
new file mode 100644
index 000000000..8aacda224
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_lt.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Šis laukas yra privalomas.",remote:"Prašau pataisyti šį lauką.",email:"Prašau įvesti teisingą elektroninio pašto adresą.",url:"Prašau įvesti teisingą URL.",date:"Prašau įvesti teisingą datą.",dateISO:"Prašau įvesti teisingą datą (ISO).",number:"Prašau įvesti teisingą skaičių.",digits:"Prašau naudoti tik skaitmenis.",creditcard:"Prašau įvesti teisingą kreditinės kortelės numerį.",equalTo:"Prašau įvestį tą pačią reikšmę dar kartą.",extension:"Prašau įvesti reikšmę su teisingu plėtiniu.",maxlength:a.validator.format("Prašau įvesti ne daugiau kaip {0} simbolių."),minlength:a.validator.format("Prašau įvesti bent {0} simbolius."),rangelength:a.validator.format("Prašau įvesti reikšmes, kurių ilgis nuo {0} iki {1} simbolių."),range:a.validator.format("Prašau įvesti reikšmę intervale nuo {0} iki {1}."),max:a.validator.format("Prašau įvesti reikšmę mažesnę arba lygią {0}."),min:a.validator.format("Prašau įvesti reikšmę didesnę arba lygią {0}.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_lv.js b/styles/bootstrap/validate/localization/messages_lv.js
new file mode 100644
index 000000000..5b5e2aa22
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_lv.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: LV (Latvian; latviešu valoda)
+ */
+$.extend( $.validator.messages, {
+ required: "Šis lauks ir obligāts.",
+ remote: "Lūdzu, pārbaudiet šo lauku.",
+ email: "Lūdzu, ievadiet derīgu e-pasta adresi.",
+ url: "Lūdzu, ievadiet derīgu URL adresi.",
+ date: "Lūdzu, ievadiet derīgu datumu.",
+ dateISO: "Lūdzu, ievadiet derīgu datumu (ISO).",
+ number: "Lūdzu, ievadiet derīgu numuru.",
+ digits: "Lūdzu, ievadiet tikai ciparus.",
+ creditcard: "Lūdzu, ievadiet derīgu kredītkartes numuru.",
+ equalTo: "Lūdzu, ievadiet to pašu vēlreiz.",
+ extension: "Lūdzu, ievadiet vērtību ar derīgu paplašinājumu.",
+ maxlength: $.validator.format( "Lūdzu, ievadiet ne vairāk kā {0} rakstzīmes." ),
+ minlength: $.validator.format( "Lūdzu, ievadiet vismaz {0} rakstzīmes." ),
+ rangelength: $.validator.format( "Lūdzu ievadiet {0} līdz {1} rakstzīmes." ),
+ range: $.validator.format( "Lūdzu, ievadiet skaitli no {0} līdz {1}." ),
+ max: $.validator.format( "Lūdzu, ievadiet skaitli, kurš ir mazāks vai vienāds ar {0}." ),
+ min: $.validator.format( "Lūdzu, ievadiet skaitli, kurš ir lielāks vai vienāds ar {0}." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_lv.min.js b/styles/bootstrap/validate/localization/messages_lv.min.js
new file mode 100644
index 000000000..898e25bc9
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_lv.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Šis lauks ir obligāts.",remote:"Lūdzu, pārbaudiet šo lauku.",email:"Lūdzu, ievadiet derīgu e-pasta adresi.",url:"Lūdzu, ievadiet derīgu URL adresi.",date:"Lūdzu, ievadiet derīgu datumu.",dateISO:"Lūdzu, ievadiet derīgu datumu (ISO).",number:"Lūdzu, ievadiet derīgu numuru.",digits:"Lūdzu, ievadiet tikai ciparus.",creditcard:"Lūdzu, ievadiet derīgu kredītkartes numuru.",equalTo:"Lūdzu, ievadiet to pašu vēlreiz.",extension:"Lūdzu, ievadiet vērtību ar derīgu paplašinājumu.",maxlength:a.validator.format("Lūdzu, ievadiet ne vairāk kā {0} rakstzīmes."),minlength:a.validator.format("Lūdzu, ievadiet vismaz {0} rakstzīmes."),rangelength:a.validator.format("Lūdzu ievadiet {0} līdz {1} rakstzīmes."),range:a.validator.format("Lūdzu, ievadiet skaitli no {0} līdz {1}."),max:a.validator.format("Lūdzu, ievadiet skaitli, kurš ir mazāks vai vienāds ar {0}."),min:a.validator.format("Lūdzu, ievadiet skaitli, kurš ir lielāks vai vienāds ar {0}.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_mk.js b/styles/bootstrap/validate/localization/messages_mk.js
new file mode 100644
index 000000000..c31e7f674
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_mk.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: MK (Macedonian; македонски јазик)
+ */
+$.extend( $.validator.messages, {
+ required: "Полето е задолжително.",
+ remote: "Поправете го ова поле",
+ email: "Внесете правилна e-mail адреса",
+ url: "Внесете правилен URL.",
+ date: "Внесете правилен датум",
+ dateISO: "Внесете правилен датум (ISO).",
+ number: "Внесете правилен број.",
+ digits: "Внесете само бројки.",
+ creditcard: "Внесете правилен број на кредитната картичка.",
+ equalTo: "Внесете ја истата вредност повторно.",
+ extension: "Внесете вредност со соодветна екстензија.",
+ maxlength: $.validator.format( "Внесете максимално {0} знаци." ),
+ minlength: $.validator.format( "Внесете барем {0} знаци." ),
+ rangelength: $.validator.format( "Внесете вредност со должина помеѓу {0} и {1} знаци." ),
+ range: $.validator.format( "Внесете вредност помеѓу {0} и {1}." ),
+ max: $.validator.format( "Внесете вредност помала или еднаква на {0}." ),
+ min: $.validator.format( "Внесете вредност поголема или еднаква на {0}" )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_mk.min.js b/styles/bootstrap/validate/localization/messages_mk.min.js
new file mode 100644
index 000000000..1af8ae983
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_mk.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Полето е задолжително.",remote:"Поправете го ова поле",email:"Внесете правилна e-mail адреса",url:"Внесете правилен URL.",date:"Внесете правилен датум",dateISO:"Внесете правилен датум (ISO).",number:"Внесете правилен број.",digits:"Внесете само бројки.",creditcard:"Внесете правилен број на кредитната картичка.",equalTo:"Внесете ја истата вредност повторно.",extension:"Внесете вредност со соодветна екстензија.",maxlength:a.validator.format("Внесете максимално {0} знаци."),minlength:a.validator.format("Внесете барем {0} знаци."),rangelength:a.validator.format("Внесете вредност со должина помеѓу {0} и {1} знаци."),range:a.validator.format("Внесете вредност помеѓу {0} и {1}."),max:a.validator.format("Внесете вредност помала или еднаква на {0}."),min:a.validator.format("Внесете вредност поголема или еднаква на {0}")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_my.js b/styles/bootstrap/validate/localization/messages_my.js
new file mode 100644
index 000000000..868b315d0
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_my.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: MY (Malay; Melayu)
+ */
+$.extend( $.validator.messages, {
+ required: "Medan ini diperlukan.",
+ remote: "Sila betulkan medan ini.",
+ email: "Sila masukkan alamat emel yang betul.",
+ url: "Sila masukkan URL yang betul.",
+ date: "Sila masukkan tarikh yang betul.",
+ dateISO: "Sila masukkan tarikh(ISO) yang betul.",
+ number: "Sila masukkan nombor yang betul.",
+ digits: "Sila masukkan nilai digit sahaja.",
+ creditcard: "Sila masukkan nombor kredit kad yang betul.",
+ equalTo: "Sila masukkan nilai yang sama semula.",
+ extension: "Sila masukkan nilai yang telah diterima.",
+ maxlength: $.validator.format( "Sila masukkan tidak lebih dari {0} aksara." ),
+ minlength: $.validator.format( "Sila masukkan sekurang-kurangnya {0} aksara." ),
+ rangelength: $.validator.format( "Sila masukkan antara {0} dan {1} panjang aksara." ),
+ range: $.validator.format( "Sila masukkan nilai antara {0} dan {1} aksara." ),
+ max: $.validator.format( "Sila masukkan nilai yang kurang atau sama dengan {0}." ),
+ min: $.validator.format( "Sila masukkan nilai yang lebih atau sama dengan {0}." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_my.min.js b/styles/bootstrap/validate/localization/messages_my.min.js
new file mode 100644
index 000000000..517cfc2ee
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_my.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Medan ini diperlukan.",remote:"Sila betulkan medan ini.",email:"Sila masukkan alamat emel yang betul.",url:"Sila masukkan URL yang betul.",date:"Sila masukkan tarikh yang betul.",dateISO:"Sila masukkan tarikh(ISO) yang betul.",number:"Sila masukkan nombor yang betul.",digits:"Sila masukkan nilai digit sahaja.",creditcard:"Sila masukkan nombor kredit kad yang betul.",equalTo:"Sila masukkan nilai yang sama semula.",extension:"Sila masukkan nilai yang telah diterima.",maxlength:a.validator.format("Sila masukkan tidak lebih dari {0} aksara."),minlength:a.validator.format("Sila masukkan sekurang-kurangnya {0} aksara."),rangelength:a.validator.format("Sila masukkan antara {0} dan {1} panjang aksara."),range:a.validator.format("Sila masukkan nilai antara {0} dan {1} aksara."),max:a.validator.format("Sila masukkan nilai yang kurang atau sama dengan {0}."),min:a.validator.format("Sila masukkan nilai yang lebih atau sama dengan {0}.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_nl.js b/styles/bootstrap/validate/localization/messages_nl.js
new file mode 100644
index 000000000..68fd37b37
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_nl.js
@@ -0,0 +1,45 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: NL (Dutch; Nederlands, Vlaams)
+ */
+$.extend( $.validator.messages, {
+ required: "Dit is een verplicht veld.",
+ remote: "Controleer dit veld.",
+ email: "Vul hier een geldig e-mailadres in.",
+ url: "Vul hier een geldige URL in.",
+ date: "Vul hier een geldige datum in.",
+ dateISO: "Vul hier een geldige datum in (ISO-formaat).",
+ number: "Vul hier een geldig getal in.",
+ digits: "Vul hier alleen getallen in.",
+ creditcard: "Vul hier een geldig creditcardnummer in.",
+ equalTo: "Vul hier dezelfde waarde in.",
+ extension: "Vul hier een waarde in met een geldige extensie.",
+ maxlength: $.validator.format( "Vul hier maximaal {0} tekens in." ),
+ minlength: $.validator.format( "Vul hier minimaal {0} tekens in." ),
+ rangelength: $.validator.format( "Vul hier een waarde in van minimaal {0} en maximaal {1} tekens." ),
+ range: $.validator.format( "Vul hier een waarde in van minimaal {0} en maximaal {1}." ),
+ max: $.validator.format( "Vul hier een waarde in kleiner dan of gelijk aan {0}." ),
+ min: $.validator.format( "Vul hier een waarde in groter dan of gelijk aan {0}." ),
+
+ // For validations in additional-methods.js
+ iban: "Vul hier een geldig IBAN in.",
+ dateNL: "Vul hier een geldige datum in.",
+ phoneNL: "Vul hier een geldig Nederlands telefoonnummer in.",
+ mobileNL: "Vul hier een geldig Nederlands mobiel telefoonnummer in.",
+ postalcodeNL: "Vul hier een geldige postcode in.",
+ bankaccountNL: "Vul hier een geldig bankrekeningnummer in.",
+ giroaccountNL: "Vul hier een geldig gironummer in.",
+ bankorgiroaccountNL: "Vul hier een geldig bank- of gironummer in."
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_nl.min.js b/styles/bootstrap/validate/localization/messages_nl.min.js
new file mode 100644
index 000000000..f46651fab
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_nl.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Dit is een verplicht veld.",remote:"Controleer dit veld.",email:"Vul hier een geldig e-mailadres in.",url:"Vul hier een geldige URL in.",date:"Vul hier een geldige datum in.",dateISO:"Vul hier een geldige datum in (ISO-formaat).",number:"Vul hier een geldig getal in.",digits:"Vul hier alleen getallen in.",creditcard:"Vul hier een geldig creditcardnummer in.",equalTo:"Vul hier dezelfde waarde in.",extension:"Vul hier een waarde in met een geldige extensie.",maxlength:a.validator.format("Vul hier maximaal {0} tekens in."),minlength:a.validator.format("Vul hier minimaal {0} tekens in."),rangelength:a.validator.format("Vul hier een waarde in van minimaal {0} en maximaal {1} tekens."),range:a.validator.format("Vul hier een waarde in van minimaal {0} en maximaal {1}."),max:a.validator.format("Vul hier een waarde in kleiner dan of gelijk aan {0}."),min:a.validator.format("Vul hier een waarde in groter dan of gelijk aan {0}."),iban:"Vul hier een geldig IBAN in.",dateNL:"Vul hier een geldige datum in.",phoneNL:"Vul hier een geldig Nederlands telefoonnummer in.",mobileNL:"Vul hier een geldig Nederlands mobiel telefoonnummer in.",postalcodeNL:"Vul hier een geldige postcode in.",bankaccountNL:"Vul hier een geldig bankrekeningnummer in.",giroaccountNL:"Vul hier een geldig gironummer in.",bankorgiroaccountNL:"Vul hier een geldig bank- of gironummer in."})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_no.js b/styles/bootstrap/validate/localization/messages_no.js
new file mode 100644
index 000000000..f0e766048
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_no.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: NO (Norwegian; Norsk)
+ */
+$.extend( $.validator.messages, {
+ required: "Dette feltet er obligatorisk.",
+ maxlength: $.validator.format( "Maksimalt {0} tegn." ),
+ minlength: $.validator.format( "Minimum {0} tegn." ),
+ rangelength: $.validator.format( "Angi minimum {0} og maksimum {1} tegn." ),
+ email: "Oppgi en gyldig epostadresse.",
+ url: "Angi en gyldig URL.",
+ date: "Angi en gyldig dato.",
+ dateISO: "Angi en gyldig dato (&ARING;&ARING;&ARING;&ARING;-MM-DD).",
+ dateSE: "Angi en gyldig dato.",
+ number: "Angi et gyldig nummer.",
+ numberSE: "Angi et gyldig nummer.",
+ digits: "Skriv kun tall.",
+ equalTo: "Skriv samme verdi igjen.",
+ range: $.validator.format( "Angi en verdi mellom {0} og {1}." ),
+ max: $.validator.format( "Angi en verdi som er mindre eller lik {0}." ),
+ min: $.validator.format( "Angi en verdi som er større eller lik {0}." ),
+ creditcard: "Angi et gyldig kredittkortnummer."
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_no.min.js b/styles/bootstrap/validate/localization/messages_no.min.js
new file mode 100644
index 000000000..88a63037f
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_no.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Dette feltet er obligatorisk.",maxlength:a.validator.format("Maksimalt {0} tegn."),minlength:a.validator.format("Minimum {0} tegn."),rangelength:a.validator.format("Angi minimum {0} og maksimum {1} tegn."),email:"Oppgi en gyldig epostadresse.",url:"Angi en gyldig URL.",date:"Angi en gyldig dato.",dateISO:"Angi en gyldig dato (&ARING;&ARING;&ARING;&ARING;-MM-DD).",dateSE:"Angi en gyldig dato.",number:"Angi et gyldig nummer.",numberSE:"Angi et gyldig nummer.",digits:"Skriv kun tall.",equalTo:"Skriv samme verdi igjen.",range:a.validator.format("Angi en verdi mellom {0} og {1}."),max:a.validator.format("Angi en verdi som er mindre eller lik {0}."),min:a.validator.format("Angi en verdi som er større eller lik {0}."),creditcard:"Angi et gyldig kredittkortnummer."})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_pl.js b/styles/bootstrap/validate/localization/messages_pl.js
new file mode 100644
index 000000000..d6c2cca6d
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_pl.js
@@ -0,0 +1,36 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: PL (Polish; język polski, polszczyzna)
+ */
+$.extend( $.validator.messages, {
+ required: "To pole jest wymagane.",
+ remote: "Proszę o wypełnienie tego pola.",
+ email: "Proszę o podanie prawidłowego adresu email.",
+ url: "Proszę o podanie prawidłowego URL.",
+ date: "Proszę o podanie prawidłowej daty.",
+ dateISO: "Proszę o podanie prawidłowej daty (ISO).",
+ number: "Proszę o podanie prawidłowej liczby.",
+ digits: "Proszę o podanie samych cyfr.",
+ creditcard: "Proszę o podanie prawidłowej karty kredytowej.",
+ equalTo: "Proszę o podanie tej samej wartości ponownie.",
+ extension: "Proszę o podanie wartości z prawidłowym rozszerzeniem.",
+ maxlength: $.validator.format( "Proszę o podanie nie więcej niż {0} znaków." ),
+ minlength: $.validator.format( "Proszę o podanie przynajmniej {0} znaków." ),
+ rangelength: $.validator.format( "Proszę o podanie wartości o długości od {0} do {1} znaków." ),
+ range: $.validator.format( "Proszę o podanie wartości z przedziału od {0} do {1}." ),
+ max: $.validator.format( "Proszę o podanie wartości mniejszej bądź równej {0}." ),
+ min: $.validator.format( "Proszę o podanie wartości większej bądź równej {0}." ),
+ pattern: $.validator.format( "Pole zawiera niedozwolone znaki." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_pl.min.js b/styles/bootstrap/validate/localization/messages_pl.min.js
new file mode 100644
index 000000000..e5e4f06bd
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_pl.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"To pole jest wymagane.",remote:"Proszę o wypełnienie tego pola.",email:"Proszę o podanie prawidłowego adresu email.",url:"Proszę o podanie prawidłowego URL.",date:"Proszę o podanie prawidłowej daty.",dateISO:"Proszę o podanie prawidłowej daty (ISO).",number:"Proszę o podanie prawidłowej liczby.",digits:"Proszę o podanie samych cyfr.",creditcard:"Proszę o podanie prawidłowej karty kredytowej.",equalTo:"Proszę o podanie tej samej wartości ponownie.",extension:"Proszę o podanie wartości z prawidłowym rozszerzeniem.",maxlength:a.validator.format("Proszę o podanie nie więcej niż {0} znaków."),minlength:a.validator.format("Proszę o podanie przynajmniej {0} znaków."),rangelength:a.validator.format("Proszę o podanie wartości o długości od {0} do {1} znaków."),range:a.validator.format("Proszę o podanie wartości z przedziału od {0} do {1}."),max:a.validator.format("Proszę o podanie wartości mniejszej bądź równej {0}."),min:a.validator.format("Proszę o podanie wartości większej bądź równej {0}."),pattern:a.validator.format("Pole zawiera niedozwolone znaki.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_pt_BR.js b/styles/bootstrap/validate/localization/messages_pt_BR.js
new file mode 100644
index 000000000..81d432f0c
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_pt_BR.js
@@ -0,0 +1,87 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: PT (Portuguese; português)
+ * Region: BR (Brazil)
+ */
+$.extend( $.validator.messages, {
+
+ // Core
+ required: "Este campo é requerido.",
+ remote: "Por favor, corrija este campo.",
+ email: "Por favor, forneça um endereço de email válido.",
+ url: "Por favor, forneça uma URL válida.",
+ date: "Por favor, forneça uma data válida.",
+ dateISO: "Por favor, forneça uma data válida (ISO).",
+ number: "Por favor, forneça um número válido.",
+ digits: "Por favor, forneça somente dígitos.",
+ creditcard: "Por favor, forneça um cartão de crédito válido.",
+ equalTo: "Por favor, forneça o mesmo valor novamente.",
+ maxlength: $.validator.format( "Por favor, forneça não mais que {0} caracteres." ),
+ minlength: $.validator.format( "Por favor, forneça ao menos {0} caracteres." ),
+ rangelength: $.validator.format( "Por favor, forneça um valor entre {0} e {1} caracteres de comprimento." ),
+ range: $.validator.format( "Por favor, forneça um valor entre {0} e {1}." ),
+ max: $.validator.format( "Por favor, forneça um valor menor ou igual a {0}." ),
+ min: $.validator.format( "Por favor, forneça um valor maior ou igual a {0}." ),
+
+ // Metodos Adicionais
+ maxWords: $.validator.format( "Por favor, forneça com {0} palavras ou menos." ),
+ minWords: $.validator.format( "Por favor, forneça pelo menos {0} palavras." ),
+ rangeWords: $.validator.format( "Por favor, forneça entre {0} e {1} palavras." ),
+ accept: "Por favor, forneça um tipo válido.",
+ alphanumeric: "Por favor, forneça somente com letras, números e sublinhados.",
+ bankaccountNL: "Por favor, forneça com um número de conta bancária válida.",
+ bankorgiroaccountNL: "Por favor, forneça um banco válido ou número de conta.",
+ bic: "Por favor, forneça um código BIC válido.",
+ cifES: "Por favor, forneça um código CIF válido.",
+ creditcardtypes: "Por favor, forneça um número de cartão de crédito válido.",
+ currency: "Por favor, forneça uma moeda válida.",
+ dateFA: "Por favor, forneça uma data correta.",
+ dateITA: "Por favor, forneça uma data correta.",
+ dateNL: "Por favor, forneça uma data correta.",
+ extension: "Por favor, forneça um valor com uma extensão válida.",
+ giroaccountNL: "Por favor, forneça um número de conta corrente válido.",
+ iban: "Por favor, forneça um código IBAN válido.",
+ integer: "Por favor, forneça um número não decimal.",
+ ipv4: "Por favor, forneça um IPv4 válido.",
+ ipv6: "Por favor, forneça um IPv6 válido.",
+ lettersonly: "Por favor, forneça apenas com letras.",
+ letterswithbasicpunc: "Por favor, forneça apenas letras ou pontuações.",
+ mobileNL: "Por favor, forneceça um número válido de telefone.",
+ mobileUK: "Por favor, forneceça um número válido de telefone.",
+ nieES: "Por favor, forneça um NIE válido.",
+ nifES: "Por favor, forneça um NIF válido.",
+ nowhitespace: "Por favor, não utilize espaços em branco.",
+ pattern: "O formato fornenecido é inválido.",
+ phoneNL: "Por favor, forneceça um número de telefone válido.",
+ phoneUK: "Por favor, forneceça um número de telefone válido.",
+ phoneUS: "Por favor, forneceça um número de telefone válido.",
+ phonesUK: "Por favor, forneceça um número de telefone válido.",
+ postalCodeCA: "Por favor, forneceça um número de código postal válido.",
+ postalcodeIT: "Por favor, forneceça um número de código postal válido.",
+ postalcodeNL: "Por favor, forneceça um número de código postal válido.",
+ postcodeUK: "Por favor, forneceça um número de código postal válido.",
+ postalcodeBR: "Por favor, forneça um CEP válido.",
+ require_from_group: $.validator.format( "Por favor, forneça pelo menos {0} destes campos." ),
+ skip_or_fill_minimum: $.validator.format( "Por favor, optar entre ignorar esses campos ou preencher pelo menos {0} deles." ),
+ stateUS: "Por favor, forneça um estado válido.",
+ strippedminlength: $.validator.format( "Por favor, forneça pelo menos {0} caracteres." ),
+ time: "Por favor, forneça um horário válido, no intervado de 00:00 e 23:59.",
+ time12h: "Por favor, forneça um horário válido, no intervado de 01:00 e 12:59 am/pm.",
+ url2: "Por favor, forneceça uma URL válida.",
+ vinUS: "O número de identificação de veículo informada (VIN) é inválido.",
+ zipcodeUS: "Por favor, forneceça um código postal americano válido.",
+ ziprange: "O código postal deve estar entre 902xx-xxxx e 905xx-xxxx",
+ cpfBR: "Por favor, forneça um CPF válido."
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_pt_BR.min.js b/styles/bootstrap/validate/localization/messages_pt_BR.min.js
new file mode 100644
index 000000000..6e4b6cc3b
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_pt_BR.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Este campo é requerido.",remote:"Por favor, corrija este campo.",email:"Por favor, forneça um endereço de email válido.",url:"Por favor, forneça uma URL válida.",date:"Por favor, forneça uma data válida.",dateISO:"Por favor, forneça uma data válida (ISO).",number:"Por favor, forneça um número válido.",digits:"Por favor, forneça somente dígitos.",creditcard:"Por favor, forneça um cartão de crédito válido.",equalTo:"Por favor, forneça o mesmo valor novamente.",maxlength:a.validator.format("Por favor, forneça não mais que {0} caracteres."),minlength:a.validator.format("Por favor, forneça ao menos {0} caracteres."),rangelength:a.validator.format("Por favor, forneça um valor entre {0} e {1} caracteres de comprimento."),range:a.validator.format("Por favor, forneça um valor entre {0} e {1}."),max:a.validator.format("Por favor, forneça um valor menor ou igual a {0}."),min:a.validator.format("Por favor, forneça um valor maior ou igual a {0}."),maxWords:a.validator.format("Por favor, forneça com {0} palavras ou menos."),minWords:a.validator.format("Por favor, forneça pelo menos {0} palavras."),rangeWords:a.validator.format("Por favor, forneça entre {0} e {1} palavras."),accept:"Por favor, forneça um tipo válido.",alphanumeric:"Por favor, forneça somente com letras, números e sublinhados.",bankaccountNL:"Por favor, forneça com um número de conta bancária válida.",bankorgiroaccountNL:"Por favor, forneça um banco válido ou número de conta.",bic:"Por favor, forneça um código BIC válido.",cifES:"Por favor, forneça um código CIF válido.",creditcardtypes:"Por favor, forneça um número de cartão de crédito válido.",currency:"Por favor, forneça uma moeda válida.",dateFA:"Por favor, forneça uma data correta.",dateITA:"Por favor, forneça uma data correta.",dateNL:"Por favor, forneça uma data correta.",extension:"Por favor, forneça um valor com uma extensão válida.",giroaccountNL:"Por favor, forneça um número de conta corrente válido.",iban:"Por favor, forneça um código IBAN válido.",integer:"Por favor, forneça um número não decimal.",ipv4:"Por favor, forneça um IPv4 válido.",ipv6:"Por favor, forneça um IPv6 válido.",lettersonly:"Por favor, forneça apenas com letras.",letterswithbasicpunc:"Por favor, forneça apenas letras ou pontuações.",mobileNL:"Por favor, forneceça um número válido de telefone.",mobileUK:"Por favor, forneceça um número válido de telefone.",nieES:"Por favor, forneça um NIE válido.",nifES:"Por favor, forneça um NIF válido.",nowhitespace:"Por favor, não utilize espaços em branco.",pattern:"O formato fornenecido é inválido.",phoneNL:"Por favor, forneceça um número de telefone válido.",phoneUK:"Por favor, forneceça um número de telefone válido.",phoneUS:"Por favor, forneceça um número de telefone válido.",phonesUK:"Por favor, forneceça um número de telefone válido.",postalCodeCA:"Por favor, forneceça um número de código postal válido.",postalcodeIT:"Por favor, forneceça um número de código postal válido.",postalcodeNL:"Por favor, forneceça um número de código postal válido.",postcodeUK:"Por favor, forneceça um número de código postal válido.",postalcodeBR:"Por favor, forneça um CEP válido.",require_from_group:a.validator.format("Por favor, forneça pelo menos {0} destes campos."),skip_or_fill_minimum:a.validator.format("Por favor, optar entre ignorar esses campos ou preencher pelo menos {0} deles."),stateUS:"Por favor, forneça um estado válido.",strippedminlength:a.validator.format("Por favor, forneça pelo menos {0} caracteres."),time:"Por favor, forneça um horário válido, no intervado de 00:00 e 23:59.",time12h:"Por favor, forneça um horário válido, no intervado de 01:00 e 12:59 am/pm.",url2:"Por favor, forneceça uma URL válida.",vinUS:"O número de identificação de veículo informada (VIN) é inválido.",zipcodeUS:"Por favor, forneceça um código postal americano válido.",ziprange:"O código postal deve estar entre 902xx-xxxx e 905xx-xxxx",cpfBR:"Por favor, forneça um CPF válido."})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_pt_PT.js b/styles/bootstrap/validate/localization/messages_pt_PT.js
new file mode 100644
index 000000000..2543a6efc
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_pt_PT.js
@@ -0,0 +1,39 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: PT (Portuguese; português)
+ * Region: PT (Portugal)
+ */
+$.extend( $.validator.messages, {
+ required: "Campo de preenchimento obrigatório.",
+ remote: "Por favor, corrija este campo.",
+ email: "Por favor, introduza um endereço eletrónico válido.",
+ url: "Por favor, introduza um URL válido.",
+ date: "Por favor, introduza uma data válida.",
+ dateISO: "Por favor, introduza uma data válida (ISO).",
+ number: "Por favor, introduza um número válido.",
+ digits: "Por favor, introduza apenas dígitos.",
+ creditcard: "Por favor, introduza um número de cartão de crédito válido.",
+ equalTo: "Por favor, introduza de novo o mesmo valor.",
+ extension: "Por favor, introduza um ficheiro com uma extensão válida.",
+ maxlength: $.validator.format( "Por favor, não introduza mais do que {0} caracteres." ),
+ minlength: $.validator.format( "Por favor, introduza pelo menos {0} caracteres." ),
+ rangelength: $.validator.format( "Por favor, introduza entre {0} e {1} caracteres." ),
+ range: $.validator.format( "Por favor, introduza um valor entre {0} e {1}." ),
+ max: $.validator.format( "Por favor, introduza um valor menor ou igual a {0}." ),
+ min: $.validator.format( "Por favor, introduza um valor maior ou igual a {0}." ),
+ nifES: "Por favor, introduza um NIF válido.",
+ nieES: "Por favor, introduza um NIE válido.",
+ cifES: "Por favor, introduza um CIF válido."
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_pt_PT.min.js b/styles/bootstrap/validate/localization/messages_pt_PT.min.js
new file mode 100644
index 000000000..3b2cc5598
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_pt_PT.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Campo de preenchimento obrigatório.",remote:"Por favor, corrija este campo.",email:"Por favor, introduza um endereço eletrónico válido.",url:"Por favor, introduza um URL válido.",date:"Por favor, introduza uma data válida.",dateISO:"Por favor, introduza uma data válida (ISO).",number:"Por favor, introduza um número válido.",digits:"Por favor, introduza apenas dígitos.",creditcard:"Por favor, introduza um número de cartão de crédito válido.",equalTo:"Por favor, introduza de novo o mesmo valor.",extension:"Por favor, introduza um ficheiro com uma extensão válida.",maxlength:a.validator.format("Por favor, não introduza mais do que {0} caracteres."),minlength:a.validator.format("Por favor, introduza pelo menos {0} caracteres."),rangelength:a.validator.format("Por favor, introduza entre {0} e {1} caracteres."),range:a.validator.format("Por favor, introduza um valor entre {0} e {1}."),max:a.validator.format("Por favor, introduza um valor menor ou igual a {0}."),min:a.validator.format("Por favor, introduza um valor maior ou igual a {0}."),nifES:"Por favor, introduza um NIF válido.",nieES:"Por favor, introduza um NIE válido.",cifES:"Por favor, introduza um CIF válido."})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_ro.js b/styles/bootstrap/validate/localization/messages_ro.js
new file mode 100644
index 000000000..9f1c5f88e
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_ro.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: RO (Romanian, limba română)
+ */
+$.extend( $.validator.messages, {
+ required: "Acest câmp este obligatoriu.",
+ remote: "Te rugăm să completezi acest câmp.",
+ email: "Te rugăm să introduci o adresă de email validă",
+ url: "Te rugăm sa introduci o adresă URL validă.",
+ date: "Te rugăm să introduci o dată corectă.",
+ dateISO: "Te rugăm să introduci o dată (ISO) corectă.",
+ number: "Te rugăm să introduci un număr întreg valid.",
+ digits: "Te rugăm să introduci doar cifre.",
+ creditcard: "Te rugăm să introduci un numar de carte de credit valid.",
+ equalTo: "Te rugăm să reintroduci valoarea.",
+ extension: "Te rugăm să introduci o valoare cu o extensie validă.",
+ maxlength: $.validator.format( "Te rugăm să nu introduci mai mult de {0} caractere." ),
+ minlength: $.validator.format( "Te rugăm să introduci cel puțin {0} caractere." ),
+ rangelength: $.validator.format( "Te rugăm să introduci o valoare între {0} și {1} caractere." ),
+ range: $.validator.format( "Te rugăm să introduci o valoare între {0} și {1}." ),
+ max: $.validator.format( "Te rugăm să introduci o valoare egal sau mai mică decât {0}." ),
+ min: $.validator.format( "Te rugăm să introduci o valoare egal sau mai mare decât {0}." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_ro.min.js b/styles/bootstrap/validate/localization/messages_ro.min.js
new file mode 100644
index 000000000..6f1400ac3
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_ro.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Acest câmp este obligatoriu.",remote:"Te rugăm să completezi acest câmp.",email:"Te rugăm să introduci o adresă de email validă",url:"Te rugăm sa introduci o adresă URL validă.",date:"Te rugăm să introduci o dată corectă.",dateISO:"Te rugăm să introduci o dată (ISO) corectă.",number:"Te rugăm să introduci un număr întreg valid.",digits:"Te rugăm să introduci doar cifre.",creditcard:"Te rugăm să introduci un numar de carte de credit valid.",equalTo:"Te rugăm să reintroduci valoarea.",extension:"Te rugăm să introduci o valoare cu o extensie validă.",maxlength:a.validator.format("Te rugăm să nu introduci mai mult de {0} caractere."),minlength:a.validator.format("Te rugăm să introduci cel puțin {0} caractere."),rangelength:a.validator.format("Te rugăm să introduci o valoare între {0} și {1} caractere."),range:a.validator.format("Te rugăm să introduci o valoare între {0} și {1}."),max:a.validator.format("Te rugăm să introduci o valoare egal sau mai mică decât {0}."),min:a.validator.format("Te rugăm să introduci o valoare egal sau mai mare decât {0}.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_ru.js b/styles/bootstrap/validate/localization/messages_ru.js
new file mode 100644
index 000000000..00ecb0fe7
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_ru.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: RU (Russian; русский язык)
+ */
+$.extend( $.validator.messages, {
+ required: "Это поле необходимо заполнить.",
+ remote: "Пожалуйста, введите правильное значение.",
+ email: "Пожалуйста, введите корректный адрес электронной почты.",
+ url: "Пожалуйста, введите корректный URL.",
+ date: "Пожалуйста, введите корректную дату.",
+ dateISO: "Пожалуйста, введите корректную дату в формате ISO.",
+ number: "Пожалуйста, введите число.",
+ digits: "Пожалуйста, вводите только цифры.",
+ creditcard: "Пожалуйста, введите правильный номер кредитной карты.",
+ equalTo: "Пожалуйста, введите такое же значение ещё раз.",
+ extension: "Пожалуйста, выберите файл с правильным расширением.",
+ maxlength: $.validator.format( "Пожалуйста, введите не больше {0} символов." ),
+ minlength: $.validator.format( "Пожалуйста, введите не меньше {0} символов." ),
+ rangelength: $.validator.format( "Пожалуйста, введите значение длиной от {0} до {1} символов." ),
+ range: $.validator.format( "Пожалуйста, введите число от {0} до {1}." ),
+ max: $.validator.format( "Пожалуйста, введите число, меньшее или равное {0}." ),
+ min: $.validator.format( "Пожалуйста, введите число, большее или равное {0}." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_ru.min.js b/styles/bootstrap/validate/localization/messages_ru.min.js
new file mode 100644
index 000000000..7169fd296
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_ru.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Это поле необходимо заполнить.",remote:"Пожалуйста, введите правильное значение.",email:"Пожалуйста, введите корректный адрес электронной почты.",url:"Пожалуйста, введите корректный URL.",date:"Пожалуйста, введите корректную дату.",dateISO:"Пожалуйста, введите корректную дату в формате ISO.",number:"Пожалуйста, введите число.",digits:"Пожалуйста, вводите только цифры.",creditcard:"Пожалуйста, введите правильный номер кредитной карты.",equalTo:"Пожалуйста, введите такое же значение ещё раз.",extension:"Пожалуйста, выберите файл с правильным расширением.",maxlength:a.validator.format("Пожалуйста, введите не больше {0} символов."),minlength:a.validator.format("Пожалуйста, введите не меньше {0} символов."),rangelength:a.validator.format("Пожалуйста, введите значение длиной от {0} до {1} символов."),range:a.validator.format("Пожалуйста, введите число от {0} до {1}."),max:a.validator.format("Пожалуйста, введите число, меньшее или равное {0}."),min:a.validator.format("Пожалуйста, введите число, большее или равное {0}.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_si.js b/styles/bootstrap/validate/localization/messages_si.js
new file mode 100644
index 000000000..697a730ed
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_si.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: SI (Slovenian)
+ */
+$.extend( $.validator.messages, {
+ required: "To polje je obvezno.",
+ remote: "Vpis v tem polju ni v pravi obliki.",
+ email: "Prosimo, vnesite pravi email naslov.",
+ url: "Prosimo, vnesite pravi URL.",
+ date: "Prosimo, vnesite pravi datum.",
+ dateISO: "Prosimo, vnesite pravi datum (ISO).",
+ number: "Prosimo, vnesite pravo številko.",
+ digits: "Prosimo, vnesite samo številke.",
+ creditcard: "Prosimo, vnesite pravo številko kreditne kartice.",
+ equalTo: "Prosimo, ponovno vnesite enako vsebino.",
+ extension: "Prosimo, vnesite vsebino z pravo končnico.",
+ maxlength: $.validator.format( "Prosimo, da ne vnašate več kot {0} znakov." ),
+ minlength: $.validator.format( "Prosimo, vnesite vsaj {0} znakov." ),
+ rangelength: $.validator.format( "Prosimo, vnesite od {0} do {1} znakov." ),
+ range: $.validator.format( "Prosimo, vnesite vrednost med {0} in {1}." ),
+ max: $.validator.format( "Prosimo, vnesite vrednost manjšo ali enako {0}." ),
+ min: $.validator.format( "Prosimo, vnesite vrednost večjo ali enako {0}." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_si.min.js b/styles/bootstrap/validate/localization/messages_si.min.js
new file mode 100644
index 000000000..86a21d476
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_si.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"To polje je obvezno.",remote:"Vpis v tem polju ni v pravi obliki.",email:"Prosimo, vnesite pravi email naslov.",url:"Prosimo, vnesite pravi URL.",date:"Prosimo, vnesite pravi datum.",dateISO:"Prosimo, vnesite pravi datum (ISO).",number:"Prosimo, vnesite pravo številko.",digits:"Prosimo, vnesite samo številke.",creditcard:"Prosimo, vnesite pravo številko kreditne kartice.",equalTo:"Prosimo, ponovno vnesite enako vsebino.",extension:"Prosimo, vnesite vsebino z pravo končnico.",maxlength:a.validator.format("Prosimo, da ne vnašate več kot {0} znakov."),minlength:a.validator.format("Prosimo, vnesite vsaj {0} znakov."),rangelength:a.validator.format("Prosimo, vnesite od {0} do {1} znakov."),range:a.validator.format("Prosimo, vnesite vrednost med {0} in {1}."),max:a.validator.format("Prosimo, vnesite vrednost manjšo ali enako {0}."),min:a.validator.format("Prosimo, vnesite vrednost večjo ali enako {0}.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_sk.js b/styles/bootstrap/validate/localization/messages_sk.js
new file mode 100644
index 000000000..441582d7d
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_sk.js
@@ -0,0 +1,32 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: SK (Slovak; slovenčina, slovenský jazyk)
+ */
+$.extend( $.validator.messages, {
+ required: "Povinné zadať.",
+ maxlength: $.validator.format( "Maximálne {0} znakov." ),
+ minlength: $.validator.format( "Minimálne {0} znakov." ),
+ rangelength: $.validator.format( "Minimálne {0} a maximálne {1} znakov." ),
+ email: "E-mailová adresa musí byť platná.",
+ url: "URL musí byť platná.",
+ date: "Musí byť dátum.",
+ number: "Musí byť číslo.",
+ digits: "Môže obsahovať iba číslice.",
+ equalTo: "Dve hodnoty sa musia rovnať.",
+ range: $.validator.format( "Musí byť medzi {0} a {1}." ),
+ max: $.validator.format( "Nemôže byť viac ako {0}." ),
+ min: $.validator.format( "Nemôže byť menej ako {0}." ),
+ creditcard: "Číslo platobnej karty musí byť platné."
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_sk.min.js b/styles/bootstrap/validate/localization/messages_sk.min.js
new file mode 100644
index 000000000..08691f13b
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_sk.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Povinné zadať.",maxlength:a.validator.format("Maximálne {0} znakov."),minlength:a.validator.format("Minimálne {0} znakov."),rangelength:a.validator.format("Minimálne {0} a maximálne {1} znakov."),email:"E-mailová adresa musí byť platná.",url:"URL musí byť platná.",date:"Musí byť dátum.",number:"Musí byť číslo.",digits:"Môže obsahovať iba číslice.",equalTo:"Dve hodnoty sa musia rovnať.",range:a.validator.format("Musí byť medzi {0} a {1}."),max:a.validator.format("Nemôže byť viac ako {0}."),min:a.validator.format("Nemôže byť menej ako {0}."),creditcard:"Číslo platobnej karty musí byť platné."})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_sl.js b/styles/bootstrap/validate/localization/messages_sl.js
new file mode 100644
index 000000000..7aee0a463
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_sl.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Language: SL (Slovenian; slovenski jezik)
+ */
+$.extend( $.validator.messages, {
+ required: "To polje je obvezno.",
+ remote: "Prosimo popravite to polje.",
+ email: "Prosimo vnesite veljaven email naslov.",
+ url: "Prosimo vnesite veljaven URL naslov.",
+ date: "Prosimo vnesite veljaven datum.",
+ dateISO: "Prosimo vnesite veljaven ISO datum.",
+ number: "Prosimo vnesite veljavno število.",
+ digits: "Prosimo vnesite samo števila.",
+ creditcard: "Prosimo vnesite veljavno številko kreditne kartice.",
+ equalTo: "Prosimo ponovno vnesite vrednost.",
+ extension: "Prosimo vnesite vrednost z veljavno končnico.",
+ maxlength: $.validator.format( "Prosimo vnesite največ {0} znakov." ),
+ minlength: $.validator.format( "Prosimo vnesite najmanj {0} znakov." ),
+ rangelength: $.validator.format( "Prosimo vnesite najmanj {0} in največ {1} znakov." ),
+ range: $.validator.format( "Prosimo vnesite vrednost med {0} in {1}." ),
+ max: $.validator.format( "Prosimo vnesite vrednost manjše ali enako {0}." ),
+ min: $.validator.format( "Prosimo vnesite vrednost večje ali enako {0}." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_sl.min.js b/styles/bootstrap/validate/localization/messages_sl.min.js
new file mode 100644
index 000000000..b047960d8
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_sl.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"To polje je obvezno.",remote:"Prosimo popravite to polje.",email:"Prosimo vnesite veljaven email naslov.",url:"Prosimo vnesite veljaven URL naslov.",date:"Prosimo vnesite veljaven datum.",dateISO:"Prosimo vnesite veljaven ISO datum.",number:"Prosimo vnesite veljavno število.",digits:"Prosimo vnesite samo števila.",creditcard:"Prosimo vnesite veljavno številko kreditne kartice.",equalTo:"Prosimo ponovno vnesite vrednost.",extension:"Prosimo vnesite vrednost z veljavno končnico.",maxlength:a.validator.format("Prosimo vnesite največ {0} znakov."),minlength:a.validator.format("Prosimo vnesite najmanj {0} znakov."),rangelength:a.validator.format("Prosimo vnesite najmanj {0} in največ {1} znakov."),range:a.validator.format("Prosimo vnesite vrednost med {0} in {1}."),max:a.validator.format("Prosimo vnesite vrednost manjše ali enako {0}."),min:a.validator.format("Prosimo vnesite vrednost večje ali enako {0}.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_sr.js b/styles/bootstrap/validate/localization/messages_sr.js
new file mode 100644
index 000000000..226c5bb53
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_sr.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: SR (Serbian; српски језик)
+ */
+$.extend( $.validator.messages, {
+ required: "Поље је обавезно.",
+ remote: "Средите ово поље.",
+ email: "Унесите исправну и-мејл адресу.",
+ url: "Унесите исправан URL.",
+ date: "Унесите исправан датум.",
+ dateISO: "Унесите исправан датум (ISO).",
+ number: "Унесите исправан број.",
+ digits: "Унесите само цифе.",
+ creditcard: "Унесите исправан број кредитне картице.",
+ equalTo: "Унесите исту вредност поново.",
+ extension: "Унесите вредност са одговарајућом екстензијом.",
+ maxlength: $.validator.format( "Унесите мање од {0} карактера." ),
+ minlength: $.validator.format( "Унесите барем {0} карактера." ),
+ rangelength: $.validator.format( "Унесите вредност дугачку између {0} и {1} карактера." ),
+ range: $.validator.format( "Унесите вредност између {0} и {1}." ),
+ max: $.validator.format( "Унесите вредност мању или једнаку {0}." ),
+ min: $.validator.format( "Унесите вредност већу или једнаку {0}." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_sr.min.js b/styles/bootstrap/validate/localization/messages_sr.min.js
new file mode 100644
index 000000000..266e0f75f
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_sr.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Поље је обавезно.",remote:"Средите ово поље.",email:"Унесите исправну и-мејл адресу.",url:"Унесите исправан URL.",date:"Унесите исправан датум.",dateISO:"Унесите исправан датум (ISO).",number:"Унесите исправан број.",digits:"Унесите само цифе.",creditcard:"Унесите исправан број кредитне картице.",equalTo:"Унесите исту вредност поново.",extension:"Унесите вредност са одговарајућом екстензијом.",maxlength:a.validator.format("Унесите мање од {0} карактера."),minlength:a.validator.format("Унесите барем {0} карактера."),rangelength:a.validator.format("Унесите вредност дугачку између {0} и {1} карактера."),range:a.validator.format("Унесите вредност између {0} и {1}."),max:a.validator.format("Унесите вредност мању или једнаку {0}."),min:a.validator.format("Унесите вредност већу или једнаку {0}.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_sr_lat.js b/styles/bootstrap/validate/localization/messages_sr_lat.js
new file mode 100644
index 000000000..ba633090f
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_sr_lat.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: SR (Serbian - Latin alphabet; srpski jezik - latinica)
+ */
+$.extend( $.validator.messages, {
+ required: "Polje je obavezno.",
+ remote: "Sredite ovo polje.",
+ email: "Unesite ispravnu e-mail adresu",
+ url: "Unesite ispravan URL.",
+ date: "Unesite ispravan datum.",
+ dateISO: "Unesite ispravan datum (ISO).",
+ number: "Unesite ispravan broj.",
+ digits: "Unesite samo cifre.",
+ creditcard: "Unesite ispravan broj kreditne kartice.",
+ equalTo: "Unesite istu vrednost ponovo.",
+ extension: "Unesite vrednost sa odgovarajućom ekstenzijom.",
+ maxlength: $.validator.format( "Unesite manje od {0} karaktera." ),
+ minlength: $.validator.format( "Unesite barem {0} karaktera." ),
+ rangelength: $.validator.format( "Unesite vrednost dugačku između {0} i {1} karaktera." ),
+ range: $.validator.format( "Unesite vrednost između {0} i {1}." ),
+ max: $.validator.format( "Unesite vrednost manju ili jednaku {0}." ),
+ min: $.validator.format( "Unesite vrednost veću ili jednaku {0}." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_sr_lat.min.js b/styles/bootstrap/validate/localization/messages_sr_lat.min.js
new file mode 100644
index 000000000..87bf678e9
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_sr_lat.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Polje je obavezno.",remote:"Sredite ovo polje.",email:"Unesite ispravnu e-mail adresu",url:"Unesite ispravan URL.",date:"Unesite ispravan datum.",dateISO:"Unesite ispravan datum (ISO).",number:"Unesite ispravan broj.",digits:"Unesite samo cifre.",creditcard:"Unesite ispravan broj kreditne kartice.",equalTo:"Unesite istu vrednost ponovo.",extension:"Unesite vrednost sa odgovarajućom ekstenzijom.",maxlength:a.validator.format("Unesite manje od {0} karaktera."),minlength:a.validator.format("Unesite barem {0} karaktera."),rangelength:a.validator.format("Unesite vrednost dugačku između {0} i {1} karaktera."),range:a.validator.format("Unesite vrednost između {0} i {1}."),max:a.validator.format("Unesite vrednost manju ili jednaku {0}."),min:a.validator.format("Unesite vrednost veću ili jednaku {0}.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_sv.js b/styles/bootstrap/validate/localization/messages_sv.js
new file mode 100644
index 000000000..69033c45c
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_sv.js
@@ -0,0 +1,33 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: SV (Swedish; Svenska)
+ */
+$.extend( $.validator.messages, {
+ required: "Detta fält är obligatoriskt.",
+ maxlength: $.validator.format( "Du får ange högst {0} tecken." ),
+ minlength: $.validator.format( "Du måste ange minst {0} tecken." ),
+ rangelength: $.validator.format( "Ange minst {0} och max {1} tecken." ),
+ email: "Ange en korrekt e-postadress.",
+ url: "Ange en korrekt URL.",
+ date: "Ange ett korrekt datum.",
+ dateISO: "Ange ett korrekt datum (ÅÅÅÅ-MM-DD).",
+ number: "Ange ett korrekt nummer.",
+ digits: "Ange endast siffror.",
+ equalTo: "Ange samma värde igen.",
+ range: $.validator.format( "Ange ett värde mellan {0} och {1}." ),
+ max: $.validator.format( "Ange ett värde som är mindre eller lika med {0}." ),
+ min: $.validator.format( "Ange ett värde som är större eller lika med {0}." ),
+ creditcard: "Ange ett korrekt kreditkortsnummer."
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_sv.min.js b/styles/bootstrap/validate/localization/messages_sv.min.js
new file mode 100644
index 000000000..afa6d46b7
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_sv.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Detta fält är obligatoriskt.",maxlength:a.validator.format("Du får ange högst {0} tecken."),minlength:a.validator.format("Du måste ange minst {0} tecken."),rangelength:a.validator.format("Ange minst {0} och max {1} tecken."),email:"Ange en korrekt e-postadress.",url:"Ange en korrekt URL.",date:"Ange ett korrekt datum.",dateISO:"Ange ett korrekt datum (ÅÅÅÅ-MM-DD).",number:"Ange ett korrekt nummer.",digits:"Ange endast siffror.",equalTo:"Ange samma värde igen.",range:a.validator.format("Ange ett värde mellan {0} och {1}."),max:a.validator.format("Ange ett värde som är mindre eller lika med {0}."),min:a.validator.format("Ange ett värde som är större eller lika med {0}."),creditcard:"Ange ett korrekt kreditkortsnummer."})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_th.js b/styles/bootstrap/validate/localization/messages_th.js
new file mode 100644
index 000000000..f2feeec06
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_th.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: TH (Thai; ไทย)
+ */
+$.extend( $.validator.messages, {
+ required: "โปรดระบุ",
+ remote: "โปรดแก้ไขให้ถูกต้อง",
+ email: "โปรดระบุที่อยู่อีเมล์ที่ถูกต้อง",
+ url: "โปรดระบุ URL ที่ถูกต้อง",
+ date: "โปรดระบุวันที่ ที่ถูกต้อง",
+ dateISO: "โปรดระบุวันที่ ที่ถูกต้อง (ระบบ ISO).",
+ number: "โปรดระบุทศนิยมที่ถูกต้อง",
+ digits: "โปรดระบุจำนวนเต็มที่ถูกต้อง",
+ creditcard: "โปรดระบุรหัสบัตรเครดิตที่ถูกต้อง",
+ equalTo: "โปรดระบุค่าเดิมอีกครั้ง",
+ extension: "โปรดระบุค่าที่มีส่วนขยายที่ถูกต้อง",
+ maxlength: $.validator.format( "โปรดอย่าระบุค่าที่ยาวกว่า {0} อักขระ" ),
+ minlength: $.validator.format( "โปรดอย่าระบุค่าที่สั้นกว่า {0} อักขระ" ),
+ rangelength: $.validator.format( "โปรดอย่าระบุค่าความยาวระหว่าง {0} ถึง {1} อักขระ" ),
+ range: $.validator.format( "โปรดระบุค่าระหว่าง {0} และ {1}" ),
+ max: $.validator.format( "โปรดระบุค่าน้อยกว่าหรือเท่ากับ {0}" ),
+ min: $.validator.format( "โปรดระบุค่ามากกว่าหรือเท่ากับ {0}" )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_th.min.js b/styles/bootstrap/validate/localization/messages_th.min.js
new file mode 100644
index 000000000..a5db56e4f
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_th.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"โปรดระบุ",remote:"โปรดแก้ไขให้ถูกต้อง",email:"โปรดระบุที่อยู่อีเมล์ที่ถูกต้อง",url:"โปรดระบุ URL ที่ถูกต้อง",date:"โปรดระบุวันที่ ที่ถูกต้อง",dateISO:"โปรดระบุวันที่ ที่ถูกต้อง (ระบบ ISO).",number:"โปรดระบุทศนิยมที่ถูกต้อง",digits:"โปรดระบุจำนวนเต็มที่ถูกต้อง",creditcard:"โปรดระบุรหัสบัตรเครดิตที่ถูกต้อง",equalTo:"โปรดระบุค่าเดิมอีกครั้ง",extension:"โปรดระบุค่าที่มีส่วนขยายที่ถูกต้อง",maxlength:a.validator.format("โปรดอย่าระบุค่าที่ยาวกว่า {0} อักขระ"),minlength:a.validator.format("โปรดอย่าระบุค่าที่สั้นกว่า {0} อักขระ"),rangelength:a.validator.format("โปรดอย่าระบุค่าความยาวระหว่าง {0} ถึง {1} อักขระ"),range:a.validator.format("โปรดระบุค่าระหว่าง {0} และ {1}"),max:a.validator.format("โปรดระบุค่าน้อยกว่าหรือเท่ากับ {0}"),min:a.validator.format("โปรดระบุค่ามากกว่าหรือเท่ากับ {0}")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_tj.js b/styles/bootstrap/validate/localization/messages_tj.js
new file mode 100644
index 000000000..a45af47de
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_tj.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: TJ (Tajikistan; Забони тоҷикӣ)
+ */
+$.extend( $.validator.messages, {
+ required: "Ворид кардани ин филд маҷбури аст.",
+ remote: "Илтимос, маълумоти саҳеҳ ворид кунед.",
+ email: "Илтимос, почтаи электронии саҳеҳ ворид кунед.",
+ url: "Илтимос, URL адреси саҳеҳ ворид кунед.",
+ date: "Илтимос, таърихи саҳеҳ ворид кунед.",
+ dateISO: "Илтимос, таърихи саҳеҳи (ISO)ӣ ворид кунед.",
+ number: "Илтимос, рақамҳои саҳеҳ ворид кунед.",
+ digits: "Илтимос, танҳо рақам ворид кунед.",
+ creditcard: "Илтимос, кредит карди саҳеҳ ворид кунед.",
+ equalTo: "Илтимос, миқдори баробар ворид кунед.",
+ extension: "Илтимос, қофияи файлро дуруст интихоб кунед",
+ maxlength: $.validator.format( "Илтимос, бештар аз {0} рамз ворид накунед." ),
+ minlength: $.validator.format( "Илтимос, камтар аз {0} рамз ворид накунед." ),
+ rangelength: $.validator.format( "Илтимос, камтар аз {0} ва зиёда аз {1} рамз ворид кунед." ),
+ range: $.validator.format( "Илтимос, аз {0} то {1} рақам зиёд ворид кунед." ),
+ max: $.validator.format( "Илтимос, бештар аз {0} рақам ворид накунед." ),
+ min: $.validator.format( "Илтимос, камтар аз {0} рақам ворид накунед." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_tj.min.js b/styles/bootstrap/validate/localization/messages_tj.min.js
new file mode 100644
index 000000000..a15fe5687
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_tj.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Ворид кардани ин филд маҷбури аст.",remote:"Илтимос, маълумоти саҳеҳ ворид кунед.",email:"Илтимос, почтаи электронии саҳеҳ ворид кунед.",url:"Илтимос, URL адреси саҳеҳ ворид кунед.",date:"Илтимос, таърихи саҳеҳ ворид кунед.",dateISO:"Илтимос, таърихи саҳеҳи (ISO)ӣ ворид кунед.",number:"Илтимос, рақамҳои саҳеҳ ворид кунед.",digits:"Илтимос, танҳо рақам ворид кунед.",creditcard:"Илтимос, кредит карди саҳеҳ ворид кунед.",equalTo:"Илтимос, миқдори баробар ворид кунед.",extension:"Илтимос, қофияи файлро дуруст интихоб кунед",maxlength:a.validator.format("Илтимос, бештар аз {0} рамз ворид накунед."),minlength:a.validator.format("Илтимос, камтар аз {0} рамз ворид накунед."),rangelength:a.validator.format("Илтимос, камтар аз {0} ва зиёда аз {1} рамз ворид кунед."),range:a.validator.format("Илтимос, аз {0} то {1} рақам зиёд ворид кунед."),max:a.validator.format("Илтимос, бештар аз {0} рақам ворид накунед."),min:a.validator.format("Илтимос, камтар аз {0} рақам ворид накунед.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_tr.js b/styles/bootstrap/validate/localization/messages_tr.js
new file mode 100644
index 000000000..1c00a9e2c
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_tr.js
@@ -0,0 +1,36 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: TR (Turkish; Türkçe)
+ */
+$.extend( $.validator.messages, {
+ required: "Bu alanın doldurulması zorunludur.",
+ remote: "Lütfen bu alanı düzeltin.",
+ email: "Lütfen geçerli bir e-posta adresi giriniz.",
+ url: "Lütfen geçerli bir web adresi (URL) giriniz.",
+ date: "Lütfen geçerli bir tarih giriniz.",
+ dateISO: "Lütfen geçerli bir tarih giriniz(ISO formatında)",
+ number: "Lütfen geçerli bir sayı giriniz.",
+ digits: "Lütfen sadece sayısal karakterler giriniz.",
+ creditcard: "Lütfen geçerli bir kredi kartı giriniz.",
+ equalTo: "Lütfen aynı değeri tekrar giriniz.",
+ extension: "Lütfen geçerli uzantıya sahip bir değer giriniz.",
+ maxlength: $.validator.format( "Lütfen en fazla {0} karakter uzunluğunda bir değer giriniz." ),
+ minlength: $.validator.format( "Lütfen en az {0} karakter uzunluğunda bir değer giriniz." ),
+ rangelength: $.validator.format( "Lütfen en az {0} ve en fazla {1} uzunluğunda bir değer giriniz." ),
+ range: $.validator.format( "Lütfen {0} ile {1} arasında bir değer giriniz." ),
+ max: $.validator.format( "Lütfen {0} değerine eşit ya da daha küçük bir değer giriniz." ),
+ min: $.validator.format( "Lütfen {0} değerine eşit ya da daha büyük bir değer giriniz." ),
+ require_from_group: "Lütfen bu alanların en az {0} tanesini doldurunuz."
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_tr.min.js b/styles/bootstrap/validate/localization/messages_tr.min.js
new file mode 100644
index 000000000..d53c4cbac
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_tr.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Bu alanın doldurulması zorunludur.",remote:"Lütfen bu alanı düzeltin.",email:"Lütfen geçerli bir e-posta adresi giriniz.",url:"Lütfen geçerli bir web adresi (URL) giriniz.",date:"Lütfen geçerli bir tarih giriniz.",dateISO:"Lütfen geçerli bir tarih giriniz(ISO formatında)",number:"Lütfen geçerli bir sayı giriniz.",digits:"Lütfen sadece sayısal karakterler giriniz.",creditcard:"Lütfen geçerli bir kredi kartı giriniz.",equalTo:"Lütfen aynı değeri tekrar giriniz.",extension:"Lütfen geçerli uzantıya sahip bir değer giriniz.",maxlength:a.validator.format("Lütfen en fazla {0} karakter uzunluğunda bir değer giriniz."),minlength:a.validator.format("Lütfen en az {0} karakter uzunluğunda bir değer giriniz."),rangelength:a.validator.format("Lütfen en az {0} ve en fazla {1} uzunluğunda bir değer giriniz."),range:a.validator.format("Lütfen {0} ile {1} arasında bir değer giriniz."),max:a.validator.format("Lütfen {0} değerine eşit ya da daha küçük bir değer giriniz."),min:a.validator.format("Lütfen {0} değerine eşit ya da daha büyük bir değer giriniz."),require_from_group:"Lütfen bu alanların en az {0} tanesini doldurunuz."})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_uk.js b/styles/bootstrap/validate/localization/messages_uk.js
new file mode 100644
index 000000000..2f33a9b8a
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_uk.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: UK (Ukrainian; українська мова)
+ */
+$.extend( $.validator.messages, {
+ required: "Це поле необхідно заповнити.",
+ remote: "Будь ласка, введіть правильне значення.",
+ email: "Будь ласка, введіть коректну адресу електронної пошти.",
+ url: "Будь ласка, введіть коректний URL.",
+ date: "Будь ласка, введіть коректну дату.",
+ dateISO: "Будь ласка, введіть коректну дату у форматі ISO.",
+ number: "Будь ласка, введіть число.",
+ digits: "Вводите потрібно лише цифри.",
+ creditcard: "Будь ласка, введіть правильний номер кредитної карти.",
+ equalTo: "Будь ласка, введіть таке ж значення ще раз.",
+ extension: "Будь ласка, виберіть файл з правильним розширенням.",
+ maxlength: $.validator.format( "Будь ласка, введіть не більше {0} символів." ),
+ minlength: $.validator.format( "Будь ласка, введіть не менше {0} символів." ),
+ rangelength: $.validator.format( "Будь ласка, введіть значення довжиною від {0} до {1} символів." ),
+ range: $.validator.format( "Будь ласка, введіть число від {0} до {1}." ),
+ max: $.validator.format( "Будь ласка, введіть число, менше або рівно {0}." ),
+ min: $.validator.format( "Будь ласка, введіть число, більше або рівно {0}." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_uk.min.js b/styles/bootstrap/validate/localization/messages_uk.min.js
new file mode 100644
index 000000000..420b1b4c9
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_uk.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Це поле необхідно заповнити.",remote:"Будь ласка, введіть правильне значення.",email:"Будь ласка, введіть коректну адресу електронної пошти.",url:"Будь ласка, введіть коректний URL.",date:"Будь ласка, введіть коректну дату.",dateISO:"Будь ласка, введіть коректну дату у форматі ISO.",number:"Будь ласка, введіть число.",digits:"Вводите потрібно лише цифри.",creditcard:"Будь ласка, введіть правильний номер кредитної карти.",equalTo:"Будь ласка, введіть таке ж значення ще раз.",extension:"Будь ласка, виберіть файл з правильним розширенням.",maxlength:a.validator.format("Будь ласка, введіть не більше {0} символів."),minlength:a.validator.format("Будь ласка, введіть не менше {0} символів."),rangelength:a.validator.format("Будь ласка, введіть значення довжиною від {0} до {1} символів."),range:a.validator.format("Будь ласка, введіть число від {0} до {1}."),max:a.validator.format("Будь ласка, введіть число, менше або рівно {0}."),min:a.validator.format("Будь ласка, введіть число, більше або рівно {0}.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_vi.js b/styles/bootstrap/validate/localization/messages_vi.js
new file mode 100644
index 000000000..d596c1c73
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_vi.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: VI (Vietnamese; Tiếng Việt)
+ */
+$.extend( $.validator.messages, {
+ required: "Hãy nhập.",
+ remote: "Hãy sửa cho đúng.",
+ email: "Hãy nhập email.",
+ url: "Hãy nhập URL.",
+ date: "Hãy nhập ngày.",
+ dateISO: "Hãy nhập ngày (ISO).",
+ number: "Hãy nhập số.",
+ digits: "Hãy nhập chữ số.",
+ creditcard: "Hãy nhập số thẻ tín dụng.",
+ equalTo: "Hãy nhập thêm lần nữa.",
+ extension: "Phần mở rộng không đúng.",
+ maxlength: $.validator.format( "Hãy nhập từ {0} kí tự trở xuống." ),
+ minlength: $.validator.format( "Hãy nhập từ {0} kí tự trở lên." ),
+ rangelength: $.validator.format( "Hãy nhập từ {0} đến {1} kí tự." ),
+ range: $.validator.format( "Hãy nhập từ {0} đến {1}." ),
+ max: $.validator.format( "Hãy nhập từ {0} trở xuống." ),
+ min: $.validator.format( "Hãy nhập từ {1} trở lên." )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_vi.min.js b/styles/bootstrap/validate/localization/messages_vi.min.js
new file mode 100644
index 000000000..4b5267385
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_vi.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Hãy nhập.",remote:"Hãy sửa cho đúng.",email:"Hãy nhập email.",url:"Hãy nhập URL.",date:"Hãy nhập ngày.",dateISO:"Hãy nhập ngày (ISO).",number:"Hãy nhập số.",digits:"Hãy nhập chữ số.",creditcard:"Hãy nhập số thẻ tín dụng.",equalTo:"Hãy nhập thêm lần nữa.",extension:"Phần mở rộng không đúng.",maxlength:a.validator.format("Hãy nhập từ {0} kí tự trở xuống."),minlength:a.validator.format("Hãy nhập từ {0} kí tự trở lên."),rangelength:a.validator.format("Hãy nhập từ {0} đến {1} kí tự."),range:a.validator.format("Hãy nhập từ {0} đến {1}."),max:a.validator.format("Hãy nhập từ {0} trở xuống."),min:a.validator.format("Hãy nhập từ {1} trở lên.")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_zh.js b/styles/bootstrap/validate/localization/messages_zh.js
new file mode 100644
index 000000000..02e9e3486
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_zh.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: ZH (Chinese, 中文 (Zhōngwén), 汉语, 漢語)
+ */
+$.extend( $.validator.messages, {
+ required: "这是必填字段",
+ remote: "请修正此字段",
+ email: "请输入有效的电子邮件地址",
+ url: "请输入有效的网址",
+ date: "请输入有效的日期",
+ dateISO: "请输入有效的日期 (YYYY-MM-DD)",
+ number: "请输入有效的数字",
+ digits: "只能输入数字",
+ creditcard: "请输入有效的信用卡号码",
+ equalTo: "你的输入不相同",
+ extension: "请输入有效的后缀",
+ maxlength: $.validator.format( "最多可以输入 {0} 个字符" ),
+ minlength: $.validator.format( "最少要输入 {0} 个字符" ),
+ rangelength: $.validator.format( "请输入长度在 {0} 到 {1} 之间的字符串" ),
+ range: $.validator.format( "请输入范围在 {0} 到 {1} 之间的数值" ),
+ max: $.validator.format( "请输入不大于 {0} 的数值" ),
+ min: $.validator.format( "请输入不小于 {0} 的数值" )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_zh.min.js b/styles/bootstrap/validate/localization/messages_zh.min.js
new file mode 100644
index 000000000..e80d62515
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_zh.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"这是必填字段",remote:"请修正此字段",email:"请输入有效的电子邮件地址",url:"请输入有效的网址",date:"请输入有效的日期",dateISO:"请输入有效的日期 (YYYY-MM-DD)",number:"请输入有效的数字",digits:"只能输入数字",creditcard:"请输入有效的信用卡号码",equalTo:"你的输入不相同",extension:"请输入有效的后缀",maxlength:a.validator.format("最多可以输入 {0} 个字符"),minlength:a.validator.format("最少要输入 {0} 个字符"),rangelength:a.validator.format("请输入长度在 {0} 到 {1} 之间的字符串"),range:a.validator.format("请输入范围在 {0} 到 {1} 之间的数值"),max:a.validator.format("请输入不大于 {0} 的数值"),min:a.validator.format("请输入不小于 {0} 的数值")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_zh_TW.js b/styles/bootstrap/validate/localization/messages_zh_TW.js
new file mode 100644
index 000000000..507f01104
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_zh_TW.js
@@ -0,0 +1,36 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: ZH (Chinese; 中文 (Zhōngwén), 汉语, 漢語)
+ * Region: TW (Taiwan)
+ */
+$.extend( $.validator.messages, {
+ required: "必須填寫",
+ remote: "請修正此欄位",
+ email: "請輸入有效的電子郵件",
+ url: "請輸入有效的網址",
+ date: "請輸入有效的日期",
+ dateISO: "請輸入有效的日期 (YYYY-MM-DD)",
+ number: "請輸入正確的數值",
+ digits: "只可輸入數字",
+ creditcard: "請輸入有效的信用卡號碼",
+ equalTo: "請重複輸入一次",
+ extension: "請輸入有效的後綴",
+ maxlength: $.validator.format( "最多 {0} 個字" ),
+ minlength: $.validator.format( "最少 {0} 個字" ),
+ rangelength: $.validator.format( "請輸入長度為 {0} 至 {1} 之間的字串" ),
+ range: $.validator.format( "請輸入 {0} 至 {1} 之間的數值" ),
+ max: $.validator.format( "請輸入不大於 {0} 的數值" ),
+ min: $.validator.format( "請輸入不小於 {0} 的數值" )
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/messages_zh_TW.min.js b/styles/bootstrap/validate/localization/messages_zh_TW.min.js
new file mode 100644
index 000000000..334431d58
--- /dev/null
+++ b/styles/bootstrap/validate/localization/messages_zh_TW.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"必須填寫",remote:"請修正此欄位",email:"請輸入有效的電子郵件",url:"請輸入有效的網址",date:"請輸入有效的日期",dateISO:"請輸入有效的日期 (YYYY-MM-DD)",number:"請輸入正確的數值",digits:"只可輸入數字",creditcard:"請輸入有效的信用卡號碼",equalTo:"請重複輸入一次",extension:"請輸入有效的後綴",maxlength:a.validator.format("最多 {0} 個字"),minlength:a.validator.format("最少 {0} 個字"),rangelength:a.validator.format("請輸入長度為 {0} 至 {1} 之間的字串"),range:a.validator.format("請輸入 {0} 至 {1} 之間的數值"),max:a.validator.format("請輸入不大於 {0} 的數值"),min:a.validator.format("請輸入不小於 {0} 的數值")})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/methods_de.js b/styles/bootstrap/validate/localization/methods_de.js
new file mode 100644
index 000000000..4a1b3f156
--- /dev/null
+++ b/styles/bootstrap/validate/localization/methods_de.js
@@ -0,0 +1,24 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Localized default methods for the jQuery validation plugin.
+ * Locale: DE
+ */
+$.extend( $.validator.methods, {
+ date: function( value, element ) {
+ return this.optional( element ) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test( value );
+ },
+ number: function( value, element ) {
+ return this.optional( element ) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test( value );
+ }
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/methods_de.min.js b/styles/bootstrap/validate/localization/methods_de.min.js
new file mode 100644
index 000000000..1f7c40aeb
--- /dev/null
+++ b/styles/bootstrap/validate/localization/methods_de.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(a)}})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/methods_es_CL.js b/styles/bootstrap/validate/localization/methods_es_CL.js
new file mode 100644
index 000000000..b764c3ae3
--- /dev/null
+++ b/styles/bootstrap/validate/localization/methods_es_CL.js
@@ -0,0 +1,24 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Localized default methods for the jQuery validation plugin.
+ * Locale: ES_CL
+ */
+$.extend( $.validator.methods, {
+ date: function( value, element ) {
+ return this.optional( element ) || /^\d\d?\-\d\d?\-\d\d\d?\d?$/.test( value );
+ },
+ number: function( value, element ) {
+ return this.optional( element ) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test( value );
+ }
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/methods_es_CL.min.js b/styles/bootstrap/validate/localization/methods_es_CL.min.js
new file mode 100644
index 000000000..a05fbc7eb
--- /dev/null
+++ b/styles/bootstrap/validate/localization/methods_es_CL.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d\d?\-\d\d?\-\d\d\d?\d?$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(a)}})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/methods_fi.js b/styles/bootstrap/validate/localization/methods_fi.js
new file mode 100644
index 000000000..c8dc5c94f
--- /dev/null
+++ b/styles/bootstrap/validate/localization/methods_fi.js
@@ -0,0 +1,24 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Localized default methods for the jQuery validation plugin.
+ * Locale: FI
+ */
+$.extend( $.validator.methods, {
+ date: function( value, element ) {
+ return this.optional( element ) || /^\d{1,2}\.\d{1,2}\.\d{4}$/.test( value );
+ },
+ number: function( value, element ) {
+ return this.optional( element ) || /^-?(?:\d+)(?:,\d+)?$/.test( value );
+ }
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/methods_fi.min.js b/styles/bootstrap/validate/localization/methods_fi.min.js
new file mode 100644
index 000000000..716d8824c
--- /dev/null
+++ b/styles/bootstrap/validate/localization/methods_fi.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d{1,2}\.\d{1,2}\.\d{4}$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+)(?:,\d+)?$/.test(a)}})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/methods_nl.js b/styles/bootstrap/validate/localization/methods_nl.js
new file mode 100644
index 000000000..06ae59103
--- /dev/null
+++ b/styles/bootstrap/validate/localization/methods_nl.js
@@ -0,0 +1,21 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Localized default methods for the jQuery validation plugin.
+ * Locale: NL
+ */
+$.extend( $.validator.methods, {
+ date: function( value, element ) {
+ return this.optional( element ) || /^\d\d?[\.\/\-]\d\d?[\.\/\-]\d\d\d?\d?$/.test( value );
+ }
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/methods_nl.min.js b/styles/bootstrap/validate/localization/methods_nl.min.js
new file mode 100644
index 000000000..ec7a2a488
--- /dev/null
+++ b/styles/bootstrap/validate/localization/methods_nl.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d\d?[\.\/\-]\d\d?[\.\/\-]\d\d\d?\d?$/.test(a)}})});
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/methods_pt.js b/styles/bootstrap/validate/localization/methods_pt.js
new file mode 100644
index 000000000..342b66f17
--- /dev/null
+++ b/styles/bootstrap/validate/localization/methods_pt.js
@@ -0,0 +1,21 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory( require( "jquery" ) );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Localized default methods for the jQuery validation plugin.
+ * Locale: PT_BR
+ */
+$.extend( $.validator.methods, {
+ date: function( value, element ) {
+ return this.optional( element ) || /^\d\d?\/\d\d?\/\d\d\d?\d?$/.test( value );
+ }
+} );
+
+}));
\ No newline at end of file
diff --git a/styles/bootstrap/validate/localization/methods_pt.min.js b/styles/bootstrap/validate/localization/methods_pt.min.js
new file mode 100644
index 000000000..5af56f53f
--- /dev/null
+++ b/styles/bootstrap/validate/localization/methods_pt.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d\d?\/\d\d?\/\d\d\d?\d?$/.test(a)}})});
\ No newline at end of file
diff --git a/utils/.htaccess b/utils/.htaccess
new file mode 100644
index 000000000..cb24fd7fc
--- /dev/null
+++ b/utils/.htaccess
@@ -0,0 +1,2 @@
+Order allow,deny
+Deny from all
diff --git a/utils/seeddms-xmldump b/utils/seeddms-xmldump
index fe166dc73..2ac863e49 100755
--- a/utils/seeddms-xmldump
+++ b/utils/seeddms-xmldump
@@ -5,4 +5,4 @@ if [ -z "${SEEDDMS_HOME}" ]; then
exit 1
fi
-exec php -f "${SEEDDMS_HOME}/utils/xmldump" -- "${@}"
+exec php -f "${SEEDDMS_HOME}/utils/xmldump.php" -- "${@}"
diff --git a/utils/xmldump.php b/utils/xmldump.php
index f872a5e19..c631cac8c 100644
--- a/utils/xmldump.php
+++ b/utils/xmldump.php
@@ -105,6 +105,9 @@ $statistic = array(
'attributedefinitions'=>0,
'keywordcategories'=>0,
'documentcategories'=>0,
+ 'workflows'=>0,
+ 'workflowactions'=>0,
+ 'workflowstates'=>0,
);
function dumplog($version, $type, $logs, $indent) { /* {{{ */
@@ -137,11 +140,11 @@ function dumplog($version, $type, $logs, $indent) { /* {{{ */
if(!empty($a['file'])) {
$filename = $dms->contentDir . $document->getDir().'r'.(int) $a[$type2.'LogID'];
if(file_exists($filename)) {
- echo $indent." \n";
echo chunk_split(base64_encode(file_get_contents($filename)), 76, "\n");
- echo $indent." \n";
+ echo $indent." \n";
} else {
echo " fileref=\"".$filename."\" />\n";
if($contentdir) {
@@ -160,6 +163,25 @@ function dumplog($version, $type, $logs, $indent) { /* {{{ */
echo $indent." ".$type."s>\n";
} /* }}} */
+function dumpNotifications($notifications, $indent) { /* {{{ */
+ if($notifications) {
+ if($notifications['groups'] || $notifications['users']) {
+ echo $indent." \n";
+ if($notifications['users']) {
+ foreach($notifications['users'] as $user) {
+ echo $indent." getID()."\" />\n";
+ }
+ }
+ if($notifications['groups']) {
+ foreach($notifications['groups'] as $group) {
+ echo $indent." getID()."\" />\n";
+ }
+ }
+ echo $indent." \n";
+ }
+ }
+} /* }}} */
+
function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */
global $sections, $statistic, $index, $dms, $maxsize, $contentdir;
@@ -179,14 +201,22 @@ function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */
if($attributes = $folder->getAttributes()) {
foreach($attributes as $attribute) {
$attrdef = $attribute->getAttributeDefinition();
- echo $indent." getID()."\">".$attribute->getValue()."\n";
+ echo $indent." getID()."\">".wrapWithCData($attribute->getValue())."\n";
}
}
- if($folder->inheritsAccess()) {
- echo $indent." \n";
- } else {
- echo $indent." \n";
+ $notifications = $folder->getNotifyList();
+ dumpNotifications($notifications, $indent);
+
+ /* getAccessList() returns also inherited access. So first check
+ * if inheritsAccess is set and don't output any acls in that case.
+ * There could be acls of the folder, which will be visible once the
+ * inheritsAccess is turned off. Those entries will be lost in the
+ * xml output.
+ */
+ if(!$folder->inheritsAccess()) {
$accesslist = $folder->getAccessList();
+ if($accesslist['users'] || $accesslist['groups']) {
+ echo $indent." \n";
foreach($accesslist['users'] as $acl) {
echo $indent." getUser();
@@ -202,6 +232,7 @@ function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */
echo "/>\n";
}
echo $indent." \n";
+ }
}
echo $indent."\n";
$statistic['folders']++;
@@ -222,7 +253,8 @@ function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */
if($documents) {
foreach($documents as $document) {
$owner = $document->getOwner();
- echo $indent."getId()."\" folder=\"".$folder->getID()."\"";
+ /* parent folder is only set if it is no skipped */
+ echo $indent."getId()."\"".(!$skipcurrent ? " folder=\"".$folder->getID()."\"" : "");
if($document->isLocked())
echo " locked=\"true\"";
echo ">\n";
@@ -248,10 +280,16 @@ function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */
}
}
- /* Check if acl is not inherited */
+ /* getAccessList() returns also inherited access. So first check
+ * if inheritsAccess is set and don't output any acls in that case.
+ * There could be acls of the folder, which will be visible once the
+ * inheritsAccess is turned off. Those entries will be lost in the
+ * xml output.
+ */
if(!$document->inheritsAccess()) {
- echo $indent." \n";
$accesslist = $document->getAccessList();
+ if($accesslist['users'] || $accesslist['groups']) {
+ echo $indent." \n";
foreach($accesslist['users'] as $acl) {
echo $indent." getUser();
@@ -267,6 +305,7 @@ function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */
echo "/>\n";
}
echo $indent." \n";
+ }
}
$cats = $document->getCategories();
@@ -282,8 +321,6 @@ function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */
if($versions) {
echo $indent." \n";
foreach($versions as $version) {
- $approvalStatus = $version->getApprovalStatus(30);
- $reviewStatus = $version->getReviewStatus(30);
$owner = $version->getUser();
echo $indent." getVersion()."\">\n";
echo $indent." ".$version->getMimeType()."\n";
@@ -310,12 +347,34 @@ function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */
}
echo $indent." \n";
}
+ $approvalStatus = $version->getApprovalStatus(30);
if($approvalStatus) {
dumplog($version, 'approval', $approvalStatus, $indent);
}
+ $reviewStatus = $version->getReviewStatus(30);
if($reviewStatus) {
dumplog($version, 'review', $reviewStatus, $indent);
}
+ $workflow = $version->getWorkflow();
+ if($workflow) {
+ $workflowstate = $version->getWorkflowState();
+ echo $indent." getID()."\" state=\"".$workflowstate->getID()."\">\n";
+ }
+ $wkflogs = $version->getWorkflowLog();
+ if($wkflogs) {
+ echo $indent." \n";
+ foreach($wkflogs as $wklog) {
+ echo $indent." \n";
+ echo $indent." ".$wklog->getDate()."\n";
+ echo $indent." ".$wklog->getWorkflow()->getID()."\n";
+ echo $indent." ".$wklog->getTransition()->getID()."\n";
+ $loguser = $wklog->getUser();
+ echo $indent." ".$loguser->getID()."\n";
+ echo $indent." ".wrapWithCData($wklog->getComment())."\n";
+ echo $indent." \n";
+ }
+ echo $indent." \n";
+ }
if(file_exists($dms->contentDir . $version->getPath())) {
echo $indent." contentDir . $version->getPath())."\"";
if(filesize($dms->contentDir . $version->getPath()) < $maxsize) {
@@ -332,6 +391,7 @@ function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */
}
} else {
echo $indent." \n";
+ echo $indent." \n";
}
echo $indent." \n";
}
@@ -360,7 +420,7 @@ function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */
} else {
echo " fileref=\"".$document->getID()."-A-".$file->getID().$file->getFileType()."\" />\n";
if($contentdir) {
- copy($dms->contentDir . $version->getPath(), $contentdir.$document->getID()."-A-".$file->getID().$file->getFileType());
+ copy($dms->contentDir . $file->getPath(), $contentdir.$document->getID()."-A-".$file->getID().$file->getFileType());
} else {
echo "Warning: file content (size=".filesize($dms->contentDir . $file->getPath()).") will be missing from output\n";
}
@@ -387,22 +447,7 @@ function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */
echo $indent." \n";
}
$notifications = $document->getNotifyList();
- if($notifications) {
- if($notifications['groups'] || $notifications['users']) {
- echo $indent." \n";
- if($notifications['users']) {
- foreach($notifications['users'] as $user) {
- echo $indent." getID()."\" />\n";
- }
- }
- if($notifications['groups']) {
- foreach($notifications['groups'] as $group) {
- echo $indent." getID()."\" />\n";
- }
- }
- echo $indent." \n";
- }
- }
+ dumpNotifications($notifications, $indent);
echo $indent."\n";
$statistic['documents']++;
@@ -447,7 +492,8 @@ if($users) {
if($image = $user->getImage()) {
echo " \n";
echo " ".$image['mimeType']."\n";
- echo " ".base64_encode($image['image'])."\n";
+ /* image data is already base64 coded */
+ echo " ".$image['image']."\n";
echo " \n";
}
if($mreviewers = $user->getMandatoryReviewers()) {
@@ -470,6 +516,13 @@ if($users) {
}
echo " \n";
}
+ if($mworkflows = $user->getMandatoryWorkflows()) {
+ echo " \n";
+ foreach($mworkflows as $mworkflow) {
+ echo " getID()."\">\n";
+ }
+ echo " \n";
+ }
echo " \n";
$statistic['users']++;
}
@@ -583,6 +636,72 @@ if($attrdefs) {
}
/* }}} */
+/* Dump workflows {{{ */
+if(!$sections || in_array('workflows', $sections)) {
+$workflowstates = $dms->getAllWorkflowStates();
+if($workflowstates) {
+ echo "\n";
+ foreach ($workflowstates as $workflowstate) {
+ echo " getID()."\">\n";
+ echo " ".$workflowstate->getName()."\n";
+ echo " ".$workflowstate->getDocumentStatus()."\n";
+ echo " \n";
+ $statistic['workflowstates']++;
+ }
+ echo "\n";
+}
+$workflowactions = $dms->getAllWorkflowActions();
+if($workflowactions) {
+ echo "\n";
+ foreach ($workflowactions as $workflowaction) {
+ echo " getID()."\">\n";
+ echo " ".$workflowaction->getName()."\n";
+ echo " \n";
+ $statistic['workflowactions']++;
+ }
+ echo "\n";
+}
+$workflows = $dms->getAllWorkflows();
+if($workflows) {
+ echo "\n";
+ foreach ($workflows as $workflow) {
+ echo " getID()."\">\n";
+ echo " ".$workflow->getName()."\n";
+ echo " ".$workflow->getInitState()->getID()."\n";
+ if($transitions = $workflow->getTransitions()) {
+ echo " \n";
+ foreach($transitions as $transition) {
+ echo " getID()."\">\n";
+ echo " ".$transition->getState()->getID()."\n";
+ echo " ".$transition->getNextState()->getID()."\n";
+ echo " ".$transition->getAction()->getID()."\n";
+ echo " ".$transition->getMaxTime()."\n";
+ if($transusers = $transition->getUsers()) {
+ echo " \n";
+ foreach($transusers as $transuser) {
+ echo " getUser()->getID()."\">\n";
+ }
+ echo " \n";
+ }
+ if($transgroups = $transition->getGroups()) {
+ echo " \n";
+ foreach($transgroups as $transgroup) {
+ echo " getGroup()->getID()."\" numofusers=\"".$transgroup->getNumOfUsers()."\">\n";
+ }
+ echo " \n";
+ }
+ echo " \n";
+ }
+ echo " \n";
+ }
+ echo " \n";
+ $statistic['workflows']++;
+ }
+ echo "\n";
+}
+}
+/* }}} */
+
/* Dump folders and documents {{{ */
$folder = $dms->getFolder($folderid);
if($folder) {
diff --git a/utils/xmlimport.php b/utils/xmlimport.php
index 25d48f1c9..f374b8e54 100644
--- a/utils/xmlimport.php
+++ b/utils/xmlimport.php
@@ -1,5 +1,6 @@
$review) {
@@ -45,13 +46,19 @@ function getRevAppLog($reviews) { /* {{{ */
$newreview['logs'] = array();
foreach($review['logs'] as $j=>$log) {
if(!array_key_exists($log['attributes']['user'], $objmap['users'])) {
- echo "Warning: user for review log cannot be mapped\n";
+ $logger->warning("User for review log cannot be mapped");
} else {
$newlog = array();
$newlog['user'] = $dms->getUser($objmap['users'][$log['attributes']['user']]);
$newlog['status'] = $log['attributes']['status'];
$newlog['comment'] = $log['attributes']['comment'];
$newlog['date'] = $log['attributes']['date'];
+ if(!empty($log['data'])) {
+ $filecontents = base64_decode($log['data']);
+ $filename = tempnam('/tmp', 'FOO-revapp');
+ file_put_contents($filename, $filecontents);
+ $newlog['file'] = $filename;
+ }
$newreview['logs'][] = $newlog;
}
}
@@ -60,13 +67,41 @@ function getRevAppLog($reviews) { /* {{{ */
return $newreviews;
} /* }}} */
+function getWorkflowLog($workflowlogs) { /* {{{ */
+ global $logger, $dms, $objmap;
+
+ $newlogs = array();
+ foreach($workflowlogs as $i=>$log) {
+ if(!array_key_exists($log['attributes']['user'], $objmap['users'])) {
+ unset($initversion['workflowlogs'][$i]);
+ $logger->warning("User for workflow log cannot be mapped");
+ } else {
+ $log['attributes']['user'] = $dms->getUser($objmap['users'][$log['attributes']['user']]);
+ if(!array_key_exists($log['attributes']['workflow'], $objmap['workflows'])) {
+ unset($initversion['workflowlogs'][$i]);
+ $logger->warning("Workflow for workflow log cannot be mapped");
+ } else {
+ $log['attributes']['workflow'] = $dms->getWorkflow($objmap['workflows'][$log['attributes']['workflow']]);
+ if(!array_key_exists($log['attributes']['transition'], $objmap['workflowtransitions'])) {
+ unset($initversion['workflowlogs'][$i]);
+ $logger->warning("Workflow transition for workflow log cannot be mapped");
+ } else {
+ $log['attributes']['transition'] = $dms->getWorkflowTransition($objmap['workflowtransitions'][$log['attributes']['transition']]);
+ $newlogs[] = $log['attributes'];
+ }
+ }
+ }
+ }
+ return $newlogs;
+} /* }}} */
+
function insert_user($user) { /* {{{ */
- global $dms, $debug, $sections, $defaultUser, $objmap;
+ global $logger, $dms, $debug, $sections, $defaultUser, $objmap;
if($debug) print_r($user);
if ($newUser = $dms->getUserByLogin($user['attributes']['login'])) {
- echo "User '".$user['attributes']['login']."' already exists\n";
+ $logger->info("User '".$user['attributes']['login']."' already exists");
} else {
if(in_array('users', $sections)) {
$newUser = $dms->addUser(
@@ -82,8 +117,18 @@ function insert_user($user) { /* {{{ */
$user['attributes']['disabled'],
$user['attributes']['pwdexpiration']);
if(!$newUser) {
- echo "Error: could not add user\n";
+ $logger->err("Could not add user");
+ $logger->debug($dms->getDB()->getErrorMsg());
return false;
+ } else {
+ $logger->info("Added user '".$user['attributes']['login']."'");
+ if(isset($user['image']) && $user['image']) {
+ $filecontents = base64_decode($user['image']['data']);
+ $filename = tempnam('/tmp', 'FOO-User-Img');
+ file_put_contents($filename, $filecontents);
+ $newUser->setImage($filename, $user['image']['mimetype']);
+ unlink($filename);
+ }
}
} else {
$newUser = $defaultUser;
@@ -112,16 +157,17 @@ function set_homefolders() { /* {{{ */
} /* }}} */
function insert_group($group) { /* {{{ */
- global $dms, $debug, $objmap, $sections, $users;
+ global $logger, $dms, $debug, $objmap, $sections, $users;
if($debug) print_r($group);
if ($newGroup = $dms->getGroupByName($group['attributes']['name'])) {
- echo "Group already exists\n";
+ $logger->info("Group already exists");
} else {
if(in_array('groups', $sections)) {
$newGroup = $dms->addGroup($group['attributes']['name'], $group['attributes']['comment']);
if($newGroup) {
+ $logger->info("Added group '".$group['attributes']['name']."'");
foreach($group['users'] as $guser) {
/* Check if user is in array of users which has been previously filled
* by the users in the xml file. Alternative, we could check if the
@@ -130,18 +176,20 @@ function insert_group($group) { /* {{{ */
if(isset($users[$guser])) {
$user = $users[$guser];
if($newMember = $dms->getUserByLogin($user['attributes']['login'])) {
- $newGroup->addUser($newMember);
+ if($newGroup->addUser($newMember)) {
+ $logger->info("Added user '".$newMember->getLogin()."' to group '".$group['attributes']['name']."'");
+ }
} else {
- echo "Error: could not find member of group\n";
+ $logger->err("Could not find member of group");
return false;
}
} else {
- echo "Error: group member is not contained in xml file\n";
+ $logger->err("Group member is not contained in xml file");
return false;
}
}
} else {
- echo "Error: could not add group\n";
+ $logger->err("Could not add group");
return false;
}
} else {
@@ -154,17 +202,20 @@ function insert_group($group) { /* {{{ */
} /* }}} */
function insert_attributedefinition($attrdef) { /* {{{ */
- global $dms, $debug, $objmap, $sections;
+ global $logger, $dms, $debug, $objmap, $sections;
if($debug)
print_r($attrdef);
if($newAttrdef = $dms->getAttributeDefinitionByName($attrdef['attributes']['name'])) {
- echo "Attribute definition already exists\n";
+ $logger->info("Attribute definition already exists");
} else {
if(in_array('attributedefinitions', $sections)) {
if(!$newAttrdef = $dms->addAttributeDefinition($attrdef['attributes']['name'], $attrdef['objecttype'], $attrdef['attributes']['type'], $attrdef['attributes']['multiple'], $attrdef['attributes']['minvalues'], $attrdef['attributes']['maxvalues'], $attrdef['attributes']['valueset'], $attrdef['attributes']['regex'])) {
- echo "Error: could not add attribute definition\n";
+ $logger->err("Could not add attribute definition");
+ $logger->debug($dms->getDB()->getErrorMsg());
return false;
+ } else {
+ $logger->info("Added attribute definition '".$attrdef['attributes']['name']."'");
}
} else {
$newAttrdef = null;
@@ -176,17 +227,20 @@ function insert_attributedefinition($attrdef) { /* {{{ */
} /* }}} */
function insert_documentcategory($documentcat) { /* {{{ */
- global $dms, $debug, $objmap, $sections;
+ global $logger, $dms, $debug, $objmap, $sections;
if($debug) print_r($documentcat);
if($newCategory = $dms->getDocumentCategoryByName($documentcat['attributes']['name'])) {
- echo "Document category already exists\n";
+ $logger->info("Document category already exists");
} else {
if(in_array('documentcategories', $sections)) {
if(!$newCategory = $dms->addDocumentCategory($documentcat['attributes']['name'])) {
- echo "Error: could not add document category\n";
+ $logger->err("Error: could not add document category");
+ $logger->debug($dms->getDB()->getErrorMsg());
return false;
+ } else {
+ $logger->info("Added document category '".$documentcat['attributes']['name']."'");
}
} else {
$newCategory = null;
@@ -199,27 +253,31 @@ function insert_documentcategory($documentcat) { /* {{{ */
} /* }}} */
function insert_keywordcategory($keywordcat) { /* {{{ */
- global $dms, $debug, $objmap, $sections;
+ global $logger, $dms, $debug, $objmap, $sections;
if($debug) print_r($keywordcat);
if(!array_key_exists((int) $keywordcat['attributes']['owner'], $objmap['users'])) {
- echo "Error: owner of keyword category cannot be found\n";
+ $logger->err("Owner of keyword category cannot be found");
return false;
}
$owner = $objmap['users'][(int) $keywordcat['attributes']['owner']];
if($newCategory = $dms->getKeywordCategoryByName($keywordcat['attributes']['name'], $owner)) {
- echo "Document category already exists\n";
+ $logger->info("Document category already exists");
} else {
if(in_array('keywordcategories', $sections)) {
if(!$newCategory = $dms->addKeywordCategory($owner, $keywordcat['attributes']['name'])) {
- echo "Error: could not add keyword category\n";
+ $logger->err("Could not add keyword category");
+ $logger->debug($dms->getDB()->getErrorMsg());
return false;
+ } else {
+ $logger->info("Added keyword category '".$keywordcat['attributes']['name']."'");
}
foreach($keywordcat['keywords'] as $keyword) {
if(!$newCategory->addKeywordList($keyword['attributes']['name'])) {
- echo "Error: could not add keyword to keyword category\n";
+ $logger->err("Could not add keyword to keyword category");
+ $logger->debug($dms->getDB()->getErrorMsg());
return false;
}
}
@@ -233,13 +291,135 @@ function insert_keywordcategory($keywordcat) { /* {{{ */
return $newCategory;
} /* }}} */
-function insert_document($document) { /* {{{ */
- global $dms, $debug, $defaultUser, $objmap, $sections, $rootfolder;
+function insert_workflow($workflow) { /* {{{ */
+ global $logger, $dms, $debug, $objmap, $sections;
- if($debug) print_r($document);
+ if($debug)
+ print_r($workflow);
+ if($newWorkflow = $dms->getWorkflowByName($workflow['attributes']['name'])) {
+ $logger->info("Workflow already exists");
+ } else {
+ if(in_array('workflows', $sections)) {
+ if(!$initstate = $dms->getWorkflowState($objmap['workflowstates'][(int)$workflow['attributes']['initstate']])) {
+ $logger->err("Could not add workflow because initial state is missing");
+ return false;
+ }
+ if(!$newWorkflow = $dms->addWorkflow($workflow['attributes']['name'], $initstate)) {
+ $logger->err("Could not add workflow");
+ $logger->debug($dms->getDB()->getErrorMsg());
+ return false;
+ } else {
+ $logger->info("Added workflow '".$workflow['attributes']['name']."'");
+ }
+ if($workflow['transitions']) {
+ foreach($workflow['transitions'] as $transition) {
+ if(!$state = $dms->getWorkflowState($objmap['workflowstates'][(int) $transition['attributes']['startstate']])) {
+ $logger->err("Could not add workflow because start state of transition is missing");
+ $logger->debug($dms->getDB()->getErrorMsg());
+ return false;
+ }
+ if(!$nextstate = $dms->getWorkflowState($objmap['workflowstates'][(int) $transition['attributes']['nextstate']])) {
+ $logger->err("Could not add workflow because end state of transition is missing");
+ $logger->debug($dms->getDB()->getErrorMsg());
+ return false;
+ }
+ if(!$action = $dms->getWorkflowAction($objmap['workflowactions'][(int) $transition['attributes']['action']])) {
+ $logger->err("Could not add workflow because end state of transition is missing");
+ $logger->debug($dms->getDB()->getErrorMsg());
+ return false;
+ }
+ $tusers = array();
+ if($transition['users']) {
+ foreach($transition['users'] as $tuserid) {
+ if(!$tusers[] = $dms->getUser($objmap['users'][(int) $tuserid])) {
+ $logger->err("Could not add workflow because user of transition is missing");
+ $logger->debug($dms->getDB()->getErrorMsg());
+ return false;
+ }
+ }
+ }
+ $tgroups = array();
+ if($transition['groups']) {
+ foreach($transition['groups'] as $tgroupid) {
+ if(!$tgroups[] = $dms->getGroup($objmap['groups'][(int) $tgroupid])) {
+ $logger->err("Could not add workflow because group of transition is missing");
+ return false;
+ }
+ }
+ }
+ if(!($newWorkflowTransition = $newWorkflow->addTransition($state, $action, $nextstate, $tusers, $tgroups))) {
+ $logger->err("Could not add workflow because transition could not be added");
+ return false;
+ }
+ if($newWorkflowTransition)
+ $objmap['workflowtransitions'][$transition['id']] = $newWorkflowTransition->getID();
+ }
+ }
+ } else {
+ $newWorkflow = null;
+ }
+ }
+ if($newWorkflow)
+ $objmap['workflows'][$workflow['id']] = $newWorkflow->getID();
+ return $newWorkflow;
+} /* }}} */
+
+function insert_workflowstate($workflowstate) { /* {{{ */
+ global $logger, $dms, $debug, $objmap, $sections;
+
+ if($debug)
+ print_r($workflowstate);
+ if($newWorkflowstate = $dms->getWorkflowStateByName($workflowstate['attributes']['name'])) {
+ $logger->info("Workflow state already exists");
+ } else {
+ if(in_array('workflows', $sections)) {
+ if(!$newWorkflowstate = $dms->addWorkflowState($workflowstate['attributes']['name'], isset($workflowstate['attributes']['documentstate']) ? $workflowstate['attributes']['documentstate'] : 0)) {
+ $logger->err("Could not add workflow state");
+ return false;
+ } else {
+ $logger->info("Added workflow state '".$workflowstate['attributes']['name']."'");
+ }
+ } else {
+ $newWorkflowstate = null;
+ }
+ }
+ if($newWorkflowstate)
+ $objmap['workflowstates'][$workflowstate['id']] = $newWorkflowstate->getID();
+ return $newWorkflowstate;
+} /* }}} */
+
+function insert_workflowaction($workflowaction) { /* {{{ */
+ global $logger, $dms, $debug, $objmap, $sections;
+
+ if($debug)
+ print_r($workflowaction);
+ if($newWorkflowaction = $dms->getWorkflowActionByName($workflowaction['attributes']['name'])) {
+ $logger->info("Workflow action already exists");
+ } else {
+ if(in_array('workflows', $sections)) {
+ if(!$newWorkflowaction = $dms->addWorkflowAction($workflowaction['attributes']['name'])) {
+ $logger->err("Could not add workflow action");
+ return false;
+ } else {
+ $logger->info("Added workflow action '".$workflowaction['attributes']['name']."'");
+ }
+ } else {
+ $newWorkflowaction = null;
+ }
+ }
+ if($newWorkflowaction)
+ $objmap['workflowactions'][$workflowaction['id']] = $newWorkflowaction->getID();
+ return $newWorkflowaction;
+} /* }}} */
+
+function insert_document($document) { /* {{{ */
+ global $logger, $dms, $debug, $defaultUser, $objmap, $sections, $rootfolder, $contentdir;
+
+ if($debug)
+ print_r($document);
if(!array_key_exists((int) $document['attributes']['owner'], $objmap['users'])) {
- echo "Warning: owner of document cannot be mapped using default user\n";
+ $logger->warning("Owner of document cannot be mapped using default user");
$owner = $defaultUser;
} else {
$owner = $dms->getUser($objmap['users'][(int) $document['attributes']['owner']]);
@@ -251,7 +431,7 @@ function insert_document($document) { /* {{{ */
if(array_key_exists((int) $orgid, $objmap['attributedefs'])) {
$attributes[$objmap['attributedefs'][$orgid]] = $value;
} else {
- echo "Warning: User attribute ".$orgid." cannot be mapped\n";
+ $logger->warning("User attribute ".$orgid." cannot be mapped");
}
}
}
@@ -261,7 +441,7 @@ function insert_document($document) { /* {{{ */
if(array_key_exists((int) $catid, $objmap['documentcategories'])) {
$categories[$objmap['documentcategories'][$catid]] = $dms->getDocumentCategory($objmap['documentcategories'][$catid]);
} else {
- echo "Warning: Category ".$catid." cannot be mapped\n";
+ $logger->warning("Category ".$catid." cannot be mapped");
}
}
}
@@ -270,283 +450,317 @@ function insert_document($document) { /* {{{ */
if(array_key_exists($document['folder'], $objmap['folders'])) {
$folder = $dms->getFolder($objmap['folders'][$document['folder']]);
} else {
- echo "Error: folder ".$document['folder']." cannot be mapped\n";
+ $logger->err("Folder ".$document['folder']." cannot be mapped");
return false;
}
} else
$folder = $rootfolder;
if(in_array('documents', $sections)) {
- $error = false;
$initversion = array_shift($document['versions']);
+ if(!$initversion) {
+ $logger->err("Document '".$document['attributes']['name']."' missing initial version");
+ return false;
+ }
+ /* Rewriting the review/approval log will set reviewers/approvers */
+ $reviews = array('i'=>array(), 'g'=>array());
+ $approvals = array('i'=>array(), 'g'=>array());
+ $workflow = null;
+ $workflowstate = null;
+ if(isset($initversion['workflow']) && $initversion['workflow']) {
+ if(array_key_exists((int) $initversion['workflow']['id'], $objmap['workflows'])) {
+ $workflow = $dms->getWorkflow($objmap['workflows'][(int) $initversion['workflow']['id']]);
+ if(!$workflow) {
+ $logger->warning("Workflow ".$initversion['workflow']['id']." cannot be mapped");
+ }
+ } else {
+ $logger->warning("Workflow ".$initversion['workflow']['id']." cannot be mapped");
+ }
+ if(array_key_exists((int) $initversion['workflow']['state'], $objmap['workflowstates'])) {
+ $workflowstate = $dms->getWorkflowState($objmap['workflowstates'][(int) $initversion['workflow']['state']]);
+ if(!$workflowstate) {
+ $logger->warning("Workflowstate ".$initversion['workflow']['state']." cannot be mapped");
+ }
+ } else {
+ $logger->warning("Workflowstate ".$initversion['workflow']['state']." cannot be mapped");
+ }
+ }
+
+ $version_attributes = array();
+ if(isset($initversion['user_attributes'])) {
+ foreach($initversion['user_attributes'] as $orgid=>$value) {
+ if(array_key_exists((int) $orgid, $objmap['attributedefs'])) {
+ $version_attributes[$objmap['attributedefs'][$orgid]] = $value;
+ } else {
+ $logger->warning("User attribute ".$orgid." cannot be mapped");
+ }
+ }
+ }
if(!empty($initversion['fileref'])) {
$filename = tempnam('/tmp', 'FOO');
- copy($initversion['fileref'], $filename);
+ copy($contentdir.$initversion['fileref'], $filename);
} else {
+ if(!isset($initversion['data']))
+ echo $document['attributes']['name']."\n";
$filecontents = base64_decode($initversion['data']);
if(strlen($filecontents) != $initversion['data_length']) {
- echo "Warning: file length (".strlen($filecontents).") doesn't match expected length (".$initversion['data_length'].").\n";
- $newDocument = null;
- $error = true;
+ $logger->warning("File length (".strlen($filecontents).") doesn't match expected length (".$initversion['data_length'].").");
}
$filename = tempnam('/tmp', 'FOO');
file_put_contents($filename, $filecontents);
}
- if(!$error) {
+ if(!$result = $folder->addDocument(
+ $document['attributes']['name'],
+ $document['attributes']['comment'],
+ isset($document['attributes']['expires']) ? dateToTimestamp($document['attributes']['expires']) : 0,
+ $owner,
+ isset($document['attributes']['keywords']) ? $document['attributes']['keywords'] : 0,
+ $categories,
+ $filename,
+ $initversion['attributes']['orgfilename'],
+ $initversion['attributes']['filetype'],
+ $initversion['attributes']['mimetype'],
+ $document['attributes']['sequence'],
+ $reviews, //reviewers
+ $approvals, //approvers
+ $initversion['version'],
+ isset($initversion['attributes']['comment']) ? $initversion['attributes']['comment'] : '',
+ $attributes,
+ $version_attributes,
+ $workflow
+ )
+ ) {
+ unlink($filename);
+ $logger->err("Could not add document '".$document['attributes']['name']."'");
+ return false;
+ }
+
+ /* The document and its initial version was added */
+ $logger->info("Added document '".$document['attributes']['name']."'");
+ $newDocument = $result[0];
+ unlink($filename);
+
+ if(isset($document['attributes']['lockedby'])) {
+ if(!array_key_exists($document['attributes']['lockedby'], $objmap['users'])) {
+ $logger->warning("User for document lock cannot be mapped");
+ } else {
+ if($lockuser = $dms->getUser($objmap['users'][$document['attributes']['lockedby']])) {
+ $newDocument->setLocked($lockuser);
+ }
+ }
+ }
+
+ $newVersion = $result[1]->getContent();
+ $newVersion->setDate(dateToTimestamp($initversion['attributes']['date']));
+ if($workflowstate)
+ $newVersion->setWorkflowState($workflowstate);
+ $newlogs = array();
+ foreach($initversion['statuslogs'] as $i=>$log) {
+ if(!array_key_exists($log['attributes']['user'], $objmap['users'])) {
+ unset($initversion['statuslogs'][$i]);
+ $logger->warning("User for status log cannot be mapped");
+ } else {
+ $log['attributes']['user'] = $dms->getUser($objmap['users'][$log['attributes']['user']]);
+ $newlogs[] = $log['attributes'];
+ }
+ }
+ $newVersion->rewriteStatusLog($newlogs);
+
+ /* Set reviewers and review log */
+ if($initversion['reviews']) {
+// print_r($initversion['reviews']);
+ $newreviews = getRevAppLog($initversion['reviews']);
+ $newVersion->rewriteReviewLog($newreviews);
+ }
+ if($initversion['approvals']) {
+ $newapprovals = getRevAppLog($initversion['approvals']);
+ $newVersion->rewriteApprovalLog($newapprovals);
+ }
+
+ if($initversion['workflowlogs']) {
+ $newworkflowlogs = getWorkflowLog($initversion['workflowlogs']);
+ if(!$newVersion->rewriteWorkflowLog($newworkflowlogs)) {
+ $logger->err("Could not rewrite workflow log of version '".$newVersion->getVersion()."' of document '".$newDocument->getName()."'");
+ $logger->debug($dms->getDB()->getErrorMsg());
+ return false;
+ }
+ }
+
+ $newDocument->setDate(dateToTimestamp($document['attributes']['date']));
+ $newDocument->setDefaultAccess($document['attributes']['defaultaccess']);
+ $newDocument->setInheritAccess($document['attributes']['inheritaccess']);
+ foreach($document['versions'] as $version) {
+ if(!array_key_exists((int) $version['attributes']['owner'], $objmap['users'])) {
+ $logger->err("Owner of document cannot be mapped");
+ return false;
+ }
+ $owner = $dms->getUser($objmap['users'][(int) $version['attributes']['owner']]);
+
+ /* Rewriting the review/approval log will set reviewers/approvers */
$reviews = array('i'=>array(), 'g'=>array());
- /*
- if($initversion['reviews']) {
- foreach($initversion['reviews'] as $review) {
- if($review['attributes']['type'] == 1) {
- if(isset($objmap['groups'][(int) $review['attributes']['required']]))
- $reviews['g'][] = $objmap['groups'][(int) $review['attributes']['required']];
- } else {
- if(isset($objmap['users'][(int) $review['attributes']['required']]))
- $reviews['i'][] = $objmap['users'][(int) $review['attributes']['required']];
- }
- }
- }
- */
$approvals = array('i'=>array(), 'g'=>array());
- /*
- if($initversion['approvals']) {
- foreach($initversion['approvals'] as $approval) {
- if($approval['attributes']['type'] == 1) {
- if(isset($objmap['groups'][(int) $approval['attributes']['required']]))
- $approvals['g'][] = $objmap['groups'][(int) $approval['attributes']['required']];
- } else {
- if(isset($objmap['users'][(int) $approval['attributes']['required']]))
- $approvals['i'][] = $objmap['users'][(int) $approval['attributes']['required']];
+ $workflow = null;
+ $workflowstate = null;
+ if(isset($version['workflow']) && $version['workflow']) {
+ if(array_key_exists((int) $version['workflow']['id'], $objmap['workflows'])) {
+ $workflow = $dms->getWorkflow($objmap['workflows'][(int) $version['workflow']['id']]);
+ if(!$workflow) {
+ $logger->warning("Workflow ".$version['workflow']['id']." cannot be mapped");
}
+ } else {
+ $logger->warning("Workflow ".$version['workflow']['id']." cannot be mapped");
+ }
+ if(array_key_exists((int) $version['workflow']['state'], $objmap['workflowstates'])) {
+ $workflowstate = $dms->getWorkflowState($objmap['workflowstates'][(int) $version['workflow']['state']]);
+ if(!$workflowstate) {
+ $logger->warning("Workflowstate ".$version['workflow']['state']." cannot be mapped");
+ }
+ } else {
+ $logger->warning("Workflowstate ".$version['workflow']['state']." cannot be mapped");
}
}
- */
+
$version_attributes = array();
- if(isset($initversion['user_attributes'])) {
- foreach($initversion['user_attributes'] as $orgid=>$value) {
+ if(isset($version['user_attributes'])) {
+ foreach($version['user_attributes'] as $orgid=>$value) {
if(array_key_exists((int) $orgid, $objmap['attributedefs'])) {
$version_attributes[$objmap['attributedefs'][$orgid]] = $value;
} else {
- echo "Warning: User attribute ".$orgid." cannot be mapped\n";
+ $logger->warning("User attribute ".$orgid." cannot be mapped");
}
}
}
- if(!$result = $folder->addDocument(
- $document['attributes']['name'],
- $document['attributes']['comment'],
- isset($document['attributes']['expires']) ? dateToTimestamp($document['attributes']['expires']) : 0,
+ if(!empty($version['fileref'])) {
+ $filename = tempnam('/tmp', 'FOO');
+ copy($contentdir.$version['fileref'], $filename);
+ } else {
+ $filecontents = base64_decode($version['data']);
+ if(strlen($filecontents) != $version['data_length']) {
+ $logger->warning("File length (".strlen($filecontents).") doesn't match expected length (".$version['data_length'].").");
+ }
+ $filename = tempnam('/tmp', 'FOO');
+ file_put_contents($filename, $filecontents);
+ }
+ if(!($result = $newDocument->addContent(
+ $version['attributes']['comment'],
$owner,
- isset($document['attributes']['keywords']) ? $document['attributes']['keywords'] : 0,
- $categories,
$filename,
- $initversion['attributes']['orgfilename'],
- $initversion['attributes']['filetype'],
- $initversion['attributes']['mimetype'],
- $document['attributes']['sequence'],
+ $version['attributes']['orgfilename'],
+ $version['attributes']['filetype'],
+ $version['attributes']['mimetype'],
$reviews, //reviewers
$approvals, //approvers
- $initversion['version'],
- isset($initversion['attributes']['comment']) ? $initversion['attributes']['comment'] : '',
- $attributes,
+ $version['version'],
$version_attributes,
- null //workflow
- )
- ) {
+ $workflow
+ ))) {
unlink($filename);
- echo "Error: could not add document\n";
+ $logger->err("Could not add version '".$version['version']."' of document '".$document['attributes']['name']."'");
+ $logger->debug($dms->getDB()->getErrorMsg());
return false;
- } else {
- $newDocument = $result[0];
+ }
+
+ $logger->info("Added version '".$version['version']."' of document '".$document['attributes']['name']."'");
+ $newVersion = $result->getContent();
+ unlink($filename);
+ if($workflowstate)
+ $newVersion->setWorkflowState($workflowstate);
+ $newVersion->setDate(dateToTimestamp($version['attributes']['date']));
+ $newlogs = array();
+ foreach($version['statuslogs'] as $i=>$log) {
+ if(!array_key_exists($log['attributes']['user'], $objmap['users'])) {
+ unset($version['statuslogs'][$i]);
+ $logger->warning("User for status log cannot be mapped");
+ } else {
+ $log['attributes']['user'] = $dms->getUser($objmap['users'][$log['attributes']['user']]);
+ $newlogs[] = $log['attributes'];
+ }
+ }
+ $newVersion->rewriteStatusLog($newlogs);
+
+ if($version['reviews']) {
+ $newreviews = getRevAppLog($version['reviews']);
+ $newVersion->rewriteReviewLog($newreviews);
+ }
+ if($version['approvals']) {
+ $newapprovals = getRevAppLog($version['approvals']);
+ $newVersion->rewriteApprovalLog($newapprovals);
+ }
+
+ if($version['workflowlogs']) {
+ $newworkflowlogs = getWorkflowLog($version['workflowlogs']);
+ if(!$newVersion->rewriteWorkflowLog($newworkflowlogs)) {
+ $logger->err("Could not rewrite workflow log of version '".$newVersion->getVersion()."' of document '".$newDocument->getName()."'");
+ $logger->debug($dms->getDB()->getErrorMsg());
+ return false;
+ }
+ }
+ }
+
+ if(isset($document['notifications']['users']) && $document['notifications']['users']) {
+ foreach($document['notifications']['users'] as $userid) {
+ if(!array_key_exists($userid, $objmap['users'])) {
+ $logger->warning("User for notification cannot be mapped");
+ } else {
+ $newDocument->addNotify($objmap['users'][$userid], 1);
+ }
+ }
+ }
+ if(isset($document['notifications']['groups']) && $document['notifications']['groups']) {
+ foreach($document['notifications']['groups'] as $groupid) {
+ if(!array_key_exists($groupid, $objmap['groups'])) {
+ $logger->warning("User for notification cannot be mapped");
+ } else {
+ $newDocument->addNotify($objmap['groups'][$groupid], 0);
+ }
+ }
+ }
+ if(isset($document['acls']) && $document['acls']) {
+ foreach($document['acls'] as $acl) {
+ if($acl['type'] == 'user') {
+ if(!array_key_exists($acl['user'], $objmap['users'])) {
+ $logger->warning("User for notification cannot be mapped");
+ } else {
+ $newDocument->addAccess($acl['mode'], $objmap['users'][$acl['user']], 1);
+ }
+ } elseif($acl['type'] == 'group') {
+ if(!array_key_exists($acl['group'], $objmap['groups'])) {
+ $logger->warning("Group for notification cannot be mapped");
+ } else {
+ $newDocument->addAccess($acl['mode'], $objmap['groups'][$acl['group']], 0);
+ }
+ }
+ }
+ }
+ if(isset($document['files']) && $document['files']) {
+ foreach($document['files'] as $file) {
+ if(!array_key_exists($file['attributes']['owner'], $objmap['users'])) {
+ $logger->warning("User for file cannot be mapped");
+ $owner = $defaultUser;
+ } else {
+ $owner = $dms->getUser($objmap['users'][$file['attributes']['owner']]);
+ }
+ if(!empty($file['fileref'])) {
+ $filename = tempnam('/tmp', 'FOO');
+ copy($contentdir.$file['fileref'], $filename);
+ } else {
+ $filecontents = base64_decode($file['data']);
+ if(strlen($filecontents) != $file['data_length']) {
+ $logger->warning("File length (".strlen($filecontents).") doesn't match expected length (".$file['data_length'].").");
+ }
+ $filename = tempnam('/tmp', 'FOO');
+ file_put_contents($filename, $filecontents);
+ }
+ $newDocument->addDocumentFile(
+ $file['attributes']['name'],
+ $file['attributes']['comment'],
+ $owner,
+ $filename,
+ $file['attributes']['orgfilename'],
+ $file['attributes']['filetype'],
+ $file['attributes']['mimetype']
+ );
unlink($filename);
-
- $newVersion = $result[1]->getContent();
- $newVersion->setDate(dateToTimestamp($initversion['attributes']['date']));
- $newlogs = array();
- foreach($initversion['statuslogs'] as $i=>$log) {
- if(!array_key_exists($log['attributes']['user'], $objmap['users'])) {
- unset($initversion['statuslogs'][$i]);
- echo "Warning: user for status log cannot be mapped\n";
- } else {
- $log['attributes']['user'] = $dms->getUser($objmap['users'][$log['attributes']['user']]);
- $newlogs[] = $log['attributes'];
- }
- }
- $newVersion->rewriteStatusLog($newlogs);
-
- /* Set reviewers and review log */
- if($initversion['reviews']) {
- $newreviews = getRevAppLog($initversion['reviews']);
- $newVersion->rewriteReviewLog($newreviews);
- }
- if($initversion['approvals']) {
- $newapprovals = getRevAppLog($initversion['approvals']);
- $newVersion->rewriteApprovalLog($newapprovals);
- }
-
- $newDocument->setDate(dateToTimestamp($document['attributes']['date']));
- $newDocument->setDefaultAccess($document['attributes']['defaultaccess']);
- foreach($document['versions'] as $version) {
- if(!array_key_exists((int) $version['attributes']['owner'], $objmap['users'])) {
- echo "Error: owner of document cannot be mapped\n";
- return false;
- }
- $owner = $dms->getUser($objmap['users'][(int) $version['attributes']['owner']]);
-
- $reviews = array('i'=>array(), 'g'=>array());
- /*
- if($version['reviews']) {
- foreach($version['reviews'] as $review) {
- if($review['attributes']['type'] == 1) {
- if(isset($objmap['groups'][(int) $review['attributes']['required']]))
- $reviews['g'][] = $objmap['groups'][(int) $review['attributes']['required']];
- } else {
- if(isset($objmap['users'][(int) $review['attributes']['required']]))
- $reviews['i'][] = $objmap['users'][(int) $review['attributes']['required']];
- }
- }
- }
- */
- $approvals = array('i'=>array(), 'g'=>array());
- /*
- if($version['approvals']) {
- foreach($version['approvals'] as $approval) {
- if($approval['attributes']['type'] == 1) {
- if(isset($objmap['groups'][(int) $approval['attributes']['required']]))
- $approvals['g'][] = $objmap['groups'][(int) $approval['attributes']['required']];
- } else {
- if(isset($objmap['users'][(int) $approval['attributes']['required']]))
- $approvals['i'][] = $objmap['users'][(int) $approval['attributes']['required']];
- }
- }
- }
- */
- $version_attributes = array();
- if(isset($version['user_attributes'])) {
- foreach($version['user_attributes'] as $orgid=>$value) {
- if(array_key_exists((int) $orgid, $objmap['attributedefs'])) {
- $version_attributes[$objmap['attributedefs'][$orgid]] = $value;
- } else {
- echo "Warning: User attribute ".$orgid." cannot be mapped\n";
- }
- }
- }
- if(!empty($version['fileref'])) {
- $filename = tempnam('/tmp', 'FOO');
- copy($version['fileref'], $filename);
- } else {
- $filecontents = base64_decode($version['data']);
- if(strlen($filecontents) != $version['data_length']) {
- echo "Warning: file length (".strlen($filecontents).") doesn't match expected length (".$version['data_length'].").\n";
- }
- $filename = tempnam('/tmp', 'FOO');
- file_put_contents($filename, $filecontents);
- }
- if(!($result = $newDocument->addContent(
- $version['attributes']['comment'],
- $owner,
- $filename,
- $version['attributes']['orgfilename'],
- $version['attributes']['filetype'],
- $version['attributes']['mimetype'],
- $reviews, //reviewers
- $approvals, //approvers
- $version['version'],
- $version_attributes,
- null //workflow
- ))) {
- }
- $newVersion = $result->getContent();
- $newVersion->setDate(dateToTimestamp($version['attributes']['date']));
- $newlogs = array();
- foreach($version['statuslogs'] as $i=>$log) {
- if(!array_key_exists($log['attributes']['user'], $objmap['users'])) {
- unset($version['statuslogs'][$i]);
- echo "Warning: user for status log cannot be mapped\n";
- } else {
- $log['attributes']['user'] = $dms->getUser($objmap['users'][$log['attributes']['user']]);
- $newlogs[] = $log['attributes'];
- }
- }
- $newVersion->rewriteStatusLog($newlogs);
-
- if($version['reviews']) {
- $newreviews = getRevAppLog($version['reviews']);
- $newVersion->rewriteReviewLog($newreviews);
- }
- if($version['approvals']) {
- $newapprovals = getRevAppLog($version['approvals']);
- $newVersion->rewriteApprovalLog($newapprovals);
- }
-
- unlink($filename);
- }
- }
- if(isset($document['notifications']['users']) && $document['notifications']['users']) {
- foreach($document['notifications']['users'] as $userid) {
- if(!array_key_exists($userid, $objmap['users'])) {
- echo "Warning: user for notification cannot be mapped\n";
- } else {
- $newDocument->addNotify($objmap['users'][$userid], 1);
- }
- }
- }
- if(isset($document['notifications']['groups']) && $document['notifications']['groups']) {
- foreach($document['notifications']['groups'] as $groupid) {
- if(!array_key_exists($groupid, $objmap['groups'])) {
- echo "Warning: user for notification cannot be mapped\n";
- } else {
- $newDocument->addNotify($objmap['groups'][$groupid], 0);
- }
- }
- }
- if(isset($document['acls']) && $document['acls']) {
- $newDocument->setInheritAccess(false);
- foreach($document['acls'] as $acl) {
- if($acl['type'] == 'user') {
- if(!array_key_exists($acl['user'], $objmap['users'])) {
- echo "Warning: user for notification cannot be mapped\n";
- } else {
- $newDocument->addAccess($acl['mode'], $objmap['users'][$acl['user']], 1);
- }
- } elseif($acl['type'] == 'group') {
- if(!array_key_exists($acl['group'], $objmap['groups'])) {
- echo "Warning: group for notification cannot be mapped\n";
- } else {
- $newDocument->addAccess($acl['mode'], $objmap['groups'][$acl['group']], 0);
- }
- }
- }
- }
- if(isset($document['files']) && $document['files']) {
- foreach($document['files'] as $file) {
- if(!array_key_exists($file['attributes']['owner'], $objmap['users'])) {
- echo "Warning: user for file cannot be mapped\n";
- $owner = $defaultUser;
- } else {
- $owner = $dms->getUser($objmap['users'][$file['attributes']['owner']]);
- }
- if(!empty($file['fileref'])) {
- $filename = tempnam('/tmp', 'FOO');
- copy($file['fileref'], $filename);
- } else {
- $filecontents = base64_decode($file['data']);
- if(strlen($filecontents) != $file['data_length']) {
- echo "Warning: file length (".strlen($filecontents).") doesn't match expected length (".$file['data_length'].").\n";
- }
- $filename = tempnam('/tmp', 'FOO');
- file_put_contents($filename, $filecontents);
- }
- $newDocument->addDocumentFile(
- $file['attributes']['name'],
- $file['attributes']['comment'],
- $owner,
- $filename,
- $file['attributes']['orgfilename'],
- $file['attributes']['filetype'],
- $file['attributes']['mimetype']
- );
- unlink($filename);
- }
}
}
} else {
@@ -559,13 +773,13 @@ function insert_document($document) { /* {{{ */
} /* }}} */
function insert_folder($folder) { /* {{{ */
- global $dms, $debug, $objmap, $defaultUser, $sections, $rootfolder;
+ global $logger, $dms, $debug, $objmap, $defaultUser, $sections, $rootfolder;
if($debug) print_r($folder);
if(in_array('folders', $sections)) {
if(!array_key_exists($folder['attributes']['owner'], $objmap['users'])) {
- echo "Warning: owner of folder cannot be mapped using default user\n";
+ $logger->warning("Owner of folder cannot be mapped using default user");
$owner = $defaultuser;
} else {
$owner = $dms->getUser($objmap['users'][(int) $folder['attributes']['owner']]);
@@ -577,7 +791,7 @@ function insert_folder($folder) { /* {{{ */
if(array_key_exists((int) $orgid, $objmap['attributedefs'])) {
$attributes[$objmap['attributedefs'][$orgid]] = $value;
} else {
- echo "Warning: User attribute ".$orgid." cannot be mapped\n";
+ $logger->warning("User attribute ".$orgid." cannot be mapped");
}
}
}
@@ -586,23 +800,27 @@ function insert_folder($folder) { /* {{{ */
if(array_key_exists($folder['folder'], $objmap['folders'])) {
$parent = $dms->getFolder($objmap['folders'][$folder['folder']]);
} else {
- echo "Error: Folder ".$folder['folder']." cannot be mapped\n";
+ $logger->err("Folder ".$folder['folder']." cannot be mapped");
exit;
}
} else
$parent = $rootfolder;
if(!$newFolder = $parent->addSubFolder($folder['attributes']['name'], $folder['attributes']['comment'], $owner, $folder['attributes']['sequence'], $attributes)) {
- echo "Error: could not add folder\n";
+ $logger->err("Could not add folder");
+ $logger->debug($dms->getDB()->getErrorMsg());
return false;
+ } else {
+ $logger->info("Added folder '".$folder['attributes']['name']."'");
}
$newFolder->setDate(dateToTimestamp($folder['attributes']['date']));
$newFolder->setDefaultAccess($folder['attributes']['defaultaccess']);
+ $newFolder->setInheritAccess($folder['attributes']['inheritaccess']);
if(isset($folder['notifications']['users']) && $folder['notifications']['users']) {
foreach($folder['notifications']['users'] as $userid) {
if(!array_key_exists($userid, $objmap['users'])) {
- echo "Warning: user for notification cannot be mapped\n";
+ $logger->warning("User for notification cannot be mapped");
} else {
$newFolder->addNotify($objmap['users'][$userid], 1);
}
@@ -611,24 +829,23 @@ function insert_folder($folder) { /* {{{ */
if(isset($folder['notifications']['groups']) && $folder['notifications']['groups']) {
foreach($folder['notifications']['groups'] as $groupid) {
if(!array_key_exists($groupid, $objmap['groups'])) {
- echo "Warning: user for notification cannot be mapped\n";
+ $logger->warning("User for notification cannot be mapped");
} else {
$newFolder->addNotify($objmap['groups'][$groupid], 0);
}
}
}
if(isset($folder['acls']) && $folder['acls']) {
- $newFolder->setInheritAccess(false);
foreach($folder['acls'] as $acl) {
if($acl['type'] == 'user') {
if(!array_key_exists($acl['user'], $objmap['users'])) {
- echo "Warning: user for notification cannot be mapped\n";
+ $logger->warning("User for notification cannot be mapped");
} else {
$newFolder->addAccess($acl['mode'], $objmap['users'][$acl['user']], 1);
}
} elseif($acl['type'] == 'group') {
if(!array_key_exists($acl['group'], $objmap['groups'])) {
- echo "Warning: group for notification cannot be mapped\n";
+ $logger->warning("Group for notification cannot be mapped");
} else {
$newFolder->addAccess($acl['mode'], $objmap['groups'][$acl['group']], 0);
}
@@ -645,7 +862,10 @@ function insert_folder($folder) { /* {{{ */
} /* }}} */
function resolve_links() { /* {{{ */
- global $dms, $debug, $defaultUser, $links, $objmap;
+ global $logger, $dms, $debug, $defaultUser, $links, $objmap;
+
+ if(!$links)
+ return;
if($debug)
print_r($links);
@@ -656,32 +876,73 @@ function resolve_links() { /* {{{ */
if(array_key_exists($doclink['attributes']['target'], $objmap['documents'])) {
if($target = $dms->getDocument($objmap['documents'][$doclink['attributes']['target']])) {
if(!array_key_exists($doclink['attributes']['owner'], $objmap['users'])) {
- echo "Warning: user for link cannot be mapped using default user\n";
+ $logger->warning("User for link cannot be mapped using default user");
$owner = $defaultUser;
} else {
$owner = $dms->getUser($objmap['users'][$doclink['attributes']['owner']]);
}
if(!$doc->addDocumentLink($target->getID(), $owner->getID(), $doclink['attributes']['public'])) {
- echo "Error: could not add document link from ".$doc->getID()." to ".$target->getID()."\n";
+ $logger->err("Could not add document link from ".$doc->getID()." to ".$target->getID());
+ $logger->debug($dms->getDB()->getErrorMsg());
}
} else {
- echo "Warning: target document not found in database\n";
+ $logger->warning("Target document not found in database");
}
} else {
- echo "Warning: target document not found in object mapping\n";
+ $logger->warning("Target document not found in object mapping");
}
}
} else {
- echo "Warning: document not found in database\n";
+ $logger->warning("Document not found in database");
}
} else {
- echo "Warning: document not found in object mapping\n";
+ $logger->warning("Document not found in object mapping");
+ }
+ }
+} /* }}} */
+
+function set_mandatory() { /* {{{ */
+ global $logger, $dms, $users, $objmap;
+
+ if(!$users)
+ return;
+
+ foreach($users as $user) {
+ if ($newUser = $dms->getUserByLogin($user['attributes']['login'])) {
+ if($user['individual']['reviewers']) {
+ foreach($user['individual']['reviewers'] as $u) {
+ if($uobj = $dms->getUser($objmap['users'][$u])) {
+ $newUser->setMandatoryReviewer($uobj->getID(), false);
+ }
+ }
+ }
+ if($user['individual']['approvers']) {
+ foreach($user['individual']['approvers'] as $u) {
+ if($uobj = $dms->getUser($objmap['users'][$u])) {
+ $newUser->setMandatoryApprover($uobj->getID(), false);
+ }
+ }
+ }
+ if($user['group']['reviewers']) {
+ foreach($user['group']['reviewers'] as $u) {
+ if($uobj = $dms->getGroup($objmap['groups'][$u])) {
+ $newUser->setMandatoryReviewer($uobj->getID(), true);
+ }
+ }
+ }
+ if($user['group']['approvers']) {
+ foreach($user['group']['approvers'] as $u) {
+ if($uobj = $dms->getGroup($objmap['groups'][$u])) {
+ $newUser->setMandatoryApprover($uobj->getID(), true);
+ }
+ }
+ }
}
}
} /* }}} */
function startElement($parser, $name, $attrs) { /* {{{ */
- global $dms, $noversioncheck, $elementstack, $objmap, $cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link;
+ global $logger, $dms, $noversioncheck, $elementstack, $objmap, $cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_workflowlog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link, $cur_workflow, $cur_workflowtransition, $cur_workflowaction, $cur_workflowstate, $cur_transition;
$parent = end($elementstack);
array_push($elementstack, array('name'=>$name, 'attributes'=>$attrs));
@@ -691,16 +952,17 @@ function startElement($parser, $name, $attrs) { /* {{{ */
$xdbversion = explode('.', $attrs['DBVERSION']);
$dbversion = $dms->getDBVersion();
if(($xdbversion[0] != $dbversion['major']) || ($xdbversion[1] != $dbversion['minor'])) {
- echo "Error: Database version (".implode('.', array($dbversion['major'], $dbversion['minor'], $dbversion['subminor'])).") doesn't match version in input file (".implode('.', $xdbversion).").\n";
+ $logger->crit("Database version (".implode('.', array($dbversion['major'], $dbversion['minor'], $dbversion['subminor'])).") doesn't match version in input file (".implode('.', $xdbversion).").");
exit(1);
}
}
break;
case "USER":
/* users can be the users data, the member of a group, a mandatory
- * reviewer or approver
+ * reviewer or approver, a workflow transition
*/
$first = $elementstack[1];
+ $second = $elementstack[2];
if($first['name'] == 'USERS') {
if($parent['name'] == 'MANDATORY_REVIEWERS') {
$cur_user['individual']['reviewers'][] = (int) $attrs['ID'];
@@ -712,6 +974,9 @@ function startElement($parser, $name, $attrs) { /* {{{ */
$cur_user['attributes'] = array();
$cur_user['individual']['reviewers'] = array();
$cur_user['individual']['approvers'] = array();
+ $cur_user['group']['reviewers'] = array();
+ $cur_user['group']['approvers'] = array();
+ $cur_user['workflows'] = array();
}
} elseif($first['name'] == 'GROUPS') {
$cur_group['users'][] = (int) $attrs['USER'];
@@ -721,10 +986,13 @@ function startElement($parser, $name, $attrs) { /* {{{ */
} elseif($first['name'] == 'DOCUMENT') {
$cur_document['notifications']['users'][] = (int) $attrs['ID'];
}
+ } elseif($second['name'] == 'WORKFLOW') {
+ $cur_transition['users'][] = (int) $attrs['ID'];
}
break;
case "GROUP":
$first = $elementstack[1];
+ $second = $elementstack[2];
if($first['name'] == 'GROUPS') {
$cur_group = array();
$cur_group['id'] = (int) $attrs['ID'];
@@ -742,12 +1010,18 @@ function startElement($parser, $name, $attrs) { /* {{{ */
} elseif($first['name'] == 'DOCUMENT') {
$cur_document['notifications']['groups'][] = (int) $attrs['ID'];
}
+ } elseif($second['name'] == 'WORKFLOW') {
+ $cur_transition['groups'][] = (int) $attrs['ID'];
}
break;
case "DOCUMENT":
$cur_document = array();
$cur_document['id'] = (int) $attrs['ID'];
- $cur_document['folder'] = (int) $attrs['FOLDER'];
+
+ if(isset($attrs['FOLDER']))
+ $cur_document['folder'] = (int) $attrs['FOLDER'];
+ if(isset($attrs['LOCKED']) && $attrs['LOCKED'] == 'true')
+ $cur_document['locked'] = true;
$cur_document['attributes'] = array();
$cur_document['versions'] = array();
break;
@@ -764,11 +1038,20 @@ function startElement($parser, $name, $attrs) { /* {{{ */
$cur_version['attributes'] = array();
$cur_version['approvals'] = array();
$cur_version['reviews'] = array();
+ $cur_version['statuslogs'] = array();
+ $cur_version['workflowlogs'] = array();
break;
case "STATUSLOG":
$cur_statuslog = array();
$cur_statuslog['attributes'] = array();
break;
+ case "WORKFLOWLOGS":
+ $cur_version['workflowlogs'] = array();
+ break;
+ case "WORKFLOWLOG":
+ $cur_workflowlog = array();
+ $cur_workflowlog['attributes'] = array();
+ break;
case "APPROVAL":
$cur_approval = array();
$cur_approval['attributes'] = array();
@@ -808,6 +1091,8 @@ function startElement($parser, $name, $attrs) { /* {{{ */
}
} elseif($parent['name'] == 'STATUSLOG') {
$cur_statuslog['attributes'][$attrs['NAME']] = '';
+ } elseif($parent['name'] == 'WORKFLOWLOG') {
+ $cur_workflowlog['attributes'][$attrs['NAME']] = '';
} elseif($parent['name'] == 'APPROVAL') {
$cur_approval['attributes'][$attrs['NAME']] = '';
} elseif($parent['name'] == 'APPROVALLOG') {
@@ -834,6 +1119,14 @@ function startElement($parser, $name, $attrs) { /* {{{ */
$cur_file['attributes'][$attrs['NAME']] = '';
} elseif($parent['name'] == 'LINK') {
$cur_link['attributes'][$attrs['NAME']] = '';
+ } elseif($parent['name'] == 'WORKFLOW') {
+ $cur_workflow['attributes'][$attrs['NAME']] = '';
+ } elseif($parent['name'] == 'WORKFLOWTRANSITION') {
+ $cur_workflowtransition['attributes'][$attrs['NAME']] = '';
+ } elseif($parent['name'] == 'WORKFLOWACTION') {
+ $cur_workflowaction['attributes'][$attrs['NAME']] = '';
+ } elseif($parent['name'] == 'TRANSITION') {
+ $cur_transition['attributes'][$attrs['NAME']] = '';
}
break;
case "CATEGORIES":
@@ -890,6 +1183,12 @@ function startElement($parser, $name, $attrs) { /* {{{ */
$cur_file['fileref'] = $attrs['FILEREF'];
else
$cur_file['data'] = "";
+ } elseif($parent['name'] == 'REVIEWLOG') {
+ $cur_reviewlog['data_length'] = (int) $attrs['LENGTH'];
+ if(isset($attrs['FILEREF']))
+ $cur_reviewlog['fileref'] = $attrs['FILEREF'];
+ else
+ $cur_reviewlog['data'] = "";
}
break;
case "KEYWORD":
@@ -942,11 +1241,51 @@ function startElement($parser, $name, $attrs) { /* {{{ */
$cur_link['id'] = (int) $attrs['ID'];
}
break;
+ case "TRANSITIONS":
+ $first = $elementstack[2];
+ if($first['name'] == 'WORKFLOW') {
+ $cur_workflow['transitions'] = array();
+ }
+ break;
+ case "TRANSITION":
+ $first = $elementstack[2];
+ if($first['name'] == 'WORKFLOW') {
+ $cur_transition = array();
+ $cur_transition['id'] = (int) $attrs['ID'];
+ $cur_transition['users'] = array();
+ $cur_transition['groups'] = array();
+ }
+ break;
+ case "WORKFLOW":
+ $first = $elementstack[1];
+ if($first['name'] == 'WORKFLOWS') {
+ $cur_workflow = array();
+ $cur_workflow['id'] = (int) $attrs['ID'];
+ } elseif($parent['name'] == 'MANDATORY_WORKFLOWS') {
+ $cur_user['workflows'][] = (int) $attrs['ID'];
+ } elseif($parent['name'] == 'VERSION') {
+ $cur_version['workflow'] = array('id'=>(int) $attrs['ID'], 'state'=>(int) $attrs['STATE']);
+ }
+ break;
+ case "WORKFLOWACTION":
+ $first = $elementstack[1];
+ if($first['name'] == 'WORKFLOWACTIONS') {
+ $cur_workflowaction = array();
+ $cur_workflowaction['id'] = (int) $attrs['ID'];
+ }
+ break;
+ case "WORKFLOWSTATE":
+ $first = $elementstack[1];
+ if($first['name'] == 'WORKFLOWSTATES') {
+ $cur_workflowstate = array();
+ $cur_workflowstate['id'] = (int) $attrs['ID'];
+ }
+ break;
}
} /* }}} */
function endElement($parser, $name) { /* {{{ */
- global $dms, $sections, $rootfolder, $objmap, $elementstack, $users, $groups, $links,$cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link;
+ global $logger, $dms, $sections, $rootfolder, $objmap, $elementstack, $users, $groups, $links,$cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link, $cur_workflow, $cur_workflowlog, $cur_workflowtransition, $cur_workflowaction, $cur_workflowstate, $cur_transition;
array_pop($elementstack);
$parent = end($elementstack);
@@ -965,6 +1304,9 @@ function endElement($parser, $name) { /* {{{ */
case "STATUSLOG":
$cur_version['statuslogs'][] = $cur_statuslog;
break;
+ case "WORKFLOWLOG":
+ $cur_version['workflowlogs'][] = $cur_workflowlog;
+ break;
case "APPROVAL":
$cur_version['approvals'][] = $cur_approval;
break;
@@ -1016,11 +1358,61 @@ function endElement($parser, $name) { /* {{{ */
$cur_document['links'][] = $cur_link;
}
break;
+ case "TRANSITION":
+ $second = $elementstack[2];
+ if($second['name'] == 'WORKFLOW') {
+ $cur_workflow['transitions'][] = $cur_transition;
+ }
+ break;
+ case 'WORKFLOW':
+ $first = $elementstack[1];
+ if($first['name'] == 'WORKFLOWS') {
+ insert_workflow($cur_workflow);
+ }
+ break;
+ case 'WORKFLOWACTION':
+ insert_workflowaction($cur_workflowaction);
+ break;
+ case 'WORKFLOWSTATE':
+ insert_workflowstate($cur_workflowstate);
+ break;
+ case 'WORKFLOWS':
+ /* Workflows has all been added. It's time to set the mandatory workflows
+ * of each user.
+ */
+ foreach($users as $tuser) {
+ if($tuser['workflows']) {
+ if(!$user = $dms->getUser($objmap['users'][$tuser['id']])) {
+ $logger->err("Cannot find user for adding mandatory workflows");
+ exit;
+ }
+ foreach($tuser['workflows'] as $tworkflowid) {
+ if(!$wk = $dms->getWorkflow($objmap['workflows'][$tworkflowid])) {
+ $logger->err("Cannot find workflow for adding mandatory workflows");
+ exit;
+ }
+ $user->setMandatoryWorkflow($wk);
+ }
+ foreach($tuser['individual']['reviewers'] as $userid) {
+ $user->setMandatoryReviewer($objmap['users'][$userid], false);
+ }
+ foreach($tuser['individual']['approvers'] as $userid) {
+ $user->setMandatoryApprover($objmap['users'][$userid], false);
+ }
+ foreach($tuser['group']['reviewers'] as $groupid) {
+ $user->setMandatoryReviewer($objmap['groups'][$groupid], true);
+ }
+ foreach($tuser['group']['approvers'] as $userid) {
+ $user->setMandatoryApprover($objmap['groups'][$groupid], true);
+ }
+ }
+ }
+ break;
}
} /* }}} */
function characterData($parser, $data) { /* {{{ */
- global $elementstack, $objmap, $cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link;
+ global $elementstack, $objmap, $cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link, $cur_workflow, $cur_workflowlog, $cur_workflowtransition, $cur_workflowaction, $cur_workflowstate, $cur_transition;
$current = end($elementstack);
$parent = prev($elementstack);
@@ -1029,39 +1421,72 @@ function characterData($parser, $data) { /* {{{ */
switch($parent['name']) {
case 'DOCUMENT':
if(isset($current['attributes']['TYPE']) && $current['attributes']['TYPE'] == 'user') {
- $cur_document['user_attributes'][$current['attributes']['ATTRDEF']] = $data;
+ if(isset($cur_document['user_attributes'][$current['attributes']['ATTRDEF']]))
+ $cur_document['user_attributes'][$current['attributes']['ATTRDEF']] .= $data;
+ else
+ $cur_document['user_attributes'][$current['attributes']['ATTRDEF']] = $data;
} else {
- $cur_document['attributes'][$current['attributes']['NAME']] = $data;
+ if(isset($cur_document['attributes'][$current['attributes']['NAME']]))
+ $cur_document['attributes'][$current['attributes']['NAME']] .= $data;
+ else
+ $cur_document['attributes'][$current['attributes']['NAME']] = $data;
}
break;
case 'FOLDER':
if(isset($current['attributes']['TYPE']) && $current['attributes']['TYPE'] == 'user') {
- $cur_folder['user_attributes'][$current['attributes']['ATTRDEF']] = $data;
+ if(isset($cur_folder['user_attributes'][$current['attributes']['ATTRDEF']]))
+ $cur_folder['user_attributes'][$current['attributes']['ATTRDEF']] .= $data;
+ else
+ $cur_folder['user_attributes'][$current['attributes']['ATTRDEF']] = $data;
} else {
- $cur_folder['attributes'][$current['attributes']['NAME']] = $data;
+ if(isset($cur_folder['attributes'][$current['attributes']['NAME']]))
+ $cur_folder['attributes'][$current['attributes']['NAME']] .= $data;
+ else
+ $cur_folder['attributes'][$current['attributes']['NAME']] = $data;
}
break;
case 'VERSION':
if(isset($current['attributes']['TYPE']) && $current['attributes']['TYPE'] == 'user') {
- $cur_version['user_attributes'][$current['attributes']['ATTRDEF']] = $data;
+ if(isset($cur_version['user_attributes'][$current['attributes']['ATTRDEF']]))
+ $cur_version['user_attributes'][$current['attributes']['ATTRDEF']] .= $data;
+ else
+ $cur_version['user_attributes'][$current['attributes']['ATTRDEF']] = $data;
} else {
- $cur_version['attributes'][$current['attributes']['NAME']] = $data;
+ if(isset($cur_version['attributes'][$current['attributes']['NAME']]))
+ $cur_version['attributes'][$current['attributes']['NAME']] .= $data;
+ else
+ $cur_version['attributes'][$current['attributes']['NAME']] = $data;
}
break;
case 'STATUSLOG':
- $cur_statuslog['attributes'][$current['attributes']['NAME']] = $data;
+ if(isset($cur_statuslog['attributes'][$current['attributes']['NAME']]))
+ $cur_statuslog['attributes'][$current['attributes']['NAME']] .= $data;
+ else
+ $cur_statuslog['attributes'][$current['attributes']['NAME']] = $data;
break;
case 'APPROVAL':
$cur_approval['attributes'][$current['attributes']['NAME']] = $data;
break;
case 'APPROVALLOG':
- $cur_approvallog['attributes'][$current['attributes']['NAME']] = $data;
+ if(isset($cur_approvallog['attributes'][$current['attributes']['NAME']]))
+ $cur_approvallog['attributes'][$current['attributes']['NAME']] .= $data;
+ else
+ $cur_approvallog['attributes'][$current['attributes']['NAME']] = $data;
break;
case 'REVIEW':
$cur_review['attributes'][$current['attributes']['NAME']] = $data;
break;
case 'REVIEWLOG':
- $cur_reviewlog['attributes'][$current['attributes']['NAME']] = $data;
+ if(isset($cur_reviewlog['attributes'][$current['attributes']['NAME']]))
+ $cur_reviewlog['attributes'][$current['attributes']['NAME']] .= $data;
+ else
+ $cur_reviewlog['attributes'][$current['attributes']['NAME']] = $data;
+ break;
+ case 'WORKFLOWLOG':
+ if(isset($cur_workflowlog['attributes'][$current['attributes']['NAME']]))
+ $cur_workflowlog['attributes'][$current['attributes']['NAME']] .= $data;
+ else
+ $cur_workflowlog['attributes'][$current['attributes']['NAME']] = $data;
break;
case 'USER':
if(isset($cur_user['attributes'][$current['attributes']['NAME']]))
@@ -1103,11 +1528,35 @@ function characterData($parser, $data) { /* {{{ */
$cur_user['image']['mimetype'] = $data;
break;
case 'FILE':
- $cur_file['attributes'][$current['attributes']['NAME']] = $data;
+ if(isset($cur_file['attributes'][$current['attributes']['NAME']]))
+ $cur_file['attributes'][$current['attributes']['NAME']] .= $data;
+ else
+ $cur_file['attributes'][$current['attributes']['NAME']] = $data;
break;
case 'LINK':
$cur_link['attributes'][$current['attributes']['NAME']] = $data;
break;
+ case 'WORKFLOW':
+ if(isset($cur_workflow['attributes'][$current['attributes']['NAME']]))
+ $cur_workflow['attributes'][$current['attributes']['NAME']] .= $data;
+ else
+ $cur_workflow['attributes'][$current['attributes']['NAME']] = $data;
+ break;
+ case 'WORKFLOWSTATE':
+ if(isset($cur_workflowstate['attributes'][$current['attributes']['NAME']]))
+ $cur_workflowstate['attributes'][$current['attributes']['NAME']] .= $data;
+ else
+ $cur_workflowstate['attributes'][$current['attributes']['NAME']] = $data;
+ break;
+ case 'WORKFLOWACTION':
+ if(isset($cur_workflowaction['attributes'][$current['attributes']['NAME']]))
+ $cur_workflowaction['attributes'][$current['attributes']['NAME']] .= $data;
+ else
+ $cur_workflowaction['attributes'][$current['attributes']['NAME']] = $data;
+ break;
+ case 'TRANSITION':
+ $cur_transition['attributes'][$current['attributes']['NAME']] = $data;
+ break;
}
break;
case 'DATA':
@@ -1121,6 +1570,9 @@ function characterData($parser, $data) { /* {{{ */
case 'FILE':
$cur_file['data'] .= $data;
break;
+ case 'REVIEWLOG':
+ $cur_reviewlog['data'] .= $data;
+ break;
}
break;
case 'USER':
@@ -1153,6 +1605,12 @@ if(isset($options['v']) || isset($options['verѕion'])) {
exit(0);
}
+$logfile = "xmlimport.log";
+$logconf = array();
+$logconf['timeformat'] = '%Y-%m-%d %H:%M:%S';
+$logconf['lineFormat'] = '%{timestamp} %{priority} xmlimport: %{ident} %{message}';
+$logger = Log::factory('file', $logfile, '', $logconf);
+
/* Check for debug mode */
$debug = false;
if(isset($options['debug'])) {
@@ -1178,7 +1636,7 @@ if(isset($options['contentdir'])) {
if(substr($contentdir, -1, 1) != DIRECTORY_SEPARATOR)
$contentdir .= DIRECTORY_SEPARATOR;
} else {
- echo "Directory ".$options['contentdir']." does not exists\n";
+ $logger->crit("Directory ".$options['contentdir']." does not exists");
exit(1);
}
} else {
@@ -1209,7 +1667,7 @@ if(isset($options['no-version-check'])) {
$noversioncheck = true;
}
-$sections = array('documents', 'folders', 'groups', 'users', 'keywordcategories', 'documentcategories', 'attributedefinitions');
+$sections = array('documents', 'folders', 'groups', 'users', 'keywordcategories', 'documentcategories', 'attributedefinitions', 'workflows');
if(isset($options['sections'])) {
$sections = explode(',', $options['sections']);
}
@@ -1224,7 +1682,7 @@ $db->connect() or die ("Could not connect to db-server \"" . $settings->_dbHostn
$dms = new SeedDMS_Core_DMS($db, $settings->_contentDir.$settings->_contentOffsetDir);
if(!$settings->_doNotCheckDBVersion && !$dms->checkVersion()) {
- echo "Database update needed.";
+ $logger->crit("Database update needed.");
exit;
}
$dms->setRootFolderID($settings->_rootFolderID);
@@ -1236,7 +1694,7 @@ if(!$rootfolder) {
if($defaultuserid) {
if(!$defaultUser = $dms->getUser($defaultuserid)) {
- echo "Error: Could not find default user with id ".$defaultuserid."\n";
+ $logger->crit("Could not find default user with id ".$defaultuserid);
exit(1);
}
} else {
@@ -1252,6 +1710,9 @@ $objmap = array(
'groups' => array(),
'folders' => array(),
'documents' => array(),
+ 'workflows' => array(),
+ 'workflowstates' => array(),
+ 'workflowactions' => array(),
);
$xml_parser = xml_parser_create("UTF-8");
@@ -1270,6 +1731,7 @@ while ($data = fread($fp, 65535)) {
}
resolve_links();
+set_mandatory();
set_homefolders();
@@ -1283,7 +1745,7 @@ if($exportmapping) {
}
fclose($fp);
} else {
- echo "Error: could not open mapping file '".$exportmapping."'\n";
+ $logger->err("Could not open mapping file '".$exportmapping."'");
}
}
?>
diff --git a/views/bootstrap/class.AddDocument.php b/views/bootstrap/class.AddDocument.php
index 4cd62ae6f..e4ee18615 100644
--- a/views/bootstrap/class.AddDocument.php
+++ b/views/bootstrap/class.AddDocument.php
@@ -74,6 +74,45 @@ $(document).ready(function() {
$('#new-file').click(function(event) {
$("#upload-file").clone().appendTo("#upload-files").removeAttr("id").children('div').children('input').val('');
});
+
+ jQuery.validator.addMethod("alternatives", function(value, element, params) {
+ if(value == '' && params.val() == '')
+ return false;
+ return true;
+ }, "");
+ $("#form1").validate({
+ invalidHandler: function(e, validator) {
+ noty({
+ text: (validator.numberOfInvalids() == 1) ? "".replace('#', validator.numberOfInvalids()) : "".replace('#', validator.numberOfInvalids()),
+ type: 'error',
+ dismissQueue: true,
+ layout: 'topRight',
+ theme: 'defaultTheme',
+ timeout: 1500,
+ });
+ },
+ rules: {
+ 'userfile[]': {
+ alternatives: $('#dropfolderfileform1')
+ },
+ dropfolderfileform1: {
+ alternatives: $(".btn-file input")
+ }
+ },
+ messages: {
+ name: "",
+ comment: "",
+ keywords: ""
+ },
+ errorPlacement: function( error, element ) {
+ if ( element.is( ":file" ) ) {
+ error.appendTo( element.parent().parent().parent());
+console.log(element);
+ } else {
+ error.appendTo( element.parent());
+ }
+ }
+ });
});
printKeywordChooserJs("form1");
@@ -98,6 +137,8 @@ $(document).ready(function() {
$orderby = $this->params['orderby'];
$folderid = $folder->getId();
+ $this->htmlAddHeader(''."\n", 'js');
+
$this->htmlStartPage(getMLText("folder_title", array("foldername" => htmlspecialchars($folder->getName()))));
$this->globalNavigation($folder);
$this->contentStart();
@@ -131,7 +172,7 @@ $(document).ready(function() {
| : |
- |
+ |
| : |
diff --git a/views/bootstrap/class.AddSubFolder.php b/views/bootstrap/class.AddSubFolder.php
index 0e9f53aa1..6f5e74b55 100644
--- a/views/bootstrap/class.AddSubFolder.php
+++ b/views/bootstrap/class.AddSubFolder.php
@@ -61,10 +61,27 @@ function checkForm()
return true;
}
$(document).ready( function() {
- $('body').on('submit', '#form1', function(ev){
+/* $('body').on('submit', '#form1', function(ev){
if(checkForm()) return;
ev.preventDefault();
});
+*/
+ $("#form1").validate({
+ invalidHandler: function(e, validator) {
+ noty({
+ text: (validator.numberOfInvalids() == 1) ? "".replace('#', validator.numberOfInvalids()) : "".replace('#', validator.numberOfInvalids()),
+ type: 'error',
+ dismissQueue: true,
+ layout: 'topRight',
+ theme: 'defaultTheme',
+ timeout: 1500,
+ });
+ },
+ messages: {
+ name: "",
+ comment: ""
+ },
+ });
});
params['strictformcheck'];
$orderby = $this->params['orderby'];
+ $this->htmlAddHeader(''."\n", 'js');
+
$this->htmlStartPage(getMLText("folder_title", array("foldername" => htmlspecialchars($folder->getName()))));
$this->globalNavigation($folder);
$this->contentStart();
@@ -91,11 +110,11 @@ $(document).ready( function() {
| : |
- |
+ |
| : |
- |
+ |
| : |
diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php
index fb51bde39..966603298 100644
--- a/views/bootstrap/class.Bootstrap.php
+++ b/views/bootstrap/class.Bootstrap.php
@@ -87,6 +87,7 @@ class SeedDMS_Bootstrap_Style extends SeedDMS_View_Common {
echo ''."\n";
echo ''."\n";
echo ''."\n";
+ echo ''."\n";
echo ''."\n";
echo ''."\n";
// echo ''."\n";
@@ -1081,9 +1082,10 @@ function folderSelected(id, name) {
} /* }}} */
function printKeywordChooserHtml($formName, $keywords='', $fieldname='keywords') { /* {{{ */
+ $strictformcheck = $this->params['strictformcheck'];
?>
@@ -1130,7 +1132,7 @@ $('#acceptkeywords').click(function(ev) {
case SeedDMS_Core_AttributeDefinition::type_date:
$objvalue = $attribute ? (is_object($attribute) ? $attribute->getValue() : $attribute) : '';
?>
-
+
">
@@ -1145,7 +1147,7 @@ $('#acceptkeywords').click(function(ev) {
} else {
echo "\"";
}
- echo ">";
+ echo "".($attrdef->getMinValues() > 0 ? ' required' : '').">";
if(!$attrdef->getMultipleValues()) {
echo "";
}
@@ -1164,9 +1166,9 @@ $('#acceptkeywords').click(function(ev) {
} else {
$objvalue = $attribute ? (is_object($attribute) ? $attribute->getValue() : $attribute) : '';
if(strlen($objvalue) > 80) {
- echo "";
+ echo "";
} else {
- echo "getId()."]\" value=\"".htmlspecialchars($objvalue)."\" />";
+ echo "getId()."]\" value=\"".htmlspecialchars($objvalue)."\"".($attrdef->getMinValues() > 0 ? ' required' : '').($attrdef->getType() == SeedDMS_Core_AttributeDefinition::type_int ? ' data-rule-digits="true"' : '')." />";
}
}
break;
@@ -1830,7 +1832,7 @@ $(document).ready( function() {
$attentionstr .= "
getImgPath("lock.png")."\" title=\"". getMLText("locked_by").": ".htmlspecialchars($document->getLockingUser()->getFullName())."\"> ";
}
if ( $needwkflaction ) {
- $attentionstr .= "
getImgPath("attention.gif")."\" title=\"". getMLText("workflow").": "."\"> ";
+ $attentionstr .= "
getImgPath("attention.gif")."\" title=\"". getMLText("workflow").": ".htmlspecialchars($workflow->getName())."\"> ";
}
if($attentionstr)
$content .= $attentionstr."
";
diff --git a/views/bootstrap/class.EditDocument.php b/views/bootstrap/class.EditDocument.php
index 70f441e4c..fb085e5e3 100644
--- a/views/bootstrap/class.EditDocument.php
+++ b/views/bootstrap/class.EditDocument.php
@@ -65,10 +65,29 @@ function checkForm()
}
$(document).ready( function() {
+/*
$('body').on('submit', '#form1', function(ev){
if(checkForm()) return;
ev.preventDefault();
});
+*/
+ $("#form1").validate({
+ invalidHandler: function(e, validator) {
+ noty({
+ text: (validator.numberOfInvalids() == 1) ? "".replace('#', validator.numberOfInvalids()) : "".replace('#', validator.numberOfInvalids()),
+ type: 'error',
+ dismissQueue: true,
+ layout: 'topRight',
+ theme: 'defaultTheme',
+ timeout: 1500,
+ });
+ },
+ messages: {
+ name: "",
+ comment: "",
+ keywords: ""
+ }
+ });
});
params['strictformcheck'];
$orderby = $this->params['orderby'];
+ $this->htmlAddHeader(''."\n", 'js');
+
$this->htmlStartPage(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))));
$this->globalNavigation($folder);
$this->contentStart();
@@ -100,11 +121,11 @@ $(document).ready( function() {
| : |
- |
+ |
| : |
- |
+ |
| : |
diff --git a/views/bootstrap/class.EditFolder.php b/views/bootstrap/class.EditFolder.php
index 82e29a423..edb215f21 100644
--- a/views/bootstrap/class.EditFolder.php
+++ b/views/bootstrap/class.EditFolder.php
@@ -60,10 +60,28 @@ function checkForm()
return true;
}
$(document).ready(function() {
+/*
$('body').on('submit', '#form1', function(ev){
if(checkForm()) return;
ev.preventDefault();
});
+*/
+ $("#form1").validate({
+ invalidHandler: function(e, validator) {
+ noty({
+ text: (validator.numberOfInvalids() == 1) ? "".replace('#', validator.numberOfInvalids()) : "".replace('#', validator.numberOfInvalids()),
+ type: 'error',
+ dismissQueue: true,
+ layout: 'topRight',
+ theme: 'defaultTheme',
+ timeout: 1500,
+ });
+ },
+ messages: {
+ name: "",
+ comment: ""
+ },
+ });
});
params['strictformcheck'];
$orderby = $this->params['orderby'];
+ $this->htmlAddHeader(''."\n", 'js');
+
$this->htmlStartPage(getMLText("folder_title", array("foldername" => htmlspecialchars($folder->getName()))));
$this->globalNavigation($folder);
$this->contentStart();
@@ -90,11 +110,11 @@ $(document).ready(function() {
| : |
- |
+ |
| : |
- |
+ |
getID() == $rootfolderid) ? false : $folder->getParent();
diff --git a/views/bootstrap/class.EditUserData.php b/views/bootstrap/class.EditUserData.php
index 9d5a5b983..632d4ec58 100644
--- a/views/bootstrap/class.EditUserData.php
+++ b/views/bootstrap/class.EditUserData.php
@@ -57,10 +57,44 @@ function checkForm()
}
$(document).ready( function() {
+/*
$('body').on('submit', '#form', function(ev){
if(checkForm()) return;
ev.preventDefault();
});
+*/
+ $("#form").validate({
+ invalidHandler: function(e, validator) {
+ noty({
+ text: (validator.numberOfInvalids() == 1) ? "".replace('#', validator.numberOfInvalids()) : "".replace('#', validator.numberOfInvalids()),
+ type: 'error',
+ dismissQueue: true,
+ layout: 'topRight',
+ theme: 'defaultTheme',
+ timeout: 1500,
+ });
+ },
+ rules: {
+ fullname: {
+ required: true
+ },
+ email: {
+ required: true,
+ email: true
+ },
+ pwdconf: {
+ equalTo: "#pwd"
+ }
+ },
+ messages: {
+ fullname: "",
+ email: {
+ required: "",
+ email: ""
+ },
+ pwdconf: "",
+ },
+ });
});
params['passwordstrength'];
$httproot = $this->params['httproot'];
+ $this->htmlAddHeader(''."\n", 'js');
+
$this->htmlStartPage(getMLText("edit_user_details"));
$this->globalNavigation();
$this->contentStart();
diff --git a/views/bootstrap/class.Login.php b/views/bootstrap/class.Login.php
index 57e4ac132..c68311d93 100644
--- a/views/bootstrap/class.Login.php
+++ b/views/bootstrap/class.Login.php
@@ -69,14 +69,32 @@ function guestLogin()
document.location.href = url;
}
$(document).ready( function() {
+/*
$('body').on('submit', '#form', function(ev){
if(checkForm()) return;
ev.preventDefault();
});
+*/
$('body').on('click', '#guestlogin', function(ev){
ev.preventDefault();
guestLogin();
});
+ $("#form").validate({
+ invalidHandler: function(e, validator) {
+ noty({
+ text: (validator.numberOfInvalids() == 1) ? "".replace('#', validator.numberOfInvalids()) : "".replace('#', validator.numberOfInvalids()),
+ type: 'error',
+ dismissQueue: true,
+ layout: 'topRight',
+ theme: 'defaultTheme',
+ timeout: 1500,
+ });
+ },
+ messages: {
+ login: "",
+ pwd: ""
+ },
+ });
});
params['enablelanguageselector'];
$enableThemeSelector = $this->params['enablethemeselector'];
+ $this->htmlAddHeader(''."\n", 'js');
+
$this->htmlStartPage(getMLText("sign_in"), "login");
$this->globalBanner();
$this->contentStart();
@@ -105,13 +125,13 @@ $(document).ready( function() {
diff --git a/views/bootstrap/class.MyDocuments.php b/views/bootstrap/class.MyDocuments.php
index 35e162c25..2be8f7014 100644
--- a/views/bootstrap/class.MyDocuments.php
+++ b/views/bootstrap/class.MyDocuments.php
@@ -629,7 +629,7 @@ class SeedDMS_View_MyDocuments extends SeedDMS_Bootstrap_Style {
print "
getMimeIcon($latestContent->getFileType())."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">";
}
print "";
- print "" . htmlspecialchars($res["name"]) . " | \n";
+ print "" . htmlspecialchars($res["name"]) . " | \n";
print "".getOverallStatusText($res["status"])." | ";
print "".$res["version"]." | ";
print "".$res["statusDate"]." ".htmlspecialchars($res["statusName"])." | ";
diff --git a/views/bootstrap/class.RemoveWorkflow.php b/views/bootstrap/class.RemoveWorkflow.php
index 8ffac1287..e64442005 100644
--- a/views/bootstrap/class.RemoveWorkflow.php
+++ b/views/bootstrap/class.RemoveWorkflow.php
@@ -57,7 +57,7 @@ class SeedDMS_View_RemoveWorkflow extends SeedDMS_Bootstrap_Style {
-
+
");
+ $("#form1").validate({
+ invalidHandler: function(e, validator) {
+ noty({
+ text: (validator.numberOfInvalids() == 1) ? "".replace('#', validator.numberOfInvalids()) : "".replace('#', validator.numberOfInvalids()),
+ type: 'error',
+ dismissQueue: true,
+ layout: 'topRight',
+ theme: 'defaultTheme',
+ timeout: 1500,
+ });
+ },
+ rules: {
+ userfile: {
+ alternatives: $('#dropfolderfileform1')
+ },
+ dropfolderfileform1: {
+ alternatives: $('#userfile')
+ }
+ },
+ messages: {
+ comment: "",
+ },
+ errorPlacement: function( error, element ) {
+ if ( element.is( ":file" ) ) {
+ error.appendTo( element.parent().parent().parent());
+console.log(element);
+ } else {
+ error.appendTo( element.parent());
+ }
+ }
+ });
});
params['presetexpiration'];
$documentid = $document->getId();
+ $this->htmlAddHeader(''."\n", 'js');
+
$this->htmlStartPage(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))));
$this->globalNavigation($folder);
$this->contentStart();
@@ -163,7 +203,7 @@ $(document).ready( function() {
| : |
-
+
|
triggerWorkflowTransitionIsAllowed($user, $transition)) {
+ $user_is_involved = true;
+ }
+ }
?>
";
+ if($user_is_involved || $user->isAdmin())
+ echo "
";
+ else
+ echo "
";
$this->contentContainerStart();
if($user->isAdmin()) {
if(SeedDMS_Core_DMS::checkIfEqual($workflow->getInitState(), $latestContent->getWorkflowState())) {
@@ -800,15 +812,14 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style {
if($parentworkflow = $latestContent->getParentWorkflow()) {
echo "
Sub workflow of '".$parentworkflow->getName()."'
";
}
- echo "
";
- echo "
";
echo "
".getMLText('current_state').": ".$workflowstate->getName()."
";
echo "
\n";
echo "";
echo "| ".getMLText('next_state').": | ";
foreach($transitions as $transition) {
$nextstate = $transition->getNextState();
- echo "".$nextstate->getName()." | ";
+ $docstatus = $nextstate->getDocumentStatus();
+ echo " ".$nextstate->getName()." | ";
}
echo "
";
echo "";
@@ -877,11 +888,13 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style {
echo "
";
echo "";
echo " | ";
+ $allowedtransitions = array();
foreach($transitions as $transition) {
echo "";
if($latestContent->triggerWorkflowTransitionIsAllowed($user, $transition)) {
$action = $transition->getAction();
print "";
+ $allowedtransitions[] = $transition;
}
echo " | ";
}
@@ -957,9 +970,16 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style {
}
}
}
- echo "";
- echo "";
$this->contentContainerEnd();
+ echo "";
+ if($user_is_involved || $user->isAdmin()) {
+ echo "";
+?>
+
+";
+ }
+ echo "
";
?>
workflow = $this->params['workflow'];
+ /* curtransitions is a list of transition that shall be highlighted.
+ * It is used to mark the current transition a user can trigger.
+ * Setting this will automatically show all other transitions with
+ * higher opacity.
+ */
+ $this->curtransitions = $this->params['transitions'];
header('Content-Type: application/javascript; charset=UTF-8');
-?>
-$(document).ready(function() {
- var width = $('#canvas').width();
- var height = $('#canvas').height();;
- var ggg = new Graph();
- ggg.edgeFactory.template.style.directed = true;
- var render_action = function(r, n) {
- /* the Raphael set is obligatory, containing all you want to display */
- var set = r.set().push(
- /* custom objects go here */
- r.rect(n.point[0]-45, n.point[1]-13, 90, 44).attr({"fill": (n.color == undefined ? "#feb" : n.color), r : "12px", "stroke-width" : "1px" })).push(
- r.text(n.point[0], n.point[1] + 10, (n.label || n.id) + "\n(" + (n.maxtime == undefined ? "Infinity" : n.maxtime) + ")"));
- return set;
- };
-
-seentrans = array();
- $state = $this->workflow->getInitState();
- $this->states = array();
- $this->actions = array();
- $this->printGraph();
+ $renderdata = '';
?>
- var layouter = new Graph.Layout.Spring(ggg);
- var renderer = new Graph.Renderer.Raphael('canvas', ggg, width, height);
+var cy = cytoscape({
+ container: document.getElementById('canvas'),
+
+ style: [
+ {
+ selector: 'node',
+ style: {
+ 'content': 'data(name)',
+ 'height': 40,
+ 'width': 40,
+ 'text-valign': 'top',
+ 'text-halign': 'center',
+// 'color': '#fff',
+ 'background-color': '#11479e',
+// 'text-outline-color': '#11479e',
+// 'text-outline-width': '3px',
+// 'font-size': '10px',
+ 'text-wrap': 'wrap'
+ }
+ },
+
+ {
+ selector: 'node.action',
+ style: {
+ 'shape': 'roundrectangle',
+ 'height': 30,
+ 'width': 30,
+ 'background-color': '#91479e',
+// 'text-outline-color': '#91479e'
+ }
+ },
+
+ {
+ selector: 'node.current',
+ style: {
+ 'font-weight': 'bold',
+ }
+ },
+
+ {
+ selector: 'node.light',
+ style: {
+ 'opacity': '0.3',
+ }
+ },
+
+ {
+ selector: 'node.init',
+ style: {
+ 'background-color': '#ff9900',
+// 'text-outline-color': '#b06000'
+ }
+ },
+
+ {
+ selector: 'node.released',
+ style: {
+ 'background-color': '#00b000',
+ 'text-valign': 'bottom',
+ 'text-margin-y': '3px',
+// 'text-outline-color': '#00b000'
+ }
+ },
+
+ {
+ selector: 'node.rejected',
+ style: {
+ 'background-color': '#b00000',
+ 'text-valign': 'bottom',
+ 'text-margin-y': '3px',
+// 'text-outline-color': '#b00000'
+ }
+ },
+
+ {
+ selector: 'edge',
+ style: {
+ 'width': 4,
+ 'curve-style': 'bezier',
+ 'target-arrow-shape': 'triangle',
+ 'line-color': '#9dbaea',
+ 'target-arrow-color': '#9dbaea',
+ 'curve-style': 'bezier'
+ }
+ },
+
+ {
+ selector: 'edge.light',
+ style: {
+ 'opacity': '0.3',
+ }
+ }
+ ]
});
+cy.gridGuide({
+ discreteDrag: false,
+ guidelinesStyle: {
+ strokeStyle: "red"
+ }
+});
+
+cy.on('free', 'node', function(evt) {
+ $('#png').attr('src', cy.png({'full': true}));
+});
+
+cy.on('tap', 'node', function(evt) {
+ var node = evt.cyTarget;
+ var scratch = node.scratch('app');
+ if(typeof scratch !== 'undefined') {
+ noty({
+ text: (scratch.users ? ': ' + scratch.users + '
' : '') + (scratch.groups ? ': ' + scratch.groups + '' : ''),
+ type: 'information',
+ dismissQueue: true,
+ layout: 'topCenter',
+ theme: 'defaultTheme',
+ timeout: 4000,
+ killer: true,
+ });
+ }
+});
+
+cy.on('zoom', function(evt) {
+ $('#zoom button').text(Math.round(cy.zoom()*100)+'%');
+});
+
+printGraph();
+?>
+ cy.layout({ name: 'cose', ready: function() {$('#png').attr('src', cy.png({'full': true}))} });
+ cy.maxZoom(2.5);
+ cy.minZoom(0.4);
+ $('#zoom button').text(Math.round(cy.zoom()*100)+'%');
+
+$(document).ready(function() {
+ $('body').on('click', '#setlayout', function(ev){
+ ev.preventDefault();
+ var element = $(this);
+ cy.layout({name: element.data('layout'), ready: function() {$('#png').attr('src', cy.png({'full': true}))}});
+ });
+ $('body').on('click', '#zoom button', function(ev){
+ cy.zoom(1);
+ cy.center();
+ });
+});
workflow->getTransitions();
if($transitions) {
+ $this->seentrans = array();
+ $this->states = array();
+ $this->actions = array();
+ $highlightstates = array();
foreach($transitions as $transition) {
$action = $transition->getAction();
$maxtime = $transition->getMaxTime();
@@ -75,62 +206,103 @@ $(document).ready(function() {
$nextstate = $transition->getNextState();
if(1 || !isset($this->actions[$action->getID()])) {
- $color = "#4B4";
- $iscurtransition = $this->curtransition && $transition->getID() == $this->curtransition->getID();
- if($iscurtransition) {
- $color = "#D00";
- } else {
- if($this->wkflog) {
- foreach($this->wkflog as $entry) {
- if($entry->getTransition()->getID() == $transition->getID()) {
- $color = "#DDD";
- break;
- }
- }
- }
+ $iscurtransition = false;
+ if($this->curtransitions) {
+ foreach($this->curtransitions as $tr)
+ if($transition->getID() == $tr->getID())
+ $iscurtransition = true;
}
+
$this->actions[$action->getID()] = $action->getID();
$transusers = $transition->getUsers();
$unames = array();
foreach($transusers as $transuser) {
$unames[] = $transuser->getUser()->getFullName();
}
- echo "ggg.addNode(\"A".$transition->getID()."-".$action->getID()."\", { render: render_action, maxtime: \"".str_replace('"', "\\\"", implode(", ", $unames))."\", label : \"".str_replace('"', "\\\"", $action->getName())."\", color: '".$color."' });\n";
+ $transgroups = $transition->getGroups();
+ $gnames = array();
+ foreach($transgroups as $transgroup) {
+ $gnames[] = $transgroup->getGroup()->getName();
+ }
+ echo "cy.add({
+ data: {
+ id: 'A".$transition->getID()."-".$action->getID()."',
+ name: \"".str_replace('"', "\\\"", $action->getName())/*.($unames ? "\\n(".str_replace('"', "\\\"", implode(", ", $unames)).")" : '').($gnames ? "\\n(".str_replace('"', "\\\"", implode(", ", $gnames)).")" : '')*/."\"
+ },
+ classes: 'action".($iscurtransition ? " current" : ($this->curtransitions ? " light" : ""))."'".(!$this->curtransitions || $iscurtransition && $this->curtransitions ? ",
+ scratch: {
+ app: {groups: \"".str_replace('"', "\\\"", implode(", ", $gnames))."\", users: \"".str_replace('"', "\\\"", implode(", ", $unames))."\"}
+ }" : "")."
+ });\n";
}
- if(!isset($this->states[$state->getID()])) {
+ /* Collect all states and remember those which are part of a
+ * current transition.
+ */
+ if(!isset($this->states[$state->getID()]) || $iscurtransition) {
+ if($iscurtransition)
+ $highlightstates[] = $state->getID();
$this->states[$state->getID()] = $state;
- $initstate = '';
- if($state == $this->workflow->getInitState())
- $initstate = " (START)";
- echo "ggg.addNode(\"S".$state->getID()."\", { label : \"".str_replace('"', "\\\"", $state->getName()." ".$initstate)."\" });\n";
}
- if(!isset($this->states[$nextstate->getID()])) {
- $this->states[$state->getID()] = $nextstate;
- echo "ggg.addNode(\"S".$nextstate->getID()."\", { label : \"".str_replace('"', "\\\"", $nextstate->getName())."\" });\n";
+ if(!isset($this->states[$nextstate->getID()]) || $iscurtransition) {
+ if($iscurtransition)
+ $highlightstates[] = $nextstate->getID();
+ $this->states[$nextstate->getID()] = $nextstate;
}
}
+ foreach($this->states as $state) {
+ $docstatus = $state->getDocumentStatus();
+ echo "cy.add({
+ data: {
+ id: 'S".$state->getID()."',
+ name: \"".str_replace('"', "\\\"", $state->getName())."\"
+ },
+ classes: 'state".($state == $this->workflow->getInitState() ? ' init' : ($docstatus == S_RELEASED ? ' released' : ($docstatus == S_REJECTED ? ' rejected' : ''))).($highlightstates && !in_array($state->getID(), $highlightstates) ? ' light' : '')."'
+ });\n";
+ }
+
foreach($transitions as $transition) {
- if(!in_array($transition->getID(), $this->seentrans)) {
+// if(!in_array($transition->getID(), $this->seentrans)) {
$state = $transition->getState();
$nextstate = $transition->getNextState();
$action = $transition->getAction();
- $iscurtransition = $this->curtransition && $transition->getID() == $this->curtransition->getID();
- echo "ggg.addEdge(\"S".$state->getID()."\",\"A".$transition->getID()."-".$action->getID()."\", { ".($iscurtransition ? "stroke: '#D00', 'stroke-width': '2px'" : "")." });\n";
- echo "ggg.addEdge(\"A".$transition->getID()."-".$action->getID()."\",\"S".$nextstate->getID()."\", { ".($iscurtransition ? "stroke: '#D00', 'stroke-width': '2px'" : "")." });\n";
- $this->seentrans[] = $transition->getID();
- }
+ $iscurtransition = false;
+ if($this->curtransitions) {
+ foreach($this->curtransitions as $tr)
+ if($transition->getID() == $tr->getID())
+ $iscurtransition = true;
+ }
+
+ echo "cy.add({
+ data: {
+ id: 'E1-".$transition->getID()."',
+ source: 'S".$state->getID()."',
+ target: 'A".$transition->getID()."-".$action->getID()."'
+ },
+ classes: '".($iscurtransition ? " current" : ($this->curtransitions ? " light" : ""))."',
+ });\n";
+ echo "cy.add({
+ data: {
+ id: 'E2-".$transition->getID()."',
+ source: 'A".$transition->getID()."-".$action->getID()."',
+ target: 'S".$nextstate->getID()."'
+ },
+ classes: '".($iscurtransition ? " current" : ($this->curtransitions ? " light" : ""))."',
+ });\n";
+// $this->seentrans[] = $transition->getID();
+// }
}
}
+?>
+params['dms'];
$user = $this->params['user'];
$this->workflow = $this->params['workflow'];
- $this->curtransition = $this->params['transition'];
$document = $this->params['document'];
if($document) {
@@ -141,20 +313,39 @@ $(document).ready(function() {
}
$this->htmlAddHeader(
- ''."\n".
- ''."\n".
- ''."\n".
- ''."\n");
+ ''."\n");
+ $this->htmlAddHeader(
+ ''."\n");
$this->htmlAddHeader('
', 'css');
$this->htmlStartPage(getMLText("admin_tools"));
// $this->contentContainerStart();
?>
-
+
+
+
![]()
+
+
+
+
+
+
+
+
+
contentContainerEnd();
if(method_exists($this, 'js'))
diff --git a/views/bootstrap/class.WorkflowMgr.php b/views/bootstrap/class.WorkflowMgr.php
index 881c857d3..637aa4255 100644
--- a/views/bootstrap/class.WorkflowMgr.php
+++ b/views/bootstrap/class.WorkflowMgr.php
@@ -75,7 +75,7 @@ $(document).ready(function() {
$selworkflow = $this->params['selworkflow'];
if($selworkflow) { ?>
-
+
getTransitions();
$initstate = $workflow->getInitState();
$hasinitstate = true;
+ $hasreleased = true;
+ $hasrejected = true;
$missesug = false;
if($transitions) {
$hasinitstate = false;
+ $hasreleased = false;
+ $hasrejected = false;
foreach($transitions as $transition) {
$transusers = $transition->getUsers();
$transgroups = $transition->getGroups();
if(!$transusers && !$transgroups) {
$missesug = true;
}
+ if($transition->getNextState()->getDocumentStatus() == S_RELEASED)
+ $hasreleased = true;
+ if($transition->getNextState()->getDocumentStatus() == S_REJECTED)
+ $hasrejected = true;
if($transition->getState()->getID() == $initstate->getID())
$hasinitstate = true;
}
}
if($missesug)
- $this->errorMsg('One of the transitions has neither a user nor a group!');
+ $this->errorMsg(getMLText('workflow_transition_without_user_group'));
if(!$hasinitstate)
- $this->errorMsg('None of the transitions starts with the initial state of the workflow!');
+ $this->errorMsg(getMLText('workflow_no_initial_state'));
+ if(!$hasreleased)
+ $this->errorMsg(getMLText('workflow_no_doc_released_state'));
+ if(!$hasrejected)
+ $this->errorMsg(getMLText('workflow_no_doc_rejected_state'));
- if($workflow->isUsed()) {
-?>
-
-
-
-isUsed()) {
+ $this->infoMsg(getMLText('workflow_in_use'));
+ }
}
?>
+
getAllWorkflowActions();
@@ -177,14 +192,14 @@ $(document).ready(function() {
if(!$transusers && !$transgroups) {
echo " class=\"error\"";
}
- echo ">".$state->getName()." ";
- echo $nextstate->getName();
+ echo "> | ".' '.$state->getName()." ";
$docstatus = $nextstate->getDocumentStatus();
+ echo ' '.$nextstate->getName();
if($docstatus == S_RELEASED || $docstatus == S_REJECTED) {
echo " ".getOverallStatusText($docstatus);
}
echo " | ";
- echo "".$action->getName()." | ";
+ echo " ".$action->getName()." | ";
echo "";
foreach($transusers as $transuser) {
$u = $transuser->getUser();
@@ -273,6 +288,7 @@ $(document).ready(function() {
function form() { /* {{{ */
$selworkflow = $this->params['selworkflow'];
+ if($selworkflow)
$this->showWorkflowForm($selworkflow);
} /* }}} */
@@ -291,7 +307,7 @@ $(document).ready(function() {
?>
-
+
:
-
diff --git a/webdav/webdav.php b/webdav/webdav.php
index 487710d94..8c56b1d72 100644
--- a/webdav/webdav.php
+++ b/webdav/webdav.php
@@ -113,9 +113,27 @@ class HTTP_WebDAV_Server_SeedDMS extends HTTP_WebDAV_Server
*/
function check_auth($type, $user, $pass) /* {{{ */
{
+ global $settings;
+
if($this->logger)
$this->logger->log('check_auth: type='.$type.', user='.$user.'', PEAR_LOG_INFO);
- $userobj = $this->dms->getUserByLogin($user);
+
+ $userobj = false;
+
+ /* Authenticate against LDAP server {{{ */
+ if (!$userobj && isset($settings->_ldapHost) && strlen($settings->_ldapHost)>0) {
+ require_once("../inc/inc.ClassLdapAuthentication.php");
+ $authobj = new SeedDMS_LdapAuthentication($this->dms, $settings);
+ $userobj = $authobj->authenticate($user, $pass);
+ } /* }}} */
+
+ /* Authenticate against SeedDMS database {{{ */
+ if(!$userobj) {
+ require_once("../inc/inc.ClassDbAuthentication.php");
+ $authobj = new SeedDMS_DbAuthentication($this->dms, $settings);
+ $userobj = $authobj->authenticate($user, $pass);
+ } /* }}} */
+
if(!$userobj)
return false;
if(md5($pass) != $userobj->getPwd())
|