1Drupal.locale = { 'pluralFormula': function ($n) { return Number((((($n%10)==1)&&(($n%100)!=11))?(0):((((($n%10)>=2)&&(($n%10)<=4))&&((($n%100)<10)||(($n%100)>=20)))?(1):2))); }, 'strings': {"":{"An AJAX HTTP error occurred.":"\u0412\u043e\u0437\u043d\u0438\u043a\u043b\u0430 AJAX HTTP \u043e\u0448\u0438\u0431\u043a\u0430.","HTTP Result Code: !status":"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 HTTP: !status","An AJAX HTTP request terminated abnormally.":"HTTP \u0437\u0430\u043f\u0440\u043e\u0441 AJAX \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.","Debugging information follows.":"\u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f.","Path: !uri":"\u041f\u0443\u0442\u044c: !uri","StatusText: !statusText":"\u0422\u0435\u043a\u0441\u0442 \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f: !statusText","ResponseText: !responseText":"\u0422\u0435\u043a\u0441\u0442 \u041e\u0442\u0432\u0435\u0442\u0430: !responseText","ReadyState: !readyState":"ReadyState: !readyState","Hide":"\u0421\u043a\u0440\u044b\u0442\u044c","Show":"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c","Re-order rows by numerical weight instead of dragging.":"\u0423\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e \u0432\u0435\u0441\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u044f.","Show row weights":"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0435\u0441 \u0441\u0442\u0440\u043e\u043a","Hide row weights":"\u0421\u043a\u0440\u044b\u0442\u044c \u0432\u0435\u0441 \u0441\u0442\u0440\u043e\u043a","Drag to re-order":"\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043c\u043e\u0436\u043d\u043e, \u043f\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0432 \u043f\u0443\u043d\u043a\u0442 \u043c\u044b\u0448\u043a\u043e\u0439.","Changes made in this table will not be saved until the form is submitted.":"\u0421\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u0432\u0441\u0442\u0443\u043f\u044f\u0442 \u0432 \u0441\u0438\u043b\u0443, \u043f\u043e\u043a\u0430 \u0432\u044b \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435 \u0438\u0445.","Also allow !name role to !permission?":"\u0422\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u0440\u043e\u043b\u0438 !name \u043f\u0440\u0430\u0432\u0430 !permission?","Next":"\u0414\u0430\u043b\u0435\u0435","Cancel":"\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c","Disabled":"\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e","Enabled":"\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043e","Edit":"\u041f\u0440\u0430\u0432\u043a\u0430","Save":"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c","Sunday":"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435","Monday":"\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a","Tuesday":"\u0432\u0442\u043e\u0440\u043d\u0438\u043a","Wednesday":"\u0441\u0440\u0435\u0434\u0430","Thursday":"\u0447\u0435\u0442\u0432\u0435\u0440\u0433","Friday":"\u043f\u044f\u0442\u043d\u0438\u0446\u0430","Saturday":"\u0441\u0443\u0431\u0431\u043e\u0442\u0430","Add":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c","Upload":"\u0417\u0430\u043a\u0430\u0447\u0430\u0442\u044c","Configure":"\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c","All":"\u0412\u0441\u0435","Done":"\u0413\u043e\u0442\u043e\u0432\u043e","This field is required.":"\u042d\u0442\u043e \u043f\u043e\u043b\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.","Prev":"\u041d\u0430\u0437\u0430\u0434","Mon":"\u043f\u043d","Tue":"\u0432\u0442","Wed":"\u0441\u0440","Thu":"\u0447\u0442","Fri":"\u043f\u0442","Sat":"\u0441\u0431","Sun":"\u0432\u0441","January":"\u044f\u043d\u0432\u0430\u0440\u044f","February":"\u0444\u0435\u0432\u0440\u0430\u043b\u044f","March":"\u043c\u0430\u0440\u0442\u0430","April":"\u0430\u043f\u0440\u0435\u043b\u044f","May":"\u043c\u0430\u044f","June":"\u0438\u044e\u043d\u044f","July":"\u0438\u044e\u043b\u044f","August":"\u0430\u0432\u0433\u0443\u0441\u0442\u0430","September":"\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f","October":"\u043e\u043a\u0442\u044f\u0431\u0440\u044f","November":"\u043d\u043e\u044f\u0431\u0440\u044f","December":"\u0434\u0435\u043a\u0430\u0431\u0440\u044f","Anonymous users":"\u0410\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438","Select all rows in this table":"\u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b","Deselect all rows in this table":"\u0421\u043d\u044f\u0442\u044c \u043e\u0442\u043c\u0435\u0442\u043a\u0443 \u0441\u043e \u0432\u0441\u0435\u0445 \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b","Today":"\u0421\u0435\u0433\u043e\u0434\u043d\u044f","Jan":"\u042f\u043d\u0432","Feb":"\u0424\u0435\u0432","Mar":"\u041c\u0430\u0440","Apr":"\u0410\u043f\u0440","Jul":"\u0418\u044e\u043b","Aug":"\u0410\u0432\u0433","Sep":"\u0421\u0435\u043d","Oct":"\u041e\u043a\u0442","Nov":"\u041d\u043e\u044f","Dec":"\u0414\u0435\u043a","Su":"\u0412\u0441","Mo":"\u041f\u043d","Tu":"\u0412\u0442","We":"\u0421\u0440","Th":"\u0427\u0442","Fr":"\u041f\u0442","Sa":"\u0421\u0431","Not published":"\u041d\u0435 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043e","Loading":"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430","mm\/dd\/yy":"mm\/dd\/yy","Only files with the following extensions are allowed: %files-allowed.":"\u041f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u044b \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438: %files-allowed.","By @
1name on @date":"@name, @date","By @name":"@name","Not in menu":"\u041d\u0435 \u0432 \u043c\u0435\u043d\u044e","Alias: @alias":"\u0421\u0438\u043d\u043e\u043d\u0438\u043c: @alias","No alias":"\u0421\u0438\u043d\u043e\u043d\u0438\u043c \u043d\u0435 \u0437\u0430\u0434\u0430\u043d","0 sec":"0 \u0441\u0435\u043a","New revision":"\u041d\u043e\u0432\u0430\u044f \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u044f","The changes to these blocks will not be saved until the \u003Cem\u003ESave blocks\u003C\/em\u003E button is clicked.":"\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u043b\u043e\u043a\u0430\u0445 \u043d\u0435 \u0432\u0441\u0442\u0443\u043f\u044f\u0442 \u0432 \u0441\u0438\u043b\u0443 \u043f\u043e\u043a\u0430 \u0432\u044b \u043d\u0435 \u043d\u0430\u0436\u043c\u0435\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u003Cem\u003E\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u003C\/em\u003E.","This permission is inherited from the authenticated user role.":"\u042d\u0442\u043e \u043f\u0440\u0430\u0432\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 \u0440\u043e\u043b\u0438 \u00ab\u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u00bb.","No revision":"\u041d\u0435\u0442 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u0438","@number comments per page":"@number \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443","Requires a title":"\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a","Not restricted":"\u0411\u0435\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439","(active tab)":"(\u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0430)","Not customizable":"\u041d\u0435 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0439","Restricted to certain pages":"\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446","The block cannot be placed in this region.":"\u0411\u043b\u043e\u043a \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0449\u0451\u043d \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0435.","Hide summary":"\u0421\u043a\u0440\u044b\u0442\u044c \u0430\u043d\u043e\u043d\u0441","Edit summary":"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u043d\u043e\u043d\u0441","Don\u0027t display post information":"\u041d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430","@title dialog":"\u0414\u0438\u0430\u043b\u043e\u0433 @title","The selected file %filename cannot be uploaded. Only files with the following extensions are allowed: %extensions.":"\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b %filename \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438: %extensions.","Autocomplete popup":"\u0412\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0430\u0432\u0442\u043e\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435","Searching for matches...":"\u041f\u043e\u0438\u0441\u043a \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439...","Show description":"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435","Hide description":"\u0421\u043a\u0440\u044b\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435","1 sec":"@count \u0441\u0435\u043a.","Remove group":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u0435","@count sec":"@count \u0441\u0435\u043a.","Apply (all displays)":"\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c (\u0432\u0441\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f)","Apply (this display)":"\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c (\u044d\u0442\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435)","Revert to default":"\u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e","SKU":"\u0410\u0440\u0442\u0438\u043a\u0443\u043b","Sell price":"\u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0430\u0436\u0438","Shippable":"\u0414\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439","Please wait...":"\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435...","1 week":"@count \u043d\u0435\u0434\u0435\u043b\u044f","@count days":"@count \u0434\u043d\u044f","1 day":"@count \u0434\u0435\u043d\u044c","Authenticated users":"\u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438","Close":"\u0417\u0430\u043a\u0440\u044b\u0442\u044c","Anonymous checkout is enabled.":"\u0410\u043d\u043e\u043d\u0438\u043c\u043d\u043e\u0435 \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043a\u0430\u0437\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e.","Anonymous checkout is disabled.":"\u0410\u043d\u043e\u043d\u0438\u043c\u043d\u043e\u0435 \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043a\u0430\u0437\u043e\u0432 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e.","Checkout is disabled.":"\u041e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043a\u0430\u0437\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e","Not shippable":"\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439","Insert Teaser Break":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u044b\u0432 \u0432 \u0430\u043d\u043e\u043d\u0441","Insert Page Break":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u044b\u0432 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b","The document already contains a teaser break. Do you want to proceed by removing it first?":"\u
10414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0443\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0431\u0440\u0435\u0437\u043a\u0443 \u0430\u043d\u043e\u043d\u0441\u0430. \u0425\u043e\u0442\u0438\u0442\u0435 \u043b\u0438 \u0412\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0451?","Log messages":"\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043b\u043e\u0433","Please select a file.":"\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u0430\u0439\u043b.","You are not allowed to operate on more than %num files.":"\u0412\u0430\u043c \u043d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c \u0441 %num \u0444\u0430\u0439\u043b\u0430\u043c\u0438.","Please specify dimensions within the allowed range that is from 1x1 to @dimensions.":"\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u043d\u0443\u0442\u0440\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u043e\u0437\u043e\u043d\u0430 \u043e\u0442 1x1 \u0434\u043e @dimensions.","%filename is not an image.":"\u0424\u0430\u0439\u043b %filename \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c.","Do you want to refresh the current directory?":"\u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043f\u0430\u043f\u043a\u0443?","Delete selected files?":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b?","Please select a thumbnail.":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440\u0443.","You must select at least %num files.":"\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 %num \u0444\u0430\u0439\u043b\u043e\u0432.","You can not perform this operation.":"\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u0442\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e.","Insert file":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0430\u0439\u043b","Change view":"\u0421\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0438\u0434","1 hour":"@count \u0447\u0430\u0441","@count hours":"@count \u0447\u0430\u0441\u0430","Available tokens":"\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u044b","Insert this token into your form":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0442\u043e\u043a\u0435\u043d \u0432 \u0432\u0430\u0448\u0443 \u0444\u043e\u0440\u043c\u0443","First click a text field to insert your tokens into.":"\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c\u0442\u043e\u043a\u0435\u043d\u044b.","Loading token browser...":"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0442\u043e\u043a\u0435\u043d\u043e\u0432...","Automatic alias":"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0438\u043d\u043e\u043d\u0438\u043c","Received an invalid response from the server.":"\u0421 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442.","No flags":"\u041d\u0435\u0442 \u0444\u043b\u0430\u0433\u043e\u0432","Jun":"\u0438\u044e\u043d","Select None":"\u0421\u043d\u044f\u0442\u044c \u0432\u044b\u0431\u043e\u0440","Select All":"\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435","1 min":"@count \u043c\u0438\u043d.","@count min":"@count \u043c\u0438\u043d.","Pause":"\u041f\u0430\u0443\u0437\u0430","Internal server error. Please see server or PHP logs for error information.":"\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043b\u043e\u0433 \u043e\u0448\u0438\u0431\u043e\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u043b\u0438 PHP.","@count weeks":"@count \u043d\u0435\u0434\u0435\u043b\u0438","Resume":"\u
1041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c","Saving vote...":"\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0433\u043e\u043b\u043e\u0441\u0430...","1 month":"@count \u043c\u0435\u0441\u044f\u0446","Breadcrumbs":"\u0421\u0442\u0440\u043e\u043a\u0430 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438","Using defaults":"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e","@count months":"@count \u043c\u0435\u0441\u044f\u0446\u0430","Meta":"Meta","Inclusion: @value":"\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435: @value","Priority: @value":"\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: @value","List additional actions":"\u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439","1 year":"@count \u0433\u043e\u0434","New":"\u041d\u043e\u0432\u043e\u0435","@count years":"@count \u0433\u043e\u0434\u0430","Recent":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439","No results":"\u041d\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432","clear":"\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c","Modules installed within the last week.":"\u041c\u043e\u0434\u0443\u043b\u0438, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043d\u0435\u0434\u0435\u043b\u044e.","No modules added within the last week.":"\u041d\u0435\u0442 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043d\u0435\u0434\u0435\u043b\u044e.","Modules enabled\/disabled within the last week.":"\u041c\u043e\u0434\u0443\u043b\u0438, \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0435\/\u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043d\u0435\u0434\u0435\u043b\u044e.","No modules were enabled or disabled within the last week.":"\u041d\u0435\u0442 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043d\u0435\u0434\u0435\u043b\u0438.","@enabled of @total":"@enabled \u0438\u0437 @total","Next page":"\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","Previous page":"\u2190"}} }; 2;/*})'"*/;/*})'"*/ 3/*! 4 Colorbox 1.6.4 5 license: MIT 6 http://www.jacklmoore.com/colorbox 7*/ 8(function(t,e,i){function n(i,n,o){var r=e.createElement(i);return n&&(r.id=Z+n),o&&(r.style.cssText=o),t(r)}function o(){return i.innerHeight?i.innerHeight:t(i).height()}function r(e,i){i!==Object(i)&&(i={}),this.cache={},this.el=e,this.value=function(e){var n;return void 0===this.cache[e]&&(n=t(this.el).attr("data-cbox-"+e),void 0!==n?this.cache[e]=n:void 0!==i[e]?this.cache[e]=i[e]:void 0!==X[e]&&(this.cache[e]=X[e])),this.cache[e]},this.get=function(e){var i=this.value(e);return t.isFunction(i)?i.call(this.el,this):i}}function h(t){var e=W.length,i=(A+t)%e;return 0>i?e+i:i}function a(t,e){return Math.round((/%/.test(t)?("x"===e?E.width():o())/100:1)*parseInt(t,10))}function s(t,e){return t.get("photo")||t.get("photoRegex").test(e)}function l(t,e){return t.get("retinaUrl")&&i.devicePixelRatio>1?e.replace(t.get("photoRegex"),t.get("retinaSuffix")):e}function d(t){"contains"in x[0]&&!x[0].contains(t.target)&&t.target!==v[0]&&(t.stopPropagation(),x.focus())}function c(t){c.str!==t&&(x.add(v).removeClass(c.str).addClass(t),c.str=t)}function g(e){A=0,e&&e!==!1&&"nofollow"!==e?(W=t("."+te).filter(function(){var i=t.data(this,Y),n=new r(this,i);return n.get("rel")===e}),A=W.index(_.el),-1===A&&(W=W.add(_.el),A=W.length-1)):W=t(_.el)}function u(i){t(e).trigger(i),ae.triggerHandler(i)}function f(i){var o;if(!G){if(o=t(i).data(Y),_=new r(i,o),g(_.get("rel")),!U){U=$=!0,c(_.get("
8className")),x.css({visibility:"hidden",display:"block",opacity:""}),I=n(se,"LoadedContent","width:0; height:0; overflow:hidden; visibility:hidden"),b.css({width:"",height:""}).append(I),j=T.height()+k.height()+b.outerHeight(!0)-b.height(),D=C.width()+H.width()+b.outerWidth(!0)-b.width(),N=I.outerHeight(!0),z=I.outerWidth(!0);var h=a(_.get("initialWidth"),"x"),s=a(_.get("initialHeight"),"y"),l=_.get("maxWidth"),f=_.get("maxHeight");_.w=Math.max((l!==!1?Math.min(h,a(l,"x")):h)-z-D,0),_.h=Math.max((f!==!1?Math.min(s,a(f,"y")):s)-N-j,0),I.css({width:"",height:_.h}),J.position(),u(ee),_.get("onOpen"),O.add(F).hide(),x.focus(),_.get("trapFocus")&&e.addEventListener&&(e.addEventListener("focus",d,!0),ae.one(re,function(){e.removeEventListener("focus",d,!0)})),_.get("returnFocus")&&ae.one(re,function(){t(_.el).focus()})}var p=parseFloat(_.get("opacity"));v.css({opacity:p===p?p:"",cursor:_.get("overlayClose")?"pointer":"",visibility:"visible"}).show(),_.get("closeButton")?B.html(_.get("close")).appendTo(b):B.appendTo("<div/>"),w()}}function p(){x||(V=!1,E=t(i),x=n(se).attr({id:Y,"class":t.support.opacity===!1?Z+"IE":"",role:"dialog",tabindex:"-1"}).hide(),v=n(se,"Overlay").hide(),L=t([n(se,"LoadingOverlay")[0],n(se,"LoadingGraphic")[0]]),y=n(se,"Wrapper"),b=n(se,"Content").append(F=n(se,"Title"),R=n(se,"Current"),P=t('<button type="button"/>').attr({id:Z+"Previous"}),K=t('<button type="button"/>').attr({id:Z+"Next"}),S=t('<button type="button"/>').attr({id:Z+"Slideshow"}),L),B=t('<button type="button"/>').attr({id:Z+"Close"}),y.append(n(se).append(n(se,"TopLeft"),T=n(se,"TopCenter"),n(se,"TopRight")),n(se,!1,"clear:left").append(C=n(se,"MiddleLeft"),b,H=n(se,"MiddleRight")),n(se,!1,"clear:left").append(n(se,"BottomLeft"),k=n(se,"BottomCenter"),n(se,"BottomRight"))).find("div div").css({"float":"left"}),M=n(se,!1,"position:absolute; width:9999px; visibility:hidden; display:none; max-width:none;"),O=K.add(P).add(R).add(S)),e.body&&!x.parent().length&&t(e.body).append(v,x.append(y,M))}function m(){function i(t){t.which>1||t.shiftKey||t.altKey||t.metaKey||t.ctrlKey||(t.preventDefault(),f(this))}return x?(V||(V=!0,K.click(function(){J.next()}),P.click(function(){J.prev()}),B.click(function(){J.close()}),v.click(function(){_.get("overlayClose")&&J.close()}),t(e).bind("keydown."+Z,function(t){var e=t.keyCode;U&&_.get("escKey")&&27===e&&(t.preventDefault(),J.close()),U&&_.get("arrowKey")&&W[1]&&!t.altKey&&(37===e?(t.preventDefault(),P.click()):39===e&&(t.preventDefault(),K.click()))}),t.isFunction(t.fn.on)?t(e).on("click."+Z,"."+te,i):t("."+te).live("click."+Z,i)),!0):!1}function w(){var e,o,r,h=J.prep,d=++le;if($=!0,q=!1,u(he),u(ie),_.get("onLoad"),_.h=_.get("height")?a(_.get("height"),"y")-N-j:_.get("innerHeight")&&a(_.get("innerHeight"),"y"),_.w=_.get("width")?a(_.get("width"),"x")-z-D:_.get("innerWidth")&&a(_.get("innerWidth"),"x"),_.mw=_.w,_.mh=_.h,_.get("maxWidth")&&(_.mw=a(_.get("maxWidth"),"x")-z-D,_.mw=_.w&&_.w<_.mw?_.w:_.mw),_.get("maxHeight")&&(_.mh=a(_.get("maxHeight"),"y")-N-j,_.mh=_.h&&_.h<_.mh?_.h:_.mh),e=_.get("href"),Q=setTimeout(function(){L.show()},100),_.get("inline")){var c=t(e).eq(0);r=t("<div>").hide().insertBefore(c),ae.one(he,function(){r.replaceWith(c)}),h(c)}else _.get("iframe")?h(" "):_.get("html")?h(_.get("html")):s(_,e)?(e=l(_,e),q=_.get("createImg"),t(q).addClass(Z+"Photo").bind("error."+Z,function(){h(n(se,"Error").html(_.get("imgError")))}).one("load",function(){d===le&&setTimeout(function(){var e;_.get("retinaImage")&&i.devicePixelRatio>1&&(q.height=q.height/i.devicePixelRatio,q.width=q.width/i.devicePixelRatio),_.get("scalePhotos")&&(o=function(){q.height-=q.height*e,q.width-=q.width*e},_.mw&&q.width>_.mw&&(e=(q.width-_.mw)/q.width,o()),_.mh&&q.height>_.mh&&(e=(q.height-_.mh)/q.height,o())),_.h&&(q.style.marginTop=Math.max(_.mh-q.height,0)/2+"px"),W[1]&&(_.get("loop")||W[A+1])&&(q.style.cursor="pointer",t(q).bind("click."+Z,function(){J.next()})),q.style.width=q.width+"px",q.style.height=q.height+"px",h(q)},1)}),q.src=e):e&&M.load(e,_.get("data"),function(e,i){d===le&&h("error"===i?n(se,"Error").html(_.get("xhrError")):t(this).contents())})}var v,x,y,b,T,C,H,k,W,E,I,M,L,F,R,S,K,P,B,O,_,j,D,N,z,A,q,U,$,G,Q,J,V,X={html:!1,photo:!1,iframe:!1,inline:!1,transition:"elastic",speed:300,fadeOut:300,width:!1,initialWidth:"600",innerWidth:!1,maxWidth:!1,height:!1,initialHeight:"450",innerHe
vendor: 3,812 bytes, line 8
8ight:!1,maxHeight:!1,scalePhotos:!0,scrolling:!0,opacity:.9,preloading:!0,className:!1,overlayClose:!0,escKey:!0,arrowKey:!0,top:!1,bottom:!1,left:!1,right:!1,fixed:!1,data:void 0,closeButton:!0,fastIframe:!0,open:!1,reposition:!0,loop:!0,slideshow:!1,slideshowAuto:!0,slideshowSpeed:2500,slideshowStart:"start slideshow",slideshowStop:"stop slideshow",photoRegex:/\.(gif|png|jp(e|g|eg)|bmp|ico|webp|jxr|svg)((#|\?).*)?$/i,retinaImage:!1,retinaUrl:!1,retinaSuffix:"@2x.$1",current:"image {current} of {total}",previous:"previous",next:"next",close:"close",xhrError:"This content failed to load.",imgError:"This image failed to load.",returnFocus:!0,trapFocus:!0,onOpen:!1,onLoad:!1,onComplete:!1,onCleanup:!1,onClosed:!1,rel:function(){return this.rel},href:function(){return t(this).attr("href")},title:function(){return this.title},createImg:function(){var e=new Image,i=t(this).data("cbox-img-attrs");return"object"==typeof i&&t.each(i,function(t,i){e[t]=i}),e},createIframe:function(){var i=e.createElement("iframe"),n=t(this).data("cbox-iframe-attrs");return"object"==typeof n&&t.each(n,function(t,e){i[t]=e}),"frameBorder"in i&&(i.frameBorder=0),"allowTransparency"in i&&(i.allowTransparency="true"),i.name=(new Date).getTime(),i.allowFullscreen=!0,i}},Y="colorbox",Z="cbox",te=Z+"Element",ee=Z+"_open",ie=Z+"_load",ne=Z+"_complete",oe=Z+"_cleanup",re=Z+"_closed",he=Z+"_purge",ae=t("<a/>"),se="div",le=0,de={},ce=function(){function t(){clearTimeout(h)}function e(){(_.get("loop")||W[A+1])&&(t(),h=setTimeout(J.next,_.get("slideshowSpeed")))}function i(){S.html(_.get("slideshowStop")).unbind(s).one(s,n),ae.bind(ne,e).bind(ie,t),x.removeClass(a+"off").addClass(a+"on")}function n(){t(),ae.unbind(ne,e).unbind(ie,t),S.html(_.get("slideshowStart")).unbind(s).one(s,function(){J.next(),i()}),x.removeClass(a+"on").addClass(a+"off")}function o(){r=!1,S.hide(),t(),ae.unbind(ne,e).unbind(ie,t),x.removeClass(a+"off "+a+"on")}var r,h,a=Z+"Slideshow_",s="click."+Z;return function(){r?_.get("slideshow")||(ae.unbind(oe,o),o()):_.get("slideshow")&&W[1]&&(r=!0,ae.one(oe,o),_.get("slideshowAuto")?i():n(),S.show())}}();t[Y]||(t(p),J=t.fn[Y]=t[Y]=function(e,i){var n,o=this;return e=e||{},t.isFunction(o)&&(o=t("<a/>"),e.open=!0),o[0]?(p(),m()&&(i&&(e.onComplete=i),o.each(function(){var i=t.data(this,Y)||{};t.data(this,Y,t.extend(i,e))}).addClass(te),n=new r(o[0],e),n.get("open")&&f(o[0])),o):o},J.position=function(e,i){function n(){T[0].style.width=k[0].style.width=b[0].style.width=parseInt(x[0].style.width,10)-D+"px",b[0].style.height=C[0].style.height=H[0].style.height=parseInt(x[0].style.height,10)-j+"px"}var r,h,s,l=0,d=0,c=x.offset();if(E.unbind("resize."+Z),x.css({top:-9e4,left:-9e4}),h=E.scrollTop(),s=E.scrollLeft(),_.get("fixed")?(c.top-=h,c.left-=s,x.css({position:"fixed"})):(l=h,d=s,x.css({position:"absolute"})),d+=_.get("right")!==!1?Math.max(E.width()-_.w-z-D-a(_.get("right"),"x"),0):_.get("left")!==!1?a(_.get("left"),"x"):Math.round(Math.max(E.width()-_.w-z-D,0)/2),l+=_.get("bottom")!==!1?Math.max(o()-_.h-N-j-a(_.get("bottom"),"y"),0):_.get("top")!==!1?a(_.get("top"),"y"):Math.round(Math.max(o()-_.h-N-j,0)/2),x.css({top:c.top,left:c.left,visibility:"visible"}),y[0].style.width=y[0].style.height="9999px",r={width:_.w+z+D,height:_.h+N+j,top:l,left:d},e){var g=0;t.each(r,function(t){return r[t]!==de[t]?(g=e,void 0):void 0}),e=g}de=r,e||x.css(r),x.dequeue().animate(r,{duration:e||0,complete:function(){n(),$=!1,y[0].style.width=_.w+z+D+"px",y[0].style.height=_.h+N+j+"px",_.get("reposition")&&setTimeout(function(){E.bind("resize."+Z,J.position)},1),t.isFunction(i)&&i()},step:n})},J.resize=function(t){var e;U&&(t=t||{},t.width&&(_.w=a(t.width,"x")-z-D),t.innerWidth&&(_.w=a(t.innerWidth,"x")),I.css({width:_.w}),t.height&&(_.h=a(t.height,"y")-N-j),t.innerHeight&&(_.h=a(t.innerHe
8ight,"y")),t.innerHeight||t.height||(e=I.scrollTop(),I.css({height:"auto"}),_.h=I.height()),I.css({height:_.h}),e&&I.scrollTop(e),J.position("none"===_.get("transition")?0:_.get("speed")))},J.prep=function(i){function o(){return _.w=_.w||I.width(),_.w=_.mw&&_.mw<_.w?_.mw:_.w,_.w}function a(){return _.h=_.h||I.height(),_.h=_.mh&&_.mh<_.h?_.mh:_.h,_.h}if(U){var d,g="none"===_.get("transition")?0:_.get("speed");I.remove(),I=n(se,"LoadedContent").append(i),I.hide().appendTo(M.show()).css({width:o(),overflow:_.get("scrolling")?"auto":"hidden"}).css({height:a()}).prependTo(b),M.hide(),t(q).css({"float":"none"}),c(_.get("className")),d=function(){function i(){t.support.opacity===!1&&x[0].style.removeAttribute("filter")}var n,o,a=W.length;U&&(o=function(){clearTimeout(Q),L.hide(),u(ne),_.get("onComplete")},F.html(_.get("title")).show(),I.show(),a>1?("string"==typeof _.get("current")&&R.html(_.get("current").replace("{current}",A+1).replace("{total}",a)).show(),K[_.get("loop")||a-1>A?"show":"hide"]().html(_.get("next")),P[_.get("loop")||A?"show":"hide"]().html(_.get("previous")),ce(),_.get("preloading")&&t.each([h(-1),h(1)],function(){var i,n=W[this],o=new r(n,t.data(n,Y)),h=o.get("href");h&&s(o,h)&&(h=l(o,h),i=e.createElement("img"),i.src=h)})):O.hide(),_.get("iframe")?(n=_.get("createIframe"),_.get("scrolling")||(n.scrolling="no"),t(n).attr({src:_.get("href"),"class":Z+"Iframe"}).one("load",o).appendTo(I),ae.one(he,function(){n.src="//about:blank"}),_.get("fastIframe")&&t(n).trigger("load")):o(),"fade"===_.get("transition")?x.fadeTo(g,1,i):i())},"fade"===_.get("transition")?x.fadeTo(g,0,function(){J.position(0,d)}):J.position(g,d)}},J.next=function(){!$&&W[1]&&(_.get("loop")||W[A+1])&&(A=h(1),f(W[A]))},J.prev=function(){!$&&W[1]&&(_.get("loop")||A)&&(A=h(-1),f(W[A]))},J.close=function(){U&&!G&&(G=!0,U=!1,u(oe),_.get("onCleanup"),E.unbind("."+Z),v.fadeTo(_.get("fadeOut")||0,0),x.stop().fadeTo(_.get("fadeOut")||0,0,function(){x.hide(),v.hide(),u(he),I.remove(),setTimeout(function(){G=!1,u(re),_.get("onClosed")},1)}))},J.remove=function(){x&&(x.stop(),t[Y].close(),x.stop(!1,!0).remove(),v.remove(),G=!1,x=null,t("."+te).removeData(Y).removeClass(te),t(e).unbind("click."+Z).unbind("keydown."+Z))},J.element=function(){return t(_.el)},J.settings=X)})(jQuery,document,window); 9;/*})'"*/;/*})'"*/ 10/*! @license DOMPurify 2.3.10 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/2.3.10/LICENSE */ 11!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,(function(){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(e,n){return(t=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,n)}function n(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function r(e,o,a){return(r=n()?Reflect.construct:function(e,n,r){var o=[null];o.push.apply(o,n);var a=new(Function.bind.apply(e,o));return r&&t(a,r.prototype),a}).apply(null,arguments)}function o(e){return function(e){if(Array.isArray(e))return a(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return a(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return a(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var i=Object.hasOwnProperty,l=Object.setPrototypeOf,c=Object.isFrozen,u=Object.getPrototypeOf,s=Object.getOwnPropertyDescriptor,m=Object.freeze,f=Object.seal,p=Object.create,d="undefined"!=typeof Reflect&&Reflect,h=d.apply,g=d.construct;h||(h=function(e,t,n){return e.apply(t,n)}),m||(m=function(e){return e}),f||(f=function(e){return e}),g||(g=function(e,t){return r(e,o(t))});var y,b=_(Array.prototype.forEach),v=_(Array.prototype.pop),T=_(Array.prototype.push),N=_(String.prototype.toLowerCase),A=_(String.prototype.match),E=_(String.prototype.replace),w=_(String.prototype.indexOf),x=_(String.prototype.trim),S=_(RegExp.prototype.test),k=(y=TypeError,function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return g(y,t)});function _(e){return function(t){for(var n=arguments.length,r=new Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];return h(e,t,r)}}function O(e,t,n){n=n||N,l&&l(e,null);for(var r=t.length;r--;){var o=t[r];if("string"==typeof o){var a=n(o);a!==o&&(c(t)||(t[r]=a),o=a)}e[o]=!0}return e}function D(e){var t,n=p(null);for(t in e)h(i,e,[t])&&(n[t]=e[t]);return n}function R(e,t){for(;null!==e;){var n=s(e,t);if(n){if(n.get)return _(n.get);if("function"==typeof n.value)return _(n.value)}e=u(e)}return function(e){return console.warn("fallback value for",e),null}}var L=m(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),M=m(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),C=m(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),I=m(["animate","color-profile","cursor","discard","fedropshadow","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),F=m(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),H=m(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),U=m(["#text"]),z=m(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","
11spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns","slot"]),j=m(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),B=m(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),P=m(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),G=f(/\{\{[\w\W]*|[\w\W]*\}\}/gm),W=f(/<%[\w\W]*|[\w\W]*%>/gm),q=f(/^data-[\-\w.\u00B7-\uFFFF]/),Y=f(/^aria-[\-\w]+$/),K=f(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),V=f(/^(?:\w+script|data):/i),$=f(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),X=f(/^html$/i),Z=function(){return"undefined"==typeof window?null:window},J=function(t,n){if("object"!==e(t)||"function"!=typeof t.createPolicy)return null;var r=null,o="data-tt-policy-suffix";n.currentScript&&n.currentScript.hasAttribute(o)&&(r=n.currentScript.getAttribute(o));var a="dompurify"+(r?"#"+r:"");try{return t.createPolicy(a,{createHTML:function(e){return e},createScriptURL:function(e){return e}})}catch(e){return console.warn("TrustedTypes policy "+a+" could not be created."),null}};return function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Z(),r=function(e){return t(e)};if(r.version="2.3.10",r.removed=[],!n||!n.document||9!==n.document.nodeType)return r.isSupported=!1,r;var a=n.document,i=n.document,l=n.DocumentFragment,c=n.HTMLTemplateElement,u=n.Node,s=n.Element,f=n.NodeFilter,p=n.NamedNodeMap,d=void 0===p?n.NamedNodeMap||n.MozNamedAttrMap:p,h=n.HTMLFormElement,g=n.DOMParser,y=n.trustedTypes,_=s.prototype,Q=R(_,"cloneNode"),ee=R(_,"nextSibling"),te=R(_,"childNodes"),ne=R(_,"parentNode");if("function"==typeof c){var re=i.createElement("template");re.content&&re.content.ownerDocument&&(i=re.content.ownerDocument)}var oe=J(y,a),ae=oe?oe.createHTML(""):"",ie=i,le=ie.implementation,ce=ie.createNodeIterator,ue=ie.createDocumentFragment,se=ie.getElementsByTagName,me=a.importNode,fe={};try{fe=D(i).documentMode?i.documentMode:{}}catch(e){}var pe={};r.isSupported="function"==typeof ne&&le&&void 0!==le.createHTMLDocument&&9!==fe;var de,he,ge=G,ye=W,be=q,ve=Y,Te=V,Ne=$,Ae=K,Ee=null,we=O({},[].concat(o(L),o(M),o(C),o(F),o(U))),xe=null,Se=O({},[].concat(o(z),o(j),o(B),o(P))),ke=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),_e=null,Oe=null,De=!0,Re=!0,Le=!1,Me=!1,Ce=!1,Ie=!1,Fe=!1,He=!1,Ue=!1,ze=!1,je=!0,Be=!0,Pe=!1,Ge={},We=null,qe=O({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),Ye=null,Ke=O({},["audio","video","img","source","image","track"]),Ve=null,$e=O({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Xe="http://www.w3.org/1998/Math/MathML",Ze="http://www.w3.org/2000/svg",Je="http://www.w3.org/1999/xhtml",Qe=Je,et=!1,tt=["application/xhtml+xml","text/html"],nt="text/html",rt=null,ot=i.createElement("form"),at=function(e){return e instanceof RegExp||e instanceof Function},it=function(t){rt&&rt===t||(t&&"object"===e(t)||(t={}
vendor: 5,000 bytes, line 11
11),t=D(t),de=de=-1===tt.indexOf(t.PARSER_MEDIA_TYPE)?nt:t.PARSER_MEDIA_TYPE,he="application/xhtml+xml"===de?function(e){return e}:N,Ee="ALLOWED_TAGS"in t?O({},t.ALLOWED_TAGS,he):we,xe="ALLOWED_ATTR"in t?O({},t.ALLOWED_ATTR,he):Se,Ve="ADD_URI_SAFE_ATTR"in t?O(D($e),t.ADD_URI_SAFE_ATTR,he):$e,Ye="ADD_DATA_URI_TAGS"in t?O(D(Ke),t.ADD_DATA_URI_TAGS,he):Ke,We="FORBID_CONTENTS"in t?O({},t.FORBID_CONTENTS,he):qe,_e="FORBID_TAGS"in t?O({},t.FORBID_TAGS,he):{},Oe="FORBID_ATTR"in t?O({},t.FORBID_ATTR,he):{},Ge="USE_PROFILES"in t&&t.USE_PROFILES,De=!1!==t.ALLOW_ARIA_ATTR,Re=!1!==t.ALLOW_DATA_ATTR,Le=t.ALLOW_UNKNOWN_PROTOCOLS||!1,Me=t.SAFE_FOR_TEMPLATES||!1,Ce=t.WHOLE_DOCUMENT||!1,He=t.RETURN_DOM||!1,Ue=t.RETURN_DOM_FRAGMENT||!1,ze=t.RETURN_TRUSTED_TYPE||!1,Fe=t.FORCE_BODY||!1,je=!1!==t.SANITIZE_DOM,Be=!1!==t.KEEP_CONTENT,Pe=t.IN_PLACE||!1,Ae=t.ALLOWED_URI_REGEXP||Ae,Qe=t.NAMESPACE||Je,t.CUSTOM_ELEMENT_HANDLING&&at(t.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(ke.tagNameCheck=t.CUSTOM_ELEMENT_HANDLING.tagNameCheck),t.CUSTOM_ELEMENT_HANDLING&&at(t.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(ke.attributeNameCheck=t.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),t.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof t.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(ke.allowCustomizedBuiltInElements=t.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Me&&(Re=!1),Ue&&(He=!0),Ge&&(Ee=O({},o(U)),xe=[],!0===Ge.html&&(O(Ee,L),O(xe,z)),!0===Ge.svg&&(O(Ee,M),O(xe,j),O(xe,P)),!0===Ge.svgFilters&&(O(Ee,C),O(xe,j),O(xe,P)),!0===Ge.mathMl&&(O(Ee,F),O(xe,B),O(xe,P))),t.ADD_TAGS&&(Ee===we&&(Ee=D(Ee)),O(Ee,t.ADD_TAGS,he)),t.ADD_ATTR&&(xe===Se&&(xe=D(xe)),O(xe,t.ADD_ATTR,he)),t.ADD_URI_SAFE_ATTR&&O(Ve,t.ADD_URI_SAFE_ATTR,he),t.FORBID_CONTENTS&&(We===qe&&(We=D(We)),O(We,t.FORBID_CONTENTS,he)),Be&&(Ee["#text"]=!0),Ce&&O(Ee,["html","head","body"]),Ee.table&&(O(Ee,["tbody"]),delete _e.tbody),m&&m(t),rt=t)},lt=O({},["mi","mo","mn","ms","mtext"]),ct=O({},["foreignobject","desc","title","annotation-xml"]),ut=O({},["title","style","font","a","script"]),st=O({},M);O(st,C),O(st,I);var mt=O({},F);O(mt,H);var ft=function(e){var t=ne(e);t&&t.tagName||(t={namespaceURI:Je,tagName:"template"});var n=N(e.tagName),r=N(t.tagName);return e.namespaceURI===Ze?t.namespaceURI===Je?"svg"===n:t.namespaceURI===Xe?"svg"===n&&("annotation-xml"===r||lt[r]):Boolean(st[n]):e.namespaceURI===Xe?t.namespaceURI===Je?"math"===n:t.namespaceURI===Ze?"math"===n&&ct[r]:Boolean(mt[n]):e.namespaceURI===Je&&(!(t.namespaceURI===Ze&&!ct[r])&&(!(t.namespaceURI===Xe&&!lt[r])&&(!mt[n]&&(ut[n]||!st[n]))))},pt=function(e){T(r.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){try{e.outerHTML=ae}catch(t){e.remove()}}},dt=function(e,t){try{T(r.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){T(r.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!xe[e])if(He||Ue)try{pt(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},ht=function(e){var t,n;if(Fe)e="<remove></remove>"+e;else{var r=A(e,/^[\r\n\t ]+/);n=r&&r[0]}"application/xhtml+xml"===de&&(e='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+e+"</body></html>");var o=oe?oe.createHTML(e):e;if(Qe===Je)try{t=(new g).parseFromString(o,de)}catch(e){}if(!t||!t.documentElement){t=le.createDocument(Qe,"template",null);try{t.documentElement.innerHTML=et?"":o}catch(e){}}var a=t.body||t.documentElement;return e&&n&&a.insertBefore(i.createTextNode(n),a.childNodes[0]||null),Qe===Je?se.call(t,Ce?"html":"body")[0]:Ce?t.documentElement:a},gt=function(e){return ce.call(e.ownerDocument||e,e,f.SHOW_ELEMENT|f.SHOW_COMMENT|f.SHOW_TEXT,null,!1)},yt=function(e){return e instanceof h&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof d)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore)},bt=function(t){return"object"===e(u)?t instanceof u:t&&"object"===e(t)&&"number"==typeof t.nodeType&&"string"==typeof t.nodeName},vt=function(e,t,n){pe[e]&&b(pe[e],(function(e){e.call(r,t,n,rt)}))},Tt=function(e){var t;if(vt("beforeSanitizeElements",e,null),yt(e))return pt(e),!0;if(S(/[\u0080-\uFFFF]/,e.nodeName))return pt(e),!0;var n=he(e.nodeName);if(vt("uponSanitizeElement",e,{tagName:n,allowedTags:Ee}),e.hasChildNodes()&&!bt(e.firstElementChild)&&(!bt(e.content)||!bt(e.content.firstElementChild))&&S(/<[/\w]/g,e.innerHTML)&&S(/<[/\w]/g,e.textContent))return pt(e),!0;if("select"===n&&S(/<template/i,e.innerHTML))return pt(e),!0;if(!Ee[n]||_e[n]){if(!_e[n]&&At(n)){if(ke.tagNameCheck instanceof RegExp&&S(ke.tagNameCheck,n))return!1;if(ke.tagNameCheck instanceof Function&&ke.tagNameCheck(n))return!1}if(Be&&!We[n]){var o=ne(e)||e.parentNode,a=te(e)||e.childNodes;if(a&&o)for(var i=a.length-1;i>=0;--i)o.insertBefore(Q(a[i],!0),ee(e))}return pt(e),!0}return e instanceof s&&!ft(e)?(pt(e),!0):"noscript"!==n&&"noembed"!==n||!S(/<\/no(script|embed)/i,e.innerHTML)?(Me&&3===e.n
11odeType&&(t=e.textContent,t=E(t,ge," "),t=E(t,ye," "),e.textContent!==t&&(T(r.removed,{element:e.cloneNode()}),e.textContent=t)),vt("afterSanitizeElements",e,null),!1):(pt(e),!0)},Nt=function(e,t,n){if(je&&("id"===t||"name"===t)&&(n in i||n in ot))return!1;if(Re&&!Oe[t]&&S(be,t));else if(De&&S(ve,t));else if(!xe[t]||Oe[t]){if(!(At(e)&&(ke.tagNameCheck instanceof RegExp&&S(ke.tagNameCheck,e)||ke.tagNameCheck instanceof Function&&ke.tagNameCheck(e))&&(ke.attributeNameCheck instanceof RegExp&&S(ke.attributeNameCheck,t)||ke.attributeNameCheck instanceof Function&&ke.attributeNameCheck(t))||"is"===t&&ke.allowCustomizedBuiltInElements&&(ke.tagNameCheck instanceof RegExp&&S(ke.tagNameCheck,n)||ke.tagNameCheck instanceof Function&&ke.tagNameCheck(n))))return!1}else if(Ve[t]);else if(S(Ae,E(n,Ne,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==w(n,"data:")||!Ye[e]){if(Le&&!S(Te,E(n,Ne,"")));else if(n)return!1}else;return!0},At=function(e){return e.indexOf("-")>0},Et=function(t){var n,o,a,i;vt("beforeSanitizeAttributes",t,null);var l=t.attributes;if(l){var c={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:xe};for(i=l.length;i--;){var u=n=l[i],s=u.name,m=u.namespaceURI;if(o="value"===s?n.value:x(n.value),a=he(s),c.attrName=a,c.attrValue=o,c.keepAttr=!0,c.forceKeepAttr=void 0,vt("uponSanitizeAttribute",t,c),o=c.attrValue,!c.forceKeepAttr&&(dt(s,t),c.keepAttr))if(S(/\/>/i,o))dt(s,t);else{Me&&(o=E(o,ge," "),o=E(o,ye," "));var f=he(t.nodeName);if(Nt(f,a,o)){if(oe&&"object"===e(y)&&"function"==typeof y.getAttributeType)if(m);else switch(y.getAttributeType(f,a)){case"TrustedHTML":o=oe.createHTML(o);break;case"TrustedScriptURL":o=oe.createScriptURL(o)}try{m?t.setAttributeNS(m,s,o):t.setAttribute(s,o),v(r.removed)}catch(e){}}}}vt("afterSanitizeAttributes",t,null)}},wt=function e(t){var n,r=gt(t);for(vt("beforeSanitizeShadowDOM",t,null);n=r.nextNode();)vt("uponSanitizeShadowNode",n,null),Tt(n)||(n.content instanceof l&&e(n.content),Et(n));vt("afterSanitizeShadowDOM",t,null)};return r.sanitize=function(t,o){var i,c,s,m,f;if((et=!t)&&(t="\x3c!--\x3e"),"string"!=typeof t&&!bt(t)){if("function"!=typeof t.toString)throw k("toString is not a function");if("string"!=typeof(t=t.toString()))throw k("dirty is not a string, aborting")}if(!r.isSupported){if("object"===e(n.toStaticHTML)||"function"==typeof n.toStaticHTML){if("string"==typeof t)return n.toStaticHTML(t);if(bt(t))return n.toStaticHTML(t.outerHTML)}return t}if(Ie||it(o),r.removed=[],"string"==typeof t&&(Pe=!1),Pe){if(t.nodeName){var p=he(t.nodeName);if(!Ee[p]||_e[p])throw k("root node is forbidden and cannot be sanitized in-place")}}else if(t instanceof u)1===(c=(i=ht("\x3c!----\x3e")).ownerDocument.importNode(t,!0)).nodeType&&"BODY"===c.nodeName||"HTML"===c.nodeName?i=c:i.appendChild(c);else{if(!He&&!Me&&!Ce&&-1===t.indexOf("<"))return oe&&ze?oe.createHTML(t):t;if(!(i=ht(t)))return He?null:ze?ae:""}i&&Fe&&pt(i.firstChild);for(var d=gt(Pe?t:i);s=d.nextNode();)3===s.nodeType&&s===m||Tt(s)||(s.content instanceof l&&wt(s.content),Et(s),m=s);if(m=null,Pe)return t;if(He){if(Ue)for(f=ue.call(i.ownerDocument);i.firstChild;)f.appendChild(i.firstChild);else f=i;return xe.shadowroot&&(f=me.call(a,f,!0)),f}var h=Ce?i.outerHTML:i.innerHTML;return Ce&&Ee["!doctype"]&&i.ownerDocument&&i.ownerDocument.doctype&&i.ownerDocument.doctype.name&&S(X,i.ownerDocument.doctype.name)&&(h="<!DOCTYPE "+i.ownerDocument.doctype.name+">\n"+h),Me&&(h=E(h,ge," "),h=E(h,ye," ")),oe&&ze?oe.createHTML(h):h},r.setConfig=function(e){it(e),Ie=!0},r.clearConfig=function(){rt=null,Ie=!1},r.isValidAttribute=function(e,t,n){rt||it({});var r=he(e),o=he(t);return Nt(r,o,n)},r.addHook=function(e,t){"function"==typeof t&&(pe[e]=pe[e]||[],T(pe[e],t))},r.removeHook=function(e){if(pe[e])return v(pe[e])},r.removeHooks=function(e){pe[e]&&(pe[e]=[])},r.removeAllHooks=function(){pe={}},r}()})); 12//# sourceMappingURL=purify.min.js.map 13;/*})'"*/;/*})'"*/ 14/** 15 * @file 16 * Colorbox module init js. 17 */ 18 19(function ($) { 20 21Drupal.behaviors.initColorbox = { 22 attach: function (context, settings) { 23 if (!$.isFunction($('a, area, input', context).colorbox) || typeof settings.colorbox === 'undefined') { 24 return; 25 } 26 27 if (settings.colorbox.mobiledetect && window.matchMedia) { 28 // Disable Colorbox for small screens. 29 var mq = window.matchMedia("(max-device-width: " + settings.colorbox.mobiledevicewidth + ")"); 30 if (mq.matches) { 31 return; 32 } 33 } 34 35 // Use "data-colorbox-gallery" if set otherwise use "rel". 36 settings.colorbox.rel = function () { 37 if ($(this).data('colorbox-gallery')) { 38 return $(this).data('colorbox-gallery'); 39 } 40 else { 41 return $(this).attr('rel'); 42 } 43 }; 44 45 $('.colorbox', context) 46 .once('init-colorbox').each(function(){ 47 // Only images are supported for the "colorbox" class. 48 // The "photo" setting forces the href attribute to be treated as an image. 49 var extendParams = { 50 photo: true 51 }; 52 // If a title attribute is supplied, sanitize it. 53 var title = $(this).attr('title'); 54 if (title) { 55 extendParams.title = Drupal.colorbox.sanitizeMarkup(title); 56 } 57 $(this).colorbox($.extend({}, settings.colorbox, extendParams)); 58 }); 59 60 $(context).bind('cbox_complete', function () { 61 Drupal.attachBehaviors($('#cboxLoadedContent')); 62 }); 63 } 64}; 65 66// Create colorbox namespace if it doesn't exist. 67if (!Drupal.hasOwnProperty('colorbox')) { 68 Drupal.colorbox = {}; 69} 70 71/** 72 * Global function to allow sanitizing captions and control strings. 73 * 74 * @param markup 75 * String containing potential markup. 76 * @return @string 77 * Sanitized string with potentially dangerous markup removed. 78 */ 79Drupal.colorbox.sanitizeMarkup = function(markup) { 80 // If DOMPurify installed, allow some HTML. Otherwise, treat as plain text. 81 if (typeof DOMPurify !== 'undefined') { 82 var purifyConfig = { 83 ALLOWED_TAGS: [ 84 'a', 85 'b', 86 'strong', 87 'i', 88 'em', 89 'u', 90 'cite', 91 'code', 92 'br' 93 ], 94 ALLOWED_ATTR: [ 95 'href', 96 'hreflang', 97 'title', 98 'target' 99 ] 100 } 101 if (Drupal.settings.hasOwnProperty('dompurify_custom_config')) { 102 purifyConfig = Drupal.settings.dompurify_custom_config; 103 } 104 return DOMPurify.sanitize(markup, purifyConfig); 105 } 106 else { 107 return Drupal.checkPlain(markup); 108 } 109} 110 111})(jQuery); 112;/*})'"*/;/*})'"*/ 113/** 114 * @file 115 * Colorbox module style js. 116 */ 117 118(function ($) { 119 120Drupal.behaviors.initColorboxPlainStyle = { 121 attach: function (context, settings) { 122 $(context).bind('cbox_complete', function () { 123 // Make all the controls invisible. 124 $('#cboxCurrent, #cboxSlideshow, #cboxPrevious, #cboxNext', context).addClass('element-invisible'); 125 // Replace "Close" with "×" and show. 126 $('#cboxClose', context).html('\327').addClass('cbox-close-plain'); 127 // Hide empty title. 128 if ($('#cboxTitle:empty', context).length == true) { 129 $('#cboxTitle', context).hide(); 130 } 131 $('#cboxLoadedContent', context).bind('mouseover', function () { 132 $('#cboxClose', context).animate({opacity: 1}, {queue: false, duration: "fast"}); 133 if ($('#cboxTitle:empty', context).length == false) { 134 $('#cboxTitle', context).slideDown(); 135 } 136 }); 137 $('#cboxOverlay', context).bind('mouseover', function () { 138 $('#cboxClose', context).animate({opacity: 0}, {queue: false, duration: "fast"}); 139 if ($('#cboxTitle:empty', context).length == false) {
140 $('#cboxTitle', context).slideUp(); 141 } 142 }); 143 }); 144 $(context).bind('cbox_closed', function () { 145 $('#cboxClose', context).removeClass('cbox-close-plain'); 146 }); 147 } 148}; 149 150})(jQuery); 151;/*})'"*/;/*})'"*/ 152/** 153 * @file 154 * Colorbox module inline js. 155 */ 156 157(function ($) { 158 159Drupal.behaviors.initColorboxInline = { 160 attach: function (context, settings) { 161 if (!$.isFunction($.colorbox) || typeof settings.colorbox === 'undefined') { 162 return; 163 } 164 165 if (settings.colorbox.mobiledetect && window.matchMedia) { 166 // Disable Colorbox for small screens. 167 var mq = window.matchMedia("(max-device-width: " + settings.colorbox.mobiledevicewidth + ")"); 168 if (mq.matches) { 169 return; 170 } 171 } 172 173 $.urlParam = function(name, url){ 174 if (name == 'fragment') { 175 var results = new RegExp('(#[^&#]*)').exec(url); 176 } 177 else { 178 var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(url); 179 } 180 if (!results) { return ''; } 181 return results[1] || ''; 182 }; 183 $('.colorbox-inline', context).once('init-colorbox-inline').colorbox({ 184 transition:settings.colorbox.transition, 185 speed:settings.colorbox.speed, 186 opacity:settings.colorbox.opacity, 187 slideshow:settings.colorbox.slideshow, 188 slideshowAuto:settings.colorbox.slideshowAuto, 189 slideshowSpeed:settings.colorbox.slideshowSpeed, 190 slideshowStart:settings.colorbox.slideshowStart, 191 slideshowStop:settings.colorbox.slideshowStop, 192 current:settings.colorbox.current, 193 previous:settings.colorbox.previous, 194 next:settings.colorbox.next, 195 close:settings.colorbox.close, 196 overlayClose:settings.colorbox.overlayClose, 197 maxWidth:settings.colorbox.maxWidth, 198 maxHeight:settings.colorbox.maxHeight, 199 innerWidth:function(){ 200 return $.urlParam('width', $(this).attr('href')); 201 }, 202 innerHeight:function(){ 203 return $.urlParam('height', $(this).attr('href')); 204 }, 205 title:function(){ 206 return Drupal.colorbox.sanitizeMarkup( 207 decodeURIComponent($.urlParam('title', $(this).attr('href')))); 208 }, 209 iframe:function(){ 210 return $.urlParam('iframe', $(this).attr('href')); 211 }, 212 inline:function(){ 213 return $.urlParam('inline', $(this).attr('href')); 214 }, 215 href:function(){ 216 return $.urlParam('fragment', $(this).attr('href')); 217 } 218 }); 219 } 220}; 221 222})(jQuery); 223;/*})'"*/;/*})'"*/ 224(function($){ 225/** 226 * Toggle the visibility of the scroll to top link. 227 */ 228 229Drupal.behaviors.scroll_to_top = { 230 attach: function (context, settings) { 231 // append back to top link top body if it is not 232 var exist= jQuery('#back-top').length; // exist = 0 if element doesn't exist 233 if(exist == 0){ // this test is for fixing the ajax bug 234 $("body").append("<p id='back-top'><a href='#top'><span id='button'></span><span id='link'>" + settings.scroll_to_top.label + "</span></a></p>"); 235 } 236 // Preview function 237 $("input").change(function () { 238 // building the style for preview 239 var style="<style>#scroll-to-top-prev-container #back-top-prev span#button-prev{ background-color:"+$("#edit-scroll-to-top-bg-color-out").val()+";} #scroll-to-top-prev-container #back-top-prev span#button-prev:hover{ background-color:"+$("#edit-scroll-to-top-bg-color-hover").val()+" }</style>" 240 // building the html content of preview 241 var html="<p id='back-top-prev' style='position:relative;'><a href='#top'><span id='button-prev'></span><span id='link'>"; 242 // if label enabled display it 243 if($("#edit-scroll-to-top-display-text").attr('checked')){ 244 html+=$("#edit-scroll-to-top-label").val(); 245 } 246 html+="</span></a></p>"; 247 // update the preview 248 $("#scroll-to-top-prev-container").html(style+html); 249 }); 250 $("#back-top").hide(); 251 $(function () { 252 $(window).scroll(function () { 253 // Adding IE8 support 254 var scrollTop = 0; 255 if (document.documentElement && document.documentElement.scrollTop) { 256 scrollTop = document.documentElement.scrollTop; 257 } 258 if ($(this).scrollTop() > 100 || scrollTop > 100) { 259 $('#back-top').fadeIn(); 260 } else { 261 $('#back-top').fadeOut(); 262 } 263 }); 264 265 // scroll body to 0px on click 266 $('#back-top a').click(function () { 267 $('body,html').animate({ 268 scrollTop: 0 269 }, 800); 270 return false;
271 }); 272 }); 273 } 274}; 275})(jQuery); 276;/*})'"*/;/*})'"*/ 277/** 278 * @file 279 * 280 * Fivestar JavaScript behaviors integration. 281 */ 282 283/** 284 * Create a degradeable star rating interface out of a simple form structure. 285 * 286 * Originally based on the Star Rating jQuery plugin by Wil Stuckey: 287 * http://sandbox.wilstuckey.com/jquery-ratings/ 288 */ 289(function($){ // Create local scope. 290 291Drupal.behaviors.fivestar = { 292 attach: function (context) { 293 $(context).find('div.fivestar-form-item').once('fivestar', function() { 294 var $this = $(this); 295 var $container = $('<div class="fivestar-widget clearfix"></div>'); 296 var $select = $('select', $this); 297 298 // Setup the cancel button 299 var $cancel = $('option[value="0"]', $this); 300 if ($cancel.length) { 301 $('<div class="cancel"><a href="#0" title="' + $cancel.text() + '">' + $cancel.text() + '</a></div>') 302 .appendTo($container); 303 } 304 305 // Setup the rating buttons 306 var $options = $('option', $this).not('[value="-"], [value="0"]'); 307 var index = -1; 308 $options.each(function(i, element) { 309 var classes = 'star-' + (i+1); 310 classes += (i + 1) % 2 == 0 ? ' even' : ' odd'; 311 classes += i == 0 ? ' star-first' : ''; 312 classes += i + 1 == $options.length ? ' star-last' : ''; 313 $('<div class="star"><a href="#' + element.value + '" title="' + element.text + '">' + element.text + '</a></div>')
314 .addClass(classes) 315 .appendTo($container); 316 if (element.value == $select.val()) { 317 index = i + 1; 318 } 319 }); 320 321 if (index != -1) { 322 $container.find('.star').slice(0, index).addClass('on'); 323 } 324 $container.addClass('fivestar-widget-' + ($options.length)); 325 $container.find('a') 326 .bind('click', $this, Drupal.behaviors.fivestar.rate) 327 .bind('mouseover', $this, Drupal.behaviors.fivestar.hover); 328 329 $container.bind('mouseover mouseout', $this, Drupal.behaviors.fivestar.hover); 330 331 // Attach the new widget and hide the existing widget. 332 $select.after($container).css('display', 'none'); 333 334 // Allow other modules to modify the widget. 335 Drupal.attachBehaviors($this); 336 }); 337 }, 338 rate: function(event) { 339 var $this = $(this); 340 var $widget = event.data; 341 var value = this.hash.replace('#', ''); 342 $('select', $widget).val(value).change(); 343 var $this_star = (value == 0) ? $this.parent().parent().find('.star') : $this.closest('.star'); 344 $this_star.prevAll('.star').andSelf().addClass('on'); 345 $this_star.nextAll('.star').removeClass('on'); 346 if(value==0){ 347 $this_star.removeClass('on'); 348 } 349 350 event.preventDefault(); 351 }, 352 hover: function(event) { 353 var $this = $(this); 354 var $widget = event.data; 355 var $target = $(event.target); 356 var $stars = $('.star', $this); 357 358 if (event.type == 'mouseover') { 359 var index = $stars.index($target.parent()); 360 $stars.each(function(i, element) { 361 if (i <= index) { 362 $(element).addClass('hover'); 363 } else { 364 $(element).removeClass('hover'); 365 } 366 }); 367 } else { 368 $stars.removeClass('hover'); 369 } 370 } 371}; 372 373})(jQuery); 374;/*})'"*/;/*})'"*/ 375/** 376 * @file 377 * Some basic behaviors and utility functions for Views. 378 */ 379(function ($) { 380 381 Drupal.Views = {}; 382 383 /** 384 * JQuery UI tabs, Views integration component. 385 */ 386 Drupal.behaviors.viewsTabs = { 387 attach: function (context) { 388 if ($.viewsUi && $.viewsUi.tabs) { 389 $('#views-tabset').once('views-processed').viewsTabs({ 390 selectedClass: 'active' 391 }); 392 } 393 394 $('a.views-remove-link').once('views-processed').click(function(event) { 395 var id = $(this).attr('id').replace('views-remove-link-', ''); 396 $('#views-row-' + id).hide(); 397 $('#views-removed-' + id).get(0).checked = true; 398 event.preventDefault(); 399 }); 400 // Here is to handle display deletion 401 // (checking in the hidden checkbox and hiding out the row). 402 $('a.display-remove-link') 403 .addClass('display-processed') 404 .click(function() { 405 var id = $(this).attr('id').replace('display-remove-link-', ''); 406 $('#display-row-' + id).hide(); 407 $('#display-removed-' + id).get(0).checked = true; 408 return false; 409 }); 410 } 411 }; 412 413 /** 414 * Helper function to parse a querystring. 415 */ 416 Drupal.Views.parseQueryString = function (query) { 417 var args = {}; 418 var pos = query.indexOf('?'); 419 if (pos != -1) { 420 query = query.substring(pos + 1); 421 } 422 var pairs = query.split('&'); 423 for (var i in pairs) { 424 if (typeof(pairs[i]) == 'string') { 425 var pair = pairs[i].split('='); 426 // Ignore the 'q' path argument, if present. 427 if (pair[0] != 'q' && pair[1]) { 428 args[decodeURIComponent(pair[0].replace(/\+/g, ' '))] = decodeURIComponent(pair[1].replace(/\+/g, ' ')); 429 } 430 } 431 } 432 return args; 433 }; 434 435 /** 436 * Helper function to return a view's arguments based on a path. 437 */ 438 Drupal.Views.parseViewArgs = function (href, viewPath) { 439 // Provide language prefix. 440 if (Drupal.settings.pathPrefix) { 441 var viewPath = Drupal.settings.pathPrefix + viewPath; 442 } 443 var returnObj = {}; 444 var path = Drupal.Views.getPath(href); 445 // Ensure there is a correct path. 446 if (viewPath && path.substring(0, viewPath.length + 1) == viewPath + '/') { 447 var args = decodeURIComponent(path.substring(viewPath.length + 1, path.length)); 448 returnObj.view_args = args; 449 returnObj.view_path = path; 450 } 451 return returnObj; 452 }; 453 454 /** 455 * Strip off the protocol plus domain from an href. 456 */ 457 Drupal.Views.pathPortion = function (href) { 458 // Remove e.g. http://example.com if present. 459 var protocol = window.location.protocol; 460 if (href.substring(0, protocol.length) == protocol) { 461 // 2 is the length of the '//' that normally follows the protocol. 462 href = href.substring(href.indexOf('/', protocol.length + 2)); 463 } 464 return href; 465 }; 466 467 /** 468 * Return the Drupal path portion of an href. 469 */ 470 Drupal.Views.getPath = function (href) { 471 href = Drupal.Views.pathPortion(href); 472 href = href.substring(Drupal.settings.basePath.length, href.length); 473 // 3 is the length of the '?q=' added to the URL without clean URLs.
474 if (href.substring(0, 3) == '?q=') { 475 href = href.substring(3, href.length); 476 } 477 var chars = ['#', '?', '&']; 478 for (var i in chars) { 479 if (href.indexOf(chars[i]) > -1) { 480 href = href.substr(0, href.indexOf(chars[i])); 481 } 482 } 483 return href; 484 }; 485 486})(jQuery); 487;/*})'"*/;/*})'"*/ 488(function ($) { 489 490/** 491 * A progressbar object. Initialized with the given id. Must be inserted into 492 * the DOM afterwards through progressBar.element. 493 * 494 * method is the function which will perform the HTTP request to get the 495 * progress bar state. Either "GET" or "POST". 496 * 497 * e.g. pb = new progressBar('myProgressBar'); 498 * some_element.appendChild(pb.element); 499 */ 500Drupal.progressBar = function (id, updateCallback, method, errorCallback) { 501 var pb = this; 502 this.id = id; 503 this.method = method || 'GET'; 504 this.updateCallback = updateCallback; 505 this.errorCallback = errorCallback; 506 507 // The WAI-ARIA setting aria-live="polite" will announce changes after users 508 // have completed their current activity and not interrupt the screen reader. 509 this.element = $('<div class="progress" aria-live="polite"></div>').attr('id', id); 510 this.element.html('<div class="bar"><div class="filled"></div></div>' + 511 '<div class="percentage"></div>' + 512 '<div class="message"> </div>'); 513}; 514 515/** 516 * Set the percentage and status message for the progressbar. 517 */ 518Drupal.progressBar.prototype.setProgress = function (percentage, message) { 519 if (percentage >= 0 && percentage <= 100) { 520 $('div.filled', this.element).css('width', percentage + '%'); 521 $('div.percentage', this.element).html(percentage + '%'); 522 } 523 $('div.message', this.element).html(message); 524 if (this.updateCallback) { 525 this.updateCallback(percentage, message, this); 526 } 527}; 528 529/** 530 * Start monitoring progress via Ajax. 531 */ 532Drupal.progressBar.prototype.startMonitoring = function (uri, delay) { 533 this.delay = delay; 534 this.uri = uri; 535 this.sendPing(); 536}; 537 538/** 539 * Stop monitoring progress via Ajax. 540 */ 541Drupal.progressBar.prototype.stopMonitoring = function () { 542 clearTimeout(this.timer); 543 // This allows monitoring to be stopped from within the callback. 544 this.uri = null; 545}; 546 547/** 548 * Request progress data from server. 549 */ 550Drupal.progressBar.prototype.sendPing = function () { 551 if (this.timer) { 552 clearTimeout(this.timer); 553 } 554 if (this.uri) { 555 var pb = this; 556 // When doing a post request, you need non-null data. Otherwise a 557 // HTTP 411 or HTTP 406 (with Apache mod_security) error may result. 558 $.ajax({ 559 type: this.method, 560 url: this.uri, 561 data: '', 562 dataType: 'json', 563 success: function (progress) { 564 // Display errors. 565 if (progress.status == 0) { 566 pb.displayError(progress.data); 567 return; 568 } 569 // Update display. 570 pb.setProgress(progress.percentage, progress.message); 571 // Schedule next timer. 572 pb.timer = setTimeout(function () { pb.sendPing(); }, pb.delay); 573 }, 574 error: function (xmlhttp) { 575 pb.displayError(Drupal.ajaxError(xmlhttp, pb.uri)); 576 } 577 }); 578 } 579}; 580 581/** 582 * Display errors on the page. 583 */ 584Drupal.progressBar.prototype.displayError = function (string) { 585 var error = $('<div class="messages error"></div>').html(string); 586 $(this.element).before(error).hide(); 587 588 if (this.errorCallback) { 589 this.errorCallback(this); 590 } 591}; 592 593})(jQuery); 594;/*})'"*/;/*})'"*/ 595/** 596 * @file 597 * Handles AJAX fetching of views, including filter submission and response. 598 */ 599(function ($) { 600 601 /** 602 * Attaches the AJAX behavior to exposed filter forms and key views links. 603 */ 604 Drupal.behaviors.ViewsAjaxView = {}; 605 Drupal.behaviors.ViewsAjaxView.attach = function() { 606 if (Drupal.settings && Drupal.settings.views && Drupal.settings.views.ajaxViews) { 607 $.each(Drupal.settings.views.ajaxViews, function(i, settings) { 608 Drupal.views.instances[i] = new Drupal.views.ajaxView(settings); 609 }); 610 } 611 }; 612 613 Drupal.views = {}; 614 Drupal.views.instances = {}; 615 616 /** 617 * JavaScript object for a certain view. 618 */ 619 Drupal.views.ajaxView = function(settings) { 620 var selector = '.view-dom-id-' + settings.view_dom_id; 621 this.$view = $(selector); 622 623 // If view is not present return to prevent errors. 624 if (!this.$view.length) { 625 return; 626 } 627 628 // Retrieve the path to use for views' ajax. 629 var ajax_path = Drupal.settings.views.ajax_path; 630 631 // If there are multiple views this might've ended up showing up multiple 632 // times. 633 if (ajax_path.constructor.toString().indexOf("Array") != -1) { 634 ajax_path = ajax_path[0]; 635 } 636
637 // Check if there are any GET parameters to send to views. 638 var queryString = window.location.search || ''; 639 if (queryString !== '') { 640 // Remove the question mark and Drupal path component if any. 641 var queryString = queryString.slice(1).replace(/q=[^&]+&?|&?render=[^&]+/, ''); 642 if (queryString !== '') { 643 // If there is a '?' in ajax_path, clean url are on and & should be 644 // used to add parameters. 645 queryString = ((/\?/.test(ajax_path)) ? '&' : '?') + queryString; 646 } 647 } 648 649 this.element_settings = { 650 url: ajax_path + queryString, 651 submit: settings, 652 setClick: true, 653 event: 'click', 654 selector: selector, 655 progress: { 656 type: 'throbber' 657 } 658 }; 659 660 this.settings = settings; 661 662 // Add the ajax to exposed forms. 663 this.$exposed_form = $('#views-exposed-form-' + settings.view_name.replace(/_/g, '-') + '-' + settings.view_display_id.replace(/_/g, '-')); 664 this.$exposed_form.once(jQuery.proxy(this.attachExposedFormAjax, this)); 665 666 // Store Drupal.ajax objects here for all pager links. 667 this.links = []; 668 669 // Add the ajax to pagers. 670 this.$view 671 .once(jQuery.proxy(this.attachPagerAjax, this)); 672 673 // Add a trigger to update this view specifically. In order to trigger a 674 // refresh use the following code. 675 // 676 // @code 677 // jQuery('.view-name').trigger('RefreshView'); 678 // @endcode 679 // Add a trigger to update this view specifically. 680 var self_settings = this.element_settings; 681 self_settings.event = 'RefreshView'; 682 var self = this; 683 this.$view.once('refresh', function () { 684 self.refreshViewAjax = new Drupal.ajax(self.selector, self.$view, self_settings); 685 }); 686 }; 687 688 Drupal.views.ajaxView.prototype.attachExposedFormAjax = function() { 689 var button = $('input[type=submit], button[type=submit], input[type=image]', this.$exposed_form); 690 button = button[0]; 691 692 // Call the autocomplete submit before doing AJAX. 693 $(button).click(function () { 694 if (Drupal.autocompleteSubmit) { 695 Drupal.autocompleteSubmit(); 696 } 697 }); 698 699 this.exposedFormAjax = new Drupal.ajax($(button).attr('id'), button, this.element_settings); 700 }; 701 702 /** 703 * Attach the ajax behavior to each link. 704 */ 705 Drupal.views.ajaxView.prototype.attachPagerAjax = function() { 706 this.$view.find('ul.pager > li > a, ol.pager > li > a, th.views-field a, .attachment .views-summary a') 707 .each(jQuery.proxy(this.attachPagerLinkAjax, this)); 708 }; 709 710 /** 711 * Attach the ajax behavior to a single link. 712 */ 713 Drupal.views.ajaxView.prototype.attachPagerLinkAjax = function(id, link) { 714 var $link = $(link); 715 var viewData = {}; 716 var href = $link.attr('href'); 717 // Don't attach to pagers inside nested views. 718 if ($link.closest('.view')[0] !== this.$view[0] && 719 $link.closest('.view').parent().hasClass('attachment') === false) { 720 return; 721 } 722 723 // Provide a default page if none has been set. This must be done 724 // prior to merging with settings to avoid accidentally using the 725 // page landed on instead of page 1. 726 if (typeof(viewData.page) === 'undefined') { 727 viewData.page = 0; 728 } 729 730 // Construct an object using the settings defaults and then overriding 731 // with data specific to the link. 732 $.extend( 733 viewData, 734 this.settings, 735 Drupal.Views.parseQueryString(href), 736 // Extract argument data from the URL. 737 Drupal.Views.parseViewArgs(href, this.settings.view_base_path) 738 ); 739 740 // For anchor tags, these will go to the target of the anchor rather 741 // than the usual location. 742 $.extend(viewData, Drupal.Views.parseViewArgs(href, this.settings.view_base_path)); 743 744 // Construct an object using the element settings defaults, 745 // then overriding submit with viewData. 746 var pager_settings = $.extend({}, this.element_settings); 747 pager_settings.submit = viewData; 748 this.pagerAjax = new Drupal.ajax(false, $link, pager_settings); 749 this.links.push(this.pagerAjax); 750 }; 751 752 Drupal.ajax.prototype.commands.viewsScrollTop = function (ajax, response, status) { 753 // Scroll to the top of the view. This will allow users 754 // to browse newly loaded content after e.g. clicking a pager 755 // link. 756 var offset = $(response.selector).offset(); 757 // We can't guarantee that the scrollable object should be 758 // the body, as the view could be embedded in something 759 // more complex such as a modal popup. Recurse up the DOM 760 // and scroll the first element that has a non-zero top. 761 var scrollTarget = response.selector; 762 while ($(scrollTarget).scrollTop() == 0 && $(scrollTarget).parent()) { 763 scrollTarget = $(scrollTarget).parent(); 764 } 765 // Only scroll upward. 766 if (offset.top - 10 < $(scrollTarget).scrollTop()) { 767 $(scrollTarget).animate({scrollTop: (offset.top - 10)}, 500); 768 } 769 }; 770 771})(jQuery); 772;/*})'"*/;/*})'"*/ 773/** 774 * Event handler that listens for flags selected by the user. 775 */ 776jQuery(document).bind('flagGlobalAfterLinkUpdate', function(event, data) { 777 var refresh = new viewsFlagRefresh(data.flagName); 778 jQuery.each(Drupal.settings.views.ajaxViews, function(index, settings) { 779 refresh.ajax(settings); 780 }); 781}); 782 783/** 784 * Constructor for the viewsFlagRefresh object, sets the name of the flag that 785 * was selected. 786 * 787 * @param flagName 788 * The name of the flag selected by the user. 789 */ 790function viewsFlagRefresh(flagName) { 791 this.flagName = flagName; 792} 793
794/** 795 * Class method that returns the Views module's AJAX path. 796 * 797 * @reutrn 798 * The Views module's AJAX path. 799 */ 800viewsFlagRefresh.ajaxPath = function() { 801 var ajaxPath = Drupal.settings.views.ajax_path; 802 if (ajaxPath.constructor.toString().indexOf("Array") != -1) { 803 ajaxPath = ajaxPath[0]; 804 } 805 return ajaxPath; 806} 807 808/** 809 * Returns the widget settings associated with the view. Returns false if the 810 * view isn't set to refresh on this flag. 811 * 812 * @param viewName 813 * The name of the view we are running the check against. 814 * @param viewDisplayId 815 * The display ID of the view we are running the check against. 816 * @return 817 * A string containing the theme hook used to theme the view as it is being 818 * refreshed, a boolean false if the view should not be refreshed at all. 819 */ 820viewsFlagRefresh.prototype.widgetSettings = function(viewName, viewDisplayId) { 821 var settings = Drupal.settings.viewsFlagRefresh.flags; 822 for (var flagName in settings) { 823 functionName = viewName + '-' + viewDisplayId; 824 if (flagName == this.flagName && functionName in settings[flagName]) { 825 return settings[flagName][functionName]; 826 } 827 } 828 return false; 829} 830 831/** 832 * Returns a key / value pair to be uses as settings by the ajax methods. 833 * 834 * @param view 835 * a jQuery object containing the view. 836 * @param settings 837 * The View's AJAX settings. 838 * @param theme 839 * The theme object. 840 * @return 841 * The AJAX settings. 842 */ 843viewsFlagRefresh.ajaxSettings = function(view, settings, theme) { 844 return { 845 url: viewsFlagRefresh.ajaxPath(), 846 type: 'GET', 847 data: settings, 848 success: function(response, status) { 849 // Handle ajax response. 850 jQuery(view).data('viewsFlagRefresh_ajax').success(response, status); 851 852 // Invokes theme hook. 853 jQuery(view).filter(function() { return !jQuery(this).parents('.view').size(); }).each(function() { 854 theme.target = this; 855 theme.hookInvoke('themeHookPost'); 856 }); 857 }, 858 error: function() { 859 // Invokes theme hook, handles errors gracefully. 860 theme.hookInvoke('themeHookPost'); 861 Drupal.Views.Ajax.handleErrors(xhr, viewsFlagRefresh.ajaxPath()); 862 }, 863 dataType: 'json' 864 }; 865} 866 867/** 868 * Refreshes a view via AJAX if it is configured to do so. 869 * 870 * @param settings 871 * The view's AJAX settings passed through Drupal.settings.views.ajaxViews. 872 */ 873viewsFlagRefresh.prototype.ajax = function(settings) { 874 // Bails if the view shouldn't be refreshed when this flag is selected. 875 var widgetSettings = this.widgetSettings(settings.view_name, settings.view_display_id); 876 if (!widgetSettings) { 877 return; 878 } 879 880 // Calculates the selector for the view. 881 var view = '.view-dom-id-' + settings.view_dom_id; 882 if (!jQuery(view).size()) { 883 view = '.view-id-' + settings.view_name + '.view-display-id-' + settings.view_display_id; 884 } 885 886 // Locates the view, AJAX refreshes the content. 887 jQuery(view).filter(function() { return !jQuery(this).parents('.view').size(); }).each(function() { 888 var target = this; 889 890 // create ajax object to handle the response. 891 if (jQuery(target).data('viewsFlagRefresh_ajax') == null) { 892 // TODO: Find a way to handle ajax commands without creating an ajax object. 893 var element_settings = { 894 url: viewsFlagRefresh.ajaxPath(), 895 submit: {}, 896 setClick: true, 897 event: 'click', 898 selector: view, 899 progress: { type: 'throbber' } 900 }; 901 902 jQuery(target).data('viewsFlagRefresh_ajax', new Drupal.ajax(false, view, element_settings)); 903 } 904 905 // Instantiates the theme object, invokes the widget's theme hook. 906 var theme = new viewsFlagRefresh.theme(target, widgetSettings); 907 theme.hookInvoke('themeHook'); 908 909 // Gets AJAX settings, either refreshes the view or submits the exposed 910 // filter form. This latter refreshes the view and maintains the filters. 911 var ajaxSettings = viewsFlagRefresh.ajaxSettings(view, settings, theme); 912 var exposedForm = jQuery('form#views-exposed-form-' + settings.view_name.replace(/_/g, '-') + '-' + settings.view_display_id.replace(/_/g, '-')); 913 if (exposedForm.size()) { 914 setTimeout(function() { jQuery(exposedForm).ajaxSubmit(ajaxSettings); }, theme.timeout); 915 } 916 else { 917 setTimeout(function() { jQuery.ajax(ajaxSettings); }, theme.timeout); 918 } 919 }); 920} 921 922/** 923 * Contructor for our pseudo theme system class. 924 * 925 * @param target
926 * A jQuery object containing the content being refreshed. 927 * @param settings 928 * The widget settings. 929 */ 930viewsFlagRefresh.theme = function(target, settings) { 931 this.timeout = 0; 932 this.target = target; 933 this.settings = settings; 934} 935 936/** 937 * Invokes a hook in the theme object. 938 * 939 * @param hookType 940 * The hook type being invoked, i.e. 'themeHook', 'themeHookPost'. 941 * @return 942 * A boolean flagging whether the hook exists. 943 */ 944viewsFlagRefresh.theme.prototype.hookInvoke = function(hookType) { 945 if (hookType in this.settings && this.settings[hookType] in this) { 946 this[this.settings[hookType]](); 947 return true; 948 } 949 return false; 950} 951 952/** 953 * Adds a throbber image to the view content while it is being refreshed. 954 */ 955viewsFlagRefresh.theme.prototype.throbber = function() { 956 // Hide the content of the view. 957 jQuery(this.target).css('visibility', 'hidden'); 958 959 // Captures parent, as the view is usually in something such as a block. 960 var container = jQuery(this.target).parent(); 961 962 // Adds our throbber to the middle of the view. 963 // NOTE: The throbber image is 32px wide. 964 var pos = jQuery(container).position(); 965 this.throbberElement = jQuery('<img src="' + Drupal.settings.viewsFlagRefresh.imagePath + '/throbber.gif" class="views_flag_refresh-throbber" />') 966 .css('left', pos.left + (jQuery(container).outerWidth() / 2) - 16) 967 .css('top', pos.top + (jQuery(container).outerHeight() / 2) - 16) 968 .insertAfter(this.target); 969} 970 971/** 972 * Cleans up the throbber image. 973 * 974 * @param target 975 * A jQuery object containing the view being refreshed. 976 */ 977viewsFlagRefresh.theme.prototype.throbberPost = function() { 978 jQuery(this.throbberElement).remove(); 979} 980;/*})'"*/;/*})'"*/ 981/** 982 * @file 983 * SEARCH AUTOCOMPLETE javascript mechanism. 984 * 985 * Sponsored by: 986 * www.axiomcafe.fr 987 */ 988 989(function ($) { 990 991 function sanitizeHTML(str) { 992 return $("<div>").html(str).text(); 993 } 994 995 //Escape characters in html terms. 996 function escapeHtml(text) { 997 return text 998 .replace(/&/g, "&") 999 .replace(/</g, "<") 1000 .replace(/>/g, ">") 1001 .replace(/"/g, """); 1002 } 1003 1004 // Escape characters in pattern before creating regexp. 1005 function escapeRegExp(str) { 1006 str = $.trim(str); 1007 return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); 1008 } 1009 1010 // Autocomplete 1011 $.ui.autocomplete.prototype._renderItem = function (ul, item) { 1012 var term = escapeHtml(this.term); 1013 var first = ("group" in item) ? 'first' : ''; 1014 var innerHTML = '<div class="ui-autocomplete-fields ' + first + '">'; 1015 item.value = sanitizeHTML(item.value); 1016 item.label = sanitizeHTML(item.label); 1017 if (item.fields) { 1018 $.each(item.fields, function(key, value) { 1019 var regex = new RegExp('(' + escapeRegExp(term) + ')', 'gi'); 1020 var output = sanitizeHTML(value); 1021 if (value.indexOf('src=') == -1 && value.indexOf('href=') == -1) { 1022 output = output.replace(regex, "<span class='ui-autocomplete-field-term'>$1</span>"); 1023 innerHTML += ('<div class="ui-autocomplete-field-' + key + '">' + output + '</div>'); 1024 } else { 1025 innerHTML += ('<div class="ui-autocomplete-field-' + key + '">' + value + '</div>'); 1026 } 1027 }); 1028 } else { 1029 innerHTML += ('<div class="ui-autocomplete-field">' + item.label + '</div>'); 1030 } 1031 innerHTML += '</div>'; 1032 1033 var group = ''; 1034 if ("group" in item) { 1035 groupId = typeof(item.group.group_id) !== 'undefined' ? item.group.group_id : ''; 1036 groupName = typeof(item.group.group_name) !== 'undefined' ? item.group.group_name : ''; 1037 group += ('<div class="ui-autocomplete-field-group ' + groupId + '">' + groupName + '</div>'); 1038 $(group).appendTo(ul); 1039 } 1040 var elem = $("<li class=ui-menu-item-" + first + "></li>" ) 1041 .append("<a>" + innerHTML + "</a>"); 1042 if (item.value == '') { 1043 elem = $("<li class='ui-state-disabled ui-menu-item-" + first + " ui-menu-item'>" + item.label + "</li>" ); 1044 } 1045 elem.data("item.autocomplete", item).appendTo(ul); 1046 1047 Drupal.attachBehaviors(elem); 1048 return elem; 1049 }; 1050 1051 $.ui.autocomplete.prototype._resizeMenu = function() { 1052 var ul = this.menu.element; 1053 ul.outerWidth(Math.max(ul.width("").outerWidth() + 5, this.options.position.of == null ? this.element.outerWidth() : this.options.position.of.outerWidth())); 1054 }; 1055 1056 Drupal.behaviors.search_autocomplete = { 1057 attach: function(context) { 1058 if (Drupal.settings.search_autocomplete) { 1059 $.each(Drupal.settings.search_autocomplete, function(key, value) { 1060 $(Drupal.settings.search_autocomplete[key].selector).bind("mouseover", function() { 1061 $(Drupal.settings.search_autocomplete[key].selector).addClass('form-autocomplete ui-autocomplete-processed').attr('data-sa-theme', Drupal.settings.search_autocomplete[key].theme).autocomplete({ 1062 minLength: Drupal.settings.search_autocomplete[key].minChars, 1063 source: function(request, response) { 1064 $(Drupal.settings.search_autocomplete[key].selector).addClass('throbbing'); 1065 // External URL: 1066 if (Drupal.settings.search_autocomplete[key].type == 'external') { 1067 $.getJSON(Drupal.settings.search_autocomplete[key].datas, { q: encodeURIComponent(request.term) }, function (results) { 1068 // Only return the number of values set in the settings. 1069 if (results.length) { 1070 results.slice(0, Drupal.settings.search_autocomplete[key].max_sug); 1071 } 1072 response(results); 1073 }); 1074 } 1075 // Internal URL: 1076 else if (Drupal.settings.search_autocomplete[key].type == 'internal' || Drupal.settings.search_autocomplete[key].type == 'view') { 1077 $.getJSON(Drupal.settings.search_autocomplete[key].datas, request, function (results) { 1078 // Only return the number of values set in the settings. 1079 if (results.length) { 1080 results.slice(0, Drupal.settings.search_autocomplete[key].max_sug); 1081 } 1082 response(results); 1083 }); 1084 } 1085 // Static resources: 1086 else if (Drupal.settings.search_autocomplete[key].type == 'static') { 1087 var results = $.ui.autocomplete.filter(Drupal.settings.search_autocomplete[key].datas, request.term); 1088 if (results.length) { 1089 results.slice(0, Drupal.settings.search_autocomplete[key].max_sug); 1090 } 1091 response(results); 1092 } 1093 }, 1094 open: function(event, ui) { 1095 $(".ui-autocomplete li.ui-menu-item:odd").addClass("ui-menu-item-odd"); 1096 $(".ui-autocomplete li.ui-menu-item:even").addClass("ui-menu-item-even"); 1097 $(Drupal.settings.search_autocomplete[key].selector).removeClass('throbbing'); 1098 }, 1099 select: function(event, ui) { 1100 if (Drupal.settings.search_autocomplete[key].auto_redirect == 1 && ui.item.link) { 1101 document.location.href = ui.item.link; 1102 } else if (Drupal.settings.search_autocomplete[key].auto_submit == 1 && ui.item.value) { 1103 $(this).val(ui.item.value); 1104 $(this).closest("form").submit(); 1105 } 1106 $(this).val(sanitizeHTML(ui.item.value)); 1107 }, 1108 focus: function (event, ui) { 1109 if (typeof ui.item.group != 'undefined') { 1110 if (ui.item.group.group_id == 'no_results' || ui.item.group.group_id == 'all_results') { 1111 event.preventDefault(); 1112 } 1113 } 1114 }, 1115 appendTo: $(Drupal.settings.search_autocomplete[key].selector).parent() 1116 }).autocomplete("widget").attr("data-sa-theme", Drupal.settings.search_autocomplete[key].theme); 1117 }); 1118 $(Drupal.settings.search_autocomplete[key].selector).trigger('mouseover'); 1119 }); 1120 } 1121 } 1122 }; 1123})(jQuery); 1124;/*})'"*/;/*})'"*/ 1125/** 1126 * @file
1127 * JavaScript behaviors for the front-end display of webforms. 1128 */ 1129 1130(function ($) { 1131 1132 "use strict"; 1133 1134 Drupal.behaviors.webform = Drupal.behaviors.webform || {}; 1135 1136 Drupal.behaviors.webform.attach = function (context) { 1137 // Calendar datepicker behavior. 1138 Drupal.webform.datepicker(context); 1139 1140 // Conditional logic. 1141 if (Drupal.settings.webform && Drupal.settings.webform.conditionals) { 1142 Drupal.webform.conditional(context); 1143 } 1144 }; 1145 1146 Drupal.webform = Drupal.webform || {}; 1147 1148 Drupal.webform.datepicker = function (context) { 1149 $('div.webform-datepicker').each(function () { 1150 var $webformDatepicker = $(this); 1151 var $calendar = $webformDatepicker.find('input.webform-calendar'); 1152 1153 // Ensure the page we're on actually contains a datepicker. 1154 if ($calendar.length == 0) { 1155 return; 1156 } 1157 1158 var startDate = $calendar[0].className.replace(/.*webform-calendar-start-(\d{4}-\d{2}-\d{2}).*/, '$1').split('-'); 1159 var endDate = $calendar[0].className.replace(/.*webform-calendar-end-(\d{4}-\d{2}-\d{2}).*/, '$1').split('-'); 1160 var firstDay = $calendar[0].className.replace(/.*webform-calendar-day-(\d).*/, '$1'); 1161 // Convert date strings into actual Date objects. 1162 startDate = new Date(startDate[0], startDate[1] - 1, startDate[2]); 1163 endDate = new Date(endDate[0], endDate[1] - 1, endDate[2]); 1164 1165 // Ensure that start comes before end for datepicker. 1166 if (startDate > endDate) { 1167 var laterDate = startDate; 1168 startDate = endDate; 1169 endDate = laterDate; 1170 } 1171 1172 var startYear = startDate.getFullYear(); 1173 var endYear = endDate.getFullYear(); 1174 1175 // Set up the jQuery datepicker element. 1176 $calendar.datepicker({ 1177 dateFormat: 'yy-mm-dd', 1178 yearRange: startYear + ':' + endYear, 1179 firstDay: parseInt(firstDay), 1180 minDate: startDate, 1181 maxDate: endDate, 1182 onSelect: function (dateText, inst) { 1183 var date = dateText.split('-'); 1184 $webformDatepicker.find('select.year, input.year').val(+date[0]).trigger('change'); 1185 $webformDatepicker.find('select.month').val(+date[1]).trigger('change'); 1186 $webformDatepicker.find('select.day').val(+date[2]).trigger('change'); 1187 }, 1188 beforeShow: function (input, inst) { 1189 // Get the select list values. 1190 var year = $webformDatepicker.find('select.year, input.year').val(); 1191 var month = $webformDatepicker.find('select.month').val(); 1192 var day = $webformDatepicker.find('select.day').val(); 1193 1194 // If empty, default to the current year/month/day in the popup. 1195 var today = new Date(); 1196 year = year ? year : today.getFullYear(); 1197 month = month ? month : today.getMonth() + 1; 1198 day = day ? day : today.getDate(); 1199 1200 // Make sure that the default year fits in the available options. 1201 year = (year < startYear || year > endYear) ? startYear : year; 1202 1203 // jQuery UI Datepicker will read the input field and base its date 1204 // off of that, even though in our case the input field is a button. 1205 $(input).val(year + '-' + month + '-' + day); 1206 } 1207 }); 1208 1209 // Prevent the calendar button from submitting the form. 1210 $calendar.click(function (event) { 1211 // This event is triggered also when pressing enter when the focus is on 1212 // previous webform components, but we only want to do something when 1213 // we are on the calendar component. By checking the event client x/y 1214 // position we known if it was the user clicking. For keyboard navigators 1215 // simply the focus handles the date picker so we don't have to do 1216 // anything special for them. 1217 if (event.clientX !== 0 && event.clientY !== 0) { 1218 // Focus is only necessary for Safari. But it has no impact on other 1219 // browsers. 1220 $(this).focus(); 1221 event.preventDefault(); 1222 } 1223 }); 1224 1225 // Clear date on backspace or delete. 1226 $calendar.keyup(function (e) { 1227 if (e.keyCode == 8 || e.keyCode == 46) { 1228 $.datepicker._clearDate(this); 1229 } 1230 }); 1231 }); 1232 }; 1233 1234 Drupal.webform.conditional = function (context) { 1235 // Add the bindings to each webform on the page. 1236 $.each(Drupal.settings.webform.conditionals, function (formKey, settings) { 1237 var $form = $('.' + formKey + ':not(.webform-conditional-processed)'); 1238 $form.each(function (index, currentForm) { 1239 var $currentForm = $(currentForm); 1240 $currentForm.addClass('webform-conditional-processed'); 1241 $currentForm.bind('change', {'settings': settings}, Drupal.webform.conditionalCheck); 1242 1243 // Trigger all the elements that cause conditionals on this form. 1244 Drupal.webform.doConditions($currentForm, settings); 1245 }); 1246 }); 1247 }; 1248 1249 /** 1250 * Event handler to respond to field changes in a form. 1251 * 1252 * This event is bound to the entire form, not individual fields. 1253 */ 1254 Drupal.webform.conditionalCheck = function (e) { 1255 var $triggerElement = $(e.target).closest('.webform-component'); 1256 if (!$triggerElement.length) { 1257 return; 1258 } 1259 var $form = $triggerElement.closest('form'); 1260 var triggerElementKey = $triggerElement.attr('class').match(/webform-component--[^ ]+/)[0]; 1261 var settings = e.data.settings; 1262 if (settings.sourceMap[triggerElementKey]) { 1263 Drupal.webform.doConditions($form, settings); 1264 } 1265 }; 1266 1267 /** 1268 * Processes all conditional. 1269 */ 1270 Drupal.webform.doConditions = function ($form, settings) { 1271 1272 var stackPointer; 1273 var resultStack; 1274 1275 /** 1276 * Initializes an execution stack for a conditional group's rules. 1277 * 1278 * Also initializes sub-conditional rules. 1279 */ 1280 function executionStackInitialize(andor) { 1281 stackPointer = -1; 1282 resultStack = []; 1283 executionStackPush(andor); 1284 } 1285 1286 /** 1287 * Starts a new subconditional for the given and/or operator. 1288 */ 1289 function executionStackPush(andor) { 1290 resultStack[++stackPointer] = { 1291 results: [], 1292 andor: andor, 1293 }; 1294 } 1295 1296 /** 1297 * Adds a rule's result to the current sub-conditional. 1298 */ 1299 function executionStackAccumulate(result) { 1300 resultStack[stackPointer]['results'].push(result); 1301 } 1302 1303 /** 1304 * Finishes a sub-conditional and adds the result to the parent stack frame. 1305 */ 1306 function executionStackPop() { 1307 // Calculate the and/or result. 1308 var stackFrame = resultStack[stackPointer]; 1309 // Pop stack and protect against stack underflow. 1310 stackPointer = Math.max(0, stackPointer - 1); 1311 var $conditionalResults = stackFrame['results']; 1312 var filteredResults = $.map($conditionalResults, function (val) { 1313 return val ? val : null; 1314 }); 1315 return stackFrame['andor'] === 'or' 1316 ? filteredResults.length > 0 1317 : filteredResults.length === $conditionalResults.length; 1318 } 1319 1320 // Track what has been set/hidden for each target component's elements. 1321 // Hidden elements must be disabled because if they are required and don't 1322 // have a value, they will prevent submission due to html5 validation. 1323 // Each execution of the conditionals adds a temporary class 1324 // webform-disabled-flag so that elements hidden or set can be disabled and 1325 // also be prevented from being re-enabled by another conditional (such as a 1326 // parent fieldset). After processing conditionals, this temporary class 1327 // must be removed in preparation for the next execution of the 1328 // conditionals. 1329 $.each(settings.ruleGroups, function (rgid_key, rule_group) { 1330 var ruleGroup = settings.ruleGroups[rgid_key]; 1331 1332 // Perform the comparison callback and build the results for this group. 1333 executionStackInitialize(ruleGroup['andor']); 1334 $.each(ruleGroup['rules'], function (m, rule) { 1335 switch (rule['source_type']) { 1336 case 'component':
1337 var elementKey = rule['source']; 1338 var element = $form.find('.' + elementKey)[0]; 1339 var existingValue = settings.values[elementKey] ? settings.values[elementKey] : null; 1340 executionStackAccumulate(window['Drupal']['webform'][rule.callback](element, existingValue, rule['value'])); 1341 break; 1342 1343 case 'conditional_start': 1344 executionStackPush(rule['andor']); 1345 break; 1346 1347 case 'conditional_end': 1348 executionStackAccumulate(executionStackPop()); 1349 break; 1350 } 1351 }); 1352 var conditionalResult = executionStackPop(); 1353 1354 $.each(ruleGroup['actions'], function (aid, action) { 1355 var $target = $form.find('.' + action['target']); 1356 var actionResult = action['invert'] ? !conditionalResult : conditionalResult; 1357 switch (action['action']) { 1358 case 'show': 1359 var changed = actionResult != Drupal.webform.isVisible($target); 1360 if (actionResult) { 1361 $target.find('.webform-conditional-disabled:not(.webform-disabled-flag)') 1362 .removeClass('webform-conditional-disabled') 1363 .webformProp('disabled', false); 1364 $target 1365 .removeClass('webform-conditional-hidden') 1366 .show(); 1367 $form.find('.chosen-disabled').prev().trigger('chosen:updated.chosen'); 1368 } 1369 else { 1370 $target 1371 .hide() 1372 .addClass('webform-conditional-hidden') 1373 .find(':input') 1374 .addClass('webform-conditional-disabled webform-disabled-flag') 1375 .webformProp('disabled', true); 1376 } 1377 if (changed && $target.is('tr')) { 1378 Drupal.webform.restripeTable($target.closest('table').first()); 1379 } 1380 break; 1381 1382 case 'require': 1383 var $requiredSpan = $target.find('.form-required, .form-optional').first(); 1384 if (actionResult != $requiredSpan.hasClass('form-required')) { 1385 var $targetInputElements = $target.find("input:text,textarea,input[type='email'],select,input:radio,input:checkbox,input:file"); 1386 // Rather than hide the required tag, remove it so that other 1387 // jQuery can respond via Drupal behaviors. 1388 Drupal.detachBehaviors($requiredSpan); 1389 $targetInputElements 1390 .webformProp('required', actionResult) 1391 .toggleClass('required', actionResult); 1392 if (actionResult) { 1393 $requiredSpan.replaceWith('<span class="form-required" title="' + Drupal.t('This field is required.') + '">*</span>'); 1394 } 1395 else { 1396 $requiredSpan.replaceWith('<span class="form-optional"></span>'); 1397 } 1398 Drupal.attachBehaviors($requiredSpan); 1399 } 1400 break; 1401 1402 case 'set': 1403 var $texts = $target.find("input:text,textarea,input[type='email']"); 1404 var $selects = $target.find('select,select option,input:radio,input:checkbox'); 1405 var $markups = $target.filter('.webform-component-markup'); 1406 if (actionResult) { 1407 var multiple = $.map(action['argument'].split(','), $.trim); 1408 $selects 1409 .webformVal(multiple) 1410 .webformProp('disabled', true) 1411 .addClass('webform-disabled-flag'); 1412 $texts 1413 .val([action['argument']]) 1414 .webformProp('readonly', true) 1415 .addClass('webform-disabled-flag'); 1416 // A special case is made for markup. It is sanitized with 1417 // filter_xss_admin on the server. otherwise text() should be used 1418 // to avoid an XSS vulnerability. text() however would preclude 1419 // the use of tags like <strong> or <a>. 1420 $markups.html(action['argument']); 1421 } 1422 else { 1423 $selects.not('.webform-disabled-flag') 1424 .webformProp('disabled', false); 1425 $texts.not('.webform-disabled-flag') 1426 .webformProp('readonly', false); 1427 // Markup not set? Then restore original markup as provided in 1428 // the attribute data-webform-markup. 1429 $markups.each(function () { 1430 var $this = $(this); 1431 var original = $this.data('webform-markup'); 1432 if (original !== undefined) { 1433 $this.html(original); 1434 } 1435 }); 1436 } 1437 break; 1438 } 1439 }); // End look on each action for one conditional. 1440 }); // End loop on each conditional. 1441 1442 $form.find('.webform-disabled-flag').removeClass('webform-disabled-flag'); 1443 }; 1444 1445 /** 1446 * Event handler to prevent propagation of events. 1447 * 1448 * Typically click for disabling radio and checkboxes. 1449 */ 1450 Drupal.webform.stopEvent = function () { 1451 return false;
1452 }; 1453 1454 Drupal.webform.conditionalOperatorStringEqual = function (element, existingValue, ruleValue) { 1455 var returnValue = false; 1456 var currentValue = Drupal.webform.stringValue(element, existingValue); 1457 $.each(currentValue, function (n, value) { 1458 if (value.toLowerCase() === ruleValue.toLowerCase()) { 1459 returnValue = true; 1460 return false; // break. 1461 } 1462 }); 1463 return returnValue; 1464 }; 1465 1466 Drupal.webform.conditionalOperatorStringNotEqual = function (element, existingValue, ruleValue) { 1467 var found = false; 1468 var currentValue = Drupal.webform.stringValue(element, existingValue); 1469 $.each(currentValue, function (n, value) { 1470 if (value.toLowerCase() === ruleValue.toLowerCase()) { 1471 found = true; 1472 } 1473 }); 1474 return !found; 1475 }; 1476 1477 Drupal.webform.conditionalOperatorStringContains = function (element, existingValue, ruleValue) { 1478 var returnValue = false; 1479 var currentValue = Drupal.webform.stringValue(element, existingValue); 1480 $.each(currentValue, function (n, value) { 1481 if (value.toLowerCase().indexOf(ruleValue.toLowerCase()) > -1) { 1482 returnValue = true; 1483 return false; // break. 1484 } 1485 }); 1486 return returnValue; 1487 }; 1488 1489 Drupal.webform.conditionalOperatorStringDoesNotContain = function (element, existingValue, ruleValue) { 1490 var found = false; 1491 var currentValue = Drupal.webform.stringValue(element, existingValue); 1492 $.each(currentValue, function (n, value) { 1493 if (value.toLowerCase().indexOf(ruleValue.toLowerCase()) > -1) { 1494 found = true; 1495 } 1496 }); 1497 return !found; 1498 }; 1499 1500 Drupal.webform.conditionalOperatorStringBeginsWith = function (element, existingValue, ruleValue) { 1501 var returnValue = false; 1502 var currentValue = Drupal.webform.stringValue(element, existingValue); 1503 $.each(currentValue, function (n, value) { 1504 if (value.toLowerCase().indexOf(ruleValue.toLowerCase()) === 0) { 1505 returnValue = true; 1506 return false; // break. 1507 } 1508 }); 1509 return returnValue; 1510 }; 1511 1512 Drupal.webform.conditionalOperatorStringEndsWith = function (element, existingValue, ruleValue) { 1513 var returnValue = false; 1514 var currentValue = Drupal.webform.stringValue(element, existingValue); 1515 $.each(currentValue, function (n, value) { 1516 if (value.toLowerCase().lastIndexOf(ruleValue.toLowerCase()) === value.length - ruleValue.length) { 1517 returnValue = true; 1518 return false; // break. 1519 } 1520 }); 1521 return returnValue; 1522 }; 1523 1524 Drupal.webform.conditionalOperatorStringEmpty = function (element, existingValue, ruleValue) { 1525 var currentValue = Drupal.webform.stringValue(element, existingValue); 1526 var returnValue = true; 1527 $.each(currentValue, function (n, value) { 1528 if (value !== '') { 1529 returnValue = false; 1530 return false; // break. 1531 } 1532 }); 1533 return returnValue; 1534 }; 1535 1536 Drupal.webform.conditionalOperatorStringNotEmpty = function (element, existingValue, ruleValue) { 1537 return !Drupal.webform.conditionalOperatorStringEmpty(element, existingValue, ruleValue); 1538 }; 1539 1540 Drupal.webform.conditionalOperatorSelectGreaterThan = function (element, existingValue, ruleValue) { 1541 var currentValue = Drupal.webform.stringValue(element, existingValue); 1542 return Drupal.webform.compare_select(currentValue[0], ruleValue, element) > 0; 1543 }; 1544 1545 Drupal.webform.conditionalOperatorSelectGreaterThanEqual = function (element, existingValue, ruleValue) { 1546 var currentValue = Drupal.webform.stringValue(element, existingValue); 1547 var comparison = Drupal.webform.compare_select(currentValue[0], ruleValue, element); 1548 return comparison > 0 || comparison === 0; 1549 }; 1550 1551 Drupal.webform.conditionalOperatorSelectLessThan = function (element, existingValue, ruleValue) { 1552 var currentValue = Drupal.webform.stringValue(element, existingValue); 1553 return Drupal.webform.compare_select(currentValue[0], ruleValue, element) < 0; 1554 }; 1555 1556 Drupal.webform.conditionalOperatorSelectLessThanEqual = function (element, existingValue, ruleValue) { 1557 var currentValue = Drupal.webform.stringValue(element, existingV
1557alue); 1558 var comparison = Drupal.webform.compare_select(currentValue[0], ruleValue, element); 1559 return comparison < 0 || comparison === 0; 1560 }; 1561 1562 Drupal.webform.conditionalOperatorNumericEqual = function (element, existingValue, ruleValue) { 1563 // See float comparison: http://php.net/manual/en/language.types.float.php 1564 var currentValue = Drupal.webform.stringValue(element, existingValue); 1565 var epsilon = 0.000001; 1566 // An empty string does not match any number. 1567 return currentValue[0] === '' ? false : (Math.abs(parseFloat(currentValue[0]) - parseFloat(ruleValue)) < epsilon); 1568 }; 1569 1570 Drupal.webform.conditionalOperatorNumericNotEqual = function (element, existingValue, ruleValue) { 1571 // See float comparison: http://php.net/manual/en/language.types.float.php 1572 var currentValue = Drupal.webform.stringValue(element, existingValue); 1573 var epsilon = 0.000001; 1574 // An empty string does not match any number. 1575 return currentValue[0] === '' ? true : (Math.abs(parseFloat(currentValue[0]) - parseFloat(ruleValue)) >= epsilon); 1576 }; 1577 1578 Drupal.webform.conditionalOperatorNumericGreaterThan = function (element, existingValue, ruleValue) { 1579 var currentValue = Drupal.webform.stringValue(element, existingValue); 1580 return parseFloat(currentValue[0]) > parseFloat(ruleValue); 1581 }; 1582 1583 Drupal.webform.conditionalOperatorNumericGreaterThanEqual = function (element, existingValue, ruleValue) { 1584 return Drupal.webform.conditionalOperatorNumericGreaterThan(element, existingValue, ruleValue) || 1585 Drupal.webform.conditionalOperatorNumericEqual(element, existingValue, ruleValue); 1586 }; 1587 1588 Drupal.webform.conditionalOperatorNumericLessThan = function (element, existingValue, ruleValue) { 1589 var currentValue = Drupal.webform.stringValue(element, existingValue); 1590 return parseFloat(currentValue[0]) < parseFloat(ruleValue); 1591 }; 1592 1593 Drupal.webform.conditionalOperatorNumericLessThanEqual = function (element, existingValue, ruleValue) { 1594 return Drupal.webform.conditionalOperatorNumericLessThan(element, existingValue, ruleValue) || 1595 Drupal.webform.conditionalOperatorNumericEqual(element, existingValue, ruleValue); 1596 }; 1597 1598 Drupal.webform.conditionalOperatorDateEqual = function (element, existingValue, ruleValue) { 1599 var currentValue = Drupal.webform.dateValue(element, existingValue); 1600 return currentValue === ruleValue; 1601 }; 1602 1603 Drupal.webform.conditionalOperatorDateNotEqual = function (element, existingValue, ruleValue) { 1604 return !Drupal.webform.conditionalOperatorDateEqual(element, existingValue, ruleValue); 1605 }; 1606 1607 Drupal.webform.conditionalOperatorDateBefore = function (element, existingValue, ruleValue) { 1608 var currentValue = Drupal.webform.dateValue(element, existingValue); 1609 return (currentValue !== false) && currentValue < ruleValue; 1610 }; 1611 1612 Drupal.webform.conditionalOperatorDateBeforeEqual = function (element, existingValue, ruleValue) { 1613 var currentValue = Drupal.webform.dateValue(element, existingValue); 1614 return (currentValue !== false) && (currentValue < ruleValue || currentValue === ruleValue); 1615 }; 1616 1617 Drupal.webform.conditionalOperatorDateAfter = function (element, existingValue, ruleValue) { 1618 var currentValue = Drupal.webform.dateValue(element, existingValue); 1619 return (currentValue !== false) && currentValue > ruleValue; 1620 }; 1621 1622 Drupal.webform.conditionalOperatorDateAfterEqual = function (element, existingValue, ruleValue) { 1623 var currentValue = Drupal.webform.dateValue(element, existingValue); 1624 return (currentValue !== false) && (currentValue > ruleValue || currentValue === ruleValue); 1625 }; 1626 1627 Drupal.webform.conditionalOperatorTimeEqual = function (element, existingValue, ruleValue) { 1628 var currentValue = Drupal.webform.timeValue(element, existingValue); 1629 return currentValue === ruleValue; 1630 }; 1631 1632 Drupal.webform.conditionalOperatorTimeNotEqual = function (element, existingValue, ruleValue) { 1633 return !Drupal.webform.conditionalOperatorTimeEqual(element, existingValue, ruleValue); 1634 }; 1635 1636 Drupal.webform.conditionalOperatorTimeBefore = function (element, existingV
1636alue, ruleValue) { 1637 // Date and time operators intentionally exclusive for "before". 1638 var currentValue = Drupal.webform.timeValue(element, existingValue); 1639 return (currentValue !== false) && (currentValue < ruleValue); 1640 }; 1641 1642 Drupal.webform.conditionalOperatorTimeBeforeEqual = function (element, existingValue, ruleValue) { 1643 // Date and time operators intentionally exclusive for "before". 1644 var currentValue = Drupal.webform.timeValue(element, existingValue); 1645 return (currentValue !== false) && (currentValue < ruleValue || currentValue === ruleValue); 1646 }; 1647 1648 Drupal.webform.conditionalOperatorTimeAfter = function (element, existingValue, ruleValue) { 1649 // Date and time operators intentionally inclusive for "after". 1650 var currentValue = Drupal.webform.timeValue(element, existingValue); 1651 return (currentValue !== false) && (currentValue > ruleValue); 1652 }; 1653 1654 Drupal.webform.conditionalOperatorTimeAfterEqual = function (element, existingValue, ruleValue) { 1655 // Date and time operators intentionally inclusive for "after". 1656 var currentValue = Drupal.webform.timeValue(element, existingValue); 1657 return (currentValue !== false) && (currentValue > ruleValue || currentValue === ruleValue); 1658 }; 1659 1660 /** 1661 * Utility function to compare values of a select component. 1662 * 1663 * @param string a 1664 * First select option key to compare 1665 * @param string b 1666 * Second select option key to compare 1667 * @param array options 1668 * Associative array where the a and b are within the keys 1669 * 1670 * @return integer based upon position of $a and $b in $options 1671 * -N if $a above (<) $b 1672 * 0 if $a = $b 1673 * +N if $a is below (>) $b 1674 */ 1675 Drupal.webform.compare_select = function (a, b, element) { 1676 var optionList = []; 1677 $('option,input:radio,input:checkbox', element).each(function () { 1678 optionList.push($(this).val()); 1679 }); 1680 var a_position = optionList.indexOf(a); 1681 var b_position = optionList.indexOf(b); 1682 return (a_position < 0 || b_position < 0) ? null : a_position - b_position; 1683 }; 1684 1685 /** 1686 * Utility to return current visibility. 1687 * 1688 * Uses actual visibility, except for hidden components which use the applied 1689 * disabled class. 1690 */ 1691 Drupal.webform.isVisible = function ($element) { 1692 return $element.hasClass('webform-component-hidden') 1693 ? !$element.find('input').first().hasClass('webform-conditional-disabled') 1694 : $element.closest('.webform-conditional-hidden').length == 0; 1695 }; 1696 1697 /** 1698 * Function to get a string value from a select/radios/text/etc. field. 1699 */ 1700 Drupal.webform.stringValue = function (element, existingValue) { 1701 var value = []; 1702 if (element) { 1703 var $element = $(element); 1704 if (Drupal.webform.isVisible($element)) { 1705 // Checkboxes and radios. 1706 $element.find('input[type=checkbox]:checked,input[type=radio]:checked').each(function () { 1707 value.push(this.value); 1708 }); 1709 // Select lists. 1710 if (!value.length) { 1711 var selectValue = $element.find('select').val(); 1712 if (selectValue) { 1713 if ($.isArray(selectValue)) { 1714 value = selectValue; 1715 } 1716 else { 1717 value.push(selectValue); 1718 } 1719 } 1720 } 1721 // Simple text fields. This check is done last so that the select list 1722 // in select-or-other fields comes before the "other" text field. 1723 if (!value.length) { 1724 $element.find('input:not([type=checkbox],[type=radio]),textarea').each(function () { 1725 value.push(this.value); 1726 }); 1727 } 1728 } 1729 } 1730 else { 1731 switch ($.type(existingValue)) { 1732 case 'array':
1733 value = existingValue; 1734 break; 1735 1736 case 'string': 1737 value.push(existingValue); 1738 break; 1739 } 1740 } 1741 return value; 1742 }; 1743 1744 /** 1745 * Utility function to calculate a second-based timestamp from a time field. 1746 */ 1747 Drupal.webform.dateValue = function (element, existingValue) { 1748 var value = false; 1749 if (element) { 1750 var $element = $(element); 1751 if (Drupal.webform.isVisible($element)) { 1752 var day = $element.find('[name*=day]').val(); 1753 var month = $element.find('[name*=month]').val(); 1754 var year = $element.find('[name*=year]').val(); 1755 // Months are 0 indexed in JavaScript. 1756 if (month) { 1757 month--; 1758 } 1759 if (year !== '' && month !== '' && day !== '') { 1760 value = Date.UTC(year, month, day) / 1000; 1761 } 1762 } 1763 } 1764 else { 1765 if ($.type(existingValue) === 'array' && existingValue.length) { 1766 existingValue = existingValue[0]; 1767 } 1768 if ($.type(existingValue) === 'string') { 1769 existingValue = existingV
1769alue.split('-'); 1770 } 1771 if (existingValue.length === 3) { 1772 value = Date.UTC(existingValue[0], existingValue[1], existingValue[2]) / 1000; 1773 } 1774 } 1775 return value; 1776 }; 1777 1778 /** 1779 * Utility function to calculate a millisecond timestamp from a time field. 1780 */ 1781 Drupal.webform.timeValue = function (element, existingValue) { 1782 var value = false; 1783 if (element) { 1784 var $element = $(element); 1785 if (Drupal.webform.isVisible($element)) { 1786 var hour = $element.find('[name*=hour]').val(); 1787 var minute = $element.find('[name*=minute]').val(); 1788 var ampm = $element.find('[name*=ampm]:checked').val(); 1789 1790 // Convert to integers if set. 1791 hour = (hour === '') ? hour : parseInt(hour); 1792 minute = (minute === '') ? minute : parseInt(minute); 1793 1794 if (hour !== '') { 1795 hour = (hour < 12 && ampm == 'pm') ? hour + 12 : hour; 1796 hour = (hour === 12 && ampm == 'am') ? 0 : hour; 1797 } 1798 if (hour !== '' && minute !== '') { 1799 value = Date.UTC(1970, 0, 1, hour, minute) / 1000; 1800 } 1801 } 1802 } 1803 else { 1804 if ($.type(existingValue) === 'array' && existingValue.length) {
1805 existingValue = existingValue[0]; 1806 } 1807 if ($.type(existingValue) === 'string') { 1808 existingValue = existingValue.split(':'); 1809 } 1810 if (existingValue.length >= 2) { 1811 value = Date.UTC(1970, 0, 1, existingValue[0], existingValue[1]) / 1000; 1812 } 1813 } 1814 return value; 1815 }; 1816 1817 /** 1818 * Make a prop shim for jQuery < 1.9. 1819 */ 1820 $.fn.webformProp = $.fn.webformProp || function (name, value) { 1821 if (value) { 1822 return $.fn.prop ? this.prop(name, true) : this.attr(name, true); 1823 } 1824 else { 1825 return $.fn.prop ? this.prop(name, false) : this.removeAttr(name); 1826 } 1827 }; 1828 1829 /** 1830 * Make a multi-valued val() function. 1831 * 1832 * This is for setting checkboxes, radios, and select elements. 1833 */ 1834 $.fn.webformVal = function (values) { 1835 this.each(function () { 1836 var $this = $(this); 1837 var value = $this.val(); 1838 var on = $.inArray($this.val(), values) != -1; 1839 if (this.nodeName == 'OPTION') { 1840 $this.webformProp('selected', on ? value : false); 1841 } 1842 else { 1843 $this.val(on ? [value] : false); 1844 } 1845 }); 1846 return this; 1847 }; 1848 1849 /** 1850 * Given a table's DOM element, restripe the odd/even classes. 1851 */ 1852 Drupal.webform.restripeTable = function (table) { 1853 // :even and :odd are reversed because jQuery counts from 0 and 1854 // we count from 1, so we're out of sync. 1855 // Match immediate children of the parent element to allow nesting. 1856 $('> tbody > tr, > tr', table) 1857 .filter(':visible:odd').filter('.odd') 1858 .removeClass('odd').addClass('even') 1859 .end().end() 1860 .filter(':visible:even').filter('.even') 1861 .removeClass('even').addClass('odd'); 1862 }; 1863 1864})(jQuery); 1865;/*})'"*/;/*})'"*/
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.