Ext.namespace('EquipmentRental.Rentals');
    	
    	/* `id` int(10) unsigned NOT NULL auto_increment,
  `type` varchar(255) default NULL,
  `name` varchar(255) default NULL,
  `description` text,
  `serial_number` varchar(255) NOT NULL,
  `hourly_rate` decimal(10,2) default NULL,
  `daily_rate` decimal(10,2) default NULL,
  `weekly_rate` decimal(10,2) default NULL,
  `monthly_rate` decimal(10,2) default NULL,
  `created` datetime default NULL,
  `modified` datetime default NULL,
  */
  
  	// --------------------------------------------------------
   	//		RENTALS ADD ITEM FORM
   	//---------------------------------------------------------
    	EquipmentRental.Rentals.AddItemsForm = Ext.extend(Ext.form.FormPanel, {	    	
		border:false
		,frame:true
		,labelWidth:80
		,url:'http://'+host+'/items/add'

		,constructor:function(config) {
			config = config || {};
			config.listeners = config.listeners || {};
			Ext.applyIf(config.listeners, {
				actioncomplete:function() {
					if(console && console.log) {
						console.log('actioncomplete:', arguments);
					}
				}
				,actionfailed:function() {
					if(console && console.log) {
						console.log('actionfailed:', arguments);
					}
				}
			});
			EquipmentRental.Rentals.AddItemsForm.superclass.constructor.call(this, config);
		}

		,initComponent:function() {		
	
			var config = {
				 defaultType:'textfield'
				,defaults:{anchor:'-24'}
				,monitorValid:true
				,autoScroll:true		
				,items:[{
						name:'rental_out_date'
						,fieldLabel:'Rental out date'
						,allowBlank:false
						,xtype:'datefield'
					},{
						name:'rental_return_date'
						,fieldLabel:'Rental return date'
						,allowBlank:false
						,xtype:'datefield'
					},{
						xtype:'combo',
						scope:this,
						fieldLabel: 'Item',
						id:'item-select',
						name: 'item_id',
						store:Items.selectDataStore,
						displayField:'name',
						valueField: 'id',
						hiddenName: 'item_id',
						mode: 'local',
						triggerAction: 'all',
						typeAhead: true,
						anchor:'95%',						    
						allowBlank:false
					}]
				,buttons:[{
					 text:'Submit'
					,formBind:true
					,scope:this
					,handler:this.submit
				}]
			}; 

	
		Ext.apply(this, Ext.apply(this.initialConfig, config));

		// call parent
		EquipmentRental.Rentals.AddItemsForm.superclass.initComponent.apply(this, arguments);

		// add custom events
		this.addEvents('selected');


		}

		,onRender:function() {
			// call parent
			EquipmentRental.Rentals.AddItemsForm.superclass.onRender.apply(this, arguments);
			this.getForm().waitMsgTarget = this.getEl();
		} 
		
		
		,submit:function() {
			//add item to grid
			this.fireEvent('selected',this);	
		}
		
	 
	}); // eo extend
	
	  
    	// --------------------------------------------------------
   	//		RENTALS GRID ITEM FORM
   	//---------------------------------------------------------
   	EquipmentRental.Rentals.ItemsGrid = Ext.extend(Ext.grid.EditorGridPanel, {
		initComponent:function() {
			var config = {
				store : new Ext.data.Store({
					data: []
					,reader: new Ext.data.ArrayReader({id:'id'}, [
						    {name:'id'}
						   ,{name:'rental_id'}	
						   ,{name:'item_id'}
						   ,{name:'name'}
						   ,{name:'type'}
						   ,{name:'serial_number'}
						   ,{name: 'item_description', type: 'string', mapping: 'name + " " + serial_number'}
						   ,{name:'rental_out_date',type: 'date', dateFormat: 'Y-m-d h:i'}
						   ,{name:'rental_return_date',type: 'date', dateFormat: 'Y-m-d h:i'}
						   ,{name:'hourly_rate', type: 'float'}
						   ,{name:'daily_rate', type: 'float'}
						   ,{name:'weekly_rate', type: 'float'}
						   ,{name:'monthly_rate', type: 'float'}
						   ,{name:'billed_period', type: 'string'}
						   ,{name:'price', type: 'float'}
						   ,{name:'comments'}
					])
			    	})
				,sm:new Ext.grid.CheckboxSelectionModel()				
				,frame:true
				,stripeRows:true
				,footer:true							
				,columns:[		
					new Ext.grid.CheckboxSelectionModel()	
					,{
						 id:'item_description'
						,header:"Item"	
						,width:130
						,sortable:true
						,dataIndex:'item_description'
						,renderer:this.itemDescription.createDelegate(this)						
					},{
						 header:"Rental out date"				
						,sortable:true				
						,dataIndex:'rental_out_date'
						,width:115						
					},{
						 header:"Rental return date"				
						,sortable:true
						,dataIndex:'rental_return_date'	
						,width:135				
					},{
						 header:"Hourly Rate"				
						,sortable:true
						,dataIndex:'hourly_rate'
						,editor:new Ext.form.TextField()
						,tooltip:'Double click the cell to edit'
					},{
						 header:"Daily Rate"				
						,sortable:true
						,dataIndex:'daily_rate'
						,editor:new Ext.form.TextField()
						,tooltip:'Double click the cell to edit'
					},{
						 header:"Weekly Rate"				
						,sortable:true
						,dataIndex:'weekly_rate'
						,editor:new Ext.form.TextField()
						,tooltip:'Double click the cell to edit'
					},{
						 header:"Monthly Rate"				
						,sortable:true
						,dataIndex:'monthly_rate'
						,editor:new Ext.form.TextField()						
						,tooltip:'Double click the cell to edit'
					},{
						 header:"Billed Period"				
						,sortable:true
						,dataIndex:'billed_period'
						,renderer:this.billedPeriod.createDelegate(this)						
					},{
						 header:"Price"				
						,sortable:true
						,dataIndex:'price'						
					}]						
				,tbar:[{
					 text:'Add Record'
					 ,iconCls:'icon-plus'
					 ,scope:this
					 ,handler:function() {										 
						 var win = new Ext.Window({
							 id:'rentalsAddItem-win'
							,title:'Select Item'
							,layout:'fit'
							,width:350
							,height:250
							,closable:true
							,border:false
							,modal:true
							,items:{id:'rentalsAddItem-form', xtype:'rentalsAddItemForm'}
						});

						 win.show();
						 
						 //add listener to update grid
						 var formRef = Ext.getCmp('rentalsAddItem-form');					 
						 var gridRef=this;
						 
						 formRef.on('selected', function(formRef) {					    
						    	win.close();
						    	
						    							    	
						    	//get item data (Items is defined in items.js)
						    	var recordIndex=Items.selectDataStore.find('id',
						    	formRef.getForm().findField('item_id').getValue());
						    	var recordItem=Items.selectDataStore.getAt(recordIndex);
						    	
						    	recordItem.data.rental_out_date=formRef.getForm().findField('rental_out_date').getRawValue();
						    	recordItem.data.rental_return_date=formRef.getForm().findField('rental_return_date').getRawValue();
						    	recordItem.data.item_id=formRef.getForm().findField('item_id').getValue();
						    	recordItem.data.item_description=recordItem.data.name+" "+recordItem.data.serial_number
						    
							
							var json_data=recordItem.data;
							json_data.description=null;//remove description because it breaks the json
							json=Ext.util.JSON.encode(json_data);
							//show loading message
							gridRef.loadMask.show();
							Ext.Ajax.request({
								scope:this								
								,url:'http://'+host+'/rentals/calculateTotals/'	
								,params:{rental_item_row:json}						
								,success: function(response) { 
																
									var responseObj=Ext.decode(response.responseText);
									
									
									//add calculated period and price
									recordItem.data.billed_period=responseObj.billed_period;
						    			recordItem.data.price=responseObj.price;
						    			
									//add new item
									var s = gridRef.getStore();
									var r = new (s.recordType)(recordItem.data);
									s.add(r);
									
									gridRef.fireEvent('changed',gridRef);
									
									//hide loading message
									gridRef.loadMask.hide();
								}
								,failure: function(response) { 
									//parse json response
									var responseObj=Ext.decode(response.responseText);
									
									
									//hide loading message
									gridRef.loadMask.hide();
									this.onFailure('Server error');
								}									 
							});
							
													
								    
						 });	
						 
						 }
					 },'-',{
					 text:'Delete Records'
					 ,scope:this	
					 ,id:'delete-records'			
					 ,iconCls:'icon-delete'
					 ,disabled: true
					 ,handler:function() {
							var records=this.getSelectionModel().getSelections();
							
							//alert(Ext.encode(this.getStore().getRange()));
							
							var data = [];
							Ext.each(this.getStore().getModifiedRecords(), function(record){
							    data.push(record.data);
							});
							

												
							Ext.Msg.show({
								scope:this
								,title: 'Remove Records' 
								,buttons: Ext.MessageBox.YESNOCANCEL
								,msg: 'Remove '+records.length+' records? Data cannot be restored.'
								,fn: function(btnMsg){
									if (btnMsg == 'yes'){
										var store=this.getStore();
										Ext.each(records, function(r) {
							  				store.remove(r);
										});
										
										this.fireEvent('changed',this);
									}										
								}
							});						
							 
							
						}
					}			 
			
				]
				,bbar : new Ext.Toolbar([
					new Ext.Toolbar.Spacer()					
					,new Ext.Toolbar.Spacer()
					,new Ext.Toolbar.Spacer()
					])
				,loadMask:true
				,viewConfig:{forceFit:true,emptyText: 'No Record found'}
				,qtipTpl:new Ext.XTemplate(				 
				 '<div><i>Type:</i> {type}</div>'
				 ,'<div><i>Name:</i> {name}</div>'
				 ,'<div><i>Serial Number:</i> {serial_number}</div>'				 
				 )				 
			}; // eo config object

			// apply config
			Ext.apply(this, Ext.apply(this.initialConfig, config));
				
			this.on('rowclick',function(grid, rowIndex, e){
				//enable edit and delete buttons
				if(grid.getSelectionModel().getSelections().length==1){
					grid.getTopToolbar().items.item('delete-records').enable();
				}
				else if(grid.getSelectionModel().getSelections().length>1){
					grid.getTopToolbar().items.item('delete-records').enable();
				}
				else{
					grid.getTopToolbar().items.item('delete-records').disable();					
				}				
			});
			
			this.on('changed',function(gridRef){
				//get new totals
				var store = gridRef.getStore();
				totals=0;
				store.each(function(store){
					totals+=parseFloat(store.data.price);
				});
		
				var gridBottomToolbar = gridRef.getBottomToolbar().getEl();
				var c =  gridBottomToolbar.update('<table id="rentalItemsTotal"><tr><td>Totals:</td><td><strong>'+totals+'</strong></td></tr></table>');	
			});
		
		
			this.onSuccess=function(msg, title) {
				Ext.Msg.show({
					 title:'Success'
					,msg:msg
					,modal:true
					,icon:Ext.Msg.INFO
					,buttons:Ext.Msg.OK
				});
			} 

		
			this.onFailure=function(msg, title) {
				Ext.Msg.show({
					 title:'Error'
					,msg:msg
					,modal:true
					,icon:Ext.Msg.ERROR
					,buttons:Ext.Msg.OK
				});
			} 
			
			
			// add custom events
        		this.addEvents('changed');
        		
			 

			// call parent
			EquipmentRental.Rentals.ItemsGrid.superclass.initComponent.apply(this, arguments);
		} // eo function initComponent

		,onRender:function() {
	
			// call parent
			EquipmentRental.Rentals.ItemsGrid.superclass.onRender.apply(this, arguments);
			this.store.removeAll();
			// load the store
			//this.store.load({params:{start:0, limit:3}});
			
		} // eo function onRender
		
		
		
		,itemDescription:function(val, cell, record) { 
			// get data
			var data = record.data;
			
			
			// create tooltip
			var qtip = this.qtipTpl.apply(data);

			// return markup
			return '<div qtip="' + qtip +'">'+'Type: '+record.data.type+"<br />" +'Name: '+record.data.name+"<br />"+'s/n: '+record.data.serial_number+'</div>';
		 } // eo function renderLastName
		 
		 ,billedPeriod:function(val, cell, record) { 
			// get data
			var data = record.data;
		
			
			// return markup
			return val.split(", ").join('<br />');
		 } // eo function renderLastName

});
    	
    	
 
    	
    	// --------------------------------------------------------
   	//		RENTALS FORM 	
   	//---------------------------------------------------------
   	EquipmentRental.Rentals.Form = Ext.extend(Ext.form.FormPanel, {	    	
	     	border:false
		,frame:true
		,labelWidth:80
		,url:'http://'+host+'/rentals/add'	
		,id:'rentalsForm'
		,constructor:function(config) {
			config = config || {};
			config.listeners = config.listeners || {};
			Ext.applyIf(config.listeners, {
				actioncomplete:function() {
					if(typeof console!='undefined') {
						console.log('actioncomplete:', arguments);
					}
				}
				,actionfailed:function() {
					if(typeof console!='undefined') {
						console.log('actionfailed:', arguments);
					}
				}
			});
			EquipmentRental.Rentals.Form.superclass.constructor.call(this, config);
		}

	    ,initComponent:function() {		
			
			var config = {
				 defaultType:'textfield'
				,defaults:{anchor:'-24'}
				,monitorValid:true
				,autoScroll:true		
				,items: [{				   
				    collapsible: true
				    ,title: 'Customer'			  
				    ,defaultType: 'textfield'				    
				    ,autoHeight:true	
				    ,xtype:'fieldset'
				    ,items: [{
				    		 layout:'column'
				    		 ,xtype:'panel'
				    		 ,border:true    		 	    		 
				    		 ,items:[{
				    		 	columnWidth:1	
							,layout: 'form'					
							,items: [{
								    xtype:'combo',
								    scope:this,
								    fieldLabel: 'Customer',
								    id:'customer-select',
								    name: 'customer_id',
								    store:Customers.selectDataStore,
								    displayField:'name',
								    valueField: 'id',
								    hiddenName: 'customer_id',
								    mode: 'local',
								    triggerAction: 'all',
								    typeAhead: true,
								    anchor:'95%',								    
								    emptyText:'New Customer',
								    listeners:{
								    
              							    }
								}]
				    		 	},{
							columnWidth:.5	
							,layout: 'form'	
							,defaultType: 'textfield'				
							,items: [{							    
							    fieldLabel: 'First Name',
							    name: 'first_name',
							    anchor:'95%'
							}, {							    
							    fieldLabel: 'Last Name',
							    name: 'last_name',
							    anchor:'95%'
							}, {
								name:'email_address'
								,fieldLabel:'E-mail'
								,vtype:'email'					
								,allowBlank:false
								,anchor:'95%'
							}, {
							    	xtype:'textfield'
							    	,name:'phone1'
								,fieldLabel:'Phone1'
								,anchor:'95%'
							}, {
							    	 name:'phone2'
								,fieldLabel:'Phone2'
								,anchor:'95%'
							}]
						    },{
							columnWidth:.5	
							,layout: 'form'	
							,defaultType: 'textfield'					
							,items: [{
							   	name:'address_1'
								,fieldLabel:'Address 1'
								,anchor:'95%'
							},{
							    	 name:'address_2'
								,fieldLabel:'Address 2'
								,anchor:'95%'
							},{
							    	 name:'city'
								,fieldLabel:'City'
								,anchor:'95%'
							},{
							    	name:'state'
								,fieldLabel:'State'
								,anchor:'95%'
							},{
							    	 name:'zip'
								,fieldLabel:'Zip'
								,anchor:'95%'
							},{
							    	name:'country'
								,fieldLabel:'Country'
								,anchor:'95%'
							}]					    
						}]
					}]
				},{
				    xtype:'fieldset'
				    ,title: 'Rental Items'
				    ,collapsible: true
				    ,autoHeight:true
				    ,width:'100%'
				    ,items :[
						{
						id:'rentalItemsGrid'
						,xtype:'rentalsItemsGrid'						
						,autoHeight:true
						,border:true
						}
				    ]
				},{
				    xtype:'fieldset'
				    ,title: 'Additional Info'
				    ,collapsible: true
				    ,autoHeight:true
				    ,collapsed: true
				    ,items :[{
					    fieldLabel: 'Comment'
					    ,name: 'comments'
					    ,xtype:'textarea'
					    ,anchor:'98%'					
				    }]
				}]
				,buttons:[{
					 text:'Preview'
					,formBind:true
					,scope:this
					,handler:this.preview
					,iconCls:'btn-preview'
				},{
					 text:'Save'
					,formBind:true
					,scope:this
					,handler:this.submit
					,iconCls:'btn-save'
				}]
			}; 

			
		Ext.apply(this, Ext.apply(this.initialConfig, config));

		// call parent
		EquipmentRental.Rentals.Form.superclass.initComponent.apply(this, arguments);
		
		// add custom events
        	this.addEvents('saved');
        	
        	 //add listener to combobox to populate form
		 var comboRef = Ext.getCmp('customer-select');	
		
		 comboRef.on({
		 	'select' : {
		 		scope: this
				,fn: function(combo, record, index){
					this.getForm().setValues(record.data);					
				 }
			    }
			   });
			
			   
		this.on('clientvalidation',function(form, valid){
			//disable buttons if grid has no item added
			var gridRef=Ext.getCmp('rentalItemsGrid');
			var store = gridRef.getStore();
			if(valid && store.getCount()==0){
	    			form.buttons[0].setDisabled(true);
	    			form.buttons[1].setDisabled(true);
	    		}
	    		else if(valid && store.getCount()!=0){
	    			form.buttons[0].setDisabled(false);
	    			form.buttons[1].setDisabled(false);
	    		}
		
		});
		
	 
	    }
	    
	    ,onRender:function() {
	 
		// call parent
		EquipmentRental.Rentals.Form.superclass.onRender.apply(this, arguments);

		
		this.getForm().waitMsgTarget = this.getEl();
	 
	    } 	
	    
	    ,preview:function(){
	    	var win = new Ext.Window({
				 id:'rentalsAddItem-win'
				,title:'Preview'
				,layout:'fit'
				,width:550
				,height:450
				,closable:true
				,border:false
				,modal:true				
			});

		win.show();
		
		var gridRef=Ext.getCmp('rentalItemsGrid');

		var store = gridRef.getStore();
		json=[];
		store.each(function(store){
			json += Ext.util.JSON.encode(store.data) + ',';
		});
		//remove last comma
		json = json.substring(0, json.length - 1);
		//make it an array
		json="["+json+"]";

		
		
		Ext.Ajax.request({
					scope:this
					,form: this.getForm().id
					,url:'http://'+host+'/rentals/preview/'	
					,params:{rental_items:json}						
					,success: function(response) { 
						//html code								
						win.body.update(response.responseText);
					}
					,failure: function(response) { 
						//parse json response
						var responseObj=Ext.decode(response.responseText);
						
					
						this.onFailure('Server error');
					}									 
				});
			
		
	    }		    
		
		
		
		
		,submit:function() {
	
	
			var gridRef=Ext.getCmp('rentalItemsGrid');

			var store = gridRef.getStore();
			json=[];
			store.each(function(store){
				json += Ext.util.JSON.encode(store.data) + ',';
			});
			//remove last comma
			json = json.substring(0, json.length - 1);
			//make it an array
			json="["+json+"]";
	
			
	
			this.getForm().submit({
				 url:this.url
				,scope:this
				,success:this.onSuccess
				,failure:this.onFailure
				,params:{rental_items:json}
				,waitMsg:'Saving...'
			});
	
		}
		
		,onSuccess:function(form, action) {
			/*Ext.Msg.show({				
				 title:'Success'
				,scope:this 
				,msg:'Form submitted successfully'
				,modal:true
				,fn: this.onSuccessProcessResult
				,icon:Ext.Msg.INFO
				,buttons:Ext.Msg.OK
			});*/
			var responseObj=Ext.decode(action.response.responseText);
			
			//send the new record id
			this.fireEvent('saved',responseObj.rowId);							
		} 
		
		, onSuccessProcessResult: function(buttonId, text){
			if(buttonId=='ok'){
				this.fireEvent('saved');	
			}
			
		}
		
		,onFailure:function(form, action) {
			var responseObj=Ext.decode(action.response.responseText);
			
			this.showError(action.result.error || responseObj.errormsg);
			
		} 
	
		
		,showError:function(msg, title) {
			title = title || 'Error';
			Ext.Msg.show({
				 title:title
				,msg:msg
				,modal:true
				,icon:Ext.Msg.ERROR
				,buttons:Ext.Msg.OK
			});
		}
	 
	}); // eo extend
	
	
	// --------------------------------------------------------
   	//		RENTALS RETURNED ITEM FORM
   	//---------------------------------------------------------
    	EquipmentRental.Rentals.ReturnedItemForm = Ext.extend(Ext.form.FormPanel, {	    	
		border:false
		,frame:true
		,labelWidth:80
		,url:'http://'+host+'/rentals/returnedItem'

		,constructor:function(config) {
			config = config || {};
			config.listeners = config.listeners || {};
			Ext.applyIf(config.listeners, {
				actioncomplete:function() {
					if(typeof console!='undefined') {
						console.log('actioncomplete:', arguments);
					}
				}
				,actionfailed:function() {
					if(typeof console!='undefined') {
						console.log('actionfailed:', arguments);
					}
				}
			});
			EquipmentRental.Rentals.ReturnedItemForm.superclass.constructor.call(this, config);
		}

		,initComponent:function() {		
	
			var config = {
				 defaultType:'textfield'
				,defaults:{anchor:'-24'}
				,monitorValid:true
				,autoScroll:true		
				,items:[{
						name:'rental_returned_date'
						,fieldLabel:'Rental returned date'
						,allowBlank:false
						,xtype:'datefield'
					},{
						 name:'comments'
						,fieldLabel:'Comment'
						,xtype:'textarea'
					}]
				,buttons:[{
					 text:'Save'
					,formBind:true
					,scope:this
					,handler:this.submit
				}]
			}; 

	
		Ext.apply(this, Ext.apply(this.initialConfig, config));

		// call parent
		EquipmentRental.Rentals.ReturnedItemForm.superclass.initComponent.apply(this, arguments);

		// add custom events
		this.addEvents('selected');


		}

		,onRender:function() {
			// call parent
			EquipmentRental.Rentals.AddItemsForm.superclass.onRender.apply(this, arguments);
			this.getForm().waitMsgTarget = this.getEl();
		} 
		
		
		,submit:function() {
			this.getForm().submit({
				 url:this.url
				,scope:this
				,success:this.onSuccess
				,failure:this.onFailure				
				,waitMsg:'Saving...'
			});	
		}
		
		,onSuccess:function(form, action) {			
			var responseObj=Ext.decode(action.response.responseText);
			
			//send the new record id
			this.fireEvent('saved',responseObj.rowId);							
		}
		
		,onFailure:function(form, action) {
			var responseObj=Ext.decode(action.response.responseText);
			
			this.showError(action.result.error || responseObj.errormsg);
			
		} 
	
		
		,showError:function(msg, title) {
			title = title || 'Error';
			Ext.Msg.show({
				 title:title
				,msg:msg
				,modal:true
				,icon:Ext.Msg.ERROR
				,buttons:Ext.Msg.OK
			});
		} 
		
	 
	}); // eo extend
 
	
   
   	// --------------------------------------------------------
   	//		RENTALS GRID PANEL	
   	//---------------------------------------------------------
   	
   	
	EquipmentRental.Rentals.Grid = Ext.extend(Ext.grid.GridPanel, {
	initComponent:function() {
		var config = {
			 store:new Ext.data.GroupingStore({
				 id:'rentals'				
				,url:'http://'+host+'/rentals/index'
				,sortInfo: {
					field: 'rental_id' 
					,direction: 'DESC'
				}				
				,groupField: 'rental_id'					
				,reader: new Ext.data.JsonReader({
					root:'rows'
					,id:'item_rental_id'
					,totalProperty: 'totalCount'
				},[				  
					{name:'item_id'},
					{name:'item_name'},
					{name:'item_type'},
					{name:'item_serial_number'},
					{name:'item_rental_id'},
					{name:'item_rental_out_date'},
					{name:'item_rental_return_date'},
					{name:'item_returned_date'},
					{name:'item_rental_comments'},
					{name:'item_rental_status'},
					{name:'item_rental_due_time'},
					{name:'customer_name'},
					{name:'customer_id'},
					{name:'rental_created'},
					{name:'rental_id'}		  
				])
				
			})
			,sm:new Ext.grid.CheckboxSelectionModel()
			,columns:[
			new Ext.grid.CheckboxSelectionModel()
			,{
				 id:'rental_id'
				,header:"Rental Id"
				,width:40, sortable:true
				,dataIndex:'rental_id'
				,hidden:true
			},{
				 id:'item_rental_status'
				,header:"Item Status"
				,width:35, sortable:true
				,dataIndex:'item_rental_status'
				,renderer:this.itemRentalStatus.createDelegate(this)
			},{
				 id:'item_type'
				,header:"Item Type"
				,width:30, sortable:true
				,dataIndex:'item_type'
			},{
				 id:'item_name'
				,header:"Item Name"
				,width:50, sortable:true
				,dataIndex:'item_name'
				,renderer:this.itemDescription.createDelegate(this)
			},{
				header:"Rental Out Date"
			   	,width:20, sortable:true			   	
			   	,dataIndex:'item_rental_out_date'
			},{
				header:"Rental Return Date"
			   	,width:20, sortable:true			   	
			   	,dataIndex:'item_rental_return_date'
			},{
				header:"Rental Returned Date"
			   	,width:20, sortable:true			   	
			   	,dataIndex:'item_returned_date'
			}]
			,view: new Ext.grid.GroupingView(
							{
							forceFit:true
							,enableGroupingMenu:false
							/*,enableRowBody:true*/
							,groupTextTpl: '{text} | Customer: {[values.rs[0].data["customer_name"]]} | Created On: {[values.rs[0].data["rental_created"]]} | {[values.rs.length]} {[values.rs.length > 1 ? "Items" : "Item"]}'
							,getRowClass : function(record, rowIndex, p, store){
								p.body=record.get('item_rental_comments');
								
								
								return 'item-'+record.get('item_rental_status');
							    }
							}    

						)			
			,tbar:[{
				 text:'Add New Rental'
				 ,iconCls:'icon-plus'
				 ,scope:this
				 ,handler:function() {										 
					 var win = new Ext.Window({
						 id:'formloadsubmit-win'
						,title:'Rentals'
						,layout:'fit'
						,width:850
						,height:650
						,closable:true
						,border:false
						,items:{id:'formloadsubmit-form', xtype:'rentalsForm'}
					});

					 win.show();
					 
					
					 
					 //add listener to update grid
					 var formRef = Ext.getCmp('formloadsubmit-form');					 
					 var gridRef=this;
					 
					 formRef.on('saved', function(rowId) {					    
					    	win.close();
					    					    
						gridRef.getStore().reload({
							params:{start:0, limit:10}
							,callback:function(){								
								
	
							}
						});
						
						gridRef.disableBtn(gridRef);	
					    				    
					 });	
					 
					 }
				 },'-',{
				 text:'View Invoice'
				 ,scope:this
				 ,iconCls:'icon-view-invoice'
				 ,id: 'view-invoice'
				 ,disabled: true
				 ,handler:function() {
					 var record=this.getSelectionModel().getSelected().data;
					
					 var win = new Ext.Window({
						id:'rentalsViewInvoice-win'
						,title:'Invoice'
						,layout:'fit'
						,width:550
						,height:450
						,closable:true
						,border:false
						,modal:true	
						,autoScroll:true			
						});

					win.show();
					

					Ext.Ajax.request({
						scope:this						
						,url:'http://'+host+'/rentals/view/'+record.rental_id		
						,success: function(response) { 
							//html code								
							win.body.update(response.responseText);
						}
						,failure: function(response) { 
							//parse json response
							var responseObj=Ext.decode(response.responseText);
							

							this.onFailure('Server error');
						}									 
					});		 
					 
				 	
					 }
				},'-',{
				 text:'Delete Rental'
				 ,scope:this
				 ,id: 'delete-records'
				 ,iconCls:'icon-delete'
				 ,disabled: true
				 ,handler:function() {
						var records=this.getSelectionModel().getSelections();
						
						 
					 	var data = [];
						Ext.each(records, function(r) {
						  data.push(r.get('rental_id'));
						});
						
						Ext.Msg.show({
							scope:this
							,title: 'Remove Records' 
							,buttons: Ext.MessageBox.YESNOCANCEL
							,msg: 'Remove '+data.length+' records? Data cannot be restored.'
							,fn: function(btnMsg){
								if (btnMsg == 'yes'){
									Ext.Ajax.request({
										scope:this
										,url:'http://'+host+'/rentals/delete'
										,params: {records: data.join(',')}
										,success: function(response) { 
											//parse json response
											var responseObj=Ext.decode(response.responseText);
											
											if(responseObj.success==true){
												//this.onSuccess(responseObj.okmsg);
												this.getStore().reload({params:{start:0, limit:10}});
												this.disableBtn(this);	
													
											}else{
												this.onFailure(responseObj.errormsg);
											}
										}
										,failure: function(response) { 
											//parse json response
											var responseObj=Ext.decode(response.responseText);
											
											
											this.onFailure('Server error');
										}									 
									});
								}										
							}
						});						
						 
						
					}
				},'-',{
				 text:'Mark Item As Returned'
				 ,scope:this
				 ,iconCls:'icon-returned-item'
				 ,id: 'returned-item'
				 ,disabled: true
				 ,handler:function() {
					 var record=this.getSelectionModel().getSelected().data;
					
					 var win = new Ext.Window({
						id:'rentalsReturnItem-win'
						,title:'Mark As Returned'
						,layout:'fit'
						,width:350
						,height:250
						,closable:true
						,border:false
						,modal:true
						,items:[{id:'rentalsReturnItem-form', xtype:'rentalsReturnedItemForm'}]				
						});

					win.show();
					
					//set form url
					var formRef=Ext.getCmp('rentalsReturnItem-form');
					formRef.url='http://'+host+'/rentals/returnedItem/'+record.item_rental_id;
					
					var gridRef=this;
					
					formRef.on('saved',function(){
						win.close();
					    					    
						gridRef.getStore().reload({
							params:{start:0, limit:10}
							,callback:function(){								
								
	
							}
						});
					});
 
				 	
					 }
				},'->',{
					xtype: 'tbtext'
					,text: 'Search:'
				},' ',{					 
				 xtype: 'textfield'
				 ,listeners: {
					/*specialkey: Rentals.doSearch*/
				 	}
				 },' '				 
			
			]
			,stripeRows:true
			,loadMask:true			
		}; // eo config object

		// apply config
        	Ext.apply(this, Ext.apply(this.initialConfig, config));

		this.bbar = new Ext.PagingToolbar({
			 store:this.store
			,displayInfo:true
			,pageSize:10
		});
		
		this.on('rowclick',function(grid, rowIndex, e){
			//enable edit and delete buttons
			if(grid.getSelectionModel().getSelections().length==1){
				grid.getTopToolbar().items.item('delete-records').enable();				
				grid.getTopToolbar().items.item('returned-item').enable();
				grid.getTopToolbar().items.item('view-invoice').enable();
				
			}
			else if(grid.getSelectionModel().getSelections().length>1){
				grid.getTopToolbar().items.item('delete-records').enable();	
				grid.getTopToolbar().items.item('returned-item').disable();
				grid.getTopToolbar().items.item('view-invoice').enable();
			}
			else{
				grid.getTopToolbar().items.item('delete-records').disable();
				grid.getTopToolbar().items.item('returned-item').disable();
				grid.getTopToolbar().items.item('view-invoice').disable();
			}
		});
		
		this.disableBtn=function(grid){
			grid.getTopToolbar().items.item('delete-records').disable();
			grid.getTopToolbar().items.item('returned-item').disable();
			grid.getTopToolbar().items.item('view-invoice').disable();
		}
		
		
		this.onSuccess=function(msg, title) {
			Ext.Msg.show({
				 title:'Success'
				,msg:msg
				,modal:true
				,icon:Ext.Msg.INFO
				,buttons:Ext.Msg.OK
			});
		} 

		
		this.onFailure=function(msg, title) {
			Ext.Msg.show({
				 title:'Error'
				,msg:msg
				,modal:true
				,icon:Ext.Msg.ERROR
				,buttons:Ext.Msg.OK
			});
		} 
		 

		// call parent
		EquipmentRental.Rentals.Grid.superclass.initComponent.apply(this, arguments);
	} // eo function initComponent
	
	,itemRentalStatus:function(val, cell, record) { 
			// get data
			var data = record.data;
			
			
			// return markup
			return record.data.item_rental_status+"<br />" +record.data.item_rental_due_time;
	}
	
	,itemDescription:function(val, cell, record) { 
			// get data
			var data = record.data;
		
			
			// return markup
			return record.data.item_name+"<br /> s/n: " +record.data.item_serial_number;
	} 

	,onRender:function() {

		// call parent
		EquipmentRental.Rentals.Grid.superclass.onRender.apply(this, arguments);

		// load the store
		this.store.load({params:{start:0, limit:10}});

	} // eo function onRender

});

	// --------------------------------------------------------
   	//		RENTALS PANEL 	
   	//---------------------------------------------------------
	 EquipmentRental.Rentals.Panel = Ext.extend(Ext.Panel, {		
		layout:'border'		 
		
		,initComponent:function() {			
			var config = {
			items:[{
				 region:'north'
				,xtype:'rentalsGrid'
				,title:'Rentals'
				,border:true
				,height:500
				,split: true
			},{			
				region:'center'
				,border:true			
				,height:150
				,title:'Rental Details'
				,html:'Please select a record to see additional details'
				,autoScroll:true
			
			}]
			};
			 
			// apply config
			Ext.apply(this, Ext.apply(this.initialConfig, config));
			 
			// call parent
			EquipmentRental.Rentals.Panel.superclass.initComponent.apply(this, arguments);
		
			
			 
			this.gridContent = this.items.itemAt(0);
			this.detailsContent = this.items.itemAt(1);
		
			
			var detailsContentRef=this.detailsContent
			this.gridContent.getSelectionModel().on('rowselect', function(sm, rowIdx, r) {
				
				Ext.Ajax.request({
							scope:this
							,url:'http://'+host+'/rentals/view/'+r.data.rental_id							
							,success: function(response) { 
								//html code								
								detailsContentRef.body.update(response.responseText);
							}
							,failure: function(response) { 
								//parse json response
								var responseObj=Ext.decode(response.responseText);
								
							
								this.onFailure('Server error');
							}									 
						});
				
				
				//bookTpl.overwrite(detailsContentRef.body, r.data);
			});
		} 
		
		 
	}); 
		
		
    
    	

// --------------------------------------------------------
//		THE MAIN VIEW	
//---------------------------------------------------------

 
// register xtype
Ext.reg('rentalsAddItemForm', EquipmentRental.Rentals.AddItemsForm);
Ext.reg('rentalsReturnedItemForm', EquipmentRental.Rentals.ReturnedItemForm);
Ext.reg('rentalsItemsGrid', EquipmentRental.Rentals.ItemsGrid);
Ext.reg('rentalsForm', EquipmentRental.Rentals.Form); 
Ext.reg('rentalsGrid', EquipmentRental.Rentals.Grid);
Ext.reg('rentalsPanel', EquipmentRental.Rentals.Panel);

    
    




