1var gwp_rota_columns=[],gwp_rota_rows=[],gwp_rota_people=[],gwp_rota_config={},gwp_rota_autosave_timer=null,gwp_currentrota=null,gwp_rotafirstload=!0,gwp_rota_history=[],gwp_rota_history_index=-1,gwp_rota_max_history=20,gwp_rota_viewmode="date",gwp_rota_highlight_empty=!1,gwp_rota_filter_from="",gwp_rota_filter_to="",gwp_rota_hide_past=!0,gwp_rota_hide_today=!1,gwp_rota_focus_person="",gwp_rota_clipboard=null;function gwp_createrotapopup(){var e="addrota",t="New Rota",a={type:!0},s=[],i="dbtabs",o=[],r=[],l=[],n=[],_=[],p=[],d=[];d.fieldtitle="";var c="gwp_rota_postid";d.fieldid=c,d.formfieldline="hidden",d.nameid="gwp_rota_postid",d.type="text",d.value="",d.options=!1,d.parameters="",_.push(d),p.push(c);var v=[];v.push(["id","gwp_rota_table_container"]),v.push(["class","gwp_rota_container"]);var w="",h={type:"div",attributes:v,innerhtml:w};n.push(h);var f=!1,u={formid:"gwp_rotaform",formtitle:"",formfields:_,formfieldids:p,formclass:"",append:"tab",submit:f},m={tabtitle:'<i class="las la-calendar-check"></i>',tablabel:"Rota",ffunc:"",tabform:u,appendwith:n,tabtype:""};r.push(m),n=[],_=[],p=[];var v=[];v.push(["id","gwp_rota_settings_container"]),v.push(["class","gwp_rota_container"]);var w="",h={type:"div",attributes:v,innerhtml:w};n.push(h);var f=!1,u={formid:"gwp_rotasettings",formtitle:"",formfields:_,formfieldids:p,formclass:"",append:"tab",submit:f},m={tabtitle:'<i class="las la-cog"></i>',tablabel:"Settings",ffunc:"",tabform:u,appendwith:n,tabtype:""};r.push(m),n=[],_=[],p=[];var v=[];v.push(["id","gwp_rota_people_container"]),v.push(["class","gwp_rota_container"]);var w="",h={type:"div",attributes:v,innerhtml:w};n.push(h);var f=!1,u={formid:"gwp_rotapeople",formtitle:"",formfields:_,formfieldids:p,formclass:"",append:"tab",submit:f},m={tabtitle:'<i class="las la-users"></i>',tablabel:"People",ffunc:"",tabform:u,appendwith:n,tabtype:""};r.push(m),n=[],_=[],p=[],d=[],d.fieldtitle="Description",c="gwp_rota_description_input",d.fieldid=c,d.formfieldline="",d.nameid="gwp_rota_description",d.type="textarea",d.value="",d.options=!1,d.parameters="",_.push(d),p.push(c),d=[],d.fieldtitle="Groups",c="gwp_rota_group_input",d.fieldid=c,d.formfieldline="",d.nameid="gwp_rota_groups",d.type="selectmultipleinput",d.value="",d.options=!1,d.parameters="",_.push(d),p.push(c);var f=!1,u={formid:"gwp_rotainfo",formtitle:"",formfields:_,formfieldids:p,formclass:"",append:"tab",submit:f},m={tabtitle:'<i class="las la-info-circle"></i>',tablabel:"Info",ffunc:"",tabform:u,appendwith:n,tabtype:""};r.push(m);var v=[];v.push(["class","gwp_db_tbutton gwp_db_circlebtn"]);var w='<i class="las la-share-square" onclick="gwp_rota_share();" title="Share"></i>',h={type:"div",attributes:v,innerhtml:w,append:"gwp_addrota_topright",appendtype:"prepend"};l.push(h);var b=function(){document.getElementById("gwp_addrotatitle").setAttribute("onclick","gwp_epoptitle(`gwp_addrotatitle`, `edit`, `gwp_saverota();`);")};if(o.push(b),gwp_createpopup1(e,t,s,i,r,l,o,a),typeof gwp_groupsarray<"u"&&gwp_groupsarray!=null){for(var y=[],g=0;g<gwp_groupsarray.length;g++)y.push(gwp_groupsarray[g]);select_addvalues(y,"gwp_rota_group_input")}}function gwp_newrota(){Swal.fire({title:"New Rota",text:"Enter a name for this rota:",input:"text",showCancelButton:!0,inputPlaceholder:"e.g. Worship Team Rota"}).then(e=>{if(e.isConfirmed){var t=(e.value||"").trim()||"Untitled Rota";gwp_clearrota(),document.getElementById("gwp_addrotatitle").innerHTML=t,gwp_rota_autosave_timer&&clearTimeout(gwp_rota_autosave_timer),gwp_rota_rendertable(),gwp_rota_rendersettings(),gwp_rota_renderpeople(),gwp_rota_autosave_timer&&clearTimeout(gwp_rota_autosave_timer),gwp_open_popup("gwp_addrota"),gwp_rotafirstload=!1,setTimeout(function(){gwp_saverota("silent")},100)}})}function gwp_openrota(e){var t=null;if(typeof gwp_posts<"u"&&gwp_posts){for(var a=0;a<gwp_posts.length;a++)if(gwp_posts[a].id==e){t=gwp_posts[a];break}}if(!t){Swal.fire("Error","Rota not found","error");return}gwp_openrotadata(t)}function gwp_rota_repairjson(e){for(var t="",a=!1,s=0;s<e.length;){var i=e[s];if(!a)i==='"'&&(a=!0),t+=i,s++;else if(i==="\\")t+=i,s+1<e.length?(t+=e[s+1],s+=2):s++;else if(i==='"'){for(var o="",r=s+1;r<e.length&&r<s+10;r++)if(e[r]!==" "&&e[r]!==" "&&e[r]!==` 2`&&e[r]!=="\r"){o=e[r];break}o===":"||o===","||o==="}"||o==="]"||o===""?(t+='"',a=!1):t+="\u201C",s++}else t+=i,s++}return t}function gwp_openrotadata(e){if(gwp_clearrota(),gwp_rotafirstload=!0,e&&e.id&&(gwp_currentrota=e.id,document.getElementById("gwp_rota_postid").value=e.id),e&&e.rota_data)try{var t;
2if(typeof e.rota_data=="string"){var a=e.rota_data.replace(/u([0-9A-Fa-f]{4})/g,function(_,p){var d=parseInt(p,16);return d>=8192&&d<=8303||d===160?String.fromCharCode(d):_});try{t=JSON.parse(a)}catch(_){console.warn("Rota JSON parse failed, attempting repair...",_.message);var s=a.replace(/:\s*"((?:[^"\\]|\\.)*)"/g,function(p){return p});try{s=gwp_rota_repairjson(a),t=JSON.parse(s)}catch(p){console.error("Rota JSON repair also failed:",p),t=null}}}else t=e.rota_data;if(t){gwp_rota_columns=t.columns||[],gwp_rota_rows=t.rows||[],gwp_rota_people=t.people||[],gwp_rota_config=t.config||{};for(var i=0;i<gwp_rota_rows.length;i++)(!gwp_rota_rows[i].assignments||Array.isArray(gwp_rota_rows[i].assignments))&&(gwp_rota_rows[i].assignments={})}}catch(_){console.error("Error parsing rota data:",_)}if(e&&e.title&&(document.getElementById("gwp_addrotatitle").innerHTML=e.title),gwp_rota_rendertable(),gwp_rota_rendersettings(),gwp_rota_renderpeople(),gwp_open_popup("gwp_addrota"),e&&e.grouplist&&e.grouplist.length>0)try{typeof select_additems=="function"&&select_additems(e.grouplist,"gwp_rota_group_input")}catch(_){console.log("Rota groups restore error:",_)}if(e&&(e.description||e.rota_data)){var o=e.description||"";if(!o&&e.rota_data)try{var r=typeof e.rota_data=="string"?e.rota_data:JSON.stringify(e.rota_data);r=r.replace(/u([0-9A-Fa-f]{4})/g,function(_,p){var d=parseInt(p,16);return d>=8192&&d<=8303||d===160?String.fromCharCode(d):_});var l;try{l=JSON.parse(r)}catch{l=JSON.parse(gwp_rota_repairjson(r))}o=l.config&&l.config.description?l.config.description:""}catch{}var n=document.getElementById("gwp_rota_description_input");n&&(n.value=o)}gwp_rotafirstload=!1,gwp_rota_config.linkedgroups&&gwp_rota_config.linkedgroups.length>0&&setTimeout(function(){gwp_rota_syncpeople()},500),gwp_rota_history=[],gwp_rota_history_index=-1,gwp_rota_savehistory()}function gwp_rota_switchtab(e,t){for(var a=document.querySelectorAll("#gwp_rota_tabs .gwp_tab_btn"),s=0;s<a.length;s++)a[s].classList.remove("active");t&&t.classList.add("active");for(var i=document.querySelectorAll(".gwp_rota_tab_content"),s=0;s<i.length;s++)i[s].classList.remove("active");var o=document.getElementById("gwp_rota_tab_"+e);o&&o.classList.add("active")}function gwp_rota_rendertable(){var e=document.getElementById("gwp_rota_table_container");if(e){var t=e.querySelector(".gwp_rota_table_wrap"),a=t?t.scrollLeft:0,s=t?t.scrollTop:0,i=document.getElementById("gwp_addrota"),o=i?i.querySelector(".gwp_popupcontent"):null,r=o?o.scrollTop:0;if(gwp_rota_columns.length===0){e.innerHTML='<div class="gwp_rota_empty"><i class="las la-calendar-alt"></i><p>No roles configured yet.</p><p>Go to the <strong>Settings</strong> tab to add roles/columns for your rota.</p></div>';return}var l='<div class="gwp_rota_toolbar">';l+='<div class="gwp_rota_toolbar_icons">',l+='<i class="las la-save" onclick="gwp_saverota();" title="Save"></i>',l+='<i class="las la-calendar-plus" onclick="gwp_rota_adddates();" title="Add Dates"></i>',gwp_rota_config.autofillRules&&gwp_rota_config.autofillRules.length>0?l+='<i class="las la-magic" onclick="gwp_rota_showautofillmenu(this);" title="Auto-Fill"></i>':l+='<i class="las la-magic gwp_rota_icon_muted" onclick="gwp_rota_openautofill();" title="Setup Auto-Fill"></i>',l+='<i class="las la-undo'+(gwp_rota_history_index<=0?" gwp_rota_icon_disabled":"")+'" onclick="gwp_rota_undo();" title="Undo (Ctrl+Z)"></i>',l+='<i class="las la-redo'+(gwp_rota_history_index>=gwp_rota_history.length-1?" gwp_rota_icon_disabled":"")+'" onclick="gwp_rota_redo();" title="Redo (Ctrl+Y)"></i>',l+='<i class="las la-envelope" onclick="gwp_rota_emailweek();" title="Email"></i>',l+='<i class="las la-exchange-alt" onclick="gwp_rota_showexportmenu(this);" title="Import/Export"></i>',l+='<i class="las la-print" onclick="gwp_rota_print();" title="Print"></i>',l+="</div>",l+='<div class="gwp_rota_toolbar_dropdowns">';var n={date:'<i class="las la-table"></i> Full View',person:'<i class="las la-th"></i> Grid View',personlist:'<i class="las la-user"></i> Person List',datelist:'<i class="las la-calendar"></i> Date List'};l+='<div class="gwp_rota_dropdown" style="display:inline-block;position:relative;">',l+='<button type="button" class="gwp_rota_view_toggle" onclick="gwp_rota_showviewmenu(this);">',l+=n[gwp_rota_viewmode]+' <i class="las la-caret-down"></i>',l+="</button>",l+="</div>";var _=gwp_rota_filter_from||gwp_rota_filter_to||gwp_rota_hide_past||gwp_rota_hide_today||gwp_rota_highlight_empty;if(l+='<div class="gwp_rota_dropdown" style="display:inline-block;position:relative;">',l+='<button type="button" class="gwp_rota_view_toggle'+(_?" active":"")+'" onclick="gwp_rota_showfiltermenu(this);">',l+='<i class="las la-filter"></i> Filter <i class="las la-caret-down"></i></button>',l+="</div>",l+="</div>",l+="</div>",gwp_rota_filter_from||gwp_rota_filter_to||gwp_rota_hide_past){var p=gwp_rota_getfilteredrows();l+='<div class="gwp_rota_filter_summary">',l+='<i class="las la-filter"></i> Showing ';var d=[];if(gwp_rota_hide_past&&d.push("future dates only"),gwp_rota_filter_from){var c=new Date(gwp_rota_filter_from+"T00:00:00");d.push("from "+c.toLocaleDateString("en-GB",{day:"numeric",month:"short"}))}if(gwp_rota_filter_to){var f=new Date(gwp_rota_filter_to+"T00:00:00");d.push("to "+f.toLocaleDateString("en-GB",{day:"numeric",month:"short"}))}l+=d.join(", "),l+=" ("+p.length+" of "+gwp_rota_rows.length+" dates)",l+='<i class="las la-times gwp_rota_filter_summary_clear" onclick="gwp_rota_clearfilter();" title="Clear filters"></i>',l+="</div>"}var u=gwp_rota_getstats();l+='<div class="gwp_rota_stats_bar">',l+='<span class="gwp_rota_stat"><i class="las la-calendar"></i> '+gwp_rota_rows.length+" dates</span>";var m=gwp_rota_columns.filter(function(y){return y.hidden}).length;if(l+='<span class="gwp_rota_stat"><i class="las la-columns"></i> '+gwp_rota_columns.length+" roles"+(m>0?' <span class="gwp_rota_stat_empty">('+m+" hidden)</span>":"")+"</span>",l+='<span class="gwp_rota_stat"><i class="las la-users"></i>
2 '+gwp_rota_people.length+" people</span>",u.filled>0||u.empty>0){var v=u.total>0?Math.round(u.filled/u.total*100):0;l+='<span class="gwp_rota_stat gwp_rota_stat_fill"><i class="las la-check-circle"></i> '+v+"% filled",u.empty>0&&(l+=' <span class="gwp_rota_stat_empty">('+u.empty+" empty)</span>"),l+="</span>"}var w=new Date().toISOString().split("T")[0],h=gwp_rota_rows.find(function(y){return y.date===w});if(h&&(l+='<span class="gwp_rota_stat gwp_rota_stat_today"><i class="las la-clock"></i> Today on rota</span>'),l+="</div>",gwp_rota_rows.length===0){l+='<div class="gwp_rota_empty"><i class="las la-calendar-day"></i><p>No dates added yet.</p><p>Click <strong>Add Dates</strong> to add individual dates or bulk-add all Sundays.</p></div>',e.innerHTML=l;return}gwp_rota_rows.sort(function(y,g){return new Date(y.date)-new Date(g.date)}),gwp_rota_viewmode==="person"?l+=gwp_rota_renderpersonview():gwp_rota_viewmode==="personlist"?l+=gwp_rota_renderpersonlistview():gwp_rota_viewmode==="datelist"?l+=gwp_rota_renderdatelistview():l+=gwp_rota_renderdateview(),e.innerHTML=l;var b=e.querySelector(".gwp_rota_table_wrap");b&&(b.scrollLeft=a,b.scrollTop=s),o&&(o.scrollTop=r)}}function gwp_rota_getstats(){for(var e=0,t=0,a=0,s=0;s<gwp_rota_rows.length;s++){var i=gwp_rota_rows[s];if(!i.isBreak)for(var o=0;o<gwp_rota_columns.length;o++){var r=gwp_rota_columns[o];if(!(r.category==="custom"||r.hidden)){a++;var l=i.assignments&&i.assignments[r.id];l&&l.primary?e++:t++}}}return{filled:e,empty:t,total:a}}function gwp_rota_renderdateview(){var e=gwp_rota_getvisiblecolumns(),t='<div class="gwp_rota_table_wrap"><table class="gwp_rota_table"><thead><tr>';t+='<th class="gwp_rota_th_date">Date</th>';for(var a=0;a<e.length;a++){var s=e[a];t+='<th class="gwp_rota_th_role">',t+='<div class="gwp_rota_th_content">',t+="<span>"+gwp_escapeHtml(s.name),s.group&&(t+=' <span style="font-weight:400;color:#888;font-size:11px;">('+gwp_escapeHtml(s.group)+")</span>"),t+="</span>",t+=`<i class="las la-trash gwp_rota_col_clear" title="Clear all assignments in this column" onclick="event.stopPropagation(); gwp_rota_clearcolumn('`+s.id+"', '"+gwp_escapeHtml(s.name).replace(/'/g,"\\'")+`');"></i>`,t+="</div>",t+="</th>"}t+='<th class="gwp_rota_th_actions"><div class="gwp_rota_th_content"><span>Actions</span></div></th></tr></thead><tbody>';for(var i=new Date().toISOString().split("T")[0],o=gwp_rota_getfilteredrows(),r=0;r<o.length;r++){var l=o[r],n=new Date(l.date+"T00:00:00"),_=n.toLocaleDateString("en-GB",{weekday:"short",day:"numeric",month:"short",year:"numeric"}),p=l.date===i,d=new Date(l.date)<new Date(i),c="";if(p&&!gwp_rota_hide_today&&(c+="gwp_rota_row_today"),d&&(c+=" gwp_rota_row_past"),l.isBreak){t+='<tr data-rowid="'+l.id+'" data-date="'+l.date+'" class="gwp_rota_row_break">',t+='<td class="gwp_rota_td_break" colspan="'+(e.length+1)+'">',t+='<span class="gwp_rota_break_text">'+gwp_escapeHtml(l.breaktext||"Break")+"</span>",t+="</td>",t+='<td class="gwp_rota_td_actions">',t+=`<i class="las la-pen" onclick="event.stopPropagation(); gwp_rota_editrow('`+l.id+`');" title="Edit break"></i>`,t+=`<i class="las la-trash" onclick="event.stopPropagation(); gwp_rota_deleterow('`+l.id+`');" title="Delete break"></i>`,t+="</td></tr>";continue}t+='<tr data-rowid="'+l.id+'" data-date="'+l.date+'" class="'+c.trim()+'">',t+='<td class="gwp_rota_td_date">',p&&!gwp_rota_hide_today&&(t+='<span class="gwp_rota_today_badge">TODAY</span> '),t+=_,l.label&&(t+='<span class="gwp_rota_date_label">'+gwp_escapeHtml(l.label)+"</span>"),t+="</td>";for(var a=0;a<e.length;a++){var s=e[a],f=l.assignments&&l.assignments[s.id]||{},u=!f.primary&&!f.value,m=gwp_rota_highlight_empty&&u&&s.highlightEmpty!==!1,v=m?" gwp_rota_td_empty":"";t+='<td class="gwp_rota_td_assign'+v+`" onclick="gwp_rota_editassignment('`+l.id+"', '"+s.id+`');" data-rowid="`+l.id+'" data-colid="'+s.id+'">',t+=gwp_rota_renderassignment(f,s),t+="</td>"}t+='<td class="gwp_rota_td_actions">',t+=`<i class="las la-copy" onclick="event.stopPropagation(); gwp_rota_copyrow('`+l.id+`');" title="Copy row"></i>`;var w=gwp_rota_clipboard?" gwp_rota_paste_ready":" gwp_rota_paste_disabled";t+='<i class="las la-paste'+w+`" onclick="event.stopPropagation(); gwp_rota_pasterow('`+l.id+`');" title="Paste to row"></i>`,t+=`<i class="las la-minus" onclick="event.stopPropagation(); gwp_rota_insertbreak('`+l.id+`');" title="Insert break below"></i>`,t+=`<i class="las la-pen" onclick="event.stopPropagation(); gwp_rota_editrow('`+l.id+`');" title="Edit date"></i>`,t+=`<i class="las la-trash" onclick="event.stopPropagation(); gwp_rota_deleterow('`+l.id+`');" title="Delete row"></i>`,t+="</td></tr>"}return t+="</tbody></table></div>",t}function gwp_rota_renderpersonview(){var e=gwp_rota_getfilteredrows().filter(function(f){return!f.isBreak}),t='<div class="gwp_rota_table_wrap"><table class="gwp_rota_table gwp_rota_table_person"><thead><tr>';t+='<th class="gwp_rota_th_date">Person</th>';for(var a=0;a<e.length;a++){var s=e[a],i=new Date(s.date+"T00:00:00"),o=i.toLocaleDateString("en-GB",{day:"numeric",month:"short"}),r=i.toLocaleDateString("en-GB",{weekday:"short"});t+='<th class="gwp_rota_th_role gwp_rota_th_date_col" data-date="'+s.date+'">',t+="<div>"+r+"</div>",t+="<div>"+o+"</div>",t+="</th>"}t+="</tr></thead><tbody>";for(var l=0;l<gwp_rota_people.length;l++){var n=gwp_rota_people[l];t+='<tr data-personid="'+n.id+'">',t+='<td class="gwp_rota_td_date gwp_rota_td_person">',n.color&&(t+='<span class="gwp_rota_person_dot" style="background:'+n.color+';"></span>'),t+=`<span class="gwp_rota_person_link" onclick="gwp_rota_focus_person='`+n.id+`';gwp_rota_setview('personlist');">`+gwp_escapeHtml(n.name)+"</span>",t+="</td>";for(var a=0;a<e.length;a++){for(var s=e[a],_=[],p=0;p<gwp_rota_columns.length;p++){var d=gwp_rota_columns[p];if(!(d.category==="custom"||d.hidden)){var c=s.assignments&&s.assignments[d.id];c&&(c.primary===n.id?_.push('<span class="gwp_rota_pv_role gwp_rota_pv_lead">'+gwp_escapeHtml(d.name)+"</span>"):c.helpers&&c.helpers.indexOf(n.id)!==-1&&_.push('<span class="gwp_rota_pv_role gwp_rota_pv_helper">'+gwp_escapeHtml(d.name)+"</span>"))}}t+='<td class="gwp_rota_td_pv'+(_.length===0?" gwp_rota_td_pv_empty":"")+'">',t+=_.join(""),t+="</td>"}t+="</tr>"}return t+="</tbody></table></div>",t}function gwp_rota_renderpersonlistview(){for(var e=new Date().toISOString().split("T")[0],t=gwp_rota_getfilteredrows(),a={},s=0;s<gwp_rota_people.length;s++)a[gwp_rota_people[s].id]={};for(var i=0;i<t.length;i++){var o=t[i];if(!o.isBreak)for(var r=o.date,l=new Date(r+"T00:00:00"),n=l.toLocaleDateString("en-GB",{weekday:"short",day:"numeric",month:"short"}),_=0;_<gwp_rota_columns.length;_++){var p=gwp_rota_columns[_];if(!(p.category==="custom"||p.hidden)){var d=o.assignments&&o.assignments[p.id];if(d&&d.primary&&a[d.primary]&&(a[d.primary][r]||(a[d.primary][r]={display:n,raw:r,roles:[]}),a[d.primary][r].roles.push({role:p.name,type:"lead"})),d&&d.helpers)for(var c=0;c<d.helpers.length;c++){var f=d.helpers[c];a[f]&&(a[f][r]||(a[f][r]={display:n,raw:r,roles:[]}),a[f][r].roles.push({role:p.name,type:"helper"}))}}}}var u='<div class="gwp_rota_list_wrap">';if(gwp_rota_focus_person){for(var m="",v=0;v<gwp_rota_people.length;v++)if(gwp_rota_people[v].id===gwp_rota_focus_person){m=gwp_rota_people[v].name;break}u+='<div class="gwp_rota_member_filter_banner">',u+='<i class="las la-user"></i> Showing schedule for <strong>'+gwp_escapeHtml(m||"Unknown")+"</strong>",u+=` <button type="button" class="gwp_rota_filter_clear" onclick="gwp_rota_focus_person='';gwp_rota_rendertable();">Show All</button>`,u+="</div>"}for(var s=0;s<gwp_rota_people.length;s++){var w=gwp_rota_people[s];if(!(gwp_rota_focus_person&&w.id!==gwp_rota_focus_person)){var h=a[w.id]||{},b=[];for(var r in h)b.push(h[r]);if(b.sort(function(I,D){return I.raw.localeCompare(D.raw)}),u+='<div class="gwp_rota_person_card">',u+='<div class="gwp_rota_person_card_name">'+gwp_escapeHtml(w.name),gwp_rota_focus_person||(u+=`<span class="gwp_rota_focus_btn" onclick="gwp_rota_focus_person='`+w.id+`';gwp_rota_rendertable();" title="Focus on `+gwp_escapeHtml(w.name)+'"><i class="las la-crosshairs"></i></span>'),u+="</div>",b.length>0){u+='<div class="gwp_rota_person_card_schedule">';
2for(var y=0;y<b.length;y++){var g=b[y],x=g.raw<e,S=g.raw===e,E="gwp_rota_person_schedule_row";S&&!gwp_rota_hide_today&&(E+=" gwp_rota_schedule_today"),x&&(E+=" gwp_rota_schedule_past"),u+='<div class="'+E+'" data-date="'+g.raw+'">',u+='<div class="gwp_rota_schedule_date">',S&&!gwp_rota_hide_today&&(u+='<span class="gwp_rota_today_badge">TODAY</span>'),u+=g.display+"</div>",u+='<div class="gwp_rota_schedule_roles">',g.roles.sort(function(I,D){return I.role.localeCompare(D.role)});for(var T=0;T<g.roles.length;T++){var k=g.roles[T],C=k.type==="lead"?"gwp_rota_schedule_role_lead":"gwp_rota_schedule_role_helper";u+='<span class="'+C+'">'+gwp_escapeHtml(k.role)+"</span>"}u+="</div></div>"}u+="</div>"}else u+='<div class="gwp_rota_person_card_empty">No assignments</div>';u+="</div>"}}return u+="</div>",u}function gwp_rota_renderdatelistview(){for(var e=new Date().toISOString().split("T")[0],t=gwp_rota_getfilteredrows(),a='<div class="gwp_rota_list_wrap">',s=0;s<t.length;s++){var i=t[s],o=i.date||"",r=i.label||"",l=new Date(o+"T00:00:00"),n=l.toLocaleDateString("en-GB",{weekday:"short",day:"numeric",month:"short"}),_="gwp_rota_date_card",p=o===e;if(p&&!gwp_rota_hide_today?_+=" gwp_rota_date_card_today":o<e&&(_+=" gwp_rota_date_card_past"),i.isBreak){a+='<div class="gwp_rota_break_card" data-date="'+o+'">',a+='<span class="gwp_rota_break_text">'+gwp_escapeHtml(i.breaktext||"Break")+"</span>",a+="</div>";continue}a+='<div class="'+_+'" data-date="'+o+'">',a+='<div class="gwp_rota_date_card_header">',p&&!gwp_rota_hide_today&&(a+='<span class="gwp_rota_today_badge">TODAY</span>'),a+='<span class="gwp_rota_date_card_date">'+n+"</span>",r&&(a+='<span class="gwp_rota_date_card_label">'+gwp_escapeHtml(r)+"</span>"),a+="</div>",a+='<div class="gwp_rota_date_card_roles">';for(var d=0;d<gwp_rota_columns.length;d++){var c=gwp_rota_columns[d];if(!c.hidden){var f=c.name||c.id,u=i.assignments&&i.assignments[c.id];if(a+='<div class="gwp_rota_date_card_role">',a+='<div class="gwp_rota_date_card_role_name">'+gwp_escapeHtml(f)+"</div>",a+='<div class="gwp_rota_date_card_role_value">',u)if(u.value!==void 0)a+='<span class="gwp_rota_date_card_text">'+gwp_escapeHtml(u.value)+"</span>";else{if(u.primary){var m=gwp_rota_people.find(function(h){return h.id===u.primary});m&&(a+='<span class="gwp_rota_date_card_person">'+gwp_escapeHtml(m.name)+"</span>")}if(u.helpers)for(var v=0;v<u.helpers.length;v++){var w=gwp_rota_people.find(function(h){return h.id===u.helpers[v]});w&&(a+='<span class="gwp_rota_date_card_helper">'+gwp_escapeHtml(w.name)+"</span>")}}else a+='<span class="gwp_rota_date_card_empty">\u2014</span>';a+="</div></div>"}}a+="</div></div>"}return a+="</div>",a}function gwp_rota_toggleview(){gwp_rota_viewmode=gwp_rota_viewmode==="date"?"person":"date",gwp_rota_rendertable()}function gwp_rota_showviewmenu(e){var t=document.getElementById("gwp_rota_view_menu");if(t){t.remove();return}var a=document.createElement("div");a.id="gwp_rota_view_menu",a.className="gwp_rota_dropdown_menu",a.innerHTML='<div class="gwp_rota_menu_item'+(gwp_rota_viewmode==="date"?" active":"")+`" onclick="gwp_rota_setview('date');"><i class="las la-table"></i> Full View</div><div class="gwp_rota_menu_item`+(gwp_rota_viewmode==="person"?" active":"")+`" onclick="gwp_rota_setview('person');"><i class="las la-th"></i> Grid View</div><div class="gwp_rota_menu_item`+(gwp_rota_viewmode==="personlist"?" active":"")+`" onclick="gwp_rota_setview('personlist');"><i class="las la-user"></i> Person List</div><div class="gwp_rota_menu_item`+(gwp_rota_viewmode==="datelist"?" active":"")+`" onclick="gwp_rota_setview('datelist');"><i class="las la-calendar"></i> Date List</div>`;var s=e.getBoundingClientRect(),i=160;a.style.position="fixed",a.style.top=s.bottom+5+"px",a.style.zIndex="10000",s.left+i>window.innerWidth?(a.style.right=window.innerWidth-s.right+"px",a.style.left="auto"):(a.style.left=s.left+"px",a.style.right="auto"),document.body.appendChild(a),setTimeout(function(){a.classList.add("show")},10),setTimeout(function(){document.addEventListener("click",gwp_rota_closeviewmenu)},10)}function gwp_rota_closeviewmenu(){var e=document.getElementById("gwp_rota_view_menu");e&&e.remove(),document.removeEventListener("click",gwp_rota_closeviewmenu)}function gwp_rota_setview(e){gwp_rota_viewmode==="personlist"&&e!=="personlist"&&(gwp_rota_focus_person=""),gwp_rota_viewmode=e,gwp_rota_closeviewmenu(),gwp_rota_rendertable()}function gwp_rota_showfiltermenu(e){var t=document.getElementById("gwp_rota_filter_menu");if(t){t.remove();return}var a=document.createElement("div");a.id="gwp_rota_filter_menu",a.className="gwp_rota_dropdown_menu gwp_rota_filter_menu",a.innerHTML='<div class="gwp_rota_filter_section"><button type="button" class="gwp_rota_filter_btn" onclick="gwp_rota_scrolltoday(); gwp_rota_closefiltermenu();"><i class="las la-crosshairs"></i> Scroll to Today</button></div><div class="gwp_rota_filter_divider"></div><div class="gwp_rota_filter_section"><label class="gwp_rota_filter_label">From</label><input type="date" class="gwp_rota_filter_input" id="gwp_rota_popup_filter_from" value="'+gwp_rota_filter_from+'" onchange="gwp_rota_applyfilter();"></div><div class="gwp_rota_filter_section"><label class="gwp_rota_filter_label">To</label><input type="date" class="gwp_rota_filter_input" id="gwp_rota_popup_filter_to" value="'+gwp_rota_filter_to+'" onchange="gwp_rota_applyfilter();"></div><div class="gwp_rota_filter_divider"></div><div class="gwp_rota_filter_section"><label class="gwp_rota_filter_checkbox"><input type="checkbox" id="gwp_rota_popup_show_past" '+(gwp_rota_hide_past?"":"checked")+' onchange="gwp_rota_applyfilter();"> Show past dates</label></div><div class="gwp_rota_filter_section"><label class="gwp_rota_filter_checkbox"><input type="checkbox" id="gwp_rota_popup_hide_today" '+(gwp_rota_hide_today?"checked":"")+' onchange="gwp_rota_applyfilter();"> Hide today badge</label></div><div class="gwp_rota_filter_section"><label class="gwp_rota_filter_checkbox"><input type="checkbox" id="gwp_rota_popup_highlight_empty" '+(gwp_rota_highlight_empty?"checked":"")+' onchange="gwp_rota_applyfilter();"> Highlight empty cells</label></div><div class="gwp_rota_filter_divider"></div><div class="gwp_rota_filter_section gwp_rota_filter_actions"><button type="button" class="gwp_rota_filter_clear" onclick="gwp_rota_clearfilter();">Clear All</button></div>';var s=e.getBoundingClientRect(),i=240;a.style.position="fixed",a.style.top=s.bottom+5+"px",a.style.zIndex="10000",s.left+i>window.innerWidth?(a.style.right=window.innerWidth-s.right+"px",a.style.left="auto"):(a.style.left=s.left+"px",a.style.right="auto"),document.body.appendChild(a),setTimeout(function(){a.classList.add("show")},10),setTimeout(function(){document.addEventListener("click",gwp_rota_closefiltermenu)},10)}function gwp_rota_closefiltermenu(e){if(!(e&&e.target.closest(".gwp_rota_filter_menu"))){var t=document.getElementById("gwp_rota_filter_menu");t&&t.remove(),document.removeEventListener("click",gwp_rota_closefiltermenu)}}function gwp_rota_applyfilter(){var e=document.getElementById("gwp_rota_popup_filter_from"),t=document.getElementById("gwp_rota_popup_filter_to"),a=document.getElementById("gwp_rota_popup_show_past"),s=document.getElementById("gwp_rota_popup_hide_today"),i=document.getElementById("gwp_rota_popup_highlight_empty");gwp_rota_filter_from=e?e.value:"",gwp_rota_filter_to=t?t.value:"",gwp_rota_hide_past=a?!a.checked:!0,gwp_rota_hide_today=s?s.checked:!1,gwp_rota_highlight_empty=i?i.checked:!1,gwp_rota_rendertable()}function gwp_rota_clearfilter(){gwp_rota_filter_from="",gwp_rota_filter_to="",gwp_rota_hide_past=!0,gwp_rota_hide_today=!1,gwp_rota_highlight_empty=!1,gwp_rota_closefiltermenu(),gwp_rota_rendertable()}function gwp_rota_getfilteredrows(){var e=new Date().toISOString().split("T")[0];return gwp_rota_rows.filter(function(t){var a=t.date||"";return!(gwp_rota_hide_past&&a<e||gwp_rota_filter_from&&a<gwp_rota_filter_from||gwp_rota_filter_to&&a>gwp_rota_filter_to)})}function gwp_rota_scrolltoday(){var e=new Date().toISOString().split("T")[0],t=gwp_rota_getfilteredrows(),a=t.find(function(i){return i.date>=e});if(!a&&t.length>0&&(a=t[t.length-1]),!!a){var s=document.querySelector('[data-date="'+a.date+'"]');s&&(s.scrollIntoView({behavior:"smooth",block:"center"}),s.classList.add("gwp_rota_highlight_flash"),setTimeout(function(){s.classList.remove("gwp_rota_highlight_flash")},1500))}}function gwp_rota_togglehighlightempty(){gwp_rota_highlight_empty=!gwp_rota_highlight_empty,gwp_rota_rendertable()}function gwp_rota_highlighttoday(){}function gwp_rota_copyrow(e){var t=gwp_rota_rows.find(function(a){return a.id===e});t&&(gwp_rota_clipboard={type:"row",assignments:JSON.parse(JSON.stringify(t.assignments||{})),label:t.label},gwp_rota_rendertable(),Swal.fire({title:"Copied",text:"Row copied! Click the paste icon on another row to apply.",icon:"success",timer:2e3,showConfirmButton:!1}))}function gwp_rota_pasterow(e){if(!gwp_rota_clipboard||gwp_rota_clipboard.type!=="row"){Swal.fire("Nothing to Paste","Copy a row first using the copy button.","
2info");return}for(var t=0;t<gwp_rota_rows.length;t++)if(gwp_rota_rows[t].id===e){gwp_rota_rows[t].assignments=JSON.parse(JSON.stringify(gwp_rota_clipboard.assignments));break}gwp_rota_savehistory(),gwp_rota_rendertable(),gwp_saverota("silent")}var gwp_rota_history_restoring=!1;function gwp_rota_savehistory(){if(!gwp_rota_history_restoring){for(var e=0,t=0;t<gwp_rota_rows.length;t++)gwp_rota_rows[t].assignments&&(e+=Object.keys(gwp_rota_rows[t].assignments).length);var a={rows:JSON.parse(JSON.stringify(gwp_rota_rows)),columns:JSON.parse(JSON.stringify(gwp_rota_columns)),people:JSON.parse(JSON.stringify(gwp_rota_people)),config:JSON.parse(JSON.stringify(gwp_rota_config)),timestamp:Date.now(),assignmentCount:e};gwp_rota_history_index<gwp_rota_history.length-1&&(gwp_rota_history=gwp_rota_history.slice(0,gwp_rota_history_index+1)),gwp_rota_history.push(a),gwp_rota_history_index=gwp_rota_history.length-1,gwp_rota_history.length>gwp_rota_max_history&&(gwp_rota_history.shift(),gwp_rota_history_index=Math.max(0,gwp_rota_history_index-1))}}function gwp_rota_undo(){for(var e=0;e<gwp_rota_history.length;e++)var t=gwp_rota_history[e];if(gwp_rota_history.length<2){Swal.fire("Cannot Undo","Not enough history to undo.","info");return}if(gwp_rota_history_index<1){Swal.fire("Cannot Undo","Already at oldest state.","info");return}gwp_rota_history_index--;var a=gwp_rota_history[gwp_rota_history_index];gwp_rota_restore_snapshot(a)}function gwp_rota_redo(){if(gwp_rota_history_index>=gwp_rota_history.length-1){Swal.fire("Cannot Redo","Nothing to redo.","info");return}gwp_rota_history_index++;var e=gwp_rota_history[gwp_rota_history_index];gwp_rota_restore_snapshot(e)}function gwp_rota_restore_snapshot(e){e&&(gwp_rota_history_restoring=!0,gwp_rota_rows=JSON.parse(JSON.stringify(e.rows)),gwp_rota_columns=JSON.parse(JSON.stringify(e.columns)),gwp_rota_people=JSON.parse(JSON.stringify(e.people)),gwp_rota_config=JSON.parse(JSON.stringify(e.config)),gwp_rota_rendertable(),gwp_rota_rendersettings(),gwp_rota_renderpeople(),gwp_saverota("silent"),gwp_rota_history_restoring=!1)}function gwp_rota_showexportmenu(e){var t=document.getElementById("gwp_rota_export_menu");if(t){t.remove();return}var a=document.createElement("div");a.id="gwp_rota_export_menu",a.className="gwp_rota_dropdown_menu",a.innerHTML='<div class="gwp_rota_menu_header">Export</div><div class="gwp_rota_menu_item" onclick="gwp_rota_export(); gwp_rota_closeexportmenu();"><i class="las la-file-csv"></i> Export as CSV</div><div class="gwp_rota_menu_item" onclick="gwp_rota_exportical(); gwp_rota_closeexportmenu();"><i class="las la-calendar-alt"></i> Export as iCal (.ics)</div><div class="gwp_rota_menu_item" onclick="gwp_rota_print(); gwp_rota_closeexportmenu();"><i class="las la-print"></i> Print View</div><div class="gwp_rota_menu_divider"></div><div class="gwp_rota_menu_header">Import</div><div class="gwp_rota_menu_item" onclick="gwp_rota_downloadtemplate(); gwp_rota_closeexportmenu();"><i class="las la-file-download"></i> Download CSV Template</div><div class="gwp_rota_menu_item" onclick="gwp_rota_importcsv(); gwp_rota_closeexportmenu();"><i class="las la-file-upload"></i> Import from CSV</div>';var s=e.getBoundingClientRect(),i=200;a.style.position="fixed",a.style.top=s.bottom+5+"px",a.style.zIndex="10000",s.left+i>window.innerWidth?(a.style.right=window.innerWidth-s.right+"px",a.style.left="auto"):(a.style.left=s.left+"px",a.style.right="auto"),document.body.appendChild(a),setTimeout(function(){a.classList.add("show")},10),setTimeout(function(){document.addEventListener("click",gwp_rota_closeexportmenu)},10)}function gwp_rota_closeexportmenu(){var e=document.getElementById("gwp_rota_export_menu");e&&e.remove(),document.removeEventListener("click",gwp_rota_closeexportmenu)}function gwp_rota_downloadtemplate(){for(var e=["Date","Label"],t=0;t<gwp_rota_columns.length;t++){var a=gwp_rota_columns[t];e.push(a.name||a.id)}e.push("Notes");for(var s=[],i=new Date,o=0;o<3;o++){var r=new Date(i);r.setDate(i.getDate()+o*7);for(var l=r.toISOString().split("T")[0],n=[l,""],t=0;t<gwp_rota_columns.length;t++)n.push("");n.push(""),s.push(n)}var _=e.map(function(u){return'"'+u.replace(/"/g,'""')+'"'}).join(",")+` 3`;_+=` 4`,_+=`// Instructions: Fill in names for each role column. Use semicolon (;) to separate multiple people. 5`,_+=`// Custom field columns accept text values directly. 6`,_+=`// Date format: YYYY-MM-DD (e.g., 2025-01-15) 7`,_+=`// Delete these instruction lines before importing. 8 9`;for(var p=0;p<s.length;p++)_+=s[p].map(function(u){return'"'+(u||"").replace(/"/g,'""')+'"'}).join(",")+` 10`;var d=new Blob([_],{type:"text/csv;charset=utf-8;"}),c=URL.createObjectURL(d),f=document.createElement("a");f.href=c,f.download="rota_template.csv",f.click(),URL.revokeObjectURL(c),gwp_toast("Template downloaded","tick")}function gwp_rota_importcsv(){var e=document.createElement("input");e.type="file",e.accept=".csv",e.onchange=function(t){var a=t.target.files[0];if(a){var s=new FileReader;s.onload=function(i){var o=i.target.result;gwp_rota_parseimportcsv(o)},s.readAsText(a)}},e.click()}function gwp_rota_parseimportcsv(e){for(var t=e.split(` 11`),a=[],s=0;s<t.length;s++){var i=t[s].trim();if(!(!i||i.startsWith("//"))){for(var o=[],r=!1,l="",n=0;n<i.length;n++){var _=i[n];_==='"'?r&&i[n+1]==='"'?(l+='"',n++):r=!r:_===","&&!r?(o.push(l.trim()),l=""):l+=_}o.push(l.trim()),o.length>1&&a.push(o)}}
11if(a.length<2){gwp_toast("No valid data found in CSV","error");return}gwp_rota_showimportmodal(a)}function gwp_rota_showimportmodal(e){var t=document.getElementById("gwp_rota_import_modal");t&&t.remove();var a=e[0],s=e.length-1,i=document.createElement("div");i.id="gwp_rota_import_modal",i.className="gwp_rota_modal_overlay",i.innerHTML='<div class="gwp_rota_modal"><div class="gwp_rota_modal_header"><i class="las la-file-import"></i> Import CSV<span class="gwp_rota_modal_close" onclick="gwp_rota_closeimportmodal();">×</span></div><div class="gwp_rota_modal_body"><p style="margin-bottom:15px;color:#555;">Found <strong>'+s+' rows</strong> to import.</p><div class="gwp_rota_import_preview"><div class="gwp_rota_import_preview_header">Preview (first 3 rows):</div><div class="gwp_rota_import_preview_table" id="gwp_rota_import_preview"></div></div><div class="gwp_rota_import_options"><label class="gwp_rota_import_option"><input type="radio" name="gwp_rota_import_mode" value="add" checked> <strong>Add to existing</strong> - Append new rows to current rota</label><label class="gwp_rota_import_option"><input type="radio" name="gwp_rota_import_mode" value="overwrite"> <strong>Overwrite</strong> - Replace all existing data</label></div></div><div class="gwp_rota_modal_footer"><button type="button" class="gwp_close_button" onclick="gwp_rota_closeimportmodal();">Cancel</button><button type="button" class="gwp_save_button" onclick="gwp_rota_doimport();">Import</button></div></div>',document.body.appendChild(i),window.gwp_rota_import_data=e;for(var o="<table><thead><tr>",r=0;r<a.length&&r<5;r++)o+="<th>"+gwp_escapeHtml(a[r])+"</th>";a.length>5&&(o+="<th>...</th>"),o+="</tr></thead><tbody>";for(var l=1;l<e.length&&l<=3;l++){o+="<tr>";for(var n=0;n<e[l].length&&n<5;n++)o+="<td>"+gwp_escapeHtml(e[l][n]||"-")+"</td>";e[l].length>5&&(o+="<td>...</td>"),o+="</tr>"}o+="</tbody></table>",document.getElementById("gwp_rota_import_preview").innerHTML=o}function gwp_rota_closeimportmodal(){var e=document.getElementById("gwp_rota_import_modal");e&&e.remove(),window.gwp_rota_import_data=null}function gwp_rota_doimport(){var e=window.gwp_rota_import_data;if(!e||e.length<2){gwp_toast("No data to import","error");return}for(var t=document.querySelector('input[name="gwp_rota_import_mode"]:checked').value,a=e[0],s={},i={},o=0;o<a.length;o++){var r=a[o].toLowerCase().trim();if(r==="date")s.date=o;else if(r==="label")s.label=o;else if(r==="notes")s.notes=o;else for(var l=0;l<gwp_rota_columns.length;l++){var n=(gwp_rota_columns[l].name||gwp_rota_columns[l].id).toLowerCase().trim();if(n===r){s[gwp_rota_columns[l].id]=o,i[gwp_rota_columns[l].id]=gwp_rota_columns[l];break}}}if(s.date===void 0){gwp_toast('CSV must have a "Date" column',"error");return}for(var _={},p=1;p<e.length;p++){var d=e[p];for(var c in s)if(!(c==="date"||c==="label"||c==="notes")&&!(i[c]&&i[c].category==="custom")){var f=d[s[c]]||"";if(f)for(var u=f.split(";").map(function(E){return E.trim().replace(/\s*\((Lead|Helper)\)\s*$/i,"")}).filter(function(E){return E}),m=0;m<u.length;m++)_[u[m].toLowerCase()]=u[m]}}var v={},w=[];for(var h in _){var b=_[h],y=!1;if(typeof gwp_rota_people<"u"&&gwp_rota_people)for(var g=0;g<gwp_rota_people.length;g++){var x=gwp_rota_people[g],S=(x.name||"").toLowerCase().trim();if(S===h){v[h]=x.id,y=!0;break}}y||w.push(b)}if(w.length>0){gwp_rota_closeimportmodal(),gwp_rota_fetchcontactsformatching(function(E,T){for(var k=[],C=0;C<w.length;C++){for(var H=w[C],I=H.toLowerCase().trim(),D=!1,N=0;N<E.length;N++){var L=E[N],R=[],U=((L.first_name||"")+" "+(L.last_name||"")).trim();U&&R.push(U),L.name&&R.push(L.name.trim()),L.display_name&&R.push(L.display_name.trim());for(var M=0;M<R.length;M++)if(R[M].toLowerCase()===I){var O="person_"+Date.now()+"_"+Math.random().toString(36).substr(2,9)+"_"+C;gwp_rota_people.push({id:O,name:R[M],email:L.email||L.user_email||"",contactId:L.id,userid:null}),v[I]=O,D=!0;break}if(D)break}D||k.push(H)}k.length>0?gwp_rota_showunmatchedmodal(k,v,e,s,t,E,T):(typeof gwp_rota_renderpeople=="function"&&gwp_rota_renderpeople(),gwp_rota_finishimport(e,s,t,v))});return}gwp_rota_finishimport(e,s,t,v)}function gwp_rota_fetchcontactsformatching(e){for(var t=[],a=0;a<gwp_rota_columns.length;a++)gwp_rota_columns[a].group&&t.indexOf(gwp_rota_columns[a].group)===-1&&t.push(gwp_rota_columns[a].group);var s=new FormData;s.append("gwp_type","all"),s.append("gwp_perpage","9999"),s.append("gwp_wpid",gwp_wpid),s.append("gwp_apikey",gwp_apikey),fetch(gwp_pluginurl+"data/contacts.php",{method:"POST",body:s}).then(function(i){return i.json()}).then(function(i){var o=i.gwp_authstatus==="authorised"&&i.contacts?i.contacts:[];if(t.length===0){e(o,{});return}for(var r={},l=t.length,n=0;n<t.length;n++)(function(_){var p=new FormData;p.append("gwp_group",_),p.append("gwp_wpid",gwp_wpid),p.append("gwp_apikey",gwp_apikey),fetch(gwp_pluginurl+"data/getgroupmembers.php",{method:"POST",body:p}).then(function(d){return d.json()}).then(function(d){if(d.gwp_authstatus==="authorised"&&d.members){for(var c=[],f=0;f<d.members.length;f++){var u=d.members[f],m=((u.first_name||"")+" "+(u.last_name||"")).trim()||(u.n
11ame||"").trim()||(u.display_name||"").trim();m&&c.push(m.toLowerCase())}r[_]=c}l--,l===0&&e(o,r)}).catch(function(){l--,l===0&&e(o,r)})})(t[n])}).catch(function(i){console.error("Contacts fetch error:",i),e([],{})})}function gwp_rota_showunmatchedmodal(e,t,a,s,i,o,r){var l=document.getElementById("gwp_rota_unmatched_modal");l&&l.remove(),r=r||{};for(var n={},_=1;_<a.length;_++){var p=a[_];for(var d in s)if(!(d==="date"||d==="label"||d==="notes")){var c=p[s[d]]||"";if(c)for(var f=c.split(";").map(function(j){return j.trim().replace(/\s*\((Lead|Helper)\)\s*$/i,"")}).filter(function(j){return j}),u=0;u<f.length;u++){var m=f[u].toLowerCase();n[m]||(n[m]=[]),n[m].indexOf(d)===-1&&n[m].push(d)}}}for(var v={},w=0;w<e.length;w++){for(var h=e[w].toLowerCase(),b=n[h]||[],y=[],g=0;g<b.length;g++)for(var x=0;x<gwp_rota_columns.length;x++)gwp_rota_columns[x].id===b[g]&&gwp_rota_columns[x].group&&y.indexOf(gwp_rota_columns[x].group)===-1&&y.push(gwp_rota_columns[x].group);v[h]=y}for(var S=[],E={},T=gwp_rota_people||[],k=0;k<T.length;k++){var C=(T[k].name||"").toLowerCase().trim();C&&!E[C]&&(E[C]=!0,S.push({id:T[k].id,name:T[k].name,source:"rota"}))}o=o||[];for(var H=0;H<o.length;H++){var I=o[H],D=((I.first_name||"")+" "+(I.last_name||"")).trim()||(I.name||"").trim()||(I.display_name||"").trim();if(D){var N=D.toLowerCase();E[N]||(E[N]=!0,S.push({id:"contact_"+I.id,name:D,contactId:I.id,email:I.email||I.user_email||"",source:"contact"}))}}for(var L=[],k=0;k<e.length;k++){var R=e[k],U=v[R.toLowerCase()]||[],M=gwp_rota_findsimilar(R,S,r,U);L.push({csvName:R,matches:M,groups:U})}var O=document.createElement("div");O.id="gwp_rota_unmatched_modal",O.className="gwp_rota_modal_overlay";for(var B='<div class="gwp_rota_unmatched_list">',k=0;k<L.length;k++){var P=L[k],G=P.groups.length>0?' <span style="font-size:11px;color:#888;">('+P.groups.join(", ")+")</span>":"";if(B+='<div class="gwp_rota_unmatched_item" style="display:flex;align-items:center;gap:10px;padding:8px 0;border-bottom:1px solid #f0f0f0">',B+='<div style="flex:1;min-width:140px"><i class="las la-user"></i> <strong>'+gwp_escapeHtml(P.csvName)+"</strong>"+G+"</div>",B+='<div style="flex:0 0 auto;color:#999;font-size:12px"><i class="las la-arrow-right"></i></div>',B+='<select class="gwp_rota_match_select" data-idx="'+k+'" style="flex:1;min-width:180px;padding:6px 8px;border:1px solid #ddd;border-radius:6px;font-size:13px">',B+='<option value="__create__">+ Create new person</option>',B+=`<option value="__skip__">Skip (don't import)</option>`,P.matches.length>0){B+='<optgroup label="Suggested matches">';for(var J=0;J<P.matches.length;J++){var W=P.matches[J],V=J===0?" selected":"",$=W.source==="contact"?" [contact]":"";B+='<option value="'+W.id+'"'+V+">"+gwp_escapeHtml(W.name)+" ("+W.reason+")"+$+"</option>"}B+="</optgroup>"}var z=S.slice().sort(function(F,K){return(F.name||"").localeCompare(K.name||"")}),q=z.filter(function(F){return F.source==="rota"});if(q.length>0){B+='<optgroup label="Rota people">';for(var A=0;A<q.length;A++)B+='<option value="'+q[A].id+'">'+gwp_escapeHtml(q[A].name)+"</option>";B+="</optgroup>"}var Y=z.filter(function(F){return F.source==="contact"});if(Y.length>0){B+='<optgroup label="Contacts">';for(var A=0;A<Y.length;A++)B+='<option value="'+Y[A].id+'">'+gwp_escapeHtml(Y[A].name)+"</option>";B+="</optgroup>"}B+="</select>",B+="</div>"}B+="</div>",O.innerHTML='<div class="gwp_rota_modal"><div class="gwp_rota_modal_header"><i class="las la-users"></i> Match People<span class="gwp_rota_modal_close" onclick="gwp_rota_closeunmatchedmodal();">×</span></div><div class="gwp_rota_modal_body"><p style="margin-bottom:15px;color:#555;"><strong>'+e.length+"</strong> name"+(e.length!==1?"s":"")+" from the CSV didn't exactly match your rota people list. Match them below or create new entries:</p>"+B+'</div><div class="gwp_rota_modal_footer"><button type="button" class="gwp_close_button" onclick="gwp_rota_closeunmatchedmodal();">Cancel</button><button type="button" class="gwp_save_button" onclick="gwp_rota_handleunmatched();">Continue Import</button></div></div>',document.body.appendChild(O),window.gwp_rota_unmatched_data={unmatchedNames:e,nameToId:t,data:a,colMap:s,mode:i,allPeople:S}}function gwp_rota_findsimilar(e,t,a,s){if(!t||t.length===0)return[];a=a||{},s=s||[];
11for(var i=e.toLowerCase().trim(),o=i.split(/\s+/),r=o[0]||"",l=o.length>1?o[o.length-1]:"",n=[],_=0;_<t.length;_++){var p=t[_],d=(p.name||"").toLowerCase().trim();if(d&&d!==i){for(var c=d.split(/\s+/),f=c[0]||"",u=c.length>1?c[c.length-1]:"",m=0,v=[],w=!1,h=0;h<s.length;h++){var b=a[s[h]];if(b&&b.indexOf(d)!==-1){m+=25,w=!0,v.push("in "+s[h]);break}}if(l&&u&&l===u&&(m+=50,v.push("same surname")),r&&f&&r===f&&(m+=30,v.push("same first name")),r&&f&&r.length>=3&&f.length>=3){var y=r.length<f.length?r:f,g=r.length<f.length?f:r;g.indexOf(y)===0&&v.indexOf("same first name")===-1&&(m+=40,v.push("similar first name"))}if(m===0||m<=25&&w){for(var x=0;x<o.length;x++)if(!(o[x].length<3))for(var S=0;S<c.length;S++)c[S].length<3||(c[S].indexOf(o[x])!==-1||o[x].indexOf(c[S])!==-1)&&(m+=20,(v.length===0||v.length===1&&w)&&v.push("partial match"))}m>0&&n.push({id:p.id,name:p.name,score:m,reason:v.join(", "),source:p.source||"rota"})}}return n.sort(function(E,T){return T.score-E.score}),n.slice(0,5)}function gwp_rota_closeunmatchedmodal(){var e=document.getElementById("gwp_rota_unmatched_modal");e&&e.remove(),window.gwp_rota_unmatched_data=null}function gwp_rota_handleunmatched(){var e=window.gwp_rota_unmatched_data;if(e){for(var t=document.querySelectorAll(".gwp_rota_match_select"),a=0;a<t.length;a++){var s=t[a],i=parseInt(s.getAttribute("data-idx")),o=e.unmatchedNames[i],r=s.value;if(r!=="__skip__")if(r==="__create__"){var l="person_"+Date.now()+"_"+Math.random().toString(36).substr(2,9);typeof gwp_rota_people>"u"&&(gwp_rota_people=[]),gwp_rota_people.push({id:l,name:o,email:"",userid:null}),e.nameToId[o.toLowerCase()]=l}else if(r.indexOf("contact_")===0){var n=null;if(e.allPeople){for(var _=0;_<e.allPeople.length;_++)if(e.allPeople[_].id===r){n=e.allPeople[_];break}}if(n){var l="person_"+Date.now()+"_"+Math.random().toString(36).substr(2,9);typeof gwp_rota_people>"u"&&(gwp_rota_people=[]),gwp_rota_people.push({id:l,name:n.name,email:n.email||"",contactId:n.contactId||null,userid:null}),e.nameToId[o.toLowerCase()]=l}}else e.nameToId[o.toLowerCase()]=r}typeof gwp_rota_renderpeople=="function"&&gwp_rota_renderpeople(),gwp_rota_closeunmatchedmodal(),gwp_rota_finishimport(e.data,e.colMap,e.mode,e.nameToId)}}function gwp_rota_finishimport(e,t,a,s){gwp_rota_savehistory(),a==="overwrite"&&(gwp_rota_rows=[]);for(var i=0,o=1;o<e.length;o++){var r=e[o],l=r[t.date];if(l){var n=gwp_rota_parsedate(l);if(n){var _={id:"row_"+Date.now()+"_"+Math.random().toString(36).substr(2,9),date:n,label:t.label!==void 0&&r[t.label]||"",notes:t.notes!==void 0&&r[t.notes]||"",assignments:{}};for(var p in t)if(!(p==="date"||p==="label"||p==="notes")){var d=r[t[p]]||"";if(d){for(var c=null,f=0;f<gwp_rota_columns.length;f++)if(gwp_rota_columns[f].id===p){c=gwp_rota_columns[f];break}if(c&&c.category==="custom"){c.fieldtype==="checkbox"?_.assignments[p]={value:d.toLowerCase()==="true"||d==="1"||d.toLowerCase()==="yes"}:c.fieldtype==="selectmulti"?_.assignments[p]={value:d.split(";").map(function(g){return g.trim()}).filter(function(g){return g})}:_.assignments[p]={value:d};continue}for(var u=d.split(";").map(function(g){return g.trim().replace(/\s*\((Lead|Helper)\)\s*$/i,"")}).filter(function(g){return g}),m=null,v=[],w=c&&c.type==="team",h=0;h<u.length;h++){var b=u[h],y=s[b.toLowerCase()];y&&(w?v.push(y):h===0?m=y:v.push(y))}(m||v.length>0)&&(_.assignments[p]={primary:m,helpers:v})}}gwp_rota_rows.push(_),i++}}}gwp_rota_rows.sort(function(g,x){return g.date.localeCompare(x.date)}),gwp_rota_rendertable(),gwp_toast("Imported "+i+" rows","tick")}function gwp_rota_parsedate(e){if(/^\d{4}-\d{2}-\d{2}$/.test(e))return e;var t=e.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/);if(t){var a=t[1].padStart(2,"0"),s=t[2].padStart(2,"0");return t[3]+"-"+s+"-"+a}if(t=e.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/),t){var a=t[1].padStart(2,"0"),s=t[2].padStart(2,"0");return t[3]+"-"+s+"-"+a}var i=new Date(e);return isNaN(i.getTime())?null:i.toISOString().split("T")[0]}function gwp_rota_exportical(){for(var e=`BEGIN:VCALENDAR 12VERSION:2.0 13PRODID:-//Rota System//EN 14`,t=0;t<gwp_rota_rows.length;t++){var a=gwp_rota_rows[t];if(!a.isBreak)for(var s=a.date.replace(/-/g,""),i=0;i<gwp_rota_columns.length;i++){var o=gwp_rota_columns[i];if(!(o.category==="custom"||o.hidden)){var r=a.assignments&&a.assignments[o.id];if(!(!r||!r.primary)){var l=gwp_rota_people.find(function(d){return d.id===r.primary});l&&(e+=`BEGIN:VEVENT 15`,e+="DTSTART;VALUE=DATE:"+s+` 16`,e+="DTEND;VALUE=DATE:"+s+` 17`,e+="SUMMARY:"+o.name+" - "+l.name+` 18`,e+="DESCRIPTION:"+l.name+" assigned to "+o.name+(a.label?" ("+a.label+")":"")+` 19`,e+="UID:"+a.id+"-"+o.id+`@rota 20`,e+=`END:VEVENT 21`)}}}}e+="END:VCALENDAR";var n=new Blob([e],{type:"text/calendar"}),_=URL.createObjectURL(n),p=document.createElement("a");p.href=_,p.download=(gwp_rota_config.title||"rota")+".ics",p.click(),URL.revokeObjectURL(_)}function gwp_rota_print(){var e="<html><head><title>"+(gwp_rota_config.title||"Rota")+"</title>";if(e+="<style>",e+="body { font-family: Arial, sans-serif; font-size: 12px; }",e+="h1 { font-size: 18px; margin-bottom: 5px; }",e+="h2 { font-size: 14px; margin-bottom: 10px; color: #666; font-weight: normal; }",e+="table { width: 100%; border-collapse: collapse; }",e+="th, td { border: 1px solid #ccc; padding: 6px 8px; text-align: left; }",e+="th { background: #f0f0f0; font-weight: bold; }",e+="tr:nth-child(even) td { background: #f9f9f9; }",e+=".helper { font-size: 10px; color: #666; }",e+="</style></head><body>",e+="<h1>"+gwp_escapeHtml(gwp_rota_config.title||"Rota")+"</h1>",e+="<h2>"+(gwp_rota_viewmode==="person"?"Person View":"Date View")+"</h2>",gwp_rota_viewmode==="person"){e+="<table><thead><tr><th>
21Person</th>";for(var t=0;t<gwp_rota_rows.length;t++)if(!gwp_rota_rows[t].isBreak){var a=new Date(gwp_rota_rows[t].date+"T00:00:00"),s=a.toLocaleDateString("en-GB",{day:"numeric",month:"short"});e+="<th>"+s+"</th>"}e+="</tr></thead><tbody>";for(var i=0;i<gwp_rota_people.length;i++){var o=gwp_rota_people[i];e+="<tr><td><b>"+gwp_escapeHtml(o.name)+"</b></td>";for(var t=0;t<gwp_rota_rows.length;t++){var r=gwp_rota_rows[t];if(!r.isBreak){for(var l=[],n=0;n<gwp_rota_columns.length;n++){var _=gwp_rota_columns[n];if(!(_.category==="custom"||_.hidden)){var p=r.assignments&&r.assignments[_.id];p&&(p.primary===o.id?l.push(gwp_escapeHtml(_.name)):p.helpers&&p.helpers.indexOf(o.id)>=0&&l.push('<span class="helper">'+gwp_escapeHtml(_.name)+" (helper)</span>"))}}e+="<td>"+l.join("<br>")+"</td>"}}e+="</tr>"}}else{e+="<table><thead><tr><th>Date</th>";for(var n=0;n<gwp_rota_columns.length;n++)gwp_rota_columns[n].category!=="custom"&&!gwp_rota_columns[n].hidden&&(e+="<th>"+gwp_escapeHtml(gwp_rota_columns[n].name)+"</th>");e+="</tr></thead><tbody>";for(var t=0;t<gwp_rota_rows.length;t++){var r=gwp_rota_rows[t],a=new Date(r.date+"T00:00:00"),s=a.toLocaleDateString("en-GB",{weekday:"short",day:"numeric",month:"short"});if(r.isBreak){var d=gwp_rota_columns.filter(function(b){return b.category!=="custom"&&!b.hidden}).length;e+='<tr><td colspan="'+(d+1)+'" style="background:#f0f0f0;text-align:center;font-weight:600;font-style:italic;padding:10px;color:#555;">'+gwp_escapeHtml(r.breaktext||"Break")+"</td></tr>";continue}e+="<tr><td>"+s+(r.label?"<br><small>"+gwp_escapeHtml(r.label)+"</small>":"")+"</td>";for(var n=0;n<gwp_rota_columns.length;n++){var _=gwp_rota_columns[n];if(!(_.category==="custom"||_.hidden)){var p=r.assignments&&r.assignments[_.id],c="";if(p&&p.primary){var o=gwp_rota_people.find(function(S){return S.id===p.primary});if(c=o?gwp_escapeHtml(o.name):"",p.helpers&&p.helpers.length>0){var f=p.helpers.map(function(S){var E=gwp_rota_people.find(function(T){return T.id===S});return E?gwp_escapeHtml(E.name):""}).filter(function(S){return S});f.length>0&&(c+='<br><span class="helper">+ '+f.join(", ")+"</span>")}}e+="<td>"+c+"</td>"}}e+="</tr>"}}e+="</tbody></table></body></html>";var u=window.open("","_blank");u.document.write(e),u.document.close(),u.print()}document.addEventListener("keydown",function(e){var t=document.getElementById("gwp_addrota");!t||t.style.display==="none"||(e.ctrlKey&&e.key==="z"&&(e.preventDefault(),gwp_rota_undo()),e.ctrlKey&&e.key==="y"&&(e.preventDefault(),gwp_rota_redo()),e.ctrlKey&&e.key==="s"&&(e.preventDefault(),gwp_saverota()))});function gwp_rota_renderassignment(e,t){var a='<div class="gwp_rota_assignment">';if(t.category==="custom"){var s=e.value;if(t.fieldtype==="checkbox")a+='<div class="gwp_rota_custom_value">',a+=s?'<i class="las la-check-square" style="color:#28a745;font-size:18px;"></i>':'<i class="las la-square" style="color:#ccc;font-size:18px;"></i>',a+="</div>";else if(s&&s.length>0)if(Array.isArray(s))a+='<div class="gwp_rota_custom_value">'+s.map(function(u){return gwp_escapeHtml(u)}).join(", ")+"</div>";else{var i=s.length>50?s.substring(0,50)+"...":s;a+='<div class="gwp_rota_custom_value">'+gwp_escapeHtml(i)+"</div>"}else a+='<div class="gwp_rota_unassigned">+ Add</div>';return a+="</div>",a}var o=e.primary&&e.primary.length>0,r=e.helpers&&e.helpers.length>0;if(!o&&!r)a+='<div class="gwp_rota_unassigned">+ Assign</div>';else{if(t.type==="team"){if(r)for(var l=0;l<e.helpers.length;l++){var n=gwp_rota_getperson(e.helpers[l]),_=n?n.name:"Unknown";a+='<div class="gwp_rota_person_team">'+gwp_escapeHtml(_)+"</div>"}}else{if(o){var p=gwp_rota_getperson(e.primary),d=p?p.name:"Unknown";a+='<div class="gwp_rota_person_primary">',t.type==="multi"&&(a+='<span class="gwp_rota_role_label">Lead</span>'),a+=gwp_escapeHtml(d)+"</div>"}if(r)for(var l=0;l<e.helpers.length;l++){var c=gwp_rota_getperson(e.helpers[l]),f=c?c.name:"Unknown";a+='<div class="gwp_rota_person_helper"><span class="gwp_rota_role_label">Helper</span>'+gwp_escapeHtml(f)+"</div>"}}t.enableNote&&e.note&&(a+='<div class="gwp_rota_assignment_note">'+gwp_escapeHtml(e.note)+"</div>")}return a+="</div>",a}function gwp_rota_getperson(e){return gwp_rota_people.find(function(t){return t.id===e})}function gwp_rota_rendersettings(){var e=document.getElementById("gwp_rota_settings_container");if(e){var t='<div class="gwp_rota_settings_section">';t+='<div class="gwp_rota_settings_title">Roles / Columns</div>',t+='<div class="gwp_rota_settings_desc">Define the roles that need to be filled on each date. Drag to reorder.</div>',t+='<div class="gwp_rota_columns_list" id="gwp_rota_columns_list">';
21for(var a=0;a<gwp_rota_columns.length;a++){var s=gwp_rota_columns[a];if(t+='<div class="gwp_rota_column_item" data-colid="'+s.id+'" data-colindex="'+a+'">',t+='<i class="las la-grip-lines gwp_rota_drag_handle"></i>',t+='<span class="gwp_rota_col_name">'+gwp_escapeHtml(s.name)+"</span>",s.category==="custom"){var i={text:"Text",textarea:"Text Area",select:"Dropdown",selectmulti:"Multi-Select",checkbox:"Checkbox"}[s.fieldtype]||s.fieldtype;t+='<span class="gwp_rota_col_type gwp_rota_col_custom"><i class="las la-font"></i> '+i+"</span>"}else{var o=s.type==="multi"?"Lead + Helpers":s.type==="team"?"Team":"Single person";t+='<span class="gwp_rota_col_type">'+o+"</span>",s.group&&(t+='<span class="gwp_rota_col_group"><i class="las la-users"></i> '+gwp_escapeHtml(s.group)+"</span>")}t+=`<i class="las la-pen" onclick="gwp_rota_editcolumn('`+s.id+`');"></i>`,t+='<i class="las '+(s.hidden?"la-eye-slash gwp_rota_col_hidden":"la-eye")+`" onclick="gwp_rota_togglecolumnvisibility('`+s.id+`');" title="`+(s.hidden?"Show column":"Hide column")+'"></i>',t+=`<i class="las la-trash" onclick="gwp_rota_deletecolumn('`+s.id+`');"></i>`,t+="</div>"}if(t+="</div>",t+='<button type="button" class="gwp_rota_add_column_btn" onclick="gwp_rota_addcolumn();"><i class="las la-plus"></i> Add Column</button>',t+="</div>",t+='<div class="gwp_rota_settings_section">',t+='<div class="gwp_rota_settings_title">Default Session Label</div>',t+='<input type="text" id="gwp_rota_default_label" class="gwp_input" value="'+gwp_escapeHtml(gwp_rota_config.defaultLabel||"")+'" placeholder="e.g. Morning Service" onchange="gwp_rota_config.defaultLabel = this.value; gwp_rota_autosave();">',t+="</div>",t+='<div class="gwp_rota_settings_section">',t+='<div class="gwp_rota_settings_title"><i class="las la-magic"></i> Auto-Fill</div>',t+='<div class="gwp_rota_settings_desc">Automatically assign people to roles using rotation rules.</div>',t+='<button type="button" class="gwp_rota_autofill_btn" onclick="gwp_rota_openautofill();"><i class="las la-magic"></i> Configure Auto-Fill</button>',gwp_rota_config.autofillRules&&gwp_rota_config.autofillRules.length>0){t+='<div class="gwp_rota_autofill_rules">';for(var r=0;r<gwp_rota_config.autofillRules.length;r++){var l=gwp_rota_config.autofillRules[r],s=gwp_rota_columns.find(function(d){return d.id===l.columnId}),n=s?s.name:"Unknown",_=l.people.map(function(d){var c=gwp_rota_people.find(function(f){return f.id===d});return c?c.name:"Unknown"}).join(", ");t+='<div class="gwp_rota_autofill_rule">',t+='<div class="gwp_rota_autofill_rule_info">',t+="<strong>"+gwp_escapeHtml(n)+"</strong>",t+='<span class="gwp_rota_autofill_rule_mode">'+(l.mode==="roundrobin"?"Round Robin":"Random")+"</span>",t+='<div class="gwp_rota_autofill_rule_people">'+gwp_escapeHtml(_)+"</div>",t+="</div>",t+='<i class="las la-pen" onclick="gwp_rota_editautofillrule('+r+');"></i>',t+='<i class="las la-trash" onclick="gwp_rota_deleteautofillrule('+r+');"></i>',t+="</div>"}t+="</div>",t+='<button type="button" class="gwp_rota_run_autofill_btn" onclick="gwp_rota_runautofill(-1);"><i class="las la-play"></i> Run All Auto-Fill Rules</button>'}t+="</div>",t+='<div class="gwp_rota_settings_section">',t+='<div class="gwp_rota_settings_title">Rota Status</div>',t+='<div class="gwp_form_status_settings"><select id="gwp_rota_poststatus" class="select_inputframe" style="width:200px;" onchange="gwp_rota_autosave();"><option value="publish" selected>Published</option><option value="draft">Draft</option><option value="archive">Archived</option></select><p class="gwp_field_hint">Published: visible in lists. Archived: hidden unless \'Show archived\' is checked.</p></div>',t+="</div>",t+='<div class="gwp_rota_settings_section gwp_delete_section">',t+='<div class="gwp_rota_settings_title">Delete Rota</div>',t+='<button type="button" class="gwp_btn_danger gwp_delete_btn" onclick="gwp_deleterota();">',t+='<i class="las la-trash"></i> Delete Rota',t+="</button>",t+='<p class="gwp_delete_warning">This will permanently delete this rota and all its data.</p>',t+="</div>",e.innerHTML=t,gwp_rota_initcolumnsortable()}}function gwp_rota_initcolumnsortable(){typeof jQuery<"u"&&jQuery("#gwp_rota_columns_list").length?(jQuery("#gwp_rota_columns_list").sortable({axis:"y",handle:".gwp_rota_drag_handle",containment:"parent",tolerance:"pointer",update:function(e,t){gwp_rota_reordercolumns()}}),jQuery("#gwp_rota_columns_list").disableSelection()):typeof jQuery<"u"&&jQuery("#gwp_rota_columns_list").length&&(jQuery("#gwp_rota_columns_list").sortable({axis:"y",handle:".gwp_rota_drag_handle",containment:"parent",tolerance:"pointer",update:function(e,t){gwp_rota_reordercolumns()}}),jQuery("#gwp_rota_columns_list").disableSelection())}function gwp_rota_togglecolumnvisibility(e){for(var t=0;t<gwp_rota_columns.length;t++)if(gwp_rota_columns[t].id===e){gwp_rota_columns[t].hidden=!gwp_rota_columns[t].hidden;break}gwp_rota_rendersettings(),gwp_rota_rendertable(),gwp_rota_autosave()}function gwp_rota_getvisiblecolumns(){return gwp_rota_columns.filter(function(e){return!e.hidden})}function gwp_rota_reordercolumns(){for(var e=[],t=document.querySelectorAll("#gwp_rota_columns_list .gwp_rota_column_item"),a=0;a<t.length;a++){var s=t[a].getAttribute("data-colid"),i=gwp_rota_columns.find(function(o){return o.id===s});i&&e.push(i)}gwp_rota_columns=e,gwp_rota_rendertable(),gwp_rota_autosave()}function gwp_rota_addcolumn(){var e=document.getElementById("gwp_rota_column_modal");e&&e.remove();var t=document.createElement("div");t.id="gwp_rota_column_modal",t.className="gwp_sig_modal",t.innerHTML='<div class="gwp_sig_modal_content" style="max-width:500px;"><h3><i class="las la-columns"></i> Add Column</h3><div class="gwp_formfieldline"><div class="gwp_formfieldtitle">Column Name</div><input type="text" id="gwp_rota_col_name" class="gwp_input" placeholder="e.g. Worship Lead, Topic, Notes"></div><div class="gwp_formfieldline"><div class="gwp_formfieldtitle">Column Type</div><select id="gwp_rota_col_category" class="gwp_input" onchange="gwp_rota_columntypechange();"><option value="person">Person Assignment</option><option value="custom">Custom Field</option></select></div><div id="gwp_rota_col_person_options"><div class="gwp_formfieldline"><div class="gwp_formfieldtitle">Assignment Type</div><select id="gwp_rota_col_type" class="gwp_input"><option value="single">Single person</option><option value="multi">Lead + Helpers</option><option value="team">Team (multiple people)</option></select></div><div class="gwp_formfieldline"><div class="gwp_formfieldtitle">Restrict to Group (optional)</div><div id="gwp_rota_col_group" class="select_singleframe" empty-text="All people"></div></div><div class="gwp_formfieldline"><label class="gwp_rota_checkbox_label"><input type="checkbox" id="gwp_rota_col_enablenote"> Enable description field</label></div></div><div id="gwp_rota_col_custom_options" style="display:none;"><div class="gwp_formfieldline"><div class="gwp_formfieldtitle">Field Type</div><select id="gwp_rota_col_fieldtype" class="gwp_input" onchange="gwp_rota_fieldtypechange();"><option value="text">Text (single line)</option><option value="textarea">Text (multi-line)</option><option value="select">Dropdown (single choice)</option><option value="selectmulti">Dropdown (multiple choice)</option><option value="checkbox">Checkbox</option></select></div><div id="gwp_rota_col_options_wrap" style="display:none;"><div class="gwp_formfieldline"><div class="gwp_formfieldtitle">Options (one per line)</div><textarea id="gwp_rota_col_options" class="gwp_input" rows="4" placeholder="Option 1 Option 2 Option 3"></textarea></div></div><div class="gwp_formfieldline"><label class="gwp_rota_checkbox_label"><input type="checkbox" id="gwp_rota_col_highlight_empty"> Include in "Show Empty" highlighting</label></div></div><div class="gwp_sig_modal_buttons"><button type="button" class="gwp_btn_secondary" onclick="gwp_rota_closecolumnmodal();">Cancel</button><button type="button" class="gwp_btn_primary" onclick="gwp_rota_savecolumn();"><i class="las la-check"></i> Add Column</button></div></div>',document.body.appendChild(t),document.getElementById("gwp_rota_col_name").focus(),setTimeout(function(){typeof select_activate_single=="function"&&select_activate_single("gwp_rota_col_group"),typeof gwp_groupsarray<"u"&&gwp_groupsarray&&typeof select_addvalues=="function"&&select_addvalues(gwp_groupsarray,"gwp_rota_col_group",!0)},50)}function gwp_rota_columntypechange(){var e=document.getElementById("gwp_rota_col_category").value,t=document.getElementById("gwp_rota_col_person_options"),a=document.getElementById("gwp_rota_col_custom_options");e==="person"?(t.style.display="block",a.style.display="none"):(t.style.display="none",a.style.display="block",gwp_rota_fieldtypechange())}function gwp_rota_fieldtypechange(){var e=document.getElementById("gwp_rota_col_fieldtype").value,t=document.getElementById("gwp_rota_col_options_wrap");e==="select"||e==="selectmulti"?t.style.display="block":t.style.display="none"}function gwp_rota_editcolumn(e){var t=gwp_rota_columns.find(function(l){return l.id===e});if(t){var a=document.getElementById("gwp_rota_column_modal");a&&a.remove();var s=t.category==="custom",i=s&&(t.fieldtype==="select"||t.fieldtype==="selectmulti"),o=document.createElement("div");o.id="gwp_rota_column_modal",o.className="gwp_sig_modal";var r=t.highlightEmpty!==!1;o.innerHTML='<div class="gwp_sig_modal_content" style="max-width:500px;"><h3><i class="las la-columns"></i> Edit Column</h3><div class="gwp_formfieldline"><div class="gwp_formfieldtitle">Column Name</div><input type="text" id="gwp_rota_col_name" class="gwp_input" value="'+gwp_escapeHtml(t.name)+'"></div><div class="gwp_formfieldline"><div class="gwp_formfieldtitle">Column Type</div><select id="gwp_rota_col_category" class="gwp_input" onchange="gwp_rota_columntypechange();"><option value="person"'+(s?"":" selected")+'>Person Assignment</option><option value="custom"'+(s?" selected":"")+'>Custom Field</option></select></div><div id="gwp_rota_col_person_options" style="'+(s?"display:none;":"")+'"><div class="gwp_formfieldline"><div class="gwp_formfieldtitle">Assignment Type</div><select id="gwp_rota_col_type" class="gwp_input"><option value="single"'+(t.type==="single"?" selected":"")+'>Single person</option><option value="multi"'+(t.type==="multi"?" selected":"")+'>Lead + Helpers</option><option value="team"'+(t.type==="team"?" selected":"")+'>Team (multiple people)</option></select></div><div class="gwp_formfieldline"><div class="gwp_formfieldtitle">Restrict to Group (optional)</div><div id="gwp_rota_col_group" class="select_singleframe" empty-text="All people"></div></div><div class="gwp_formfieldline"><label class="gwp_rota_checkbox_label"><input type="checkbox" id="gwp_rota_col_enablenote"'+(t.enableNote?" checked":"")+'> Enable description field</label></div></div><div id="gwp_rota_col_custom_options" style="'+(s?"":"display:none;")+'"><div class="gwp_formfieldline"><div class="gwp_formfieldtitle">Field Type</div><select id="gwp_rota_col_fieldtype" class="gwp_input" onchange="gwp_rota_fieldtypechange();"><option value="text"'+(t.fieldtype==="text"?" selected":"")+'>Text (single line)</option><option value="textarea"'+(t.fieldtype==="textarea"?" selected":"")+'>Text (multi-line)</option><option value="select"'+(t.fieldtype==="select"?" selected":"")+'>Dropdown (single choice)</option><option value="selectmulti"'+(t.fieldtype==="selectmulti"?" selected":"")+'>Dropdown (multiple choice)</option><option value="checkbox"'+(t.fieldtype==="checkbox"?" selected":"")+'>Checkbox</option></select></div><div id="gwp_rota_col_options_wrap" style="'+(i?"":"display:none;")+'"><div class="gwp_formfieldline"><div class="gwp_formfieldtitle">Options (one per line)</div><textarea id="gwp_rota_col_options" class="gwp_input" rows="4" placeholder="Option 1 Option 2 Option 3">'+gwp_escapeHtml((t.options||[]).join(` 22`))+'</textarea></div></div><div class="gwp_formfieldline"><label class="gwp_rota_checkbox_label"><input type="checkbox" id="gwp_rota_col_highlight_empty"'+(r?" checked":"")+`> Include in "Show Empty" highlighting</label></div></div><div class="gwp_sig_modal_buttons"><button type="button" class="gwp_btn_secondary" onclick="gwp_rota_closecolumnmodal();">Cancel</button><button type="button" class="gwp_btn_primary" onclick="gwp_rota_savecolumn('`+e+`');"><i class="las la-check"></i> Save</button></div></div>`,document.body.appendChild(o),setTimeout(function(){typeof select_activate_single=="function"&&select_activate_single("gwp_rota_col_group"),typeof gwp_groupsarray<"u"&&gwp_groupsarray&&typeof select_addvalues=="function"&&select_addvalues(gwp_groupsarray,"gwp_rota_col_group",!0),t.group&&typeof select_additems=="function"&&select_additems([t.group],"gwp_rota_col_group")},50)}}function gwp_rota_closecolumnmodal(){var e=document.getElementById("gwp_rota_column_modal");e&&e.remove()}function gwp_rota_savecolumn(e){var t=document.getElementById("gwp_rota_col_name").value.trim(),a=document.getElementById("gwp_rota_col_category").value;if(!t){Swal.fire("Missing Name","Please enter a column name.","warning");return}var s={id:e||"col_"+Date.now(),name:t,category:a};if(a==="person"){s.type=document.getElementById("gwp_rota_col_type").value;var i=[];try{i=select_getitems("gwp_rota_col_group")||[]}catch{}s.group=i.length>0?i[0]:null;var o=document.getElementById("gwp_rota_col_enablenote");s.enableNote=o?o.checked:!1,s.fieldtype=null,s.options=null,s.highlightEmpty=!0}else{s.type=null,s.group=null,s.fieldtype=document.getElementById("gwp_rota_col_fieldtype").value;var r=document.getElementById("gwp_rota_col_highlight_empty");if(s.highlightEmpty=r?r.checked:!1,s.fieldtype==="select"||s.fieldtype==="selectmulti"){var l=document.getElementById("gwp_rota_col_options").value.trim();s.options=l?l.split(` 23`).map(function(_){return _.trim()}).filter(function(_){return _}):[]}else s.options=null}if(e){for(var n=0;n<gwp_rota_columns.length;n++)if(gwp_rota_columns[n].id===e){gwp_rota_columns[n]=s;break}}else gwp_rota_columns.push(s);gwp_rota_closecolumnmodal(),gwp_rota_rendersettings(),gwp_rota_rendertable(),gwp_rota_autosave()}function gwp_rota_deletecolumn(e){Swal.fire({title:"Delete Role?",text:"This will remove the role and all assignments.",icon:"warning",showCancelButton:!0,confirmButtonColor:"#DD6B55",confirmButtonText:"Yes, delete"}).then(t=>{if(t.isConfirmed){gwp_rota_columns=gwp_rota_columns.filter(function(s){return s.id!==e});for(var a=0;a<gwp_rota_rows.length;a++)gwp_rota_rows[a].assignments&&gwp_rota_rows[a].assignments[e]&&delete gwp_rota_rows[a].assignments[e];gwp_rota_rendersettings(),gwp_rota_rendertable(),gwp_rota_autosave()}})}function gwp_rota_renderpeople(){var e=document.getElementById("gwp_rota_people_container");if(e){for(var t={},a=0;a<gwp_rota_people.length;a++)t[gwp_rota_people[a].id]={total:0,lead:0,helper:0,roles:{}};for(var s=0;s<gwp_rota_rows.length;s++){var i=gwp_rota_rows[s];if(!(!i.assignments||i.isBreak))for(var o=0;o<gwp_rota_columns.length;o++){var r=gwp_rota_columns[o];if(!(r.category==="custom"||r.hidden)){var l=i.assignments[r.id];if(l&&(l.primary&&t[l.primary]&&(t[l.primary].total++,t[l.primary].lead++,t[l.primary].roles[r.name]=(t[l.primary].roles[r.name]||0)+1),l.helpers))for(var n=0;n<l.helpers.length;n++){var _=l.helpers[n];t[_]&&(t[_].total++,t[_].helper++,t[_].roles[r.name]=(t[_].roles[r.name]||0)+1)}}}}var p='<div class="gwp_rota_people_toolbar">';if(p+='<button type="button" class="gwp_save_button" onclick="gwp_rota_addperson();"><i class="las la-user-plus"></i> Add Person</button>',p+='<button type="button" class="gwp_close_button" onclick="gwp_rota_addusers();"><i class="las la-users"></i> Add Users</button>',p+='<button type="button" class="gwp_close_button" onclick="gwp_rota_opensyncmodal();"><i class="las la-sync"></i> Sync People</button>',p+="</div>",gwp_rota_people.length===0){p+='<div class="gwp_rota_empty"><i class="las la-users"></i><p>No people added yet.</p><p>
23Add people manually, from your directory, or sync from groups.</p></div>',e.innerHTML=p;return}var d=gwp_rota_people.slice().sort(function(v,w){return(t[w.id].total||0)-(t[v.id].total||0)});p+='<div class="gwp_rota_people_list">';for(var a=0;a<d.length;a++){var c=d[a],f=t[c.id]||{total:0,lead:0,helper:0,roles:{}};p+='<div class="gwp_rota_person_card">',p+='<div class="gwp_rota_person_info">',p+='<span class="gwp_rota_person_name">'+gwp_escapeHtml(c.name)+"</span>",c.source==="group"&&(p+='<span class="gwp_reg_member_badge_group" title="Synced from group"><i class="las la-users"></i></span>'),c.email&&(p+='<span class="gwp_rota_person_email">'+gwp_escapeHtml(c.email)+"</span>"),p+='<div class="gwp_rota_person_stats">',p+='<span class="gwp_rota_person_stat" title="Total assignments"><i class="las la-calendar-check"></i> '+f.total+"</span>",f.lead>0&&(p+='<span class="gwp_rota_person_stat gwp_rota_stat_lead" title="As lead"><i class="las la-star"></i> '+f.lead+"</span>"),f.helper>0&&(p+='<span class="gwp_rota_person_stat gwp_rota_stat_helper" title="As helper"><i class="las la-hands-helping"></i> '+f.helper+"</span>"),p+="</div>";var u=Object.keys(f.roles);if(u.length>0){p+='<div class="gwp_rota_person_roles">';for(var m=0;m<u.length;m++)p+='<span class="gwp_rota_person_role">'+gwp_escapeHtml(u[m])+": "+f.roles[u[m]]+"</span>";p+="</div>"}p+="</div>",p+=`<i class="las la-trash" onclick="gwp_rota_removeperson('`+c.id+`');"></i>`,p+="</div>"}p+="</div>",e.innerHTML=p}}function gwp_rota_addperson(){var e=document.getElementById("gwp_rota_person_modal");e&&e.remove();var t=document.createElement("div");t.id="gwp_rota_person_modal",t.className="gwp_sig_modal",t.innerHTML='<div class="gwp_sig_modal_content" style="max-width:480px;"><h3><i class="las la-user-plus"></i> Add New Person</h3><p style="font-size:12px;color:#888;margin:-8px 0 12px;">This creates a new contact in your membership directory and adds them to the rota.</p><div style="display:flex;gap:10px;"><div class="gwp_formfieldline" style="flex:1;"><div class="gwp_formfieldtitle">First Name *</div><input type="text" id="gwp_rota_person_fname" class="gwp_input" placeholder="First name"></div><div class="gwp_formfieldline" style="flex:1;"><div class="gwp_formfieldtitle">Last Name</div><input type="text" id="gwp_rota_person_lname" class="gwp_input" placeholder="Last name"></div></div><div class="gwp_formfieldline"><div class="gwp_formfieldtitle">Email</div><input type="email" id="gwp_rota_person_email" class="gwp_input" placeholder="[email protected]"></div><div class="gwp_formfieldline"><div class="gwp_formfieldtitle">Phone</div><input type="tel" id="gwp_rota_person_phone" class="gwp_input" placeholder="Phone number"></div><div class="gwp_formfieldline"><div class="gwp_formfieldtitle">Type</div><select id="gwp_rota_person_type" class="gwp_input"><option value="member">Member</option><option value="visitor">Visitor</option><option value="child">Child</option><option value="staff">Staff</option></select></div><div class="gwp_formfieldline"><div class="gwp_formfieldtitle">Groups</div><div id="gwp_rota_person_groups" class="select_multiframe" empty-text="No groups"></div></div><div class="gwp_sig_modal_buttons"><button type="button" class="gwp_btn_secondary" onclick="gwp_rota_closepersonmodal();">Cancel</button><button type="button" class="gwp_btn_primary" onclick="gwp_rota_saveperson();"><i class="las la-check"></i> Add Person</button></div></div>',document.body.appendChild(t),setTimeout(function(){typeof select_activate_multi=="function"&&select_activate_multi("gwp_rota_person_groups"),typeof gwp_groupsarray<"u"&&gwp_groupsarray&&typeof select_addvalues=="function"&&select_addvalues(gwp_groupsarray,"gwp_rota_person_groups",!0)},50),document.getElementById("gwp_rota_person_fname").focus()}function gwp_rota_closepersonmodal(){var e=document.getElementById("gwp_rota_person_modal");e&&e.remove()}function gwp_rota_saveperson(){var e=document.getElementById("gwp_rota_person_fname").value.trim(),t=document.getElementById("gwp_rota_person_lname").value.trim(),a=document.getElementById("gwp_rota_person_email").value.trim(),s=document.getElementById("gwp_rota_person_phone").value.trim(),i=document.getElementById("gwp_rota_person_type").value,o=[];try{o=select_getitems("gwp_rota_person_groups")||[]}catch{}if(!e){Swal.fire("Missing Name","Please enter a first name.","warning");return}var r=e+(t?" "+t:""),l=new FormData;l.append("gwp_wpid",gwp_wpid),l.append("gwp_apikey",gwp_apikey),l.append("gwp_action","create"),l.append("gwp_f
23irst_name",e),l.append("gwp_last_name",t),l.append("gwp_email",a),l.append("gwp_phone",s),l.append("gwp_contact_type",i),o.length>0&&l.append("gwp_groups",JSON.stringify(o));var n="person_"+Date.now()+"_"+Math.random().toString(36).substr(2,5);gwp_rota_people.push({id:n,name:r,email:a||null}),gwp_rota_closepersonmodal(),gwp_rota_renderpeople(),gwp_rota_autosave(),fetch(gwp_pluginurl+"save/savecontact.php",{method:"POST",body:l}).then(function(_){return _.json()}).then(function(_){if(_.gwp_authstatus==="authorised"&&_.contact_id){for(var p=0;p<gwp_rota_people.length;p++)if(gwp_rota_people[p].id===n){gwp_rota_people[p].contactId=_.contact_id;break}gwp_rota_autosave(),gwp_toast("Contact saved to directory.","tick")}}).catch(function(_){console.log("Contact save note:",_)}),gwp_toast(r+" added to rota.","success")}function gwp_rota_removeperson(e){Swal.fire({title:"Remove Person?",text:"This will also remove them from any rota assignments.",icon:"warning",showCancelButton:!0,confirmButtonColor:"#DD6B55",confirmButtonText:"Yes, remove"}).then(t=>{if(t.isConfirmed){gwp_rota_people=gwp_rota_people.filter(function(r){return r.id!==e});for(var a=0;a<gwp_rota_rows.length;a++){var s=gwp_rota_rows[a];if(s.assignments)for(var i in s.assignments){var o=s.assignments[i];o.primary===e&&(o.primary=null),o.helpers&&(o.helpers=o.helpers.filter(function(r){return r!==e}))}}gwp_rota_renderpeople(),gwp_rota_rendertable(),gwp_rota_autosave()}})}function gwp_rota_opensyncmodal(){var e=document.getElementById("gwp_rota_sync_modal");e&&e.remove();for(var t=[],a=0;a<gwp_rota_columns.length;a++)gwp_rota_columns[a].group&&t.push(gwp_rota_columns[a].name+" \u2192 "+gwp_rota_columns[a].group);var s=gwp_rota_config.linkedgroups||[],i="";if(typeof gwp_groupsarray<"u"&&gwp_groupsarray&&gwp_groupsarray.length>0)for(var o=0;o<gwp_groupsarray.length;o++){var r=gwp_groupsarray[o];typeof r=="object"&&(r=r.name||r[0]||r);var l=s.indexOf(r)!==-1;i+='<label class="gwp_rota_sync_grouplabel" style="display:flex;align-items:center;gap:6px;padding:6px 8px;border-radius:4px;cursor:pointer;">',i+='<input type="checkbox" class="gwp_rota_sync_groupcheck" value="'+gwp_escapeHtml(r)+'"'+(l?" checked":"")+">",i+="<span>"+gwp_escapeHtml(r)+"</span>",i+="</label>"}else i='<p style="color:#888;font-style:italic;">No groups available. Create groups first.</p>';var n=document.createElement("div");n.id="gwp_rota_sync_modal",n.className="gwp_sig_modal",n.innerHTML=`<div class="gwp_sig_modal_content" style="max-width:500px;"><h3><i class="las la-sync"></i> Sync People from Groups</h3><p style="font-size:12px;color:#888;margin:-8px 0 12px;">Select groups below. Everyone in these groups will be added to the rota's people list and available in all person columns. Columns restricted to a specific group will also auto-populate from that group when assigning.</p><div class="gwp_formfieldline"><div class="gwp_formfieldtitle"><i class="las la-link"></i> Linked Groups</div><div style="max-height:200px;overflow-y:auto;border:1px solid #ddd;border-radius:6px;padding:4px;">`+i+"</div></div>"+(t.length>0?'<div style="font-size:12px;color:#888;margin:8px 0;"><i class="las la-info-circle"></i> Column restrictions will also sync: '+t.map(function(_){return"<em>"+gwp_escapeHtml(_)+"</em>"}).join(", ")+"</div>":"")+'<div class="gwp_sig_modal_buttons"><button type="button" class="gwp_btn_secondary" onclick="gwp_rota_closesyncmodal();">Cancel</button><button type="button" class="gwp_btn_primary" onclick="gwp_rota_runsync();"><i class="las la-sync"></i> Sync Now</button></div></div>',document.body.appendChild(n)}function gwp_rota_closesyncmodal(){var e=document.getElementById("gwp_rota_sync_modal");e&&e.remove()}function gwp_rota_runsync(){for(var e=[],t=document.querySelectorAll(".gwp_rota_sync_groupcheck:checked"),a=0;a<t.length;a++)e.push(t[a].value);gwp_rota_config.linkedgroups=e.slice();for(var s=0;s<gwp_rota_columns.length;s++)gwp_rota_columns[s].group&&e.indexOf(gwp_rota_columns[s].group)===-1&&e.push(gwp_rota_columns[s].group);if(e.length===0){gwp_toast("No groups selected. Choose groups to sync from.","warning");return}gwp_rota_closesyncmodal(),gwp_rota_syncpeople(e)}function gwp_rota_syncpeople(e){if(!e){e=[],gwp_rota_config.linkedgroups&&(e=e.concat(gwp_rota_config.linkedgroups));for(var t=0;t<gwp_rota_columns.length;t++)gwp_rota_columns[t].group&&e.indexOf(gwp_rota_columns[t].group)===-1&&e.push(gwp_rota_columns[t].group);if(e.length===0)return}gwp_toast("Syncing people from groups...","info");for(var a=0,s=[],i=0;i<e.length;i++){var o=new FormData;o.append("gwp_group",e[i]),o.append("gwp_wpid",gwp_wpid),o.append("gwp_apikey",gwp_apikey),fetch(gwp_pluginurl+"data/getgroupmembers.php",{method:"POST",body:o}).then(function(r){return r.json()}).then(function(r){if(r.gwp_authstatus==="authorised"&&r.members)for(var l=0;l<r.members.length;l++){var n=r.members[l];s.some(function(_){return _.id===n.id})||s.push(n)}a++,a===e.length&&gwp_rota_applypeoplesync(s)}).catch(function(r){console.error("Group sync error:",r),a++,a===e.length&&gwp_rota_applypeoplesync(s)})}}function gwp_rota_applypeoplesync(e){for(var t=0,a=0;a<e.length;a++){var s=e[a],i=((s.first_name||"")+" "+(s.last_name||"")).trim()||"Contact "+s.id,o=s.email||"",r=gwp_rota_people.some(function(l){return!!(l.contactId&&l.contactId==s.id||l.email&&o&&l.email.toLowerCase()===o.toLowerCase()||l.name&&i&&l.name.toLowerCase()===i.toLowerCase())});r||(gwp_rota_people.push({id:"person_"+Date.now()+"_"+Math.random().toString(36).substr(2,5)+"_"+a,name:i,email:o||null,contactId:s.id,source:"group"}),t++)}gwp_rota_renderpeople(),gwp_rota_autosave(),t>0?gwp_toast(t+" people added from groups.","success"):gwp_toast("Already in sync \u2014 no new people to add.","success")}function gwp_rota_addusers(){Swal.fire({title:"Loading...",text:"Fetching contacts from directory...",icon:"info",showConfirmButton:!1});var e=new FormData;e.append("gwp_type","all"),e.append("gwp_perpage","500"),e.append("gwp_wpid",gwp_wpid),e.append("gwp_apikey",gwp_apikey),fetch(gwp_pluginurl+"data/contacts.php",{method:"POST",body:e}).then(function(t){return t.json()}).then(function(t){Swal.close(),t.gwp_authstatus==="authorised"&&t.contacts&&t.contacts.length>0?gwp_rota_showadduserspicker(t.contacts):Swal.fire("No Contacts","No contacts found in the membership directory.","info")}
23).catch(function(t){console.error("Add users error:",t),Swal.fire("Error","Could not fetch contacts.","error")})}function gwp_rota_showadduserspicker(e){var t=document.getElementById("gwp_rota_import_modal");t&&t.remove();var a='<div style="margin-bottom:10px;"><input type="text" id="gwp_rota_addusers_search" class="gwp_input" placeholder="Search by name or email..." oninput="gwp_rota_filteraddusers();"></div>';a+='<div id="gwp_rota_addusers_list" class="gwp_reg_import_list" style="max-height:350px;overflow-y:auto;">',a+='<div class="gwp_reg_import_selectall"><input type="checkbox" id="gwp_rota_import_all" onchange="gwp_rota_import_toggleall(this);"><label for="gwp_rota_import_all"><strong>Select All</strong></label></div>';for(var s=0;s<e.length;s++){var i=e[s],o=i.id,r=((i.first_name||"")+" "+(i.last_name||"")).trim()||i.name||"Contact "+o,l=i.email||"",n=i.type||"",_=gwp_rota_people.some(function(d){return!!(d.contactId&&d.contactId==o||d.email&&l&&d.email.toLowerCase()===l.toLowerCase()||d.name&&r&&d.name.toLowerCase()===r.toLowerCase())});a+='<div class="gwp_reg_import_item'+(_?" gwp_reg_import_disabled":"")+'" data-searchname="'+gwp_escapeHtml(r.toLowerCase())+'" data-searchemail="'+gwp_escapeHtml((l||"").toLowerCase())+'">',a+='<input type="checkbox" class="gwp_rota_import_check" id="gwp_rota_import_'+o+'" data-name="'+gwp_escapeHtml(r)+'" data-email="'+gwp_escapeHtml(l)+'" data-contactid="'+o+'"'+(_?" disabled checked":"")+">",a+='<label for="gwp_rota_import_'+o+'">'+gwp_escapeHtml(r),l&&(a+=' <span style="color:#888;font-size:12px;">('+gwp_escapeHtml(l)+")</span>"),n&&(a+=' <span style="background:#eee;color:#666;font-size:10px;padding:1px 6px;border-radius:3px;margin-left:4px;">'+gwp_escapeHtml(n)+"</span>"),_&&(a+=' <span class="gwp_reg_import_badge">Already added</span>'),a+="</label></div>"}
23a+="</div>";var p=document.createElement("div");p.id="gwp_rota_import_modal",p.className="gwp_sig_modal",p.innerHTML='<div class="gwp_sig_modal_content gwp_reg_import_modal"><h3><i class="las la-users"></i> Add Users from Directory</h3><p style="font-size:12px;color:#888;margin:-8px 0 12px;">Select people from your membership directory to add to this rota.</p>'+a+'<div class="gwp_sig_modal_buttons"><button type="button" class="gwp_btn_secondary" onclick="gwp_rota_closeimport();">Cancel</button><button type="button" class="gwp_btn_primary" onclick="gwp_rota_confirmimport();"><i class="las la-check"></i> Add Selected</button></div></div>',document.body.appendChild(p)}function gwp_rota_filteraddusers(){for(var e=(document.getElementById("gwp_rota_addusers_search").value||"").toLowerCase(),t=document.querySelectorAll("#gwp_rota_addusers_list .gwp_reg_import_item"),a=0;a<t.length;a++){var s=t[a].getAttribute("data-searchname")||"",i=t[a].getAttribute("data-searchemail")||"";t[a].style.display=!e||s.indexOf(e)!==-1||i.indexOf(e)!==-1?"":"none"}}function gwp_rota_import_toggleall(e){for(var t=document.querySelectorAll(".gwp_rota_import_check:not(:disabled)"),a=0;a<t.length;a++)t[a].checked=e.checked}function gwp_rota_closeimport(){var e=document.getElementById("gwp_rota_import_modal");e&&e.remove()}function gwp_rota_confirmimport(){for(var e=document.querySelectorAll(".gwp_rota_import_check:checked:not(:disabled)"),t=0,a=0;a<e.length;a++){var s=e[a],i={id:"person_"+Date.now()+"_"+Math.random().toString(36).substr(2,5)+"_"+a,name:s.getAttribute("data-name"),email:s.getAttribute("data-email")||null};s.getAttribute("data-contactid")&&(i.contactId=s.getAttribute("data-contactid")),gwp_rota_people.push(i),t++}gwp_rota_closeimport(),gwp_rota_renderpeople(),gwp_rota_autosave(),t>0&&gwp_toast(t+" people added to rota.","success")}function gwp_rota_adddates(){var e=document.getElementById("gwp_rota_dates_modal");e&&e.remove();var t=new Date().getFullYear(),a='<div class="gwp_rota_date_options">';a+=`<label class="gwp_rota_date_option selected" onclick="gwp_rota_selectdateoption('single', this);"><input type="radio" name="gwp_rota_date_type" value="single" checked><div class="gwp_rota_date_option_content"><div class="gwp_rota_date_option_title">Single Date</div><div class="gwp_rota_date_option_desc">Add one specific date</div></div></label>`,a+=`<label class="gwp_rota_date_option" onclick="gwp_rota_selectdateoption('sundays', this);"><input type="radio" name="gwp_rota_date_type" value="sundays"><div class="gwp_rota_date_option_content"><div class="gwp_rota_date_option_title">All Sundays</div><div class="gwp_rota_date_option_desc">Add all Sundays in a year</div></div></label>`,a+=`<label class="gwp_rota_date_option" onclick="gwp_rota_selectdateoption('weekday', this);"><input type="radio" name="gwp_rota_date_type" value="weekday"><div class="gwp_rota_date_option_content"><div class="gwp_rota_date_option_title">Specific Weekday</div><div class="gwp_rota_date_option_desc">Add every Monday, Tuesday, etc. in a year</div></div></label>`,a+=`<label class="gwp_rota_date_option" onclick="gwp_rota_selectdateoption('monthly', this);"><input type="radio" name="gwp_rota_date_type" value="monthly"><div class="gwp_rota_date_option_content"><div class="gwp_rota_date_option_title">Monthly Pattern</div><div class="gwp_rota_date_option_desc">E.g. 1st Sunday, 2nd Wednesday of each month</div></div></label>`,a+="</div>",a+='<div class="gwp_rota_date_config" id="gwp_rota_date_config">',a+='<label>Date</label><input type="date" id="gwp_rota_single_date">',a+='<label>Session Label (optional)</label><input type="text" id="gwp_rota_date_label" placeholder="e.g. Morning Service" value="'+gwp_escapeHtml(gwp_rota_config.defaultLabel||"")+'">',a+="</div>";var s=document.createElement("div");s.id="gwp_rota_dates_modal",s.className="gwp_sig_modal",s.innerHTML='<div class="gwp_sig_modal_content gwp_rota_dates_modal"><h3><i class="las la-calendar-plus"></i> Add Dates</h3>'+a+'<div class="gwp_sig_modal_buttons"><button type="button" class="gwp_btn_secondary" onclick="gwp_rota_closedatesmodal();">Cancel</button><button type="button" class="gwp_btn_primary" onclick="gwp_rota_confirmdates();"><i class="las la-check"></i> Add</button></div></div>',document.body.appendChild(s)}function gwp_rota_selectdateoption(e,t){for(var a=document.querySelectorAll(".gwp_rota_date_option"),s=0;s<a.length;s++)a[s].classList.remove("selected");t&&t.classList.add("selected");var i=new Date().getFullYear(),o="";e==="single"?o='<label>Date</label><input type="date" id="gwp_rota_single_date">':e==="sundays"?o='<label>Year</label><select id="gwp_rota_year"><option value="'+i+'">'+i+'</option><option value="'+(i+1)+'">'+(i+1)+'</option><option value="'+(i+2)+'">'+(i+2)+"</option></select>":e==="weekday"?(o='<label>Day of Week</label><select id="gwp_rota_weekday"><option value="0">Sunday</option><option value="1">Monday</option><option value="2">Tuesday</option><option value="3">Wednesday</option><option value="4">Thursday</option><option value="5">Friday</option><option value="6">Saturday</option></select>',o+='<label>Year</label><select id="gwp_rota_year"><option value="'+i+'">'+i+'</option><option value="'+(i+1)+'">'+(i+1)+"</option></select>"):e==="monthly"&&(o='<label>Week of Month</label><select id="gwp_rota_week"><option value="1">1st</option><option value="2">2nd</option><option value="3">3rd</option><option value="4">4th</option><option value="5">Last</option></select>',o+='<label>Day of Week</label><select id="gwp_rota_weekday"><option value="0">Sunday</option><option value="1">Monday</option><option value="2">Tuesday</option><option value="3">Wednesday</option><option value="4">Thursday</option><option value="5">Friday</option><option value="6">Saturday</option></select>',o+='<label>Year</label><select id="gwp_rota_year"><option value="'+i+'">'+i+'</option><option value="'+(i+1)+'">'+(i+1)+"</option></select>"),o+='<label>Session Label (optional)</label><input type="text" id="gwp_rota_date_label" placeholder="e.g. Morning Service" value="'+gwp_escapeHtml(gwp_rota_config.defaultLabel||"")+'">',document.getElementById("gwp_rota_date_config").innerHTML=o}function gwp_rota_closedatesmodal(){var e=document.getElementById("gwp_rota_dates_modal");e&&e.remove()}function gwp_rota_confirmdates(){var e=document.querySelector('input[name="gwp_rota_date_type"]:checked').value,t=document.getElementById("gwp_rota_date_label")?document.getElementById("gwp_rota_date_label").value.trim():"",a=[];if(e==="single"){var s=document.getElementById("gwp_rota_single_date").value;if(!s){Swal.fire("Missing Date","Please select a date.","warning");return}a.push(s)}else if(e==="sundays"){var i=parseInt(document.getElementById("gwp_rota_year").value);a=gwp_rota_getweekdaysinyear(i,0)}else if(e==="weekday"){var i=parseInt(document.getElementById("gwp_rota_year").value),o=parseInt(document.getElementById("gwp_rota_weekday").value);a=gwp_rota_getweekdaysinyear(i,o)}else if(e==="monthly"){var i=parseInt(document.getElementById("gwp_rota_year").value),o=parseInt(document.getElementById("gwp_rota_weekday").value),r=parseInt(document.getElementById("gwp_rota_week").value);a=gwp_rota_getnthweekdayinyear(i,o,r)}for(var l=0,n=0,_=gwp_rota_rows.map(function(c){return c.date}),p=0;p<a.length;p++)_.indexOf(a[p])===-1?(gwp_rota_rows.push({id:"row_"+Date.now()+"_"+p,date:a[p],label:t||null,assignments:{}}
23),l++):n++;gwp_rota_closedatesmodal(),gwp_rota_rendertable(),gwp_rota_autosave();var d=l+" date(s) added";n>0&&(d+=", "+n+" skipped (already exist)"),Swal.fire({title:"Done",text:d,icon:"success",timer:2e3,showConfirmButton:!1})}function gwp_rota_getweekdaysinyear(e,t){for(var a=[],s=new Date(e,0,1);s.getDay()!==t;)s.setDate(s.getDate()+1);for(;s.getFullYear()===e;)a.push(s.toISOString().split("T")[0]),s.setDate(s.getDate()+7);return a}function gwp_rota_getnthweekdayinyear(e,t,a){for(var s=[],i=0;i<12;i++){var o=gwp_rota_getnthweekdayinmonth(e,i,t,a);o&&s.push(o)}return s}function gwp_rota_getnthweekdayinmonth(e,t,a,s){if(s===5){for(var i=new Date(e,t+1,0);i.getDay()!==a;)i.setDate(i.getDate()-1);return i.toISOString().split("T")[0]}for(var o=new Date(e,t,1),r=0;o.getMonth()===t;){if(o.getDay()===a&&(r++,r===s))return o.toISOString().split("T")[0];o.setDate(o.getDate()+1)}return null}function gwp_rota_editrow(e){var t=gwp_rota_rows.find(function(o){return o.id===e});if(t){var a=document.getElementById("gwp_rota_editrow_modal");a&&a.remove();var s=t.isBreak||!1,i=document.createElement("div");i.id="gwp_rota_editrow_modal",i.className="gwp_sig_modal",i.innerHTML='<div class="gwp_sig_modal_content"><h3><i class="las la-edit"></i> Edit '+(s?"Break":"Date")+'</h3><div class="gwp_formfieldline"><div class="gwp_formfieldtitle">Break Row</div><label class="gwp_rota_break_toggle"><input type="checkbox" id="gwp_rota_editrow_isbreak" '+(s?"checked":"")+' onchange="gwp_rota_togglebreakfields();"> Mark as a break / holiday</label></div><div class="gwp_formfieldline"><div class="gwp_formfieldtitle">Date</div><input type="date" id="gwp_rota_editrow_date" class="gwp_input" value="'+t.date+'"></div><div class="gwp_formfieldline" id="gwp_rota_editrow_label_wrap" style="'+(s?"display:none":"")+'"><div class="gwp_formfieldtitle">Label (optional)</div><input type="text" id="gwp_rota_editrow_label" class="gwp_input" value="'+gwp_escapeHtml(t.label||"")+'" placeholder="e.g. Morning Service"></div><div class="gwp_formfieldline" id="gwp_rota_editrow_breaktext_wrap" style="'+(s?"":"display:none")+'"><div class="gwp_formfieldtitle">Break Text</div><input type="text" id="gwp_rota_editrow_breaktext" class="gwp_input" value="'+gwp_escapeHtml(t.breaktext||"")+`" placeholder="e.g. Summer Holidays"></div><div class="gwp_sig_modal_buttons"><button type="button" class="gwp_btn_secondary" onclick="document.getElementById('gwp_rota_editrow_modal').remove();">Cancel</button><button type="button" class="gwp_btn_primary" onclick="gwp_rota_saverow('`+e+`');"><i class="las la-check"></i> Save</button></div></div>`,document.body.appendChild(i)}}function gwp_rota_togglebreakfields(){var e=document.getElementById("gwp_rota_editrow_isbreak").checked;document.getElementById("gwp_rota_editrow_label_wrap").style.display=e?"none":"",document.getElementById("gwp_rota_editrow_breaktext_wrap").style.display=e?"":"none"}function gwp_rota_saverow(e){var t=document.getElementById("gwp_rota_editrow_date").value,a=document.getElementById("gwp_rota_editrow_label").value.trim(),s=document.getElementById("gwp_rota_editrow_isbreak").checked,i=document.getElementById("gwp_rota_editrow_breaktext").value.trim();if(!t){Swal.fire("Missing Date","Please select a date.","warning");return}if(s&&!i){Swal.fire("Missing Text","Please enter break text.","warning");return}for(var o=0;o<gwp_rota_rows.length;o++)if(gwp_rota_rows[o].id===e){gwp_rota_rows[o].date=t,s?(gwp_rota_rows[o].isBreak=!0,gwp_rota_rows[o].breaktext=i,gwp_rota_rows[o].label=null,gwp_rota_rows[o].assignments={}):(delete gwp_rota_rows[o].isBreak,delete gwp_rota_rows[o].breaktext,gwp_rota_rows[o].label=a||null);break}gwp_rota_savehistory(),document.getElementById("gwp_rota_editrow_modal").remove(),gwp_rota_rendertable(),gwp_rota_autosave()}function gwp_rota_insertbreak(e){var t=gwp_rota_rows.find(function(o){return o.id===e}),a=t?t.date:"",s=document.getElementById("gwp_rota_editrow_modal");s&&s.remove();var i=document.createElement("div");i.id="gwp_rota_editrow_modal",i.className="gwp_sig_modal",i.innerHTML='<div class="gwp_sig_modal_content"><h3><i class="las la-minus"></i> Insert Break</h3><div class="gwp_formfieldline"><div class="gwp_formfieldtitle">Date (for position)</div><input type="date" id="gwp_rota_break_date" class="gwp_input" value="'+a+`"></div><div class="gwp_formfieldline"><div class="gwp_formfieldtitle">Break Text</div><input type="text" id="gwp_rota_break_text" class="gwp_input" placeholder="e.g. Summer Holidays, Half Term"></div><div class="gwp_sig_modal_buttons"><button type="button" class="gwp_btn_secondary" onclick="document.getElementById('gwp_rota_editrow_modal').remove();">Cancel</button><button type="button" class="gwp_btn_primary" onclick="gwp_rota_confirminsertbreak();"><i class="las la-check"></i> Insert</button></div></div>`,document.body.appendChild(i),document.getElementById("gwp_rota_break_text").focus()}function gwp_rota_confirminsertbreak(){var e=document.getElementById("gwp_rota_break_date").value,t=document.getElementById("gwp_rota_break_text").value.trim();if(!e){Swal.fire("Missing Date","Please select a date.","warning");return}if(!t){Swal.fire("Missing Text","Please enter break text.","warning");return}gwp_rota_rows.push({id:"row_"+Date.now(),date:e,isBreak:!0,breaktext:t,label:null,assignments:{}}
23),gwp_rota_savehistory(),document.getElementById("gwp_rota_editrow_modal").remove(),gwp_rota_rendertable(),gwp_rota_autosave()}function gwp_rota_deleterow(e){Swal.fire({title:"Delete Row?",text:"This will remove this date and all its assignments.",icon:"warning",showCancelButton:!0,confirmButtonColor:"#DD6B55",confirmButtonText:"Yes, delete"}).then(t=>{t.isConfirmed&&(gwp_rota_rows=gwp_rota_rows.filter(function(a){return a.id!==e}),gwp_rota_savehistory(),gwp_rota_rendertable(),gwp_rota_autosave())})}function gwp_rota_editassignment(e,t){var a=gwp_rota_rows.find(function(c){return c.id===e}),s=gwp_rota_columns.find(function(c){return c.id===t});if(!(!a||!s)){var i=a.assignments&&a.assignments[t]||{primary:null,helpers:[],value:null},o=document.getElementById("gwp_rota_assign_modal");o&&o.remove();var r=new Date(a.date+"T00:00:00"),l=r.toLocaleDateString("en-GB",{weekday:"long",day:"numeric",month:"long"}),n='<p style="color:#666;margin-bottom:15px;">'+l+(a.label?" \u2014 "+gwp_escapeHtml(a.label):"")+"</p>";if(s.category==="custom"){var _="la-font";s.fieldtype==="checkbox"?_="la-check-square":s.fieldtype==="select"||s.fieldtype==="selectmulti"?_="la-list":s.fieldtype==="textarea"&&(_="la-align-left"),n+='<div class="gwp_rota_assign_section"><label class="gwp_rota_assign_label">'+gwp_escapeHtml(s.name)+"</label>",s.fieldtype==="text"?n+='<input type="text" id="gwp_rota_custom_value" class="gwp_input" value="'+gwp_escapeHtml(i.value||"")+'">':s.fieldtype==="textarea"?n+='<textarea id="gwp_rota_custom_value" class="gwp_input" rows="4">'+gwp_escapeHtml(i.value||"")+"</textarea>":s.fieldtype==="checkbox"?n+='<label style="display:flex;align-items:center;gap:8px;cursor:pointer;"><input type="checkbox" id="gwp_rota_custom_value"'+(i.value?" checked":"")+"> Yes</label>":s.fieldtype==="select"?n+='<div id="gwp_rota_custom_value" class="select_singleframe" empty-text="\u2014 Select \u2014"></div>':s.fieldtype==="selectmulti"&&(n+='<div id="gwp_rota_custom_value" class="select_multiframe" empty-text="Select options..."></div>'),n+="</div>";var d=document.createElement("div");d.id="gwp_rota_assign_modal",d.className="gwp_sig_modal",d.innerHTML='<div class="gwp_sig_modal_content gwp_rota_assign_modal"><h3><i class="las '+_+'"></i> '+gwp_escapeHtml(s.name)+"</h3>"+n+`<div class="gwp_sig_modal_buttons"><button type="button" class="gwp_close_button" onclick="gwp_rota_clearassignment('`+e+"', '"+t+`');"><i class="las la-times"></i> Clear</button><button type="button" class="gwp_btn_secondary" onclick="gwp_rota_closeassignmodal();">Cancel</button><button type="button" class="gwp_btn_primary" onclick="gwp_rota_savecustomfield('`+e+"', '"+t+"', '"+s.fieldtype+`');"><i class="las la-check"></i> Save</button></div></div>`,document.body.appendChild(d),(s.fieldtype==="select"||s.fieldtype==="selectmulti")&&setTimeout(function(){if(s.fieldtype==="select"?typeof select_activate_single=="function"&&select_activate_single("gwp_rota_custom_value"):typeof select_activate_multi=="function"&&select_activate_multi("gwp_rota_custom_value"),s.options&&s.options.length>0&&typeof select_addvalues=="function"&&select_addvalues(s.options,"gwp_rota_custom_value",!0),i.value&&typeof select_additems=="function"){var f=Array.isArray(i.value)?i.value:[i.value];select_additems(f,"gwp_rota_custom_value")}},100);return}if(s.type==="multi"?(n+='<div class="gwp_rota_assign_section"><label class="gwp_rota_assign_label">Lead</label>',n+='<div id="gwp_rota_assign_primary" class="select_singleframe" empty-text="\u2014 Select lead \u2014"></div>',n+="</div>",n+='<div class="gwp_rota_assign_section"><label class="gwp_rota_assign_label">Helpers</label>',n+='<div class="gwp_rota_settings_desc">Select additional helpers for this role.</div>',n+='<div id="gwp_rota_assign_helpers" class="select_multiframe" empty-text="Select helpers..."></div>',n+="</div>"):s.type==="team"?(n+='<div class="gwp_rota_assign_section"><label class="gwp_rota_assign_label">Team Members</label>',n+='<div class="gwp_rota_settings_desc">Select one or more people for this role.</div>',n+='<div id="gwp_rota_assign_team" class="select_multiframe" empty-text="Select people..."></div>',n+="</div>"):(n+='<div class="gwp_rota_assign_section"><label class="gwp_rota_assign_label">Assigned Person</label>',n+='<div id="gwp_rota_assign_primary" class="select_singleframe" empty-text="\u2014 Select person \u2014"></div>',n+="</div>"),s.enableNote){var p=i.note||"";n+='<div class="gwp_rota_note_field"><label class="gwp_rota_assign_label">Description</label>',n+='<input type="text" id="gwp_rota_assignment_note" class="gwp_input" placeholder="e.g. Talk on Jonah and the Whale" value="'+gwp_escapeHtml(p)+'">',n+="</div>"}var d=document.createElement("div");d.id="gwp_rota_assign_modal",d.className="gwp_sig_modal",d.innerHTML='<div class="gwp_sig_modal_content gwp_rota_assign_modal"><h3><i class="las la-user-check"></i> '+gwp_escapeHtml(s.name)+"</h3>"+n+`<div class="gwp_sig_modal_buttons"><button type="button" class="gwp_close_button" onclick="gwp_rota_clearassignment('`+e+"', '"+t+`');"><i class="las la-times"></i> Clear</button><button type="button" class="gwp_btn_secondary" onclick="gwp_rota_closeassignmodal();">Cancel</button><button type="button" class="gwp_btn_primary" onclick="gwp_rota_saveassignment('`+e+"', '"+t+"', '"+s.type+`');"><i class="las la-check"></i> Save</button></div></div>`,document.body.appendChild(d),setTimeout(function(){s.group?gwp_rota_loadgrouppeople(s.group,function(c){for(var f=[],u=0;u<c.length;u++){var m=c[u],v=((m.first_name||"")+" "+(m.last_name||"")).trim()||"Contact "+m.id,w=m.email||"",h=gwp_rota_people.find(function(y){return!!(y.contactId&&y.contactId==m.id||y.email&&w&&y.email.toLowerCase()===w.toLowerCase()||y.name&&v&&y.name.toLowerCase()===v.toLowerCase())});if(h)f.push(h);else{var b={id:"person_"+Date.now()+"_"+Math.random().toString(36).substr(2,5)+"_"+u,name:v,email:w||null,contactId:m.id,source:"group"};gwp_rota_people.push(b),f.push(b)}}gwp_rota_initassignselects(f,s,i)}):gwp_rota_initassignselects(gwp_rota_people,s,i)},100)}}function gwp_rota_loadgrouppeople(e,t){var a=new FormData;a.append("gwp_group",e),a.append("gwp_wpid",gwp_wpid),a.append("gwp_apikey",gwp_apikey),fetch(gwp_pluginurl+"data/getgroupmembers.php",{method:"POST",body:a}).then(function(s){return s.json()}).then(function(s){s.gwp_authstatus==="authorised"&&s.members?t(s.members):t([])}).catch(function(s){console.error("Group load error:",s),t([])})}function gwp_rota_initassignselects(e,t,a){var s=e.map(function(_){return _.name});if(t.type==="team"){typeof select_activate_multi=="function"&&select_activate_multi("gwp_rota_assign_team"),typeof select_addvalues=="function"&&select_addvalues(s,"gwp_rota_assign_team",!0);var i=[];if(a.helpers&&a.helpers.length>0)for(var o=0;o<a.helpers.length;o++){var r=e.find(function(_){return _.id===a.helpers[o]});r&&i.push(r.name)}i.length>0&&typeof select_additems=="function"&&select_additems(i,"gwp_rota_assign_team")}else{if(typeof select_activate_single=="function"&&select_activate_single("gwp_rota_assign_primary"),typeof select_addvalues=="function"&&select_addvalues(s,"gwp_rota_assign_primary",!0),a.primary&&typeof select_additems=="function"){var l=e.find(function(_){return _.id===a.primary});l&&select_additems([l.name],"gwp_rota_assign_primary")}if(t.type==="multi"&&(typeof select_activate_multi=="function"&&select_activate_multi("gwp_rota_assign_helpers"),typeof select_addvalues=="function"&&select_addvalues(s,"gwp_rota_assign_helpers",!0),a.helpers&&a.helpers.length>0&&typeof select_additems=="function")){var n=a.helpers.map(function(_){var p=e.find(function(d){return d.id===_});return p?p.name:null}).filter(function(_){return _});select_additems(n,"gwp_rota_assign_helpers")}}}function gwp_rota_savecustomfield(e,t,a){var s=null;if(a==="checkbox"){var i=document.getElementById("gwp_rota_custom_value");s=i?i.checked:!1}
23else if(a==="select"){if(typeof select_getitems=="function"){var o=select_getitems("gwp_rota_custom_value");s=o&&o[0]?o[0]:null}}else if(a==="selectmulti")typeof select_getitems=="function"&&(s=select_getitems("gwp_rota_custom_value")||[]);else if(a==="text"){var i=document.getElementById("gwp_rota_custom_value");s=i?i.value:null}else if(a==="textarea"){var i=document.getElementById("gwp_rota_custom_value");s=i?i.value:null}else{var i=document.getElementById("gwp_rota_custom_value");s=i&&(i.value||i.innerHTML)||null}for(var r=0;r<gwp_rota_rows.length;r++)if(gwp_rota_rows[r].id===e){gwp_rota_rows[r].assignments||(gwp_rota_rows[r].assignments={}),gwp_rota_rows[r].assignments[t]={value:s};break}gwp_rota_savehistory(),gwp_rota_closeassignmodal(),gwp_rota_rendertable(),gwp_saverota("silent")}function gwp_rota_closeassignmodal(){var e=document.getElementById("gwp_rota_assign_modal");e&&e.remove()}function gwp_rota_saveassignment(e,t,a){var s=null,i=[];if(a==="team"){var o=document.getElementById("gwp_rota_assign_team");if(o&&typeof select_getitems=="function"){var r=select_getitems("gwp_rota_assign_team");r&&r.length>0&&(i=r.map(function(k){var C=gwp_rota_people.find(function(H){return H.name===k});return C?C.id:null}).filter(function(k){return k}))}}else{if(typeof select_getitems=="function"){var l=select_getitems("gwp_rota_assign_primary");if(l&&l[0]){var n=gwp_rota_people.find(function(k){return k.name===l[0]});n&&(s=n.id)}}var _=document.getElementById("gwp_rota_assign_helpers");if(_&&typeof select_getitems=="function"){var p=select_getitems("gwp_rota_assign_helpers");p&&p.length>0&&(i=p.map(function(k){var C=gwp_rota_people.find(function(H){return H.name===k});return C?C.id:null}).filter(function(k){return k}))}}var d=[];s&&d.push({id:s,role:"lead"});for(var c=0;c<i.length;c++)d.push({id:i[c],role:a==="team"?"team":"helper"});if(d.length>0){var f=gwp_rota_rows.find(function(k){return k.id===e});if(f){for(var u=[],m=0;m<d.length;m++){for(var v=d[m],w=[],h=0;h<gwp_rota_columns.length;h++){var x=gwp_rota_columns[h];if(!(x.id===t||x.category==="custom")){var b=f.assignments&&f.assignments[x.id];b&&(b.primary===v.id&&w.push(x.name+" (lead)"),b.helpers&&b.helpers.indexOf(v.id)!==-1&&w.push(x.name+" (helper)"))}}if(w.length>0){var n=gwp_rota_people.find(function(C){return C.id===v.id}),y=n?n.name:"Someone";u.push(y+" is also assigned to: "+w.join(", "))}}u.length>0&&Swal.fire({title:"Conflict Warning",text:u.join(` 24 25`),icon:"warning",timer:4e3,showConfirmButton:!0})}}var g="",x=gwp_rota_columns.find(function(k){return k.id===t});if(x&&x.enableNote){var S=document.getElementById("gwp_rota_assignment_note");S&&(g=S.value.trim())}for(var E=0;E<gwp_rota_rows.length;E++)if(gwp_rota_rows[E].id===e){gwp_rota_rows[E].assignments||(gwp_rota_rows[E].assignments={});var T={primary:s,helpers:i};g&&(T.note=g),gwp_rota_rows[E].assignments[t]=T;break}gwp_rota_savehistory(),gwp_rota_closeassignmodal(),gwp_rota_rendertable(),gwp_saverota("silent")}function gwp_rota_clearassignment(e,t){for(var a=0;a<gwp_rota_rows.length;a++)if(gwp_rota_rows[a].id===e){gwp_rota_rows[a].assignments&&gwp_rota_rows[a].assignments[t]&&delete gwp_rota_rows[a].assignments[t];break}gwp_rota_savehistory(),gwp_rota_closeassignmodal(),gwp_rota_rendertable(),gwp_saverota("silent")}function gwp_rota_clearcolumn(e,t){for(var a=0,s=0;s<gwp_rota_rows.length;s++)if(gwp_rota_rows[s].assignments&&gwp_rota_rows[s].assignments[e]){var i=gwp_rota_rows[s].assignments[e];(i.primary||i.value||i.helpers&&i.helpers.length>0)&&a++}if(a===0){Swal.fire("No Assignments",'There are no assignments in the "'+t+'" column to clear.',"info");return}Swal.fire({title:"Clear Column?",text:"This will remove all "+a+' assignment(s) from the "'+t+'" column.',icon:"warning",showCancelButton:!0,confirmButtonColor:"#DD6B55",confirmButtonText:"Yes, Clear All"}).then(o=>{if(o.isConfirmed){for(var r=0;r<gwp_rota_rows.length;r++)gwp_rota_rows[r].assignments&&gwp_rota_rows[r].assignments[e]&&delete gwp_rota_rows[r].assignments[e];gwp_rota_savehistory(),gwp_rota_rendertable(),gwp_saverota("silent"),Swal.fire("Cleared",'All assignments in "'+t+'" have been removed.',"success")}})}function gwp_rota_openautofill(e){var t=document.getElementById("gwp_rota_autofill_modal");t&&t.remove();var a=typeof e=="number",s=a&&gwp_rota_config.autofillRules?gwp_rota_config.autofillRules[e]:null,i=gwp_rota_columns.filter(function(l){return l.category!=="custom"}),o='<div class="gwp_rota_autofill_form">';o+='<div class="gwp_rota_assign_section">',o+='<label class="gwp_rota_assign_label">Role/Column</label>',o+='<div id="gwp_autofill_column" class="select_singleframe" empty-text="Select a role..."></div>',o+="</div>",o+='<div class="gwp_rota_assign_section">',o+='<label class="gwp_rota_assign_label">People to Rotate</label>',o+='<div class="gwp_rota_settings_desc">Select people who will be rotated for this role.</div>',o+='<div id="gwp_autofill_people" class="select_multiframe" empty-text="Select people..."></div>',o+="</div>",o+='<div class="gwp_rota_assign_section">',o+='<label class="gwp_rota_assign_label">Rotation Mode</label>',o+='<div class="gwp_rota_autofill_modes">',o+='<label class="gwp_rota_autofill_mode'+(!s||s.mode==="roundrobin"?" active":"")+'">',o+='<input type="radio" name="gwp_autofill_mode" value="roundrobin"'+(!s||s.mode==="roundrobin"?" checked":"")+">",o+='<i class="las la-sync-alt"></i> Round Robin',o+='<span class="gwp_rota_autofill_mode_desc">
25Rotate through people in order</span>',o+="</label>",o+='<label class="gwp_rota_autofill_mode'+(s&&s.mode==="balanced"?" active":"")+'">',o+='<input type="radio" name="gwp_autofill_mode" value="balanced"'+(s&&s.mode==="balanced"?" checked":"")+">",o+='<i class="las la-balance-scale"></i> Balanced',o+='<span class="gwp_rota_autofill_mode_desc">Assign to person with fewest slots</span>',o+="</label>",o+='<label class="gwp_rota_autofill_mode'+(s&&s.mode==="random"?" active":"")+'">',o+='<input type="radio" name="gwp_autofill_mode" value="random"'+(s&&s.mode==="random"?" checked":"")+">",o+='<i class="las la-random"></i> Random',o+='<span class="gwp_rota_autofill_mode_desc">Random selection each time</span>',o+="</label>",o+="</div>",o+="</div>",o+='<div class="gwp_rota_assign_section">',o+='<label class="gwp_rota_assign_label">Options</label>',o+='<label class="gwp_rota_checkbox_label"><input type="checkbox" id="gwp_autofill_skip_assigned"'+(s&&s.skipAssigned," checked")+"> Skip dates that already have assignments</label>",o+='<label class="gwp_rota_checkbox_label"><input type="checkbox" id="gwp_autofill_avoid_consecutive"'+(s&&s.avoidConsecutive?" checked":"")+"> Avoid assigning same person consecutive weeks</label>",o+="</div>",o+="</div>";var r=document.createElement("div");r.id="gwp_rota_autofill_modal",r.className="gwp_sig_modal",r.innerHTML='<div class="gwp_sig_modal_content gwp_rota_autofill_modal_content"><h3><i class="las la-magic"></i> '+(a?"Edit":"Add")+" Auto-Fill Rule</h3>"+o+'<div class="gwp_sig_modal_buttons"><button type="button" class="gwp_btn_secondary" onclick="gwp_rota_closeautofillmodal();">Cancel</button><button type="button" class="gwp_btn_primary" onclick="gwp_rota_saveautofillrule('+(a?e:-1)+');"><i class="las la-check"></i> Save Rule</button></div></div>',document.body.appendChild(r),setTimeout(function(){typeof select_activate_single=="function"&&select_activate_single("gwp_autofill_column"),typeof select_activate_multi=="function"&&select_activate_multi("gwp_autofill_people");var l=i.map(function(c){return c.name});typeof select_addvalues=="function"&&select_addvalues(l,"gwp_autofill_column",!0);var n=gwp_rota_people.map(function(c){return c.name});if(typeof select_addvalues=="function"&&select_addvalues(n,"gwp_autofill_people",!0),s){var _=gwp_rota_columns.find(function(c){return c.id===s.columnId});_&&typeof select_additems=="function"&&select_additems([_.name],"gwp_autofill_column");var p=s.people.map(function(c){var f=gwp_rota_people.find(function(u){return u.id===c});return f?f.name:null}).filter(function(c){return c});typeof select_additems=="function"&&select_additems(p,"gwp_autofill_people")}var d=document.querySelectorAll(".gwp_rota_autofill_mode");d.forEach(function(c){c.addEventListener("click",function(){d.forEach(function(f){f.classList.remove("active")}),this.classList.add("active")})})},100)}function gwp_rota_closeautofillmodal(){var e=document.getElementById("gwp_rota_autofill_modal");e&&e.remove()}function gwp_rota_editautofillrule(e){gwp_rota_openautofill(e)}function gwp_rota_deleteautofillrule(e){confirm("Delete this auto-fill rule?")&&gwp_rota_config.autofillRules&&(gwp_rota_config.autofillRules.splice(e,1),gwp_rota_rendersettings(),gwp_rota_autosave())}function gwp_rota_saveautofillrule(e){var t=typeof select_getitems=="function"?select_getitems("gwp_autofill_column"):[],a=t&&t[0]?t[0]:null;if(!a){Swal.fire("Error","Please select a role/column","error");return}var s=gwp_rota_columns.find(function(c){return c.name===a});if(!s){Swal.fire("Error","Invalid column selected","error");return}var i=typeof select_getitems=="function"?select_getitems("gwp_autofill_people"):[];if(!i||i.length===0){Swal.fire("Error","Please select at least one person","error");return}var o=i.map(function(c){var f=gwp_rota_people.find(function(u){return u.name===c});return f?f.id:null}).filter(function(c){return c});if(o.length===0){Swal.fire("Error","No valid people selected","error");return}var r=document.querySelector('input[name="gwp_autofill_mode"]:checked'),l=r?r.value:"roundrobin",n=document.getElementById("gwp_autofill_skip_assigned").checked,_=document.getElementById("gwp_autofill_avoid_consecutive").checked,p={columnId:s.id,people:o,mode:l,skipAssigned:n,avoidConsecutive:_,lastIndex:0};if(gwp_rota_config.autofillRules||(gwp_rota_config.autofillRules=[]),e>=0)gwp_rota_config.autofillRules[e]&&(p.lastIndex=gwp_rota_config.autofillRules[e].lastIndex||0),gwp_rota_config.autofillRules[e]=p;else{var d=gwp_rota_config.autofillRules.find(function(c){return c.columnId===s.id});if(d){Swal.fire("Error","An auto-fill rule already exists for this column. Please edit the existing rule instead.","error");return}gwp_rota_config.autofillRules.push(p)}gwp_rota_closeautofillmodal(),gwp_rota_rendersettings(),gwp_rota_autosave(),Swal.fire("Success","Auto-fill rule saved!","success")}function gwp_rota_showautofillmenu(e){var t=document.getElementById("gwp_rota_autofill_menu");if(t&&t.remove(),!(!gwp_rota_config.autofillRules||gwp_rota_config.autofillRules.length===0)){var a=document.createElement("div");a.id="gwp_rota_autofill_menu",a.className="gwp_rota_autofill_menu";for(var s='<div class="gwp_rota_autofill_menu_header">Run Auto-Fill for:</div>',i=0;i<gwp_rota_config.autofillRules.length;i++){var o=gwp_rota_config.autofillRules[i],r=gwp_rota_columns.find(function(p){return p.id===o.columnId}),l=r?r.name:"Unknown",n={roundrobin:"Round Robin",balanced:"Balanced",random:"Random"}[o.mode]||o.mode;s+='<div class="gwp_rota_autofill_menu_item" onclick="gwp_rota_runautofill('+i+'); gwp_rota_closeautofillmenu();">',s+='<i class="las la-play-circle"></i>',s+='<div class="gwp_rota_autofill_menu_item_info">',s+="<strong>"+gwp_escapeHtml(l)+"</strong>
25",s+="<span>"+n+"</span>",s+="</div>",s+="</div>"}s+='<div class="gwp_rota_autofill_menu_divider"></div>',s+='<div class="gwp_rota_autofill_menu_item gwp_rota_autofill_menu_all" onclick="gwp_rota_runautofill(-1); gwp_rota_closeautofillmenu();">',s+='<i class="las la-magic"></i>',s+='<div class="gwp_rota_autofill_menu_item_info">',s+="<strong>Run All Rules</strong>",s+="<span>Fill all "+gwp_rota_config.autofillRules.length+" roles</span>",s+="</div>",s+="</div>",s+='<div class="gwp_rota_autofill_menu_divider"></div>',s+='<div class="gwp_rota_autofill_menu_item gwp_rota_autofill_menu_config" onclick="gwp_rota_openautofill(); gwp_rota_closeautofillmenu();">',s+='<i class="las la-cog"></i>',s+='<div class="gwp_rota_autofill_menu_item_info">',s+="<strong>Add New Rule</strong>",s+="</div>",s+="</div>",a.innerHTML=s;var _=e.getBoundingClientRect();a.style.position="absolute",a.style.top=_.bottom+5+"px",a.style.left=_.left+"px",a.style.zIndex="10000",document.body.appendChild(a),setTimeout(function(){document.addEventListener("click",gwp_rota_closeautofillmenu_handler)},10)}}function gwp_rota_closeautofillmenu_handler(e){var t=document.getElementById("gwp_rota_autofill_menu");t&&!t.contains(e.target)&&gwp_rota_closeautofillmenu()}function gwp_rota_closeautofillmenu(){var e=document.getElementById("gwp_rota_autofill_menu");e&&e.remove(),document.removeEventListener("click",gwp_rota_closeautofillmenu_handler)}function gwp_rota_runautofill(e){if(!gwp_rota_config.autofillRules||gwp_rota_config.autofillRules.length===0){Swal.fire("No Rules","Please configure auto-fill rules first.","info");return}var t=0,a=0,s=gwp_rota_rows.slice().sort(function(b,y){return new Date(b.date)-new Date(y.date)}),i=[];typeof e=="number"&&e>=0?i=[gwp_rota_config.autofillRules[e]]:i=gwp_rota_config.autofillRules;for(var o=0;o<i.length;o++){var r=i[o];if(r){var l=gwp_rota_columns.find(function(b){return b.id===r.columnId});if(!(!l||l.category==="custom")){var n={};r.people.forEach(function(b){n[b]=0}),s.forEach(function(b){if(b.assignments&&b.assignments[r.columnId]){var y=b.assignments[r.columnId].primary;y&&n[y]!==void 0&&n[y]++}});for(var _=r.lastIndex||0,p=null,d=s.length-1;d>=0;d--){var c=s[d];if(c.assignments&&c.assignments[r.columnId]&&c.assignments[r.columnId].primary){p=c.assignments[r.columnId].primary;break}}for(var d=0;d<s.length;d++){var c=s[d];if(c.assignments||(c.assignments={}),r.skipAssigned&&c.assignments[r.columnId]&&c.assignments[r.columnId].primary){a++,p=c.assignments[r.columnId].primary;continue}var f=null;if(r.mode==="roundrobin"){for(var u=0;u<r.people.length;){var m=r.people[_%r.people.length];if(_++,r.avoidConsecutive&&m===p&&r.people.length>1){u++;continue}f=m;break}f||(f=r.people[0])}else if(r.mode==="balanced"){var v=1/0,w=[];r.people.forEach(function(g){n[g]<v?(v=n[g],w=[g]):n[g]===v&&w.push(g)}),r.avoidConsecutive&&w.length>1&&(w=w.filter(function(g){return g!==p})),f=w[Math.floor(Math.random()*w.length)]}else if(r.mode==="random"){var w=r.people.slice();r.avoidConsecutive&&w.length>1&&(w=w.filter(function(x){return x!==p})),f=w[Math.floor(Math.random()*w.length)]}f&&(c.assignments[r.columnId]={primary:f,helpers:[]},n[f]=(n[f]||0)+1,p=f,t++)}r.lastIndex=_}}}gwp_rota_rendertable(),gwp_saverota("silent");var h=`Auto-fill complete! 26 27Filled: `+t+" slots";a>0&&(h+=` 28Skipped: `+a+" (already assigned)"),Swal.fire("Auto-Fill Complete",h,"success")}function gwp_rota_emailweek(){for(var e=new Date,t=new Date(e.getTime()+10080*60*1e3),a=e.toISOString().split("T")[0],s=t.toISOString().split("T")[0],i={},o=0;o<gwp_rota_rows.length;o++){var r=gwp_rota_rows[o];if(r.date>=a&&r.date<=s){if(r.isBreak)continue;var l=new Date(r.date+"T00:00:00"),n=l.toLocaleDateString("en-GB",{weekday:"short",day:"numeric",month:"short"});for(var _ in r.assignments){var p=r.assignments[_],d=gwp_rota_columns.find(function(g){return g.id===_});if(d&&(p.primary&&(i[p.primary]||(i[p.primary]=[]),i[p.primary].push({date:n,role:d.name,type:"Lead"})),p.helpers))for(var c=0;c<p.helpers.length;c++)i[p.helpers[c]]||(i[p.helpers[c]]=[]),i[p.helpers[c]].push({date:n,role:d.name,type:"Helper"})}}}var f=Object.keys(i);if(f.length===0){Swal.fire("No Duties","No one is assigned to duties in the next 7 days.","info");return}var u=document.getElementById("gwp_rota_email_modal");u&&u.remove();var m='<p style="color:#666;margin-bottom:15px;">The following people have duties in the next 7 days:</p>';m+='<div class="gwp_rota_email_preview">';for(var v=0;v<f.length;v++){var w=f[v],h=gwp_rota_getperson(w);if(h){var b=i[w].map(function(g){return"<strong>"+g.date+"</strong>: "+g.role+" ("+g.type+")"}).join("<br>");m+='<div class="gwp_rota_email_recipient">',m+='<input type="checkbox" class="gwp_rota_email_check" data-personid="'+w+'"'+(h.email?" checked":" disabled")+">",m+='<div class="gwp_rota_email_recipient_info">',m+='<div class="gwp_rota_email_recipient_name">'+gwp_escapeHtml(h.name)+"</div>",m+='<div class="gwp_rota_email_recipient_email">'+(h.email?gwp_escapeHtml(h.email):"<em>No email address</em>")+"</div>",m+='<div class="gwp_rota_email_recipient_duties">'+b+"</div>",m+="</div></div>"}}m+="</div>",m+='<div class="gwp_rota_email_template">',m+="<label>Email Message</label>",m+=`<textarea id="gwp_rota_email_body">Hi {name}, 29 30This is a reminder of your upcoming duties: 31 32{duties} 33 34Please let us know if you have any questions or need to arrange a swap. 35 36Thank you!</textarea>`,m+='<div class="gwp_rota_email_vars">Variables: <code>{name}</code> <code>{duties}</code> <code>{email}</code></div>',m+="</div>";var y=document.createElement("div");y.id="gwp_rota_email_modal",y.className="gwp_sig_modal",y.innerHTML='<div class="gwp_sig_modal_content gwp_rota_email_modal"><h3><i class="las la-envelope"></i> Email Rota Reminders</h3>'+m+'<div class="gwp_sig_modal_buttons"><button type="button" class="gwp_btn_secondary" onclick="gwp_rota_closeemailmodal();">Cancel</button><button type="button" class="gwp_btn_primary" onclick="gwp_rota_sendemails();"><i class="las la-paper-plane"></i> Send Emails</button></div></div>',document.body.appendChild(y)}function gwp_rota_closeemailmodal(){var e=document.getElementById("gwp_rota_email_modal");e&&e.remove()}function gwp_rota_sendemails(){var e=document.querySelectorAll(".gwp_rota_email_check:checked");if(e.length===0){Swal.fire("No Recipients","Please select at least one person to email.","warning");return}for(var t=document.getElementById("gwp_rota_email_body").value,a=[],s=0;s<e.length;s++){var i=e[s].getAttribute("data-personid"),o=gwp_rota_getperson(i);o&&o.email&&a.push({id:i,name:o.name,email:o.email})}Swal.fire({title:"Feature Coming Soon",text:"Email sending will be connected to your email system. For now, "+a.length+" recipient(s) would receive the rota reminder.",icon:"info"}),gwp_rota_closeemailmodal()}function gwp_rota_export(){if(gwp_rota_rows.length===0){Swal.fire("No Data","No dates to export.","info");return}for(var e="Date,Label",t=0;t<gwp_rota_columns.length;t++)e+=',"'+gwp_rota_columns[t].name.replace(/"/g,'""')+'"';e+=`,Notes 37`;for(var a=0;a<gwp_rota_rows.length;a++){var s=gwp_rota_rows[a];if(s.isBreak){e+=s.date+',"BREAK: '+(s.breaktext||"").replace(/"/g,'""')+'"';for(var t=0;t<gwp_rota_columns.length;t++)e+=",";e+=`, 38`;continue}e+=s.date+',"'+(s.label||"").replace(/"/g,'""')+'"';for(var t=0;t<gwp_rota_columns.length;t++){var i=gwp_rota_columns[t],o=s.assignments&&s.assignments[i.id]||{};if(i.category==="custom"){var r=o.value;r==null&&(r=""),Array.isArray(r)&&(r=r.join("; ")),typeof r=="boolean"&&(r=r?"Yes":"No"),e+=',"'+String(r).replace(/"/g,'""')+'"';continue}var l=[];
38if(o.primary){var n=gwp_rota_getperson(o.primary);n&&l.push(n.name+(i.type==="multi"?" (Lead)":""))}if(o.helpers)for(var _=0;_<o.helpers.length;_++){var p=gwp_rota_getperson(o.helpers[_]);p&&l.push(p.name+(i.type==="multi"?" (Helper)":""))}e+=',"'+l.join("; ")+'"'}e+=',"'+(s.notes||"").replace(/"/g,'""')+'"',e+=` 39`}var d=new Blob([e],{type:"text/csv;charset=utf-8;"}),c=document.createElement("a");c.href=URL.createObjectURL(d),c.download=(gwp_rota_config.title||"rota")+"_export.csv",c.click(),URL.revokeObjectURL(c.href)}function gwp_rota_autosave(){gwp_rota_autosave_timer&&clearTimeout(gwp_rota_autosave_timer),gwp_rota_autosave_timer=setTimeout(function(){gwp_saverota("silent")},1e3)}function gwp_rota_viewpublic(){if(!gwp_currentrota){gwp_toast("Please save the rota first","error");return}var e=gwp_getPublicPageUrl("gwp_publicrotapage");if(!e){gwp_toast("Public rota page not configured in settings","error");return}var t=e+(e.indexOf("?")>-1?"&":"?")+"id="+gwp_currentrota;window.open(t,"_blank")}function gwp_rota_share(){if(!gwp_currentrota){gwp_toast("Please save the rota first","error");return}var e=gwp_getPublicPageUrl("gwp_publicrotapage");if(!e){gwp_toast("Public rota page not configured in settings","error");return}var t=e+(e.indexOf("?")>-1?"&":"?")+"id="+gwp_currentrota,a="gwp_rota_share_modal",s=document.getElementById(a);s&&s.remove();for(var i='<option value="">Everyone (no filter)</option>',o=gwp_rota_people||[],r=o.slice().sort(function(_,p){return(_.name||"").localeCompare(p.name||"")}),l=0;l<r.length;l++)i+='<option value="'+r[l].id+'">'+gwp_escapeHtml(r[l].name)+"</option>";var n=document.createElement("div");n.id=a,n.className="gwp_rota_modal_overlay",n.innerHTML=`<div class="gwp_rota_modal gwp_share_modal"><div class="gwp_rota_modal_header"><i class="las la-share-square"></i> Share Rota<span class="gwp_rota_modal_close" onclick="gwp_closesharemodal('`+a+`');">×</span></div><div class="gwp_rota_modal_body"><div class="gwp_rota_share_link_wrap"><input type="text" id="`+a+'_url" class="gwp_rota_share_input" value="'+t+`" readonly onclick="this.select();"><button type="button" class="gwp_save_button" onclick="gwp_copysharelink('`+a+`_url');"><i class="las la-copy"></i></button></div><div class="gwp_rota_share_buttons"><a id="`+a+'_open" href="'+t+'" target="_blank" class="gwp_rota_share_btn gwp_rota_share_btn_open"><i class="las la-external-link-alt"></i> Open</a><a id="'+a+'_email" href="mailto:?subject='+encodeURIComponent("Rota")+"&body="+encodeURIComponent("
39View here: "+t)+'" class="gwp_rota_share_btn"><i class="las la-envelope"></i> Email</a><a id="'+a+'_whatsapp" href="https://wa.me/?text='+encodeURIComponent("View Rota: "+t)+'" target="_blank" class="gwp_rota_share_btn"><i class="lab la-whatsapp"></i> WhatsApp</a></div><div class="gwp_share_advanced_toggle" onclick="gwp_rota_share_toggle_advanced();"><i class="las la-cog"></i> Advanced link options <i class="las la-chevron-down" id="'+a+'_chevron"></i></div><div class="gwp_share_advanced_panel" id="'+a+'_advanced" style="display:none;"><div class="gwp_share_adv_row"><label>Default view</label><select id="'+a+'_view" onchange="gwp_rota_share_buildurl();"><option value="">Default (full)</option><option value="full">Full table</option><option value="grid">Grid view</option><option value="person">By person</option><option value="date">By date</option></select></div><div class="gwp_share_adv_row"><label>Filter to member</label><select id="'+a+'_member" onchange="gwp_rota_share_buildurl();">'+i+'</select></div><div class="gwp_share_adv_row"><label>From date</label><input type="date" id="'+a+'_from" onchange="gwp_rota_share_buildurl();"></div><div class="gwp_share_adv_row"><label>To date</label><input type="date" id="'+a+'_to" onchange="gwp_rota_share_buildurl();"></div><div class="gwp_share_adv_row gwp_share_adv_row_check"><label><input type="checkbox" id="'+a+`_past" onchange="gwp_rota_share_buildurl();"> Include past dates</label></div><div class="gwp_share_adv_row gwp_share_adv_row_reset"><button type="button" class="gwp_close_button" onclick="gwp_rota_share_resetadvanced();"><i class="las la-undo"></i> Reset</button></div></div></div><div class="gwp_rota_modal_footer"><button type="button" class="gwp_close_button" onclick="gwp_closesharemodal('`+a+`');">Close</button></div></div>`,document.body.appendChild(n)}function gwp_rota_share_toggle_advanced(){var e=document.getElementById("gwp_rota_share_modal_advanced"),t=document.getElementById("gwp_rota_share_modal_chevron");e&&(e.style.display==="none"?(e.style.display="",t&&(t.className="las la-chevron-up")):(e.style.display="none",t&&(t.className="las la-chevron-down")))}function gwp_rota_share_buildurl(){var e="gwp_rota_share_modal",t=gwp_getPublicPageUrl("gwp_publicrotapage");if(t){var a=t+(t.indexOf("?")>-1?"&":"?")+"id="+gwp_currentrota,s=[],i=document.getElementById(e+"_view"),o=document.getElementById(e+"_member"),r=document.getElementById(e+"_from"),l=document.getElementById(e+"_to"),n=document.getElementById(e+"_past"),_=i?i.value:"",p=o?o.value:"",d=r?r.value:"",c=l?l.value:"",f=n?n.checked:!1;p&&!_&&(_="person",i&&(i.value="person")),_&&s.push("view="+_),p&&s.push("member="+encodeURIComponent(p)),d&&s.push("from="+d),c&&s.push("to="+c),f&&s.push("past=1");var u=a+(s.length?"&"+s.join("&"):""),m=document.getElementById(e+"_url");m&&(m.value=u);var v=document.getElementById(e+"_open");v&&(v.href=u);var w="Rota";if(p&&o){var h=o.options[o.selectedIndex];h&&(w=h.text+"'s Rota")}var b=document.getElementById(e+"_email");b&&(b.href="mailto:?subject="+encodeURIComponent(w)+"&body="+encodeURIComponent("
39View here: "+u));var y=document.getElementById(e+"_whatsapp");y&&(y.href="https://wa.me/?text="+encodeURIComponent("View "+w+": "+u))}}function gwp_rota_share_resetadvanced(){var e="gwp_rota_share_modal",t=document.getElementById(e+"_view"),a=document.getElementById(e+"_member"),s=document.getElementById(e+"_from"),i=document.getElementById(e+"_to"),o=document.getElementById(e+"_past");t&&(t.value=""),a&&(a.value=""),s&&(s.value=""),i&&(i.value=""),o&&(o.checked=!1),gwp_rota_share_buildurl()}function gwp_saverota(e){if(gwp_rotafirstload===!0)return;var t=document.getElementById("gwp_rota_postid"),a=t?t.value:"",s=!a||a==="",i=document.getElementById("gwp_addrotatitle"),o=i?i.innerText.trim():gwp_rota_config.title||"";(o==="New Rota"||o===""||o==="Rota")&&(o="Untitled Rota");var r=[];try{var l=select_getitems("gwp_rota_group_input");Array.isArray(l)?r=l:l&&typeof l=="string"&&(r=[l])}catch{}var n="";try{n=r.join(",")}catch{n=""}var _={columns:gwp_rota_columns,rows:gwp_rota_rows,people:gwp_rota_people,config:gwp_rota_config};function p(m){if(typeof m=="string")return m.replace(/\\/g,"\u2216").replace(/"/g,"\u201C");if(Array.isArray(m)){for(var v=0;v<m.length;v++)m[v]=p(m[v]);return m}if(m&&typeof m=="object")for(var w in m)m.hasOwnProperty(w)&&(m[w]=p(m[w]));return m}var d=JSON.parse(JSON.stringify(_));p(d);for(var c=0,f=0;f<gwp_rota_rows.length;f++)gwp_rota_rows[f].assignments&&(c+=Object.keys(gwp_rota_rows[f].assignments).length);var u=new FormData;u.append("gwp_rotaid",a),u.append("gwp_rotatitle",o),u.append("gwp_rotagroups",n),u.append("gwp_rotadata",JSON.stringify(d)),u.append("gwp_poststatus",(document.getElementById("gwp_rota_poststatus")&&document.getElementById("gwp_rota_poststatus").value)||"publish"),u.append("gwp_from",gwp_cuserid),u.append("gwp_wpid",gwp_wpid),u.append("gwp_apikey",gwp_apikey),fetch(gwp_pluginurl+"save/saverota.php",{method:"POST",body:u}).then(m=>m.json()).then(m=>{if(m.gwp_authstatus==="authorised"&&m.gwp_rotaid){var v=document.getElementById("gwp_rota_postid");if(v&&(v.value=m.gwp_rotaid),gwp_currentrota=m.gwp_rotaid,typeof gwp_posts<"u"&&gwp_posts){for(var w=0;w<gwp_posts.length;w++)if(gwp_posts[w].id==m.gwp_rotaid){gwp_posts[w].rota_data=_,gwp_posts[w].title=o;break}}e!=="silent"&&Swal.fire({title:"Saved",text:"Rota saved successfully",icon:"success",timer:1500,showConfirmButton:!1})}else e!=="silent"&&Swal.fire("Error","Error saving rota","error")}).catch(m=>{console.error("Save rota error:",m),e!=="silent"&&Swal.fire("Error","Error saving rota","error")})}function gwp_deleterota(){var e=document.getElementById("gwp_rota_postid")?document.getElementById("gwp_rota_postid").value:"";if(!e){Swal.fire("Nothing to Delete","No rota to delete","info");return}Swal.fire({title:"Delete Rota?",text:"This will permanently delete this rota and all its data. This cannot be undone.",icon:"warning",showCancelButton:!0,confirmButtonColor:"#DD6B55",confirmButtonText:"Yes, delete it"}).then(t=>{if(t.isConfirmed){var a=new FormData;a.append("gwp_postid",e),a.append("gwp_userid",gwp_cuserid),a.append("gwp_wpid",gwp_wpid),a.append("gwp_apikey",gwp_apikey),fetch(gwp_pluginurl+"php/deletepost.php",{method:"POST",body:a}).then(s=>s.json()).then(s=>{s.gwp_authstatus==="authorised"?(Swal.fire({title:"Deleted",text:"Rota has been deleted",icon:"success",timer:1500,showConfirmButton:!1}),gwp_currentrota=null,gwp_popup_close("gwp_addrota"),typeof gwp_refreshdatabaselist=="function"&&gwp_refreshdatabaselist()):Swal.fire("Error","Error deleting rota","error")}).catch(s=>{console.error("Delete rota error:",s),Swal.fire("Error","Error deleting rota","error")})}})}function gwp_clearrota(e){if(!e){gwp_rota_columns=[],gwp_rota_rows=[],gwp_rota_people=[],gwp_rota_config={},gwp_currentrota=null,gwp_rotafirstload=!0;var t=document.getElementById("gwp_rota_postid");if(t&&(t.value=""),typeof select_clear=="function")try{select_clear("gwp_rota_group_input")}catch{}var a=document.getElementById("gwp_rota_description_input");a&&(a.value="")}}
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.