// js/globals.js

Ext.BLANK_IMAGE_URL='ext/resources/images/default/s.gif';Ext.namespace('Gerards');Ext.namespace('Gerards.Membership');Ext.Msg.minWidth=300;Gerards.Membership.DateWidth=45;Gerards.Membership.NameWidth=75;Gerards.Membership.ItemWidth=100;Gerards.Membership.NumberWidth=30;function html_entity_unescape(str){if(str===null||str===''){return'';}
var temp=document.createElement("div");temp.innerHTML=str;var result=temp.childNodes[0].nodeValue;temp.removeChild(temp.firstChild);return result;}
function convert_date(str){if(str===null||str===''){return null;}
var values=str.split('-');var year=values[0];var month=values[1]-1;var day=values[2];return(new Date(year,month,day)).clearTime();}
function null_date_renderer(format){return function(v){if(v===null){return'-';}else{return Ext.util.Format.date(v,format);}};}
Ext.form.DateField.prototype.getSubmitValue=function(){var v=this.getValue();if(v!==''){var date=new Date(v);return date.format("Y-m-d");}
return v;};function convert_boolean(str){if(str===null||str===''){return false;}
if(str==='t'||str==='true'){return true;}
return false;}
function enable_button_if_dirty(store,button){if(store.getModifiedRecords().length>0){button.enable();}else{button.disable();}}
function store_load_exception(proxy,options,response,err,store){var response_data=Ext.util.JSON.decode(response.responseText);if(response_data.success===false){if(response_data.loggedin===false){Gerards.Membership.Login.login(false,function(success){if(success===false){window.location=window.location;}else{store.reload(options);}});}else{Gerards.Membership.Alert.msg(5,"Data Load Error","Reason: {0}",response_data.errors.reason);}}else if(err!==null){Gerards.Membership.Alert.msg(5,"Data Load Error","Reason: {0}",err.message);}else{Gerards.Membership.Alert.msg(5,"Data Load Error","Something strange happened.");}}
// js/membership.js

Gerards.Membership.UI=function()
{var HelpWindow;var AboutWindow;var MainPanel;var ContentPanel;var IntroPanel;var EventsPanel;var KitPanel;var PersonalPanel;var DocsPanel;var PostersPanel;var tb_help,tb_login,tb_register,tb_reset,tb_logout,tb_about,tb_changepw,tb_system,tb_membership,tb_form;function help_click(help_item)
{if(!HelpWindow){HelpWindow=new Ext.Window({title:'Help',cls:'cbox_content',width:600,height:300,autoScroll:true,html:"<h2>General Overview</h2><p style=\"margin-top: 20px;\">In brief, anyone can edit anything.</p><p>To add a new event or item of kit, click on the 'Add' button at the top of the relevant table.  To make a change to a particular detail, such as a name or a note, double-click the item.  When an item has a red triangle in the corner, it means it has been changed but not saved.  To save a change, click the 'Save Changes' button.</p><p>Any row can be deleted by selecting an item within it, and clicking the 'Delete Selected Row' button.  This will delete the row <em>immediately</em>.</p><p>Some tables have an email button.  Click on this to, for example, email the owner of a piece of kit, or all the attendees of an event.  A window will pop up with the recipient names, subject and a space for the message.  The list of names can not be edited.  Some names might be in the 'Not to' line, which indicates that their email address is not known by the system.  Write a message, and click 'Send'.  The email will be sent to all recipients with known addresses, and will appear to come from your own email address.</p><h2>Events</h2><p style=\"margin-top: 20px;\">Events listed here are <strong>automatically displayed on the public web site</strong>, on the Upcoming Events page, unless they are marked private.</p><p>To indicate whether you are planning to attend an event, first select that event by clicking anywhere on that row.  Then click 'Add Me' to add an entry for yourself, or 'Add Someone Else'.  The only difference between the two is that 'Add Me' automatically chooses your name from the list.  If the name you enter is already on the list for this event, the existing row will be automatically selected.</p><p>If you are bringing spare kit (not items you will be using yourself) then add them to the 'Spare Kit' table.  Similarly, items of kit you will need but don't have should be added to the 'Needed Kit' table.  The list of kit items still needed is calculated from these two tables.</p><h2>Regimental Kit</h2><p style=\"margin-top: 20px;\">Any items of regimental kit that you hold can be listed here.</p><h2>Personal Details</h2><p style=\"margin-top: 20px;\">In the top section, you can edit your name and screen name.  Enter the new values in the text boxes and click 'Update'.</p><p>The second and third sections contain your SK membership data.  You can update this, and whatever appears here will be used if you generate a rejoining form (with the 'Form' menu button above.)</p><p>In the second section, you can edit your full name as it appears on your rejoining form, your rank and arm of service, and your contact details.  If you update your address, the regimental membership secretary will be automatically informed by email.</p><p>The third section holds family relationships.  Any partner or children listed here will be entered on the generated form.</p><p>The fourth section displays the dates when your application form was received by the regimental membership secretary, when your cheque was presented to the bank, when your form was forwarded to the SK membership secretary, and when your new card was posted to you.</p><h2>Documents</h2><p style=\"margin-top: 20px;\">Click on a document for it to be downloaded as a PDF.  Note the sizes, some are rather large!</p><p style=\"margin-top: 20px;\">&nbsp;</p>",closeAction:'close',plain:true,minimizable:false,maximizable:false,constrainHeader:true,renderTo:MainPanel.body,listeners:{close:function(){HelpWindow=null;}}});}
HelpWindow.show(help_item);}
function about_click(about_item)
{if(!AboutWindow){var about_html="<p>Uses the Ext javascript widget kit, see <a href=\"http://www.extjs.com/\">http://www.extjs.com/</a> for details.</p>"+"<p>Uses some icons from the <a href=\"http://www.famfamfam.com/lab/icons/silk/\">FamFamFam Silk</a> collection.</p><p/><p>If you have any comments, bugs or problems please email <a href=\"mailto:roster@gerards.org.uk\">roster@gerards.org.uk</a>";AboutWindow=new Ext.Window({title:'About',cls:'cbox_content',width:700,height:300,autoScroll:true,html:about_html,closeAction:'close',plain:true,minimizable:false,maximizable:false,constrainHeader:true,renderTo:MainPanel.body,listeners:{close:function(){AboutWindow=null;}}});AboutWindow.show(about_item);}else{AboutWindow.show(about_item);}}
function login_callback(success)
{if(success){var users_ds=Gerards.Membership.Users.store();users_ds.reload();var kit_categories_ds=Gerards.Membership.KitCategories.store();kit_categories_ds.reload();var attending_ds=Gerards.Membership.Attending.store();attending_ds.reload();var rank_ds=Gerards.Membership.Rank.store();rank_ds.reload();var arm_ds=Gerards.Membership.Arm.store();arm_ds.reload();}
switch_ui(success);}
function switch_ui(logged_in)
{if(logged_in){tb_login.hide();tb_register.hide();tb_reset.hide();tb_logout.show();tb_about.show();tb_changepw.show();tb_form.show();if(Gerards.Membership.Login.has_priv_system()){tb_system.show();}
if(Gerards.Membership.Login.has_priv_membership()){tb_membership.show();}
EventsPanel.enable();KitPanel.enable();DocsPanel.enable();PostersPanel.enable();PersonalPanel.enable();ContentPanel.setActiveTab(EventsPanel);}else{tb_login.show();tb_register.show();tb_reset.show();tb_logout.hide();tb_about.hide();tb_changepw.hide();tb_system.hide();tb_membership.hide();tb_form.hide();EventsPanel.disable();KitPanel.disable();DocsPanel.disable();PostersPanel.disable();PersonalPanel.disable();ContentPanel.setActiveTab(IntroPanel);}}
function create_ui()
{var menu_tb;var menubar_panel;var viewport;Ext.QuickTips.init();tb_help=new Ext.Toolbar.Button({text:'Help',handler:help_click,hidden:false,tooltip:{text:'Get help',title:'Help'}});tb_login=new Ext.Toolbar.Button({text:'Login',handler:function(login_item){Gerards.Membership.Login.login(true,login_callback);},hidden:false,tooltip:{text:'Log In',title:'Login'}});tb_logout=new Ext.Toolbar.Button({text:'Logout',handler:function(logout_item){Gerards.Membership.Login.logout(function(success){if(success){switch_ui(false);}});},hidden:true,tooltip:{text:'Log Out',title:'Log Out'}});tb_register=new Ext.Toolbar.Button({text:'Register',handler:function(register_item){Gerards.Membership.Login.register(function(success){if(success){Gerards.Membership.Alert.msg(10,"Registration","Your registration request has been submitted for approval, and will be tended to imminently.");}});},hidden:false,tooltip:{text:'Submit a registration request',title:'Register'}});tb_reset=new Ext.Toolbar.Button({text:'Reset Password',handler:function(reset_item){Gerards.Membership.Login.reset(function(success){if(success){Gerards.Membership.Alert.msg(10,"Password Reset","A password reset link has been emailed to you.  Click on it to set a new password.");}});},hidden:false,tooltip:{text:'Submit a password reset request',title:'Reset Password'}});tb_changepw=new Ext.Toolbar.Button({text:'Change Password',handler:function(pwchange_item){Gerards.Membership.Login.changepw(function(success){if(success){Gerards.Membership.Alert.msg(5,"Password Change","Password was changed.");}});},hidden:true,tooltip:{text:'Change your password',title:'Change Password'}});tb_about=new Ext.Toolbar.Button({text:'About',handler:about_click,hidden:true,tooltip:{text:'Information about this application',title:'About'}});var system_menu=new Ext.menu.Menu({items:[{text:'System Privileges',listeners:{click:function(item,eventobject){Gerards.Membership.Admin.system_privileges();}},tooltip:{text:'Assign system privileges',title:'System Privileges'}},{text:'Pending Registrations',listeners:{click:function(item,eventobject){Gerards.Membership.Admin.pending_registrations();}},tooltip:{text:'Accept or reject pending registrations',title:'Pending Registrations'}}]});var membership_menu=new Ext.menu.Menu({items:[{text:'Edit Members',listeners:{click:function(item,eventobject){Gerards.Membership.Admin.edit_member();}},tooltip:{text:'Update details of members',title:'Edit Members'}},{text:'Non-rejoined Members',listeners:{click:function(item,eventobject){Gerards.Membership.Admin.nonrejoined_member();}},tooltip:{text:'List non-rejoined members',title:'Non-rejoined Members'}},{text:'Print Envelope',listeners:{click:function(item,eventobject){Gerards.Membership.Admin.print_envelope();}},tooltip:{text:'Print an envelope',title:'Print Envelope'}},{text:'Statistics',listeners:{click:function(item,eventobject){Gerards.Membership.Admin.statistics();}},tooltip:{text:'Some pretty diagrams',title:'Membership Statistics'}},{text:'Membership by Arm',listeners:{click:function(item,eventobject){Gerards.Membership.Admin.membership_by_arm();}},tooltip:{text:'Show members grouped by arm of service',title:'Membership by Arm'}}]});tb_system=new Ext.Toolbar.Button({text:'System',iconCls:'bmenu',menu:system_menu,hidden:true,tooltip:{text:'Do system admin tasks',title:'System Admin'}});tb_membership=new Ext.Toolbar.Button({text:'Membership',iconCls:'bmenu',menu:membership_menu,hidden:true,tooltip:{text:'Do membership admin tasks',title:'Membership Admin'}});tb_form=new Ext.Toolbar.Button({text:'Form',handler:function(){var month=(new Date()).getMonth();if(month>=7&&month<11){window.open('forms/renew.php');}else{window.open('forms/rejoin.php');}},hidden:true,tooltip:{text:'Generate a renewal/rejoining form',title:'Form'}});menu_tb=new Ext.Toolbar({items:[tb_help,tb_login,tb_logout,tb_register,tb_reset,tb_changepw,tb_form,tb_about,tb_membership,tb_system]});menubar_panel=new Ext.Panel({region:'north',collapsible:false,height:0,tbar:menu_tb});IntroPanel=new Ext.Panel({title:"Introduction",layout:'fit',autoScroll:true,cls:'cbox_content',html:"<p>If you've already registered, then click on the 'Login' button above to pop up the login form.</p>"+"<p>Otherwise, to register, click on the 'Register' button, and fill in the form.  You will receive an email at the address you gave when the registration has been processed.</p>"+"<img src='images/intro/register.png'/><br style='clear: both;'/>"+"<p>If you have forgotten your password, click on the 'Reset Password' button above.  When you fill in and submit the form, you will receive an email at the address "+"you registered previously.  This will contain a URL that you can click on to generate a new random password.</p>"+"<img src='images/intro/reset.png'/><br style='clear: both;'/>"+"<p>For assistance, please email <a href='mailto:roster@gerards.org.uk?subject=Assistance needed!'>roster@gerards.org.uk</a>.</p>"+"<br style='clear: both; margin-top: 1in;'/>&nbsp;"});EventsPanel=Gerards.Membership.Events.panel();KitPanel=Gerards.Membership.RegimentKit.panel();DocsPanel=Gerards.Membership.Documents.panel();PostersPanel=Gerards.Membership.Posters.panel();PersonalPanel=Gerards.Membership.Personal.panel();ContentPanel=new Ext.TabPanel({region:'center',activeTab:0,margins:'5 5 0 5',items:[IntroPanel,EventsPanel,KitPanel,DocsPanel,PostersPanel,PersonalPanel]});MainPanel=new Ext.Panel({layout:'border',region:'center',hideBorders:true,items:[ContentPanel]});viewport=new Ext.Viewport({layout:'border',hideBorders:true,items:[menubar_panel,MainPanel],renderTo:Ext.getBody()});}
return{init:function()
{create_ui();Gerards.Membership.Login.login(true,login_callback,false);}};}();Ext.onReady(Gerards.Membership.UI.init,Gerards.Membership.UI);
// js/alertbox.js

Gerards.Membership.Alert=function()
{var msgCt;function createBox(t,s)
{return['<div class="msg">','<div class="x-box-tl"><div class="x-box-tr"><div class="x-box-tc"></div></div></div>','<div class="x-box-ml"><div class="x-box-mr"><div class="x-box-mc"><h3>',t,'</h3>',s,'</div></div></div>','<div class="x-box-bl"><div class="x-box-br"><div class="x-box-bc"></div></div></div>','</div>'].join('');}
return{msg:function(timeout,title,format)
{if(!msgCt){msgCt=Ext.DomHelper.insertFirst(document.body,{id:'msg-div'},true);}
msgCt.alignTo(document,'tr-tr');var s=String.format.apply(String,Array.prototype.slice.call(arguments,2));var m=Ext.DomHelper.append(msgCt,{html:createBox(title,s)},true);m.slideIn('r').pause(timeout).ghost("l",{remove:true});}};}();
// js/checkcolumn.js

Ext.grid.CheckColumn=function(config){Ext.apply(this,config);if(!this.id){this.id=Ext.id();}
this.renderer=this.renderer.createDelegate(this);};Ext.grid.CheckColumn.prototype={init:function(grid){this.grid=grid;this.grid.on('render',function(){var view=this.grid.getView();view.mainBody.on('mousedown',this.onMouseDown,this);},this);},onMouseDown:function(e,t){if(t.className&&t.className.indexOf('x-grid3-cc-'+this.id)!==-1){e.stopEvent();var index=this.grid.getView().findRowIndex(t);var record=this.grid.store.getAt(index);record.set(this.dataIndex,!record.data[this.dataIndex]);}},renderer:function(v,p,record){p.css+=' x-grid3-check-col-td';return'<div class="x-grid3-check-col'+(v?'-on':'')+' x-grid3-cc-'+this.id+'">&#160;</div>';}};
// js/oosubmit.js

Ext.namespace("Ext.ux");Ext.ux.OOSubmitAction=function(form,options){Ext.ux.OOSubmitAction.superclass.constructor.call(this,form,options);};Ext.extend(Ext.ux.OOSubmitAction,Ext.form.Action.Submit,{type:'oosubmit',run:function(){var o=this.options;var method=this.getMethod();var isPost=method==='POST';var params=this.options.params||{};if(isPost){Ext.applyIf(params,this.form.baseParams);}
this.form.items.each(function(field)
{if(!field.disabled)
{if(typeof field.getSubmitValue==="function"){params[field.getName()]=field.getSubmitValue();}else{params[field.getName()]=field.getValue();}}});if(!isPost){params=Ext.urlEncode(params);}
if(o.clientValidation===false||this.form.isValid()){Ext.Ajax.request(Ext.apply(this.createCallback(o),{url:this.getUrl(!isPost),method:method,params:params,isUpload:this.form.fileUpload}));}else if(o.clientValidation!==false){this.failureType=Ext.form.Action.CLIENT_INVALID;this.form.afterAction(this,false);}}});Ext.form.Action.ACTION_TYPES['oosubmit']=Ext.ux.OOSubmitAction;
// js/login.js

Ext.apply(Ext.form.VTypes,{password:function(val,field){if(field.initialPassField){var pwd=Ext.getCmp(field.initialPassField);return(val===pwd.getValue());}
return true;},passwordText:'Passwords must match',sknum:function(val){var sknum_regex=/^([a-z]{3})\s*([0-9]{3})\s*-?\s*([0-9]{4})$/i;return sknum_regex.test(val);},sknumText:'This field should be in the format ABC 123-4567',sknumDummy:function(val){var sknum_regex=/^([a-z]{3})\s*([0-9]{3})\s*-?\s*([0-9]{4})$|^\*dummy-[0-9]+\*$/i;return sknum_regex.test(val);},sknumDummyText:'This field should be in the format ABC 123-4567, or *dummy-123*',email:function(val){var email_regex=/^([\w\-]+)(\.[\w\-]+)*(\+[\w\-]+)*@([\w\-]+\.){1,5}([A-Za-z]){2,4}$/;return email_regex.test(val);},emailMask:/[a-z0-9_\.\-@+]/i});Gerards.Membership.Login=function()
{var login_uid=0;var has_priv_system=false;var has_priv_membership=false;var has_priv_musket=false;function submit_login_form()
{if(!login_form.getForm().isValid()){return;}
login_form.getForm().submit({method:'POST',waitTitle:'Connecting',waitMsg:'Sending data...',success:function(form,action){login_uid=action.result.uid;has_priv_system=action.result.priv_system;has_priv_membership=action.result.priv_membership;has_priv_musket=action.result.priv_musket;login_win.hide();login_win.MemberCallback(true);login_win.MemberCallback=null;},failure:function(form,action){switch(action.failureType){case Ext.form.Action.CLIENT_INVALID:Ext.Msg.alert("Failure","Form fields may not be submitted with invalid values");break;case Ext.form.Action.CONNECT_FAILURE:Ext.Msg.alert("Failure","Authentication server is unreachable: "+action.response.responseText);break;case Ext.form.Action.SERVER_INVALID:Ext.Msg.alert("Login Failed!",action.result.errors.reason);break;}}});}
var login_form=new Ext.FormPanel({labelWidth:80,url:'ajax/login.php',frame:true,title:'Please Login',defaultType:'textfield',monitorValid:true,keys:[{key:[10,13],fn:submit_login_form}],items:[{fieldLabel:'Email',name:'email',vtype:'email',allowBlank:false},{fieldLabel:'Password',name:'password',inputType:'password',allowBlank:false}],buttons:[{text:'Login',formBind:true,handler:submit_login_form},{text:'Cancel',handler:function(){login_win.hide();login_win.MemberCallback(false);login_win.MemberCallback=null;}}]});var login_win=new Ext.Window({layout:'fit',width:300,height:150,closable:false,resizeable:false,plain:true,border:false,modal:true,constrainHeader:true,items:[login_form]});function show_login_window(callback)
{login_form.getForm().reset();login_win.show();login_win.MemberCallback=callback;}
function submit_register_form()
{if(!register_form.getForm().isValid()){return;}
register_form.getForm().submit({method:'POST',waitTitle:'Connecting',waitMsg:'Sending data...',success:function(form,action){register_win.hide();register_win.MemberCallback(true);register_win.MemberCallback=null;},failure:function(form,action){switch(action.failureType){case Ext.form.Action.CLIENT_INVALID:Ext.Msg.alert("Failure","Form fields may not be submitted with invalid values");break;case Ext.form.Action.CONNECT_FAILURE:Ext.Msg.alert("Failure","Authentication server is unreachable: "+action.response.responseText);break;case Ext.form.Action.SERVER_INVALID:Ext.Msg.alert("Registration Failed!",action.result.errors.reason);break;}}});}
var register_form=new Ext.FormPanel({labelWidth:120,url:'ajax/register.php',frame:true,title:'Registration Request',defaultType:'textfield',monitorValid:true,keys:[{key:[10,13],fn:submit_register_form}],items:[{fieldLabel:'Name',name:'name',allowBlank:false},{fieldLabel:'Screen Name',name:'screenname',allowBlank:true},{fieldLabel:'Email',name:'email',vtype:'email',allowBlank:false},{fieldLabel:'SK Membership No.',name:'membernum',vtype:'sknum',allowBlank:false},{fieldLabel:'Password',name:'password',id:'login_register_password',inputType:'password',allowBlank:false},{fieldLabel:'Confirm Password',name:'passconfirm',inputType:'password',vtype:'password',initialPassField:'login_register_password',allowBlank:false}],buttons:[{text:'Register',formBind:true,handler:submit_register_form},{text:'Cancel',handler:function(){register_win.hide();register_win.MemberCallback(false);register_win.MemberCallback=null;}}]});var register_win=new Ext.Window({layout:'fit',width:350,height:250,closable:false,resizeable:false,plain:true,border:false,modal:true,constrainHeader:true,items:[register_form]});function show_register_window(callback)
{register_form.getForm().reset();register_win.show();register_win.MemberCallback=callback;}
function submit_reset_form()
{if(!reset_form.getForm().isValid()){return;}
reset_form.getForm().submit({method:'POST',waitTitle:'Connecting',waitMsg:'Sending data...',success:function(form,action){reset_win.hide();reset_win.MemberCallback(true);reset_win.MemberCallback=null;},failure:function(form,action){switch(action.failureType){case Ext.form.Action.CLIENT_INVALID:Ext.Msg.alert("Failure","Form fields may not be submitted with invalid values");break;case Ext.form.Action.CONNECT_FAILURE:Ext.Msg.alert("Failure","Authentication server is unreachable: "+action.response.responseText);break;case Ext.form.Action.SERVER_INVALID:Ext.Msg.alert("Password Reset Failed!",action.result.errors.reason);break;}}});}
var reset_form=new Ext.FormPanel({labelWidth:120,url:'ajax/resetpw.php',frame:true,title:'Reset Password',defaultType:'textfield',monitorValid:true,keys:[{key:[10,13],fn:submit_reset_form}],items:[{fieldLabel:'Email',name:'email',vtype:'email',allowBlank:false},{fieldLabel:'SK Membership No.',name:'membernum',vtype:'sknum',allowBlank:false}],buttons:[{text:"I'm an idiot!",formBind:true,handler:submit_reset_form},{text:'Wait! I remembered it!',handler:function(){reset_win.hide();reset_win.MemberCallback(false);reset_win.MemberCallback=null;}}]});var reset_win=new Ext.Window({layout:'fit',width:350,height:150,closable:false,resizeable:false,plain:true,border:false,modal:true,constrainHeader:true,items:[reset_form]});function show_reset_window(callback)
{reset_form.getForm().reset();reset_win.show();reset_win.MemberCallback=callback;}
function submit_changepw_form()
{if(!changepw_form.getForm().isValid()){return;}
changepw_form.getForm().submit({method:'POST',waitTitle:'Connecting',waitMsg:'Sending data...',params:{uid:Gerards.Membership.Login.uid()},success:function(form,action){changepw_win.hide();changepw_win.MemberCallback(true);changepw_win.MemberCallback=null;},failure:function(form,action){switch(action.failureType){case Ext.form.Action.CLIENT_INVALID:Ext.Msg.alert("Failure","Form fields may not be submitted with invalid values");break;case Ext.form.Action.CONNECT_FAILURE:Ext.Msg.alert("Failure","Authentication server is unreachable: "+action.response.responseText);break;case Ext.form.Action.SERVER_INVALID:Ext.Msg.alert("Password Change Failed!",action.result.errors.reason,function(btn){if(action.result.loggedin===false){Gerards.Membership.Login.login(false,function(success){if(success===false){window.location=window.location;}});}});break;}}});}
var changepw_form=new Ext.FormPanel({labelWidth:150,url:'ajax/changepw.php',frame:true,title:'Change Password',defaultType:'textfield',monitorValid:true,keys:[{key:[10,13],fn:submit_changepw_form}],items:[{fieldLabel:'Current Password',name:'current',inputType:'password',allowBlank:false},{fieldLabel:'New Password',name:'password',id:'login_change_password',inputType:'password',allowBlank:false},{fieldLabel:'Confirm New Password',name:'passconfirm',inputType:'password',vtype:'password',initialPassField:'login_change_password',allowBlank:false}],buttons:[{text:"Change",formBind:true,handler:submit_changepw_form},{text:'Cancel',handler:function(){changepw_win.hide();changepw_win.MemberCallback(false);changepw_win.MemberCallback=null;}}]});var changepw_win=new Ext.Window({layout:'fit',width:350,height:200,closable:false,resizeable:false,plain:true,border:false,modal:true,constrainHeader:true,items:[changepw_form]});function show_changepw_window(callback)
{changepw_form.getForm().reset();changepw_win.show();changepw_win.MemberCallback=callback;}
return{login:function(precheck,callback,showdialog)
{if(showdialog===undefined){showdialog=true;}
if(precheck){Ext.Ajax.request({url:'ajax/login.php',disableCaching:false,success:function(response){var obj=Ext.util.JSON.decode(response.responseText);if(obj.success){login_uid=obj.uid;has_priv_system=obj.priv_system;has_priv_membership=obj.priv_membership;has_priv_musket=obj.priv_musket;callback(true);}else{if(showdialog){show_login_window(callback);}else{callback(false);}}},failure:function(response){Gerards.Membership.Alert.msg(10,'Login Check Failed','Error code {0}: {1}',response.status,response.statusText);callback(false);}});}else{if(showdialog){show_login_window(callback);}else{callback(false);}}},logout:function(callback)
{Ext.Ajax.request({url:'ajax/logout.php',disableCaching:false,success:function(response){callback(true);},failure:function(response){Gerards.Membership.Alert.msg(10,'Logout Failed','Error code {0}: {1}',response.status,response.statusText);callback(false);}});},register:function(callback)
{show_register_window(callback);},reset:function(callback)
{show_reset_window(callback);},changepw:function(callback)
{show_changepw_window(callback);},uid:function()
{return login_uid;},has_priv_system:function()
{return has_priv_system;},has_priv_membership:function()
{return has_priv_membership;},has_priv_musket:function()
{return has_priv_musket;}};}();
// js/users.js

Gerards.Membership.Users=function()
{var users_ds=undefined;return{store:function()
{if(users_ds===undefined){users_ds=new Ext.data.Store({autoLoad:false,proxy:new Ext.data.HttpProxy({url:'ajax/user_list.php',method:'POST'}),reader:new Ext.data.JsonReader({root:'users',id:'id'},[{name:'id',type:'int'},{name:'name',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'screenname',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'combined',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'spouse_combined',type:'string',mapping:'id === 0? "None": obj.combined'}]),listeners:{load:function(store,records,options){store.gerardsLoaded=true;},loadexception:function(proxy,options,response,err){store_load_exception(proxy,options,response,err,users_ds);}}});}
return users_ds;}};}();
// js/kit_categories.js

Gerards.Membership.KitCategories=function()
{var kit_categories_ds=undefined;return{store:function()
{if(kit_categories_ds===undefined){kit_categories_ds=new Ext.data.Store({autoLoad:false,proxy:new Ext.data.HttpProxy({url:'ajax/kit_categories.php',disableCaching:false}),reader:new Ext.data.JsonReader({root:'categories',id:'id'},[{name:'id',type:'int'},{name:'category',type:'string',convert:function(val){return html_entity_unescape(val);}}]),listeners:{load:function(store,records,options){store.gerardsLoaded=true;},loadexception:function(proxy,options,response,err){store_load_exception(proxy,options,response,err,kit_categories_ds);}}});}
return kit_categories_ds;}};}();
// js/rank.js

Gerards.Membership.Rank=function()
{var rank_ds=undefined;return{store:function()
{if(rank_ds===undefined){rank_ds=new Ext.data.Store({autoLoad:false,proxy:new Ext.data.HttpProxy({url:'ajax/rank.php',method:'POST'}),reader:new Ext.data.JsonReader({root:'ranks',id:'id'},[{name:'id',type:'int'},{name:'name',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'order',type:'int'}]),listeners:{load:function(store,records,options){store.gerardsLoaded=true;},loadexception:function(proxy,options,response,err){store_load_exception(proxy,options,response,err,rank_ds);}}});}
return rank_ds;}};}();
// js/arm.js

Gerards.Membership.Arm=function()
{var arm_ds=undefined;return{store:function()
{if(arm_ds===undefined){arm_ds=new Ext.data.Store({autoLoad:false,proxy:new Ext.data.HttpProxy({url:'ajax/arm.php',method:'POST'}),reader:new Ext.data.JsonReader({root:'arms',id:'id'},[{name:'id',type:'int'},{name:'abbr',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'name',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'help',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'combined',type:'string',mapping:'abbr + " - " + obj.name'}]),listeners:{load:function(store,records,options){store.gerardsLoaded=true;},loadexception:function(proxy,options,response,err){store_load_exception(proxy,options,response,err,arm_ds);}}});}
return arm_ds;}};}();
// js/members.js

Gerards.Membership.Members=function()
{var members_ds=undefined;var members_reader=undefined;var rank_ds=Gerards.Membership.Rank.store();var arm_ds=Gerards.Membership.Arm.store();var members_reader_record=Ext.data.Record.create([{name:'id',type:'int'},{name:'email',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'name',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'screenname',type:'string',covert:function(val){return html_entity_unescape(val);}},{name:'sknum',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'registered',type:'boolean',convert:function(val){return convert_boolean(val);}},{name:'nameorder',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'honorary_budgie',type:'boolean',convert:function(val){return convert_boolean(val);}},{name:'honorary_budgie_regt',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'fullname',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'dob',type:'date',convert:function(val){return convert_date(val);}},{name:'rank',type:'int'},{name:'arm',type:'int'},{name:'address1',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'address2',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'address3',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'postcode',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'phonenum',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'sk_appointments',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'form_email',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'spouse',type:'int'},{name:'child1',type:'int'},{name:'child2',type:'int'},{name:'child3',type:'int'},{name:'child4',type:'int'},{name:'child5',type:'int'},{name:'child6',type:'int'},{name:'date_form_received',type:'date',convert:function(val){return convert_date(val);}},{name:'date_form_posted',type:'date',convert:function(val){return convert_date(val);}},{name:'date_cheque_cashed',type:'date',convert:function(val){return convert_date(val);}},{name:'date_card_posted',type:'date',convert:function(val){return convert_date(val);}},{name:'skf10_page',type:'int'},{name:'full_member',type:'boolean',convert:function(val){return convert_boolean(val);}},{name:'simplified_arm',type:'string',convert:function(val,rec){var arm_rec=arm_ds.getById(rec.arm);if(arm_rec===undefined){return'Bug!';}
switch(arm_rec.data.abbr){case'Unknown':case'LH':case'E':case'MU':case'Med':case'ADH':return'Other';case'AS':case'BS':return'Staff';case'CP':case'OCP':return'Civilian Participant';case'CNP':return'Civilian Non-participant';case'O':case'RO':case'SO':return'Officer';case'OS':case'OSL':case'S':case'SL':return'Musket';case'OP':case'P':return'Pike';case'A':case'OAL':return'Artillery';case'T':return'Horse';default:return'Unknown arm!';}}},{name:'rankorder',type:'int',convert:function(val,rec){var rank_rec=rank_ds.getById(rec.rank);if(rank_rec===undefined){return 0;}
return rank_rec.data.order;}}]);return{store:function()
{if(members_ds===undefined){members_ds=new Ext.data.Store({autoLoad:false,proxy:new Ext.data.HttpProxy({url:'ajax/members.php',method:'POST'}),reader:Gerards.Membership.Members.reader(),listeners:{load:function(store,records,options){store.gerardsLoaded=true;},loadexception:function(proxy,options,response,err){store_load_exception(proxy,options,response,err,members_ds);}}});}
return members_ds;},reader:function()
{if(members_reader===undefined){members_reader=new Ext.data.JsonReader({root:'members',id:'id'},members_reader_record);}
return members_reader;},new_record:function()
{return new members_reader_record({id:0,email:'',name:'',screenname:'',sknum:null,registered:false,nameorder:'',honorary_budgie:false,honorary_budgie_regt:'',fullname:'',dob:null,rank:0,arm:0,address1:'',address2:'',address3:'',postcode:'',phonenum:'',sk_appointments:'',form_email:'',spouse:0,date_form_received:null,date_form_posted:null,date_cheque_cashed:null,date_card_posted:null,skf10_page:null});}};}();
// js/privileges.js

Gerards.Membership.Privileges=function()
{var privileges_ds=undefined;return{store:function()
{if(privileges_ds===undefined){privileges_ds=new Ext.data.Store({autoLoad:false,proxy:new Ext.data.HttpProxy({url:'ajax/privileges.php',method:'POST'}),reader:new Ext.data.JsonReader({root:'users',id:'id'},[{name:'id',type:'int'},{name:'name',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'screenname',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'combined',type:'string',mapping:'screenname === null || obj.screenname === ""? obj.name: obj.screenname + " (" + obj.name + ")"'},{name:'priv_system',type:'boolean',convert:function(val){return convert_boolean(val);}},{name:'priv_membership',type:'boolean',convert:function(val){return convert_boolean(val);}},{name:'priv_musket',type:'boolean',convert:function(val){return convert_boolean(val);}}]),listeners:{load:function(store,records,options){store.gerardsLoaded=true;},loadexception:function(proxy,options,response,err){store_load_exception(proxy,options,response,err,privileges_ds);}}});}
return privileges_ds;}};}();
// js/save.js

Gerards.Membership.GridSaver=function()
{return{save_row:function(store,record,url,params,callback,fire_event)
{var addedby_uid=Gerards.Membership.Login.uid();var last_update=(new Date()).clearTime();params.addedby_uid=addedby_uid;params.last_update=last_update.format('Y-m-d');params.task='update';Ext.Ajax.request({waitMsg:'Saving changes...',url:url,params:params,disableCaching:false,success:function(response){var response_data=Ext.util.JSON.decode(response.responseText);if(response_data.success===true){if(record.data.id===0){var newID=response_data.newID;record.data.id=newID;}
record.data.addedby_uid=addedby_uid;record.data.last_update=last_update;if(fire_event===true){store.fireEvent("datachanged",store);}
callback(record,true,false);}else if(response_data.success===false&&response_data.loggedin===false){Gerards.Membership.Alert.msg(5,'Update Failed','Need to log in again');callback(record,false,true);}else{Gerards.Membership.Alert.msg(5,'Update Failed','Reason: {0}',response_data.errors.reason);callback(record,false,false);}},failure:function(response){Gerards.Membership.Alert.msg(5,'Update Failed','Error code {0}: {1}',response.status,response.statusText);callback(record,false,false);}});},save_row_login_wrapped:function(store,url,prepare,callback){var dirty_rows=store.getModifiedRecords();var done_relogin=false;if(dirty_rows.length>0){store.suspendEvents();for(var i=0;i<dirty_rows.length;i++){if(dirty_rows[i]){var record=dirty_rows[i];var params=Ext.apply({},record.data);if(prepare){prepare(params);}
Gerards.Membership.GridSaver.save_row(store,record,url,params,function(record,success,relogin){if(success){callback(success,store,record);}else{if(done_relogin===false&&relogin===true){Gerards.Membership.Login.login(false,function(success){if(success===false){window.location=window.location;}});done_relogin=true;}}},false);}}
store.resumeEvents();store.fireEvent("datachanged",store);}},delete_row:function(record,url,row_id,callback){Ext.Ajax.request({waitMsg:'Deleting selected data...',url:url,params:{task:'delete',key:row_id},disableCaching:false,success:function(response){var response_data=Ext.util.JSON.decode(response.responseText);if(response_data.success===true){callback(record,true,false);}else if(response_data.success===false&&response_data.loggedin===false){Gerards.Membership.Alert.msg(5,'Delete Failed','Need to log in again');callback(record,false,true);}else{Gerards.Membership.Alert.msg(5,'Delete Failed','Reason: {0}',response_data.errors.reason);callback(record,false,false);}},failure:function(response){Gerards.Membership.Alert.msg(5,'Delete Failed','Error code {0}: {1}',response.status,response.statusText);callback(record,false,false);}});},delete_row_login_wrapped:function(grid,url){var selected=grid.getSelectionModel().getSelectedCell();if(selected===null){Gerards.Membership.Alert.msg(5,"Delete","Please select one or more rows to delete.");return;}
var record=grid.getStore().getAt(selected[0]);var key=record.data.id;if(key!==0){Gerards.Membership.GridSaver.delete_row(record,url,key,function(record,success,relogin){if(success){record.reject();grid.getStore().remove(record);}else{if(relogin===true){Gerards.Membership.Login.login(false,function(success){if(success===false){window.location=window.location;}});}}});}else{record.reject();grid.getStore().remove(record);}},ajax_request_login_wrapped:function(waitmsg,url,params,callback){Ext.Ajax.request({waitMsg:waitmsg,url:url,params:params,disableCaching:false,success:function(response){var response_data=Ext.util.JSON.decode(response.responseText);if(response_data.success===true){callback(true);}else if(response_data.success===false&&response_data.loggedin===false){Gerards.Membership.Alert.msg(5,'Request Failed','Need to log in again');Gerards.Membership.Login.login(false,function(success){if(success===false){window.location=window.location;}else{callback(false);}});}else{Gerards.Membership.Alert.msg(5,'Request Failed','Reason: {0}',response_data.errors.reason);callback(false);}},failure:function(response){Gerards.Membership.Alert.msg(5,'Request Failed','Error code {0}: {1}',response.status,response.statusText);callback(false);}});}};}();
// js/send_email_form.js

Gerards.Membership.SendEmailForm=function()
{var users_ds=Gerards.Membership.Users.store();var email_form=new Ext.FormPanel({labelWidth:50,url:'ajax/send_email.php',frame:true,defaultType:'textfield',monitorValid:true,items:[{fieldLabel:'From',id:'from',name:'from',getSubmitValue:function(){return email_form.from_uid;},allowBlank:false,readOnly:true,anchor:'100%'},{fieldLabel:'To',id:'to',name:'to',getSubmitValue:function(){return Ext.encode(email_form.has_email);},allowBlank:false,readOnly:true,anchor:'100%'},{fieldLabel:'Not To',id:'not_to',name:'not_to',getSubmitValue:function(){return'';},allowBlank:true,readOnly:true,anchor:'100%'},{fieldLabel:'Subject',id:'subject',name:'subject',getSubmitValue:function(){return Ext.encode(this.getValue());},allowBlank:false,anchor:'100%'},{fieldLabel:'Message',id:'message',name:'message',xtype:'textarea',getSubmitValue:function(){return Ext.encode(this.getValue());},allowBlank:false,anchor:'100% -100'}],buttons:[{text:'Send',formBind:true,handler:function(){var form=email_form.getForm();form.doAction('oosubmit',{method:'POST',waitTitle:'Sending',waitMsg:'Sending email...',params:{task:'send_message'},success:function(form,action){email_form_win.hide();},failure:function(form,action){switch(action.failureType){case Ext.form.Action.CLIENT_INVALID:Ext.Msg.alert("Failure","Form fields may not be submitted with invalid values");break;case Ext.form.Action.CONNECT_FAILURE:Ext.Msg.alert("Failure","Database server is unreachable: "+action.response.responseText);break;case Ext.form.Action.SERVER_INVALID:Ext.Msg.alert("Send Failed",action.result.errors.reason);break;}}});}},{text:'Cancel',handler:function(){email_form_win.hide();}}]});var email_form_win=new Ext.Window({layout:'fit',title:'Send Email',width:600,height:450,closable:true,closeAction:'hide',resizeable:false,plain:true,border:false,modal:true,constrainHeader:true,items:[email_form]});return{send_email_to:function(recpt_ids,subject)
{if(recpt_ids.length===0){Gerards.Membership.Alert.msg(5,"Email","There are no recipients to email!");return;}
Ext.Ajax.request({url:'ajax/send_email.php',waitMsg:'Checking addresses...',params:{task:'query_ids',ids:Ext.encode(recpt_ids)},disableCaching:false,success:function(response){var response_data=Ext.util.JSON.decode(response.responseText);if(response_data.success===true){var i,has_email=[],hasnt_email=[];for(i=0;i<recpt_ids.length;i++){if(recpt_ids[i]){if(response_data.has_email[recpt_ids[i]]===true){has_email.push(recpt_ids[i]);}else{hasnt_email.push(recpt_ids[i]);}}}
if(has_email.length===0){Ext.Msg.alert("Recipient Addresses","No recipient email addresses are known.");}else{var form=email_form.getForm();form.reset();email_form_win.on('show',function(win){var uid=Gerards.Membership.Login.uid();var from_user=users_ds.getById(uid);var form_from=email_form.getForm().findField('from');if(form_from){form_from.setValue(from_user.data.screenname);}
var j;var to_user="";var not_to_user="";for(j=0;j<has_email.length;j++){if(has_email[j]){if(to_user!==""){to_user=to_user+", ";}
var to_user_name=users_ds.getById(has_email[j]);to_user=to_user+to_user_name.data.screenname;}}
for(j=0;j<hasnt_email.length;j++){if(hasnt_email[j]){if(not_to_user!==""){not_to_user=not_to_user+", ";}
var not_to_user_name=users_ds.getById(hasnt_email[j]);not_to_user=not_to_user+not_to_user_name.data.screenname;}}
var form_to=email_form.getForm().findField('to');if(form_to){if(to_user===""){form_to.hide();}else{form_to.setValue(to_user);}}
var form_not_to=email_form.getForm().findField('not_to');if(form_not_to){if(not_to_user===""){form_not_to.disable();}else{form_not_to.setValue(not_to_user);}}
var form_subject=email_form.getForm().findField('subject');if(form_subject){form_subject.setValue(subject);}
var form_mess=email_form.getForm().findField('message');if(form_mess){form_mess.focus(false,100);}
email_form.from_uid=uid;email_form.has_email=has_email;},email_form_win,{single:true});email_form_win.show();}}else if(response_data.success===false&&response_data.loggedin===false){Gerards.Membership.Alert.msg(5,'Query Failed','Need to log in again');Gerards.Membership.Login.login(false,function(success){if(success===false){window.location=window.location;}else{}});}else{Gerards.Membership.Alert.msg(5,'Query Failed','Reason: {0}',response_data.errors.reason);}},failure:function(response){Gerards.Membership.Alert.msg(5,'Query Failed','Error code {0}: {1}',response.status,response.statusText);}});}};}();
// js/regiment_kit.js

Gerards.Membership.RegimentKit=function()
{var kit_grid=undefined;var kit_categories_ds=Gerards.Membership.KitCategories.store();var kit_reader_record=Ext.data.Record.create([{name:'id',type:'int'},{name:'uid',type:'int'},{name:'item_id',type:'int'},{name:'quantity',type:'int'},{name:'notes',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'addedby_uid',type:'int'},{name:'last_update',type:'date',convert:function(val){return convert_date(val);}}]);var kit_ds=new Ext.data.Store({proxy:new Ext.data.HttpProxy({url:'ajax/stored_kit.php',disableCaching:false}),reader:new Ext.data.JsonReader({root:'items',id:'id'},kit_reader_record),listeners:{update:function(store,record,operation){enable_button_if_dirty(store,kit_save_button);},load:function(store,records,options){enable_button_if_dirty(store,kit_save_button);},loadexception:function(proxy,options,response,err){store_load_exception(proxy,options,response,err,kit_ds);},remove:function(store,record,index){enable_button_if_dirty(store,kit_save_button);}}});var kit_save_button=new Ext.Toolbar.Button({text:'Save Changes',tooltip:'Save all changes currently outstanding',iconCls:'grid_button_save',disabled:true,handler:function(){Gerards.Membership.GridSaver.save_row_login_wrapped(kit_ds,'ajax/stored_kit.php',null,function(success,store,record){if(success){record.commit();}});}});var kit_delete_button=new Ext.Toolbar.Button({text:'Delete Selected Row',tooltip:'Click to delete the selected row from the database',iconCls:'grid_button_remove',disabled:true,handler:function(){Gerards.Membership.GridSaver.delete_row_login_wrapped(kit_grid,'ajax/stored_kit.php');}});var spacer_button=new Ext.Toolbar.Button({text:'<span style="margin-left: 1in;">&nbsp;</span>',disabled:true});var kit_email_button=new Ext.Toolbar.Button({text:'Email Possessor',tooltip:'Click to email the possessor of the selected row',iconCls:'grid_button_email',disabled:true,handler:function(){var selected=kit_grid.getSelectionModel().getSelectedCell();if(selected===null){return;}
var record=kit_grid.getStore().getAt(selected[0]);var possessor=record.data.uid;var ids=[];ids.push(possessor);var kit=kit_categories_ds.getById(record.data.item_id);if(!kit){return;}
var subject="Budgies kit: Your "+kit.data.category;if(record.data.notes!==""){subject=subject+" ("+record.data.notes+")";}
Gerards.Membership.SendEmailForm.send_email_to(ids,subject);}});return{panel:function()
{var users_ds=Gerards.Membership.Users.store();if(kit_grid===undefined){kit_grid=new Ext.grid.EditorGridPanel({id:'kit-grid',store:kit_ds,sm:new Ext.grid.CellSelectionModel({listeners:{selectionchange:function(sm,selected){if(selected!==null){kit_delete_button.enable();kit_email_button.enable();}else{kit_delete_button.disable();kit_email_button.disable();}}}}),clicksToEdit:2,enableColumnHide:false,enableColumnMove:false,border:false,title:'Regimental Kit',disabled:true,autoExpandColumn:'kit-details',columns:[{header:"Possessor",sortable:true,dataIndex:'uid',id:'kit-possessor',width:Gerards.Membership.NameWidth,renderer:function(data){var user=users_ds.getById(data);if(user){return user.data.screenname;}else{return'';}},editor:new Ext.form.ComboBox({allowBlank:false,store:users_ds,valueField:'id',displayField:'combined',triggerAction:'all',editable:false})},{header:"Item",sortable:true,dataIndex:'item_id',id:'kit-itemid',width:Gerards.Membership.ItemWidth,renderer:function(data){var kit=kit_categories_ds.getById(data);if(kit){return kit.data.category;}else{return'';}},editor:new Ext.form.ComboBox({allowBlank:false,store:kit_categories_ds,valueField:'id',displayField:'category',triggerAction:'all',editable:false})},{header:"Qty",sortable:true,dataIndex:'quantity',id:'kit-quantity',width:Gerards.Membership.NumberWidth,editor:new Ext.form.NumberField({allowBlank:false,allowDecimals:false,allowNegative:false})},{header:"Details",sortable:true,dataIndex:'notes',id:'kit-details',editor:new Ext.form.TextField({allowBlank:true})},{header:"Last Update",sortable:true,dataIndex:'last_update',id:'kit-lastupdate',width:Gerards.Membership.DateWidth,renderer:Ext.util.Format.dateRenderer('d M Y')},{header:"Last Updated By",sortable:true,dataIndex:'addedby_uid',id:'kit-lastupdatedby',width:Gerards.Membership.NameWidth,renderer:function(data){var user=users_ds.getById(data);if(user){return user.data.screenname;}else{return'';}}}],tbar:[{text:'Add Item',tooltip:'Click to add a row',iconCls:'grid_button_add',handler:function(){var new_row=new kit_reader_record({id:0,uid:Gerards.Membership.Login.uid(),item_id:0,quantity:0,notes:'',addedby_uid:Gerards.Membership.Login.uid(),last_update:(new Date()).clearTime()});kit_grid.stopEditing();kit_ds.insert(0,new_row);kit_grid.startEditing(0,0);}},kit_save_button,kit_email_button,'-',spacer_button,'-',kit_delete_button,'->',{text:'Reload',tooltip:'Click to reload the display, discarding changes',iconCls:'grid_button_refresh',handler:function(){kit_ds.rejectChanges();kit_ds.reload();kit_save_button.disable();}}],view:new Ext.grid.GridView({forceFit:true,emptyText:"There doesn't appear to be any regimental kit"}),listeners:{render:function(grid){if(!users_ds.gerardsLoaded){users_ds.on('load',function(store,records,options){this.getView().refresh();},grid,{single:true});}
if(!kit_categories_ds.gerardsLoaded){kit_categories_ds.on('load',function(store,records,options){this.getView().refresh();},grid,{single:true});}
grid.getStore().load();}}});}
return kit_grid;}};}();
// js/events.js

Gerards.Membership.Events=function()
{var kit_categories_ds=Gerards.Membership.KitCategories.store();var events_grid=undefined;var events_reader_record=Ext.data.Record.create([{name:'id',type:'int'},{name:'datefrom',type:'date',convert:function(val){return convert_date(val);}},{name:'dateto',type:'date',convert:function(val){return convert_date(val);}},{name:'name',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'type',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'latitude',type:'float'},{name:'longitude',type:'float'},{name:'cancelled',type:'boolean',convert:function(val){return convert_boolean(val);}},{name:'cancelled_reason',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'regt_booking',type:'boolean',convert:function(val){return convert_boolean(val);}},{name:'indiv_booking',type:'boolean',convert:function(val){return convert_boolean(val);}},{name:'WO_link',type:'string'},{name:'private',type:'boolean',convert:function(val){return convert_boolean(val);}},{name:'public_url',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'addedby_uid',type:'int'},{name:'last_update',type:'date',convert:function(val){return convert_date(val);}}]);var events_ds=new Ext.data.Store({proxy:new Ext.data.HttpProxy({url:'ajax/events.php',disableCaching:false}),reader:new Ext.data.JsonReader({root:'events',id:'id'},events_reader_record),listeners:{update:function(store,record,operation){switch(operation){case Ext.data.Record.EDIT:events_save_button.enable();break;case Ext.data.Record.COMMIT:enable_button_if_dirty(store,events_save_button);break;}},load:function(store,records,options){events_grid.getSelectionModel().select(0,0);},loadexception:function(proxy,options,response,err){store_load_exception(proxy,options,response,err,events_ds);}}});var events_save_button=new Ext.Toolbar.Button({text:'Save Changes',tooltip:'Save all changes currently outstanding',iconCls:'grid_button_save',disabled:true,handler:function(){Gerards.Membership.GridSaver.save_row_login_wrapped(events_ds,'ajax/events.php',function(params){params.datefrom=params.datefrom.format('Y-m-d');params.dateto=params.dateto.format('Y-m-d');},function(success,store,record){if(success){record.commit();}});}});var events_cancel_button=new Ext.Toolbar.Button({text:'Cancel Event',tooltip:'Toggle the Cancelled status of this event',iconCls:'grid_button_cancel',disabled:true,handler:function(){var selected=events_grid.getSelectionModel().getSelectedCell();if(selected===null){return;}
var record=events_grid.getStore().getAt(selected[0]);if(record.data.id===0){Gerards.Membership.Alert.msg(5,'Cancelling Event','Can not cancel an event before it has been stored in the database');return;}
if(record.data.cancelled){var addedby_uid=Gerards.Membership.Login.uid();var last_update=(new Date()).clearTime();Ext.Ajax.request({waitMsg:'Uncancelling event...',url:'ajax/events.php',params:{task:'uncancel',id:record.data.id,addedby_uid:addedby_uid,last_update:last_update.format('Y-m-d')},disableCaching:false,success:function(response){var response_data=Ext.util.JSON.decode(response.responseText);if(response_data.success===true){var store=events_grid.getStore();record.data.cancelled=false;record.data.cancelled_reason='';record.data.addedby_uid=addedby_uid;record.data.last_update=last_update;store.fireEvent("datachanged",store);}else if(response_data.success===false&&response_data.loggedin===false){Gerards.Membership.Alert.msg(5,'Uncancel Failed','Need to log in again');Gerards.Membership.Login.login(false,function(success){if(success===false){window.location=window.location;}});}else{Gerards.Membership.Alert.msg(5,'Uncancel Failed','Reason: {0}',response_data.errors.reason);}},failure:function(response){Gerards.Membership.Alert.msg(5,'Uncancel Failed','Error code {0}: {1}',response.status,response.statusText);}});}else{var form=events_cancel_form.getForm();form.reset();form.EventID=record.data.id;events_cancel_form_win.show();}}});var events_public_url_button=new Ext.Toolbar.Button({text:'Public URL',tooltip:'Enter a URL that this event will link to on the public site',iconCls:'grid_button_url',disabled:true,handler:function(){var selected=events_grid.getSelectionModel().getSelectedCell();if(selected===null){return;}
var record=events_grid.getStore().getAt(selected[0]);if(record.data.id===0){Gerards.Membership.Alert.msg(5,'Event URL','Can not add a URL to an event before it has been stored in the database');return;}
var form=events_public_url_form.getForm();form.reset();form.EventID=record.data.id;events_public_url_form_win.on('show',function(win){if(record.data.public_url!==null){var form_url=form.findField('public_url');if(form_url){form_url.setValue(record.data.public_url);}}});events_public_url_form_win.show();}});var regt_booking_column=new Ext.grid.CheckColumn({header:"Rgt. Book",sortable:true,dataIndex:'regt_booking',width:30});var indiv_booking_column=new Ext.grid.CheckColumn({header:"Ind. Book",sortable:true,dataIndex:'indiv_booking',width:30});var private_column=new Ext.grid.CheckColumn({header:"Private",sortable:true,dataIndex:'private',width:25});function submit_events_cancel_form()
{var form=events_cancel_form.getForm();if(!form.isValid()){return;}
var addedby_uid=Gerards.Membership.Login.uid();var last_update=(new Date()).clearTime();form.submit({method:'POST',waitTitle:'Connecting',waitMsg:'Sending data...',params:{task:'cancel',id:form.EventID,addedby_uid:addedby_uid,last_update:last_update.format('Y-m-d')},success:function(form,action){var response_data=Ext.util.JSON.decode(action.response.responseText);if(response_data.success===true){}else if(response_data.success===false&&response_data.loggedin===false){Gerards.Membership.Alert.msg(5,'Uncancel Failed','Need to log in again');Gerards.Membership.Login.login(false,function(success){if(success===false){window.location=window.location;}});}else{Gerards.Membership.Alert.msg(5,'Uncancel Failed','Reason: {0}',response_data.errors.reason);}
var store=events_grid.getStore();var record=store.getById(form.EventID);var reason=form.findField('cancelled_reason');record.data.cancelled=true;record.data.cancelled_reason=reason.getValue();record.data.addedby_uid=addedby_uid;record.data.last_update=last_update;store.fireEvent("datachanged",store);events_cancel_form_win.hide();},failure:function(form,action){switch(action.failureType){case Ext.form.Action.CLIENT_INVALID:Ext.Msg.alert("Failure","Form fields may not be submitted with invalid values");break;case Ext.form.Action.CONNECT_FAILURE:Ext.Msg.alert("Failure","Database server is unreachable: "+action.response.responseText);break;case Ext.form.Action.SERVER_INVALID:Ext.Msg.alert("Database Update Failed!",action.result.errors.reason);break;}}});}
var events_cancel_form=new Ext.FormPanel({labelWidth:40,url:'ajax/events.php',frame:true,title:'Cancelled Event',defaultType:'textfield',monitorValid:true,keys:[{key:[10,13],fn:submit_events_cancel_form}],items:{fieldLabel:'Reason',name:'cancelled_reason',allowBlank:false,anchor:'100%'},buttons:[{text:'OK',formBind:true,handler:submit_events_cancel_form},{text:'Cancel',handler:function(){events_cancel_form_win.hide();}}]});var events_cancel_form_win=new Ext.Window({layout:'fit',width:400,height:150,closable:false,resizeable:false,plain:true,border:false,modal:true,constrainHeader:true,items:[events_cancel_form]});function submit_events_public_url_form()
{var form=events_public_url_form.getForm();if(!form.isValid()){return;}
var addedby_uid=Gerards.Membership.Login.uid();var last_update=(new Date()).clearTime();form.submit({method:'POST',waitTitle:'Connecting',waitMsg:'Sending data...',params:{task:'public_url',id:form.EventID,addedby_uid:addedby_uid,last_update:last_update.format('Y-m-d')},success:function(form,action){var response_data=Ext.util.JSON.decode(action.response.responseText);if(response_data.success===true){}else if(response_data.success===false&&response_data.loggedin===false){Gerards.Membership.Alert.msg(5,'Event URL Failed','Need to log in again');Gerards.Membership.Login.login(false,function(success){if(success===false){window.location=window.location;}});}else{Gerards.Membership.Alert.msg(5,'Event URL Failed','Reason: {0}',response_data.errors.reason);}
var store=events_grid.getStore();var record=store.getById(form.EventID);var url=form.findField('public_url');record.data.public_url=url.getValue();record.data.addedby_uid=addedby_uid;record.data.last_update=last_update;store.fireEvent("datachanged",store);events_public_url_form_win.hide();},failure:function(form,action){switch(action.failureType){case Ext.form.Action.CLIENT_INVALID:Ext.Msg.alert("Failure","Form fields may not be submitted with invalid values");break;case Ext.form.Action.CONNECT_FAILURE:Ext.Msg.alert("Failure","Database server is unreachable: "+action.response.responseText);break;case Ext.form.Action.SERVER_INVALID:Ext.Msg.alert("Database Update Failed!",action.result.errors.reason);break;}}});}
var events_public_url_form=new Ext.FormPanel({labelWidth:40,url:'ajax/events.php',frame:true,title:'Event URL',defaultType:'textfield',monitorValid:true,keys:[{key:[10,13],fn:submit_events_public_url_form}],items:{fieldLabel:'URL',name:'public_url',allowBlank:false,anchor:'100%'},buttons:[{text:'OK',formBind:true,handler:submit_events_public_url_form},{text:'Cancel',handler:function(){events_public_url_form_win.hide();}}]});var events_public_url_form_win=new Ext.Window({layout:'fit',width:400,height:150,closable:false,resizeable:false,plain:true,border:false,modal:true,constrainHeader:true,items:[events_public_url_form]});var attendances_grid=undefined;var attendances_reader_record=Ext.data.Record.create([{name:'id',type:'int'},{name:'uid',type:'int'},{name:'addedby_uid',type:'int'},{name:'attending_id',type:'int'},{name:'notes',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'event_id',type:'int'},{name:'powder',type:'boolean',convert:function(val){return convert_boolean(val);}},{name:'last_update',type:'date',convert:function(val){return convert_date(val);}}]);var attendances_ds=new Ext.data.GroupingStore({proxy:new Ext.data.HttpProxy({url:'ajax/attendances.php',disableCaching:false}),reader:new Ext.data.JsonReader({root:'attendances',id:'id'},attendances_reader_record),pruneModifiedRecords:true,groupField:'attending_id',sortInfo:{field:'event_id',direction:"ASC"},listeners:{update:function(store,record,operation){enable_button_if_dirty(store,attendances_save_button);shortage_kit_update();},load:function(store,records,options){enable_button_if_dirty(store,attendances_save_button);shortage_kit_update();},loadexception:function(proxy,options,response,err){store_load_exception(proxy,options,response,err,attendances_ds);},remove:function(store,record,index){enable_button_if_dirty(store,attendances_save_button);shortage_kit_update();}}});var attendances_save_button=new Ext.Toolbar.Button({text:'Save Changes',tooltip:'Save all changes currently outstanding',iconCls:'grid_button_save',disabled:true,handler:function(){Gerards.Membership.GridSaver.save_row_login_wrapped(attendances_ds,'ajax/attendances.php',null,function(success,store,record){if(success){record.commit();}});}});var attendances_delete_button=new Ext.Toolbar.Button({text:'Delete Selected Row',tooltip:'Click to delete the selected row from the database',iconCls:'grid_button_remove',disabled:true,handler:function(){Gerards.Membership.GridSaver.delete_row_login_wrapped(attendances_grid,'ajax/attendances.php');}});var bringing_kit_grid=undefined;var powder_column=new Ext.grid.CheckColumn({header:"Powder",sortable:true,dataIndex:'powder',width:30});var bringing_kit_reader_record=Ext.data.Record.create([{name:'id',type:'int'},{name:'uid',type:'int'},{name:'event_id',type:'int'},{name:'item_id',type:'int'},{name:'quantity',type:'int'},{name:'notes',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'addedby_uid',type:'int'},{name:'last_update',type:'date',convert:function(val){return convert_date(val);}}]);var bringing_kit_ds=new Ext.data.Store({proxy:new Ext.data.HttpProxy({url:'ajax/bringing_kit.php',disableCaching:false}),reader:new Ext.data.JsonReader({root:'items',id:'id'},bringing_kit_reader_record),pruneModifiedRecords:true,listeners:{update:function(store,record,operation){enable_button_if_dirty(store,bringing_kit_save_button);shortage_kit_update();},load:function(store,records,options){enable_button_if_dirty(store,bringing_kit_save_button);shortage_kit_update();},loadexception:function(proxy,options,response,err){store_load_exception(proxy,options,response,err,bringing_kit_ds);},remove:function(store,record,index){enable_button_if_dirty(store,bringing_kit_save_button);shortage_kit_update();}}});var bringing_kit_save_button=new Ext.Toolbar.Button({text:'Save Changes',tooltip:'Save all changes currently outstanding',iconCls:'grid_button_save',disabled:true,handler:function(){Gerards.Membership.GridSaver.save_row_login_wrapped(bringing_kit_ds,'ajax/bringing_kit.php',null,function(success,store,record){if(success){record.commit();}});}});var bringing_kit_email_button=new Ext.Toolbar.Button({text:'Email Owner',tooltip:'Click to email the owner of the selected row',iconCls:'grid_button_email',disabled:true,handler:function(){var selected=bringing_kit_grid.getSelectionModel().getSelectedCell();if(selected===null){return;}
var record=bringing_kit_grid.getStore().getAt(selected[0]);var owner=record.data.uid;var ids=[];ids.push(owner);var kit=kit_categories_ds.getById(record.data.item_id);if(!kit){return;}
var subject="";var event=events_ds.getById(bringing_kit_ds.gerardsEventID);if(event){subject="Muster at "+event.data.name+": ";}
subject=subject+"Your "+kit.data.category;if(record.data.notes!==""){subject=subject+" ("+record.data.notes+")";}
Gerards.Membership.SendEmailForm.send_email_to(ids,subject);}});var bringing_kit_delete_button=new Ext.Toolbar.Button({text:'Delete Selected Row',tooltip:'Click to delete the selected row from the database',iconCls:'grid_button_remove',disabled:true,handler:function(){Gerards.Membership.GridSaver.delete_row_login_wrapped(bringing_kit_grid,'ajax/bringing_kit.php');}});var needed_kit_grid=undefined;var needed_kit_reader_record=Ext.data.Record.create([{name:'id',type:'int'},{name:'uid',type:'int'},{name:'event_id',type:'int'},{name:'item_id',type:'int'},{name:'quantity',type:'int'},{name:'notes',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'addedby_uid',type:'int'},{name:'last_update',type:'date',convert:function(val){return convert_date(val);}}]);var needed_kit_ds=new Ext.data.Store({proxy:new Ext.data.HttpProxy({url:'ajax/needed_kit.php',disableCaching:false}),reader:new Ext.data.JsonReader({root:'items',id:'id'},needed_kit_reader_record),pruneModifiedRecords:true,listeners:{update:function(store,record,operation){enable_button_if_dirty(store,needed_kit_save_button);shortage_kit_update();},load:function(store,records,options){enable_button_if_dirty(store,needed_kit_save_button);shortage_kit_update();},loadexception:function(proxy,options,response,err){store_load_exception(proxy,options,response,err,needed_kit_ds);},remove:function(store,record,index){enable_button_if_dirty(store,needed_kit_save_button);shortage_kit_update();}}});var needed_kit_save_button=new Ext.Toolbar.Button({text:'Save Changes',tooltip:'Save all changes currently outstanding',iconCls:'grid_button_save',disabled:true,handler:function(){Gerards.Membership.GridSaver.save_row_login_wrapped(needed_kit_ds,'ajax/needed_kit.php',null,function(success,store,record){if(success){record.commit();}});}});var needed_kit_email_button=new Ext.Toolbar.Button({text:'Email Requester',tooltip:'Click to email the person who requires the selected item',iconCls:'grid_button_email',disabled:true,handler:function(){var selected=needed_kit_grid.getSelectionModel().getSelectedCell();if(selected===null){return;}
var record=needed_kit_grid.getStore().getAt(selected[0]);var owner=record.data.uid;var ids=[];ids.push(owner);var kit=kit_categories_ds.getById(record.data.item_id);if(!kit){return;}
var subject="";var event=events_ds.getById(needed_kit_ds.gerardsEventID);if(event){subject="Muster at "+event.data.name+": ";}
subject=subject+"The "+kit.data.category;if(record.data.notes!==""){subject=subject+" ("+record.data.notes+")";}
subject=subject+" you require";Gerards.Membership.SendEmailForm.send_email_to(ids,subject);}});var needed_kit_delete_button=new Ext.Toolbar.Button({text:'Delete Selected Row',tooltip:'Click to delete the selected row from the database',iconCls:'grid_button_remove',disabled:true,handler:function(){Gerards.Membership.GridSaver.delete_row_login_wrapped(needed_kit_grid,'ajax/needed_kit.php');}});var shortage_kit_ds=new Ext.data.SimpleStore({fields:[{name:'item_id',type:'int'},{name:'quantity',type:'int'}]});function shortage_kit_update()
{var shortage_kit_raw_data=[];needed_kit_ds.each(function(record){var uid=record.data.uid;var att_idx=attendances_ds.findBy(function(findrec,findid){if(findrec.data.uid===uid){return true;}else{return false;}});if(att_idx===-1){return true;}
var attending_rec=attendances_ds.getAt(att_idx);if(attending_rec===undefined||attending_rec.data.attending_id===3){return true;}
var item_id=record.data.item_id;if(item_id===0||item_id===17){return true;}
if(shortage_kit_raw_data[item_id]===undefined){shortage_kit_raw_data[item_id]=0;}
shortage_kit_raw_data[item_id]+=record.data.quantity;return true;});bringing_kit_ds.each(function(record){var uid=record.data.uid;var att_idx=attendances_ds.findBy(function(findrec,findid){if(findrec.data.uid===uid){return true;}else{return false;}});if(att_idx===-1){return true;}
var attending_rec=attendances_ds.getAt(att_idx);if(attending_rec===undefined||attending_rec.data.attending_id!==1){return true;}
var item_id=record.data.item_id;if(item_id===0||item_id===17){return true;}
if(shortage_kit_raw_data[item_id]===undefined){shortage_kit_raw_data[item_id]=0;}
shortage_kit_raw_data[item_id]-=record.data.quantity;return true;});var shortage_kit_data=[];var i,j=0;for(i=0;i<shortage_kit_raw_data.length;i++){if(shortage_kit_raw_data[i]&&shortage_kit_raw_data[i]>0){shortage_kit_data[j++]=[i,shortage_kit_raw_data[i]];}}
shortage_kit_ds.loadData(shortage_kit_data);}
var shortage_kit_grid=undefined;var container_panel=undefined;var attendances_spacer_button=new Ext.Toolbar.Button({text:'<span style="margin-left: 1in;">&nbsp;</span>',disabled:true});var bringing_kit_spacer_button=new Ext.Toolbar.Button({text:'<span style="margin-left: 1in;">&nbsp;</span>',disabled:true});var needed_kit_spacer_button=new Ext.Toolbar.Button({text:'<span style="margin-left: 1in;">&nbsp;</span>',disabled:true});return{panel:function()
{var users_ds=Gerards.Membership.Users.store();var attending_ds=Gerards.Membership.Attending.store();if(events_grid===undefined){events_grid=new Ext.grid.EditorGridPanel({id:'events-grid',anchor:"100% 20%",split:false,store:events_ds,sm:new Ext.grid.CellSelectionModel({listeners:{beforecellselect:function(sm,row_idx,col_idx){if(col_idx===4){return false;}
if(sm.gerardsRequestedRow!==row_idx){var unsaved=attendances_ds.getModifiedRecords().length+
bringing_kit_ds.getModifiedRecords().length+
needed_kit_ds.getModifiedRecords().length;if(unsaved){Ext.Msg.confirm('Unsaved Changes','You have unsaved changes in one or more of the Attendance or Kit tables.  Selecting a different event will discard these changes.  Do you wish to continue anyway?',function(btn){if(btn==='yes'){sm.gerardsRequestedRow=row_idx;sm.select(row_idx,col_idx);}});return false;}else{return true;}}else{return true;}},cellselect:function(sm,row_idx,col_idx){var record=events_ds.getAt(row_idx);attendances_grid.setTitle("Attendance at "+record.data.name);attendances_grid.enable();attendances_ds.gerardsEventID=record.data.id;attendances_ds.load({params:{event_id:record.data.id}});shortage_kit_grid.enable();shortage_kit_ds.removeAll();bringing_kit_grid.setTitle("Spare Kit brought to "+record.data.name);bringing_kit_grid.enable();bringing_kit_ds.gerardsEventID=record.data.id;bringing_kit_ds.load({params:{event_id:record.data.id}});needed_kit_grid.setTitle("Needed Kit at "+record.data.name);needed_kit_grid.enable();needed_kit_ds.gerardsEventID=record.data.id;needed_kit_ds.load({params:{event_id:record.data.id}});},selectionchange:function(sm,selected){if(selected!==null){if(selected.record.data.cancelled){events_cancel_button.setText('Uncancel Event');}else{events_cancel_button.setText('Cancel Event');}
events_cancel_button.enable();events_public_url_button.enable();}else{events_cancel_button.setText('Cancel Event');events_cancel_button.disable();events_public_url_button.disable();}}}}),clicksToEdit:2,enableColumnHide:false,enableColumnMove:false,border:false,autoExpandColumn:'events-name',columns:[{header:"From",sortable:true,dataIndex:'datefrom',width:Gerards.Membership.DateWidth,renderer:function(value,metadata,record){if(record.data.cancelled){metadata.attr='style="text-decoration: line-through;"';}
return Ext.util.Format.date(value,'d M Y');},editor:new Ext.form.DateField({allowBlank:false,format:'d M Y'})},{header:"To",sortable:true,dataIndex:'dateto',width:Gerards.Membership.DateWidth,renderer:function(value,metadata,record){if(record.data.cancelled){metadata.attr='style="text-decoration: line-through;"';}
return Ext.util.Format.date(value,'d M Y');},editor:new Ext.form.DateField({allowBlank:false,format:'d M Y'})},{header:"Event",sortable:true,dataIndex:'name',id:'events-name',renderer:function(value,metadata,record){if(record.data.cancelled){metadata.attr='style="text-decoration: line-through;"';}
return value;},editor:new Ext.form.TextField({allowBlank:false})},{header:"Type",sortable:true,dataIndex:'type',width:50,renderer:function(value,metadata,record){if(record.data.cancelled){metadata.attr='style="text-decoration: line-through;"';}
return value;},editor:new Ext.form.TextField({allowBlank:false})},{header:"WO",sortable:true,dataIndex:'WO_link',width:20,renderer:function(value){if(value!==''&&value!==null){return'<span class="wo_link"><a href="'+value+'" target="_blank">WO</a></span>';}else{return value;}},editor:new Ext.form.TextField({allowBlank:true})},regt_booking_column,indiv_booking_column,private_column,{header:"Last Update",sortable:true,dataIndex:'last_update',width:Gerards.Membership.DateWidth,renderer:Ext.util.Format.dateRenderer('d M Y')},{header:"Last Updated By",sortable:true,dataIndex:'addedby_uid',width:Gerards.Membership.NameWidth,renderer:function(data){var user=users_ds.getById(data);if(user){return user.data.screenname;}else{return'';}}}],tbar:[{text:'Add Event',tooltip:'Click to add an event',iconCls:'grid_button_add',handler:function(){var new_row=new events_reader_record({id:0,datefrom:(new Date()).clearTime(),dateto:(new Date()).clearTime(),name:'',type:'',latitude:0.0,longitude:0.0,cancelled:false,cancelled_reason:'',regt_booking:false,indiv_booking:false,private:false,WO_link:null,public_url:'',addedby_uid:Gerards.Membership.Login.uid(),last_update:(new Date()).clearTime()});events_grid.stopEditing();events_ds.insert(0,new_row);events_grid.startEditing(0,0);events_save_button.enable();}},events_save_button,'-',events_public_url_button,'-',events_cancel_button,'->',{text:'Reload',tooltip:'Click to reload the display, discarding changes',iconCls:'grid_button_refresh',handler:function(){events_ds.rejectChanges();events_ds.reload();events_save_button.disable();}}],plugins:[regt_booking_column,indiv_booking_column,private_column],view:new Ext.grid.GridView({forceFit:true,emptyText:"There doesn't appear to be any events",enableRowBody:true,getRowClass:function(record,idx,rowparams,store){if(record.data.cancelled){rowparams.body='<span style="padding-left: 50px; font-style: italic;">'+record.data.cancelled_reason+' </span>';rowparams.bodyStyle='color: #ff0000;';}else if(record.data.public_url!==null&&record.data.public_url!==''){rowparams.body='<span style="padding-left: 50px; font-style: italic;">'+record.data.public_url+' </span>';rowparams.bodyStyle='color: #0000ff;';}else{rowparams.body='';rowparams.bodyStyle='';}
return'';}}),listeners:{render:function(grid){if(!users_ds.gerardsLoaded){users_ds.on('load',function(store,records,options){this.getView().refresh();},grid,{single:true});}
grid.getStore().load();}}});}
if(attendances_grid===undefined){attendances_grid=new Ext.grid.EditorGridPanel({anchor:"100% 40%",title:'Attendance',disabled:true,store:attendances_ds,region:'center',sm:new Ext.grid.CellSelectionModel({listeners:{selectionchange:function(sm,selected){if(selected!==null){attendances_delete_button.enable();}else{attendances_delete_button.disable();}}}}),clicksToEdit:2,enableColumnHide:false,enableColumnMove:false,autoExpandColumn:'attendances-notes',columns:[{header:"Name",sortable:true,dataIndex:'uid',width:Gerards.Membership.NameWidth,renderer:function(data){var user=users_ds.getById(data);if(user){return user.data.screenname;}else{return'';}},editor:new Ext.form.ComboBox({allowBlank:false,store:users_ds,valueField:'id',displayField:'combined',triggerAction:'all',editable:false})},{header:"Is Attending?",sortable:true,dataIndex:'attending_id',width:50,renderer:function(data){var att=attending_ds.getById(data);if(att){return att.data.level;}else{return'';}},editor:new Ext.form.ComboBox({allowBlank:false,store:attending_ds,valueField:'id',displayField:'level',triggerAction:'all',editable:false})},powder_column,{header:"Notes",sortable:true,dataIndex:'notes',id:'attendances-notes',editor:new Ext.form.TextField({allowBlank:true})},{header:"Last Update",sortable:true,dataIndex:'last_update',width:Gerards.Membership.DateWidth,renderer:Ext.util.Format.dateRenderer('d M Y')},{header:"Last Updated By",sortable:true,dataIndex:'addedby_uid',width:Gerards.Membership.NameWidth,renderer:function(data){var user=users_ds.getById(data);if(user){return user.data.screenname;}else{return'';}}}],tbar:[{text:'Add Me',tooltip:'Click to add a row for yourself',iconCls:'grid_button_add',handler:function(){var my_uid=Gerards.Membership.Login.uid();var existing=attendances_ds.findBy(function(findrec,findid){if(findrec.data.uid===my_uid){return true;}else{return false;}});if(existing!==-1){var existing_record=attendances_ds.getAt(existing);if(existing_record!==undefined){attendances_grid.stopEditing();attendances_grid.startEditing(existing,1);return;}}
var new_row=new attendances_reader_record({id:0,uid:my_uid,attending_id:0,notes:'',event_id:attendances_ds.gerardsEventID,powder:false,addedby_uid:Gerards.Membership.Login.uid(),last_update:(new Date()).clearTime()});attendances_grid.stopEditing();attendances_ds.insert(0,new_row);attendances_grid.startEditing(0,1);}},{text:'Add Someone Else',tooltip:'Click to add a row for someone else',iconCls:'grid_button_add_someone_else',handler:function(){var new_row=new attendances_reader_record({id:0,uid:0,attending_id:0,notes:'',event_id:attendances_ds.gerardsEventID,powder:false,addedby_uid:Gerards.Membership.Login.uid(),last_update:(new Date()).clearTime()});attendances_grid.stopEditing();attendances_ds.insert(0,new_row);attendances_grid.startEditing(0,0);}},attendances_save_button,{text:'Email Attendees',tooltip:'Click to email those attending this event',iconCls:'grid_button_email',handler:function(){attendances_grid.stopEditing();var uid=Gerards.Membership.Login.uid();var ids=[];attendances_ds.each(function(record){if(record.data.attending_id===1||record.data.attending_id===2){if(record.data.uid!==uid){ids.push(record.data.uid);}}});var event=events_ds.getById(attendances_ds.gerardsEventID);if(!event){return;}
var subject="Muster at "+event.data.name;Gerards.Membership.SendEmailForm.send_email_to(ids,subject);}},'-',attendances_spacer_button,'-',attendances_delete_button,'->',{text:'Reload',tooltip:'Click to reload this table, discarding changes',iconCls:'grid_button_refresh',handler:function(){attendances_ds.rejectChanges();attendances_ds.reload();attendances_save_button.disable();}}],plugins:[powder_column],view:new Ext.grid.GroupingView({enableGroupingMenu:false,forceFit:true,showGroupName:false,groupTextTpl:'{text} ({[values.rs.length]} {[values.rs.length > 1 ? "People" : "Person"]})',emptyText:"",listeners:{rowremoved:function(view,row_idx,record){view.refresh();}}}),listeners:{render:function(grid){if(!users_ds.gerardsLoaded){users_ds.on('load',function(store,records,options){this.getView().refresh();},grid,{single:true});}
if(!attending_ds.gerardsLoaded){attending_ds.on('load',function(store,records,options){this.getView().refresh();},grid,{single:true});}
grid.getStore().load();},afteredit:function(editevent){if(editevent.field==='attending_id'){editevent.grid.getStore().sort('event_id',"ASC");editevent.grid.getView().refresh();}
var existing=attendances_ds.findBy(function(findrec,findid){if(findid===editevent.record.id){return true;}else{return false;}});if(existing!==-1){editevent.grid.getSelectionModel().select(existing,editevent.column);editevent.grid.getView().focusCell(existing,editevent.column);}},validateedit:function(editevent){if(editevent.field==='uid'){var existing=attendances_ds.findBy(function(findrec,findid){if(findrec.data.uid===editevent.value){return true;}else{return false;}});if(existing!==-1){Gerards.Membership.Alert.msg(5,"Duplicate","Merging data with existing entry");var existing_record=attendances_ds.getAt(existing);if(existing_record===undefined){Gerards.Membership.Alert.msg(5,"Merge Failed","Couldn't get existing record");return false;}
if(editevent.record.data.attending_id===0){editevent.record.set('attending_id',existing_record.data.attending_id);}
if(editevent.record.data.notes===''){editevent.record.set('notes',existing_record.data.notes);}
if(editevent.record.data.powder===false){editevent.record.set('powder',existing_record.data.powder);}
existing_record.reject();attendances_ds.remove(existing_record);editevent.grid.getStore().sort('event_id',"ASC");editevent.grid.getView().refresh();}}
return true;}}});}
if(bringing_kit_grid===undefined){bringing_kit_grid=new Ext.grid.EditorGridPanel({layout:'fit',anchor:"100% 50%",title:"Spare Kit",disabled:true,store:bringing_kit_ds,sm:new Ext.grid.CellSelectionModel({listeners:{selectionChange:function(sm,selected){if(selected!==null){bringing_kit_delete_button.enable();bringing_kit_email_button.enable();}else{bringing_kit_delete_button.disable();bringing_kit_email_button.disable();}}}}),clicksToEdit:2,enableColumnHide:false,enableColumnMove:false,autoExpandColumn:'bringing-kit-notes',columns:[{header:"Name",sortable:true,dataIndex:'uid',width:Gerards.Membership.NameWidth,renderer:function(data){var user=users_ds.getById(data);if(user){return user.data.screenname;}else{return'';}},editor:new Ext.form.ComboBox({allowBlank:false,store:users_ds,valueField:'id',displayField:'combined',triggerAction:'all',editable:false})},{header:"Item",sortable:true,dataIndex:'item_id',width:Gerards.Membership.ItemWidth,renderer:function(data){var kit=kit_categories_ds.getById(data);if(kit){return kit.data.category;}else{return'';}},editor:new Ext.form.ComboBox({allowBlank:false,store:kit_categories_ds,valueField:'id',displayField:'category',triggerAction:'all',editable:false})},{header:"Qty",sortable:true,dataIndex:'quantity',width:Gerards.Membership.NumberWidth,editor:new Ext.form.NumberField({allowBlank:false,allowDecimals:false,allowNegative:false})},{header:"Notes",sortable:true,dataIndex:'notes',id:'bringing-kit-notes',editor:new Ext.form.TextField({allowBlank:true})},{header:"Last Update",sortable:true,dataIndex:'last_update',width:Gerards.Membership.DateWidth,renderer:Ext.util.Format.dateRenderer('d M Y')},{header:"Last Updated By",sortable:true,dataIndex:'addedby_uid',width:Gerards.Membership.NameWidth,renderer:function(data){var user=users_ds.getById(data);if(user){return user.data.screenname;}else{return'';}}}],tbar:[{text:'Add Item',tooltip:'Click to add a row',iconCls:'grid_button_add',handler:function(){var uid=Gerards.Membership.Login.uid();var new_row=new bringing_kit_reader_record({id:0,uid:uid,event_id:bringing_kit_ds.gerardsEventID,item_id:0,quantity:0,notes:'',addedby_uid:uid,last_update:(new Date()).clearTime()});bringing_kit_grid.stopEditing();bringing_kit_ds.insert(0,new_row);bringing_kit_grid.startEditing(0,0);}},bringing_kit_save_button,bringing_kit_email_button,'-',bringing_kit_spacer_button,'-',bringing_kit_delete_button,'->',{text:'Reload',tooltip:'Click to reload the display, discarding changes',iconCls:'grid_button_refresh',handler:function(){bringing_kit_ds.rejectChanges();bringing_kit_ds.reload();bringing_kit_save_button.disable();}}],view:new Ext.grid.GridView({autoFill:true,emptyText:''}),listeners:{render:function(grid){if(!users_ds.gerardsLoaded){users_ds.on('load',function(store,records,options){this.getView().refresh();},grid,{single:true});}
if(!kit_categories_ds.gerardsLoaded){kit_categories_ds.on('load',function(store,records,options){this.getView().refresh();},grid,{single:true});}
grid.getStore().load();}}});}
if(needed_kit_grid===undefined){needed_kit_grid=new Ext.grid.EditorGridPanel({layout:'fit',anchor:"100% 50%",title:"Needed Kit",disabled:true,store:needed_kit_ds,sm:new Ext.grid.CellSelectionModel({listeners:{selectionChange:function(sm,selected){if(selected!==null){needed_kit_delete_button.enable();needed_kit_email_button.enable();}else{needed_kit_delete_button.disable();needed_kit_email_button.disable();}}}}),clicksToEdit:2,enableColumnHide:false,enableColumnMove:false,autoExpandColumn:'needed-kit-notes',columns:[{header:"Name",sortable:true,dataIndex:'uid',width:Gerards.Membership.NameWidth,renderer:function(data){var user=users_ds.getById(data);if(user){return user.data.screenname;}else{return'';}},editor:new Ext.form.ComboBox({allowBlank:false,store:users_ds,valueField:'id',displayField:'combined',triggerAction:'all',editable:false})},{header:"Item",sortable:true,dataIndex:'item_id',width:Gerards.Membership.ItemWidth,renderer:function(data){var kit=kit_categories_ds.getById(data);if(kit){return kit.data.category;}else{return'';}},editor:new Ext.form.ComboBox({allowBlank:false,store:kit_categories_ds,valueField:'id',displayField:'category',triggerAction:'all',editable:false})},{header:"Qty",sortable:true,dataIndex:'quantity',width:Gerards.Membership.NumberWidth,editor:new Ext.form.NumberField({allowBlank:false,allowDecimals:false,allowNegative:false})},{header:"Notes",sortable:true,dataIndex:'notes',id:'needed-kit-notes',editor:new Ext.form.TextField({allowBlank:true})},{header:"Last Update",sortable:true,dataIndex:'last_update',width:Gerards.Membership.DateWidth,renderer:Ext.util.Format.dateRenderer('d M Y')},{header:"Last Updated By",sortable:true,dataIndex:'addedby_uid',width:Gerards.Membership.NameWidth,renderer:function(data){var user=users_ds.getById(data);if(user){return user.data.screenname;}else{return'';}}}],tbar:[{text:'Add Item',tooltip:'Click to add a row',iconCls:'grid_button_add',handler:function(){var uid=Gerards.Membership.Login.uid();var new_row=new needed_kit_reader_record({id:0,uid:uid,event_id:needed_kit_ds.gerardsEventID,item_id:0,quantity:0,notes:'',addedby_uid:uid,last_update:(new Date()).clearTime()});needed_kit_grid.stopEditing();needed_kit_ds.insert(0,new_row);needed_kit_grid.startEditing(0,0);}},needed_kit_save_button,needed_kit_email_button,'-',needed_kit_spacer_button,'-',needed_kit_delete_button,'->',{text:'Reload',tooltip:'Click to reload the display, discarding changes',iconCls:'grid_button_refresh',handler:function(){needed_kit_ds.rejectChanges();needed_kit_ds.reload();needed_kit_save_button.disable();}}],view:new Ext.grid.GridView({autoFill:true,emptyText:''}),listeners:{render:function(grid){if(!users_ds.gerardsLoaded){users_ds.on('load',function(store,records,options){this.getView().refresh();},grid,{single:true});}
if(!kit_categories_ds.gerardsLoaded){kit_categories_ds.on('load',function(store,records,options){this.getView().refresh();},grid,{single:true});}
grid.getStore().load();}}});}
if(shortage_kit_grid===undefined){shortage_kit_grid=new Ext.grid.GridPanel({layout:'fit',region:'east',width:150,title:"Kit Shortage",disabled:true,store:shortage_kit_ds,autoExpandColumn:'shortage-kit-itemid',columns:[{header:"Item",sortable:true,dataIndex:'item_id',id:'shortage-kit-itemid',renderer:function(data){var kit=kit_categories_ds.getById(data);if(kit){return kit.data.category;}else{return'';}}},{header:"Qty",sortable:true,dataIndex:'quantity',width:Gerards.Membership.NumberWidth}],view:new Ext.grid.GridView({emptyText:'No kit shortage reported'}),listeners:{render:function(grid){if(!kit_categories_ds.gerardsLoaded){kit_categories_ds.on('load',function(store,records,options){this.getView().refresh();},grid,{single:true});}}}});}
if(container_panel===undefined){container_panel=new Ext.Panel({title:'Events',layout:'anchor',region:'center',disabled:true,items:[events_grid,attendances_grid,{layout:'border',anchor:"100% 40%",border:false,items:[{layout:'anchor',region:'center',border:false,items:[bringing_kit_grid,needed_kit_grid]},shortage_kit_grid]}]});}
return container_panel;}};}();
// js/documents.js

Gerards.Membership.Documents=function()
{var docs_grid=undefined;var docs_reader_record=Ext.data.Record.create([{name:'id',type:'int'},{name:'filename',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'display_name',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'category_id',type:'int'},{name:'category',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'doc_order',type:'int'},{name:'size',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'last_update',type:'date'}]);var docs_ds=new Ext.data.GroupingStore({proxy:new Ext.data.HttpProxy({url:'ajax/documents.php',disableCaching:false}),reader:new Ext.data.JsonReader({root:'documents',id:'id'},docs_reader_record),groupField:'category_id',sortInfo:{field:'doc_order',direction:"DESC"},listeners:{loadexception:function(proxy,options,response,err){store_load_exception(proxy,options,response,err,docs_ds);}}});return{panel:function()
{if(docs_grid===undefined){docs_grid=new Ext.grid.GridPanel({title:'Documents',disabled:true,store:docs_ds,sm:new Ext.grid.RowSelectionModel({listeners:{rowselect:function(sm,row,record){window.open('ajax/get_document.php?doc='+record.data.filename);sm.clearSelections();}}}),enableColumnHide:false,enableColumnMove:false,autoExpandColumn:'docs_name',columns:[{header:"Name",sortable:true,dataIndex:'display_name',id:'docs_name'},{header:"Category",sortable:true,dataIndex:'category_id',hidden:true,renderer:function(data,meta,rec){return rec.data.category;}},{header:"Size",sortable:true,dataIndex:'size',width:Gerards.Membership.NumberWidth},{header:"Last Update",sortable:true,dataIndex:'last_update',width:Gerards.Membership.DateWidth,renderer:Ext.util.Format.dateRenderer('d M Y')}],tbar:['->',{text:'Reload',tooltip:'Click to reload this table',iconCls:'grid_button_refresh',handler:function(){docs_ds.reload();}}],view:new Ext.grid.GroupingView({enableGroupingMenu:false,forceFit:true,showGroupName:false,groupTextTpl:'{text} ({[values.rs.length]} {[values.rs.length > 1 ? "Items" : "Item"]})',emptyText:""}),listeners:{render:function(grid){grid.getStore().load();}}});}
return docs_grid;}};}();
// js/posters.js

Gerards.Membership.Posters=function()
{var posters_view=undefined;var posters_reader_record=Ext.data.Record.create([{name:'id',type:'int'},{name:'filename',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'caption',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'size',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'customisable',type:'boolean',convert:function(val){return convert_boolean(val);}},{name:'custom_default',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'thumbnail',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'last_update',type:'date'}]);var posters_ds=new Ext.data.Store({autoLoad:false,proxy:new Ext.data.HttpProxy({url:'ajax/posters.php',disableCaching:false}),reader:new Ext.data.JsonReader({root:'posters',id:'id'},posters_reader_record),listeners:{load:function(store,records,options){store.gerardsLoaded=true;},loadexception:function(proxy,options,response,err){store_load_exception(proxy,options,response,err,posters_ds);}}});var posters_view_tpl=new Ext.XTemplate('<tpl for=".">','<div class="poster-thumb-wrap">','<div class="thumb">','<img src="ajax/get_poster.php?task=thumb&file={thumbnail}" title="{caption}">','</div>','<div class="caption">','<span>{caption}</span>','</div>','<div class="details">','<span>Size: {size}</span>','<span>Last Update: {[fm.date (values.last_update, "d M Y")]}</span>','</div>','</div>','</tpl>','<div class="x-clear"></div>');posters_view_tpl.compile();function submit_posters_customise_form()
{var form=posters_customise_form.getForm();if(!form.isValid()){return;}
params=form.getValues();Ext.apply(params,{task:'customise',id:form.PosterID,file:form.PosterFilename});window.open('ajax/get_poster.php?'+Ext.urlEncode(params));posters_customise_form_win.hide();}
var posters_customise_form=new Ext.FormPanel({labelWidth:40,url:'ajax/get_customised_poster.php',frame:true,title:'Customise Poster',defaultType:'textfield',monitorValid:true,keys:[{key:[10,13],fn:submit_posters_customise_form}],items:{fieldLabel:'Text',name:'custom_text',allowBlank:false,anchor:'100%'},buttons:[{text:'OK',formBind:true,handler:submit_posters_customise_form},{text:'Cancel',handler:function(){posters_customise_form_win.hide();}}]});var posters_customise_form_win=new Ext.Window({layout:'fit',width:400,height:150,closable:false,resizeable:false,plain:true,border:false,modal:true,constrainHeader:true,items:[posters_customise_form]});return{panel:function()
{if(posters_view===undefined){posters_view=new Ext.Panel({title:'Posters',disabled:true,autoHeight:true,autoScroll:true,bodyStyle:'padding: 5px;',layout:'anchor',id:'poster-view',items:[{anchor:"100%",autoHeight:true,border:false,cls:'cbox_content',html:"<p style='text-align: center;'>Select a poster to download.  If the poster is customisable, you will be prompted for a short line of text to add.</p>"},new Ext.DataView({anchor:"100%",store:posters_ds,tpl:posters_view_tpl,autoHeight:true,overClass:'x-view-over',itemSelector:'div.poster-thumb-wrap',emptyText:'No posters to display',listeners:{click:function(view,idx,node,event){var selected=posters_ds.getAt(idx);if(selected!==undefined){var customisable=selected.data.customisable;if(customisable){var form=posters_customise_form.getForm();form.reset();form.PosterID=selected.data.id;form.PosterFilename=selected.data.filename;posters_customise_form_win.on('show',function(win){if(selected.data.custom_default!==null){var form_custom=form.findField('custom_text');if(form_custom){form_custom.setValue(selected.data.custom_default);}}});posters_customise_form_win.show();}else{window.open('ajax/get_poster.php?file='+selected.data.filename);}}}}})],listeners:{render:function(view){posters_ds.load();}}});}
return posters_view;}};}();
// js/personal.js

Gerards.Membership.Personal=function()
{var personal_panel=undefined;var rank_ds=Gerards.Membership.Rank.store();var arm_ds=Gerards.Membership.Arm.store();var users_ds=Gerards.Membership.Users.store();var personal_reader_record=Ext.data.Record.create([{name:'id',type:'int'},{name:'name',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'screenname',type:'string',convert:function(val){return html_entity_unescape(val);}}]);var form_data_reader_record=Ext.data.Record.create([{name:'id',type:'int'},{name:'fullname',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'dob',type:'date',convert:function(val){return convert_date(val);}},{name:'honorary_budgie_regt',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'rank',type:'int'},{name:'arm',type:'int'},{name:'sk_appointments',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'address1',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'address2',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'address3',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'postcode',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'phonenum',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'form_email',type:'string',convert:function(val){return html_entity_unescape(val);}}]);var family_data_reader_record=Ext.data.Record.create([{name:'id',type:'int'},{name:'spouse',type:'int'},{name:'child1',type:'int'},{name:'child2',type:'int'},{name:'child3',type:'int'},{name:'child4',type:'int'},{name:'child5',type:'int'},{name:'child6',type:'int'}]);var progress_data_reader_record=Ext.data.Record.create([{name:'id',type:'int'},{name:'date_form_received',type:'date',convert:function(val){return convert_date(val);}},{name:'date_form_posted',type:'date',convert:function(val){return convert_date(val);}},{name:'date_cheque_cashed',type:'date',convert:function(val){return convert_date(val);}},{name:'date_card_posted',type:'date',convert:function(val){return convert_date(val);}}]);return{panel:function()
{if(personal_panel===undefined){var app_data_panel=new Ext.FormPanel({anchor:"100%",autoHeight:true,border:false,labelAlign:'right',labelWidth:200,url:'ajax/personal.php',defaultType:'textfield',monitorValid:true,trackResetOnLoad:true,reader:new Ext.data.JsonReader({root:'data',id:'id'},personal_reader_record),defaults:{anchor:"-200"},items:[{fieldLabel:'Name',name:'name',allowBlank:false},{fieldLabel:'Screen Name',name:'screenname',allowBlank:true}],buttons:[{text:'Update',formBind:true,handler:function(){app_data_panel.getForm().submit({method:'POST',waitTitle:'Connecting',waitMsg:'Sending data...',params:{task:'update',uid:Gerards.Membership.Login.uid()},success:function(form,action){var users_ds=Gerards.Membership.Users.store();users_ds.reload();var rec=new personal_reader_record({id:0,name:'',screenname:''});form.updateRecord(rec);form.loadRecord(rec);},failure:function(form,action){switch(action.failureType){case Ext.form.Action.CLIENT_INVALID:Ext.Msg.alert("Failure","Form fields may not be submitted with invalid values");break;case Ext.form.Action.CONNECT_FAILURE:Ext.Msg.alert("Failure","Authentication server is unreachable: "+action.reponse.responseText);break;case Ext.form.Action.SERVER_INVALID:Ext.Msg.alert("Update Failed!",action.result.errors.reason);break;}}});}},{text:'Reset',handler:function(){app_data_panel.getForm().reset();}}]});var form_data_items=[{fieldLabel:'Full Name',name:'fullname',allowBlank:false},{fieldLabel:'DOB',name:'dob',xtype:'datefield',format:'d M Y',editable:false,allowBlank:true},{fieldLabel:'Regiment (if not Gerard\'s)',name:'honorary_budgie_regt',allowBlank:true},new Ext.form.ComboBox({fieldLabel:'Rank',allowBlank:false,hiddenName:'rank',store:rank_ds,valueField:'id',displayField:'name',triggerAction:'all',editable:false}),new Ext.form.ComboBox({fieldLabel:'Arm',allowBlank:false,hiddenName:'arm',store:arm_ds,valueField:'id',displayField:'combined',triggerAction:'all',editable:false}),{fieldLabel:'SK Appointments',name:'sk_appointments',allowBlank:true},{fieldLabel:'Address',name:'address1',allowBlank:true},{fieldLabel:'Address',name:'address2',allowBlank:true},{fieldLabel:'Address',name:'address3',allowBlank:true},{fieldLabel:'Post Code',name:'postcode',allowBlank:true},{fieldLabel:'Phone No.',name:'phonenum',allowBlank:true},{fieldLabel:'Email',name:'form_email',allowBlank:true}];var form_data_panel=new Ext.FormPanel({anchor:"100%",autoHeight:true,border:false,labelAlign:'right',labelWidth:200,url:'ajax/formdata.php',defaultType:'textfield',monitorValid:true,trackResetOnLoad:true,reader:new Ext.data.JsonReader({root:'members',id:'id'},form_data_reader_record),defaults:{anchor:"-200"},items:form_data_items,buttons:[{text:'Update',formBind:true,handler:function(){form_data_panel.getForm().submit({method:'POST',waitTitle:'Connecting',waitMsg:'Sending data...',params:{task:'update',uid:Gerards.Membership.Login.uid()},success:function(form,action){var rec=new form_data_reader_record({id:0,fullname:'',dob:'',rank:0,arm:0,sk_appointments:'',address1:'',address2:'',address3:'',postcode:'',phonenum:'',form_email:''});form.updateRecord(rec);form.loadRecord(rec);},failure:function(form,action){switch(action.failureType){case Ext.form.Action.CLIENT_INVALID:Ext.Msg.alert("Failure","Form fields may not be submitted with invalid values");break;case Ext.form.Action.CONNECT_FAILURE:Ext.Msg.alert("Failure","Authentication server is unreachable: "+action.reponse.responseText);break;case Ext.form.Action.SERVER_INVALID:Ext.Msg.alert("Update Failed!",action.result.errors.reason);break;}}});}},{text:'Reset',handler:function(){form_data_panel.getForm().reset();}}],listeners:{render:function(panel){rank_ds.load();arm_ds.load();}}});var family_data_items=[new Ext.form.ComboBox({fieldLabel:'Spouse',allowBlank:true,hiddenName:'spouse',store:users_ds,valueField:'id',valueNotFoundText:'None',displayField:'spouse_combined',triggerAction:'all',editable:false}),new Ext.form.ComboBox({fieldLabel:'Child no. 1',allowBlank:true,hiddenName:'child1',store:users_ds,valueField:'id',valueNotFoundText:'None',displayField:'spouse_combined',triggerAction:'all',editable:false}),new Ext.form.ComboBox({fieldLabel:'Child no. 2',allowBlank:true,hiddenName:'child2',store:users_ds,valueField:'id',valueNotFoundText:'None',displayField:'spouse_combined',triggerAction:'all',editable:false}),new Ext.form.ComboBox({fieldLabel:'Child no. 3',allowBlank:true,hiddenName:'child3',store:users_ds,valueField:'id',valueNotFoundText:'None',displayField:'spouse_combined',triggerAction:'all',editable:false}),new Ext.form.ComboBox({fieldLabel:'Child no. 4',allowBlank:true,hiddenName:'child4',store:users_ds,valueField:'id',valueNotFoundText:'None',displayField:'spouse_combined',triggerAction:'all',editable:false}),new Ext.form.ComboBox({fieldLabel:'Child no. 5',allowBlank:true,hiddenName:'child5',store:users_ds,valueField:'id',valueNotFoundText:'None',displayField:'spouse_combined',triggerAction:'all',editable:false}),new Ext.form.ComboBox({fieldLabel:'Child no. 6',allowBlank:true,hiddenName:'child6',store:users_ds,valueField:'id',valueNotFoundText:'None',displayField:'spouse_combined',triggerAction:'all',editable:false})];var family_data_panel=new Ext.FormPanel({anchor:"100%",autoHeight:true,border:false,labelAlign:'right',labelWidth:200,url:'ajax/formdata.php',defaultType:'textfield',monitorValid:true,trackResetOnLoad:true,reader:new Ext.data.JsonReader({root:'members',id:'id'},family_data_reader_record),defaults:{anchor:"-200"},items:family_data_items,buttons:[{text:'Update',formBind:true,handler:function(){family_data_panel.getForm().submit({method:'POST',waitTitle:'Connecting',waitMsg:'Sending data...',params:{task:'update-family',uid:Gerards.Membership.Login.uid()},success:function(form,action){var rec=new family_data_reader_record({id:0,spouse:0,child1:0,child2:0,child3:0,child4:0,child5:0,child6:0});form.updateRecord(rec);form.loadRecord(rec);},failure:function(form,action){switch(action.failureType){case Ext.form.Action.CLIENT_INVALID:Ext.Msg.alert("Failure","Form fields may not be submitted with invalid values");break;case Ext.form.Action.CONNECT_FAILURE:Ext.Msg.alert("Failure","Authentication server is unreachable: "+action.reponse.responseText);break;case Ext.form.Action.SERVER_INVALID:Ext.Msg.alert("Update Failed!",action.result.errors.reason);break;}}});}},{text:'Reset',handler:function(){family_data_panel.getForm().reset();}}],listeners:{render:function(panel){users_ds.reload();}}});var progress_data_panel=new Ext.FormPanel({anchor:"100%",autoHeight:true,border:false,labelAlign:'right',labelWidth:200,url:'ajax/formdata.php',defaultType:'textfield',monitorValid:true,trackResetOnLoad:true,reader:new Ext.data.JsonReader({root:'members',id:'id'},progress_data_reader_record),defaults:{anchor:"-200"},items:[{fieldLabel:'Date Form Received',name:'date_form_received',xtype:'datefield',format:'d M Y',allowBlank:true,readOnly:true,hideTrigger:true},{fieldLabel:'Date Form Posted To SK',name:'date_form_posted',xtype:'datefield',format:'d M Y',allowBlank:true,readOnly:true,hideTrigger:true},{fieldLabel:'Date Cheque Cashed',name:'date_cheque_cashed',xtype:'datefield',format:'d M Y',allowBlank:true,readOnly:true,hideTrigger:true},{fieldLabel:'Date Card Posted To Member',name:'date_card_posted',xtype:'datefield',format:'d M Y',allowBlank:true,readOnly:true,hideTrigger:true}]});personal_panel=new Ext.Panel({title:"Personal Details",layout:'anchor',region:'center',autoScroll:true,disabled:true,bodyStyle:'padding: 5px;',items:[{anchor:"95%",layout:'anchor',autoHeight:true,border:true,items:[{anchor:"100%",autoHeight:true,border:false,cls:'cbox_content',html:"<p style='text-align: center;'>This section controls how your name will be displayed in the roster application</p>"},app_data_panel]},{anchor:"95%",layout:'anchor',autoHeight:true,border:true,items:[{anchor:"100%",autoHeight:true,border:false,cls:'cbox_content',html:"<p style='text-align: center;'>This section contains your SK membership details, and is used for generating rejoining forms.  The email address here does not have to match the email address used for logging in to this application.  If you update your address or phone number, the regimental membership secretary will be automatically informed.</p>"},form_data_panel]},{anchor:"95%",layout:'anchor',autoHeight:true,border:true,items:[{anchor:"100%",autoHeight:true,border:false,cls:'cbox_content',html:"<p style='text-align: center;'>This section controls which other members are included when generating a rejoining form, turning it into a family application.</p>"},family_data_panel]},{anchor:"95%",layout:'anchor',autoHeight:true,border:true,items:[{anchor:"100%",autoHeight:true,border:false,cls:'cbox_content',html:"<p style='text-align: center;'>This section shows the progress of your application through the system.</p>"},progress_data_panel]}],listeners:{activate:function(panel){app_data_panel.getForm().load({params:{uid:Gerards.Membership.Login.uid()},waitMsg:'Loading...'});form_data_panel.getForm().load({params:{uid:Gerards.Membership.Login.uid()},waitMsg:'Loading...'});family_data_panel.getForm().load({params:{uid:Gerards.Membership.Login.uid(),task:'query-family'},waitMsg:'Loading...'});progress_data_panel.getForm().load({params:{uid:Gerards.Membership.Login.uid(),task:'query-progress'},waitMsg:'Loading...'});}}});}
return personal_panel;}};}();
// js/attending.js

Gerards.Membership.Attending=function()
{var attending_ds=undefined;return{store:function()
{if(attending_ds===undefined){attending_ds=new Ext.data.Store({autoLoad:false,proxy:new Ext.data.HttpProxy({url:'ajax/attending.php',disableCaching:false}),reader:new Ext.data.JsonReader({root:'attending',id:'id'},[{name:'id',type:'int'},{name:'level',type:'string',convert:function(val){return html_entity_unescape(val);}}]),listeners:{load:function(store,records,options){store.gerardsLoaded=true;},loadexception:function(proxy,options,response,err){store_load_exception(proxy,options,response,err,attending_ds);}}});}
return attending_ds;}};}();
// js/admin.js

Gerards.Membership.Admin=function()
{var pending_registrations_win=undefined;var pending_registrations_grid=undefined;var nonrejoined_member_win=undefined;var nonrejoined_member_grid=undefined;var edit_member_win=undefined;var edit_member_grid=undefined;var edit_member_ds=Gerards.Membership.Members.store();var rank_ds=Gerards.Membership.Rank.store();var arm_ds=Gerards.Membership.Arm.store();var system_privileges_win=undefined;var system_privileges_grid=undefined;var privileges_ds=Gerards.Membership.Privileges.store();var print_envelope_win=undefined;var pending_registrations_ds=new Ext.data.Store({proxy:new Ext.data.HttpProxy({url:'ajax/pending_reg.php',disableCaching:false}),reader:new Ext.data.JsonReader({root:'regs',id:'id'},[{name:'id',type:'int'},{name:'name',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'screenname',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'email',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'sknum',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'approved',type:'boolean'}]),listeners:{update:function(store,record,operation){switch(operation){case Ext.data.Record.EDIT:pending_registrations_save_button.enable();break;case Ext.data.Record.COMMIT:if(store.getModifiedRecords().length>0){pending_registrations_save_button.enable();}else{pending_registrations_save_button.disable();}
break;}}}});var pending_registrations_save_button=new Ext.Toolbar.Button({text:'Save Changes',tooltip:'Save all changes currently outstanding',iconCls:'grid_button_save',disabled:true,handler:function(){Gerards.Membership.GridSaver.save_row_login_wrapped(pending_registrations_ds,'ajax/pending_reg.php',null,function(success,store,record){if(success){if(record.data.approved){record.reject();store.remove(record);}}});}});var pending_registrations_approved_column=new Ext.grid.CheckColumn({header:"Approved",sortable:true,dataIndex:'approved'});var nonrejoined_member_ds=new Ext.data.Store({proxy:new Ext.data.HttpProxy({url:'ajax/nonrejoined_member.php',disableCaching:false}),reader:new Ext.data.JsonReader({root:'nonrejoined',id:'id'},[{name:'id',type:'int'},{name:'name',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'sknum',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'nameorder',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'fullname',type:'string',convert:function(val){return html_entity_unescape(val);}},{name:'rank',type:'int'}])});var nonrejoined_member_form_button=new Ext.Toolbar.Button({text:'Create Form',tooltip:'Generate a form for the selected member(s)',iconCls:'grid_button_form',disabled:true,handler:function(){var sm=nonrejoined_member_grid.getSelectionModel();if(sm.getCount()===0){return;}
var records=sm.getSelections();for(var i=0;i<records.length;i++){if(records[i]){var month=(new Date()).getMonth();if(month>=7&&month<11){window.open('forms/renew.php?uid='+records[i].data.id);}else{window.open('forms/rejoin.php?uid='+records[i].data.id);}}}}});var envelope_address_iframe_preamble='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'+'<html>'+'  <head>'+'    <meta http-equiv="content-type" content="text/html; charset=utf-8"></meta>'+'    <meta name="author" content="Dick Porter"></meta>'+'    <meta name="description" content="Tools for Gerards"></meta>'+'    <meta name="keywords" content="SK, Sealed Knot, Gerards"></meta>'+'    <title>Budgie Roster</title>'+'    <link href="css/membership.css" type="text/css" rel="stylesheet" media="screen"></link>'+'    <link href="css/print.css" type="text/css" rel="stylesheet" media="print"></link>'+'    <'+'script type="text/javascript">function envelope_print () { print (); }<'+'/script>'+'  </head>'+'  <body>'+'    <div class="envelope_padding">&nbsp;</div>'+'    <div class="envelope_address">';var envelope_address_iframe_trailer='    </div>'+'  </body>'+'</html>';function envelope_address_iframe_load(address)
{var iframe=document.getElementById('envelope-address-iframe');var iframe_doc=iframe.contentDocument;if(iframe_doc===undefined||iframe_doc===null){iframe_doc=iframe.contentWindow.document;}
iframe_doc.open();iframe_doc.write(envelope_address_iframe_preamble+address+envelope_address_iframe_trailer);iframe_doc.close();}
function submit_edit_member_form(edit_form,form_win)
{var form=edit_form.getForm();if(!form.isValid()){return;}
form.doAction('oosubmit',{method:'POST',waitTitle:'Connecting',waitMsg:'Sending data...',params:{task:'update'},success:function(form,action){edit_member_ds.reload();form_win.close();},failure:function(form,action){switch(action.failureType){case Ext.form.Action.CLIENT_INVALID:Ext.Msg.alert("Failure","Form fields may not be submitted with invalid values");break;case Ext.form.Action.CONNECT_FAILURE:Ext.Msg.alert("Failure","Database server is unreachable: "+action.response.responseText);break;case Ext.form.Action.SERVER_INVALID:Ext.Msg.alert("Database Update Failed!",action.result.errors.reason);break;}}});}
function edit_member_edit(record){var users_ds=Gerards.Membership.Users.store();var form_win;var edit_form=new Ext.FormPanel({url:'ajax/members.php',frame:true,labelAlign:'right',width:600,autoHeight:true,monitorValid:true,keys:[{key:[10,13],fn:function(){submit_edit_member_form(edit_form,form_win);}}],items:{layout:'column',border:false,autoHeight:true,items:[{columnwidth:0.5,bodyStyle:'padding: 5px;',layout:'form',labelWidth:75,defaults:{anchor:'100%'},defaultType:'textfield',autoHeight:true,border:false,items:[{name:'id',xtype:'hidden'},{fieldLabel:'App Name',name:'name',allowBlank:false},{fieldLabel:'Name Order',name:'nameorder',allowBlank:false},{fieldLabel:'Screen Name',name:'screenname',allowBlank:true},{fieldLabel:'Email',name:'email',allowBlank:true},{fieldLabel:'SK Number',name:'sknum',vtype:'sknumDummy',allowBlank:true},{fieldLabel:'Full Member',name:'full_member',xtype:'checkbox'},new Ext.form.ComboBox({fieldLabel:'Rank',allowBlank:false,hiddenName:'rank',store:rank_ds,valueField:'id',displayField:'name',triggerAction:'all',editable:false}),new Ext.form.ComboBox({fieldLabel:'Arm',allowBlank:false,hiddenName:'arm',store:arm_ds,valueField:'id',displayField:'combined',triggerAction:'all',editable:false}),{fieldLabel:'SK Appts',name:'sk_appointments',allowBlank:true},{fieldLabel:'Hon. Budgie',name:'honorary_budgie',xtype:'checkbox'},{fieldLabel:'Regiment',name:'honorary_budgie_regt',allowBlank:true},{fieldLabel:'SKF10 Page',name:'skf10_page',xtype:'numberfield'},{fieldLabel:'Form Recvd',name:'date_form_received',xtype:'datefield',format:'d M Y',allowBlank:true},{fieldLabel:'Form Posted',name:'date_form_posted',xtype:'datefield',format:'d M Y',allowBlank:true},{fieldLabel:'Cheque',name:'date_cheque_cashed',xtype:'datefield',format:'d M Y',allowBlank:true},{fieldLabel:'Card Posted',name:'date_card_posted',xtype:'datefield',format:'d M Y',allowBlank:true}]},{columnwidth:0.5,bodyStyle:'padding: 5px;',layout:'form',labelWidth:80,defaults:{anchor:'100%'},defaultType:'textfield',autoHeight:true,border:false,items:[{fieldLabel:'Full Name',name:'fullname',allowBlank:false},{fieldLabel:'DOB',name:'dob',xtype:'datefield',format:'d M Y',allowBlank:true,editable:false},{fieldLabel:'Address',name:'address1',allowBlank:true},{fieldLabel:'Address',name:'address2',allowBlank:true},{fieldLabel:'Address',name:'address3',allowBlank:true},{fieldLabel:'Post Code',name:'postcode',allowBlank:true},{fieldLabel:'Phone No.',name:'phonenum',allowBlank:true},{fieldLabel:'Form Email',name:'form_email',allowBlank:true},new Ext.form.ComboBox({fieldLabel:'Spouse',allowBlank:true,hiddenName:'spouse',store:users_ds,valueField:'id',valueNotFoundText:'None',displayField:'spouse_combined',triggerAction:'all',editable:false}),new Ext.form.ComboBox({fieldLabel:'Child no. 1',allowBlank:true,hiddenName:'child1',store:users_ds,valueField:'id',valueNotFoundText:'None',displayField:'spouse_combined',triggerAction:'all',editable:false}),new Ext.form.ComboBox({fieldLabel:'Child no. 2',allowBlank:true,hiddenName:'child2',store:users_ds,valueField:'id',valueNotFoundText:'None',displayField:'spouse_combined',triggerAction:'all',editable:false}),new Ext.form.ComboBox({fieldLabel:'Child no. 3',allowBlank:true,hiddenName:'child3',store:users_ds,valueField:'id',valueNotFoundText:'None',displayField:'spouse_combined',triggerAction:'all',editable:false}),new Ext.form.ComboBox({fieldLabel:'Child no. 4',allowBlank:true,hiddenName:'child4',store:users_ds,valueField:'id',valueNotFoundText:'None',displayField:'spouse_combined',triggerAction:'all',editable:false}),new Ext.form.ComboBox({fieldLabel:'Child no. 5',allowBlank:true,hiddenName:'child5',store:users_ds,valueField:'id',valueNotFoundText:'None',displayField:'spouse_combined',triggerAction:'all',editable:false}),new Ext.form.ComboBox({fieldLabel:'Child no. 6',allowBlank:true,hiddenName:'child6',store:users_ds,valueField:'id',valueNotFoundText:'None',displayField:'spouse_combined',triggerAction:'all',editable:false})]}]},buttons:[{text:'Update',formBind:true,handler:function(){submit_edit_member_form(edit_form,form_win);}},{text:'Cancel',handler:function(){form_win.close();}}],listeners:{afterlayout:function(container,layout){edit_form.getForm().loadRecord(record);}}});edit_form.doLayout();form_win=new Ext.Window({layout:'fit',title:'Editing '+record.data.fullname+' ('+record.data.screenname+')',width:650,autoHeight:true,closable:true,closeAction:'close',resizeable:false,constrainHeader:true,modal:false,items:[edit_form]});form_win.show();}
var edit_member_edit_button=new Ext.Toolbar.Button({text:'Edit Member',tooltip:'Click to edit the selected member(s)',iconCls:'grid_button_edit',disabled:true,handler:function(){var sm=edit_member_grid.getSelectionModel();if(sm.getCount()===0){return;}
var records=sm.getSelections();for(var i=0;i<records.length;i++){if(records[i]){edit_member_edit(records[i]);}}}});var edit_member_form_received_button=new Ext.Toolbar.Button({text:'Form Received',tooltip:'Inform member(s) that the form has been received today',iconCls:'grid_button_form_received',disabled:true,handler:function(){var sm=edit_member_grid.getSelectionModel();if(sm.getCount()===0){return;}
var records=sm.getSelections();for(var i=0;i<records.length;i++){if(records[i]){Gerards.Membership.GridSaver.ajax_request_login_wrapped('Updating form received date...','ajax/members.php',{task:'form_received',id:records[i].data.id},function(success){if(success){edit_member_ds.reload();}});}}}});var edit_member_form_posted_button=new Ext.Toolbar.Button({text:'Form Posted',tooltip:'Inform member(s) that the form has been posted on to the SK membership secretary today',iconCls:'grid_button_form_posted',disabled:true,handler:function(){var sm=edit_member_grid.getSelectionModel();if(sm.getCount()===0){return;}
var records=sm.getSelections();for(var i=0;i<records.length;i++){if(records[i]){Gerards.Membership.GridSaver.ajax_request_login_wrapped('Updating form posted date...','ajax/members.php',{task:'form_posted',id:records[i].data.id},function(success){if(success){edit_member_ds.reload();}});}}}});var edit_member_cheque_cashed_button=new Ext.Toolbar.Button({text:'Cheque Cashed',tooltip:'Inform member(s) that the cheque has been cashed today',iconCls:'grid_button_cheque_cashed',disabled:true,handler:function(){var sm=edit_member_grid.getSelectionModel();if(sm.getCount()===0){return;}
var records=sm.getSelections();for(var i=0;i<records.length;i++){if(records[i]){Gerards.Membership.GridSaver.ajax_request_login_wrapped('Updating cheque cashed date...','ajax/members.php',{task:'cheque_cashed',id:records[i].data.id},function(success){if(success){edit_member_ds.reload();}});}}}});var edit_member_card_posted_button=new Ext.Toolbar.Button({text:'Card Posted',tooltip:'Inform member(s) that the card has been posted today',iconCls:'grid_button_card_posted',disabled:true,handler:function(){var sm=edit_member_grid.getSelectionModel();if(sm.getCount()===0){return;}
var records=sm.getSelections();for(var i=0;i<records.length;i++){if(records[i]){Gerards.Membership.GridSaver.ajax_request_login_wrapped('Updating card posted date...','ajax/members.php',{task:'card_posted',id:records[i].data.id},function(success){if(success){edit_member_ds.reload();}});}}}});var system_privileges_save_button=new Ext.Toolbar.Button({text:'Save Changes',tooltip:'Save all changes currently outstanding',iconCls:'grid_button_save',disabled:true,handler:function(){Gerards.Membership.GridSaver.save_row_login_wrapped(privileges_ds,'ajax/privileges.php',null,function(success,store,record){if(success){record.commit();}});}});privileges_ds.on('update',function(store,record,operation){switch(operation){case Ext.data.Record.EDIT:this.enable();break;case Ext.data.Record.COMMIT:enable_button_if_dirty(store,this);break;}},system_privileges_save_button,null);var system_privileges_system_column=new Ext.grid.CheckColumn({header:"System",sortable:true,dataIndex:'priv_system',width:45});var system_privileges_membership_column=new Ext.grid.CheckColumn({header:"Membership",sortable:true,dataIndex:'priv_membership',width:45});var system_privileges_musket_column=new Ext.grid.CheckColumn({header:"Musket",sortable:true,dataIndex:'priv_musket',width:45});function is_current_member(rec)
{var today=new Date();var current_year=today.getFullYear();var current_month=today.getMonth();var current_sknum_year;var next_sknum_year;if(rec.data.honorary_budgie===true){return false;}
if(current_month===11){current_sknum_year=String.fromCharCode(65+current_year-2002);next_sknum_year=current_sknum_year;}else{current_sknum_year=String.fromCharCode(65+current_year-2003);next_sknum_year=String.fromCharCode(65+current_year-2002);}
var form_date=rec.data.date_form_received;var sknum=rec.data.sknum;if((sknum.substring(0,6)==='*dummy')||(sknum.charAt(1)===current_sknum_year)||(sknum.charAt(1)===next_sknum_year)||((form_date!==null)&&(form_date!==0))){return true;}else{return false;}}
function calculate_statistics()
{var arm_count=[];var rank_count=[];var arm_name=[];var rank_name=[];var arm_count_max=0;var rank_count_max=0;var arm_counts='';var arm_labels='';var rank_counts='';var rank_labels='';var total=0;var rejoined=0;var i;arm_ds.each(function(rec){arm_name[rec.data.id]=rec.data.combined;arm_count[rec.data.id]=0;});rank_ds.each(function(rec){rank_name[rec.data.id]=rec.data.name;rank_count[rec.data.id]=0;});edit_member_ds.each(function(rec){if(rec){if(!is_current_member(rec)){return true;}
total++;arm_count[rec.data.arm]++;if(arm_count[rec.data.arm]>arm_count_max){arm_count_max=arm_count[rec.data.arm];}
rank_count[rec.data.rank]++;if(rank_count[rec.data.rank]>rank_count_max){rank_count_max=rank_count[rec.data.rank];}
if(rec.data.date_form_received!==null&&rec.data.date_form_received!==0){rejoined++;}}});for(i=0;i<arm_count.length;i++){if(arm_count[i]&&arm_count[i]>0){if(arm_counts!==''){arm_counts=arm_counts+',';arm_labels=arm_labels+'|';}
arm_counts=arm_counts+arm_count[i];arm_labels=arm_labels+escape(arm_name[i]+' ('+arm_count[i]+')');}}
var arm_chart='<img src="http://chart.apis.google.com/chart?chs=700x300&amp;cht=p&amp;chco=0000FF&amp;chtt=Membership+By+Arm&amp;chd=t:'+arm_counts+'&amp;chds=0,'+arm_count_max+'&amp;chl='+arm_labels+'"/>';for(i=0;i<rank_count.length;i++){if(rank_count[i]&&rank_count[i]>0){if(rank_counts!==''){rank_counts=rank_counts+',';rank_labels=rank_labels+'|';}
rank_counts=rank_counts+rank_count[i];rank_labels=rank_labels+escape(rank_name[i]+' ('+rank_count[i]+')');}}
var rank_chart='<img src="http://chart.apis.google.com/chart?chs=700x300&amp;cht=p&amp;chco=0000FF&amp;chtt=Membership+By+Rank&amp;chd=t:'+rank_counts+'&amp;chds=0,'+rank_count_max+'&amp;chl='+rank_labels+'"/>';var rejoin_chart='<img src="http://chart.apis.google.com/chart?chs=700x300&amp;cht=gom&amp;chtt=Rejoined+Count&amp;chd=t:'+rejoined+'&amp;chds=0,'+total+'&amp;chl='+escape(rejoined+'/'+total)+'"/>';var statistics_win=new Ext.Window({layout:'fit',title:'Membership Statistics',width:740,height:600,autoScroll:true,closable:true,closeAction:'close',resizeable:true,modal:false,constrainHeader:true,cls:'cbox_content',html:rejoin_chart+'<br style="clear: both;"/><p style="margin-top: 50px;"/>'+arm_chart+'<br style="clear: both;"/><p style="margin-top: 50px;"/>'+rank_chart});statistics_win.show();}
function display_membership_by_arm()
{var current_member_ds=new Ext.data.GroupingStore({reader:Gerards.Membership.Members.reader(),groupField:'simplified_arm',sortInfo:{field:'rankorder',direction:"DESC"}});current_member_ds.add(edit_member_ds.getRange());current_member_ds.filterBy(is_current_member);current_member_ds.groupBy('simplified_arm',true);var membership_by_arm_grid=new Ext.grid.GridPanel({store:current_member_ds,sm:new Ext.grid.RowSelectionModel({}),enableColumnHide:false,enableColumnMove:false,enableHdMenu:false,border:false,autoExpandColumn:'membership_by_arm_name',columns:[{header:"Name",sortable:false,dataIndex:'name',id:'membership_by_arm_name'},{header:"Arm",sortable:false,dataIndex:'simplified_arm',hidden:true,renderer:function(data,meta,rec){return rec.data.simplified_arm;}},{header:"Rank",sortable:false,dataIndex:'rank',renderer:function(data){var rank=rank_ds.getById(data);if(rank){return rank.data.name;}else{return'';}}}],view:new Ext.grid.GroupingView({enableGroupingMenu:false,forceFit:true,showGroupName:false,groupTextTpl:'{text} ({[values.rs.length]} {[values.rs.length > 1 ? "Members" : "Member"]})',emptyText:""})});var membership_by_arm_win=new Ext.Window({layout:'fit',title:'Membership By Arm',width:740,height:600,autoScroll:true,closable:true,closeAction:'close',resizeable:true,modal:false,constrainHeader:true,items:[membership_by_arm_grid]});membership_by_arm_win.show();}
return{pending_registrations:function()
{if(pending_registrations_win===undefined){pending_registrations_grid=new Ext.grid.EditorGridPanel({store:pending_registrations_ds,sm:new Ext.grid.CellSelectionModel({}),clicksToEdit:2,enableColumnHide:false,enableColumnMove:false,border:false,autoExpandColumn:'pending_registrations_name',columns:[pending_registrations_approved_column,{header:"Name",sortable:true,dataIndex:'name',id:'pending_registrations_name',editor:new Ext.form.TextField({allowBlank:false})},{header:"Screen Name",sortable:true,dataIndex:'screenname',editor:new Ext.form.TextField({allowBlank:true})},{header:"Email",sortable:true,dataIndex:'email',editor:new Ext.form.TextField({allowBlank:false,vtype:'email'})},{header:"SK Number",sortable:true,dataIndex:'sknum',editor:new Ext.form.TextField({allowBlank:false,vtype:'sknum'})}],tbar:[pending_registrations_save_button,'->',{text:'Reload',tooltip:'Click to reload the display, discarding changes',iconCls:'grid_button_refresh',handler:function(){pending_registrations_ds.rejectChanges();pending_registrations_ds.reload();pending_registrations_save_button.disable();}}],plugins:[pending_registrations_approved_column],view:new Ext.grid.GridView({autoFill:true,emptyText:"There are no pending registration requests"}),listeners:{render:function(grid){grid.getStore().load();}}});pending_registrations_win=new Ext.Window({layout:'fit',title:'Pending Registrations',width:600,height:400,closable:true,closeAction:'hide',resizeable:true,modal:true,constrainHeader:true,items:[pending_registrations_grid]});}else{pending_registrations_ds.reload();}
pending_registrations_win.show();},nonrejoined_member:function()
{if(nonrejoined_member_win===undefined){nonrejoined_member_grid=new Ext.grid.GridPanel({store:nonrejoined_member_ds,sm:new Ext.grid.RowSelectionModel({singleSelect:false,listeners:{selectionchange:function(sm){var select_count=sm.getCount();if(select_count>0){nonrejoined_member_form_button.enable();}else{nonrejoined_member_form_button.disable();}}}}),enableColumnHide:false,enableColumnMove:false,border:false,autoExpandColumn:'nonrejoined_member_name',columns:[{header:"Name",sortable:true,dataIndex:'fullname',id:'nonrejoined_member_name'},{header:"Rank",sortable:true,dataIndex:'rank',width:Gerards.Membership.NameWidth,renderer:function(data){var rank=rank_ds.getById(data);if(rank){return rank.data.name;}else{return'';}}}],tbar:[nonrejoined_member_form_button,'->',{text:'Reload',tooltip:'Click to reload the display, discarding changes',iconCls:'grid_button_refresh',handler:function(){nonrejoined_member_ds.reload();}}],view:new Ext.grid.GridView({autoFill:true,emptyText:"There are no non-rejoined members"}),listeners:{render:function(grid){grid.getStore().load();}}});nonrejoined_member_win=new Ext.Window({layout:'fit',title:'Non-rejoined Members',width:600,height:400,closable:true,closeAction:'hide',resizeable:true,modal:true,constrainHeader:true,items:[nonrejoined_member_grid]});}else{nonrejoined_member_ds.reload();}
nonrejoined_member_win.show();},delete_members:function(){},edit_member:function(){if(edit_member_win===undefined){edit_member_grid=new Ext.grid.GridPanel({store:edit_member_ds,sm:new Ext.grid.RowSelectionModel({singleSelect:false,listeners:{selectionchange:function(sm){var select_count=sm.getCount();edit_member_edit_button.disable();edit_member_form_received_button.disable();edit_member_form_posted_button.disable();edit_member_cheque_cashed_button.disable();edit_member_card_posted_button.disable();if(select_count>0){var records=sm.getSelections();edit_member_edit_button.enable();for(var i=0;i<records.length;i++){if(records[i]){var record=records[i];if(record.data.date_form_received===null){edit_member_form_received_button.enable();}
if(record.data.date_form_posted===null){edit_member_form_posted_button.enable();}
if(record.data.date_cheque_cashed===null){edit_member_cheque_cashed_button.enable();}
if(record.data.date_card_posted===null){edit_member_card_posted_button.enable();}}}}}}}),enableColumnHide:false,enableColumnMove:false,border:true,autoExpandColumn:'edit_member_fullname',columns:[{header:"Name",sortable:true,dataIndex:'fullname',id:'edit_member_fullname'},{header:"SK Number",sortable:true,dataIndex:'sknum'},{header:"SKF10",sortable:true,dataIndex:'skf10_page',width:Gerards.Membership.NumberWidth},{header:"Form Recvd",sortable:true,dataIndex:'date_form_received',width:Gerards.Membership.DateWidth,renderer:null_date_renderer('d M Y')},{header:"Form Posted",sortable:true,dataIndex:'date_form_posted',width:Gerards.Membership.DateWidth,renderer:null_date_renderer('d M Y')},{header:"Cheque",sortable:true,dataIndex:'date_cheque_cashed',width:Gerards.Membership.DateWidth,renderer:null_date_renderer('d M Y')},{header:"Card Posted",sortable:true,dataIndex:'date_card_posted',width:Gerards.Membership.DateWidth,renderer:null_date_renderer('d M Y')}],tbar:[{text:'Add Member',tooltip:'Click to add a member',iconCls:'grid_button_add',handler:function(){var new_member=new Gerards.Membership.Members.new_record();edit_member_edit(new_member);}},edit_member_edit_button,{text:'Clear Dates',tooltip:'Clear all the form received/posted dates and SKF10 records',iconCls:'grid_button_dates_clear',handler:function(){Ext.Msg.confirm('Reset Data','This will clear all SKF10 records and form received posted dates.  Do you wish to continue?',function(btn){if(btn==='yes'){Gerards.Membership.GridSaver.ajax_request_login_wrapped('Clearing date and SKF10 records...','ajax/members.php',{task:'clear'},function(success){if(success){edit_member_ds.reload();}});}});}},edit_member_form_received_button,edit_member_form_posted_button,edit_member_cheque_cashed_button,edit_member_card_posted_button,'->',{text:'Reload',tooltip:'Click to reload the display',iconCls:'grid_button_refresh',handler:function(){edit_member_ds.rejectChanges();edit_member_ds.reload();}}],view:new Ext.grid.GridView({autoFill:true,emptyText:"There are no members",onLoad:Ext.emptyFn,listeners:{beforerefresh:function(v){v.scrollTop=v.scroller.dom.scrollTop;v.scrollHeight=v.scroller.dom.scrollHeight;},refresh:function(v){v.scroller.dom.scrollTop=v.scrollTop+(v.scrollTop===0?0:v.scroller.dom.scrollHeight-v.scrollHeight);}}}),listeners:{render:function(grid){grid.getStore().load();}}});edit_member_win=new Ext.Window({layout:'fit',title:'Edit Members',width:800,height:600,closable:true,closeAction:'hide',resizeable:true,constrainHeader:true,modal:false,items:[edit_member_grid]});rank_ds.reload();arm_ds.reload();}else{edit_member_ds.reload();}
edit_member_win.show();},system_privileges:function(){if(system_privileges_win===undefined){system_privileges_grid=new Ext.grid.EditorGridPanel({store:privileges_ds,sm:new Ext.grid.CellSelectionModel(),clicksToEdit:2,enableColumnHide:false,enableColumnMove:false,border:true,autoExpandColumn:'system_privileges_name',columns:[{header:"Name",sortable:true,dataIndex:'combined',id:'system_privileges_name'},system_privileges_system_column,system_privileges_membership_column],tbar:[system_privileges_save_button,'->',{text:'Reload',tooltip:'Click to reload the display, discarding changes',iconCls:'grid_button_refresh',handler:function(){privileges_ds.rejectChanges();privileges_ds.reload();system_privileges_save_button.disable();}}],plugins:[system_privileges_system_column,system_privileges_membership_column],view:new Ext.grid.GridView({autoFill:true,emptyText:"There are no members",onLoad:Ext.emptyFn,listeners:{beforerefresh:function(v){v.scrollTop=v.scroller.dom.scrollTop;v.scrollHeight=v.scroller.dom.scrollHeight;},refresh:function(v){v.scroller.dom.scrollTop=v.scrollTop+(v.scrollTop===0?0:v.scroller.dom.scrollHeight-v.scrollHeight);}}}),listeners:{render:function(grid){grid.getStore().load();}}});system_privileges_win=new Ext.Window({layout:'fit',title:'Edit System Privileges',width:600,height:400,closable:true,closeAction:'close',resizeable:true,constrainHeader:true,modal:false,items:[system_privileges_grid]});}else{privileges_ds.reload();}
system_privileges_win.show();},statistics:function(){rank_ds.reload();arm_ds.reload();if(!edit_member_ds.gerardsLoaded){edit_member_ds.on('load',function(store,records,options){calculate_statistics();},null,{single:true});edit_member_ds.load();}else{calculate_statistics();}},membership_by_arm:function(){rank_ds.reload();arm_ds.reload();if(!edit_member_ds.gerardsLoaded){edit_member_ds.on('load',function(store,records,options){display_membership_by_arm();},null,{single:true});edit_member_ds.load();}else{display_membership_by_arm();}},print_envelope:function(){if(print_envelope_win===undefined){var users_ds=Gerards.Membership.Users.store();var address_panel=new Ext.Panel({layout:'fit',anchor:"100% 50%",border:true,html:"<iframe id='envelope-address-iframe' name='envelope-address-iframe' style='border: none;'></iframe>"});var name_grid=new Ext.grid.GridPanel({anchor:"100% 50%",store:users_ds,sm:new Ext.grid.CellSelectionModel({listeners:{selectionchange:function(sm,selected){if(selected!==null){Ext.Ajax.request({waitMsg:'Loading address...',url:'ajax/format_address.php',params:{skmem:false,uid:selected.record.data.id},disableCaching:false,success:function(response){var response_data=Ext.util.JSON.decode(response.responseText);if(response_data.success===true){envelope_address_iframe_load(response_data.address);}else if(response_data.success===false&&response_data.loggedin===false){Gerards.Membership.Alert.msg(5,'Load Failed','Need to log in again');Gerards.Membership.Login.login(false,function(success){if(success===false){window.location=window.location;}else{sm.fireEvent('selectionchange',sm,selected);}});}else{Gerards.Membership.Alert.msg(5,'Load Failed','Reason: {0}',response_data.errors.reason);}},failure:function(response){Gerards.Membership.Alert.msg(5,'Load Failed','Error code {0}: {1}',response.status,response.statusText);}});}else{envelope_address_iframe_load('');}}}}),enableColumnHide:false,enableColumnMove:false,border:false,autoExpandColumn:'envelope-name-name',columns:[{header:"Name",sortable:true,dataIndex:'name',id:'envelope-name-name'},{header:"Screen Name",sortable:true,dataIndex:'screenname'}],tbar:[{text:'SK Membership',tooltip:'Get address for SK membership secretary',iconCls:'grid_button_group_go',handler:function(){Ext.Ajax.request({waitMsg:'Loading address...',url:'ajax/format_address.php',params:{skmem:true},disableCaching:false,success:function(response){var response_data=Ext.util.JSON.decode(response.responseText);if(response_data.success===true){envelope_address_iframe_load(response_data.address);}else if(response_data.success===false&&response_data.loggedin===false){Gerards.Membership.Alert.msg(5,'Load Failed','Need to log in again');}else{Gerards.Membership.Alert.msg(5,'Load Failed','Reason: {0}',response_data.errors.reason);}},failure:function(response){Gerards.Membership.Alert.msg(5,'Load Failed','Error code {0}: {1}',response.status,response.statusText);}});}},{text:'Print',tooltip:'Print the address',iconCls:'grid_button_printer',handler:function(){var iframe=document.frames?document.frames['envelope-address-iframe']:document.getElementById('envelope-address-iframe');var ifwin=iframe.contentWindow||iframe;ifwin.focus();ifwin.envelope_print();}}],view:new Ext.grid.GridView({autoFill:true,emptyText:"There aren't any users!"}),listeners:{render:function(grid){grid.getStore().reload();}}});print_envelope_win=new Ext.Window({layout:'anchor',title:'Print Envelope',width:600,height:400,closable:true,closeAction:'hide',resizeable:true,modal:true,constrainHeader:true,items:[name_grid,address_panel]});}
print_envelope_win.show();}};}();
