YUI.add("escape",function(e,t){var n={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","/":"&#x2F;","`":"&#x60;"},r={html:function(e){return(e+"").replace(/[&<>"'\/`]/g,r._htmlReplacer)},regex:function(e){return(e+"").replace(/[\-$\^*()+\[\]{}|\\,.?\s]/g,"\\$&")},_htmlReplacer:function(e){return n[e]}};r.regexp=r.regex,e.Escape=r},"patched-v3.19.2",{requires:["yui-base"]});

YUI.add("selector-css2",function(e,t){var n="parentNode",r="tagName",i="attributes",s="combinator",o="pseudos",u=e.Selector,a={_reRegExpTokens:/([\^\$\?\[\]\*\+\-\.\(\)\|\\])/,SORT_RESULTS:!0,_isXML:function(){var t=e.config.doc.createElement("div").tagName!=="DIV";return t}(),shorthand:{"\\#(-?[_a-z0-9]+[-\\w\\uE000]*)":"[id=$1]","\\.(-?[_a-z]+[-\\w\\uE000]*)":"[className~=$1]"},operators:{"":function(t,n){return e.DOM.getAttribute(t,n)!==""},"~=":"(?:^|\\s+){val}(?:\\s+|$)","|=":"^{val}-?"},pseudos:{"first-child":function(t){return e.DOM._children(t[n])[0]===t}},_bruteQuery:function(t,n,r){var i=[],s=[],o,a=u._tokenize(t),f=a[a.length-1],l=e.DOM._getDoc(n),c,h,p,d,v;if(f){h=f.id,p=f.className,d=f.tagName||"*";if(typeof n.getElementsByTagName!="undefined")h&&(n.all||n.nodeType===9||e.DOM.inDoc(n))?s=e.DOM.allById(h,n):p?s=n.getElementsByClassName(p):s=n.getElementsByTagName(d);else{o=[],c=n.firstChild,v=d==="*";while(c){while(c)c.tagName>"@"&&(v||c.tagName===d)&&s.push(c),o.push(c),c=c.firstChild;while(o.length>0&&!c)c=o.pop().nextSibling}}s.length&&(i=u._filterNodes(s,a,r))}return i},_filterNodes:function(t,n,r){var i=0,s,o=n.length,a=o-1,f=[],l=t[0],c=l,h=e.Selector.getters,p,d,v,m,g,y,b,w;for(i=0;c=l=t[i++];){a=o-1,m=null;e:while(c&&c.tagName){v=n[a],b=v.tests,s=b.length;if(s&&!g)while(w=b[--s]){p=w[1],h[w[0]]?y=h[w[0]](c,w[0]):(y=c[w[0]],w[0]==="tagName"&&!u._isXML&&(y=y.toUpperCase()),typeof y!="string"&&y!==undefined&&y.toString?y=y.toString():y===undefined&&c.getAttribute&&(y=c.getAttribute(w[0],2)));if(p==="="&&y!==w[2]||typeof p!="string"&&p.test&&!p.test(y)||!p.test&&typeof p=="function"&&!p(c,w[0],w[2])){if(c=c[m])while(c&&(!c.tagName||v.tagName&&v.tagName!==c.tagName))c=c[m];continue e}}a--;if(!!g||!(d=v.combinator)){f.push(l);if(r)return f;break}m=d.axis,c=c[m];while(c&&!c.tagName)c=c[m];d.direct&&(m=null)}}return l=c=null,f},combinators:{" ":{axis:"parentNode"},">":{axis:"parentNode",direct:!0},"+":{axis:"previousSibling",direct:!0}},_parsers:[{name:i,re:/^\uE003(-?[a-z]+[\w\-]*)+([~\|\^\$\*!=]=?)?['"]?([^\uE004'"]*)['"]?\uE004/i,fn:function(t,n){var r=t[2]||"",i=u.operators,s=t[3]?t[3].replace(/\\/g,""):"",o;if(t[1]==="id"&&r==="="||t[1]==="className"&&e.config.doc.documentElement.getElementsByClassName&&(r==="~="||r==="="))n.prefilter=t[1],t[3]=s,n[t[1]]=t[1]==="id"?t[3]:s;r in i&&(o=i[r],typeof o=="string"&&(t[3]=s.replace(u._reRegExpTokens,"\\$1"),o=new RegExp(o.replace("{val}",t[3]))),t[2]=o);if(!n.last||n.prefilter!==t[1])return t.slice(1)}},{name:r,re:/^((?:-?[_a-z]+[\w-]*)|\*)/i,fn:function(e,t){var n=e[1];u._isXML||(n=n.toUpperCase()),t.tagName=n;if(n!=="*"&&(!t.last||t.prefilter))return[r,"=",n];t.prefilter||(t.prefilter="tagName")}},{name:s,re:/^\s*([>+~]|\s)\s*/,fn:function(e,t){}},{name:o,re:/^:([\-\w]+)(?:\uE005['"]?([^\uE005]*)['"]?\uE006)*/i,fn:function(e,t){var n=u[o][e[1]];return n?(e[2]&&(e[2]=e[2].replace(/\\/g,"")),[e[2],n]):!1}}],_getToken:function(e){return{tagName:null,id:null,className:null,attributes:{},combinator:null,tests:[]}},_tokenize:function(t){t=t||"",t=u._parseSelector(e.Lang.trim(t));var n=u._getToken(),r=t,i=[],o=!1,a,f,l,c;e:do{o=!1;for(l=0;c=u._parsers[l++];)if(a=c.re.exec(t)){c.name!==s&&(n.selector=t),t=t.replace(a[0],""),t.length||(n.last=!0),u._attrFilters[a[1]]&&(a[1]=u._attrFilters[a[1]]),f=c.fn(a,n);if(f===!1){o=!1;break e}f&&n.tests.push(f);if(!t.length||c.name===s)i.push(n),n=u._getToken(n),c.name===s&&(n.combinator=e.Selector.combinators[a[1]]);o=!0}}while(o&&t.length);if(!o||t.length)i=[];return i},_replaceMarkers:function(e){return e=e.replace(/\[/g,"\ue003"),e=e.replace(/\]/g,"\ue004"),e=e.replace(/\(/g,"\ue005"),e=e.replace(/\)/g,"\ue006"),e},_replaceShorthand:function(t){var n=e.Selector.shorthand,r;for(r in n)n.hasOwnProperty(r)&&(t=t.replace(new RegExp(r,"gi"),n[r]));return t},_parseSelector:function(t){var n=e.Selector._replaceSelector(t),t=n.selector;return t=e.Selector._replaceShorthand(t),t=e.Selector._restore("attr",t,n.attrs),t=e.Selector._restore("pseudo",t,n.pseudos),t=e.Selector._replaceMarkers(t),t=e.Selector._restore("esc",t,n.esc),t},_attrFilters:{"class":"className","for":"htmlFor"},getters:{href:function(t,n){return e.DOM.getAttribute(t,n)},id:function(t,n){return e.DOM.getId(t)}}};e.mix(e.Selector,a,!0),e.Selector.getters.src=e.Selector.getters.rel=e.Selector.getters.href,e.Selector.useNative&&e.config.doc.querySelector&&(e.Selector.shorthand["\\.(-?[_a-z]+[-\\w]*)"]="[class~=$1]")},"patched-v3.19.2",{requires:["selector-native"]});

YUI.add("selector-css3",function(e,t){e.Selector._reNth=/^(?:([\-]?\d*)(n){1}|(odd|even)$)*([\-+]?\d*)$/,e.Selector._getNth=function(t,n,r,i){e.Selector._reNth.test(n);var s=parseInt(RegExp.$1,10),o=RegExp.$2,u=RegExp.$3,a=parseInt(RegExp.$4,10)||0,f=[],l=e.DOM._children(t.parentNode,r),c;u?(s=2,c="+",o="n",a=u==="odd"?1:0):isNaN(s)&&(s=o?1:0);if(s===0)return i&&(a=l.length-a+1),l[a-1]===t?!0:!1;s<0&&(i=!!i,s=Math.abs(s));if(!i){for(var h=a-1,p=l.length;h<p;h+=s)if(h>=0&&l[h]===t)return!0}else for(var h=l.length-a,p=l.length;h>=0;h-=s)if(h<p&&l[h]===t)return!0;return!1},e.mix(e.Selector.pseudos,{root:function(e){return e===e.ownerDocument.documentElement},"nth-child":function(t,n){return e.Selector._getNth(t,n)},"nth-last-child":function(t,n){return e.Selector._getNth(t,n,null,!0)},"nth-of-type":function(t,n){return e.Selector._getNth(t,n,t.tagName)},"nth-last-of-type":function(t,n){return e.Selector._getNth(t,n,t.tagName,!0)},"last-child":function(t){var n=e.DOM._children(t.parentNode);return n[n.length-1]===t},"first-of-type":function(t){return e.DOM._children(t.parentNode,t.tagName)[0]===t},"last-of-type":function(t){var n=e.DOM._children(t.parentNode,t.tagName);return n[n.length-1]===t},"only-child":function(t){var n=e.DOM._children(t.parentNode);return n.length===1&&n[0]===t},"only-of-type":function(t){var n=e.DOM._children(t.parentNode,t.tagName);return n.length===1&&n[0]===t},empty:function(e){return e.childNodes.length===0},not:function(t,n){return!e.Selector.test(t,n)},contains:function(e,t){var n=e.innerText||e.textContent||"";return n.indexOf(t)>-1},checked:function(e){return e.checked===!0||e.selected===!0},enabled:function(e){return e.disabled!==undefined&&!e.disabled},disabled:function(e){return e.disabled}}),e.mix(e.Selector.operators,{"^=":"^{val}","$=":"{val}$","*=":"{val}"}),e.Selector.combinators["~"]={axis:"previousSibling"}},"patched-v3.19.2",{requires:["selector-native","selector-css2"]});

YUI.add("aui-event-base",function(e,t){var n=e.Array,r=e.DOMEventFacade,i=r.prototype,s={BACKSPACE:8,TAB:9,NUM_CENTER:12,ENTER:13,RETURN:13,SHIFT:16,CTRL:17,ALT:18,PAUSE:19,CAPS_LOCK:20,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,PRINT_SCREEN:44,INSERT:45,DELETE:46,ZERO:48,ONE:49,TWO:50,THREE:51,FOUR:52,FIVE:53,SIX:54,SEVEN:55,EIGHT:56,NINE:57,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,CONTEXT_MENU:93,NUM_ZERO:96,NUM_ONE:97,NUM_TWO:98,NUM_THREE:99,NUM_FOUR:100,NUM_FIVE:101,NUM_SIX:102,NUM_SEVEN:103,NUM_EIGHT:104,NUM_NINE:105,NUM_MULTIPLY:106,NUM_PLUS:107,NUM_MINUS:109,NUM_PERIOD:110,NUM_DIVISION:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,NUM_LOCK:144,WIN_KEY:224,WIN_IME:229,NON_MODIFYING_KEYS:["ALT","CAPS_LOCK","CTRL","DOWN","END","ESC","F1","F10","F11","F12","F2","F3","F4","F5","F6","F7","F8","F9","HOME","LEFT","NUM_LOCK","PAGE_DOWN","PAGE_UP","PAUSE","PRINT_SCREEN","RIGHT","SHIFT","SPACE","UP","WIN_KEY"],hasModifier:function(e){return e&&(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey)},isKey:function(e,t){var n=this;return t&&(n[t]||n[t.toUpperCase()])===e},isKeyInRange:function(e,t,n){var r=this,i=!1;if(t&&n){var s=r[t]||r[t.toUpperCase()],o=r[n]||r[n.toUpperCase()];i=s&&o&&e>=s&&e<=o}return i},isKeyInSet:function(e){var t=this,r=n(arguments,1,!0);return t._isKeyInSet(e,r)},isNavKey:function(e){var t=this;return t.isKeyInRange(e,"PAGE_UP","DOWN")||t.isKeyInSet(e,"ENTER","TAB","ESC")},isSpecialKey:function(e,t){var n=this,r=t==="keypress"&&n.ctrlKey;return r||n.isNavKey(e)||n.isKeyInRange(e,"SHIFT","CAPS_LOCK")||n.isKeyInSet(e,"BACKSPACE","PRINT_SCREEN","INSERT","WIN_IME")},isModifyingKey:function(e){var t=this;return!t._isKeyInSet(e,t.NON_MODIFYING_KEYS)},_isKeyInSet:function(e,t){var n=this,r=t.length,i=!1,s,o;while(r--){s=t[r],o=s&&(n[s]||n[String(s).toUpperCase()]);if(e===o){i=!0;break}}return i}};e.mix(i,{hasModifier:function(){var e=this;return s.hasModifier(e)},isKey:function(e){var t=this;return s.isKey(t.keyCode,e)},isKeyInRange:function(e,t){var n=this;return s.isKeyInRange(n.keyCode,e,t)},isKeyInSet:function(){var e=this,t=n(arguments,0,!0);return s._isKeyInSet(e.keyCode,t)},isModifyingKey:function(){var e=this;return s.isModifyingKey(e.keyCode)},isNavKey:function(){var e=this;return s.isNavKey(e.keyCode)},isSpecialKey:function(){var e=this;return s.isSpecialKey(e.keyCode,e.type)}}),e.Event.KeyMap=s,e.Event.supportsDOMEvent=e.supportsDOMEvent},"3.1.0-deprecated.118",{requires:["event-base"]});

YUI.add("timers",function(e,t){function i(e){return s}function s(e){this.capacity=this.snap(e),this.length=0,this.front=0,this.initialize()}function o(e,t,n,r,i){for(var s=0;s<i;++s)n[s+r]=e[s+t]}function u(e){return e>>>=0,e-=1,e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,e|=e>>16,e+1}function v(){while(a.length>0){var e=a.shift();try{e.call()}catch(t){if(d)throw l(),t;setTimeout(function(){throw t},0)}}f=!1}function y(e){d&&p.domain&&(e=p.domain.bind(e)),a.push(e),f||(l(),f=!0)}function b(e){var t;return b._asynchronizer(function(){t||e()}),{cancel:function(){t=1}}}var n={},r=e.config.global;"use strict",n.exports=s,s.prototype.push=function(e){var t=this.length;this.capacity<=t&&this.grow(this.snap(this.capacity*this.growFactor));var n=this.front+t&this.capacity-1;this[n]=e,this.length=t+1},s.prototype.shift=function(){var e=this.front,t=this[e];return this[e]=void 0,this.front=e+1&this.capacity-1,this.length--,t},s.prototype.grow=function(e){var t=this.front,n=this.capacity,r=new Array(n),i=this.length;o(this,0,r,0,n),this.capacity=e,this.initialize(),this.front=0;if(t+i<=n)o(r,t,this,0,i);else{var s=i-(t+i&n-1);o(r,t,this,0,s),o(r,0,this,s,i-s)}},s.prototype.initialize=function(){var e=this.capacity;for(var t=0;t<e;++t)this[t]=void 0},s.prototype.snap=function(e){return typeof e!="number"?this.minCapacity:u(Math.min(this.maxCapacity,Math.max(this.minCapacity,e)))},s.prototype.maxCapacity=1<<30|0,s.prototype.minCapacity=16,s.prototype.growFactor=8,"use strict";var s=i("./queue"),a=new s(1024),f=!1,l=void 0,c=typeof setImmediate=="function",h,p=r.process,d=!!p&&{}.toString.call(p)==="[object process]";if(d)l=function(){var e=p.domain;e&&(h=h||(1,i)("domain"),h.active=p.domain=null),f&&c?setImmediate(v):p.nextTick(v),e&&(h.active=p.domain=e)};else if(c)l=function(){setImmediate(v)};else if(typeof MessageChannel!="undefined"){var m=new MessageChannel;m.port1.onmessage=function(){l=g,m.port1.onmessage=v,v()};var g=function(){m.port2.postMessage(0)};l=function(){setTimeout(v,0),g()}}else l=function(){setTimeout(v,0)};n.exports=y,b._asynchronizer=y,b._impl="asap",e.soon=b},"patched-v3.19.2",{requires:["yui-base"]});

YUI.add("aui-event-input",function(e,t){var n=e.Node.DOM_EVENTS;if(e.Features.test("event","input")){n.input=1;return}n.cut=1,n.dragend=1,n.paste=1;var r=e.Event.KeyMap,i="~~aui|input|event~~",s=["keydown","paste","drop","cut"],o={cut:1,drop:1,paste:1};e.Event.define("input",{on:function(t,n,r){var i=this;n._handler=t.on(s,e.bind(i._dispatchEvent,i,n,r))},delegate:function(t,n,r,o){var u=this;n._handles=[],n._handler=t.delegate("focus",function(t){var o=t.target,a=o.getData(i);a||(a=o.on(s,e.bind(u._dispatchEvent,u,n,r)),n._handles.push(a),o.setData(i,a))},o)},detach:function(e,t){t._handler.detach()},detachDelegate:function(t,n){e.Array.each(n._handles,function(t){var n=e.one(t.evt.el);n&&n.setData(i,null),t.detach()}),n._handler.detach()},_dispatchEvent:function(t,n,i){var s=this,u,a;u=i.target,(o[i.type]||u.get("ownerDocument").get("activeElement")===u)&&r.isModifyingKey(i.keyCode)&&(t._timer&&(t._timer.cancel(),t._timer=null),a=r.isKey(i.keyCode,"WIN_IME")?null:u.get("value"),t._timer=e.soon(e.bind("_fireEvent",s,t,n,i,a)))},_fireEvent:function(e,t,n,r){var i=n.target;e._timer=null,i.get("value")!==r&&t.fire(n)}})},"3.1.0-deprecated.118",{requires:["aui-event-base","event-delegate","event-synthetic","timers"]});

YUI.add("aui-form-validator",function(e,t){var n=e.Lang,r=e.Object,i=n.isBoolean,s=n.isDate,o=r.isEmpty,u=n.isFunction,a=n.isNode,f=n.isObject,l=n.isString,c=n.trim,h=e.namespace("config.FormValidator"),p=e.DOM._getRegExp,d=e.getClassName,v=d("form","group"),m=d("has","error"),g=d("error","field"),y=d("has","success"),b=d("success","field"),w=d("help","block"),E=d("form-validator","stack"),S='<div role="alert"></div>',x='<div class="'+[E,w].join(" ")+'"></div>';Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector),e.mix(h,{STRINGS:{DEFAULT:"Please fix {field}.",acceptFiles:"Please enter a value with a valid extension ({0}) in {field}.",alpha:"Please enter only alpha characters in {field}.",alphanum:"Please enter only alphanumeric characters in {field}.",date:"Please enter a valid date in {field}.",digits:"Please enter only digits in {field}.",email:"Please enter a valid email address in {field}.",equalTo:"Please enter the same value again in {field}.",iri:"Please enter a valid IRI in {field}.",max:"Please enter a value less than or equal to {0} in {field}.",maxLength:"Please enter no more than {0} characters in {field}.",min:"Please enter a value greater than or equal to {0} in {field}.",minLength:"Please enter at least {0} characters in {field}.",number:"Please enter a valid number in {field}.",range:"Please enter a value between {0} and {1} in {field}.",rangeLength:"Please enter a value between {0} and {1} characters long in {field}.",required:"{field} is required.",url:"Please enter a valid URL in {field}."},REGEX:{alpha:/^[a-z_]+$/i,alphanum:/^\w+$/,digits:/^\d+$/,email:new RegExp("^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([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])))\\.?$","i"),iri:new RegExp("^([a-z]([a-z]|\\d|\\+|-|\\.)*):(\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?((\\[(|(v[\\da-f]{1,}\\.(([a-z]|\\d|-|\\.|_|~)|[!\\$&'\\(\\)\\*\\+,;=]|:)+))\\])|((\\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])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=])*)(:\\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})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)|((([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})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)){0})(\\?((([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"),number:/^[+\-]?(\d+([.,]\d+)?)+([eE][+-]?\d+)?$/,url:new RegExp("^(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")},RULES:{acceptFiles:function(t,n,r){var i=null;if(l(r)){var s=r.replace(/\./g,"").split(/,\s*|\b\s*/);s=e.Array.map(s,e.Escape.regex),i=p("[.]("+s.join("|")+")$","i")}return i&&i.test(t)},date:function(e){var t=new Date(e);return s(t)&&t!=="Invalid Date"&&!isNaN(t)},equalTo:function(t,n,r){var i=e.one(r);return i&&c(i.val(
))===t},hasValue:function(t,n){var r=this;if(e.FormValidator.isCheckable(n)){var i=n.get("name"),s=e.all(r.getFieldsByName(i));return s.filter(":checked").size()>0}return!!t},max:function(e,t,r){return n.toFloat(e)<=r},maxLength:function(e,t,n){return e.length<=n},min:function(e,t,r){return n.toFloat(e)>=r},minLength:function(e,t,n){return e.length>=n},range:function(e,t,r){var i=n.toFloat(e);return i>=r[0]&&i<=r[1]},rangeLength:function(e,t,n){var r=e.length;return r>=n[0]&&r<=n[1]},required:function(e,t,n){var r=this;return n===!0?h.RULES.hasValue.apply(r,[e,t]):!0}}});var T=e.Component.create({NAME:"form-validator",ATTRS:{boundingBox:{setter:e.one},containerErrorClass:{value:m,validator:l},containerValidClass:{value:y,validator:l},errorClass:{value:g,validator:l},extractRules:{value:!0,validator:i},fieldContainer:{value:"."+v},fieldStrings:{value:{},validator:f},labelCssClass:{validator:l,value:"control-label"},messageContainer:{getter:function(t){return e.Node.create(t).clone()},value:S},rules:{getter:function(e){var t=this;return t._rulesAlreadyExtracted||t._extractRulesFromMarkup(e),e},validator:f,value:{}},selectText:{value:!0,validator:i},showMessages:{value:!0,validator:i},showAllMessages:{value:!1,validator:i},skipValidationTargetSelector:{value:"a[class~=btn-cancel]"},stackErrorContainer:{getter:function(t){return e.Node.create(t).clone()},value:x},strings:{valueFn:function(){return h.STRINGS}},validateOnBlur:{value:!0,validator:i},validateOnInput:{value:!1,validator:i},validClass:{value:b,validator:l}},_setCustomRules:function(t){e.each(t,function(t,n){e.config.FormValidator.RULES[n]=t.condition,e.config.FormValidator.STRINGS[n]=t.errorMessage})},addCustomRules:function(e){var t=this;f(e)&&t._setCustomRules(e)},isCheckable:function(e){var t=e.get("type").toLowerCase();return t==="checkbox"||t==="radio"},EXTENDS:e.Base,prototype:{initializer:function(){var e=this;e.errors={},e._blurHandlers=null,e._fileBlurHandlers=null,e._fileInputHandlers=null,e._inputHandlers=null,e._rulesAlreadyExtracted=!1,e._stackErrorContainers={},e.bindUI(),e._uiSetValidateOnBlur(e.get("validateOnBlur")),e._uiSetValidateOnInput(e.get("validateOnInput"))},bindUI:function(){var t=this,n=t.get("boundingBox"),r=n.delegate("focus",function(){t._setARIARoles(),r.detach()},"input,select,textarea,button");t.publish({errorField:{defaultFn:t._defErrorFieldFn},validField:{defaultFn:t._defValidFieldFn},validateField:{defaultFn:t._defValidateFieldFn}}),n.on({reset:e.bind(t._onFormReset,t),submit:e.bind(t._onFormSubmit,t)}),t.after({extractRulesChange:t._afterExtractRulesChange,validateOnBlurChange:t._afterValidateOnBlurChange,validateOnInputChange:t._afterValidateOnInputChange})},addFieldError:function(e,t){var n=this,r=n.errors,i=e.get("name");r[i]||(r[i]=[]),r[i].push(t)},clearFieldError:function(e){var t=a(e)?e.get("name"):e;l(t)&&delete this.errors[t]},eachRule:function(t){var n=this;e.each(n.get("rules"),function(e,r){u(t)&&t.apply(n,[e,r])})},findFieldContainer:function(e){var t=this,n=t.get("fieldContainer"),r=e.ancestor();return n&&e.ancestor(n)&&(r=e.ancestor(n)),r},focusInvalidField:function(){var e=this,t=e.get("boundingBox"),n=t.one("."+g);n&&(e.get("selectText")&&n.selectText(),n.focus(),n.scrollIntoView(!1),window.scrollBy(0,n.getDOM().scrollHeight))},getField:function(t){var n=this;return l(t)&&(t=n.getFieldsByName(t),t&&t.length&&!t.name&&(t=t[0])),e.one(t)},getFieldsByName:function(e){var t=this,n=t.get("boundingBox").getDOM();return n.elements[e]},getFieldError:function(e){var t=this;return t.errors[e.get("name")]},getFieldStackErrorContainer:function(e){var t=this,n=a(e)?e.get("name"):e,r=t._stackErrorContainers;return r[n]||(r[n]=t.get("stackErrorContainer")),r[n]},getFieldErrorMessage:function(t,r){var i=this,s=t.get("name"),o=i.get("fieldStrings")[s]||{},u=i.get("rules")[s],a=i._findFieldLabel(t),f=i.get("strings"),l={};a&&(l.field=a);if(r in u){var c=e.Array(u[r]);e.each(c,function(e,t){l[t]=[e].join("")})}var h=o[r]||f[r]||f.DEFAULT;return n.sub(h,l)},hasErrors:function(){var e=this;return!o(e.errors)},highlight:function(t,n){var r=this,i,s,o;t&&(i=r.findFieldContainer(t),s=t.get("name"),this.validatable(t)?(o=e.all(r.getFieldsByName(s)),o.each(function(e){r._highlightHelper(e,r.get("errorClass"),r.get("validClass"),n)}),i&&r._highlightHelper(i,r.get("containerErrorClass"),r.get("containerValidClass"),n)):t.val()||r.resetField(s))},normalizeRuleValue:function(e,t){var n=this;return u(e)?e.apply(n,[t]):e},unhighlight:function(e){var t=this;t.highlight(e,!0)},printStackError:function(t,n,r){var i=this;i.get("showAllMessages")||(e.Array.indexOf(r,"required")!==-1?r=["required"]:r=r.slice(0,1)),n.empty(),e.Array.each(r,function(e){var r=i.getFieldErrorMessage(t,e),s=i.get("messageContainer").addClass(e);n.append(s.html(r))})},resetAllFields:function(){var e=this;e.eachRule(function(t,n){e.resetField(n)})},resetField:function(t){var n=this,r,i,s,o;r=a(t)?t.get("name"):t,r&&(i=n.get("rules")[r],i&&(n.clearFieldError(r),o=n.getFieldStackErrorContainer(r),o.remove(),s=e.all(n.getFieldsByName(r)),s.each(function(e){n.resetFieldCss(e),e.removeAttribute("aria-errormessage"),e.removeAttribute("aria-invalid")})))},resetFieldCss:function(t){var n=this,r=n.findFieldContainer(t),i=function(t,r){t&&e.each(r,function(e){t.removeClass(n.get(e))})};i(t,["validClass","errorClass"]),i(r,["containerValidClass","containerErrorClass"])},validatable:function(e){var t=this,n=!1,r=t.get("rules")[e.get("name")];return r&&(n=t.normalizeRuleValue(r.required,e)||h.RULES.hasValue.apply(t,[e.val(),e])),!!n},validate:function(){var e=this;e.eachRule(function(t,n){e.validateField(n)}),e.focusInvalidField()},validateField:function(e){var t,n;this.resetField(e),t=l(e)?this.getField(e):e,a(t)&&(n=this.validatable(t),n&&this.fire("validateField",{validator:{field:t}}))},_afterExtractRulesChange:function(e){var t=this;t._uiSetExtractRules(e.newVal)},_afterValidateOnBlurChange:function(e){var t=this;t._uiSetValidateOnBlur(e.newVal)},
_afterValidateOnInputChange:function(e){var t=this;t._uiSetValidateOnInput(e.newVal)},_defErrorFieldFn:function(t){var n=this,r,i,s,o,u;i=n.get("labelCssClass"),u=t.validator,r=u.field,n.highlight(r);if(n.get("showMessages")){o=r,s=n.getFieldStackErrorContainer(r),e.FormValidator.isCheckable(o)&&(o=r.ancestor("."+m).get("lastChild"));var a=r.get("id")+"Helper";s.set("id",a),o.placeAfter(s),n.printStackError(r,s,u.errors)}},_defValidFieldFn:function(e){var t=this,n=e.validator.field;t.unhighlight(n)},_defValidateFieldFn:function(t){var n=this,r=t.validator.field,i=n.get("rules")[r.get("name")];e.each(i,function(e,t){var i=h.RULES[t],s=c(r.val());e=n.normalizeRuleValue(e,r),u(i)&&!i.apply(n,[s,r,e])&&n.addFieldError(r,t)});var s=n.getFieldError(r);s?n.fire("errorField",{validator:{field:r,errors:s}}):n.fire("validField",{validator:{field:r}})},_findFieldLabel:function(t){var n="."+this.get("labelCssClass"),r=e.one("label[for="+t.get("id")+"]")||t.ancestor().previous(n);r||(r=t.ancestor("."+m),r&&(r=r.one(n)));if(r)return r.get("text")},_highlightHelper:function(e,t,n,r){var i=this;r?(e.removeClass(t).addClass(n),n===b&&(e.removeAttribute("aria-errormessage"),e.removeAttribute("aria-invalid"))):(e.removeClass(n).addClass(t),t===g&&(e.set("aria-errormessage",e.get("id")+"Helper"),e.set("aria-invalid",!0)))},_extractRulesFromMarkup:function(e){var t=this,n=t.get("boundingBox").getDOM(),i=n.elements,s=r.keys(h.RULES),o=s.join("|"),u=p("field-("+o+")","g"),a,f,l=[],c=function(e,t){l.push(t)};for(a=0,f=i.length;a<f;a++){var d=i[a],v=d.name;d.className.replace(u,c);if(l.length){var m=e[v],g,y;m||(m={},e[v]=m);for(g=0,y=l.length;g<y;g++){var b=l[g];b in m||(m[b]=!0)}l.length=0}}t._rulesAlreadyExtracted=!0},_onFieldInput:function(e){var t=this,n=t.get("skipValidationTargetSelector");(!e.relatedTarget||!e.relatedTarget.getDOMNode().matches(n))&&setTimeout(function(){t.validateField(e.target)},300)},_onFormSubmit:function(e){var t=this,n={validator:{formEvent:e}};t.validate(),t.hasErrors()?(n.validator.errors=t.errors,t.fire("submitError",n),e.halt()):t.fire("submit",n)},_onFormReset:function(){var e=this;e.resetAllFields()},_setARIARoles:function(){var e=this;e.eachRule(function(t,n){var r=e.getField(n),i=e.normalizeRuleValue(t.required,r);i&&r&&!r.attr("aria-required")&&r.attr("aria-required",!0)})},_uiSetExtractRules:function(e){var t=this;e&&t._extractRulesFromMarkup(t.get("rules"))},_uiSetValidateOnInput:function(e){var t=this,n=t.get("boundingBox");e?(t._inputHandlers||(t._inputHandlers=n.delegate("input",t._onFieldInput,'input:not([type="file"]),select,textarea,button',t)),t._fileInputHandlers||(t._fileInputHandlers=n.delegate("change",t._onFieldInput,'input[type="file"]',t))):(t._inputHandlers&&t._inputHandlers.detach(),t._fileInputHandlers&&t._fileInputHandlers.detach())},_uiSetValidateOnBlur:function(e){var t=this,n=t.get("boundingBox");e?(t._blurHandlers||(t._blurHandlers=n.delegate("blur",t._onFieldInput,'input:not([type="file"]),select,textarea,button',t)),t._fileBlurHandlers||(t._fileBlurHandlers=n.delegate("change",t._onFieldInput,'input[type="file"]',t))):(t._blurHandlers&&t._blurHandlers.detach(),t._fileBlurHandlers&&t._fileBlurHandlers.detach())}}});e.each(h.REGEX,function(e,t){h.RULES[t]=function(e){return h.REGEX[t].test(e)}}),e.FormValidator=T},"3.1.0-deprecated.118",{requires:["escape","selector-css3","node-event-delegate","aui-node","aui-component","aui-event-input"]});

/**
 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
 */

AUI.add(
	'liferay-form',
	(A) => {
		const AArray = A.Array;

		const Lang = A.Lang;

		const DEFAULTS_FORM_VALIDATOR = A.config.FormValidator;

		const defaultAcceptFiles = DEFAULTS_FORM_VALIDATOR.RULES.acceptFiles;

		const TABS_SECTION_STR = 'TabsSection';

		const REGEX_CUSTOM_ELEMENT_NAME =
			/^[a-z]([a-z]|[0-9]|-|\.|_)*-([a-z]|[0-9]|-|\.|_)*/;

		const REGEX_EMAIL =
			/^[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:\w(?:[\w-]*\w)?\.)+(\w(?:[\w-]*\w))$/;

		const REGEX_FRIENDLY_URL_MAPPING = /[A-Za-z0-9-_]*/;

		const REGEX_NUMBER = /^[+-]?(\d+)([.|,]\d+)*([eE][+-]?\d+)?$/;

		const REGEX_URL =
			/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+|(https?:\/\/|www.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%/.\w-_]*)?\??(?:[-+=&;%@.\w_]*)#?(?:[\w]*))((.*):(\d*)\/?(.*))?)/;

		const REGEX_URL_ALLOW_RELATIVE =
			/((([A-Za-z]{3,9}:(?:\/\/)?)|\/(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+|(https?:\/\/|www.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%/.\w-_]*)?\??(?:[-+=&;%@.\w_]*)#?(?:[\w]*))((.*):(\d*)\/?(.*))?)/;

		const RESERVED_CUSTOM_ELEMENT_NAMES = new Set([
			'annotation-xml',
			'color-profile',
			'font-face',
			'font-face-format',
			'font-face-name',
			'font-face-src',
			'font-face-uri',
			'missing-glyph',
		]);

		const acceptFiles = function (val, node, ruleValue) {
			if (ruleValue && ruleValue.split(',').includes('*')) {
				return true;
			}

			return defaultAcceptFiles(val, node, ruleValue);
		};

		const customElementName = function (val, _node, _ruleValue) {
			return (
				REGEX_CUSTOM_ELEMENT_NAME.test(val) &&
				!RESERVED_CUSTOM_ELEMENT_NAMES.has(val)
			);
		};

		const email = function (val) {
			return REGEX_EMAIL.test(val);
		};

		const friendlyURLMapping = function (val, _node, _ruleValue) {
			return REGEX_FRIENDLY_URL_MAPPING.test(val);
		};

		const maxFileSize = function (_val, node, ruleValue) {
			const nodeType = node.get('type').toLowerCase();

			if (nodeType === 'file') {
				return ruleValue === 0 || node._node.files[0].size <= ruleValue;
			}

			return true;
		};

		const number = function (val, _node, _ruleValue) {
			return REGEX_NUMBER && REGEX_NUMBER.test(val);
		};

		const url = function (val, _node, _ruleValue) {
			return REGEX_URL && REGEX_URL.test(val);
		};

		const urlAllowRelative = function (val) {
			return (
				REGEX_URL_ALLOW_RELATIVE && REGEX_URL_ALLOW_RELATIVE.test(val)
			);
		};

		A.mix(
			DEFAULTS_FORM_VALIDATOR.RULES,
			{
				acceptFiles,
				customElementName,
				email,
				friendlyURLMapping,
				maxFileSize,
				number,
				url,
				urlAllowRelative,
			},
			true
		);

		A.mix(
			DEFAULTS_FORM_VALIDATOR.STRINGS,
			{
				DEFAULT: 'Controllare\x20questo\x20campo\x2e',
				acceptFiles: 'Inserisci\x20un\x20file\x20con\x20un\x27estensione\x20valida\x20\x28\x7b0\x7d\x29\x2e',
				alpha: 'Inserisci\x20solo\x20caratteri\x20alfa\x2e',
				alphanum: 'Inserisci\x20solo\x20caratteri\x20alfanumerici\x2e',
				customElementName: 'Please\x20enter\x20a\x20valid\x20HTML\x20element\x20name\x2e',
				date: 'Inserisci\x20una\x20data\x20valida\x2e',
				digits: 'Inserisci\x20solo\x20numeri\x2e',
				email: 'Inserisci\x20un\x20indirizzo\x20email\x20valido\x2e',
				equalTo: 'Inserisci\x20di\x20nuovo\x20lo\x20stesso\x20valore\x2e',
				friendlyURLMapping: 'Please\x20enter\x20a\x20valid\x20friendly\x20URL\x20mapping\x2e',
				max: 'Inserisci\x20un\x20valore\x20minore\x20di\x20o\x20uguale\x20a\x20\x7b0\x7d\x2e',
				maxFileSize: 'Si\x20prega\x20di\x20inserire\x20un\x20file\x20con\x20una\x20dimensione\x20valida\x20non\x20più\x20grande\x20di\x20\x7b0\x7d\x2e',
				maxLength: 'Inserisci\x20non\x20più\x20di\x20\x7b0\x7d\x20caratteri\x2e',
				min: 'Inserisci\x20un\x20valore\x20più\x20grande\x20di\x20o\x20uguale\x20a\x20\x7b0\x7d\x2e',
				minLength: 'Inserisci\x20almeno\x20\x7b0\x7d\x20caratteri\x2e',
				number: 'Inserisci\x20un\x20numero\x20valido\x2e',
				range: 'Inserisci\x20un\x20valore\x20tra\x20\x7b0\x7d\x20e\x20\x7b1\x7d\x2e',
				rangeLength: 'Inserisci\x20un\x20valore\x20con\x20una\x20lunghezza\x20caratteri\x20tra\x20\x7b0\x7d\x20e\x20\x7b1\x7d\x2e',
				required: 'Questo\x20campo\x20è\x20obbligatorio\x2e',
				url: 'Inserisci\x20un\x20URL\x20valido\x2e',
				urlAllowRelative: 'Inserisci\x20un\x20URL\x20valido\x2e',
			},
			true
		);

		const Form = A.Component.create({
			_INSTANCES: {},

			ATTRS: {
				fieldRules: {
					setter(val) {
						const instance = this;

						instance._processFieldRules(val);

						return val;
					},
				},
				id: {},
				namespace: {},
				onSubmit: {
					valueFn() {
						const instance = this;

						return instance._onSubmit;
					},
				},
				validateOnBlur: {
					validator: Lang.isBoolean,
					value: true,
				},
			},

			EXTENDS: A.Base,

			get(id) {
				const instance = this;

				return instance._INSTANCES[id];
			},

			prototype: {
				_afterGetFieldsByName(fieldName) {
					const instance = this;

					const editorString = 'Editor';

					if (
						fieldName.lastIndexOf(editorString) ===
						fieldName.length - editorString.length
					) {
						const formNode = instance.formNode;

						return new A.Do.AlterReturn(
							'Return editor dom element',
							formNode.one('#' + fieldName)
						);
					}
				},

				_bindForm() {
					const instance = this;

					const formNode = instance.formNode;
					const formValidator = instance.formValidator;

					formValidator.on(
						'submit',
						A.bind('_onValidatorSubmit', instance)
					);
					formValidator.on(
						'submitError',
						A.bind('_onSubmitError', instance)
					);

					formNode.delegate(
						['blur', 'focus'],
						A.bind('_onFieldFocusChange', instance),
						'button,input,select,textarea'
					);
					formNode.delegate(
						['blur', 'input'],
						A.bind('_onEditorBlur', instance),
						'div[contenteditable="true"]'
					);

					A.Do.after(
						'_afterGetFieldsByName',
						formValidator,
						'getFieldsByName',
						instance
					);
				},

				_defaultSubmitFn(event) {
					const instance = this;

					if (!event.stopped) {
						submitForm(instance.form);
					}
				},

				_findRuleIndex(fieldRules, fieldName, validatorName) {
					let ruleIndex = -1;

					AArray.some(fieldRules, (element, index) => {
						if (
							element.fieldName === fieldName &&
							element.validatorName === validatorName
						) {
							ruleIndex = index;

							return true;
						}
					});

					return ruleIndex;
				},

				_focusInvalidFieldTab() {
					const instance = this;

					const formNode = instance.formNode;

					const field = formNode.one(
						'.' + instance.formValidator.get('errorClass')
					);

					if (field) {
						const fieldWrapper = field.ancestor(
							'form > fieldset > div, form > div'
						);

						const formTabs = formNode.one('.lfr-nav');

						if (fieldWrapper && formTabs) {
							const tabs = formTabs.all('.nav-item');
							const tabsNamespace = formTabs.getAttribute(
								'data-tabs-namespace'
							);

							const tabNames = AArray.map(tabs._nodes, (tab) => {
								return tab.getAttribute('data-tab-name');
							});

							const fieldWrapperId = fieldWrapper
								.getAttribute('id')
								.slice(0, -TABS_SECTION_STR.length);

							const fieldTabId = AArray.find(
								tabs._nodes,
								(tab) => {
									return (
										tab
											.getAttribute('id')
											.indexOf(fieldWrapperId) !== -1
									);
								}
							);

							if (tabsNamespace) {
								Liferay.Portal.Tabs.show(
									tabsNamespace,
									tabNames,
									fieldTabId.getAttribute('data-tab-name')
								);
							}
						}
					}
				},

				_onEditorBlur(event) {
					const instance = this;

					const formValidator = instance.formValidator;

					formValidator.validateField(event.target);
				},

				_onFieldFocusChange(event) {
					const row = event.currentTarget.ancestor('.field');

					if (row) {
						row.toggleClass(
							'field-focused',
							event.type === 'focus'
						);
					}
				},

				_onSubmit(event) {
					const instance = this;

					event.preventDefault();

					setTimeout(() => {
						instance._defaultSubmitFn(event);
					}, 0);
				},

				_onSubmitError() {
					const instance = this;

					const collapsiblePanels =
						instance.formNode.all('.panel-collapse');

					collapsiblePanels.each((panel) => {
						const errorFields = panel
							.get('children')
							.all('.has-error');

						if (errorFields.size() > 0 && !panel.hasClass('show')) {
							const panelNode = panel.getDOM();

							Liferay.CollapseProvider.show({panel: panelNode});
						}
					});
				},

				_onValidatorSubmit(event) {
					const instance = this;

					const onSubmit = instance.get('onSubmit');

					onSubmit.call(instance, event.validator.formEvent);
				},

				_processFieldRule(rules, strings, rule) {
					const instance = this;

					let value = true;

					const fieldName = rule.fieldName;
					const validatorName = rule.validatorName;

					const field = this.formValidator.getField(fieldName);

					if (field) {
						const fieldNode = field.getDOMNode();

						A.Do.after(
							'_setFieldAttribute',
							fieldNode,
							'setAttribute',
							instance,
							fieldName
						);

						A.Do.after(
							'_removeFieldAttribute',
							fieldNode,
							'removeAttribute',
							instance,
							fieldName
						);
					}

					if ((rule.body || rule.body === 0) && !rule.custom) {
						value = rule.body;
					}

					let fieldRules = rules[fieldName];

					if (!fieldRules) {
						fieldRules = {};

						rules[fieldName] = fieldRules;
					}

					fieldRules[validatorName] = value;

					if (rule.custom) {
						DEFAULTS_FORM_VALIDATOR.RULES[validatorName] =
							rule.body;
					}

					const errorMessage = rule.errorMessage;

					if (errorMessage) {
						let fieldStrings = strings[fieldName];

						if (!fieldStrings) {
							fieldStrings = {};

							strings[fieldName] = fieldStrings;
						}

						fieldStrings[validatorName] = errorMessage;
					}
				},

				_processFieldRules(fieldRules) {
					const instance = this;

					if (!fieldRules) {
						fieldRules = instance.get('fieldRules');
					}

					const fieldStrings = {};
					const rules = {};

					for (const rule in fieldRules) {
						instance._processFieldRule(
							rules,
							fieldStrings,
							fieldRules[rule]
						);
					}

					const formValidator = instance.formValidator;

					if (formValidator) {
						formValidator.set('fieldStrings', fieldStrings);
						formValidator.set('rules', rules);
					}
				},

				_removeFieldAttribute(name, fieldName) {
					if (name === 'disabled') {
						this.formValidator.validateField(fieldName);
					}
				},

				_setFieldAttribute(name, value, fieldName) {
					if (name === 'disabled') {
						this.formValidator.resetField(fieldName);
					}
				},

				_validatable(field) {
					let result;

					if (field.test(':disabled')) {
						result = new A.Do.Halt();
					}

					return result;
				},

				addRule(fieldName, validatorName, errorMessage, body, custom) {
					const instance = this;

					const fieldRules = instance.get('fieldRules');

					const ruleIndex = instance._findRuleIndex(
						fieldRules,
						fieldName,
						validatorName
					);

					if (ruleIndex === -1) {
						fieldRules.push({
							body: body || '',
							custom: custom || false,
							errorMessage: errorMessage || '',
							fieldName,
							validatorName,
						});

						instance._processFieldRules(fieldRules);
					}
				},

				initializer() {
					const instance = this;

					const id = instance.get('id');

					const form = document[id];
					const formNode = A.one(form);

					instance.form = form;
					instance.formNode = formNode;

					if (formNode) {
						const formValidator = new A.FormValidator({
							boundingBox: formNode,
							stackErrorContainer:
								'<div class="form-feedback-item form-validator-stack help-block"></div>',
							validateOnBlur: instance.get('validateOnBlur'),
						});

						A.Do.before(
							'_focusInvalidFieldTab',
							formValidator,
							'focusInvalidField',
							instance
						);

						A.Do.before(
							'_validatable',
							formValidator,
							'validatable',
							instance
						);

						instance.formValidator = formValidator;

						instance._processFieldRules();

						instance._bindForm();
					}
				},

				removeRule(fieldName, validatorName) {
					const instance = this;

					const fieldRules = instance.get('fieldRules');

					const ruleIndex = instance._findRuleIndex(
						fieldRules,
						fieldName,
						validatorName
					);

					if (ruleIndex !== -1) {
						const rule = fieldRules[ruleIndex];

						instance.formValidator.resetField(rule.fieldName);

						fieldRules.splice(ruleIndex, 1);

						instance._processFieldRules(fieldRules);
					}
				},
			},

			/*
			 * @deprecated As of Mueller (7.2.x), with no direct replacement
			 */
			register(config) {
				const instance = this;

				const form = new Liferay.Form(config);

				const formName = config.id || config.namespace;

				instance._INSTANCES[formName] = form;

				Liferay.fire('form:registered', {
					form,
					formName,
				});

				return form;
			},
		});

		Liferay.Form = Form;
	},
	'',
	{
		requires: ['aui-base', 'aui-form-validator'],
	}
);

