Version 5.0.0 release

This commit is contained in:
Neo committed 2025-12-19 18:37:58 -08:00
1 parent 90e8c7e903
commit a3a4a9ccbd
651 files changed
+7275 -9481

No files matched your search

+1 -1
View File
@@ -1,2 +1,2 @@
;(function($,_,undefined){"use strict";ips.controller.register('cms.front.blocks.navigation',{initialize:function(){this.on('click','details',this.loadNavigationItems);var openSection=$(this.scope).find('details[open]:first');if(openSection.length){this.loadNavigationItems(null,openSection);}},loadNavigationItems:function(e,details=null){if(details===null){details=$(e.target).parents('details:first');}
var itemContainer=$(details).find('> [data-role="containerItems"]');var self=this;if(!itemContainer.html().trim().length){ips.getAjax()(ips.getSetting('baseURL')+'?app=cms&module=pages&controller=ajax&do=loadItems',{data:{navType:$(self.scope).attr('data-navType'),navId:$(self.scope).attr('data-navId'),container:$(details).data('container')}}).done(function(response){$(itemContainer).html(response);});}}});}(jQuery,_));;
var itemContainer=$(details).find('> [data-role="containerItems"]');var self=this;if(!itemContainer.html().trim().length){ips.getAjax()(ips.getSetting('baseURL')+'?app=cms&module=pages&controller=ajax&do=loadItems',{data:{navType:$(self.scope).attr('data-navType'),navId:$(self.scope).attr('data-navId'),container:$(details).data('container')}}).done(function(response){$(itemContainer).html(response);if(!_.isUndefined(ips.getSetting('currentRecordId'))){$(itemContainer).find('a[data-id="'+ips.getSetting('currentRecordId')+'"]').attr('aria-current','page');}});}}});}(jQuery,_));;
+4 -4
View File
@@ -17,7 +17,7 @@ if(isInAdminGroup){ips.ui.alert.show({type:'confirm',message:ips.getString('memb
;(function($,_,undefined){"use strict";ips.controller.register('core.admin.members.allowedCharacters',{initialize:function(){this.on('click','[data-action="easy"]',this.showEasy);this.on('click','[data-action="regex"]',this.showRegex);this.setup();},showEasy:function(e){if(e){e.preventDefault();}
this.scope.find('[data-role="easy"]').show();this.scope.find('[data-role="regex"]').hide();this.scope.find('[data-role="easyInput"]').val('1');},showRegex:function(e){if(e){e.preventDefault();}
this.scope.find('[data-role="regex"]').show();this.scope.find('[data-role="easy"]').hide();this.scope.find('[data-role="easyInput"]').val('0');},setup:function(){this.scope.find('[data-action="easy"]').show();this.scope.find('[data-action="regex"]').show();if(this.scope.attr('data-easy')==1){this.showEasy();}}});}(jQuery,_));;
;(function($,_,undefined){"use strict";ips.controller.register('core.admin.members.achievementRuleForm',{initialize:function(){this.on('change','select[name="achievement_rule_action"]',this.changeRule);this.on('click','[data-action="filterReveal"]',this.showFilter);this.on('click','[data-action="filterCollapse"]',this.hideFilter);this.on('change keyup','input[type="number"]',this.changeNumber);this.on('change','select[name$="[badge]"]',this.changeBadge);this.setup();},setup:function(){this._select=this.scope.find('select[name="achievement_rule_action"]');this.changeRule();},changeBadge:function(e){this._changeBadge($(e.currentTarget).closest('select[name$="[badge]"]'));},_changeBadge:function(badgeSelectObj){const data=badgeSelectObj.attr('name').split('_');const translatable=$('#'+data[0]+'_'+data[1]+'_award_'+data[3].replace('[badge]','')+'_badge');if(badgeSelectObj.val()>0){translatable.each(function(){this.ipsShow();});}else{translatable.each(function(){this.ipsHide();});}},changeRule:function(e){if(e){e.preventDefault();}
const ruleToShow=this.scope.find(`#rule_${this._select.val()}`);this.scope.find('[data-role="ruleWrap"]').each(function(){this.ipsHide()});ruleToShow.attr('data-ipsForm',true);ruleToShow.get(0).ipsShow();this._changeBadge($('select[name="'+this._select.val()+'_award_subject[badge]"]'));const otherBadge=$('select[name="'+this._select.val()+'_award_other[badge]"]');if(otherBadge.length){this._changeBadge(otherBadge);}
$(document).trigger('contentChange',[ruleToShow]);},showFilter:function(e){const ruleWrap=$(e.currentTarget).closest('[data-role="ruleWrap"]');const toggleWrap=$(e.currentTarget).closest('[data-role="toggleFilter"]');const check=toggleWrap.find('input[type="checkbox"]');const toggleRow=toggleWrap.closest('[data-role="conditionButtons"]');check.prop('checked',true).trigger('change');toggleWrap.each(function(){this.ipsHide();});toggleRow.toggle(toggleRow.find('[data-role="toggleFilter"] input[type="checkbox"]:visible').length>0);ruleWrap.find(`#${check.attr('data-filter')}`).each(function(){this.ipsShow();});if(ruleWrap.find('input[type="number"]')){const self=this;ruleWrap.find('input[type="number"]').each(function(){self._pluralizeNumber($(this));});}},hideFilter:function(e){e.preventDefault();const filter=$(e.currentTarget).closest('[data-role="filterField"]');const filterName=filter.attr('id');const ruleWrap=filter.closest('[data-role="ruleWrap"]');const check=ruleWrap.find(`#${filterName}Checkbox`);const toggleWrap=check.closest('[data-role="toggleFilter"]');check.prop('checked',false).trigger('change');toggleWrap.each(function(){this.ipsShow();})
toggleWrap.closest('[data-role="conditionButtons"]').each(function(){this.ipsShow();});filter.each(function(){this.ipsHide()});},changeNumber:function(e){this._pluralizeNumber($(e.currentTarget));},_pluralizeNumber:function(input){const span=input.next('[data-role="th"]');if(span.length){span.text(ips.pluralize(ips.getString('numberSuffix'),input.val()));}}});}(jQuery,_));;
;(function($,_,undefined){"use strict";ips.controller.register('core.admin.members.achievementRuleForm',{initialize(){this.on('click','[data-action="filterReveal"]',this.showFilter);this.on('click','[data-action="filterCollapse"]',this.hideFilter);this.on('change keyup','input[type="number"]',this.changeNumber);},showFilter(e){const ruleWrap=e.currentTarget.closest('[data-role="ruleWrap"]');const toggleWrap=e.currentTarget.closest('[data-role="toggleFilter"]');const check=toggleWrap.querySelector('input[type="checkbox"]');const conditionButtons=toggleWrap.closest('[data-role="conditionButtons"]');check.checked=true;check.dispatchEvent(new Event('change',{bubbles:true}));toggleWrap.ipsHide();if(conditionButtons?.querySelector('[data-role="toggleFilter"] input[data-filter]:not(:checked)')){conditionButtons?.ipsShow();}else{conditionButtons?.ipsHide();}
const filterName=check.dataset.filter;if(filterName){ruleWrap.querySelectorAll(`#${filterName}`).ipsShow();}
ruleWrap.querySelectorAll('input[type="number"]').forEach(el=>this._pluralizeNumber(el));},hideFilter(e){e.preventDefault();const filter=e.currentTarget.closest('[data-role="filterField"]');const filterName=filter.id;const check=filter.closest('[data-role="ruleWrap"]').querySelector(`#${filterName}Checkbox`);const toggleWrap=check.closest('[data-role="toggleFilter"]');check.checked=false;check.dispatchEvent(new Event('change',{bubbles:true}));toggleWrap.ipsShow()
toggleWrap.closest('[data-role="conditionButtons"]')?.ipsShow();filter.ipsHide();},changeNumber(e){this._pluralizeNumber(e.currentTarget);},_pluralizeNumber(input){const span=input.nextElementSibling;if(span?.matches('[data-role="th"]')){span.innerText=ips.pluralize(ips.getString('numberSuffix'),input.value);}}});}(jQuery,_));;
+2 -2
View File
@@ -1,6 +1,6 @@
ips.templates.set('downloads.submit.screenshot'," <div class='ipsUploader__row ipsUploader__row--image ipsAttach {{#done}}ipsAttach_done{{/done}}' id='{{id}}' data-role='file' data-fileid='{{id}}' data-filesize='{{sizeRaw}}' data-fullsizeurl='{{imagesrc}}' data-thumbnailurl='{{thumbnail}}' data-fileType='image'> <div class='ipsUploader__rowPreview' data-role='preview'> <label for='{{field_name}}_primary_screenshot_{{id}}' class='i-cursor_pointer'> {{#thumb}} {{{thumb}}} {{/thumb}} <div class='ipsUploader__rowPreview__generic' {{#thumb}}style='display: none'{{/thumb}}> <i class='fa-solid fa-{{extIcon}}'></i> </div> </label> </div> <div class='ipsUploader_rowMeta'> <h2 class='ipsUploader_rowTitle' data-role='title'>{{title}}</h2> <p class='ipsUploader_rowDesc'> {{size}} {{#statusText}}&middot; <span class='i-color_soft' data-role='status'>{{statusText}}</span>{{/statusText}} </p> {{#status}}<meter class='ipsMeter' data-role='progressbar' max='100'></meter>{{/status}} </div> <span data-role='insert' {{#insertable}}style='display: none'{{/insertable}}> <a href='#' class='ipsAttach_selection' data-ipsTooltip title='{{#lang}}insertIntoPost{{/lang}}'> <i class='fa-solid fa-plus'></i> </a> </span> {{#supportsDelete}} <div data-role='deleteFileWrapper' {{#newUpload}}style='display: none'{{/newUpload}}> <input type='hidden' name='{{field_name}}_keep[{{id}}]' value='1'> <a href='#' data-role='deleteFile' class='ipsUploader__rowDelete' data-ipsTooltip title='{{#lang}}attachRemove{{/lang}}'> &times; </a> </div> {{/supportsDelete}} {{^supportsDelete}} <div data-role='deleteFileWrapper' style='display: none'> <input type='hidden' name='{{field_name}}_keep[{{id}}]' value='1'> <a href='#' class='ipsUploader__rowDelete' data-role='deleteFile' data-ipsTooltip title='{{#lang}}attachRemove{{/lang}}'>&times;</a> </div> {{/supportsDelete}} <label for='{{field_name}}_primary_screenshot_{{id}}' class='cDownloadsPrimaryRadio' data-ipsTooltip title='{{#lang}}makePrimaryScreenshot{{/lang}}'> <input type='radio' name='{{field_name}}_primary_screenshot' id='{{field_name}}_primary_screenshot_{{id}}' value='{{id}}' {{#default}}checked{{/default}} class='ipsInput ipsInput--toggle'> {{#lang}}makePrimary{{/lang}} </label> </div>");ips.templates.set('downloads.submit.screenshotWrapper'," <div class='ipsUploader__container ipsUploader__container--images'>{{{content}}}</div>");ips.templates.set('downloads.submit.linkedScreenshot'," <li class='cDownloadsLinkedScreenshotItem'> <input type='url' name='{{name}}[{{id}}]' value='{{value}}'> <div class='cDownloadsLinkedScreenshotItem_block'> <input type='radio' name='screenshots_primary_screenshot' value='{{id}}' title='{{#lang}}makePrimaryScreenshot{{/lang}}' data-ipsTooltip {{extra}}> </div> <div class='cDownloadsLinkedScreenshotItem_block'> <a href='#' data-action='removeField' title='{{#lang}}removeScreenshot{{/lang}}' data-ipsTooltip><i class='fa-solid fa-xmark'></i></a> </div> </li>");;
ips.templates.set('downloads.submit.screenshot'," <div class='ipsUploader__row ipsUploader__row--image ipsAttach {{#done}}ipsAttach_done{{/done}}' id='{{id}}' data-role='file' data-fileid='{{id}}' data-filesize='{{sizeRaw}}' data-fullsizeurl='{{imagesrc}}' data-thumbnailurl='{{thumbnail}}' data-fileType='image'> <div class='ipsUploader__rowPreview' data-role='preview'> <label for='{{field_name}}_primary_screenshot_{{id}}' class='i-cursor_pointer'> {{#thumb}} {{{thumb}}} {{/thumb}} <div class='ipsUploader__rowPreview__generic' {{#thumb}}style='display: none'{{/thumb}}> <i class='fa-solid fa-{{extIcon}}'></i> </div> </label> </div> <div class='ipsUploader_rowMeta'> <h2 class='ipsUploader_rowTitle' data-role='title'>{{title}}</h2> <p class='ipsUploader_rowDesc'> {{size}} {{#statusText}}&middot; <span class='i-color_soft' data-role='status'>{{statusText}}</span>{{/statusText}} </p> {{#status}}<meter class='ipsMeter' data-role='progressbar' max='100'></meter>{{/status}} </div> <span data-role='insert' {{#insertable}}style='display: none'{{/insertable}}> <a href='#' class='ipsAttach_selection' data-ipsTooltip title='{{#lang}}insertIntoPost{{/lang}}'> <i class='fa-solid fa-plus'></i> </a> </span> {{#supportsDelete}} <div data-role='deleteFileWrapper' {{#newUpload}}style='display: none'{{/newUpload}}> <input type='hidden' name='{{field_name}}_keep[{{id}}]' value='1'> <a href='#' data-role='deleteFile' class='ipsUploader__rowDelete' data-ipsTooltip title='{{#lang}}attachRemove{{/lang}}'> &times; </a> </div> {{/supportsDelete}} {{^supportsDelete}} <div data-role='deleteFileWrapper' style='display: none'> <input type='hidden' name='{{field_name}}_keep[{{id}}]' value='1'> <a href='#' class='ipsUploader__rowDelete' data-role='deleteFile' data-ipsTooltip title='{{#lang}}attachRemove{{/lang}}'>&times;</a> </div> {{/supportsDelete}} <label for='{{field_name}}_primary_screenshot_{{id}}' class='cDownloadsPrimaryRadio' data-ipsTooltip title='{{#lang}}makePrimaryScreenshot{{/lang}}'> <input type='radio' name='{{field_name}}_primary_screenshot' id='{{field_name}}_primary_screenshot_{{id}}' value='{{id}}' {{#default}}checked{{/default}} class='ipsInput ipsInput--toggle'> {{#lang}}makePrimary{{/lang}} </label> </div>");ips.templates.set('downloads.submit.screenshotWrapper'," <div class='ipsUploader__container ipsUploader__container--images'>{{{content}}}</div>");ips.templates.set('downloads.submit.linkedScreenshot'," <li class='i-flex i-gap_2 cDownloadsLinkedScreenshotItem'> <input class='ipsInput i-flex_00 i-align-self_center' type='radio' name='screenshots_primary_screenshot' value='{{id}}' title='{{#lang}}makePrimaryScreenshot{{/lang}}' data-ipsTooltip {{extra}}> <input class='ipsInput i-flex_11' type='url' name='{{name}}[{{id}}]' value='{{value}}'> <button class='ipsButton ipsButton--text i-flex_00' type='button' data-action='removeField' title='{{#lang}}removeScreenshot{{/lang}}' data-ipsTooltip><i class='fa-solid fa-xmark'></i></button> </li>");;
;(function($,_,undefined){"use strict";ips.controller.register('downloads.front.submit.linkedScreenshots',{initialize:function(){this.on('click','[data-action="addField"]',this.addFieldButton);this.on('click','[data-action="removeField"]',this.removeField);this.setup();},setup:function(){var initialValues=$.parseJSON($(this.scope).attr('data-initialValue'));if(initialValues==null){return;}
var i;for(i in initialValues.values){this.addField(i,initialValues.values[i],i==initialValues.default);}},addField:function(id,value,isDefault){$(this.scope).find('[data-role="fieldsArea"]').append(ips.templates.render('downloads.submit.linkedScreenshot',{'name':$(this.scope).attr('data-name'),'id':id,'value':value,'extra':isDefault?'checked':''}));},removeField:function(e){e.preventDefault();$(e.currentTarget).closest('li').remove();},addFieldButton:function(){this.addField('linked_'+new Date().getTime(),'',false);}});}(jQuery,_));;
var i;for(i in initialValues.values){this.addField(i,initialValues.values[i],i==initialValues.default);}},addField:function(id,value,isDefault){$(this.scope).find('[data-role="fieldsArea"]').append(ips.templates.render('downloads.submit.linkedScreenshot',{'name':$(this.scope).attr('data-name'),'id':id,'value':value,'extra':isDefault?'checked':''}));},removeField:function(e){$(e.currentTarget).closest('li').remove();},addFieldButton:function(){this.addField('linked_'+new Date().getTime(),'',false);}});}(jQuery,_));;
;(function($,_,undefined){"use strict";ips.controller.register('downloads.front.submit.main',{_progressbarTimeout:null,_requireScreenshots:false,_bulkUpload:false,_ui:{},_hiddenUploader:false,_overriddenUploader:false,_allowMultipleFiles:false,_newVersion:false,_uploadedCount:0,initialize:function(){this.on('uploadedCountChanged',this.uploadCounter);this.on('uploadProgress',this.uploadProgress);this.on('fileAdded',this.fileAdded);this.on('fileDeleted',this.fileDeleted);this.on('click','[data-action="confirmUrls"]',this.confirmURLs);this.on('click','[data-action="confirmImports"]',this.confirmImports);this.on('click','[data-action="confirmScreenshotUrls"]',this.confirmScreenshots);this.on('click','[data-action="uploadMore"]',this.uploadMore);this.setup();},setup:function(){var self=this;if(this.scope.attr('data-screenshotsReq')){this._requireScreenshots=true;}
if(this.scope.attr('data-bulkUpload')){this._bulkUpload=true;}
if(this.scope.attr('data-multipleFiles')){this._allowMultipleFiles=true;}
+11 -10
View File
@@ -139,14 +139,14 @@ ips.templates.set('tableOfContents.linkOptions',`\
<i class="fa-solid fa-plus"></i>
</button>
<span class="ipsTableOfContents__incrementOptions">
<button class="ipsButton ipsButton_link ipsButton--icon" data-ipstooltip title="{{#lang}}table_of_contents_decrement{{/lang}}" data-role="decrement" aria-label="{{#lang}}table_of_contents_decrement{{/lang}}" >
<button class="ipsButton ipsButton--text ipsButton--icon" data-ipstooltip title="{{#lang}}table_of_contents_decrement{{/lang}}" data-role="decrement" aria-label="{{#lang}}table_of_contents_decrement{{/lang}}" >
<i class="fa-solid fa-outdent"></i>
</button>
<button class="ipsButton ipsButton_link ipsButton--icon" data-ipstooltip title="{{#lang}}table_of_contents_increment{{/lang}}" data-role="increment" aria-label="{{#lang}}table_of_contents_increment{{/lang}}" >
<button class="ipsButton ipsButton--text ipsButton--icon" data-ipstooltip title="{{#lang}}table_of_contents_increment{{/lang}}" data-role="increment" aria-label="{{#lang}}table_of_contents_increment{{/lang}}" >
<i class="fa-solid fa-indent"></i>
</button>
</span>
<button class="ipsButton ipsButton_link ipsButton--icon ipsButton--negative" data-ipstooltip title="{{#lang}}table_of_contents_remove{{/lang}}" data-role="remove" aria-label="{{#lang}}table_of_contents_remove{{/lang}}" >
<button class="ipsButton ipsButton--text ipsButton--icon ipsButton--negative" data-ipstooltip title="{{#lang}}table_of_contents_remove{{/lang}}" data-role="remove" aria-label="{{#lang}}table_of_contents_remove{{/lang}}" >
<i class="fa-solid fa-times"></i>
</button>
{{/canEdit}}
@@ -503,7 +503,7 @@ const editorLocation=document.createElement('div')
editorLocation.dataset.role='reactRoot'
textArea.parentElement.insertBefore(editorLocation,textArea)
config.content=textArea.innerHTML
config.onUpdate=(editor)=>{const value=editor.getValue();textArea.innerHTML="";textArea.appendChild(document.createTextNode(value));}
config.onUpdate=(editor)=>{const value=editor.getValue();textArea.innerHTML="";textArea.appendChild(document.createTextNode(value));textArea.dispatchEvent(new CustomEvent('ips:codebox#update',{detail:{instance,elem:textArea},bubbles:true}));}
textArea.ipsHide()
let result=await ips.utils.tiptap.editorInstance(editorLocation,config);instance=result[0]
textArea.dispatchEvent(new CustomEvent('ips:codeboxAfterInit',{bubbles:true,cancelable:true,detail:{instance,config}}))
@@ -512,16 +512,17 @@ reactRoot=result[1]}
function destruct(){instance?.dispose()
reactRoot.unmount();}
return{instance,destruct,init}}}(jQuery,_));;
((($,_)=>{"use strict";ips.createModule('ips.ui._codehighlighting',function(){let timeout;let attempts=0;function inject(){clearTimeout(timeout);window.removeEventListener('load',inject);if(typeof ips.ui?.codehighlighting==='object'){return;}
if(!document?.body){if(attempts++<5){timeout=setTimeout(inject,100);Debug.log(`Attempting to load the codehighlighting module. Attempt: ${attempts}`);}else{Debug.warn(`Couldn't load the codehighlighting module after 5 attempts because document.body isn't present!`);}
((($,_)=>{"use strict";ips.createModule('ips.ui._codehighlighting',function(){const LOADER_RESOLVERS=new Set();const LOADER_REJECTS=new Set();let STATE='loading';document.addEventListener('ipsCodehighlightingLoaded',()=>{STATE='loaded';LOADER_RESOLVERS.forEach(resolve=>resolve());LOADER_RESOLVERS.clear();LOADER_REJECTS.clear();});let timeout;let attempts=0;function inject(){clearTimeout(timeout);window.removeEventListener('load',inject);if(typeof ips.ui?.codehighlighting==='object'){STATE='loaded';LOADER_REJECTS.clear();LOADER_RESOLVERS.forEach(resolve=>resolve());;LOADER_RESOLVERS.clear();return;}
if(!document?.body){if(attempts++<5){timeout=setTimeout(inject,100);Debug.log(`Attempting to load the codehighlighting module. Attempt: ${attempts}`);}else{STATE='error';LOADER_RESOLVERS.clear();LOADER_REJECTS.forEach(reject=>reject(new Error(`The codehighlighting module could not be loaded`)));LOADER_RESOLVERS.clear();Debug.warn(`Couldn't load the codehighlighting module after 5 attempts because document.body isn't present!`);}
return;}
const script=document.createElement('script')
document.body.appendChild(script)
script.src=ips.getSetting('baseURL').replace(/\/+$/,"")+"/applications/core/interface/static/codehighlighting/codehighlighting.js?antiCache="+encodeURIComponent(ips.getSetting('jsAntiCache'));}
try{if(!document?.body){throw new Error();}
inject();}catch(e){window.addEventListener('load',inject,{once:true});timeout=setTimeout(()=>{if(typeof ips.ui?.codehighlighting==="object"){return;}
inject();}catch(e){window.addEventListener('load',inject,{once:true});timeout=setTimeout(()=>{if(typeof ips.ui?.codehighlighting==="object"){STATE='loaded';LOADER_REJECTS.clear();LOADER_RESOLVERS.forEach(resolve=>resolve());LOADER_RESOLVERS.clear();return;}
Debug.warn(`The codehighlighting module was not appended to document.body because the window's \`load\` event didn't fire within 2 seconds after ips.ui._codehighlighting was initialized.`);inject()},2000);}
return{}})})(jQuery,_));
return{whenLoaded(){return new Promise((resolve,reject)=>{if(STATE==='loaded'){return resolve();}else if(STATE==='error'){return reject();}
LOADER_REJECTS.add(reject);LOADER_RESOLVERS.add(resolve);})}}})})(jQuery,_));
;(function($,_,undefined){"use strict";ips.createModule('ips.ui.contentItem',function(){var defaults={multiValues:true,unique:false,fieldTemplate:'core.contentItem.field',resultsTemplate:'core.contentItem.resultWrapper',resultItemTemplate:'core.contentItem.resultItem',itemTemplate:'core.contentItem.item',queryParam:'q',minAjaxLength:1};var respond=function(elem,options){if(!$(elem).data('_contentItem')){$(elem).data('_contentItem',contentItemObj(elem,_.defaults(options,defaults)));}},destruct=function(elem){var obj=getObj(elem);if(!_.isUndefined(obj)){obj.destruct();}},getObj=function(elem){elem=$(elem);if(elem.data('_contentItem')){return elem.data('_contentItem');}else if($('[name="'+elem.attr('name')+'_original'+'"]').length&&$('[name="'+elem.attr('name')+'_original'+'"]').data('_contentItem')){return $('[name="'+elem.attr('name')+'_original'+'"]').data('_contentItem');}
return undefined;};ips.ui.registerWidget('contentItem',ips.ui.contentItem,['resultsTemplate','resultItemTemplate','itemTemplate','queryParam','dataSource','maxItems','minAjaxLength']);return{respond:respond,destruct:destruct,getObj:getObj};});var contentItemObj=function(elem,options,e){var timer,blurTimer,lastValue='',originalTextField,valueField,hiddenValueField,itemListWrapper,textField,dataSource,elemID=$(elem).identify().attr('id'),wrapper,inputItem,resultsElem,disabled=false,required=false,tooltip=null,tooltipTimer=null;var init=function(){if($(elem).is('input[type="text"], input[type="search"]')){originalTextField=$(elem);}else{originalTextField=$(elem).find('input[type="text"], input[type="search"]').first();}
_buildWrapper();_getDataSource();originalTextField.removeAttr('list');_buildResultsList();if(originalTextField.is(':disabled')){disabled=true;}
@@ -772,7 +773,7 @@ if(!toInsert){return;}
instance.chain().insertContent(toInsert+"<p></p>",{parseOptions:{preserveWhitespace:false}}).focus().run();};if(minimized){unminimize(function(){try{instance.chain().setContent('').run();elem.find('[data-role="autoSaveRestoreMessage"]').hide();}catch(err){}
_doInsert();});}else{_doInsert();}}
function insertHtml(html){instance.chain().insertContent(html,{parseOptions:{preserveWhitespace:false}}).focus().run();}
function reset(){instance.chain().setContent(originalContent||'<p></p>').clearAutosave().run();$(elem).find('[data-ipsUploader]').trigger('resetUploader');if(options.minimized&&options.minimizeAfterReset){minimize();}
function reset(){instance.chain().setContent(originalContent||'<p></p>',{emitUpdate:true}).clearAutosave().run();$(elem).find('[data-ipsUploader]').trigger('resetUploader');if(options.minimized&&options.minimizeAfterReset){minimize();}
clearTextarea();}
function saveAndClearAutosave(){if(instance){instance?.commands.clearAutoSave?.()}else{ips.utils.db.remove('editorSave',options.autoSaveKey);}}
function _belongsToThisEditor(data){return data.editorID!==undefined&&data.editorID===name;}
@@ -2061,7 +2062,7 @@ return{type:'inside',range:range};};var getSelection=function(){return(window.ge
var current=child;while(current){if(current===parent){return true;}
current=current.parentNode;}
return false;};return{getSelectedText:getSelectedText,getSelection:getSelection,getRange:getRange,getCommonAncestor:getCommonAncestor};});}(jQuery,_));;
(function($,_,undefined){"use strict";ips.createModule("ips.utils.serviceWorker",function(){const SERVICE_WORKER_URL=ips.getSetting("baseURL")+"index.php?app=core&module=system&controller=serviceworker&v="+ips.getSetting("jsAntiCache");const supported="serviceWorker"in navigator;const registerServiceWorker=(type,loggedIn)=>{return navigator.serviceWorker.register(`${SERVICE_WORKER_URL}&type=${type}&loggedIn=${JSON.stringify(loggedIn)}`).then((registration)=>{Debug.log("ServiceWorker registration successful with scope: ",registration.scope);return registration;}).catch((err)=>{Debug.log("ServiceWorker registration failed: ",err);});};const getRegistration=()=>{return navigator.serviceWorker.ready;};return{registerServiceWorker,supported,getRegistration,};});})(jQuery,_);;
(function($,_,undefined){"use strict";ips.createModule("ips.utils.serviceWorker",function(){const SERVICE_WORKER_URL=ips.getSetting("baseURL")+"index.php?app=core&module=system&controller=serviceworker&v="+ips.getSetting("jsAntiCache");const supported="serviceWorker"in navigator;const registerServiceWorker=(type)=>{return navigator.serviceWorker.register(`${SERVICE_WORKER_URL}&type=${type}`).then((registration)=>{Debug.log("ServiceWorker registration successful with scope: ",registration.scope);return registration;}).catch((err)=>{Debug.log("ServiceWorker registration failed: ",err);});};const getRegistration=()=>{return navigator.serviceWorker.ready;};return{registerServiceWorker,supported,getRegistration,};});})(jQuery,_);;
(function($,_){"use strict";ips.createModule("ips.utils.sockets",function(){let socketIo;let pingInterval;let refreshToken;let refreshInterval;let refreshTokenUsed=false;let connected=false;function init(){if(!enabled()){return;}
ips.loader.get([`${ips.getSetting('socketUrl')}/socket.io/socket.io.min.js`]).then(function(){initializeSocketIo();});}
function enabled(){let res=!!(ips.getSetting('memberID')&&ips.getSetting('socketEnabled')&&ips.getSetting('page_token'));return res;}
+3 -3
View File
@@ -29,8 +29,8 @@ try{const pmData=typeof e.originalEvent.data==='string'?JSON.parse(e.originalEve
this._stopReadyTimeout();this[method]?.call(this,pmData);}catch(err){Debug.error(err.message);}},_postMessage(method,obj){Debug.log("Posting to iframe "+this._embedId);this._iframe.postMessage(JSON.stringify(_.extend(obj||{},{method:method,embedId:this._embedId})),this._origin);},_getBorderAdjustment(){this._border.vertical=parseInt(this.scope.css('border-top-width'))+parseInt(this.scope.css('border-bottom-width'));this._border.horizontal=parseInt(this.scope.css('border-left-width'))+parseInt(this.scope.css('border-right-width'));},breakpointChange(e,data){this._postMessage('responsiveState',{currentIs:data.curBreakName});},dialog(data){var options=ips.ui.getAcceptedOptions('dialog');var dialogOptions={};_.each(options,function(opt){if(!_.isUndefined(data.options['data-ipsdialog-'+opt.toLowerCase()])){dialogOptions[opt]=data.options['data-ipsdialog-'+opt.toLowerCase()];}});if(_.isUndefined(dialogOptions['url'])){dialogOptions['url']=data.url;}
var dialogRef=ips.ui.dialog.create(dialogOptions);dialogRef.show();},height(data){if(this._lastDims.height!==data.height){this.scope.css({height:parseInt(data.height)+this._border.vertical+'px'});this._postMessage('setDimensions',{height:parseInt(data.height)});this._lastDims.height=data.height;}},dims(data){if(parseInt(this._lastDims.height)!==parseInt(data.height)||this._lastDims.width!==data.width){this.scope.css({height:parseInt(data.height)+this._border.vertical+'px',maxWidth:(data.width.toString().indexOf('%')==-1)?parseInt(data.width)+this._border.horizontal+'px':'100%'});this._lastDims.height=data.height;this._lastDims.width=data.width;}},ok(){this._stopReadyTimeout();this.scope.addClass('ipsEmbed_finishedLoading');this._postMessage('responsiveState',{currentIs:ips.utils.responsive.getCurrentKey()});}});}(jQuery,_));;
;(function(){"use strict";ips.controller.register('core.front.core.colorScheme',{initialize(){this.menu=this.scope[0];this.on(this.menu,'click',this.changeColorScheme);if(!this.menu.querySelector("[aria-current")){this.schemePref=ips.utils.cookie.get('scheme_preference')||document.documentElement.dataset.ipsSchemeDefault;document.querySelectorAll('[data-ips-prefers-color-scheme='+this.schemePref+']').forEach(el=>el.setAttribute('aria-current','true'));}},changeColorScheme(ev){let el=ev.target.closest('[data-controller="core.front.core.colorScheme"] [data-ips-prefers-color-scheme]');if(!el)return;document.dispatchEvent(new CustomEvent("ips:colorScheme",{bubbles:true,detail:{scheme:el.dataset.ipsPrefersColorScheme}}));if(ips.utils.broadcastChannel.enabled){ips.utils.broadcastChannel.channel.postMessage({command:'colorScheme',value:el.dataset.ipsPrefersColorScheme});}}});}());;
;(function($,_,undefined){"use strict";ips.controller.register('core.front.core.comment',{_quoteData:null,_commentContents:'',_quotingDisabled:false,_quoteTimeout:null,_isEditing:false,_clickHandler:null,_observer:null,initialize:function(){for(const link of this.scope.find('[data-ipsMenu]')){const menuSelector=$(link).attr('href');for(const action of['editComment','cancelEditComment','deleteComment','approveComment']){this.on(document,'click',`${menuSelector} [data-action="${action}"]`,this[action]);}}
for(const action of['quoteComment','multiQuoteComment','rateReview']){this.on('click',`[data-action="${action}"]`,this[action]);}
;(function($,_,undefined){"use strict";ips.controller.register('core.front.core.comment',{_quoteData:null,_commentContents:'',_quotingDisabled:false,_quoteTimeout:null,_isEditing:false,_clickHandler:null,_observer:null,initialize:function(){for(const link of this.scope.find('[data-ipsMenu]')){const menuSelector=$(link).attr('href');for(const action of['editComment','deleteComment','approveComment']){this.on(document,'click',`${menuSelector} [data-action="${action}"]`,this[action]);}}
for(const action of['quoteComment','multiQuoteComment','rateReview','cancelEditComment']){this.on('click',`[data-action="${action}"]`,this[action]);}
this.on('submit','form',this.submitEdit);this.on('change','input[type="checkbox"][data-role="moderation"]',this.commentCheckbox);this.elem.addEventListener('ipsCalcQuote',()=>this.inlineQuote())
this.on('click','[data-action="quoteSelection"]',this.quoteSelection);this.on('submitDialog','[data-action="recommendComment"]',this.recommendComment);this.on('click','[data-action="unrecommendComment"]',this.unrecommendComment);this.on('tabChanged',this.tabChanged);this.on('setMultiQuoteEnabled.comment setMultiQuoteDisabled.comment',this.setMultiQuote);this.on('disableQuoting.comment',this.disableQuoting);this.on(document,'getEditFormLoading.comment saveEditCommentLoading.comment '+
'deleteCommentLoading.comment',this.commentLoading);this.on(document,'getEditFormDone.comment saveEditCommentDone.comment '+
@@ -243,7 +243,7 @@ self._getIcon((type==='message')?'inbox':'notify').click();}});}
return notifyData;},_showNotification(notifyData,type){if(!document[ips.utils.events.getVisibilityProp()]){this._showFlashMessage(notifyData,type);}},_showFlashMessage(notifyData,type){let html='';const self=this;if(notifyData.count===1){notifyData=_.extend(notifyData,{text:ips.getString(type+'FlashSingle')});html=ips.templates.render('core.notification.flashSingle',notifyData);}else{notifyData=_.extend(notifyData,{text:ips.pluralize(ips.getString(type+'FlashMultiple'),[notifyData.count])});html=ips.templates.render('core.notification.flashMultiple',notifyData);}
if($('#elFlashMessage').is(':visible')&&$('#elFlashMessage').find('[data-role="newNotification"]').length){$('#elFlashMessage').find('[data-role="newNotification"]').replaceWith(html);}else{ips.ui.flashMsg.show(html,{timeout:8,position:'bottom',extraClasses:'cNotificationFlash',dismissable:function(){self._stopPolling();},escape:false});}},_updateTimestamp(){let storage=ips.utils.db.get('notifications',ips.getSetting('baseURL'));storage=_.extend(storage,{timestamp:ips.utils.time.timestamp()});ips.utils.db.set('notifications',ips.getSetting('baseURL'),storage);},_updateIcons(newData,oldData){const reportBadge=this.scope.find('[data-notificationType="reports"]');const reportCount=reportBadge.length?parseInt(reportBadge.text()):0;const notifyData={notifications:parseInt(newData.notifications),reports:reportCount};if(parseInt(newData.notifications)!==oldData.notifications){this._updateIcon('notify',newData.notifications);this.scope.trigger('clearUserbarCache',{type:'notify'});}
if(this._messagesEnabled){if(parseInt(newData.messages)!==oldData.messages){this._updateIcon('inbox',newData.messages);this.scope.trigger('clearUserbarCache',{type:'inbox'});}
notifyData.messages=parseInt(newData.messages);}},_updateIcon(type,count){const icon=this._getIcon(type);icon.attr('data-currentCount',count).text(count);if(parseInt(count)){ips.utils.anim.go((!icon.is(':visible'))?'zoomIn':'pulseOnce',icon.removeClass('ipsHide'));}else{icon.fadeOut();}},_getIcon(type){return $('body').find('[data-notificationType="'+type+'"]');},_getCurrentCounts(){const messages=this.scope.find('[data-notificationType="inbox"]');const notifications=this.scope.find('[data-notificationType="notify"]');return{notifications:parseInt(notifications.attr('data-currentCount')),messages:(messages.length)?parseInt(messages.attr('data-currentCount')):null};},_stopPolling(){Debug.info("Stopping instant notification polling");clearInterval(this._interval);this._paused=true;}});}(jQuery,_));;
notifyData.messages=parseInt(newData.messages);}},_updateIcon(type,count){const icon=this._getIcon(type);icon.attr('data-currentCount',count).text(count);if(parseInt(count)){ips.utils.anim.go((!icon.is(':visible'))?'zoomIn':'pulseOnce',$(icon).each(function(){this.ipsShow()}));}else{icon.fadeOut();}},_getIcon(type){return $('body').find('[data-notificationType="'+type+'"]');},_getCurrentCounts(){const messages=this.scope.find('[data-notificationType="inbox"]');const notifications=this.scope.find('[data-notificationType="notify"]');return{notifications:parseInt(notifications.attr('data-currentCount')),messages:(messages.length)?parseInt(messages.attr('data-currentCount')):null};},_stopPolling(){Debug.info("Stopping instant notification polling");clearInterval(this._interval);this._paused=true;}});}(jQuery,_));;
;(function($,_,undefined){"use strict";const IMAGE_EXTENSIONS=new Set(['gif','jpeg','jpe','jpg','png','svg','webp','avif'])
ips.controller.register('core.front.core.lightboxedImages',{_random:null,initialize:function(){var self=this;this.on('initializeImages',this.refreshContent);this.on('refreshContent',this.refreshContent);this.on(document,'imageRotated',function(e,data){var attachment=$(self.scope).find('.ipsAttachLink_image img[data-fileId='+data.fileId+']');self._updateAttachmentImage(attachment,data);});this.setup();},setup:function(){this._random='g'+(Math.round(Math.random()*100000));this._initializeAttachments();this._initializeImages();},refreshContent:function(e){Debug.log("Refreshing content in lightboxedImages");this.scope.removeAttr('data-loaded');this._initializeAttachments();this._initializeImages();e.stopPropagation();},_initializeAttachments:function(){var fileIDsToFetch={};var self=this;var attachments=this.scope.find('[data-fileid]').not(function(idx,elem){var elem=$(elem);return elem.is('source, video')||elem.find('source, video').length;});if(!attachments.length){return;}
attachments.each(function(){var attachment=$(this);if(!_.isUndefined(attachment.attr('data-loaded'))){return;}
+32 -7
View File
@@ -9,10 +9,29 @@ return Debug;},setEnabled=function(enabled){options.enabled=(enabled===false)?fa
return Debug;},addAdapter=function(adapter){if(_.isObject(adapter)){options.adapters.push(adapter);}
return Debug;},clearAdapters=function(){options.adapters=[];return Debug;};return{debug:debug,log:debug,info:info,warn:warn,error:error,setEnabled:setEnabled,setLevel:setLevel,addAdapter:addAdapter,clearAdapters:clearAdapters,isEnabled:isEnabled};}();var Console=function(){};Console.prototype.write=function(level,msg){if(window.console){switch(level){case 1:if(_.isObject(msg)){console.dir(msg);}else{console.log(msg);}
break;case 2:console.info(msg);break;case 3:console.warn(msg);break;case 4:console.error(msg);break;}}};Debug.addAdapter(new Console);if(ipsDebug||(!_.isUndefined(window.localStorage)&&'localStorage'in window&&window['localStorage']!==null&&window.localStorage.getItem('DEBUG'))){Debug.setEnabled(true).setLevel('DEBUG').info("Enabled logging");}}(jQuery,_));;
var ips=ips||{};jQuery.migrateMute=true;(function($,_,undefined){"use strict";let logTimeIndent=0;ips=(function(){var _settings,_strings={},_graphData={},uid=1,urand=Math.ceil(Math.random()*10000),elemContainer,_location='front';var boot=function(config){_settings=config;_setAjaxConfig();$.fn.animationComplete=function(callback){return $(this).one('webkitAnimationEnd animationend',function(e){if(e.target==this){callback.apply(this);}});};$.fn.identify=function(){return this.each(function(){if(!this.id){this.id='ips_uid_'+urand+'_'+(++uid);}});};var oldProp=$.fn.prop;var newProp=function(){var retFunc=oldProp.apply(this,arguments);this.trigger('propChanged',this);return retFunc;};$.fn.prop=newProp;Function.prototype.method=function(name,func){this.prototype[name]=func;return this;};_.templateSettings={interpolate:/\{\{(.+?)\}\}/g
var ips=ips||{};jQuery.migrateMute=true;(function($,_,undefined){class CustomSubmitEvent extends Event{submitter=undefined;originalEvent=undefined;constructor(originalEvent){super('submit',{bubbles:true});this.submitter=originalEvent.submitter;this.originalEvent=originalEvent;}}
"use strict";let logTimeIndent=0;ips=(function(){var _settings,_strings={},_graphData={},uid=1,urand=Math.ceil(Math.random()*10000),elemContainer,_location='front';var boot=function(config){_settings=config;_setAjaxConfig();_setAjaxEventListeners();document.addEventListener('submit',e=>{const form=e.target;if(e instanceof SubmitEvent&&form instanceof HTMLFormElement&&form.method.toUpperCase()==='POST'&&!getSetting('memberID')&&getCsrfKeyExpiry()<Date.now()/1000){Debug.log(`Intercepted form submission... fetching fresh CSRF key`);e.preventDefault();e.stopPropagation();e.stopImmediatePropagation();getFreshCsrfKey().then(()=>{Debug.log(`Got a new CSRF key, resuming the form submission`);let submitButton=(e instanceof SubmitEvent||e.submitter instanceof Element)?e.submitter:form.querySelector('button[type="submit"], button:not([type]), input[type="submit"]');if(submitButton){submitButton.click();}else{const ev=new CustomSubmitEvent(e);form.dispatchEvent(ev);if(ev.defaultPrevented){return;}
form.submit();}});}},{capture:true});$.fn.animationComplete=function(callback){return $(this).one('webkitAnimationEnd animationend',function(e){if(e.target==this){callback.apply(this);}});};$.fn.identify=function(){return this.each(function(){if(!this.id){this.id='ips_uid_'+urand+'_'+(++uid);}});};var oldProp=$.fn.prop;var newProp=function(){var retFunc=oldProp.apply(this,arguments);this.trigger('propChanged',this);return retFunc;};$.fn.prop=newProp;Function.prototype.method=function(name,func){this.prototype[name]=func;return this;};_.templateSettings={interpolate:/\{\{(.+?)\}\}/g
};if(!Debug.isEnabled()&&window.console){window.console.log("%cThis is a browser feature intended for developers. Do not paste any code here given to you by someone else. It may compromise your account or have other negative side effects.","font-weight: bold; font-size: 14px;");}
$(document).trigger('doneBooting').ready(function(){_location=$('body').attr('data-pageLocation')||'front';});},getAjax=function(){if(getSetting('mock_ajax')){return getSetting('mock_ajax');}
return $.ajax;},fetch=function(url,settings={}){return new Promise((resolve,reject)=>{const options={};if(typeof settings==='object'){Object.assign(options,settings)}else if(settings){return resolve(new TypeError(`Could not generate an ajax request because the settings is supposed to be of type object. Got a(n) ${typeof settings}`));}
$(document).trigger('doneBooting').ready(function(){_location=$('body').attr('data-pageLocation')||'front';});},getAjax=function(){const wrap=method=>(...args)=>{let options={},url;if(typeof args[0]==='string'){url=args[0];options=args[1]||{};}else if(typeof args[0]==='object'&&args[0]){options=args[0];}
if((options.method||options.type)?.toLowerCase()!=='post'||getSetting('memberID')||getCsrfKeyExpiry()>=Date.now()/1000){return method(...args);}
let requestInstance;const decoratorQueues={};const properties={};let thenResolve,thenReject,mimeTypeOverride;const uploadEventListeners=new Map();const uploadDispatchedEvents=[];const proxyXHRObject={_promise:new Promise((resolve,reject)=>{thenResolve=resolve;thenReject=reject}),then(cb){this._promise.then(cb);},catch(...args){this._promise.catch(...args)},finally(...args){this._promise.finally(...args);},_aborted:false,get aborted(){return this._aborted;},_abortedStatusText:undefined,get abortedStatusText(){return this._abortedStatusText;},abort(statusText){this._aborted=true;this._abortedStatusText=statusText;requestInstance?.abort(statusText);},getAllResponseHeaders(){return requestInstance?.getAllResponseHeaders()||null;},getResponseHeader(header){return requestInstance?.getResponseHeader(header)||null;},overrideMimeType(mimeType){if(requestInstance){requestInstance.overrideMimeType(mimeType);return;}
mimeTypeOverride=mimeType;},get readyState(){return requestInstance?requestInstance.readyState:0;},get response(){return requestInstance?('response'in requestInstance?requestInstance.response:null):null;},get responseText(){if(typeof requestInstance?.responseText==='string'){return requestInstance.responseText;}
return"";},get responseType(){if(typeof requestInstance?.responseType==='string'){return requestInstance.responseType;}
return"";},get responseURL(){return requestInstance?requestInstance.responseURL:(url||options.url||window.location.href);},get responseXML(){return requestInstance?requestInstance.responseXML:null;},get status(){return requestInstance?requestInstance.status:0;},get statusText(){return requestInstance?requestInstance.statusText:"";},get timeout(){return properties.timeout||0;},set timeout(val){properties.timeout=val;if(requestInstance){requestInstance.timeout=val;}},get withCredentials(){return!!(requestInstance?requestInstance.withCredentials:properties.withCredentials);},set withCredentials(val){val=!!val;properties.withCredentials=val;if(requestInstance){requestInstance.withCredentials=val;}},_upload:{_getEventCollection(event,options){const path=[event,(options&&options.capture)?"true":"false"];let collection=uploadEventListeners;for(let i=0;i<path.length;i++){const cmp=path[i];collection.set(cmp,collection.get(cmp)||new Map());collection=collection.get(cmp);}
return collection;},addEventListener(event,cb,options={}){requestInstance?.upload?.addEventListener?.(event,cb,options);this._getEventCollection(event,options).set(cb,{options,event});},removeEventListener(event,cb,options={}){requestInstance?.upload?.removeEventListener?.(event,cb,options);this._getEventCollection(event,options).delete(cb);},dispatchEvent(...args){if(requestInstance?.upload?.dispatchEvent instanceof Function){requestInstance.upload.dispatchEvent(...args);return;}
uploadDispatchedEvents.push(args);},set onabort(cb){this.addEventListener('abort',cb);},set onerror(cb){this.addEventListener('error',cb);},set onload(cb){this.addEventListener('load',cb);},set onloadend(cb){this.addEventListener('loadend',cb);},set onloadstart(cb){this.addEventListener('loadstart',cb);},set onprogress(cb){this.addEventListener('progress',cb);},set ontimeout(cb){this.addEventListener('timeout',cb);}},get upload(){return requestInstance?requestInstance.upload:this._upload;}}
for(const chainableMethod of['done','always','fail','success','error','complete']){proxyXHRObject[chainableMethod]=(function(...args){decoratorQueues[chainableMethod]=decoratorQueues[chainableMethod]||[];decoratorQueues[chainableMethod].push(args);requestInstance?.[chainableMethod]?.(...args);return this;}).bind(proxyXHRObject);}
for(const simpleMethod of['getAllResponseHeaders','getResponseHeader']){proxyXHRObject[simpleMethod]=(function(...args){return requestInstance?.[simpleMethod]?.(...args);}).bind(proxyXHRObject);}
getFreshCsrfKey().then(()=>{Debug.log(`Intercepted Fetch request and get fresh CSRF Key`);requestInstance=method(url,options);if(requestInstance.upload){if(Object.keys(uploadEventListeners).length){function evalCollection(collection){for(const[key,childCollection]of collection.entries()){if(key instanceof Function){requestInstance.upload.addEventListener(childCollection.event,key,childCollection.options);}else{evalCollection(childCollection);}}}
evalCollection(uploadEventListeners);}
for(const args of uploadDispatchedEvents){requestInstance.upload.dispatchEvent(...args);}}
if(mimeTypeOverride){requestInstance.overrideMimeType(mimeTypeOverride);}
for(const queue in decoratorQueues){requestInstance[queue](...decoratorQueues[queue]);}
for(const property in properties){requestInstance[property]=properties[property];}
requestInstance.then((...result)=>{thenResolve(...result);}).catch(err=>{thenReject(err);});if(proxyXHRObject.aborted){proxyXHRObject.abortedStatusText?requestInstance.abort(proxyXHRObject.abortedStatusText):requestInstance.abort();}});return proxyXHRObject;}
if(getSetting('mock_ajax')){return wrap(getSetting('mock_ajax'));}
return wrap($.ajax);},fetch=function(url,settings={}){return new Promise((resolve,reject)=>{const options={};if(typeof settings==='object'){Object.assign(options,settings)}else if(settings){return resolve(new TypeError(`Could not generate an ajax request because the settings is supposed to be of type object. Got a(n) ${typeof settings}`));}
if(typeof url==='string'){options.url=url;}else if(typeof url==='object'){Object.assign(options,url)}else{return reject(new TypeError(`Could not generate an ajax request because url is supposed to be a string or an object. Got a ${typeof url}`));}
options.async=true
delete options.error
@@ -32,7 +51,10 @@ delete options.traditional
delete options.xhr
delete options.xhrFields
if(options.type&&!options.method){options.method=options.type;delete options.type;}
getAjax()(options).done(resolve).fail(reject)})},getContainer=function(){var tryThis=$(getSetting('container'));return(tryThis.length)?tryThis:$('body');},_setAjaxConfig=function(){var data={csrfKey:ips.getSetting('csrfKey')};$.ajaxSetup({data:data,cache:true});var count=0;$(document).ajaxSend(function(event,request,settings){if(!_.isUndefined(settings)&&settings.showLoading===true){if(!$('#elAjaxLoading').length){getContainer().append(templates.render('core.general.ajax'));}
getAjax()(options).done(resolve).fail(reject)})},getContainer=function(){var tryThis=$(getSetting('container'));return(tryThis.length)?tryThis:$('body');},_refreshCsrfKey=async function(){setSetting('csrfKeyExpiry',Math.floor(Date.now()/1000+20));try{const response=await window.fetch(getSetting('baseURL').toString().replace(/\/+$/,'')+'/?app=core&module=system&controller=ajax&do=getCsrfKey&path='+window.location.pathname);const data=await response.json();Debug.log(`Got new CSRF Key: ${data.key}`);setSetting('csrfKey',data.key);setSetting('csrfKeyExpiry',typeof data.expiry==="number"?data.expiry:Math.floor(Date.now()/1000+500));_setAjaxConfig();document.querySelectorAll(`form input[name="csrfKey"]`).forEach(input=>{input.value=data.key;});document.querySelectorAll(`form:is([action*="?csrfKey="],[action*="&csrfKey="])`).forEach(form=>{const url=new URL(form.action);if((url.toString().startsWith('https:'+ips.getSetting('baseURL'))||url.toString().startsWith('http:'+ips.getSetting('baseURL')))&&(url.searchParams.has('csrfKey')||form.method.toLowerCase()!=='get')){url.searchParams.set('csrfKey',data.key);form.action=url.toString();}});document.querySelectorAll(`[href*="?csrfKey="], [href*="&csrfKey="]`).forEach(linkLikeEl=>{const url=new URL(linkLikeEl.href||linkLikeEl.getAttribute('href'));if((url.toString().startsWith('https:'+ips.getSetting('baseURL'))||url.toString().startsWith('http:'+ips.getSetting('baseURL')))&&url.searchParams.has('csrfKey')){url.searchParams.set('csrfKey',data.key);linkLikeEl.setAttribute('href',url.toString());}});document.dispatchEvent(new CustomEvent('ips:csrfKeyUpdated'));}catch(e){Debug.warn(e);}},getCsrfKeyExpiry=function(){const setting=getSetting('csrfKeyExpiry');if(typeof setting==="number"&&!Number.isNaN(setting)&&getSetting('csrfKey')){return setting;}
return 0;},getFreshCsrfKey=async function(){if(getSetting('memberID')&&getSetting('csrfKey')){return getSetting('csrfKey');}
if(Date.now()/1000>=getCsrfKeyExpiry()){await _refreshCsrfKey();}
return getSetting('csrfKey');},_setAjaxConfig=function(){var data={csrfKey:getSetting('csrfKey')};$.ajaxSetup({data:data,cache:true});},_setAjaxEventListeners=function(){var count=0;$(document).ajaxSend(function(event,request,settings){if(!_.isUndefined(settings)&&settings.showLoading===true){if(!$('#elAjaxLoading').length){getContainer().append(templates.render('core.general.ajax'));}
count++;ips.utils.anim.go('fadeIn fast',$('#elAjaxLoading'));}}).ajaxComplete(function(event,request,settings){if(!_.isUndefined(settings)&&settings.showLoading===true){count--;if(count===0){ips.utils.anim.go('fadeOut fast',$('#elAjaxLoading'));}}
if(!_.isUndefined(settings)&&!settings.bypassRedirect){var responseJson=null;if(!_.isUndefined(request.responseJSON)&&!_.isUndefined(request.responseJSON.redirect)){responseJson=request.responseJSON;}
else if(!_.isUndefined(request.responseText)){try
@@ -63,11 +85,14 @@ for(const group of['ui','utils']){for(const module in window.ips[group]){if(wind
e.cleanupTarget=elem
Debug.error(e)}}}}})
$(document).trigger('contentCleanup',[elem])}
return{boot,createModule,getSetting,getAllSettings,setSetting,getGraphQlData,setGraphQlData,getAjax,fetch,getContainer,setString,haveString,getString,pluralize,getLocation,templates,testConsole,cleanContentsOf,uid(){return`${Math.round(Math.random() * Math.pow(16, 5)).toString(16)}-${Math.round(Math.random() * Math.pow(16, 5)).toString(16)}-${Math.round(Math.random() * Math.pow(16, 5)).toString(16)}-${Math.round(Math.random() * Math.pow(16, 5)).toString(16)}`},logTime(cb,message="Done timing code",{threshold=0}={}){const stack=(new Error()).stack;const lastLine=stack.split('\n').slice(0,3).pop().trim().replace(/^at\s*/,'');logTimeIndent++;let start=Date.now();const res=cb();const end=Date.now();if(message instanceof Function){try{message=message(end-start);}catch(e){e.message="\t".repeat(Math.max(0,logTimeIndent-1))+e.message;Debug.warn(e);message="Done timing code, but a message generator failed";}}
return{boot,createModule,getSetting,getAllSettings,setSetting,getGraphQlData,setGraphQlData,getAjax,fetch,getContainer,setString,haveString,getString,pluralize,getLocation,templates,testConsole,cleanContentsOf,uid(){return`${Math.round(Math.random() * Math.pow(16, 5)).toString(16)}-${Math.round(Math.random() * Math.pow(16, 5)).toString(16)}-${Math.round(Math.random() * Math.pow(16, 5)).toString(16)}-${Math.round(Math.random() * Math.pow(16, 5)).toString(16)}`},logTime(cb,message="Done timing code",{threshold=0}={}){const stack=(new Error()).stack;const lastLine=stack.split('\n').slice(0,3).pop().trim().replace(/^at\s*/,'');logTimeIndent++;const now=window.performance.now instanceof Function?()=>window.performance.now():Date.now;const start=now();const doneExecuting=()=>{const end=now();if(message instanceof Function){try{message=message(end-start);}catch(e){e.message="\t".repeat(Math.max(0,logTimeIndent-1))+e.message;Debug.warn(e);message="Done timing code, but a message generator failed";}}
if((end-start>=threshold)&&Debug.isEnabled()){if(typeof message==="string"){console.log(`${"\t".repeat(Math.max(0, logTimeIndent - 1))}${end - start}ms: ${message}\n${"\t".repeat(Math.max(1, logTimeIndent))}${lastLine}`);}else{console.log(`${"\t".repeat(Math.max(0, logTimeIndent - 1))}${end - start}ms: `,message,`\n${"\t".repeat(Math.max(1, logTimeIndent))}${lastLine}`);}}
logTimeIndent--;return res;}};}());ips.boot(ipsSettings);}(jQuery,_));!function(){var lastBtn=null
logTimeIndent--;}
const res=cb();if(res instanceof Promise){return res.then((result)=>{doneExecuting();return result;})}
doneExecuting();return res;}};}());ips.boot(ipsSettings);}(jQuery,_));!function(){var lastBtn=null
document.addEventListener('click',function(e){if(!e.target.closest)return;lastBtn=e.target.closest('button, input[type=submit]');},true);document.addEventListener('submit',function(e){if('submitter'in e)return;var canditates=[document.activeElement,lastBtn];lastBtn=null;for(var i=0;i<canditates.length;i++){var candidate=canditates[i];if(!candidate)continue;if(!candidate.form)continue;if(!candidate.matches('button, input[type=button], input[type=image]'))continue;e.submitter=candidate;return;}
e.submitter=e.target.querySelector('button, input[type=button], input[type=image]');},true);}();;
e.submitter=e.target.querySelector('button, input[type=button], input[type=image]');},true);}();if(navigator.standalone){document.addEventListener("scroll",iosPwaScrollFix,{passive:true});function iosPwaScrollFix(){if(window.scrollY===0){document.documentElement.scrollTop=0;}}
document.addEventListener("ips:toggleComplete",iosPwaOffcanvasFix);function iosPwaOffcanvasFix(e){if(e.target.matches('[data-ips-hidden-group="offcanvas"]')){document.documentElement.scrollTop+=0;};}};
!function(){"use strict";var t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};!function(e){function n(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=Object.create(t.prototype);for(var a in n)o[a]=n[a];return o.constructor=e,e.prototype=o,e}function o(t){t=t||{},this.defaultProtocol=t.defaultProtocol||h.defaultProtocol,this.events=t.events||h.events,this.format=t.format||h.format,this.formatHref=t.formatHref||h.formatHref,this.nl2br=t.nl2br||h.nl2br,this.tagName=t.tagName||h.tagName,this.target=t.target||h.target,this.validate=t.validate||h.validate,this.ignoreTags=[],this.attributes=t.attributes||t.linkAttributes||h.attributes,this.className=t.className||t.linkClass||h.className;for(var e=t.ignoreTags||h.ignoreTags,n=0;n<e.length;n++)this.ignoreTags.push(e[n].toUpperCase())}function a(t,e){for(var n=0;n<t.length;n++)if(t[n]===e)return!0;return!1}function r(t){return t}function i(t,e){return"url"===e?"_blank":null}function s(){return function(t){this.j=[],this.T=t||null}}function c(t,e,n,o){for(var a=0,r=t.length,i=e,s=[],c=void 0;a<r&&(c=i.next(t[a]));)i=c,a++;if(a>=r)return[];for(;a<r-1;)c=new m(o),s.push(c),i.on(t[a],c),i=c,a++;return c=new m(n),s.push(c),i.on(t[r-1],c),s}function l(){return function(t){t&&(this.v=t)}}function u(t){var e=t?{v:t}:{};return n(b,l(),e)}function p(t){return t instanceof v||t instanceof R}var h={defaultProtocol:"http",events:null,format:r,formatHref:r,nl2br:!1,tagName:"a",target:i,validate:!0,ignoreTags:[],attributes:null,className:"linkified"};o.prototype={resolve:function(t){var e=t.toHref(this.defaultProtocol);return{formatted:this.get("format",t.toString(),t),formattedHref:this.get("formatHref",e,t),tagName:this.get("tagName",e,t),className:this.get("className",e,t),target:this.get("target",e,t),events:this.getObject("events",e,t),attributes:this.getObject("attributes",e,t)}},check:function(t){return this.get("validate",t.toString(),t)},get:function(e,n,o){var a=this[e];if(!a)return a;switch("undefined"==typeof a?"undefined":t(a)){case"function":return a(n,o.type);case"object":var r=a[o.type]||h[e];return"function"==typeof r?r(n,o.type):r}return a},getObject:function(t,e,n){var o=this[t];return"function"==typeof o?o(e,n.type):o}};var g=Object.freeze({defaults:h,Options:o,contains:a}),f=s();f.prototype={defaultTransition:!1,on:function(t,e){if(t instanceof Array){for(var n=0;n<t.length;n++)this.j.push([t[n],e]);return this}return this.j.push([t,e]),this},next:function(t){for(var e=0;e<this.j.length;e++){var n=this.j[e],o=n[0],a=n[1];if(this.test(t,o))return a}return this.defaultTransition},accepts:function(){return!!this.T},test:function(t,e){return t===e},emit:function(){return this.T}};var m=n(f,s(),{test:function(t,e){return t===e||e instanceof RegExp&&e.test(t)}}),d=n(f,s(),{jump:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=this.next(new t(""));return n===this.defaultTransition?(n=new this.constructor(e),this.on(t,n)):e&&(n.T=e),n},test:function(t,e){return t instanceof e}}),b=l();b.prototype={toString:function(){return this.v+""}};var v=u(),y=u("@"),k=u(":"),w=u("."),j=u(),x=u(),z=u("\n"),O=u(),S=u("+"),N=u("#"),T=u(),A=u("mailto:"),L=u("?"),E=u("/"),C=u("_"),P=u(),R=u(),q=u(),H=u("{"),B=u("["),U=u("<"),M=u("("),D=u("}"),I=u("]"),K=u(">"),_=u(")"),G=u("&"),Y=Object.freeze({Base:b,DOMAIN:v,AT:y,COLON:k,DOT:w,PUNCTUATION:j,LOCALHOST:x,NL:z,NUM:O,PLUS:S,POUND:N,QUERY:L,PROTOCOL:T,MAILTO:A,SLASH:E,UNDERSCORE:C,SYM:P,TLD:R,WS:q,OPENBRACE:H,OPENBRACKET:B,OPENANGLEBRACKET:U,OPENPAREN:M,CLOSEBRACE:D,CLOSEBRACKET:I,CLOSEANGLEBRACKET:K,CLOSEPAREN:_,AMPERSAND:G}),Q="aaa|aarp|abb|abbott|abogado|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|af|afl|ag|agency|ai|aig|airforce|airtel|al|alibaba|alipay|allfinanz|alsace|am|amica|amsterdam|an|analytics|android|ao|apartments|app|apple|aq|aquarelle|ar|aramco|archi|army|arpa|arte|as|asia|associates|at|attorney|au|auction|audi|audio|author|auto|autos|avianca|aw|ax|axa|az|azure|ba|baidu|band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bb|bbc|bbva|bcg|bcn|bd|be|beats|beer|bentley|berlin|best|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|black|blackfriday|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bom|bond|boo|book|boots|bosch|bostik|bot|boutique|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|chase|chat|cheap|chloe|christmas|chrome|church|ci|cipriani|circle|cisco|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|cLine truncated
"use strict";!function(e,t,n){var i=function(t,n){function i(e,t,n){var i=n[n.length-1];e.replaceChild(i,t);for(var r=n.length-2;r>=0;r--)e.insertBefore(n[r],i),i=n[r]}function r(e,t,n){for(var i=[],r=e,a=Array.isArray(r),o=0,r=a?r:r[Symbol.iterator]();;){var l;if(a){if(o>=r.length)break;l=r[o++]}else{if(o=r.next(),o.done)break;l=o.value}var f=l;if("nl"===f.type&&t.nl2br)i.push(n.createElement("br"));else if(f.isLink&&t.check(f)){var s=t.resolve(f),c=s.formatted,u=s.formattedHref,d=s.tagName,m=s.className,y=s.target,h=s.events,k=s.attributes,v=n.createElement(d);if(v.setAttribute("href",u),m&&v.setAttribute("class",m),y&&v.setAttribute("target",y),k)for(var g in k)v.setAttribute(g,k[g]);if(h)for(var b in h)v.addEventListener?v.addEventListener(b,h[b]):v.attachEvent&&v.attachEvent("on"+b,h[b]);v.appendChild(n.createTextNode(c)),i.push(v)}else i.push(n.createTextNode(f.toString()))}return i}function a(e,t,n){if(!e||e.nodeType!==d)throw new Error("Cannot linkify "+e+" - Invalid DOM Node type");var o=t.ignoreTags;if("A"===e.tagName||s.contains(o,e.tagName))return e;for(var l=e.firstChild;l;){switch(l.nodeType){case d:a(l,t,n);break;case m:var c=l.nodeValue,y=f(c);if(0===y.length||1===y.length&&y[0]instanceof u)break;var h=r(y,t,n);i(e,l,h),l=h[h.length-1]}l=l.nextSibling}return e}function o(t,n){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];try{i=i||document||e&&e.document||global&&global.document}catch(r){}if(!i)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the third argument to linkifyElement.");return n=new c(n),a(t,n,i)}function l(t){function n(e){return e=o.normalize(e),this.each(function(){o.helper(this,e,i)})}var i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t.fn=t.fn||{};try{i=i||document||e&&e.document||global&&global.document}catch(r){}if(!i)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the second argument to linkify/jquery");"function"!=typeof t.fn.linkify&&(t.fn.linkify=n,t(i).ready(function(){t("[data-linkify]").each(function(){var e=t(this),n=e.data(),i=n.linkify,r=n.linkifyNlbr,a={attributes:n.linkifyAttributes,defaultProtocol:n.linkifyDefaultProtocol,events:n.linkifyEvents,format:n.linkifyFormat,formatHref:n.linkifyFormatHref,nl2br:!!r&&0!==r&&"false"!==r,tagName:n.linkifyTagname,target:n.linkifyTarget,className:n.linkifyClassName||n.linkifyLinkclass,validate:n.linkifyValidate,ignoreTags:n.linkifyIgnoreTags},o="this"===i?e:e.find(i);o.linkify(a)})}))}t="default"in t?t["default"]:t;var f=n.tokenize,s=n.options,c=s.Options,u=n.parser.TOKENS.TEXT,d=1,m=3;o.helper=a,o.normalize=function(e){return new c(e)};try{!define&&(e.linkifyElement=o)}catch(y){}return l}(n,t);"function"!=typeof n.fn.linkify&&i(n)}(window,linkify,jQuery);;
"use strict";function eventSuppressor(e){e.preventDefault();e.stopPropagation();}