
/**
 * @class Voyeur.Tool.DocumentTypeKwicsGrid
 * @description A panel that provides per-document KWIC data in a tabular format.
 * @extends Ext.grid.GridPanel
 * @extends Voyeur.Tool
 * @author Stéfan Sinclair
 * @since 0.1.1
 */
Voyeur.Tool.DocumentTypeKwicsGrid = Ext.extend(Ext.grid.GridPanel, {
	constructor : function(config) {
		Ext.apply(this, new Voyeur.Tool(config, Voyeur.Tool.DocumentTypeKwicsGrid.prototype.i18n))
		
		var reader =  new Ext.data.JsonReader(
				{root : 'typeKwics.kwics', totalProperty : 'typeKwics["@totalKwics"]'}
				,Ext.data.Record.create([
					{name : 'type',mapping:'@type'},
					{name : 'left',mapping:'@left'},
					{name : 'middle',mapping:'@middle'},
					{name : 'right',mapping:'@right'},
					{name : 'docId', mapping:'@docId'},
					{name : 'docIndex',mapping:'@docIndex',type : 'int'},
					{name : 'offset', mapping:'@offset',type : 'int'}
				]))
		
		var store = new Ext.data.GroupingStore({
			reader: reader
			,groupField:'docIndex'
			,proxy: new Ext.data.HttpProxy({url:this.getTromboneUrl()})
			,listeners : {
				'loadexception' : {
					fn: function(conn, proxy, response, error){
						var alert = Ext.MessageBox.alert("Error", "An error occurred while loading data:<pre style='overflow: auto; clear: both'>\n" + response.responseText+"</pre>");
						alert.setIcon(Ext.MessageBox.ERROR);
					}
					,scope : this
				}
			}
			,remoteSort: true
			,baseParams : {
				tool : 'TypeKwics'
				,context : 5
			}
			,sortInfo : {field: 'offset', direction: "ASC"}
//			,listeners : {
//				'beforeload' : {
//					fn : function(store, options) {
//						if (!store.baseParams.corpus) {
//							store.baseParams.corpus = Voyeur.application.getCorpus().getId();
//						}
//					},
//					scope : this
//				}
//			}
		});
		
		var size = 20;
		
		var xtypePrefix = this.getXType()+'.';

		this.expander = new Ext.grid.RowExpander({context:50});
		this.expander.tromboneUrl = this.getTromboneUrl();
		this.expander.getBodyContent = function(record,index) {
	        var body = '<div id="tmp' + record.id + '">Loading…</div>';
	        Ext.Ajax.request({
	           url: this.tromboneUrl
			   ,params : {
			   		corpus : Voyeur.application.getCorpus().getId()
					,tool : 'DocumentReader'
			   		,docId : record.get('docId')
					,offset : record.get('offset')
					,context : this.context
			   }
	           ,disableCaching: true
	           ,success: function(response, options) {
					var data = Ext.util.JSON.decode(response.responseText);
	               Ext.getDom('tmp' + options.objId).innerHTML = Ext.util.Format.htmlEncode(data.documentText['text']).replace(/\n\s*/g,'<br />').replace(new RegExp(options.type,'gi'),"<span class='keyword'>$&</span>");
	           }
	           ,failure: function(error) {
	               alert(DWRUtil.toDescriptiveString(error, 3));
	           }
			   ,objId: record.id
			   ,type : record.get('type')
	        });

        return body;
//			return Ext.util.Format.htmlEncode(record.get('left')).replace(/\n\s*/, '<br />') + 
//				"<span class='keyword'>" + Ext.util.Format.htmlEncode(record.get('middle')) + '</span>'+
//				Ext.util.Format.htmlEncode(record.get('right')).replace(/\n\s*/, '<br />')
		}
		
		this.expander.beforeExpand = function(record, body, rowIndex){
	        if(this.fireEvent('beforeexpand', this, record, body, rowIndex) !== false){
	            body.innerHTML = this.getBodyContent(record, rowIndex);
	            return true;
	        } else{
	            return false;
	        }
	    }
					
		config.viewConfig = config.viewConfig ? config.viewConfig : {};
		Ext.applyIf(config.viewConfig, {
			forceFit:true,
			emptyText : this.localize('noResults','tool'),
			deferEmptyText: false
			,hideGroupedColumn: true
		})
		
		if (!config.plugins) {config.plugins=[]}
		config.plugins.push(this.expander, new Ext.ux.grid.Favs())

		Ext.applyIf(config, {
			view :  new Ext.grid.GroupingView(config.viewConfig)
			,iconCls : 'table'
			,loadMask : true
			,sm : new Ext.grid.CheckboxSelectionModel(),
			stripeRows : true,
			colModel : new Ext.grid.ColumnModel([
				this.expander		
				,{header : 'Left', css : 'direction: rtl;', dataIndex : 'left', toolTip : Voyeur.localization.get('tool.frequencies_document.term'), renderer : function(val) {val=Ext.util.Format.htmlEncode(val); return val; return "…"+val.substring(val.length-30)}, align : 'right'},
				{header : 'Keyword', dataIndex : 'middle', toolTip : Voyeur.localization.get('tool.frequencies_document.document_index'), renderer : function(val) {return "<span class='keyword'>" +Ext.util.Format.htmlEncode(val) + '</span>';}, align : 'center', width : 50},
				{header : 'Right', dataIndex : 'right', toolTip : Voyeur.localization.get('tool.frequencies_document.document_name'), renderer : function(val) {val = Ext.util.Format.htmlEncode(val); return val; return val.substring(0,30)+"…"}},
				{header : 'Document', dataIndex : 'docIndex', toolTip : Voyeur.localization.get('tool.frequencies_document.document_name'), renderer : {fn: function(val) {return this.getCorpus().getDocument(val).get('title')}, scope: this}, width: 75},
				{header : 'Position', dataIndex : 'offset', toolTip : Voyeur.localization.get('tool.frequencies_document.document_name'), renderer : function(val) {return val}, width : 75, hidden : true}
			]),
			store : store,
			bbar : new Ext.PagingToolbar({
				store : store
		        ,pageSize: size
				,displayInfo: true
				,items : [
					'-',
					{
						text : Voyeur.localization.get(this.xtype+'.context')
						,tooltip : Voyeur.localization.get(this.xtype+'.contextTip')
						,menu : new Ext.menu.Menu({
							items : [
								new Ext.menu.CheckItem({text : '5',checked:true,group:'context'})
								,new Ext.menu.CheckItem({text : '10',checked:false,group:'context'})
								,new Ext.menu.CheckItem({text : '15',checked:false,group:'context'})
								,new Ext.menu.CheckItem({text : '20',checked:false,group:'context'})
								,new Ext.menu.CheckItem({text : '25',checked:false,group:'context'})
							]
							,listeners : {
								'itemclick' : {
									fn : function(item) {
										this.getStore().baseParams.context=item.text;
										this.getStore().reload();
									}
									,scope : this
								}
							}
						})
					}
					,{
						text : Voyeur.localization.get(this.xtype+'.preview')
						,tooltip : Voyeur.localization.get(this.xtype+'.previewTip')
						,menu : new Ext.menu.Menu({
							items : [
								new Ext.menu.CheckItem({text : '10',checked:false,group:'preview'})
								,new Ext.menu.CheckItem({text : '20',checked:false,group:'preview'})
								,new Ext.menu.CheckItem({text : '30',checked:false,group:'preview'})
								,new Ext.menu.CheckItem({text : '40',checked:false,group:'preview'})
								,new Ext.menu.CheckItem({text : '50',checked:true,group:'preview'})
								,new Ext.menu.CheckItem({text : '75',checked:false,group:'preview'})
								,new Ext.menu.CheckItem({text : '100',checked:false,group:'preview'})
								,new Ext.menu.CheckItem({text : '200',checked:false,group:'preview'})
								,new Ext.menu.CheckItem({text : '300',checked:false,group:'preview'})
								,new Ext.menu.CheckItem({text : '400',checked:false,group:'preview'})
								,new Ext.menu.CheckItem({text : '500',checked:false,group:'preview'})
							]
							,listeners : {
								'itemclick' : {
									fn : function(item) {
										this.expander.context = item.text;
										for (var i=0;i<this.getStore().getCount();i++) {
											this.expander.collapseRow(i);
										}
									}
									,scope : this
								}
							}
						})
					}
				]
			})
		});
		Voyeur.Tool.DocumentTypeKwicsGrid.superclass.constructor.apply(this, arguments);
		
		this.addListener('CorpusSummaryResultLoaded', function(src, data) {
			this.getStore().baseParams.corpus=data.corpus['@id'];
		}, this);

		this.addListener('documentTypeSelected', function(src, data) {
			if (this.hidden) {return;}
			this.getStore().baseParams.docIdType = data.docIdType;
			this.getStore().load({params: {start: 0, limit: this.getBottomToolbar().pageSize}})
		}, this);

		this.addListener('documentTypesSelected', function(src, data) {
			if (this.hidden) {return;}
			this.getStore().baseParams.docIdType = data.docIdType;
			this.getStore().load({params: {start: 0, limit: this.getBottomToolbar().pageSize}})
		}, this);

		this.addListener('TypeKwicsResultLoaded', function(src, data) {
			this.getStore().baseParams.corpus=data.corpus['@id'];
			if (data.corpus.documents.length==1) {this.getStore().clearGrouping();}
			this.getStore().loadData(data);
		}, this);
		this.addListener('DocumentTypeKwicsGridBootstrap', function(src, params) {
			if (params.type) {this.getStore().baseParams.type = params.type}
			if (params.docIdType) {this.getStore().baseParams.docIdType=params.docIdType}
			Ext.applyIf(params, {
				start: 0, limit: this.getBottomToolbar().pageSize
			})
			this.update({params : params, tool : ['CorpusSummary','TypeKwics']});
		}, this)

//		this.addListener('voyeurDocumentTermFrequenciesGrid.selectionchange', function(selectionModel) {
//			if (this.hidden) {return;}
//			var records = selectionModel.getSelections();
//			docIdTerms = [];
//			if (records.length>0) {
//				for (var i = 0; i < records.length; i++) {
//					docIdTerms.push(records[i].get('docId')+':'+records[i].get('term'));
//				}
//				this.store.baseParams.docIdTerm = docIdTerms;
//				this.store.load({params: {start : 0, limit : this.getBottomToolbar().pageSize}})
//			}
//		}, this);

		/*
		this.addListener('voyeurCorpusTermFrequenciesChart.itemClicked', function(term, docIndex){
			Voyeur.application.update({
				title : Voyeur.localization.get(this.xtype+'.title'),
				tool: 'CorpusTermsKwicsTool',
				params: {
					query: term,
					doc: docIndex,
					context : 20
				},
				renderTo: this.getId()
			});
		})
		this.addListener('voyeurDocumentTermFrequenciesGrid.gridselection', function(grid){
			var records = grid.getSelectionModel().getSelections();
			if (records.length>0) {
				var docsHash = {};
				var termsHash = {};
				var docs = [];
				var terms = [];
				var record;
				for (var i = 0; i < records.length; i++) {
					var term = records[i].get('term');
					if (!termsHash[term]) {
						termsHash[term] = true;
						terms.push(term);
					}
					var doc = records[i].get('index');
					if (!docsHash[doc]) {
						docsHash[doc] = true;
						docs.push(doc);
					}
				}
				Voyeur.application.update({
					title : Voyeur.localization.get(this.xtype+'.title'),
					tool: 'CorpusTermsKwicsTool',
					params: {
						'query[]': terms,
						'doc[]': docs,
						context : 20
					},
					renderTo: this.getId()
				});
			}
			else {
				var kwicsStore = this.getStore();
				kwicsStore.proxy.data = null;
				kwicsStore.removeAll();
			}
		});
		this.addListener('CorpusTermsKwicsToolResultLoaded', function(data){
			var kwicsStore = this.getStore();
			kwicsStore.proxy.data = data.tool.kwics;
			kwicsStore.load({params:{start:0, limit: this.getBottomToolbar().pageSize}})
			if (!this.hoverTipShown) {
				Voyeur.application.growl("KWIC Tip","Hover over keywords to get more context.",this.getEl().dom)
				this.hoverTipShown=true
			}
		})
		*/
	}

	// private localization variables
	,i18n : {
		title : {en: "Keywords in Context"}
		,help : {en: "This tool shows each occurrence of a selected term with some context (words to the left and right of the keyword)."}
		,context : {en: "Context"}
		,contextTip : {en: "This value determines how many words to display on the left and the right of each keyword."}
		,preview : {en: "Preview"}
		,previewTip : {en: "This value determines how many words to display on the left and the right of each keyword in the preview section (the preview is available by expanding the keyword row)."}
		,selectRowsForResults : {en: "Generate results by selecting rows from the <i>Keyword in Context</i> tool."}
	}
});

Ext.reg('voyeurDocumentTypeKwicsGrid', Voyeur.Tool.DocumentTypeKwicsGrid);
