;/*!ll-utils.js*/
function alert(title,message,callbackFunction){1===arguments.length&&"string"==typeof title?bootbox.dialog({message:title,title:"Alert",buttons:{success:{label:"Ok",className:"ll-btn btn-primary"}}}):2===arguments.length&&"string"==typeof title&&"string"==typeof message?bootbox.dialog({message,title,buttons:{success:{label:"Ok",className:"ll-btn btn-primary"}}}):3===arguments.length&&"string"==typeof title&&"string"==typeof message&&"function"==typeof callbackFunction?bootbox.dialog({message,title,buttons:{success:{label:"Ok",className:"ll-btn btn-primary",callback:callbackFunction}}}):console.error("Wrong arguments for alert()")}function confirmDialog(msg,yesFunction,noFunction,size,escapeFunction){var title="Please Confirm",message=msg,dialog;return"object"==typeof msg&&(title=msg.title||title,message=msg.message),noFunction=noFunction||function(){},arguments.length>=2&&"string"==typeof message&&"function"==typeof yesFunction&&"function"==typeof noFunction?dialog=bootbox.dialog({size,message,title,buttons:{danger:{label:"Cancel",className:"ll-btn btn btn-default",callback:noFunction||function(){}},success:{label:"OK",className:"ll-btn btn btn-theme",callback:yesFunction}},onEscape:function(){$(".bootbox.modal").modal("hide"),"function"==typeof escapeFunction&&escapeFunction()}}):console.error("Wrong arguments for confirmDialog()"),$(".bootbox.modal").on("shown.bs.modal",(function(){$(this).find('[data-bb-handler="success"]').trigger("focus")})),dialog}function genericAlertError(jqXHR){llbootbox.error({message:gettext("Sorry! We've encountered an unexpected error. Please refresh the page and try again. If the issue persists, please let us know in chat and we'll take a look.")})}function initTimepickers(){try{$('[id^="id"][id$="start"], [id^="id"][id$="end"], [id^="id"][id$="time1"], [id^="id"][id$="time2"]').timepicker("remove")}catch(err){}const startSelector=undefined,$start=$('[id^="id"][id$="start"], [id^="id"][id$="time1"]'),endSelector='[id^="id"][id$="end"], [id^="id"][id$="time2"]',$end=$(endSelector);$start.timepicker({scrollDefault:"12:00",timeFormat:"H:i",stopScrollPropagation:!0,listWidth:1}).on("hideTimepicker",(function(){$(this).closest("form").find(endSelector).timepicker("option",{minTime:$(this).timepicker("getTime"),showDuration:!0})})),$end.timepicker({scrollDefault:"12:00",timeFormat:"H:i",stopScrollPropagation:!0,listWidth:1}),$start.each((function(){const $this=undefined;let start;$(this).timepicker("getTime")&&$(this).closest("form").find(endSelector).timepicker("option",{minTime:$(this).timepicker("getTime"),showDuration:!0})}))}function getCookie(name){var cookieValue=null;if(document.cookie&&""!=document.cookie){const cookies=document.cookie.split(";");for(let i=0;i<cookies.length;i++){let cookie=(cookies[i]??"").trim();if(cookie.substring(0,name.length+1)===`${name}=`){cookieValue=decodeURIComponent(cookie.substring(name.length+1));break}}}return cookieValue}$(document).on("shown.bs.modal",(function(evt){if(window.innerWidth<768)return!1;let $modal=$(evt.target);$modal.find(".modal-content").draggable({handle:".modal-header",containment:$modal,cancel:".close"}),$modal.find(".modal-header").css("cursor","move")})),0===$(".navbar-collapse").find(".navbar-nav").find("li").filter((function(idx){return this.innerHTML.trim().length>0})).length&&$('.navbar-toggle[data-target=".navbar-collapse"]').hide().attr("hidden-because-empty","see ll-utils.js"),$("#cms-top").hasClass("cms-toolbar-debug")&&$("html").addClass("cms-debug-enabled"),$("body").on("hidden.bs.modal",(function(){$(".modal.in").length>0&&$("body").addClass("modal-open")}));var csrftoken=document.csrfToken;function csrfSafeMethod(method){return/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)}function sameOrigin(url){var host,protocol,sr_origin="//"+document.location.host,origin=document.location.protocol+sr_origin;return url==origin||url.slice(0,origin.length+1)==origin+"/"||url==sr_origin||url.slice(0,sr_origin.length+1)==sr_origin+"/"||!/^(\/\/|http:|https:).*/.test(url)}function submitAjaxForm(form,url){let $form=$(form),$modal=$form.closest(".modal"),formData,$submit=$form.find('[type="submit"]');function supportFormData(){return!!window.FormData}for($("#ajax-success").remove(),$submit.addClass("loading"),disableSubmit($submit),"multipart/form-data"==$form.prop("enctype")&&(supportFormData||alert("Browser not supported","Please use a newer browser in order to use this page (we recommend Chrome).")),form=$form[0],formData=new FormData(form),i=0;i<form.elements.length;i++)"file"==form.elements[i].type&&""==form.elements[i].value&&form.elements[i].parentNode.removeChild(form.elements[i]);return void 0===url&&(url=$form.attr("action")),$.ajax({type:"POST",cache:!1,url,data:formData,contentType:!1,processData:!1,success:function(data){const detail=data;if("string"==typeof data){if(data.startsWith("RELOAD")&&(data=data.slice(6),setTimeout((()=>{const loader=document.getElementById("loader");loader&&(loader.style.display=""),window.location.reload()}),250)),data.startsWith("CLOSE")&&(data=data.slice(5),$modal.length)){try{$modal.modal("hide")}catch(err){console.error(err)}const $loader=$("#loader");$loader.show(),$modal.on("hidden.bs.modal",(()=>$loader.hide()))}if(data.length){let $formWrapper=$form.closest(".modal-content");$form.closest(".form-wrapper").length&&($formWrapper=$form.closest(".form-wrapper")),$formWrapper.html(data)}}try{form.dispatchEvent(new CustomEvent("ajaxsubmit",{detail}))}catch(e){console.debug(e)}},error:function(){$("#ajax-loading").remove(),$submit.prop("disabled",!1).children(".icon").show(),llbootbox.error(gettext("Error"),gettext("Something went wrong. Please try again."))}}).always((()=>{$submit.removeClass("loading")}))}function disableSubmit($submit){if($submit.prop("disabled",!0),!($submit.find("#ajax-loading").length>0||$submit.find(".loader, .icon").length>=2)){let marginClass;try{marginClass=$submit.children('.icon[class*="mr-"]').get(0).className.match(/mr-\d/)[0]}catch(e){marginClass="mr-2"}$submit.prepend(`<span id="ajax-loading" class="${marginClass}"><i class="fas fa-arrows-rotate fa-spin"></i></span>`),$submit.children(".icon").hide()}}function UpdateQueryString(key,value,url){url||(url=window.location.href);var re=new RegExp("([?&])"+key+"=.*?(&|#|$)(.*)","gi"),hash;if(re.test(url))return null!=value?url.replace(re,"$1"+key+"="+value+"$2$3"):(hash=url.split("#"),url=hash[0].replace(re,"$1$3").replace(/(&|\?)$/,""),void 0!==hash[1]&&null!==hash[1]&&(url+="#"+hash[1]),url);if(null!=value){var separator=-1!==url.indexOf("?")?"&":"?";return hash=url.split("#"),url=hash[0]+separator+key+"="+value,void 0!==hash[1]&&null!==hash[1]&&(url+="#"+hash[1]),url}return url}function initFormControls($parent){let $formElements,$matchInput,$required;void 0===$parent?($formElements=$('input:not([type="file"], [type="checkbox"], [type="hidden"], [type="radio"], .no-form-control), select, textarea'),$matchInput=$(".match-vs input"),$required=$("[required]")):($formElements=$parent.find('input:not([type="file"], [type="hidden"], [type="checkbox"], [type="radio"], .no-form-control), select, textarea'),$matchInput=$parent.find(".match-vs input"),$required=$parent.find("[required]")),$formElements.addClass("form-control"),$matchInput.removeClass("form-control"),$required.each((function(){const $this=$(this);"hidden"!==$this.attr("type")&&$this.siblings("label").addClass("required")}))}function subscoreDisplayMode(){for(const match of document.querySelectorAll('.schedule-match[data-show-subscores-only="true"]')){const scoreInputs=undefined;if([...match.querySelectorAll(".score-inputs")].some(isVisible))continue;const subscores=match.querySelector(".subscores");if(!subscores)continue;const html=subscores.parentElement.querySelector(".subscores-wrapper").innerHTML;subscores.parentElement.style.display="none",subscores.parentElement.classList.add("visible-entering-scores");const scores=match.querySelector(".static-scores");scores&&(scores.innerHTML=html)}}function swapHomeAwayDisplay(){let swapInputs=($input1,$input2)=>{$input1.swapWith($input2)},swapScore=$score=>{let score=$score.text();if(score.length&&score.match(/\s*-?\d+\s*:\s*-?\d+\s*/)){let scores=score.split(":");scores.reverse(),$score.text(scores.join(":"))}};$('.schedule-match[data-home-away-display-reversed="true"]').each((function(){let $match=$(this);$match.find(".home-team").swapWith($match.find(".away-team"));let $scores=$match.find(".score-inputs input");swapInputs($scores.filter(":first"),$scores.filter(":last")),swapScore($match.find(".match-vs").find(".static-scores")),$match.find(".match-vs .static-scores").filter((function(){return" V "===$(this).text()})).text("@"),$match.find(".extra-score").each((function(){swapScore($(this))}));let swapExtraScoreInputs=(groupSelector,inputSelector)=>{$match.find(groupSelector).each((function(){let $points=$(this).find(inputSelector);swapInputs($points.filter(":first"),$points.filter(":last"))}))};swapExtraScoreInputs(".subscore-inputs",".subscore-input"),swapExtraScoreInputs(".ot-score-inputs",".ot-score-input")}))}function stickyFooter(){if(!document.body.classList.contains("wood-dragon")){var headerHeight=$(".navbar").outerHeight(),$footer=$("#footer"),footerHeight=$footer.outerHeight()||$("#footerwrap").outerHeight();$("#main-content").css({"min-height":`calc(100vh - ${footerHeight+headerHeight}px)`}),$footer.trigger("stickyFooterApplied")}}function copyElementText(e,id,container){const element=document.getElementById(id);selectAll(element),copySelectionText()&&($(element).tooltip({title:`<i class='fas fa-clipboard mr-1'></i> ${gettext("Copied")}`,trigger:"manual",placement:"bottom",html:!0,container:container||"body"}).tooltip("show"),setTimeout((function(){$(element).tooltip("hide").tooltip("destroy")}),3e3))}function copySelectionText(){try{return document.execCommand("copy")}catch(e){return!1}}function selectAll(el){if(void 0!==window.getSelection&&void 0!==document.createRange){var range=document.createRange();range.selectNodeContents(el);var sel=window.getSelection();sel.removeAllRanges(),sel.addRange(range)}else if(void 0!==document.selection&&void 0!==document.body.createTextRange){var textRange=document.body.createTextRange();textRange.moveToElementText(el),textRange.trigger("select")}}function initTooltips($el,options){const $els=$el.filter((function(){return!this._tooltipsInitialized}));$els.length>0&&(attachTooltip($els,options),$els.each((function(){this._tooltipsInitialized=!0})))}function initCustomTooltips(){let tooltipSelector=".ll-tooltip,.ttooltip";$(window).width()<768&&(tooltipSelector+=':not([data-tooltip-mobile="false"])'),initTooltips($("body"),{selector:tooltipSelector,trigger:"hover"})}function attachTooltip($el,options={}){const defaultOptions={title:function(){return $(this).attr("title")||$(this).data("title")||""}};return new $.fn.tooltip.Constructor($el,{...defaultOptions,...options})}function delay(fn,ms){let timer=0;return(...args)=>{clearTimeout(timer),timer=setTimeout((()=>fn(...args)),ms||0)}}csrftoken=csrftoken||getCookie("csrftoken"),$.ajaxSetup({beforeSend:function(xhr,settings){!csrfSafeMethod(settings.type)&&sameOrigin(settings.url)&&xhr.setRequestHeader("X-CSRFToken",csrftoken)}}),Sortable="undefined"!=typeof Sortable?Sortable:function(){const selector=".sortable-item";let sortItems,updateOrderInputs=(parentSelector,inputSelector,checkboxSelector)=>{const $items=$(parentSelector).find(selector),$inputs=$items.find(inputSelector),vals=$inputs.map((function(){return $(this).val()})).get();let order=Math.min.apply(null,vals.length?vals:[1]);$inputs.each((function(){$(this).val(order++)})),void 0!==checkboxSelector&&updateCheckboxes($items,checkboxSelector)},updateCheckboxes=($items,checkboxSelector)=>{$items.each((function(){setActiveStatus($(this),checkboxSelector,!$(this).prevAll(".status-divider").length)}))},setActiveStatus=($items,checkboxSelector,active)=>{$items.each((function(){const $this=$(this),$checkbox=$this.find(checkboxSelector);$this.toggleClass("inactive",!active),$checkbox.prop("checked",active)}))};return{sortItems:(parentSelector,inputSelector,checkboxSelector,onlyOrder)=>{const $parent=$(parentSelector),$all=$parent.find(selector);let $sorted,$other;onlyOrder=void 0!==onlyOrder&&onlyOrder,void 0===checkboxSelector?(onlyOrder=!0,$sorted=$all,$other=null):($sorted=$all.filter((function(){return $(this).find(checkboxSelector).is(":checked")})).removeClass("inactive"),$other=$all.filter((function(){return!$(this).find(checkboxSelector).is(":checked")})).addClass("inactive")),onlyOrder?$all.sort((function(a,b){const $a=$(a),$b=$(b),o1=parseInt($(a).find(inputSelector).val()),o2=parseInt($(b).find(inputSelector).val());return isNaN(o1)||isNaN(o2)?$a.attr("data-item-id")>$b.attr("data-item-id"):o1>o2?1:o1<o2?-1:0})):($sorted.sort((function(a,b){const o1=parseInt($(a).find(inputSelector).val()),o2=parseInt($(b).find(inputSelector).val());return o1>o2?1:o1<o2?-1:0})).removeClass("inactive"),$other.sort((function(a,b){return $(a).attr("data-item-id")>$(b).attr("data-item-id")})).addClass("inactive"),$parent.remove(selector).prepend($sorted).append($other))},updateOrderInputs,setActiveStatus}}(),$.fn.swapWith=function(that){let $this=this,$that=$(that),$temp=$("<div>");return this.before($temp),$that.before(this),$temp.after($that).remove(),this},$.fn.isInViewport=function(){const $el=$(this),$window=$(window),elementTop=$el.offset().top,elementBottom=elementTop+$el.outerHeight(),windowTop=$window.scrollTop(),windowBottom=windowTop+$window.height();return elementBottom>windowTop&&elementTop<windowBottom},$.fn.isInViewAfter=function($other){const $el=$(this);if(!$other||!$other.length)return $el.isInViewport();const elementTop=$el.offset().top,elementBottom=elementTop+$el.outerHeight(),otherTop=$other.offset().top,outerHeight=$other.outerHeight(),otherBottom=undefined;return elementBottom-outerHeight>otherTop&&elementTop<otherTop+outerHeight},$((function(){stickyFooter()})),$(window).on("resize",(function(){stickyFooter()})),stickyFooter(),$('.nav a[href="{{ request.path }}"]').closest("li").addClass("active"),initCustomTooltips(),$(".cms_toolbar-debug").length&&$("body").addClass("cms-debug-toolbar-shown");const llbootbox=(()=>{const dialog=(options={})=>{const defaults=undefined,opts={...{className:"ll-modal sm",messageClasses:"p-4 neutral strong",verticalCenter:!1,closeButton:!0,onEscape:!0,backdrop:!0,buttons:{}},...options};if(!opts.title)throw new Error("Title required");let html=opts.html;if(!html){const{messageClasses,icon,verticalCenter,message}=opts;if(!message)throw new Error("Message required");const $message=$("<div/>").addClass(`message ${messageClasses}`);icon&&$(`<div class="icon"><span><i class="${icon}"></i></span></div>`).appendTo($message),$("<div/>").toggleClass("d-flex vertical-center",verticalCenter).append(message).appendTo($message),html=$message.get(0).outerHTML}let buttons=Object.entries(opts.buttons).map((([key,btn])=>{const icon=undefined,btnDefaults={label:`${btn.icon?`<span class="mr-2"><i class="${btn.icon}"></i></span>`:""}${btn.text}`,className:"btn-theme full-width"},{callback,className,label}={...btnDefaults,...btn};return{[key]:{label,className,callback}}}));buttons=Object.assign({},...buttons);let{title,className,onEscape,closeButton,backdrop}=opts;const dialog=bootbox.dialog({title,className,onEscape,closeButton,backdrop,buttons,message:html});return 0===Object.keys(buttons).length&&$(dialog).find(".modal-body").addClass("border-radius-bottom"),dialog},error=options=>{"string"==typeof options&&(options={message:options});const defaults=undefined,opts={...{title:options.title??gettext("Error!"),message:options.message??gettext("Something went wrong."),className:"ll-modal xs",messageClasses:"p-4 danger strong",icon:"fas fa-exclamation-circle",verticalCenter:!0,onEscape:options.onEscape??!0,backdrop:!0,buttons:{confirm:{text:gettext("Reload page"),className:"ll-btn btn-default sm full-width",icon:"far fa-arrows-rotate",callback:()=>location.reload()}}},...options};return dialog(opts)},alert=(title,message,options)=>{"string"==typeof options&&(options={message:options});const defaults=undefined,opts={...{title,message,className:"ll-modal xs",messageClasses:"p-4",verticalCenter:!0,onEscape:(options&&options.onEscape)??!0,backdrop:!0,buttons:{confirm:{text:gettext("Close"),className:"ll-btn btn-white",callback:()=>!0}}},...options};return dialog(opts)};return{dialog,error,alert}})();function getPausedConstraintsFromCookie(){const paused=(Cookies.get(`paused-constraints-${document.season.id}`)||"").split(",").filter((c=>!!c)),constraintMap={"#division-constraints-toggle":["DivisionCtr"],"#team-constraints-toggle":["TeamCtr"],"#games-per-day-toggle":["MaxGamesPerDayCtr"],"#travel-constraints-toggle":["TravelCtr"],"#minmax-toggle":["MinCtr","MaxCtr"],"#max-back-to-back-toggle":["MaxBackToBackCtr"],"#home-venue-constraints-toggle":["HomeVenueCtr"],"#division-constraint-toggle":"DivisionCtr","#team-constraint-toggle":"TeamCtr","#games-per-day-constraint-toggle":"MaxGamesPerDayCtr"},constraints=[];for(const val of paused)if(val in constraintMap)constraints.push(...constraintMap[val]);else{const idMatch=val.match(/-(\d+)$/);if(idMatch){const id=idMatch[1],toggleId=val.replace(`-${id}`,"");constraints.push(`${constraintMap[toggleId]}#${id}`)}}return constraints}function pollUntilFinished(pollUrl,callback,frequency=1e3,max_frequency=5e3,backoff_factor=1.2){let currentFrequency=frequency,timer;const poll=()=>{$.get(pollUrl).then((response=>{callback(response)?clearTimeout(timer):(timer=setTimeout(poll,currentFrequency),currentFrequency=Math.min(currentFrequency*backoff_factor,max_frequency))}))};poll()}function isVisible(el){return el&&!!(el.offsetWidth||el.offsetHeight||el.getClientRects().length)}function createSkeletonLoader(parentElement,options={}){const elementHeight=parentElement.offsetHeight,width=options.width??"w-full",height=options.height??"h-2",lines=options.lines??1,gap=options.gap??"mb-4",skeletonLoaderContainer=document.createElement("div");skeletonLoaderContainer.className=`tw-${width} tw-p-4 tw-bg-white tw-h-fit`;for(let i=0;i<lines;i++){const skeletonLoaderLine=document.createElement("div");skeletonLoaderLine.className=`tw-${height} tw-rounded-lg tw-bg-gray-200 tw-animate-pulse ${gap}`,skeletonLoaderContainer.appendChild(skeletonLoaderLine)}parentElement.parentNode.insertBefore(skeletonLoaderContainer,parentElement),parentElement.style.display="none";let maxHeight=Math.max(skeletonLoaderContainer.offsetHeight,elementHeight);return skeletonLoaderContainer.style.height=`${maxHeight}px`,()=>{parentElement.parentNode.removeChild(skeletonLoaderContainer),parentElement.style.display=""}}function extractTeams(matches){return[...new Set([...matches].flatMap((m=>JSON.parse(m.dataset.teams))))]}function dayOfWeekStart(){const locale=window.navigator.userLanguage||window.navigator.language||"en-US";return moment.localeData(locale).firstDayOfWeek()??1}function configureDateTimePicker(){jQuery.datetimepicker.setLocale(document.lang)}const debounce=(callback,wait)=>{let timeoutId=null;return(...args)=>{window.clearTimeout(timeoutId),timeoutId=window.setTimeout((()=>{callback(...args)}),wait)}};

;function initNav(){const navbar=document.querySelector(".navbar"),navbarCollapse=navbar?.querySelector(".navbar-collapse"),nav=navbarCollapse?.querySelector(".navbar-nav");function navbarCollapseOverflow(){if(navbarCollapse&&nav)return nav.getBoundingClientRect().height-1>navbarCollapse.getBoundingClientRect().height}function showDefaultNavbarItems(){nav.classList.remove("invisible-club-menu-items")}function showDefaultNav(){nav.classList.remove("tw-invisible")}function collapseNavbar(){if(navbarCollapseOverflow()){nav.classList.add("visible-club-menu-dropdown");const processedNavItems=new Set;for(;navbarCollapseOverflow();){const page=[...nav.querySelectorAll(".club-menu-li")].filter((p=>!processedNavItems.has(p.dataset.page))).at(-1);if(!page)break;page.classList.add("tw-hidden");const dropdownListItems=[navbarCollapse.querySelector(`.club-menu-dropdown-li[data-page="${page.dataset.page}"]`),...navbarCollapse.querySelectorAll(`.club-menu-dropdown-li[data-parent="${page.dataset.page}"]`)];for(const li of dropdownListItems)li.classList.remove("tw-hidden");processedNavItems.add(page.dataset.page)}nav.classList.remove("invisible-club-menu-items")}else showDefaultNavbarItems();showDefaultNav()}function updateCollapseNavbar(){window.innerWidth>=991?collapseNavbar():(showDefaultNavbarItems(),showDefaultNav())}function init(){updateCollapseNavbar(),window.addEventListener("resize",updateCollapseNavbar),initNavTippy(navbar)}navbarCollapse&&nav&&init()}function initNavTippy(navbar){try{const elements=[...navbar.querySelectorAll("[data-tippy-content]")];elements.forEach((el=>el._tippy?.destroy())),tippy(elements,{allowHTML:!0,appendTo:navbar})}catch(err){console.debug(err)}}

;document.addEventListener("DOMContentLoaded",(()=>initNav()));
