// JavaScript Document

Ext.namespace('myApp');

/**
 * @class myApp.members
 * 
 * This class manages insert/update/delete of members
 */
myApp.members = function(){

	///////////////////////////////////////////////////////////////////////////
    //---------------------------Private Variables---------------------------//
	///////////////////////////////////////////////////////////////////////////
    //  Warning: Do not access DOM in this area. This area will be executed
	//           before the page has finished loading, so some elements
	//           probably do not exist yet.
	///////////////////////////////////////////////////////////////////////////
		
	var recordMembers; 			// Ext.data.Record

	var readerMembers; 			// Ext.data.JsonReader
	
	var dsCompanies;			// Ext.data.Store
	var dsUserTitles; 			// Ext.data.SimpleStore
	
	var formMember; 			// Ext.FormPanel
	
	var winMember; 				// Ext.Window
	
	var docBody;				// document.body DOM element for loading mask
	
	var updateUserId = 0;
	
	///////////////////////////////////////////////////////////////////////////
    //----------------------------Private Methods----------------------------//
	///////////////////////////////////////////////////////////////////////////
    //  Caution: Do not access DOM in this area unless you are calling these
	//           methods after the page has finished loading (onReady)
	///////////////////////////////////////////////////////////////////////////


   /**
    * Setup the Data Source (setupDataSource)
    * Create Data Record
    * Define Reader
    * Create Data Store(s)
    */
    var setupDataSource = function(){
		
		//-------------------------------------------------------------------------
		// 1.1 Create Data Record
		//-------------------------------------------------------------------------
		
		recordCompanies = Ext.data.Record.create([
			{name: 'co_id', type: 'int'},
			{name: 'co_type', type: 'string'},
			{name: 'co_name', type: 'string'},
			{name: 'co_phone', type: 'string'},
			{name: 'co_fax', type: 'string'},
			{name: 'co_address1', type: 'string'},
			{name: 'co_city', type: 'string'},
			{name: 'co_state', type: 'string'},
			{name: 'co_zip', type: 'string'},
			{name: 'co_website', type: 'string'},
			{name: 'co_contact_name', type: 'string'},
			{name: 'co_contact_title', type: 'string'},
			{name: 'co_contact_email', type: 'string'},
			{name: 'co_num_members', type: 'int'},
			{name: 'co_logo', type: 'string'}
		]);


		recordMembers = Ext.data.Record.create([
			{name: 'user_id', type: 'int'},
			{name: 'user_mls_id', type: 'string'},
			{name: 'user_fname', type: 'string'},
			{name: 'user_lname', type: 'string'},
			{name: 'user_designation', type: 'string'},
			{name: 'user_title', type: 'string'},
			{name: 'user_email', type: 'string'},
			{name: 'user_password', type: 'string'},
			{name: 'user_phone_direct', type: 'string'},
			{name: 'user_phone_fax', type: 'string'},
			{name: 'user_created', type: 'date'},
			{name: 'co_id', type: 'int'}
		]);
	

		//-------------------------------------------------------------------------
		// 1.2 Define Reader
		//-------------------------------------------------------------------------
		
		readerCompanies = new Ext.data.JsonReader({
				totalProperty: "count",
				root: "data",
				id: "co_id"
			}, 
				recordCompanies
		);
		
		
		readerMembers = new Ext.data.JsonReader({
				totalProperty: "count",
				root: "data",
				id: "user_id"
			}, 
				recordMembers
		);
		
		
		//-------------------------------------------------------------------------
		// 1.3 Create Data Store(s)
		//-------------------------------------------------------------------------
		
	   dsCompanies = new Ext.data.Store({
			proxy: new Ext.data.HttpProxy({
				url: urlCompanyGetAll + 'agency',
				disableCaching: false
			}),
			reader: readerCompanies,
			autoLoad: true,
			remoteSort: true
		});


	   dsMembers = new Ext.data.Store({
			proxy: new Ext.data.HttpProxy({
				url: urlMemberGetAll,
				disableCaching: false
			}),
			reader: readerMembers,
			remoteSort: true
		});

		
		dsUserTitles = new Ext.data.SimpleStore({
			fields: ['title_name'],
			data: [
				[''],
				['Associate Broker'],
				['Owner, Qualifying Broker'],
				['Owner, Associate Broker'],
				['Property Manager'],
				['Qualifying Broker']
			]
		});

	} // end setupDataSource

	
	
   /**
    * Define Ext.FormPanel
    * Define handlers
	* @access	private
    */
    var buildMembersForm = function(){
	
        /**
         * 3.1. Create Handlers
         * Create functions to handle various events
         */


		// create the ADD NEW form
		formMember = new Ext.FormPanel({
			bodyStyle:'padding:10px',
			labelAlign: 'right',
			labelWidth: 115,
			frame: true,

			items: [{
				layout: 'form',
				defaults: {
					xtype: 'textfield',
					width: 300
				},			
				items: [{
						xtype: 'combo',
						id: 'my-co-id',
						fieldLabel: 'Company',					
						store: dsCompanies,
						displayField: 'co_name',
						valueField: 'co_id',
						hiddenName: 'co_id',
						typeAhead: true,
						triggerAction: 'all',
						mode: 'local'							
					},{
						id: 'my-user-mls-id',
						fieldLabel: 'MLS Id',
						name: 'user_mls_id',
						maxLength: 5,
						minLength: 2,
						allowBlank: false
					},{
						id: 'my-user-fname',
						fieldLabel: 'First Name',
						name: 'user_fname',
						allowBlank: false
					},{ 
						id: 'my-user-lname',
						fieldLabel: 'Last Name',
						name: 'user_lname',
						allowBlank: false
					},{ 
						id: 'my-user-designation',
						fieldLabel: 'Designation',
						name: 'user_designation'
					},{ 
						xtype: 'combo',
						id: 'my-user-title',
						fieldLabel: 'Title',
						name: 'user_title',
						hiddenName: 'user_title',
						store: dsUserTitles,
						displayField: 'title_name',
						typeAhead: true,
						editable: false,
						mode: 'local',
						triggerAction: 'all'						
					},{
						id: 'my-user-email',
						fieldLabel: 'Email',
						name: 'user_email',
						vtype: 'email'						
					},{ 
						id: 'my-user-phone-direct',
						fieldLabel: 'Direct Phone',
						name: 'user_phone_direct'
					},{ 
						id: 'my-user-phone-fax',
						fieldLabel: 'Fax',
						name: 'user_phone_fax'
					},{ 
						id: 'my-user-password',
						fieldLabel: 'Password',
						name: 'user_password',
						inputType: 'password'
					}
				]
			}]
		});
		
	
		//******************************************************************	
		//	Handler to create new Ext.Window object
		//******************************************************************	
		function createNewWinMember()
		{
			winMember = new Ext.Window({
				title: 'Add New Member',
				layout: 'fit',										   
				width:500,
				height:375,
				closeAction:'hide',
				modal: true,
				shadow: true,					
				items: formMember,					
				keys: {key: Ext.EventObject.ESC, fn: function() {winMember.hide();}},
				buttons: [{
					text:'Save',
					type: 'submit',
					handler: function(){
						if (formMember.getForm().isValid()) {
							formMember.getForm().submit({
								url: strFormMemberURL,
								params:{user_id: updateUserId},
								waitMsg:'Saving...',
								reset: false,
								failure: function(form, action) {
									Ext.myMsgBox.showErrorConn(action.result.info);
								},
								success: function(form, action) {
									//dsMembers.load({ params: {co_id: updateCoId} });										
									Ext.myMsgBox.showConfUpdate(action.result.info);
									winMember.hide();
								}
							});					
						}else{
							Ext.myMsgBox.showWarnReqFields();
						}	    	
					}
				},{
					text: 'Close',
					handler: function(){
						winMember.hide();
					}
				}]
			});

		}//end handler function createNewWinMember
		
		
		//******************************************************************	
		//	Handler to open new Ext.Window
		//******************************************************************	
		function openWinUpdateMember()
		{		
			// create a new Ext.Window if it doesn't already exist
			if (!winMember) { 
				createNewWinMember();
			}
			winMember.setTitle('Update Member Details');
			strFormMemberURL = urlMemberUpdate;
			winMember.show();
		}
		//end handler function openWinUpdateMember


		//******************************************************************	
		//	Handler to clear a form
		//******************************************************************	
		function formResetMember()
		{
			Ext.getCmp('my-user-mls-id').setValue();
			Ext.getCmp('my-user-fname').setValue();
			Ext.getCmp('my-user-lname').setValue();
			Ext.getCmp('my-user-designation').setValue();
			Ext.getCmp('my-user-title').setValue();
			Ext.getCmp('my-user-email').setValue();
			Ext.getCmp('my-user-phone-direct').setValue();
			Ext.getCmp('my-user-phone-fax').setValue();
			Ext.getCmp('my-user-password').setValue();
			Ext.getCmp('my-co-id').setValue();
		}
		//end handler function formResetMember


        /**
         * Function for Deleting record(s)
         */ 
		function doDeleteRowMember(){
			// delete confirmation
			Ext.Msg.show({
				title: 'Delete Member', 
				msg: 'Are you sure you want to delete the selected member?',
				icon: Ext.Msg.WARNING,
				buttons: Ext.Msg.YESNO,
				fn: function(btn){
					if (btn == 'yes'){			
						selectedRow = gridMembers.getSelectionModel().getSelected();
						if (selectedRow) {					
							docBody.mask("Deleting...","x-mask-loading");
							Ext.Ajax.request({
								url: urlMemberDelete,
								params: {del_row_id: selectedRow.data.user_id},
								success: function(form, action) {
									dsMembers.remove(selectedRow);
									docBody.unmask();
								},
								failure: function(form, action) {
									docBody.unmask();
									Ext.myMsgBox.showErrorConn(action.result.info);
								}							
							});
						}
					}
				}
			})
		} // end handler function doDeleteRowMember
		
		
		/**
		 * Add listener to the "My Profile" link in the main left nav.
		 * Allows members to update their personal information.
		 */
		lnkMyProfile = Ext.get('lnk-my-profile');
		
		if (lnkMyProfile) {
			lnkMyProfile.on('click', function(){
				
				formResetMember();
				
				docBody.mask("Loading...","x-mask-loading");			
				
				updateUserId = Ext.get('user_id').getValue();
				
				var dsMyProfile = new Ext.data.Store({
					proxy: new Ext.data.HttpProxy({
						url: urlMemberGet + updateUserId,
						disableCaching: false
					}),
					reader: readerMembers,
					remoteSort: true
				});
				
				dsMyProfile.on('load', function() {
					// set values now
					Ext.getCmp('my-user-mls-id').setValue(dsMyProfile.getAt(0).data['user_mls_id']);
					Ext.getCmp('my-user-fname').setValue(dsMyProfile.getAt(0).data['user_fname']);
					Ext.getCmp('my-user-lname').setValue(dsMyProfile.getAt(0).data['user_lname']);
					Ext.getCmp('my-user-designation').setValue(dsMyProfile.getAt(0).data['user_designation']);
					Ext.getCmp('my-user-title').setValue(dsMyProfile.getAt(0).data['user_title']);
					Ext.getCmp('my-user-email').setValue(dsMyProfile.getAt(0).data['user_email']);
					Ext.getCmp('my-user-phone-direct').setValue(dsMyProfile.getAt(0).data['user_phone_direct']);
					Ext.getCmp('my-user-phone-fax').setValue(dsMyProfile.getAt(0).data['user_phone_fax']);
					Ext.getCmp('my-user-password').setValue();
					Ext.getCmp('my-co-id').setValue(dsMyProfile.getAt(0).data['co_id']);
					
					openWinUpdateMember();
				}); 
				
				dsMyProfile.on('datachanged', function(){
					docBody.unmask();									   
				});
				
				dsMyProfile.load();	    
	
				openWinUpdateMember();
			});
		}
		
	};// end function buildMembersForm



	///////////////////////////////////////////////////////////////////////////
    //------------------------------Public Area------------------------------//
	///////////////////////////////////////////////////////////////////////////

    return {//returns an object=myProducts.myProductsModule with the following
            //properties:

		///////////////////////////////////////////////////////////////////////////
		//---------------------------Public Properties---------------------------//
		///////////////////////////////////////////////////////////////////////////
		// It is considered good practice to put the following in the public area
		// of the module:
		//     text used by module,
		//     default dimensions, styles, 
		//     customizable options, etc.
		///////////////////////////////////////////////////////////////////////////





		///////////////////////////////////////////////////////////////////////////
		//-----------------------------Public Methods----------------------------//
		///////////////////////////////////////////////////////////////////////////
		// Public methods can be called from outside the module using
		//    myProducts.myProductsModule.method_name_here
		// Public methods can access Private Area
		///////////////////////////////////////////////////////////////////////////

		/**
		 * Initialization Method
		 * @access	public
		 */
		init : function(){
			// This is a good place to put DOM dependent tasks 
			// since we know the elements are now loaded.
			
			docBody = Ext.get(document.body);
			
			Ext.QuickTips.init();
			
			setupDataSource();
			
			buildMembersForm();

        }//end of init method

    }//end of return

}();


Ext.onReady(myApp.members.init, myApp.members, true);