From 235d5d8c21a986ea406d31e2c9e9fd6e542f2e8b Mon Sep 17 00:00:00 2001 From: joshua-gould Date: Fri, 8 Apr 2016 13:53:03 -0400 Subject: [PATCH] renamed heatmap.$el --- js/morpheus-latest.min.js | 16 +++--- src/ui/heat_map.js | 13 +++-- src/ui/heat_map_key_listener.js | 2 +- src/ui/heat_map_toolbar.js | 2 +- src/ui/vector_track.js | 86 ++++++++++++++++----------------- 5 files changed, 59 insertions(+), 60 deletions(-) diff --git a/js/morpheus-latest.min.js b/js/morpheus-latest.min.js index bff8a0a..3787279 100644 --- a/js/morpheus-latest.min.js +++ b/js/morpheus-latest.min.js @@ -8,13 +8,13 @@ this.$chart=this.$el.find("[name=chartDiv]");var $dialog=$('
i;i++){var abcd=morpheus.createContingencyTable(list1.setIndex(i),list2.setIndex(i),groupingValue);contingencyTableVector.setValue(i,"[["+abcd[0]+", "+abcd[1]+"], ["+abcd[2]+", "+abcd[3]+"]]");var ratio=abcd[0]*abcd[3]/(abcd[1]*abcd[2]);(isNaN(ratio)||ratio===Number.POSITIVE_INFINITY)&&(ratio=0),oddsRatioVector.setValue(i,ratio),v.setValue(i,morpheus.FisherExact.fisherTest(abcd[0],abcd[1],abcd[2],abcd[3])),pvalues.push(v.getValue(i))}for(var fdr=morpheus.FDR_BH(pvalues),i=0,size=dataset.getRowCount();size>i;i++)fdrVector.setValue(i,fdr[i]);vectors.push(oddsRatioVector),vectors.push(fdrVector),vectors.push(contingencyTableVector),done()}else{if(npermutations>0){options.input.numClassA=aIndices.length,options.input.npermutations=npermutations;var blob=new Blob(["self.onmessage = function(e) {importScripts(e.data.scripts);self.postMessage(morpheus.MarkerSelection.execute(morpheus.Dataset.fromJson(e.data.dataset), e.data.input));}"]),url=window.URL.createObjectURL(blob),worker=new Worker(url),subset=new morpheus.SlicedDatasetView(dataset,null,aIndices.concat(bIndices));return worker.postMessage({scripts:morpheus.Util.getScriptPath(),dataset:morpheus.Dataset.toJson(subset,{columnFields:[],rowFields:[]}),input:options.input}),worker.onmessage=function(e){for(var result=e.data,pvalueVector=dataset.getRowMetadata().add("p_value"),fdrVector=dataset.getRowMetadata().add("FDR(BH)"),kVector=dataset.getRowMetadata().add("k"),i=0,size=pvalueVector.size();size>i;i++)pvalueVector.setValue(i,result.rowSpecificPValues[i]),fdrVector.setValue(i,result.fdr[i]),kVector.setValue(i,result.k[i]),v.setValue(i,result.scores[i]);vectors.push(pvalueVector),vectors.push(fdrVector),vectors.push(kVector),done(),worker.terminate(),window.URL.revokeObjectURL(url)},worker}for(var i=0,size=dataset.getRowCount();size>i;i++)v.setValue(i,f(list1.setIndex(i),list2.setIndex(i)));done()}}},morpheus.NearestNeighbors=function(){},morpheus.NearestNeighbors.Functions=[morpheus.Cosine,morpheus.Euclidean,morpheus.Jaccard,morpheus.Pearson,morpheus.Spearman,morpheus.WeightedMean],morpheus.NearestNeighbors.Functions.fromString=function(s){for(var i=0;i1){for(var columnView=new morpheus.DatasetColumnView(d1),newDataset=new morpheus.Dataset({name:"",rows:1,columns:d1.getColumnCount()}),j=0,ncols=d1.getColumnCount();ncols>j;j++){var v=morpheus.Percentile(columnView.setIndex(j),50);newDataset.setValue(0,j,v)}d1=newDataset}list1=new morpheus.DatasetRowView(d1);var list2=new morpheus.DatasetRowView(dataset),v=dataset.getRowMetadata().getByName(f.toString());null==v&&(v=dataset.getRowMetadata().add(f.toString()));for(var i=0,size=dataset.getRowCount();size>i;i++)v.setValue(i,f(list1,list2.setIndex(i)));isColumns?project.setColumnSortKeys([new morpheus.SortKey(f.toString(),morpheus.SortKey.SortOrder.DESCENDING)],!0):project.setRowSortKeys([new morpheus.SortKey(f.toString(),morpheus.SortKey.SortOrder.DESCENDING)],!0),project.trigger("trackChanged",{vectors:[v],render:["text"],columns:isColumns})}},morpheus.NewHeatMapTool=function(){},morpheus.NewHeatMapTool.prototype={toString:function(){return"New Heat Map ("+morpheus.Util.COMMAND_KEY+"+X)"},execute:function(options){var project=options.project,controller=options.controller,dataset=project.getSelectedDataset({selectedRows:!0,selectedColumns:!0});morpheus.DatasetUtil.shallowCopy(dataset);var name=options.input.name||controller.getName();new morpheus.HeatMap({name:name,dataset:dataset,parent:controller})}},morpheus.OpenDatasetTool=function(){this.customUrls=[]},morpheus.OpenDatasetTool.fileExtensionPrompt=function(file,callback){var ext=morpheus.Util.getExtension(morpheus.Util.getFileName(file));"maf"===ext?this._promptMaf(function(mafGeneFilter){callback(mafGeneFilter)}):"seg"===ext||"segtab"===ext?this._promptSegtab(function(regions){callback(regions)}):callback(null)},morpheus.OpenDatasetTool._promptMaf=function(promptCallback){var formBuilder=new morpheus.FormBuilder;formBuilder.append({name:"MAF_gene_symbols",value:"",type:"textarea",required:!0,help:"Enter one gene symbol per line to filter genes. Leave blank to show all genes."}),morpheus.FormBuilder.showInModal({title:"Gene Symbols",html:formBuilder.$form,close:"OK",callback:function(){for(var text=formBuilder.getValue("MAF_gene_symbols"),lines=morpheus.Util.splitOnNewLine(text),mafGeneFilter=new morpheus.Map,i=0,nlines=lines.length,counter=0;nlines>i;i++){var line=lines[i];""!==line&&mafGeneFilter.set(line,counter++)}var readOptions=mafGeneFilter.size()>0?{mafGeneFilter:mafGeneFilter}:null;promptCallback(readOptions)}})},morpheus.OpenDatasetTool._promptSegtab=function(promptCallback){var formBuilder=new morpheus.FormBuilder;formBuilder.append({name:"regions",value:"",type:"textarea",required:!0,help:"Define the regions over which you want to define the CNAs. Enter one region per line. Each line should contain region_id, chromosome, start, and end separated by a tab. Leave blank to use all unique segments in the segtab file as regions."}),morpheus.FormBuilder.showInModal({title:"Regions",html:formBuilder.$form,close:"OK",callback:function(){for(var text=formBuilder.getValue("regions"),lines=morpheus.Util.splitOnNewLine(text),regions=[],tab=/\t/,i=0,nlines=lines.length;nlines>i;i++){var line=lines[i];if(""!==line){var tokens=line.split(tab);tokens.length>=4&®ions.push({id:tokens[0],chromosome:tokens[1],start:parseInt(tokens[2]),end:parseInt(tokens[3])})}}var readOptions=regions.length>0?{regions:regions}:null;promptCallback(readOptions)}})},morpheus.OpenDatasetTool.prototype={toString:function(){return"Open Dataset"},_read:function(options,deferred){var _this=this,project=options.project,controller=options.controller,file=options.input.file,action=options.input.open_file_action,dataset=project.getSortedFilteredDataset();deferred.fail(function(err){var message=["Error opening "+morpheus.Util.getFileName(file)+"."];err.message&&(message.push("
Cause: "),message.push(err.message)),morpheus.FormBuilder.showInModal({title:"Error",html:message.join("")})}),deferred.done(function(newDataset){morpheus.Util.getExtension(morpheus.Util.getFileName(file)),morpheus.Util.getBaseFileName(morpheus.Util.getFileName(file));if("append"===action||"append columns"===action){var appendRows="append"===action;_.each(controller.options.rows,function(item){if(item.renameTo){var v=newDataset.getRowMetadata().getByName(item.field);v&&v.setName(item.renameTo)}}),_.each(controller.options.columns,function(item){if(item.renameTo){var v=newDataset.getColumnMetadata().getByName(item.field);v&&v.setName(item.renameTo)}}),controller.options.datasetReady&&controller.options.datasetReady(newDataset);var currentDatasetMetadataNames=morpheus.MetadataUtil.getMetadataNames(appendRows?dataset.getColumnMetadata():dataset.getRowMetadata()),newDatasetMetadataNames=morpheus.MetadataUtil.getMetadataNames(appendRows?newDataset.getColumnMetadata():newDataset.getRowMetadata());if(currentDatasetMetadataNames.length>1||newDatasetMetadataNames.length>1)_this._matchAppend(newDatasetMetadataNames,currentDatasetMetadataNames,controller,function(appendOptions){if(controller.getProject().setFullDataset(appendRows?new morpheus.JoinedDataset(dataset,newDataset,appendOptions.current_dataset_annotation_name,appendOptions.new_dataset_annotation_name):new morpheus.TransposedDatasetView(new morpheus.JoinedDataset(new morpheus.TransposedDatasetView(dataset),new morpheus.TransposedDatasetView(newDataset),appendOptions.current_dataset_annotation_name,appendOptions.new_dataset_annotation_name)),!0),controller.options.renderReady&&(controller.options.renderReady(controller),controller.updateDataset()),appendRows){controller.getHeatMapElementComponent().getColorScheme().setSeparateColorSchemeForRowMetadataField("Source");var sourcesSet=morpheus.VectorUtil.getSet(controller.getProject().getFullDataset().getRowMetadata().getByName("Source"));sourcesSet.forEach(function(source){controller.autoDisplay({extension:morpheus.Util.getExtension(source),filename:source})})}controller.tabManager.setTabTitle(controller.tabId,controller.getProject().getFullDataset().getRowCount()+" row"+morpheus.Util.s(controller.getProject().getFullDataset().getRowCount())+" x "+controller.getProject().getFullDataset().getColumnCount()+" column"+morpheus.Util.s(controller.getProject().getFullDataset().getColumnCount())),controller.revalidate()});else{if(controller.getProject().setFullDataset(appendRows?new morpheus.JoinedDataset(dataset,newDataset,currentDatasetMetadataNames[0],newDatasetMetadataNames[0]):new morpheus.TransposedDatasetView(new morpheus.JoinedDataset(new morpheus.TransposedDatasetView(dataset),new morpheus.TransposedDatasetView(newDataset),currentDatasetMetadataNames[0],newDatasetMetadataNames[0])),!0),controller.options.renderReady&&(controller.options.renderReady(controller),controller.updateDataset()),appendRows){controller.getHeatMapElementComponent().getColorScheme().setSeparateColorSchemeForRowMetadataField("Source");var sourcesSet=morpheus.VectorUtil.getSet(controller.getProject().getFullDataset().getRowMetadata().getByName("Source"));sourcesSet.forEach(function(source){controller.autoDisplay({extension:morpheus.Util.getExtension(source),filename:source})})}controller.tabManager.setTabTitle(controller.tabId,controller.getProject().getFullDataset().getRowCount()+" row"+morpheus.Util.s(controller.getProject().getFullDataset().getRowCount())+" x "+controller.getProject().getFullDataset().getColumnCount()+" column"+morpheus.Util.s(controller.getProject().getFullDataset().getColumnCount())),controller.revalidate()}}else"overlay"===action?_this._matchOverlay(morpheus.MetadataUtil.getMetadataNames(newDataset.getColumnMetadata()),morpheus.MetadataUtil.getMetadataNames(dataset.getColumnMetadata()),morpheus.MetadataUtil.getMetadataNames(newDataset.getRowMetadata()),morpheus.MetadataUtil.getMetadataNames(dataset.getRowMetadata()),controller,function(appendOptions){for(var rowValueToIndexMap=morpheus.VectorUtil.createValueToIndexMap(dataset.getRowMetadata().getByName(appendOptions.current_dataset_row_annotation_name)),columnValueToIndexMap=morpheus.VectorUtil.createValueToIndexMap(dataset.getColumnMetadata().getByName(appendOptions.current_dataset_column_annotation_name)),seriesIndex=dataset.addSeries({name:newDataset.getName(),dataType:"object"}),rowVector=newDataset.getRowMetadata().getByName(appendOptions.new_dataset_row_annotation_name),rowIndices=[],newDatasetRowIndicesSubset=[],i=0,size=rowVector.size();size>i;i++){var index=rowValueToIndexMap.get(rowVector.getValue(i));void 0!==index&&(rowIndices.push(index),newDatasetRowIndicesSubset.push(i))}for(var columnVector=newDataset.getColumnMetadata().getByName(appendOptions.new_dataset_column_annotation_name),columnIndices=[],newDatasetColumnIndicesSubset=[],i=0,size=columnVector.size();size>i;i++){var index=columnValueToIndexMap.get(columnVector.getValue(i));void 0!==index&&(columnIndices.push(index),newDatasetColumnIndicesSubset.push(i))}newDataset=new morpheus.SlicedDatasetView(newDataset,newDatasetRowIndicesSubset,newDatasetColumnIndicesSubset);for(var i=0,nrows=newDataset.getRowCount();nrows>i;i++)for(var j=0,ncols=newDataset.getColumnCount();ncols>j;j++)dataset.setValue(rowIndices[i],columnIndices[j],newDataset.getValue(i,j),seriesIndex)}):"open"===action?new morpheus.HeatMap({dataset:newDataset,parent:controller,inheritFromParent:!1}):console.log("Unknown action: "+action);controller.revalidate()})},execute:function(options){var file=options.input.file,_this=this;morpheus.OpenDatasetTool.fileExtensionPrompt(file,function(readOptions){var deferred=morpheus.DatasetUtil.read(file,readOptions);_this._read(options,deferred)})},_matchAppend:function(newDatasetMetadataNames,currentDatasetMetadataNames,controller,callback){var tool={};tool.execute=function(options){return options.input},tool.toString=function(){return"Select Fields"},tool.gui=function(){var items=[{name:"current_dataset_annotation_name",options:currentDatasetMetadataNames,type:"select",required:!0}];return items.push({name:"new_dataset_annotation_name",type:"select",options:newDatasetMetadataNames,required:!0}),items},morpheus.HeatMap.showTool(tool,controller,callback)},_matchOverlay:function(newDatasetColumnMetadataNames,currentDatasetColumnMetadataNames,newDatasetRowMetadataNames,currentDatasetRowMetadataNames,controller,callback){var tool={};tool.execute=function(options){return options.input},tool.toString=function(){return"Select Fields"},tool.gui=function(){var items=[];return items.push({name:"current_dataset_column_annotation_name",options:currentDatasetColumnMetadataNames,type:"select",required:!0}),items.push({name:"new_dataset_column_annotation_name",type:"select",options:newDatasetColumnMetadataNames,required:!0}),items.push({name:"current_dataset_row_annotation_name",options:currentDatasetRowMetadataNames,type:"select",required:!0}),items.push({name:"new_dataset_row_annotation_name",type:"select",options:newDatasetRowMetadataNames,required:!0}),items},morpheus.HeatMap.showTool(tool,controller,callback)}},morpheus.OpenDendrogramTool=function(file){this._file=file},morpheus.OpenDendrogramTool.prototype={toString:function(){return"Open Dendrogram"},init:function(project,form){var setValue=function(val){var isRows="Rows"===val,names=morpheus.MetadataUtil.getMetadataNames(isRows?project.getFullDataset().getRowMetadata():project.getFullDataset().getColumnMetadata());names.unshift("Newick file does not contain node ids"),form.setOptions("match_node_id_to",names)};form.$form.find("[name=orientation]").on("change",function(e){setValue($(this).val())}),setValue("Columns")},gui:function(){return[{name:"orientation",options:["Columns","Rows"],value:"Columns",type:"radio"},{name:"match_node_id_to",options:[],type:"select"}]},execute:function(options){var fileOrUrl=this._file,isColumns="Columns"===options.input.orientation,dendrogramField=options.input.match_node_id_to;"Newick file does not contain node ids"===dendrogramField&&(dendrogramField=null);var controller=options.controller,dendrogramDeferred=morpheus.Util.getText(fileOrUrl);dendrogramDeferred.done(function(text){var dataset=options.project.getSortedFilteredDataset();isColumns&&(dataset=morpheus.DatasetUtil.transposedView(dataset));var tree=morpheus.AbstractDendrogram.parseNewick(text);if(tree.leafNodes.length!==dataset.getRowCount())throw new Error("# leaf nodes in dendrogram "+tree.leafNodes.length+" != "+dataset.getRowCount());var indices=[];if(null!=dendrogramField)for(var vector=dataset.getRowMetadata().getByName(dendrogramField),valueToIndex=morpheus.VectorUtil.createValueToIndexMap(vector),i=0,length=tree.leafNodes.length;length>i;i++){var index=valueToIndex.get(tree.leafNodes[i].name);if(void 0===index)throw new Error("Unable to find dendrogram id "+tree.leafNodes[i].name+" in annotations");indices.push(index)}else for(var i=0,length=tree.leafNodes.length;length>i;i++)indices.push(i);controller.setDendrogram(tree,isColumns,indices)})}},morpheus.OpenFileTool=function(options){this.options=options||{}},morpheus.OpenFileTool.prototype={toString:function(){return"Open File"},gui:function(){var array=[{name:"open_file_action",options:[{name:"Annotate columns",value:"Annotate Columns"},{name:"Annotate rows",value:"Annotate Rows"},{divider:!0},{name:"Append rows to current dataset",value:"append"},{name:"Append columns to current dataset",value:"append columns"},{name:"Overlay onto current dataset",value:"overlay"},{name:"Open dataset in new tab",value:"open"},{divider:!0},{name:"Open dendrogram",value:"Open dendrogram"}],value:"open",type:"bootstrap-select"},{name:"file",showLabel:!1,placeholder:"Open your own file",value:"",type:"file",required:!0,help:morpheus.DatasetUtil.DATASET_FILE_FORMATS}];return array.options={ok:!1,size:"modal-lg"},array},init:function(project,form,initOptions){form.$form.find("[name=open_file_action]").on("change",function(e){var action=$(this).val();"append columns"===action||"append"===action||"open"===action||"overlay"===action?form.setHelpText("file",morpheus.DatasetUtil.DATASET_FILE_FORMATS):"Open dendrogram"===action?form.setHelpText("file",morpheus.DatasetUtil.DENDROGRAM_FILE_FORMATS):form.setHelpText("file",morpheus.DatasetUtil.ANNOTATION_FILE_FORMATS)}),$("

Use your own file

").insertAfter(form.$form.find(".form-group:first"));var _this=this,id=_.uniqueId("morpheus");form.$form.append('

');var $sampleDatasets=$('
');form.$form.append($sampleDatasets);new morpheus.SampleDatasets({$el:$sampleDatasets,callback:function(heatMapOptions){form.setValue("file",heatMapOptions.dataset),_this.ok()}});form.on("change",function(e){var value=e.value;""!==value&&null!=value&&(form.setValue("file",value),_this.ok())})},execute:function(options){var that=this;this.options.file&&(options.input.file=this.options.file);var project=options.project;if("append columns"===options.input.open_file_action||"append"===options.input.open_file_action||"open"===options.input.open_file_action||"overlay"===options.input.open_file_action)(new morpheus.OpenDatasetTool).execute(options);else if("Open dendrogram"===options.input.open_file_action)morpheus.HeatMap.showTool(new morpheus.OpenDendrogramTool(options.input.file),options.controller);else{var controller=options.controller,isAnnotateColumns="Annotate Columns"==options.input.open_file_action,fileOrUrl=options.input.file,dataset=project.getFullDataset(),fileName=morpheus.Util.getFileName(fileOrUrl);if(morpheus.Util.endsWith(fileName,".cls")){var result=morpheus.Util.readLines(fileOrUrl);result.done(function(lines){that.annotateCls(controller,dataset,fileName,isAnnotateColumns,lines)})}else if(morpheus.Util.endsWith(fileName,".gmt"))morpheus.BufferedReader.getArrayBuffer(fileOrUrl,function(err,buf){if(err)throw new Error("Unable to read "+fileOrUrl);var sets=(new morpheus.GmtReader).read(new morpheus.BufferedReader(new Uint8Array(buf)));that.prompt(null,dataset,controller,isAnnotateColumns,sets)});else{var result=morpheus.Util.readLines(fileOrUrl);result.done(function(lines){that.prompt(lines,dataset,controller,isAnnotateColumns,null)})}}},annotateCls:function(controller,dataset,fileName,isColumns,lines){isColumns&&(dataset=morpheus.DatasetUtil.transposedView(dataset));var assignments=(new morpheus.ClsReader).read(lines);if(assignments.length!==dataset.getRowCount())throw new Error("Number of samples in cls file does not match dataset.");for(var vector=dataset.getRowMetadata().add(morpheus.Util.getBaseFileName(fileName)),i=0;ii;i++){var line=lines[i].split(tab),id=line[fileMatchOnColumnIndex],indices=idToIndices.get(id);if(void 0!==indices)for(var nIndices=indices.length,j=0;nheaders>j;j++)for(var token=line[columnIndices[j]],v=vectors[j],r=0;nIndices>r;r++)v.setValue(indices[r],token)}}else _.each(sets,function(set){var name=set.name,members=set.ids,v=dataset.getRowMetadata().add(name);vectors.push(v),_.each(members,function(id){var indices=idToIndices.get(id);if(void 0!==indices)for(var i=0,nIndices=indices.length;nIndices>i;i++)v.setValue(indices[i],name)})});for(var i=0;iGCT 1.3 or GCT 1.2 file name',required:!0},{name:"file_format",type:"radio",options:[{name:"GCT version 1.2",value:"1.2"},{name:"GCT version 1.3",value:"1.3"}],value:"1.3",required:!0}]},execute:function(options){var project=options.project,format=options.input.file_format,fileName=options.input.file_name,dataset=(options.controller,project.getSortedFilteredDataset()),text="1.2"===format?(new morpheus.GctWriter12).write(dataset):(new morpheus.GctWriter).write(dataset),blob=new Blob([text],{type:"text/plain;charset=charset=utf-8"});morpheus.Util.endsWith(fileName.toLowerCase(),".gct")||(fileName+=".gct"),saveAs(blob,fileName,!0)}},morpheus.SaveImageTool=function(){},morpheus.SaveImageTool.prototype={toString:function(){return"Save Image"},gui:function(){return[{name:"file_name",type:"text",required:!0},{name:"format",type:"select",options:["png","svg"],value:"svg",required:!0}]},execute:function(options){var fileName=options.input.file_name,format=options.input.format;morpheus.Util.endsWith(fileName.toLowerCase(),"."+format)||(fileName+="."+format);var controller=options.controller;controller.saveImage(fileName,format)}},morpheus.SimilarityMatrixTool=function(){},morpheus.SimilarityMatrixTool.Functions=[morpheus.Euclidean,morpheus.Jaccard,morpheus.Cosine,morpheus.Pearson,morpheus.Spearman],morpheus.SimilarityMatrixTool.Functions.fromString=function(s){for(var i=0;ii;i++)for(var j=0;i>j;j++){var value=matrix[i][j];d.setValue(i,j,value),d.setValue(j,i,value)}if(!isDistance)for(var i=0;n>i;i++)d.setValue(i,i,1);var metadata=isColumnMatrix?dataset.getColumnMetadata():dataset.getRowMetadata();d.rowMetadataModel=morpheus.MetadataUtil.shallowCopy(metadata),d.columnMetadataModel=morpheus.MetadataUtil.shallowCopy(metadata);var colorScheme;colorScheme=isDistance?{type:"fixed",map:[{value:0,color:"white"},{value:morpheus.DatasetUtil.max(d),color:"red"}]}:{type:"fixed",map:[{value:-1,color:"blue"},{value:0,color:"white"},{value:1,color:"red"}]},new morpheus.HeatMap({colorScheme:colorScheme,name:name,dataset:d,parent:controller,inheritFromParentOptions:{rows:!isColumnMatrix,columns:isColumnMatrix}}),worker.terminate(),window.URL.revokeObjectURL(url)},worker}},morpheus.TransposeTool=function(){},morpheus.TransposeTool.prototype={toString:function(){return"Transpose"},execute:function(options){var project=options.project,controller=options.controller,dataset=new morpheus.TransposedDatasetView(project.getSortedFilteredDataset()),rowMetadataModel=morpheus.MetadataUtil.shallowCopy(dataset.getRowMetadata()),columnMetadataModel=morpheus.MetadataUtil.shallowCopy(dataset.getColumnMetadata());dataset.getRowMetadata=function(){return rowMetadataModel},dataset.getColumnMetadata=function(){return columnMetadataModel};var name=options.input.name||controller.getName();new morpheus.HeatMap({name:name,dataset:dataset,inheritFromParentOptions:{transpose:!0},parent:controller})}},morpheus.WordCloudTool=function(){},morpheus.WordCloudTool.draw=function(options){function draw(words){g.selectAll("text").data(words).enter().append("text").style("font-family","Impact").on("mouseover",function(d){d3.select(this).transition().style("font-size",2*fontSizeScale(d.size)+"px")}).on("mouseout",function(d){d3.select(this).transition().style("font-size",fontSizeScale(d.size)+"px")}).on("click",function(d){options.heatMap.getToolbar().setSearchText({isColumns:options.isColumns,text:d.text.indexOf(" ")?'"'+d.text+'"':d.text})}).style("fill",function(d,i){return fill(i)}).attr("text-anchor","middle").attr("transform",function(d){return"translate("+[d.x,d.y]+")rotate("+d.rotate+")"}).text(function(d){return d.text}).style("font-size",function(d){return"1px"}).transition().duration(1e3).style("font-size",function(d){return fontSizeScale(d.size)+"px"})}var width=options.width,height=options.height,words=options.words,maxSize=options.maxSize,minSize=options.minSize,fill=options.fill||d3.scale.category20b(),fontSizeScale=d3.scale.linear().range([12,24]).domain([minSize,maxSize]).clamp(!0),g=d3.select(options.el).append("svg").attr("width",width).attr("height",height).append("g");g.attr("transform","translate("+[width/2,height/2]+")"),g.style("font-weight","900");var angle=d3.scale.linear().domain([0,0]).range([0,0]).clamp(!0);d3.layout.cloud().spiral("archimedean").size([width,height]).words(words).rotate(function(){return angle(~~(5*Math.random()))}).fontSize(function(d){return d.size}).on("end",draw).start()},morpheus.WordCloudTool.drawTable=function(options){var width=options.width,maxSize=options.maxSize,minSize=options.minSize,words=options.words;words.sort(function(a,b){return a.size===b.size?0:a.sizei;i++)minSize=Math.min(minSize,words[i].size),maxSize=Math.max(maxSize,words[i].size);var fill=function(value){return colorModel.getMappedValue(vector,words[value].text)},$dialog=$('
'),width=960,height=600;$dialog.dialog({resizable:!0,height:height+30,width:width+30}),morpheus.WordCloudTool.draw({minSize:minSize,maxSize:maxSize,isColumns:isColumns,heatMap:controller,el:$dialog[0],width:width,height:height,words:words,fill:fill}),morpheus.WordCloudTool.drawTable({minSize:minSize,maxSize:maxSize,isColumns:isColumns,heatMap:controller,el:$dialog[0],width:width,words:words})}},morpheus.AbstractCanvas=function(offscreen){this.canvas=morpheus.CanvasUtil.createCanvas(),this.lastClip=null,offscreen&&(this.offscreenCanvas=morpheus.CanvasUtil.createCanvas()),this.offset={x:0,y:0}},morpheus.AbstractCanvas.prototype={visible:!0,invalid:!0,scrollX:0,scrollY:0,prefWidth:void 0,prefHeight:void 0,getCanvas:function(){return this.canvas},scrollTop:function(pos){return void 0===pos?this.offset.y:void(this.offset.y=pos)},appendTo:function($el){$(this.canvas).appendTo($el)},scrollLeft:function(pos){return void 0===pos?this.offset.x:void(this.offset.x=pos)},dispose:function(){$(this.canvas).remove(),this.offscreenCanvas=void 0},getPrefWidth:function(){return this.prefWidth},setInvalid:function(invalid){this.invalid=invalid},setBounds:function(bounds){var backingScale=morpheus.CanvasUtil.BACKING_SCALE,canvases=[this.canvas];this.offscreenCanvas&&canvases.push(this.offscreenCanvas),null!=bounds.height&&_.each(canvases,function(canvas){canvas.height=bounds.height*backingScale,canvas.style.height=bounds.height+"px"}),null!=bounds.width&&_.each(canvases,function(canvas){canvas.width=bounds.width*backingScale,canvas.style.width=bounds.width+"px"}),null!=bounds.left&&_.each(canvases,function(canvas){canvas.style.left=bounds.left+"px"}),null!=bounds.top&&_.each(canvases,function(canvas){canvas.style.top=bounds.top+"px"})},paint:function(clip){var canvas=this.canvas,context=canvas.getContext("2d");morpheus.CanvasUtil.resetTransform(context);var width=this.getUnscaledWidth(),height=this.getUnscaledHeight();if(context.clearRect(0,0,width,height),this.prePaint&&(morpheus.CanvasUtil.resetTransform(context),context.translate(this.offset.x,this.offset.y),this.prePaint(clip,context)),morpheus.CanvasUtil.resetTransform(context),this.offscreenCanvas){if(this.invalid){var oc=this.offscreenCanvas.getContext("2d");morpheus.CanvasUtil.resetTransform(oc),context.translate(this.offset.x,this.offset.y),oc.clearRect(0,0,width,height),this.draw(clip,oc)}context.drawImage(this.offscreenCanvas,0,0,width,height)}else this.draw(clip,context);this.postPaint&&(morpheus.CanvasUtil.resetTransform(context),context.translate(this.offset.x,this.offset.y),this.postPaint(clip,context)),this.lastClip=clip,this.invalid=!1},repaint:function(){this.lastClip||(this.lastClip={x:0,y:0,width:this.getUnscaledWidth(),height:this.getUnscaledHeight()}),this.paint(this.lastClip)},draw:function(clip,context){console.log("Not implemented")},getPrefHeight:function(){return this.prefHeight},setPrefWidth:function(prefWidth){this.prefWidth=prefWidth},setPrefHeight:function(prefHeight){this.prefHeight=prefHeight},isVisible:function(){return this.visible},setVisible:function(visible){this.visible!==visible&&(this.visible=visible,this.canvas.style.display=visible?"":"none")},getUnscaledWidth:function(){return this.canvas.width/morpheus.CanvasUtil.BACKING_SCALE},getUnscaledHeight:function(){return this.canvas.height/morpheus.CanvasUtil.BACKING_SCALE},getWidth:function(){return this.canvas.width},getHeight:function(){return this.canvas.height}},morpheus.AbstractColorSupplier=function(){this.fractions=[0,.5,1],this.colors=["blue","white","red"],this.names=null,this.min=0,this.max=1,this.missingColor="#c0c0c0",this.scalingMode=morpheus.HeatMapColorScheme.ScalingMode.RELATIVE,this.stepped=!1,this._sizer=new morpheus.HeatMapSizer,this._conditions=new morpheus.HeatMapConditions},morpheus.AbstractColorSupplier.fromJson=function(json){var cs=json.stepped?new morpheus.SteppedColorSupplier:new morpheus.GradientColorSupplier;return cs.setDiscrete(json.discrete),cs.setScalingMode(json.scalingMode),cs.setMin(json.min),cs.setMax(json.max),cs.setMissingColor(json.missingColor),cs.setFractions({colors:json.colors,fractions:json.fractions,names:json.names}),cs},morpheus.AbstractColorSupplier.prototype={discrete:!1,getSizer:function(){return this._sizer},getConditions:function(){return this._conditions},isDiscrete:function(){return this.discrete},setDiscrete:function(discrete){this.discrete=discrete},createInstance:function(){throw"not implemented"},copy:function(){var c=this.createInstance();return c.discrete=this.discrete,c.setFractions({fractions:this.fractions.slice(0),colors:this.colors.slice(0)}),null!=this.names&&(c.names=this.names.slice(0)),this._sizer&&(c._sizer=this._sizer.copy()),this._conditions&&(c._conditions=this._conditions.copy()),c.scalingMode=this.scalingMode,c.min=this.min,c.max=this.max,c.missingColor=this.missingColor,c},setMissingColor:function(missingColor){this.missingColor=missingColor},getMissingColor:function(){return this.missingColor},getScalingMode:function(){return this.scalingMode},setScalingMode:function(scalingMode){scalingMode!==this.scalingMode&&(scalingMode===morpheus.HeatMapColorScheme.ScalingMode.RELATIVE&&(this.min=0,this.max=1),this.scalingMode=scalingMode)},isStepped:function(){return!1},getColor:function(row,column,value){throw"not implemented"},getColors:function(){return this.colors},getNames:function(){return this.names},getFractions:function(){return this.fractions},getMin:function(){return this.min},getMax:function(){return this.max},setMin:function(min){this.min=min},setMax:function(max){this.max=max},setFractions:function(options){var index=morpheus.Util.indexSort(options.fractions,!0);this.fractions=morpheus.Util.reorderArray(options.fractions,index),this.colors=morpheus.Util.reorderArray(options.colors,index),this.names=options.names?morpheus.Util.reorderArray(options.names,index):null}},morpheus.AbstractComponent=function(){this.lastClip=null;var c=document.createElement("div");c.setAttribute("tabindex","0"),c.style.outline=0,c.style.overflow="hidden",c.style.position="absolute",this.el=c,this.$el=$(c)},morpheus.AbstractComponent.prototype={visible:!0,invalid:!0,prefWidth:void 0,prefHeight:void 0,appendTo:function($el){$(this.el).appendTo($el)},dispose:function(){$(this.el).remove()},getPrefWidth:function(){return this.prefWidth},setInvalid:function(invalid){this.invalid=invalid},setBounds:function(bounds){null!=bounds.left&&this.$el.css("left",bounds.left+"px"),null!=bounds.top&&this.$el.css("top",bounds.top+"px")},paint:function(clip){this.getUnscaledWidth(),this.getUnscaledHeight();this.draw(clip),this.lastClip=clip,this.invalid=!1},repaint:function(){this.lastClip||(this.lastClip={x:0,y:0,width:this.getUnscaledWidth(),height:this.getUnscaledHeight()}),this.paint(this.lastClip)},draw:function(clip){},getPrefHeight:function(){return this.prefHeight},setPrefWidth:function(prefWidth){this.prefWidth=prefWidth},setPrefHeight:function(prefHeight){this.prefHeight=prefHeight},isVisible:function(){return this.visible},setVisible:function(visible){this.visible!==visible&&(this.visible=visible,this.el.style.display=visible?"":"none")},getUnscaledWidth:function(){return this.$el.width()},getUnscaledHeight:function(){return this.$el.height()},getWidth:function(){return this.$el.width()},getHeight:function(){return this.$el.height()}},morpheus.AbstractDendrogram=function(controller,tree,positions,project,type){morpheus.AbstractCanvas.call(this,!0),this._overviewHighlightColor="#d8b365",this._searchHighlightColor="#e41a1c",this._selectedNodeColor=type===morpheus.AbstractDendrogram.Type.COLUMN?"#377eb8":"#984ea3",this.tree=tree,this.type=type,this.squishEnabled=!1,this.controller=controller,this.positions=positions,this.project=project;var $label=$("");$label.addClass("label label-info"),$label.css("position","absolute"),this.$label=$label;var $squishedLabel=$("");$squishedLabel.addClass("label label-default"),$squishedLabel.css("position","absolute").css("top",18),this.$squishedLabel=$squishedLabel,this.$label=$label,this.cutHeight=this.tree.maxHeight,this.drawLeafNodes=!0,this.lineWidth=.7,this.selectedNodeIds={},this.selectedRootNodeIdToNode={},this.nodeIdToHighlightedPathsToRoot={};var _this=this;this.defaultStroke="rgb(0,0,0)";var mouseMove=function(event){if(!morpheus.CanvasUtil.dragging){var position=morpheus.CanvasUtil.getMousePosWithScroll(event.target,event,_this.lastClip.x,_this.lastClip.y);if(_this.isDragHotSpot(position))_this.canvas.style.cursor=_this.getResizeCursor();else{var nodes;if(_this.getNodes)nodes=_this.getNodes(position);else{var node=_this.getNode(position);node&&(nodes=[node])}if(null!=nodes){nodes.sort(function(a,b){return a.name=radius?_this.tree.maxHeight:Math.max(0,Math.min(_this.tree.maxHeight,_this.scale.invert(radius)))}cutHeight>=_this.tree.maxHeight?_this.resetCutHeight():_this.setCutHeight(cutHeight),event.preventDefault()}}))},morpheus.AbstractDendrogram.Type={COLUMN:0,ROW:1,RADIAL:2},morpheus.AbstractDendrogram.prototype={setSelectedNode:function(node,add){var viewIndices,_this=this,selectionModel=this.type===morpheus.AbstractDendrogram.Type.COLUMN?this.project.getColumnSelectionModel():this.project.getRowSelectionModel();if(null==node)_this.selectedNodeIds={},_this.selectedRootNodeIdToNode={},viewIndices=new morpheus.Set;else if(add?viewIndices=selectionModel.getViewIndices():(viewIndices=new morpheus.Set,_this.selectedNodeIds={},_this.selectedRootNodeIdToNode={}),null!=node){if(void 0===node.children){var contains=_this.nodeIdToHighlightedPathsToRoot[node.id];add||(_this.nodeIdToHighlightedPathsToRoot={}),contains?delete _this.nodeIdToHighlightedPathsToRoot[node.id]:_this.nodeIdToHighlightedPathsToRoot[node.id]=node}else _this.selectedRootNodeIdToNode[node.id]=node,morpheus.AbstractDendrogram.dfs(node,function(d){return _this.selectedNodeIds[d.id]=!0,!0});for(var i=node.minIndex;i<=node.maxIndex;i++)viewIndices.add(i)}_this.trigger("nodeSelectionChanged",_this.selectedRootNodeIdToNode),selectionModel.setViewIndices(viewIndices,!0),_this.repaint()},getPathStroke:function(node){return this.selectedNodeIds[node.id]?this._selectedNodeColor:this.defaultStroke},getNodeFill:function(node){return this.selectedRootNodeIdToNode[node.id]?this._selectedNodeColor:node.search?this._searchHighlightColor:void 0!==node.info?this._overviewHighlightColor:void 0},resetCutHeight:function(){this.positions.setSquishedIndices(null),this.type===morpheus.AbstractDendrogram.Type.COLUMN?this.project.setGroupColumns([],!0):this.project.setGroupRows([],!0),this.$label.text(""),this.$squishedLabel.text("");var dataset=this.project.getSortedFilteredDataset(),clusterIdVector=this.type===morpheus.AbstractDendrogram.Type.COLUMN?dataset.getColumnMetadata().getByName("dendrogram_cut"):dataset.getRowMetadata().getByName("dendrogram_cut");if(clusterIdVector)for(var i=0,size=clusterIdVector.size();size>i;i++)clusterIdVector.setValue(i,NaN)},setCutHeight:function(height){this.cutHeight=height;for(var squishedIndices={},clusterNumber=0,nsquished=0,squishEnabled=this.squishEnabled,roots=morpheus.AbstractDendrogram.cutAtHeight(this.tree.rootNode,this.cutHeight),dataset=this.project.getSortedFilteredDataset(),clusterIdVector=this.type===morpheus.AbstractDendrogram.Type.COLUMN?dataset.getColumnMetadata().add("dendrogram_cut"):dataset.getRowMetadata().add("dendrogram_cut"),i=0,nroots=roots.length;nroots>i;i++){var clusterId,root=roots[i],minChild=morpheus.AbstractDendrogram.getDeepestChild(root,!0),maxChild=morpheus.AbstractDendrogram.getDeepestChild(root,!1);squishEnabled&&minChild.index===maxChild.index?(squishedIndices[minChild.index]=!0,clusterId=-2,nsquished++):(clusterNumber++,clusterId=clusterNumber);for(var j=minChild.index;j<=maxChild.index;j++)clusterIdVector.setValue(j,clusterId)}if(this.$label.text(clusterNumber+" cluster"+morpheus.Util.s(clusterNumber)),nsquished>0?this.$squishedLabel.text(nsquished+" squished"):this.$squishedLabel.text(""),squishEnabled&&this.positions.setSquishedIndices(squishedIndices),-1===this.controller.getTrackIndex(clusterIdVector.getName(),this.type===morpheus.AbstractDendrogram.Type.COLUMN)){var settings={discrete:!0,discreteAutoDetermined:!0,renderMethod:{}};settings.renderMethod[morpheus.VectorTrack.RENDER.COLOR]=!0,this.controller.addTrack(clusterIdVector.getName(),this.type===morpheus.AbstractDendrogram.Type.COLUMN,settings)}this.type===morpheus.AbstractDendrogram.Type.COLUMN?this.project.setGroupColumns([new morpheus.SortKey(clusterIdVector.getName(),morpheus.SortKey.SortOrder.UNSORTED)],!0):this.project.setGroupRows([new morpheus.SortKey(clusterIdVector.getName(),morpheus.SortKey.SortOrder.UNSORTED)],!0)},dispose:function(){var $c=$(this.canvas);$c.off("mousemove.morpheus mouseout.morpheus mouseenter.morpheus contextmenu.morpheus"),$c.remove(),this.$label.remove(),this.$squishedLabel.remove(),this.hammer.destroy(),this.canvas=null,this.$label=null,this.$squishedLabel=null,this.hammer=null},isCut:function(){return this.cutHeightmaxIndex)){var nodeFill=this.getNodeFill(node);void 0!==nodeFill&&(context.fillStyle=nodeFill,this.drawNode(context,node)),context.strokeStyle=this.getPathStroke(node);var children=node.children;if(void 0!==children){this.drawNodePath(context,node,minIndex,maxIndex);for(var i=0,nchildren=children.length;nchildren>i;i++)this.drawDFS(context,children[i],minIndex,maxIndex)}}}},morpheus.AbstractDendrogram.setIndices=function(root){var setIndex=function(node){for(var children=node.children,maxIndex=children[0].maxIndex,minIndex=children[0].minIndex,i=1,length=children.length;length>i;i++){var child=children[i];minIndex=Math.min(minIndex,child.minIndex),maxIndex=Math.max(maxIndex,child.maxIndex)}node.maxIndex=maxIndex,node.minIndex=minIndex},counter=0,visit=function(node,callback){var n,children=node.children;if(children&&(n=children.length))for(var i=-1;++inode.children[node.children.length-1].index?0:node.children.length-1,node=node.children[index]}},morpheus.AbstractDendrogram.dfs=function(node,callback,childrenAccessor){if(void 0===childrenAccessor&&(childrenAccessor=function(n){return n.children}),callback(node)){var n,children=childrenAccessor(node);if(children&&(n=children.length))for(var i=-1;++ii;i++){var copy=$.extend({},children[i]);copy.parent=node,newChildren.push(copy)}node.children=newChildren;for(var i=0,n=newChildren.length;n>i;i++)recurse(newChildren[i])}else node.index=counter,node.minIndex=counter,node.maxIndex=counter,counter++}var counter=0,rootNode=$.extend({},tree.rootNode);return rootNode.parent=void 0,recurse(rootNode),{nLeafNodes:tree.nLeafNodes,maxDepth:tree.maxDepth,rootNode:rootNode}},morpheus.AbstractDendrogram.collapseAtDepth=function(rootNode,maxDepth){morpheus.AbstractDendrogram.dfs(rootNode,function(d){return d.collapsedChildren&&(d.children=d.collapsedChildren,d.collapsedChildren=void 0),!0}),morpheus.AbstractDendrogram.dfs(rootNode,function(d){var depth=d.depth;return depth>maxDepth?(d.collapsedChildren=d.children,d.children=void 0,!1):!0})},morpheus.AbstractDendrogram.setNodeDepths=function(rootNode){function recurse(node,depth){var children=node.children;if(node.depth=depth,max=Math.max(depth,max),void 0!==children)for(var i=-1,j=depth+1,n=children.length;++imax&&(max=n.depth,maxNode=n)}),maxNode},morpheus.AbstractDendrogram.search=function(rootNode,searchText){var predicates,tokens=morpheus.Util.getAutocompleteTokens(searchText),clearSearch=!1,nmatches=0;if(null==tokens||0==tokens.length)clearSearch=!0,morpheus.AbstractDendrogram.dfs(rootNode,function(node){return node.search=!1,!0}),nmatches=-1;else{predicates=morpheus.Util.createSearchPredicates({tokens:tokens});var npredicates=predicates.length;morpheus.AbstractDendrogram.dfs(rootNode,function(node){var matches=!1;if(node.info)searchLabel:for(var name in node.info){var vals=node.info[name];if(node.info)for(var p=0;npredicates>p;p++)for(var predicate=predicates[p],i=0,nvals=vals.length;nvals>i;i++)if(predicate.accept(vals[i])){matches=!0;break searchLabel}}return node.search=matches,matches&&nmatches++,!0})}return nmatches},morpheus.AbstractDendrogram.squishNonSearchedNodes=function(heatMap,isColumns){isColumns?heatMap.getHeatMapElementComponent().getColumnPositions().setSize(13):heatMap.getHeatMapElementComponent().getRowPositions().setSize(13);var expandedLeafNodes={},dendrogram=isColumns?heatMap.columnDendrogram:heatMap.rowDendrogram;morpheus.AbstractDendrogram.dfs(dendrogram.tree.rootNode,function(node){for(var i=node.minIndex;i<=node.maxIndex;i++)node.search&&(expandedLeafNodes[i]=!0);return!0});var clusterIds=[],previous=expandedLeafNodes[0],squishedIndices={};previous||(squishedIndices[0]=!0);var clusterNumber=0;clusterIds.push(clusterNumber);for(var i=1,nleaves=dendrogram.tree.leafNodes.length;nleaves>i;i++){var expanded=expandedLeafNodes[i];expanded!==previous&&(clusterNumber++,previous=expanded),expanded||(squishedIndices[i]=!0),clusterIds.push(clusterNumber)}isColumns?(heatMap.getHeatMapElementComponent().getColumnPositions().setSquishedIndices(squishedIndices),heatMap.getProject().setGroupColumns([new morpheus.SpecifiedGroupByKey(clusterIds)],!1)):(heatMap.getHeatMapElementComponent().getRowPositions().setSquishedIndices(squishedIndices),heatMap.getProject().setGroupRows([new morpheus.SpecifiedGroupByKey(clusterIds)],!1))},morpheus.AbstractDendrogram.getLeafNodes=function(rootNode){var leafNodes=[];return morpheus.AbstractDendrogram.dfs(rootNode,function(node){return void 0===node.children&&leafNodes.push(node),!0}),leafNodes},morpheus.Util.extend(morpheus.AbstractDendrogram,morpheus.AbstractCanvas),morpheus.Util.extend(morpheus.AbstractDendrogram,morpheus.Events),morpheus.CanvasUtil=function(){},morpheus.CanvasUtil.dragging=!1,morpheus.CanvasUtil.measureScrollbar=function(){var $c=$("
").appendTo("body"),dim={width:$c.width()-$c[0].clientWidth,height:$c.height()-$c[0].clientHeight};return $c.remove(),dim},morpheus.CanvasUtil.FONT_NAME='"Helvetica Neue",Helvetica,Arial,sans-serif',morpheus.CanvasUtil.FONT_COLOR="rgb(34, 34, 34)",morpheus.CanvasUtil.getPreferredSize=function(c){var size=c.getPreferredSize(),prefWidth=c.getPrefWidth(),prefHeight=c.getPrefHeight();return void 0!==prefWidth&&(size.width=prefWidth),void 0!==prefHeight&&(size.height=prefHeight),size},morpheus.CanvasUtil.BACKING_SCALE=1,"undefined"!=typeof window&&"devicePixelRatio"in window&&window.devicePixelRatio>1&&(morpheus.CanvasUtil.BACKING_SCALE=window.devicePixelRatio),morpheus.CanvasUtil.setBounds=function(canvas,bounds){var backingScale=morpheus.CanvasUtil.BACKING_SCALE;null!=bounds.height&&(canvas.height=bounds.height*backingScale,canvas.style.height=bounds.height+"px"),null!=bounds.width&&(canvas.width=bounds.width*backingScale,canvas.style.width=bounds.width+"px"),null!=bounds.left&&(canvas.style.left=bounds.left+"px"),null!=bounds.top&&(canvas.style.top=bounds.top+"px")},morpheus.CanvasUtil.drawShape=function(context,shape,x,y,size2){0>size2||(context.beginPath(),"minus"===shape?(context.arc(x,y,size2,0,2*Math.PI,!1),context.moveTo(x-size2,y),context.lineTo(x+size2,y)):"circle"===shape?context.arc(x,y,size2,0,2*Math.PI,!1):"square"===shape?context.rect(x-size2,y-size2,2*size2,2*size2):"plus"===shape?(context.moveTo(x,y-size2),context.lineTo(x,y+size2),context.moveTo(x-size2,y),context.lineTo(x+size2,y)):"x"===shape?(context.moveTo(x-size2,y-size2),context.lineTo(x+size2,y+size2),context.moveTo(x+size2,y-size2),context.lineTo(x-size2,y+size2)):"asterisk"===shape?(context.moveTo(x-size2,y-size2),context.lineTo(x+size2,y+size2),context.moveTo(x+size2,y-size2),context.lineTo(x-size2,y+size2),context.moveTo(x,y-size2),context.lineTo(x,y+size2)):"diamond"===shape?(context.moveTo(x,y-size2),context.lineTo(x+size2,y),context.lineTo(x,y+size2),context.lineTo(x-size2,y),context.lineTo(x,y-size2)):"triangle-up"===shape?(context.moveTo(x,y-size2),context.lineTo(x+size2,y+size2),context.lineTo(x-size2,y+size2),context.lineTo(x,y-size2)):"triangle-down"===shape?(context.moveTo(x,y+size2),context.lineTo(x-size2,y-size2), context.lineTo(x+size2,y-size2),context.lineTo(x,y+size2)):"triangle-left"===shape?(context.moveTo(x-size2,y),context.lineTo(x+size2,y-size2),context.lineTo(x+size2,y+size2),context.lineTo(x-size2,y)):"triangle-right"===shape&&(context.moveTo(x+size2,y),context.lineTo(x-size2,y+size2),context.lineTo(x-size2,y-size2),context.lineTo(x+size2,y)),context.stroke())},morpheus.CanvasUtil.drawLine=function(context,x1,y1,x2,y2){context.beginPath(),context.moveTo(x1,y1),context.lineTo(x2,y2),context.stroke()},morpheus.CanvasUtil.resetTransform=function(context){context.setTransform(1,0,0,1,0,0),1!==morpheus.CanvasUtil.BACKING_SCALE&&context.scale(morpheus.CanvasUtil.BACKING_SCALE,morpheus.CanvasUtil.BACKING_SCALE)},morpheus.CanvasUtil.bezierCurveTo=function(context,start,end){var m1=(start[1]+end[1])/2;context.beginPath(),context.moveTo(start[0],start[1]),context.bezierCurveTo(start[0],m1,end[0],m1,end[0],end[1]),context.stroke()},morpheus.CanvasUtil.createCanvas=function(){var $c=$("");return $c.attr("tabindex","0"),$c.css({cursor:"default",outline:0,overflow:"hidden",position:"absolute","z-index":1}),$c[0]},morpheus.CanvasUtil.getHeaderStringWidth=function(context,s){return context.font="14px "+morpheus.CanvasUtil.FONT_NAME,context.measureText(s).width+18},morpheus.CanvasUtil.getVectorStringWidth=function(context,vector,positions,end){if(positions.getSize()<6)return 0;var fontSize=Math.min(24,positions.getSize()-2);if(0>=fontSize)return 0;context.font=fontSize+"px "+morpheus.CanvasUtil.FONT_NAME;for(var toString=morpheus.VectorTrack.vectorToString(vector),maxWidth=0,i=0,n=0>=end?vector.size():Math.min(end,vector.size());n>i;i++){var value=vector.getValue(i);if(null!=value&&""!=value){value=toString(value);var width=context.measureText(value).width;width>maxWidth&&(maxWidth=width)}}return maxWidth>0?maxWidth+2:maxWidth},morpheus.CanvasUtil.clipString=function(context,string,availTextWidth){var textWidth=context.measureText(string).width;if(availTextWidth>=textWidth)return string;var clipString="...";if(availTextWidth-=context.measureText(clipString).width,0>=availTextWidth)return clipString;for(var width=0,nChars=0,stringLength=string.length;stringLength>nChars;nChars++)if(width+=context.measureText(string[nChars]).width,width>availTextWidth){string=string.substring(0,nChars);break}return string+clipString},morpheus.CanvasUtil.toSVG=function(drawable,file){var totalSize={width:drawable.getWidth(),height:drawable.getHeight()},context=new C2S(totalSize.width,totalSize.height);context.save(),drawable.draw({x:0,y:0,width:totalSize.width,height:totalSize.height},context),context.restore();var svg=context.getSerializedSvg(),blob=new Blob([svg],{type:"text/plain;charset=utf-8"});saveAs(blob,file)},morpheus.CanvasUtil.getMousePos=function(element,event,useDelta){return morpheus.CanvasUtil.getMousePosWithScroll(element,event,0,0,useDelta)},morpheus.CanvasUtil.getClientXY=function(event,useDelta){var clientX,clientY;return event.pointers?event.pointers.length>0?(clientX=event.pointers[0].clientX-(useDelta?event.deltaX:0),clientY=event.pointers[0].clientY-(useDelta?event.deltaY:0)):(clientX=event.srcEvent.clientX-(useDelta?event.deltaX:0),clientY=event.srcEvent.clientY-(useDelta?event.deltaY:0)):(clientX=event.clientX,clientY=event.clientY),{x:clientX,y:clientY}},morpheus.CanvasUtil.getMousePosWithScroll=function(element,event,scrollX,scrollY,useDelta){return morpheus.CanvasUtil._getMousePosWithScroll(element,scrollX,scrollY,morpheus.CanvasUtil.getClientXY(event,useDelta))},morpheus.CanvasUtil._getMousePosWithScroll=function(element,scrollX,scrollY,clientXY){var rect=element.getBoundingClientRect();return{x:clientXY.x-rect.left+scrollX,y:clientXY.y-rect.top+scrollY}},morpheus.CheckBoxList=function(options){var _this=this,set=options.set||new morpheus.Set;options=$.extend(!0,{},{height:"138px",showHeader:!1,select:!1,search:!0,checkBoxSelectionOnTop:!1,rowHeader:function(item){var header=[];return header.push(' "),header.push(""),header.join("")}},options),options=morpheus.Table.createOptions(options),1===options.columns.length&&(options.maxWidth=583);for(var idColumn=options.columns[0],i=0;i'),html.push('"),html.push(''),html.push("
");var $div=$(html.join("")),$checkBoxResults=$div.find("[name=checkBoxResults]");table.$gridDiv.before($div);var $selectAll=$div.find("[name=selectAll]"),$selectNone=$div.find("[name=selectNone]");$selectAll.on("click",function(e){for(var items=table.getItems(),i=0,nitems=items.length;nitems>i;i++)set.add(_this.getter(items[i]));_this.table.trigger("checkBoxSelectionChanged",{source:_this,set:set}),e.preventDefault(),_this.table.redraw()}),$div.find("[name=invertSel]").on("click",function(e){for(var items=table.getItems(),i=0,nitems=items.length;nitems>i;i++){var val=_this.getter(items[i]);set.has(val)?set.remove(val):set.add(val)}_this.table.trigger("checkBoxSelectionChanged",{source:_this,set:set}),e.preventDefault(),_this.table.redraw()}),$selectNone.on("click",function(e){for(var items=table.getItems(),i=0,nitems=items.length;nitems>i;i++)set.remove(_this.getter(items[i]));_this.table.trigger("checkBoxSelectionChanged",{source:_this,set:set}),e.preventDefault(),_this.table.redraw()}),this.set=set,this.table=table,$checkBoxResults.html("selected "+morpheus.Util.intFormat(set.size())+" of "+morpheus.Util.intFormat(table.getAllItemCount()));this.table.on("checkBoxSelectionChanged",function(){$checkBoxResults.html("selected "+morpheus.Util.intFormat(set.size())+" of "+morpheus.Util.intFormat(table.getAllItemCount())),_this.table.redraw()}),table.on("click",function(e){var $target=$(e.target),item=table.getItems()[e.row],value=_this.getter(item);$target.is(".morpheus-hover-show")?(set.clear(),set.add(value),_this.table.trigger("checkBoxSelectionChanged",{source:_this,set:set})):(!options.select||$target.is("[type=checkbox]")&&"toggle"===$target.attr("name"))&&(set.has(value)?set.remove(value):set.add(value),_this.table.trigger("checkBoxSelectionChanged",{source:_this,set:set}))})},morpheus.CheckBoxList.prototype={searchWithPredicates:function(predicates){this.table.searchWithPredicates(predicates)},autocomplete:function(tokens,cb){this.table.autocomplete(tokens,cb)},setHeight:function(height){this.table.setHeight(height)},resize:function(){this.table.resize()},setSearchVisible:function(visible){this.table.setSearchVisible(visible)},getSelectedRows:function(){return this.table.getSelectedRows()},getSelectedItems:function(){return this.table.getSelectedItems()},setSelectedRows:function(rows){this.table.setSelectedRows(rows)},getItems:function(items){return this.table.getItems()},getAllItemCount:function(){return this.table.getAllItemCount()},getFilteredItemCount:function(){return this.table.getFilteredItemCount()},setFilter:function(f){this.table.setFilter(f)},redraw:function(){this.table.redraw()},getSelection:function(){return this.set},clearSelection:function(values){this.set.clear(),this.table.redraw()},setValue:function(values){this.setSelectedValues(values)},setSelectedValues:function(values){if(this.set.clear(),morpheus.Util.isArray(values))for(var i=0;ii;i++)context.lineTo(x[i],y[i]);context.stroke()}},morpheus.Util.extend(morpheus.ColumnDendrogram,morpheus.AbstractDendrogram),morpheus.ConditionalRenderingUI=function(heatmap){var _this=this;this.heatmap=heatmap;var $div=$('
');$div.on("click","[name=add]",function(e){var $this=$(this),$row=$this.closest(".morpheus-entry"),index=$row.index(),condition={series:null,color:"rgb(0,0,0)",shape:null,accept:function(val){return!1}};heatmap.heatmap.getColorScheme().getConditions().insert(index,condition),$row.after(_this.add(condition)),e.preventDefault()}),$div.on("click","[name=delete]",function(e){var $this=$(this),$row=$this.closest(".morpheus-entry"),index=$row.index()-1;heatmap.heatmap.getColorScheme().getConditions().remove(index),heatmap.revalidate(),$row.remove(),e.preventDefault()});var html=[];html.push('
'),html.push('
'),html.push(''),html.push("
"),html.push("
"),$div.append(html.join("")),this.$div=$div,heatmap.heatmap.getColorScheme().getConditions().getConditions().forEach(function(c){_this.add(c).appendTo($div)})},morpheus.ConditionalRenderingUI.prototype={add:function(condition){function updateAccept(){var v1=parseFloat($($v1).val());isNaN(v1)&&(v1=-Number.MAX_VALUE);var v2=parseFloat($($v2).val());isNaN(v2)&&(v2=Number.MAX_VALUE);var v1Op=$v1Op.val(),v2Op=$v2Op.val(),gtf="gt"===v1Op?function(val){return val>v1}:function(val){return val>=v1},ltf="lt"===v2Op?function(val){return v2>val}:function(val){return v2>=val};condition.v1=v1,condition.v2=v2,condition.v1Op=v1Op,condition.v2Op=v2Op,condition.accept=function(val){return gtf(val)&<f(val)},_this.heatmap.revalidate()}var _this=this,html=[];html.push('
'),html.push('
'),html.push("
"),html.push('
'),html.push(''),html.push('"),html.push("
"),html.push('
'),html.push(''),html.push(''),html.push(''),html.push('and'),html.push(''),html.push(''),html.push("
"),html.push('
'),html.push('');var shapeField=new morpheus.ShapeField(["circle","square","diamond","triangle-up","triangle-down","triangle-left","triangle-right"]);html.push('
'),html.push("
"),html.push('
'),html.push(''),html.push(''),html.push("
"),html.push("
"),html.push('
'),html.push('
'),html.push('Remove'),html.push("
"),html.push("
"),html.push("
");var $el=$(html.join(""));shapeField.$el.appendTo($el.find("[name=shapeHolder]"));var $color=$el.find("[name=color]"),$series=$el.find("[id=cond_series]"),$v1=$el.find("[name=v1]"),$v2=$el.find("[name=v2]"),$v1Op=$el.find("[name=lower]"),$v2Op=$el.find("[name=upper]");return $color.val(condition.color),$series.val(condition.series),shapeField.setShapeValue(condition.shape),$v1.val(condition.v1),$v2.val(condition.v2),$v1Op.val(condition.v1Op),$v2Op.val(condition.v2Op),$v1Op.on("change",function(e){updateAccept()}),$v2Op.on("change",function(e){updateAccept()}),$v1.on("keyup",_.debounce(function(e){updateAccept()},100)),$v2.on("keyup",_.debounce(function(e){updateAccept()},100)),$color.on("change",function(e){condition.color=$(this).val(),_this.heatmap.revalidate()}),shapeField.on("change",function(e){condition.shape=e.shape,_this.heatmap.revalidate()}),$series.on("change",function(e){condition.series=$(this).val(),_this.heatmap.revalidate()}),condition.series=$series.val(),$el}},morpheus.DiscreteColorSchemeChooser=function(options){var formBuilder=new morpheus.FormBuilder,map=options.colorScheme.scale,html=['"),formBuilder.append({name:"selected_value",type:"custom",value:html.join("")});var $select=formBuilder.$form.find("[name=colorPicker]");formBuilder.append({col:"col-xs-2",name:"selected_color",type:"color"});var selectedVal=$select.val(),_this=this,$color=formBuilder.$form.find("[name=selected_color]");$color.val(map.get(selectedVal)),$color.on("change",function(e){var color=$(this).val();map.set(selectedVal,color),_this.trigger("change",{value:selectedVal,color:color})}),$select.selectpicker().change(function(){selectedVal=$select.val();var c=map.get(selectedVal);$color.val(c)}),this.$div=formBuilder.$form},morpheus.DiscreteColorSchemeChooser.prototype={dispose:function(){}},morpheus.Util.extend(morpheus.DiscreteColorSchemeChooser,morpheus.Events),morpheus.DiscreteColorSupplier=function(){this.colorMap=new morpheus.Map,this.hiddenValue=0,this.hiddenValues=new morpheus.Set,morpheus.AbstractColorSupplier.call(this),this.scalingMode=morpheus.HeatMapColorScheme.ScalingMode.FIXED},morpheus.DiscreteColorSupplier.prototype={createInstance:function(){return new morpheus.DiscreteColorSupplier},setColorMap:function(array){this.colorMap=new morpheus.Map,this.colors=[],this.fractions=[],this.names=[],this.min=Number.MAX_VALUE,this.max=-Number.MAX_VALUE;for(var i=0;i'),html.push('
'),html.push('
'),html.push('
'),html.push('
'),html.push("
"),html.push('
'),html.push('
'),html.push('
'),html.push('
'),html.push("
"),html.push("
"),this.$el=$(html.join(""));var _this=this;this.$el.find("[name=add]").on("click",function(){_this.addSelected()}),this.$el.find("[name=remove]").on("click",function(){_this.removeSelected()}),this.$el.find("[name=up]").on("click",function(){_this.moveUp()}),this.$el.find("[name=down]").on("click",function(){_this.moveDown()}),this.left=this.$el.find("[name=left]")[0],this.right=this.$el.find("[name=right]")[0];for(var i=0;i');this.$div=$div,$div.append(this.addBase());var $filterMode=$div.find("[name=filterMode]");$filterMode.on("change",function(e){var isAndFilter=$filterMode.prop("checked");(isColumns?project.getColumnFilter():project.getRowFilter()).setAnd(isAndFilter),isColumns?_this.project.setColumnFilter(_this.project.getColumnFilter(),!0):_this.project.setRowFilter(_this.project.getRowFilter(),!0),e.preventDefault()}),$div.on("click","[name=add]",function(e){var $this=$(this),$row=$this.closest(".morpheus-entry"),index=$row.index(),newFilter=new morpheus.AlwaysTrueFilter;(isColumns?project.getColumnFilter():project.getRowFilter()).insert(index,newFilter),$row.after(_this.add(newFilter)),e.preventDefault()}),$div.on("click","[name=delete]",function(e){var $this=$(this),$row=$this.closest(".morpheus-entry"),index=$row.index()-1;(isColumns?project.getColumnFilter():project.getRowFilter()).remove(index),$row.remove(),isColumns?_this.project.setColumnFilter(_this.project.getColumnFilter(),!0):_this.project.setRowFilter(_this.project.getRowFilter(),!0),e.preventDefault()}),$div.on("submit","form",function(e){$(this);e.preventDefault()}),$div.on("change","[name=by]",function(e){var $this=$(this),fieldName=$this.val(),$row=$this.closest(".morpheus-entry");$row.index()-1;_this.createFilter({fieldName:fieldName,$div:$this}),isColumns?_this.project.setColumnFilter(_this.project.getColumnFilter(),!0):_this.project.setRowFilter(_this.project.getRowFilter(),!0)});for(var combinedFilter=isColumns?project.getColumnFilter():project.getRowFilter(),filters=combinedFilter.getFilters?combinedFilter.getFilters():[],i=0;iRange of values
"),html.push(' '),html.push(' '),html.push('
Switch to top filter');var $form=$(html.join(""));$form.appendTo($ui),$ui.find("[name=switch]").on("click",function(e){e.preventDefault();for(var newFilter=morpheus.FilterUI.topFilter(project,name,isColumns,$ui),index=-1,filters=isColumns?project.getColumnFilter().getFilters():project.getRowFilter().getFilters(),i=0;iTop
"),html.push(''),html.push(' '),html.push('
Switch to range filter');var $form=$(html.join(""));$form.appendTo($ui);var $n=$ui.find("[name=n]"),$direction=$ui.find("[name=direction]");if($ui.find("[name=switch]").on("click",function(e){e.preventDefault();for(var newFilter=morpheus.FilterUI.rangeFilter(project,name,isColumns,$ui),index=-1,filters=isColumns?project.getColumnFilter().getFilters():project.getRowFilter().getFilters(),i=0;i'),html.push('
'),html.push('
'),html.push("
"),html.push('
'),html.push(''),html.push("
"),html.push(""),html.join("")},add:function(filter){ -var project=this.project,isColumns=this.isColumns,fields=morpheus.MetadataUtil.getMetadataNames(isColumns?project.getFullDataset().getColumnMetadata():project.getFullDataset().getRowMetadata()),html=[];html.push('
'),html.push('
'),html.push(""),html.push('"),html.push("
"),html.push('
'),html.push('
'),html.push("
"),html.push('
'),html.push('
'),html.push('Remove'),html.push("
"),html.push("
"),html.push("
"),html.join("")}},morpheus.FormBuilder=function(options){var that=this;this.prefix=_.uniqueId("form"),this.$form=$(""),this.$form.attr("role","form").attr("id",this.prefix),this.vertical=options&&options.vertical,this.vertical?(this.labelClass="control-label",this.titleClass="control-label"):(this.titleClass="col-xs-12 control-label",this.labelClass="col-xs-4 control-label",this.$form.addClass("form-horizontal")),this.$form.on("submit",function(e){e.preventDefault()}),this.$form.on("dragover",function(e){var node=$(e.originalEvent.srcElement).parent().parent().prev();node.is("select")&&node.hasClass("file-input")&&($(e.originalEvent.srcElement).parent().css("border","1px solid black"),e.preventDefault(),e.stopPropagation())}).on("dragenter",function(e){var node=$(e.originalEvent.srcElement).parent().parent().prev();node.is("select")&&node.hasClass("file-input")&&($(e.originalEvent.srcElement).parent().css("border","1px solid black"),e.preventDefault(),e.stopPropagation())}).on("dragleave",function(e){var node=$(e.originalEvent.srcElement).parent().parent().prev();node.is("select")&&node.hasClass("file-input")&&($(e.originalEvent.srcElement).parent().css("border",""),e.preventDefault(),e.stopPropagation())}).on("drop",function(e){var node=$(e.originalEvent.srcElement).parent().parent().prev();if(node.is("select")&&node.hasClass("file-input")){$(e.originalEvent.srcElement).parent().css("border","");var name=node.attr("name");if(name=name.substring(0,name.length-"_picker".length),e.originalEvent.dataTransfer)if(e.originalEvent.dataTransfer.files.length){e.preventDefault(),e.stopPropagation();var files=e.originalEvent.dataTransfer.files;that.setValue(name,files[0]),that.trigger("change",{name:name,value:files[0]})}else{var url=e.originalEvent.dataTransfer.getData("URL");e.preventDefault(),e.stopPropagation(),that.setValue(name,url),that.trigger("change",{name:name,value:url})}}})},morpheus.FormBuilder.showProgressBar=function(options){var content=[];content.push('
'),content.push('
'),content.push('
'),content.push('
'),content.push("
"),content.push('
'),content.push(''),content.push("
"),content.push("
"),options.subtitle&&(content.push('
'),content.push('

'),content.push(options.subtitle),content.push("

"),content.push("
")),content.push("
");var $content=$(content.join(""));return $content.find("[name=stop]").on("click",function(e){options.stop(),e.preventDefault()}),morpheus.FormBuilder.showInDraggableDiv({title:options.title,$content:$content})},morpheus.FormBuilder.showInDraggableDiv=function(options){var width=options.width||"300px",html=[];html.push('
'),html.push('

'+options.title+"

"),html.push('
'),html.push("
");var $div=$(html.join("")),$content=$div.find("[name=content]");return $div.find("[name=header]").on("dblclick",function(){"none"===$content.css("display")?$content.css("display",""):$content.css("display","none")}),options.$content.appendTo($content),$div.css("left",$(window).width()/2-$content.outerWidth()/2),$div.draggable({handle:"[name=header]",containment:"document"}),$div.appendTo($(document.body)),$div},morpheus.FormBuilder.promptForDataset=function(cb){var formBuilder=new morpheus.FormBuilder;formBuilder.append({name:"file",value:"",type:"file",required:!0,help:morpheus.DatasetUtil.DATASET_FILE_FORMATS});var $modal;formBuilder.on("change",function(e){var value=e.value;""!==value&&null!=value&&($modal.modal("hide"),$modal.remove(),cb(value))}),$modal=morpheus.FormBuilder.showInModal({title:"Dataset",html:formBuilder.$form,close:!1})},morpheus.FormBuilder.showInModal=function(options){var $div=morpheus.FormBuilder._showInModal({z:options.z,title:options.title,html:options.html,footer:options.close?'":null,onClose:options.callback,backdrop:options.backdrop,size:options.size});return $div},morpheus.FormBuilder.showOkCancel=function(options){options=$.extend({},{ok:!0},options);var footer=[];options.ok&&footer.push(''),options.apply&&footer.push(''),footer.push('');var $div=morpheus.FormBuilder._showInModal({title:options.title,html:options.content,footer:footer.join(""),onClose:options.hiddenCallback,size:options.size}),$ok=$div.find("[name=ok]");return $ok.on("click",function(e){options.okCallback(),$div.modal("hide")}),options.focus&&$ok.focus(),options.draggable&&$div.draggable({handle:".modal-header",containment:"document"}),$div},morpheus.FormBuilder.hasChanged=function(object,keyToUIElement){for(var keys=_.keys(keyToUIElement),i=0;i"),html.push('"),html.push("");var $div=$(html.join(""));return $div.on("mousewheel",function(e){e.stopPropagation()}),$div.find(".modal-body").html(options.html),$div.prependTo($(document.body)),$div.modal({backdrop:options.backdrop===!0}).on("hidden.bs.modal",function(e){$div.remove(),options.onClose&&options.onClose()}),$div},morpheus.FormBuilder.prototype={appendContent:function($content){this.$form.append($content)},addSeparator:function(){var html=[];html.push('
'),this.vertical||html.push('
'),html.push("
"),this.vertical||html.push("
"),html.push("
"),this.$form.append(html.join(""))},_append:function(html,field,isFieldStart){var that=this,required=field.required,name=field.name,type=field.type;if("separator"==type)return html.push(this.vertical?'
':'
'),html.push("
"),void html.push("
");var title=field.title,disabled=field.disabled,help=field.help,value=field.value,showLabel=field.showLabel,col="";this.vertical||(col=field.col||"col-xs-8"),void 0===showLabel&&(showLabel="checkbox"!==type&&"button"!==type&&"radio"!==type,showLabel=showLabel||void 0!==field.options);var id=that.prefix+"_"+name;if(void 0===title&&(title=name.replace(/_/g," "),title=title[0].toUpperCase()+title.substring(1)),showLabel?(html.push('"),isFieldStart&&html.push('
')):isFieldStart&&!this.vertical&&html.push('
'),"radio"===type)field.options?_.each(field.options,function(choice){var isChoiceObject=_.isObject(choice)&&void 0!==choice.value,optionValue=isChoiceObject?choice.value:choice,optionText=isChoiceObject?choice.name:choice,selected=value===optionValue;html.push('
")}):(html.push('
"));else if("checkbox"===type)html.push('
");else if("checkbox-list"===type)html.push('
');else if("select"==type||"bootstrap-select"==type)"bootstrap-select"==type?html.push('"),"bootstrap-select"==field.type&&field.toggle&&(html.push('

All | None

'),that.$form.on("click","[name="+name+"_all]",function(evt){evt.preventDefault();var $select=that.$form.find("[name="+name+"]");$select.selectpicker("val",$.map($select.find("option"),function(o){return $(o).val()})),$select.trigger("change")}),that.$form.on("click","[name="+name+"_none]",function(evt){evt.preventDefault();var $select=that.$form.find("[name="+name+"]");$select.selectpicker("val",[]),$select.trigger("change")}));else if("textarea"==type)html.push('");else if("button"==type)html.push('");else if("custom"===type)html.push(value);else if("file"===type){html.push('"),field.url!==!1&&(html.push("
"),html.push(''),html.push("
")),html.push(''),that.$form.on("change","[name="+name+"_picker]",function(evt){var $this=$(this),val=$this.val(),showTextInput="URL"===val;if("Dropbox"===val){var options={success:function(files){that.setValue(name,files[0].link),that.trigger("change",{name:name,value:files[0].link})},linkType:"direct",multiselect:!1};Dropbox.choose(options)}else"My Computer"===val&&that.$form.find("[name="+name+"_file]").click();that.$form.find("[name="+name+"_text]").css("display",showTextInput?"":"none")}),that.$form.on("keyup","[name="+name+"_text]",function(evt){var text=$.trim($(this).val());that.setValue(name,text),13===evt.which&&that.trigger("change",{name:name,value:text})}),that.$form.on("change","[name="+name+"_file]",function(evt){var files=evt.target.files;that.setValue(name,files[0]),that.trigger("change",{name:name,value:files[0]})})}else type=null==type?"text":type,"div"===type?html.push('
"),"div"===type&&html.push("
");void 0!==help&&(html.push(''),html.push(help),html.push(""))},append:function(fields){var html=[],that=this,isArray=morpheus.Util.isArray(fields);isArray||(fields=[fields]),html.push('
'),_.each(fields,function(field,index){that._append(html,field,0===index)}),html.push("
"),html.push("
");var $div=$(html.join(""));this.$form.append($div);var checkBoxLists=$div.find(".checkbox-list");if(checkBoxLists.length>0){var checkBoxIndex=0;_.each(fields,function(field){if("checkbox-list"===field.type){var list=new morpheus.CheckBoxList({responsive:!1,$el:$(checkBoxLists[checkBoxIndex]),items:field.options});$(checkBoxLists[checkBoxIndex]).data("morpheus.checkbox-list",list),checkBoxIndex++}})}$div.find(".selectpicker").selectpicker({iconBase:"fa",tickIcon:"fa-check",style:"btn-default btn-sm"})},clear:function(){this.$form.empty()},getValue:function(name){var $v=this.$form.find("[name="+name+"]");return 0===$v.length&&($v=this.$form.find("[name="+name+"_picker]")),morpheus.FormBuilder.getValue($v)},setOptions:function(name,options,selectFirst){var $select=this.$form.find("[name="+name+"]"),checkBoxList=$select.data("morpheus.checkbox-list");if(checkBoxList)checkBoxList.setItems(options);else{var html=[],selection=$select.val();_.each(options,function(choice){html.push('")}),$select.html(html.join("")),$select.val(selection),selectFirst&&null==$select.val()&&$select[0].options.length>0&&$select.val($select[0].options[0].value),$select.hasClass("selectpicker")&&($select.selectpicker("refresh"),$select.selectpicker("render"))}},find:function(name){return this.$form.find("[name="+name+"]")},setHelpText:function(name,value){var v=this.$form.find("[name="+name+"_help]");v.html(value)},setValue:function(name,value){var v=this.$form.find("[name="+name+"]");if(0===v.length&&(v=this.$form.find("[name="+name+"_picker]"),"file"===v.attr("type")))return v.data("files",value);var type=v.attr("type"),list=v.data("morpheus.checkbox-list");list?list.setValue(value):("radio"===type?v.filter("[value="+value+"]").prop("checked",!0):"checkbox"===type?v.prop("checked",value):v.val(value),v.hasClass("selectpicker")&&v.selectpicker("render"))},setVisible:function(name,visible){var $div=this.$form.find("[name="+name+"]").parents(".form-group");visible?$div.show():$div.hide()},remove:function(name){var $div=this.$form.find("[name="+name+"]").parents(".form-group");$div.remove()},setEnabled:function(name,enabled){var $div=this.$form.find("[name="+name+"]");$div.attr("disabled",!enabled),enabled?$div.parents(".form-group").find("label").removeClass("text-muted"):$div.parents(".form-group").find("label").addClass("text-muted")}},morpheus.Util.extend(morpheus.FormBuilder,morpheus.Events),morpheus.GradientColorSupplier=function(){morpheus.AbstractColorSupplier.call(this),this._updateScale()},morpheus.GradientColorSupplier.prototype={createInstance:function(){return new morpheus.GradientColorSupplier},getColor:function(row,column,value){if(isNaN(value))return this.missingColor;var min=this.min,max=this.max,colors=this.colors;if(min>=value)return colors[0];if(value>=max)return colors[colors.length-1];var fraction=morpheus.SteppedColorSupplier.linearScale(value,min,max,0,100)/100;return this.colorScale(fraction)},setFractions:function(options){morpheus.AbstractColorSupplier.prototype.setFractions.call(this,options),this._updateScale()},_updateScale:function(){this.colorScale=d3.scale.linear().domain(this.fractions).range(this.colors).clamp(!0)}},morpheus.Util.extend(morpheus.GradientColorSupplier,morpheus.AbstractColorSupplier),morpheus.Grid=function(options){function getItemColumnValue(item,column){return column.getter(item)}this.options=options;var grid,_this=this;this.items=options.items,this.modelToView=null,this.viewOrder=null;var model={getLength:function(){return null!=_this.viewOrder?_this.viewOrder.length:_this.items.length},getItem:function(index){return _this.items[null!=_this.viewOrder?_this.viewOrder[index]:index]}};this.$el=options.$el;var gridOptions=$.extend({},{select:!0,headerRowHeight:0,showHeaderRow:!1,multiColumnSort:!0,multiSelect:!1,topPanelHeight:0,enableTextSelectionOnCells:!0,forceFitColumns:!0,dataItemColumnValueExtractor:getItemColumnValue,defaultFormatter:function(row,cell,value,columnDef,dataContext){if(_.isNumber(value))return morpheus.Util.nf(value);if(morpheus.Util.isArray(value)){for(var s=[],i=0,length=value.length;length>i;i++){i>0&&s.push(", ");value[i];s.push(value[i])}return s.join("")}return value}},options.gridOptions||{});if(grid=new Slick.Grid(options.$el,model,options.columns,gridOptions),this.grid=grid,grid.registerPlugin(new morpheus.AutoTooltips2),grid.onCellChange.subscribe(function(e,args){_this.trigger("edit",args)}),gridOptions.select&&(grid.setSelectionModel(new Slick.RowSelectionModel({selectActiveRow:!0,multiSelect:gridOptions.multiSelect})),grid.getSelectionModel().onSelectedRangesChanged.subscribe(function(e){var nitems=grid.getDataLength();_this.trigger("selectionChanged",{selectedRows:grid.getSelectedRows().filter(function(row){return row>=0&&nitems>=row})})})),grid.onSort.subscribe(function(e,args){_this.sortCols=args.sortCols,_this._updateMappings(),grid.invalidate()}),options.$el.on("click",function(e){var cell=grid.getCellFromEvent(e);cell&&_this.trigger("click",{row:cell.row,target:e.target})}),options.$el.on("dblclick",function(e){var cell=grid.getCellFromEvent(e);cell&&_this.trigger("dblclick",{row:cell.row,target:e.target})}),options.sort){var gridSortColumns=[],gridColumns=grid.getColumns(),sortCols=[];options.sort.forEach(function(c){for(var column=null,i=0;i=0&&nitems>=row})},getSelectedItems:function(){for(var rows=this.grid.getSelectedRows(),selection=[],i=0,nrows=rows.length;nrows>i;i++)selection.push(this.items[this.convertViewIndexToModel(rows[i])]);return selection},getSelectedItem:function(){var rows=this.grid.getSelectedRows();return 1===rows.length?this.items[this.convertViewIndexToModel(rows[0])]:null},getItems:function(){for(var items=[],i=0,length=this.getFilteredItemCount();length>i;i++)items.push(this.items[this.convertViewIndexToModel(i)]);return items},getAllItemCount:function(){return this.items.length},getAllItems:function(){return this.items},getFilteredItemCount:function(){return this.viewOrder?this.viewOrder.length:this.items.length},redraw:function(){this.grid.invalidate()},redrawRows:function(rows){this.grid.invalidateRows(rows),this.grid.render()},setItems:function(items){this.items=items,this.grid.getSelectionModel()&&this.grid.setSelectedRows([]),this.setFilter(this.filter),this.columnsAutosized||this.autosizeColumns()},convertModelIndexToView:function(modelIndex){if(null!==this.modelToView){var index=this.modelToView.get(modelIndex);return void 0!==index?index:-1}return modelIndex},convertViewIndexToModel:function(viewIndex){return null!=this.viewOrder?viewIndex=0?this.viewOrder[viewIndex]:-1:viewIndex},_updateMappings:function(){var selectedViewIndices=null!=this.grid.getSelectionModel()?this.grid.getSelectedRows():null,selectedModelIndices=[];if(selectedViewIndices)for(var i=0,length=selectedViewIndices.length;length>i;i++)selectedModelIndices.push(this.convertViewIndexToModel(selectedViewIndices[i]));if(this.viewOrder=null,null!=this.filter){this.viewOrder=[];for(var i=0,length=this.items.length;length>i;i++)this.filter(this.items[i])&&this.viewOrder.push(i)}var cols=this.sortCols;if(cols&&cols.length>0){if(null==this.viewOrder){this.viewOrder=[];for(var i=0,length=this.items.length;length>i;i++)this.viewOrder.push(i)}var ncols=cols.length,items=this.items;this.viewOrder.sort(function(index1,index2){for(var i=0;ncols>i;i++){var getter=cols[i].sortCol.getter,sign=cols[i].sortAsc?1:-1,value1=getter(items[index1]),value2=getter(items[index2]),comparator=cols[i].sortCol.comparator,result=comparator(value1,value2)*sign;if(0!==result)return result}return 0})}if(null!=this.viewOrder){this.modelToView=new morpheus.Map;for(var i=0,length=this.viewOrder.length;length>i;i++)this.modelToView.set(this.viewOrder[i],i)}else this.modelToView=null;if(null!=this.grid.getSelectionModel()){for(var newSelectedViewIndices=[],i=0,length=selectedModelIndices.length;length>i;i++){var index=this.convertModelIndexToView(selectedModelIndices[i]);void 0!==index&&newSelectedViewIndices.push(index)}this.grid.setSelectedRows(newSelectedViewIndices)}},setSelectedRows:function(rows){this.grid.setSelectedRows(rows)},setFilter:function(filter){this.filter=filter,this._updateMappings(),this.grid.invalidate(),this.trigger("filter")},getFilter:function(){return this.filter},autosizeColumns:function(){this.columnsAutosized=!0;var columns=this.grid.getColumns(),items=this.getItems();if(columns&&!(columns.length<=1)){var div=document.createElement("div");document.body.appendChild(div);var $d=$(div);$d.css({position:"absolute",left:-1e3,top:-1e3});var $row=$('
'),$cell=$row.find(".slick-cell");$row.appendTo($d);for(var gridWidth=this.options.$el.width(),maxWidth=Math.min(parseInt(gridWidth/2),400),getColumnWidth=function(column){$cell.html(column.name);var w=Math.max($cell.outerWidth(),4);if(column.prototypeValue)$cell.html(column.prototypeValue),w=Math.max($cell.outerWidth(),w);else for(var i=0,nrows=Math.min(items.length,10);nrows>i;i++){var text=column.formatter(i,null,column.getter(items[i]),column,items[i]);$cell.html(text),w=Math.max($cell.outerWidth(),w)}column.width=parseInt(Math.min(maxWidth,w))},totalWidth=0,i=0;itotalWidth||totalWidth>gridWidth&&(columns[columns.length-1].width-=totalWidth-gridWidth),$d.remove(),this.grid.resizeCanvas()}}},morpheus.Util.extend(morpheus.Grid,morpheus.Events),morpheus.AutoTooltips2=function(options){function init(grid){_grid=grid,$(_grid.getCanvasNode()).on("mouseover",".slick-row",showToolTip),$(_grid.getCanvasNode()).on("mouseout",".slick-row",hideToolTip),$(_grid.getCanvasNode()).on("mouseup",hideAll)}function destroy(){$(_grid.getCanvasNode()).off("mouseover",showToolTip),$(_grid.getCanvasNode()).off("mouseout",hideToolTip),$(_grid.getCanvasNode()).off("mouseup",hideAll)}function hideToolTip(e){var cell=_grid.getCellFromEvent(e);if(cell){var $node=$(_grid.getCellNode(cell.row,cell.cell));$node.data("bs.tooltip")&&$node.tooltip("hide")}}function hideAll(){$(_grid.getCanvasNode()).find("[data-original-title]").attr("data-original-title","").tooltip("hide")}function showToolTip(e){var cell=_grid.getCellFromEvent(e);if(cell){var $node=$(_grid.getCellNode(cell.row,cell.cell)),text="",c=_grid.getColumns()[cell.cell],show=!1;if(c.alwaysShowTooltip||$node[0].scrollWidth>$node[0].offsetWidth){var item=_grid.getDataItem(cell.row);text=c.tooltip(item,c.getter(item)),show=!0}$node.attr("data-original-title",text);var hasTip=$node.data("bs.tooltip");hasTip||$node.tooltip({placement:"auto",html:!0,container:"body",trigger:"manual"}),show?$node.tooltip("show"):hasTip&&$node.tooltip("hide")}}var _grid;$.extend(this,{init:init,destroy:destroy})},morpheus.HeatMap=function(options){morpheus.Util.loadTrackingCode();var _this=this;options=$.extend(!0,{},{el:null,dataset:void 0,rowAnnotations:void 0,columnAnnotations:void 0,columnGroupBy:void 0,rowGroupBy:void 0,colorScheme:void 0,rowSortBy:void 0,columnSortBy:void 0,rowDendrogram:void 0,columnDendrogram:void 0,columnDendrogramField:"id",rowDendrogramField:"id",rows:[],columns:[],tools:void 0,rowFilter:void 0,columnFilter:void 0,customUrls:void 0,height:"window",width:void 0,inheritFromParent:!0,inheritFromParentOptions:{transpose:!1},structureUrlProvider:void 0,promises:void 0,renderReady:void 0,datasetReady:void 0,loadedCallback:void 0,name:void 0,rowsSortable:!0,columnsSortable:!0,popupEnabled:!0,symmetric:!1,keyboard:!0,inlineTooltip:!0,$loadingImage:$('
Loading...
'),toolbar:{zoom:!0,tools:!0,searchRows:!0,searchColumns:!0,sort:!0,options:!0,saveImage:!0,saveDataset:!0,openFile:!0,filter:!0,colorKey:!0,searchValues:!1}},options),this.options=options,this.tooltipProvider=morpheus.HeatMapTooltipProvider,options.el?this.$el=$(options.el):this.$el=$("
"),options.landingPage||(options.landingPage=new morpheus.LandingPage,options.landingPage.$el.prependTo(this.$el)),this.options.name||(this.options.name=morpheus.Util.getBaseFileName(morpheus.Util.getFileName(this.options.dataset.file?this.options.dataset.file:this.options.dataset)));null==this.options.parent;if(null==this.options.parent){this.tabManager=this.options.tabManager?this.options.tabManager:new morpheus.TabManager({landingPage:this.options.landingPage});var $a=$('');$a.tooltip({placement:"auto"});var $right=$('
');$a.appendTo($right),(new morpheus.HelpMenu).$el.appendTo($right),$right.appendTo(this.tabManager.$nav),this.options.tabManager||(this.tabManager.$nav.appendTo(this.$el),this.tabManager.$tabContent.appendTo(this.$el))}else this.options.inheritFromParent&&(this.popupItems=this.options.parent.popupItems,this.options.tabOpened||(this.options.tabOpened=this.options.parent.options.tabOpened),this.options.drawCallback=this.options.parent.options.drawCallback),this.tabManager=this.options.parent.tabManager;this.$el=$("
"),this.$el.css({width:"100%","user-select":"none","-webkit-user-select":"none","-webkit-user-drag":"none","-webkit-tap-highlight-color":"rgba(0, 0, 0, 0)","-moz-user-select":"none","-moz-user-drag":"none","-moz-tap-highlight-color":"rgba(0, 0, 0, 0)","-ms-user-select":"none","-ms-user-drag":"none","-ms-tap-highlight-color":"rgba(0, 0, 0, 0)","-o-user-select":"none","-o-user-drag":"none","-o-tap-highlight-color":"rgba(0, 0, 0, 0)","overflow-x":"visible","overflow-y":"visible"});var tab=this.tabManager.add({$el:this.$el,closeable:!0,rename:!0,title:this.options.name,object:this,focus:!0});options.$loadingImage&&options.$loadingImage.appendTo(this.$el),this.tabId=tab.id,this.$tabPanel=tab.$panel,this.options.dataSource=options.dataset?options.dataset.file?options.dataset.file:options.dataset:"",this._togglingInfoWindow=!1,this.tooltipMode=0,this.el=this.$el[0];var promises=[];if(options.promises)for(var i=0;iCause: "),message.push(err.message)),morpheus.FormBuilder.showInModal({title:"Error",html:message.join("")})}),promises.push(deferred),$.when.apply($,promises).then(function(){_this.options.$loadingImage&&_this.options.$loadingImage.remove(),_this._init(),heatMapLoaded()})}},morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS=6,morpheus.HeatMap.showTool=function(tool,controller,callback){if(tool.gui){var gui=tool.gui(controller.getProject()),formBuilder=new morpheus.FormBuilder;_.each(gui,function(item){formBuilder.append(item)});var tabId=controller.getTabManager().getActiveTabId();tool.init&&tool.init(controller.getProject(),formBuilder,{controller:controller});var $formDiv,okCallback=function(){var task={name:tool.toString(),tabId:tabId};controller.getTabManager().addTask(task);var input={};_.each(gui,function(item){input[item.name]=formBuilder.getValue(item.name)}),setTimeout(function(){try{var value=tool.execute({controller:controller,project:controller.getProject(),input:input});if(value instanceof Worker){value.onerror=function(e){task.worker.terminate(),morpheus.FormBuilder.showInModal({title:"Error",html:e,close:"Close"}),e.stack&&console.log(e.stack)};var terminate=_.bind(value.terminate,value);task.worker=value,value.terminate=function(){terminate();try{controller.getTabManager().removeTask(task)}catch(x){console.log("Error removing task")}callback&&callback(input)}}else callback&&callback(input)}catch(e){morpheus.FormBuilder.showInModal({title:"Error",html:e,close:"Close"}),e.stack&&console.log(e.stack)}finally{if(void 0===task.worker)try{controller.getTabManager().removeTask(task)}catch(x){console.log("Error removing task")}tool.dispose&&tool.dispose()}},0)};tool.ok=function(){okCallback(),$formDiv.modal("hide")};var guiOptions=$.extend({},{ok:!0},gui.options);$formDiv=morpheus.FormBuilder.showOkCancel({title:tool.toString(),apply:tool.apply,ok:guiOptions.ok,size:guiOptions.size,draggable:!0,content:formBuilder.$form,align:"right",okCallback:okCallback})}else try{tool.execute({controller:controller,project:controller.getProject(),input:{}});callback&&callback({})}catch(e){morpheus.FormBuilder.showInModal({title:"Error",html:e,close:"Close"}),e.stack&&console.log(e.stack)}finally{tool.dispose&&tool.dispose()}morpheus.Util.trackEvent({eventCategory:"Tool",eventAction:tool.toString()})},morpheus.HeatMap.getSpaces=function(groupByKeys,length,gapSize){for(var previousArray=[],nkeys=groupByKeys.length,keyIndex=0;nkeys>keyIndex;keyIndex++){var key=groupByKeys[keyIndex];previousArray.push(key.getValue(0))}var spaces=[],sum=0;spaces.push(sum);for(var i=1;length>i;i++){for(var isEqual=!0,keyIndex=0;nkeys>keyIndex;keyIndex++){var key=groupByKeys[keyIndex],comparator=key.getComparator(),val=key.getValue(i),c=comparator(val,previousArray[keyIndex]);if(0!==c){isEqual=!1;for(var keyIndex2=0;nkeys>keyIndex2;keyIndex2++)previousArray[keyIndex2]=groupByKeys[keyIndex2].getValue(i);break}}isEqual||(sum+=gapSize),spaces.push(sum)}return spaces},morpheus.HeatMap.createGroupBySpaces=function(dataset,groupByKeys,gapSize){if(groupByKeys.length>0){for(var nkeys=groupByKeys.length,keyIndex=0;nkeys>keyIndex;keyIndex++)groupByKeys[keyIndex].init(dataset);return morpheus.HeatMap.getSpaces(groupByKeys,dataset.getRowCount(),gapSize)}},morpheus.HeatMap.isDendrogramVisible=function(project,isColumns){var sortKeys=isColumns?project.getColumnSortKeys():project.getRowSortKeys(),size=isColumns?project.getSortedFilteredDataset().getColumnCount():project.getSortedFilteredDataset().getRowCount();return 1===sortKeys.length?sortKeys[0]instanceof morpheus.SpecifiedModelSortOrder&&"dendrogram"===sortKeys[0].name&&sortKeys[0].nvisible===size:void 0},morpheus.HeatMap.prototype={gapSize:10,updatingScroll:!1,autoDisplay:function(options){null==options.filename&&(options.filename="");var colorScheme;if("segtab"===options.extension||"seg"===options.extension)colorScheme={type:"fixed",map:morpheus.HeatMapColorScheme.Predefined.CN().map.map(function(item){return{value:Math.pow(2,1+item.value),color:item.color}})};else if("maf"===options.extension){colorScheme=morpheus.HeatMapColorScheme.Predefined.MAF();var colorMap=morpheus.HeatMapColorScheme.Predefined.MAF().map,rowMutProfile=this.project.getFullDataset().getRowMetadata().getByName("mutation_summary"),columnMutProfile=this.project.getFullDataset().getColumnMetadata().getByName("mutation_summary"),track=this.getTrack("mutation_summary",!1);track&&track.settingFromConfig("stacked_bar"),track=this.getTrack("mutation_summary",!0),track&&track.settingFromConfig("stacked_bar");for(var i=1;ii;i++){var key=existingSortKeys[i];if(key instanceof morpheus.SortByValuesKey&&morpheus.Util.arrayEquals(key.modelIndices,modelIndices)){priorSortKeyIndex=i,key.getSortOrder()===morpheus.SortKey.SortOrder.UNSORTED?sortOrder=morpheus.SortKey.SortOrder.DESCENDING:key.getSortOrder()===morpheus.SortKey.SortOrder.DESCENDING?sortOrder=morpheus.SortKey.SortOrder.ASCENDING:key.getSortOrder()===morpheus.SortKey.SortOrder.ASCENDING?sortOrder=morpheus.SortKey.SortOrder.TOP_N:key.getSortOrder()===morpheus.SortKey.SortOrder.TOP_N&&(sortOrder=morpheus.SortKey.SortOrder.UNSORTED);break}}null==sortOrder&&(sortOrder=morpheus.SortKey.SortOrder.DESCENDING);var sortKeys;if(append)sortKeys=isColumns?project.getRowSortKeys():project.getColumnSortKeys(),-1!==priorSortKeyIndex?sortOrder===morpheus.SortKey.SortOrder.UNSORTED?sortKeys.splice(priorSortKeyIndex,1):sortKeys[priorSortKeyIndex].setSortOrder(sortOrder):sortOrder!==morpheus.SortKey.SortOrder.UNSORTED&&sortKeys.push(new morpheus.SortByValuesKey(modelIndices,sortOrder,!isColumns)),sortKeys=morpheus.SortKey.keepExistingSortKeys(sortKeys,isColumns?project.getRowSortKeys():project.getColumnSortKeys());else{var newSortKeys=sortOrder===morpheus.SortKey.SortOrder.UNSORTED?[]:[new morpheus.SortByValuesKey(modelIndices,sortOrder,!isColumns)];sortKeys=morpheus.SortKey.keepExistingSortKeys(newSortKeys,isColumns?project.getRowSortKeys():project.getColumnSortKeys())}isColumns?(project.setRowSortKeys(sortKeys,!0),this.scrollTop(0)):(project.setColumnSortKeys(sortKeys,!0),this.scrollLeft(0))}},getToolbarElement:function(){return this.toolbar.$el},getToolbar:function(){return this.toolbar},setName:function(name){this.options.name=name},getName:function(){return this.options.name},showOptions:function(){new morpheus.HeatMapOptions(this)},getProject:function(){return this.project},setDendrogram:function(tree,isColumns,viewIndices){var dendrogram=isColumns?this.columnDendrogram:this.rowDendrogram;if(dendrogram&&(dendrogram.dispose(),dendrogram=null),null!=tree){for(var modelIndices=[],modelIndexSet=new morpheus.Set,size=isColumns?this.project.getFullDataset().getColumnCount():this.project.getFullDataset().getRowCount(),i=0;size>i;i++)modelIndexSet.add(i);for(var i=0,length=viewIndices.length;length>i;i++){var modelIndex=isColumns?this.project.convertViewColumnIndexToModel(viewIndices[i]):this.project.convertViewRowIndexToModel(viewIndices[i]);modelIndices.push(modelIndex),modelIndexSet.remove(modelIndex)}var nvisible=modelIndices.length;if(modelIndexSet.size()>0)for(var indices=modelIndexSet.values(),i=0,length=indices.length;length>i;i++)modelIndices.push(indices[i]);isColumns?(dendrogram=new morpheus.ColumnDendrogram(this,tree,this.heatmap.getColumnPositions(),this.project),dendrogram.filter=this.project.getColumnFilter().shallowClone(),this.columnDendrogram=dendrogram,this.project.setColumnSortKeys([new morpheus.SpecifiedModelSortOrder(modelIndices,nvisible,"dendrogram")],!0)):(dendrogram=new morpheus.RowDendrogram(this,tree,this.heatmap.getRowPositions(),this.project),dendrogram.filter=this.project.getRowFilter().shallowClone(),this.rowDendrogram=dendrogram,this.project.setRowSortKeys([new morpheus.SpecifiedModelSortOrder(modelIndices,nvisible,"dendrogram")],!0)),dendrogram.appendTo(this.$parent),dendrogram.$label.appendTo(this.$parent),dendrogram.$squishedLabel.appendTo(this.$parent)}else{for(var sortKeys=isColumns?this.project.getColumnSortKeys():this.project.getRowSortKeys(),i=0;i0){var tipText=[],dataset=project.getSortedFilteredDataset(),rowTracks=_this.rowTracks.filter(function(t){return t.settings.inlineTooltip}),columnTracks=_this.columnTracks.filter(function(t){return t.settings.inlineTooltip});return selectedViewIndices.forEach(function(id){var rowIndex=id.getArray()[0],columnIndex=id.getArray()[1];tipText.push(morpheus.Util.nf(dataset.getValue(rowIndex,columnIndex))),rowTracks.forEach(function(track){tipText.push(" "),tipText.push(morpheus.Util.formatObject(dataset.getRowMetadata().getByName(track.name).getValue(rowIndex)))}),columnTracks.forEach(function(track){tipText.push(" "),tipText.push(morpheus.Util.formatObject(dataset.getColumnMetadata().getByName(track.name).getValue(columnIndex)))}),tipText.push("\n")}),tipText.join("")}},_init:function(){function reorderTracks(array,isColumns){var nameOrderPairs=[],found=!1;if(_.each(array,function(item){var name=item.renameTo||item.field,order=999;null!=item.order&&(order=item.order,found=!0),nameOrderPairs.push({name:name,order:order})}),found){nameOrderPairs.sort(function(a,b){return a.order===b.order?0:a.order
").css("position","relative"),this.$parent.appendTo(this.$el),this.toolbar=new morpheus.HeatMapToolBar(this),this.options.customUrls&&this.setCustomUrls(this.options.customUrls),this.vscroll=new morpheus.ScrollBar(!0),this.vscroll.appendTo(this.$parent),this.vscroll.on("scroll",function(){_this.updatingScroll||_this.paintAll({paintRows:!0,paintColumns:!1,invalidateRows:!0,invalidateColumns:!1})}),this.beforeColumnTrackDivider=new morpheus.Divider(!1),this.beforeColumnTrackDivider.appendTo(this.$parent);var dragStartHeight=0;this.beforeColumnTrackDivider.on("resizeStart",function(e){dragStartHeight=_this.columnDendrogram.getUnscaledHeight()}).on("resize",function(e){var newHeight=Math.max(8,dragStartHeight+e.delta);_this.columnDendrogram.setPrefHeight(newHeight),_this.revalidate()}).on("resizeEnd",function(){dragStartHeight=0}),this.afterRowDendrogramDivider=new morpheus.Divider(!0),this.afterRowDendrogramDivider.appendTo(this.$parent);var rowDendrogramStartWidth=0;this.afterRowDendrogramDivider.on("resizeStart",function(e){rowDendrogramStartWidth=_this.rowDendrogram.getUnscaledWidth()}).on("resize",function(e){var newWidth=Math.max(8,rowDendrogramStartWidth+e.delta);_this.rowDendrogram.setPrefWidth(newWidth),_this.revalidate()}).on("resizeEnd",function(){rowDendrogramStartWidth=0}),this.afterVerticalScrollBarDivider=new morpheus.Divider(!0),this.afterVerticalScrollBarDivider.appendTo(this.$parent);var resizeStartHeatMapWidth=0;this.afterVerticalScrollBarDivider.on("resizeStart",function(e){resizeStartHeatMapWidth=_this.heatmap.getUnscaledWidth()}).on("resize",function(e){_this.heatmap.prefWidth=resizeStartHeatMapWidth+e.delta,_this.revalidate()}),this.hscroll=new morpheus.ScrollBar(!1),this.hscroll.appendTo(this.$parent),this.hscroll.on("scroll",function(){_this.updatingScroll||_this.paintAll({paintRows:!1,paintColumns:!0,invalidateRows:!1,invalidateColumns:!0})});var heatmap=new morpheus.HeatMapElementCanvas(this.project);this.options.drawCallback&&heatmap.setDrawCallback(this.options.drawCallback),$(heatmap.canvas).on("contextmenu",function(e){morpheus.Popup.showPopup([{name:"Copy",disabled:0===_this.project.getElementSelectionModel().count()},{name:"Save Image (Ctrl-S)"},{separator:!0},{name:"Show Inline Tooltip",checked:_this.options.inlineTooltip}],{x:e.pageX,y:e.pageY},e.target,function(event,item){if("Show Inline Tooltip"===item)_this.options.inlineTooltip=!_this.options.inlineTooltip;else if("Save Image (Ctrl-S)"===item)morpheus.HeatMap.showTool(new morpheus.SaveImageTool,_this);else{var text=_this.getSelectedElementsText();""!==text&&event.clipboardData.setData("text/plain",text)}}),e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation()}),heatmap.appendTo(this.$parent),this.heatmap=heatmap;var rowDendrogramSortKey=null;if(void 0!=rowDendrogram){var tree=rowDendrogram;if(tree.leafNodes.length!==this.project.getFullDataset().getRowCount())throw"# leaf nodes in row dendrogram "+tree.leafNodes.length+" != "+this.project.getFullDataset().getRowCount();if(null!=this.options.rowDendrogramField){for(var vector=dataset.getRowMetadata().getByName(this.options.rowDendrogramField),rowIndices=[],map=new morpheus.Map,re=/[,:]/g,j=0,size=vector.size();size>j;j++){var key=vector.getValue(j);map.set(key.replace(re,""),j)}for(var i=0,length=tree.leafNodes.length;length>i;i++){var index=map.get(tree.leafNodes[i].name);if(void 0===index)throw"Unable to find row dendrogram id "+tree.leafNodes[i].name+" in row annotations";rowIndices.push(index)}}else for(var i=0,length=tree.leafNodes.length;length>i;i++)rowIndices.push(i);this.rowDendrogram=new morpheus.RowDendrogram(this,tree,heatmap.getRowPositions(),this.project,!0),rowDendrogramSortKey=new morpheus.SpecifiedModelSortOrder(rowIndices,rowIndices.length,"dendrogram"),this.rowDendrogram.appendTo(this.$parent),this.rowDendrogram.$label.appendTo(this.$parent),this.rowDendrogram.$squishedLabel.appendTo(this.$parent)}var columnDendrogramSortKey=null;if(void 0!==columnDendrogram){var tree=columnDendrogram;if(tree.leafNodes.length!==this.project.getFullDataset().getColumnCount())throw"# leaf nodes "+tree.leafNodes.length+" != "+this.project.getFullDataset().getColumnCount();var columnIndices=[];if(null!=this.options.columnDendrogramField){for(var vector=dataset.getColumnMetadata().getByName(this.options.columnDendrogramField),map=new morpheus.Map,re=/[,:]/g,j=0,size=vector.size();size>j;j++){var key=vector.getValue(j);map.set(key.replace(re,""),j)}for(var i=0,length=tree.leafNodes.length;length>i;i++){var index=map.get(tree.leafNodes[i].name);if(void 0===index)throw"Unable to find column dendrogram id "+tree.leafNodes[i].name+" in column annotations";columnIndices.push(index)}}else for(var i=0,length=tree.leafNodes.length;length>i;i++)columnIndices.push(i);this.columnDendrogram=new morpheus.ColumnDendrogram(this,tree,heatmap.getColumnPositions(),this.project,!0),columnDendrogramSortKey=new morpheus.SpecifiedModelSortOrder(columnIndices,columnIndices.length,"dendrogram"),this.columnDendrogram.appendTo(this.$parent),this.columnDendrogram.$label.appendTo(this.$parent),this.columnDendrogram.$squishedLabel.appendTo(this.$parent)}if(null!==rowDendrogramSortKey&&this.project.setRowSortKeys([rowDendrogramSortKey]),null!==columnDendrogramSortKey&&this.project.setColumnSortKeys([columnDendrogramSortKey]),null!=this.options.rowGroupBy)for(var i=0;ii;i++){var display=displaySpecified?"None":void 0,v=isColumns?dataset.getColumnMetadata().get(i):dataset.getRowMetadata().get(i),name=v.getName(),option=nameToOption.get(name);if(!morpheus.MetadataUtil.DEFAULT_HIDDEN_FIELDS.has(name)||null!=option){var count=isColumns?dataset.getColumnCount():dataset.getRowCount();if(option||displaySpecified||!(count>1)||morpheus.VectorUtil.containsMoreThanOneValue(v)){null==option&&(option={}),option.title&&v.getProperties().set(morpheus.VectorKeys.TITLE,option.title),option.display&&(display="function"==typeof option.display?option.display(name):option.display);var add="None"!==display;if(add){isColumns&&null==display&&(display="pert_iname"===name||"id"===name||isFirst?"text":"color,highlight"),isFirst=!1;var track=isColumns?_this.addColumnTrack(name,display):_this.addRowTrack(name,display);if(track.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)&&option.color){var m=isColumns?_this.project.getColumnColorModel():_this.project.getRowColorModel();if(track.isDiscrete())_.each(options.color,function(p){m.setMappedValue(v,p.value,p.color)});else{var cs=m.createContinuousColorMap(v),min=Number.MAX_VALUE,max=-Number.MAX_VALUE;_.each(options.color,function(p){min=Math.min(min,p.value),max=Math.max(max,p.value)}),cs.setMin(min),cs.setMax(max);var valueToFraction=d3.scale.linear().domain([cs.getMin(),cs.getMax()]).range([0,1]).clamp(!0),fractions=[],colors=[];_.each(options.color,function(p){fractions.push(valueToFraction(p.value)),colors.push(p.color)}),cs.setFractions({fractions:fractions,colors:colors})}}if(track.isRenderAs(morpheus.VectorTrack.RENDER.SHAPE)&&option.shape){var m=isColumns?_this.project.getColumnShapeModel():_this.project.getRowShapeModel();_.each(options.shape,function(p){m.setMappedValue(v,p.value,p.shape)})}}}}}};setInitialDisplay(!1,this.options.rows),setInitialDisplay(!0,this.options.columns),reorderTracks(this.options.rows,!1),reorderTracks(this.options.columns,!0);var colorSchemeSpecified=null!=this.options.colorScheme;if(null==this.options.colorScheme){var ext="";if(this.options.dataSource)try{ext=morpheus.Util.getExtension(morpheus.Util.getFileName(this.options.dataSource))}catch(x){}var colorScheme=this.autoDisplay({extension:ext});null==colorScheme&&(colorScheme={type:"relative"}),this.options.colorScheme=colorScheme;var name=this.project.getFullDataset().getName();if("maf"===ext&&!this.options.rowSortBy){var sortKeys=[];this.project.getFullDataset().getRowMetadata().getByName("order")&&sortKeys.push(new morpheus.SortKey("order",morpheus.SortKey.SortOrder.ASCENDING)),sortKeys.push(new morpheus.SortKey("id",morpheus.SortKey.SortOrder.ASCENDING)),this.project.setRowSortKeys(sortKeys,!1)}-1!==morpheus.DatasetUtil.getSeriesIndex(this.project.getFullDataset(),"allelic_fraction")&&(this.options.sizeBy="allelic_fraction")}if(this.options.parent&&this.options.inheritFromParent&&!colorSchemeSpecified)heatmap.setColorScheme(this.options.parent.heatmap.getColorScheme().copy(this.project));else if(heatmap.setColorScheme(new morpheus.HeatMapColorScheme(this.project,this.options.colorScheme)),null!=this.options.dataset.getRowMetadata().getByName("Source")){var sourcesSet=morpheus.VectorUtil.getSet(this.options.dataset.getRowMetadata().getByName("Source"));this.heatmap.getColorScheme().setSeparateColorSchemeForRowMetadataField("Source"),sourcesSet.forEach(function(source){_this.autoDisplay({extension:morpheus.Util.getExtension(source),filename:""+source})})}if(this.options.sizeBy&&heatmap.getColorScheme().getSizer().setSeriesName(this.options.sizeBy),this.updateDataset(),this.options.uiReady&&this.options.uiReady(this),this.options.tabOpened){try{this.options.tabOpened(this)}catch(x){console.log("Error in tabOpened"),x.stack&&console.log(x.stack)}this.updateDataset()}if(this.options.renderReady){try{this.options.renderReady(this)}catch(x){console.log("Error in renderReady"),x.stack&&console.log(x.stack)}this.updateDataset()}null!=this.options.rowSize&&("fit"===this.options.rowSize?this.heatmap.getRowPositions().setSize(this.getFitRowSize()):this.heatmap.getRowPositions().setSize(this.options.rowSize),this.revalidate({paint:!1})),null!=this.options.columnSize&&("fit"===this.options.columnSize?this.heatmap.getColumnPositions().setSize(this.getFitColumnSize()):this.heatmap.getColumnPositions().setSize(this.options.columnSize),this.revalidate({paint:!1})),null!=this.options.rowSize&&null!=this.options.columnSize&&("fit"===this.options.columnSize&&(this.heatmap.getColumnPositions().setSize(this.getFitColumnSize()),this.revalidate({paint:!1})),"fit"===this.options.rowSize&&(this.heatmap.getRowPositions().setSize(this.getFitRowSize()),this.revalidate({paint:!1})),this.paintAll({paintRows:!0,paintColumns:!0,invalidateRows:!0,invalidateColumns:!0})),this.options.parent=null,this.$tipFollow=$('
'),this.$tipFollow.appendTo(this.$parent),this.$tipInfoWindow=$('
'),this.$tipInfoWindow.appendTo(this.$parent),this.$tipInfoWindow.dialog({close:function(event,ui){_this._togglingInfoWindow||_this.toggleInfoWindow()},autoOpen:!1,width:220,height:280,minHeight:38,minWidth:10,collision:"fit",position:{my:"right-30 bottom",at:"right top",of:this.$parent},title:"Info"}),this.getProject().on("rowFilterChanged columnFilterChanged rowGroupByChanged columnGroupByChanged rowSortOrderChanged columnSortOrderChanged datasetChanged",function(e){if("datasetChanged"===e.type){for(var dataset=_this.getProject().getFullDataset(),i=0;i<_this.rowTracks.length;i++){var track=_this.rowTracks[i];dataset.getRowMetadata().getByName(track.getName())||(_this.removeTrack(track.getName(),!1),i--)}for(var i=0;i<_this.columnTracks.length;i++){var track=_this.columnTracks[i];dataset.getColumnMetadata().getByName(track.getName())||(_this.removeTrack(track.getName(),!0),i--)}}_this.updateDataset(),_this.revalidate()}),this.getProject().on("trackChanged",function(e){var columns=e.columns;_.each(e.vectors,function(v,i){var index=_this.getTrackIndex(v.getName(),columns);if(-1===index)columns?_this.addColumnTrack(v.getName(),e.render[i]):_this.addRowTrack(v.getName(),e.render[i]);else{var track=_this.getTrackByIndex(index,columns),render=e.render[i];render&&track.settingFromConfig(render),track.setInvalid(!0)}}),_this.revalidate()}),this.getProject().on("rowTrackRemoved",function(e){_this.removeTrack(e.vector.getName(),!1),_this.revalidate()}),this.getProject().on("columnTrackRemoved",function(e){_this.removeTrack(e.vector.getName(),!0),_this.revalidate()}),this.getProject().getRowSelectionModel().on("selectionChanged",function(){for(var i=0;i<_this.columnTracks.length;i++){var track=_this.columnTracks[i];track.settings.stackedBar&&track.isRenderAs(morpheus.VectorTrack.RENDER.BAR)&&(track.setInvalid(!0),track.repaint())}_this.verticalSearchBar.update(),_this.paintAll({paintRows:!0,paintColumns:!1,invalidateRows:!1,invalidateColumns:!1})}),this.getProject().getColumnSelectionModel().on("selectionChanged",function(){_this.horizontalSearchBar.update(),_this.paintAll({paintRows:!1,paintColumns:!0,invalidateRows:!1,invalidateColumns:!1})}),$(window).on("paste.morpheus",function(e){if(_this.isActiveComponent()){var text=e.originalEvent.clipboardData.getData("text/plain");if(null!=text&&text.length>0){var blob=new Blob([text]),url=window.URL.createObjectURL(blob);e.preventDefault(),e.stopPropagation(),morpheus.HeatMap.showTool(new morpheus.OpenFileTool({file:url}),_this)}}}).on("beforecopy.morpheus",function(e){_this.isActiveComponent()&&e.preventDefault()}).on("copy.morpheus",function(ev){if(_this.isActiveComponent()){var activeComponent=_this.getActiveComponent(),project=_this.project;if(2===activeComponent){var text=_this.getSelectedElementsText();if(""!==text)return ev.originalEvent.clipboardData.setData("text/plain",text),ev.preventDefault(),void ev.stopImmediatePropagation()}var dataset=project.getSelectedDataset({emptyToAll:!1}),columnMetadata=dataset.getColumnMetadata(),rowMetadata=dataset.getRowMetadata(),visibleColumnFields=_this.getVisibleTrackNames(!0),columnFieldIndices=[];_.each(visibleColumnFields,function(name){var index=morpheus.MetadataUtil.indexOf(columnMetadata,name);-1!==index&&columnFieldIndices.push(index)}),columnMetadata=new morpheus.MetadataModelColumnView(columnMetadata,columnFieldIndices);var rowMetadata=dataset.getRowMetadata(),visibleRowFields=_this.getVisibleTrackNames(!1),rowFieldIndices=[];_.each(visibleRowFields,function(name){var index=morpheus.MetadataUtil.indexOf(rowMetadata,name); --1!==index&&rowFieldIndices.push(index)}),rowMetadata=new morpheus.MetadataModelColumnView(rowMetadata,rowFieldIndices);var text=[],rowsSelected=dataset.getRowCount()>0,columnsSelected=dataset.getColumnCount()>0;if(rowsSelected&&columnsSelected)text=(new morpheus.GctWriter).write(dataset);else{for(var text=[],model=rowsSelected?rowMetadata:columnMetadata,i=0,count=model.getItemCount();count>i;i++){for(var j=0,nfields=model.getMetadataCount();nfields>j;j++){var v=model.get(j);j>0&&text.push(" "),text.push(morpheus.Util.toString(v.getValue(i)))}text.push("\n")}text=text.join("")}ev.originalEvent.clipboardData.setData("text/plain",text),ev.preventDefault(),ev.stopImmediatePropagation()}}),this.options.keyboard&&new morpheus.HeatMapKeyListener(this);var dragStartScrollTop,dragStartScrollLeft;this.hammer=morpheus.Util.hammer(_this.heatmap.canvas,["pan","pinch","tap"]).on("panmove",function(event){_this.updatingScroll=!0;var rows=!1,columns=!1;if(0!==event.deltaY){var pos=dragStartScrollTop+event.deltaY;_this.scrollTop(pos),rows=!0}if(0!==event.deltaX){var pos=dragStartScrollLeft+event.deltaX;_this.scrollLeft(pos),columns=!0}_this.updatingScroll=!1,_this.paintAll({paintRows:rows,paintColumns:rows,invalidateRows:rows,invalidateColumns:columns}),event.preventDefault()}).on("panstart",function(event){dragStartScrollTop=_this.scrollTop(),dragStartScrollLeft=_this.scrollLeft()}).on("tap",function(event){var commandKey=morpheus.Util.IS_MAC?event.srcEvent.metaKey:event.srcEvent.ctrlKey;if(!morpheus.Util.IS_MAC||!event.srcEvent.ctrlKey){var position=morpheus.CanvasUtil.getMousePosWithScroll(event.target,event,_this.scrollLeft(),_this.scrollTop()),rowIndex=_this.heatmap.getRowPositions().getIndex(position.y,!1),columnIndex=_this.heatmap.getColumnPositions().getIndex(position.x,!1);_this.project.getElementSelectionModel().click(rowIndex,columnIndex,event.srcEvent.shiftKey||commandKey)}}).on("pinch",function(event){var scale=event.scale;_this.heatmap.getRowPositions().setSize(13*scale),_this.heatmap.getColumnPositions().setSize(13*scale);var reval={};-1!==_this.project.getHoverRowIndex()&&(reval.scrollTop=this.heatmap.getRowPositions().getPosition(this.project.getHoverRowIndex())),-1!==_this.project.getHoverColumnIndex()&&(reval.scrollLeft=this.heatmap.getColumnPositions().getPosition(this.project.getHoverColumnIndex())),_this.revalidate(reval),event.preventDefault()});var heatMapMouseMoved=function(event){var mouseI,mouseJ;if("mouseout"===event.type)mouseI=-1,mouseJ=-1;else{var position=morpheus.CanvasUtil.getMousePosWithScroll(event.target,event,_this.scrollLeft(),_this.scrollTop());mouseI=_this.heatmap.getRowPositions().getIndex(position.y,!1),mouseJ=_this.heatmap.getColumnPositions().getIndex(position.x,!1)}_this.setMousePosition(mouseI,mouseJ,{event:event})};$(_this.heatmap.canvas).on("mouseout",heatMapMouseMoved).on("mousemove",heatMapMouseMoved),_.each(this.options.tools,function(item){var tool=_this.toolbar.getToolByName(item.name);if(null==tool)console.log(item.name+" not found.");else try{var gui=tool.gui(_this.getProject()),formBuilder=new morpheus.FormBuilder;_.each(gui,function(item){formBuilder.append(item)});var input={};if(_.each(gui,function(item){input[item.name]=formBuilder.getValue(item.name)}),item.params)for(var key in item.params)input[key]=item.params[key];tool.execute({controller:_this,project:_this.getProject(),input:input})}catch(x){x.stack&&console.log(x.stack),console.log("Error running "+item.name)}finally{tool.dispose&&tool.dispose()}})},setMousePosition:function(i,j,options){this.mousePositionOptions=options;var updateColumns=this.project.getHoverColumnIndex()!==j,updateRows=this.project.getHoverRowIndex()!==i;updateColumns||updateRows?(this.project.setHoverRowIndex(i),this.project.setHoverColumnIndex(j),this.setToolTip(i,j,options),this.paintAll({paintRows:updateRows,paintColumns:updateColumns,invalidateRows:!1,invalidateColumns:!1})):this._updateTipFollowPosition(options),this.trigger("change",{name:"setMousePosition",source:this,arguments:arguments})},setTooltipMode:function(mode){this._togglingInfoWindow=!0,this.tooltipMode=mode,this.$tipInfoWindow.html(""),this.toolbar.$tip.html(""),this.$tipFollow.html("").css({left:-1e3,top:-1e3}),this.setToolTip(-1,-1),1===this.tooltipMode?this.$tipInfoWindow.dialog("open"):this.$tipInfoWindow.dialog("close"),this._togglingInfoWindow=!1},toggleInfoWindow:function(){this.setTooltipMode(1==this.tooltipMode?0:1)},setToolTip:function(rowIndex,columnIndex,options){options=options||{},this.options.showSeriesNameInTooltip&&(options.showSeriesNameInTooltip=!0);var tipText=this.tooltipProvider(this,rowIndex,columnIndex,options,0===this.tooltipMode?"   ":"
"),tipFollowText="";this.options.inlineTooltip&&(tipFollowText=this.tooltipProvider(this,rowIndex,columnIndex,options,"
",!0)),0===this.tooltipMode?this.toolbar.$tip.html(tipText):1===this.tooltipMode&&this.$tipInfoWindow.html(tipText),""!==tipFollowText?(this.tipFollowHidden=!1,this.$tipFollow.html(tipFollowText),this._updateTipFollowPosition(options)):(this.tipFollowHidden=!0,this.$tipFollow.html("").css({left:-1e3,top:-1e3})),this.trigger("change",{name:"setToolTip",source:this,arguments:arguments})},_updateTipFollowPosition:function(options){if(!this.tipFollowHidden){var rect=this.$parent[0].getBoundingClientRect(),tipWidth=this.$tipFollow.width(),tipHeight=this.$tipFollow.height(),left=options.event.clientX-rect.left+16;left+tipWidth>=rect.right&&(left=options.event.clientX-rect.left-16-tipWidth);var top=options.event.clientY-rect.top+16;top+tipHeight>=rect.bottom-rect.top&&(top=options.event.clientY-rect.top-16-tipHeight),this.$tipFollow.css({left:left,top:top})}},setTrackVisibility:function(tracks){var _this=this;_.each(tracks,function(track){var existingTrack=_this.getTrack(track.name,track.isColumns);track.visible&&null!=existingTrack&&0===_.keys(existingTrack.renderSettings).length&&existingTrack.settingFromConfig(track.isColumns?"Color":"Text"),_this.setTrackVisible(track.name,track.visible,track.isColumns)}),this.revalidate(),this.trigger("change",{name:"setTrackVisibility",source:this,arguments:arguments})},setTrackVisible:function(name,visible,isColumns){var trackIndex=this.getTrackIndex(name,isColumns);if(-1===trackIndex){if(!visible)return;isColumns?this.addColumnTrack(name):this.addRowTrack(name)}else{var track=isColumns?this.columnTracks[trackIndex]:this.rowTracks[trackIndex],header=isColumns?this.columnTrackHeaders[trackIndex]:this.rowTrackHeaders[trackIndex];if(track.isVisible()===visible)return;track.setVisible(visible),header.setVisible(visible)}this.trigger("change",{name:"setTrackVisible",source:this,arguments:arguments})},addRowTrack:function(name,renderSettings){if(void 0===name)throw"Name not specified";if("None"!==renderSettings){null==renderSettings&&(renderSettings="[number]"===morpheus.VectorUtil.getDataType(this.project.getFullDataset().getRowMetadata().getByName(name))?"bar":morpheus.VectorTrack.RENDER.TEXT);var track=new morpheus.VectorTrack(this.project,name,this.heatmap.getRowPositions(),!1,this);track.settingFromConfig(renderSettings),this.rowTracks.push(track),track.appendTo(this.$parent),$(track.canvas).css("z-index","0");var header=new morpheus.VectorTrackHeader(this.project,name,!1,this);return this.rowTrackHeaders.push(header),header.appendTo(this.$parent),$(header.canvas).css("z-index","0"),track._selection=new morpheus.TrackSelection(track,this.heatmap.getRowPositions(),this.project.getRowSelectionModel(),!1,this),track}},addTrack:function(name,isColumns,renderSettings){isColumns?this.addColumnTrack(name,renderSettings):this.addRowTrack(name,renderSettings)},addColumnTrack:function(name,renderSettings){if(void 0===name)throw"Name not specified";if("None"!==renderSettings){null==renderSettings&&(renderSettings="[number]"===morpheus.VectorUtil.getDataType(this.project.getFullDataset().getColumnMetadata().getByName(name))?"bar":morpheus.VectorTrack.RENDER.TEXT);var track=new morpheus.VectorTrack(this.project,name,this.heatmap.getColumnPositions(),!0,this);track.settingFromConfig(renderSettings),this.columnTracks.push(track),track.appendTo(this.$parent);var header=new morpheus.VectorTrackHeader(this.project,name,!0,this);return this.columnTrackHeaders.push(header),header.appendTo(this.$parent),track._selection=new morpheus.TrackSelection(track,this.heatmap.getColumnPositions(),this.project.getColumnSelectionModel(),!0,this),track}},addPopup:function(item){this.popupItems||(this.popupItems=[]),this.popupItems.push(item)},getPopupItems:function(){return this.popupItems||[]},removeTrack:function(name,isColumns){var index=this.getTrackIndex(name,isColumns),tracks=isColumns?this.columnTracks:this.rowTracks;if(isNaN(index)||0>index||index>=tracks.length)return void console.log("removeTrack: "+name+" not found.");var headers=isColumns?this.columnTrackHeaders:this.rowTrackHeaders,track=tracks[index],header=headers[index];track.dispose(),track._selection.dispose(),header.dispose(),tracks.splice(index,1),headers.splice(index,1),this.trigger("change",{name:"removeTrack",source:this,arguments:arguments})},updateDataset:function(){var dataset=this.project.getSortedFilteredDataset();this.verticalSearchBar.update(),this.horizontalSearchBar.update(),this.heatmap.setDataset(dataset),this.heatmap.getRowPositions().spaces=morpheus.HeatMap.createGroupBySpaces(dataset,this.project.getGroupRows(),this.gapSize),this.heatmap.getColumnPositions().spaces=morpheus.HeatMap.createGroupBySpaces(new morpheus.TransposedDatasetView(dataset),this.project.getGroupColumns(),this.gapSize),this.trigger("change",{name:"updateDataset",source:this,arguments:arguments})},zoom:function(isZoomIn,options){options=$.extend({},{rows:!0,columns:!0},options),isZoomIn?(options.rows&&this.heatmap.getRowPositions().setSize(1.5*this.heatmap.getRowPositions().getSize()),options.columns&&this.heatmap.getColumnPositions().setSize(1.5*this.heatmap.getColumnPositions().getSize())):(options.rows&&this.heatmap.getRowPositions().setSize(this.heatmap.getRowPositions().getSize()/1.5),options.columns&&this.heatmap.getColumnPositions().setSize(this.heatmap.getColumnPositions().getSize()/1.5));var reval={};options.rows&&-1!==this.project.getHoverRowIndex()&&(reval.scrollTop=this.heatmap.getRowPositions().getPosition(this.project.getHoverRowIndex())),options.columns&&-1!==this.project.getHoverColumnIndex()&&(reval.scrollLeft=this.heatmap.getColumnPositions().getPosition(this.project.getHoverColumnIndex())),this.revalidate(reval),this.trigger("change",{name:"zoom",source:this,arguments:arguments})},getTrackIndex:function(name,isColumns){for(var tracks=isColumns?this.columnTracks:this.rowTracks,i=0,length=tracks.length;length>i;i++)if(void 0!==tracks[i].name&&tracks[i].name===name)return i;return-1},getNumTracks:function(isColumns){return isColumns?this.columnTracks.length:this.rowTracks.length},moveTrack:function(index,newIndex,isColumns){var tracks=isColumns?this.columnTracks:this.rowTracks,headers=isColumns?this.columnTrackHeaders:this.rowTrackHeaders,track=tracks[index];tracks.splice(index,1);var header=headers[index];headers.splice(index,1),tracks.splice(newIndex,0,track),headers.splice(newIndex,0,header),this.trigger("change",{name:"moveTrack",source:this,arguments:arguments})},getTrackByIndex:function(index,isColumns){return isColumns?this.columnTracks[index]:this.rowTracks[index]},getTrackHeaderByIndex:function(index,isColumns){return isColumns?this.columnTrackHeaders[index]:this.rowTrackHeaders[index]},getTrack:function(name,isColumns){var index=this.getTrackIndex(name,isColumns);if(-1!==index)return isColumns?this.columnTracks[index]:this.rowTracks[index]},isActiveComponent:function(){var active=document.activeElement,tagName=active.tagName;return"INPUT"==tagName||"SELECT"==tagName||"TEXTAREA"==tagName?!1:this.$tabPanel[0].contains(active)},getActiveComponent:function(){var active=document.activeElement;if("CANVAS"===active.tagName){for(var i=0,ntracks=this.columnTracks.length;ntracks>i;i++)if(this.columnTracks[i].canvas===active)return 1;for(var i=0,ntracks=this.rowTracks.length;ntracks>i;i++)if(this.rowTracks[i].canvas===active)return 0;if(this.heatmap.canvas===active)return 2}return-1},getVisibleTrackNames:function(isColumns){for(var names=[],tracks=isColumns?this.columnTracks:this.rowTracks,i=0,length=tracks.length;length>i;i++)tracks[i].isVisible()&&names.push(tracks[i].name);return names},resizeTrack:function(name,width,height,isColumns){var index=this.getTrackIndex(name,isColumns);if(-1===index)throw name+" not found in resize track";if(isColumns){var track=this.columnTracks[index],header=this.columnTrackHeaders[index];if(height&&(track.setPrefHeight(height),header.setPrefHeight(height)),width)for(var i=0;ii;i++){var track=this.rowTracks[i];track.setInvalid(invalidateRows),track.isVisible()&&(track.paint({x:0,y:y,height:unscaledHeight,width:unscaledWidth}),this.rowTrackHeaders[i].paint())}null!=this.rowDendrogram&&(this.rowDendrogram.setInvalid(invalidateRows),this.isDendrogramVisible(!1)?(this.rowDendrogram.setVisible(!0),this.rowDendrogram.paint({x:0,y:y,height:unscaledHeight,width:this.rowDendrogram.getUnscaledWidth()})):this.rowDendrogram.setVisible(!1))}if(columns){for(var i=0,length=this.columnTracks.length;length>i;i++){var track=this.columnTracks[i];track.setInvalid(invalidateColumns),track.paint({x:x,y:0,width:unscaledWidth,height:track.getUnscaledHeight()}),this.columnTrackHeaders[i].paint()}null!=this.columnDendrogram&&(this.columnDendrogram.setInvalid(invalidateColumns),this.isDendrogramVisible(!0)?(this.columnDendrogram.setVisible(!0),this.columnDendrogram.paint({x:x,y:0,width:unscaledWidth,height:this.columnDendrogram.getUnscaledHeight()})):this.columnDendrogram.setVisible(!1))}(invalidateRows||invalidateColumns)&&this.heatmap.setInvalid(!0),this.heatmap.paint({x:x,y:y,width:unscaledWidth,height:unscaledHeight}),this.trigger("change",{name:"paintAll",source:this,arguments:arguments})},scrollTop:function(pos){return void 0===pos?this.vscroll.getValue():(this.vscroll.setValue(pos,!0),void this.trigger("change",{name:"scrollTop",source:this,arguments:arguments}))},scrollLeft:function(pos){return void 0===pos?this.hscroll.getValue():(this.trigger("change",{name:"scrollLeft",source:this,arguments:arguments}),void this.hscroll.setValue(pos,!0))},setSelectedTrack:function(name,isColumns){if(name!==this.selectedTrackName||isColumns!==this.selectedTrackIsColumns){var index=this.getTrackIndex(this.selectedTrackName,this.selectedTrackIsColumns);-1!==index&&this.getTrackHeaderByIndex(index,this.selectedTrackIsColumns).setSelected(!1),this.selectedTrackName=name,this.selectedTrackIsColumns=isColumns;var index=this.getTrackIndex(this.selectedTrackName,this.selectedTrackIsColumns);-1!==index&&this.getTrackHeaderByIndex(index,this.selectedTrackIsColumns).setSelected(!0),this.trigger("change",{name:"setSelected",source:this,arguments:arguments})}},saveImage:function(file,format){var bounds=this.getTotalSize();if("svg"===format){var context=new C2S(bounds.width,bounds.height);this.snapshot(context);var svg=context.getSerializedSvg(),blob=new Blob([svg],{type:"text/plain;charset=utf-8"});saveAs(blob,file,!0)}else{var canvas=$("")[0],backingScale=morpheus.CanvasUtil.BACKING_SCALE,height=bounds.height*backingScale,width=bounds.width*backingScale;canvas.height=height,canvas.style.height=bounds.height+"px",canvas.width=width,canvas.style.width=bounds.width+"px",this.snapshot(canvas.getContext("2d")),canvas.toBlob(function(blob){if(0===blob.size)throw"Image is too large.";saveAs(blob,file,!0)})}},getTotalSize:function(options){options=$.extend({},{legend:!0},options);var heatmapPrefSize=this.heatmap.getPreferredSize(),totalSize={width:heatmapPrefSize.width,height:heatmapPrefSize.height};this.isDendrogramVisible(!1)&&(totalSize.width+=this.rowDendrogram.getUnscaledWidth()),this.isDendrogramVisible(!0)&&(totalSize.height+=this.columnDendrogram.getUnscaledHeight());for(var maxHeaderHeight=0,maxHeaderWidth=0,i=0,length=this.rowTracks.length;length>i;i++){var track=this.rowTracks[i];if(track.isVisible()){var headerSize=this.rowTrackHeaders[i].getPrintSize();totalSize.width+=Math.max(headerSize.width,track.getPrintSize().width),maxHeaderHeight=Math.max(maxHeaderHeight,headerSize.height)}}totalSize.height+=maxHeaderHeight;for(var i=0,length=this.columnTracks.length;length>i;i++){var track=this.columnTracks[i];track.isVisible()&&(totalSize.height+=track.getPrintSize().height,maxHeaderWidth=Math.max(maxHeaderWidth,this.columnTrackHeaders[i].getPrintSize().width))}if(maxHeaderWidth+=10,totalSize.width+=maxHeaderWidth,options.legend){var legendHeight=null!=this.heatmap.getColorScheme().getNames()?14*this.heatmap.getColorScheme().getNames().length:40;totalSize.height+=legendHeight}var trackLegendSize=new morpheus.HeatMapTrackColorLegend(_.filter(this.columnTracks,function(track){return track.isVisible()&&(track.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||track.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR))}),this.getProject().getColumnColorModel()).getPreferredSize();return totalSize.height+=trackLegendSize.height,totalSize.width=Math.max(totalSize.width,trackLegendSize.width),trackLegendSize=new morpheus.HeatMapTrackColorLegend(_.filter(this.rowTracks,function(track){return track.isVisible()&&(track.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||track.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR))}),this.getProject().getRowColorModel()).getPreferredSize(),totalSize.height+=trackLegendSize.height,totalSize.width=10+Math.max(totalSize.width,trackLegendSize.width),totalSize},getHeatMapElementComponent:function(){return this.heatmap},snapshot:function(context,options){options=$.extend({},{legend:!0},options);var heatmapPrefSize=this.heatmap.getPreferredSize(),legendHeight=(this.getTotalSize(options),0);options.legend&&(null!=this.heatmap.getColorScheme().getNames()?14*this.heatmap.getColorScheme().getNames().length:40,context.save(),context.translate(50,0),morpheus.HeatMapColorSchemeLegend.drawColorScheme(context,this.heatmap.getColorScheme(),200,!0),context.restore()),context.save(),context.translate(4,legendHeight);var columnTrackLegend=new morpheus.HeatMapTrackColorLegend(_.filter(this.columnTracks,function(track){return track.isVisible()&&(track.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||track.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR))}),this.getProject().getColumnColorModel());columnTrackLegend.draw({},context),context.restore();var columnTrackLegendSize=columnTrackLegend.getPreferredSize();context.save(),context.translate(4+columnTrackLegendSize.width,legendHeight);var rowTrackLegend=new morpheus.HeatMapTrackColorLegend(_.filter(this.rowTracks,function(track){return track.isVisible()&&(track.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||track.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR))}),this.getProject().getRowColorModel());rowTrackLegend.draw({},context),context.restore(),legendHeight+=Math.max(rowTrackLegend.getPreferredSize().height,columnTrackLegendSize.height);var heatmapY=this.isDendrogramVisible(!0)?this.columnDendrogram.getUnscaledHeight():0;heatmapY+=legendHeight+10;for(var heatmapX=this.isDendrogramVisible(!1)?this.rowDendrogram.getUnscaledWidth():0,totalColumnTrackHeight=0,i=0,length=this.columnTracks.length;length>i;i++){var track=this.columnTracks[i];if(track.isVisible()){var header=this.columnTrackHeaders[i];heatmapX=Math.max(heatmapX,header.getPrintSize().width);var height=track.getPrintSize().height;heatmapY+=height,totalColumnTrackHeight+=height}}heatmapX+=10;for(var i=0,length=this.rowTracks.length;length>i;i++){var track=this.rowTracks[i];if(track.isVisible()){var header=this.rowTrackHeaders[i];heatmapY=Math.max(heatmapY,header.getPrintSize().height)}}if(this.isDendrogramVisible(!1)){var rowDendrogramClip={x:0,y:0,width:this.rowDendrogram.getUnscaledWidth(),height:heatmapPrefSize.height};context.save(),context.translate(0,heatmapY),this.rowDendrogram.prePaint(rowDendrogramClip,context),this.rowDendrogram.draw(rowDendrogramClip,context),context.restore()}if(this.isDendrogramVisible(!0)){context.save(),context.translate(heatmapX,legendHeight);var columnDendrogramClip={x:0,y:0,width:heatmapPrefSize.width,height:this.columnDendrogram.getUnscaledHeight()};this.columnDendrogram.prePaint(columnDendrogramClip,context),this.columnDendrogram.draw(columnDendrogramClip,context),context.restore()}for(var columnTrackY=heatmapY-10-totalColumnTrackHeight,i=0,length=this.columnTracks.length;length>i;i++){var track=this.columnTracks[i];if(track.isVisible()){context.save();var tx=heatmapX;context.translate(tx,columnTrackY);var trackClip={x:0,y:0,width:heatmapPrefSize.width,height:track.getPrintSize().height};track.print(trackClip,context),context.restore();var header=this.columnTrackHeaders[i];context.save();var headerSize=header.getPrintSize(),headerClip={x:0,y:0,width:headerSize.width,height:headerSize.height};context.translate(tx-10,columnTrackY+trackClip.height),header.print(headerClip,context),context.restore(),columnTrackY+=Math.max(headerClip.height,trackClip.height)}}context.save(),context.translate(heatmapX,heatmapY),this.heatmap.draw({x:0,y:0,width:heatmapPrefSize.width,height:heatmapPrefSize.height},context),context.restore();for(var sum=0,i=0,length=this.rowTracks.length;length>i;i++){var track=this.rowTracks[i];if(track.isVisible()){context.save();var tx=10+heatmapX+heatmapPrefSize.width+sum,ty=heatmapY,trackClip={x:0,y:0,width:track.getPrintSize().width,height:heatmapPrefSize.height};context.translate(tx,ty),context.strokeStyle="white",context.rect(0,0,trackClip.width,trackClip.height),context.stroke(),context.clip(),track.print(trackClip,context),context.restore();var header=this.rowTrackHeaders[i];context.save();var headerSize=header.getPrintSize(),headerClip={x:0,y:0,width:headerSize.width,height:headerSize.height};context.translate(tx,ty-4),header.print(headerClip,context),context.restore(),sum+=Math.max(headerSize.width,trackClip.width)}}},resetZoom:function(){var heatmap=this.heatmap,rowSizes=heatmap.getRowPositions(),columnSizes=heatmap.getColumnPositions();rowSizes.setSize(13),columnSizes.setSize(13);var reval={};-1!==this.project.getHoverRowIndex()&&(reval.scrollTop=this.heatmap.getRowPositions().getPosition(this.project.getHoverRowIndex())),-1!==this.project.getHoverColumnIndex()&&(reval.scrollLeft=this.heatmap.getColumnPositions().getPosition(this.project.getHoverColumnIndex())),this.revalidate(reval)},getFitColumnSize:function(){var heatmap=this.heatmap,availablePixels=this.getAvailableWidth();this.rowDendrogram&&(availablePixels-=this.rowDendrogram.getUnscaledWidth());for(var trackPixels=12,i=0,length=this.rowTracks.length;length>i;i++){var track=this.rowTracks[i];track.isVisible()&&(trackPixels+=track.getUnscaledWidth())}for(var i=0,length=this.columnTracks.length;length>i;i++){var track=this.columnTracks[i];if(track.isVisible()){trackPixels+=this.columnTrackHeaders[i].getUnscaledWidth();break}}availablePixels-=trackPixels;var positions=heatmap.getColumnPositions(),totalCurrent=positions.getItemSize(positions.getLength()-1)+positions.getPosition(positions.getLength()-1),size=positions.getSize();return size*=availablePixels/totalCurrent,size=Math.min(13,size)},getFitRowSize:function(){var heatmap=this.heatmap,availablePixels=this.getAvailableHeight();this.columnDendrogram&&(availablePixels-=this.columnDendrogram.getUnscaledHeight());for(var trackPixels=12,i=0,length=this.columnTracks.length;length>i;i++){var track=this.columnTracks[i];track.isVisible()&&(trackPixels+=track.getUnscaledHeight())}availablePixels-=trackPixels;var positions=heatmap.getRowPositions(),totalCurrent=positions.getItemSize(positions.getLength()-1)+positions.getPosition(positions.getLength()-1),size=positions.getSize();return size*=availablePixels/totalCurrent,size=Math.min(13,size)},fitToWindow:function(repaint){if(this.heatmap.getRowPositions().setSize(this.getFitRowSize()),this.heatmap.getColumnPositions().setSize(this.getFitColumnSize()),repaint){var reval={};-1!==this.project.getHoverRowIndex()&&(reval.scrollTop=this.heatmap.getRowPositions().getPosition(this.project.getHoverRowIndex())),-1!==this.project.getHoverColumnIndex()&&(reval.scrollLeft=this.heatmap.getColumnPositions().getPosition(this.project.getHoverColumnIndex())),this.revalidate(reval)}},getAvailableHeight:function(){if(_.isNumber(this.options.height))return this.options.height;var height=$(window).height()-this.$parent.offset().top-24;return"window"===this.options.height?height:Math.max(Math.round(.7*screen.height),height)},getAvailableWidth:function(){return this.options.width?this.options.width:this.tabManager.getWidth()-30},revalidate:function(options){options=$.extend({},{paint:!0},options),this.updatingScroll=!0;var availableHeight=this.getAvailableHeight(),availableWidth=this.getAvailableWidth(),heatmapPrefSize=this.heatmap.getPreferredSize(),columnDendrogramHeight=0,rowDendrogramWidth=0;this.columnDendrogram&&(columnDendrogramHeight=morpheus.CanvasUtil.getPreferredSize(this.columnDendrogram).height),this.rowDendrogram&&(rowDendrogramWidth=morpheus.CanvasUtil.getPreferredSize(this.rowDendrogram).width);for(var rowTrackWidthSum=0,i=0,length=this.rowTracks.length;length>i;i++)this.rowTracks[i].isVisible()&&(rowTrackWidthSum+=Math.max(morpheus.CanvasUtil.getPreferredSize(this.rowTrackHeaders[i]).width,morpheus.CanvasUtil.getPreferredSize(this.rowTracks[i]).width));for(var ypos=columnDendrogramHeight,maxHeaderWidth=0,i=0,length=this.columnTracks.length;length>i;i++)if(this.columnTracks[i].isVisible()){var width=morpheus.CanvasUtil.getPreferredSize(this.columnTrackHeaders[i]).width;maxHeaderWidth=Math.max(maxHeaderWidth,width)}var xpos=Math.max(rowDendrogramWidth,maxHeaderWidth),heatMapWidth=heatmapPrefSize.width,maxHeatMapWidth=Math.max(50,availableWidth-rowTrackWidthSum-xpos-morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS);maxHeatMapWidth>0&&heatMapWidth>maxHeatMapWidth&&(heatMapWidth=maxHeatMapWidth,heatMapWidth=Math.min(heatMapWidth,heatmapPrefSize.width)),void 0!==this.heatmap.prefWidth&&(heatMapWidth=Math.min(heatmapPrefSize.width,this.heatmap.prefWidth)),void 0!==this.columnDendrogram?(this.columnDendrogram.setBounds({width:heatMapWidth,height:columnDendrogramHeight,left:xpos,top:0}),this.columnDendrogram.$label.css("left",xpos+this.columnDendrogram.getUnscaledWidth()+10).css("top",2),this.columnDendrogram.$squishedLabel.css("left",xpos+this.columnDendrogram.getUnscaledWidth()+10).css("top",18),this.beforeColumnTrackDivider.setVisible(!0),this.beforeColumnTrackDivider.setBounds({left:xpos-maxHeaderWidth,top:ypos,width:maxHeaderWidth}),ypos++):this.beforeColumnTrackDivider.setVisible(!1);for(var i=0,length=this.columnTracks.length;length>i;i++){var track=this.columnTracks[i];if(track.isVisible()){var size=morpheus.CanvasUtil.getPreferredSize(track),headerSize=morpheus.CanvasUtil.getPreferredSize(this.columnTrackHeaders[i]);size.height=Math.max(size.height,headerSize.height),track.setBounds({width:heatMapWidth,height:size.height,left:xpos,top:ypos}),this.columnTrackHeaders[i].setBounds({width:maxHeaderWidth,height:size.height,left:xpos-maxHeaderWidth,top:ypos}),ypos+=size.height}}ypos+=morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS;var heatMapHeight=heatmapPrefSize.height;heatMapHeight>availableHeight-ypos&&(heatMapHeight=Math.max(100,Math.min(heatmapPrefSize.height,availableHeight-ypos))),0>ypos&&(ypos=0),this.rowDendrogram?(this.rowDendrogram.setBounds({width:Math.max(rowDendrogramWidth,maxHeaderWidth),height:heatMapHeight,left:0,top:ypos}),this.rowDendrogram.$label.css("left",0).css("top",2),this.afterRowDendrogramDivider.setVisible(!0),this.afterRowDendrogramDivider.setBounds({height:heatMapHeight,left:this.rowDendrogram.getUnscaledWidth(),top:ypos}),xpos++):this.afterRowDendrogramDivider.setVisible(!1),this.heatmap.setBounds({width:heatMapWidth,height:heatMapHeight,left:xpos,top:ypos}),this.hSortByValuesIndicator.setBounds({height:4,width:heatMapWidth,left:xpos,top:ypos-4}),this.hscroll.setVisible(heatMapWidthi;i++){var track=this.rowTracks[i];if(track.isVisible()){nvisibleRowTracks++;break}}this.vSortByValuesIndicator.setBounds({width:4,height:heatMapHeight,left:xpos,top:ypos}),nvisibleRowTracks>0&&(xpos+=morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS);for(var rowAnnotationXStart=xpos,i=0,length=this.rowTracks.length;length>i;i++){var track=this.rowTracks[i];if(track.isVisible()){var size=morpheus.CanvasUtil.getPreferredSize(track),headerSize=morpheus.CanvasUtil.getPreferredSize(this.rowTrackHeaders[i]);size.width=Math.max(headerSize.width,size.width),size.height=heatMapHeight,track.setBounds({width:size.width,height:size.height,left:xpos,top:ypos}),this.rowTrackHeaders[i].setBounds({width:size.width,left:xpos,top:ypos-headerSize.height-5,height:headerSize.height}),xpos+=size.width}}this.afterVerticalScrollBarDivider.setVisible(nvisibleRowTracks>0),this.afterVerticalScrollBarDivider.setBounds({left:rowAnnotationXStart-2,top:ypos-18}),this.vscroll.setVisible(heatMapHeightj;j++){var d=this.datasetRowView.getValue(j);isNaN(d)||(this.rowCachedMax=d>this.rowCachedMax?d:this.rowCachedMax,this.rowCachedMin=d
"),this.currentValue=null,this.legend=new morpheus.LegendWithStops,this.legend.on("added",function(e){var fractions=that.colorScheme.getFractions();fractions.push(e.fraction);var colors=that.colorScheme.getColors();colors.push("black"),that.colorScheme.setFractions({fractions:fractions,colors:colors}),that.setSelectedIndex(_.indexOf(fractions,e.fraction)),that.fireChanged()}).on("selectedIndex",function(e){that.setSelectedIndex(e.selectedIndex)}).on("delete",function(index){that.deleteSelectedStop()}).on("moved",function(e){var fraction=e.fraction,fractions=that.colorScheme.getFractions();fractions[that.legend.selectedIndex]=fraction,that.colorScheme.setFractions({fractions:fractions,colors:that.colorScheme.getColors()});var newIndex=that.colorScheme.getFractions().indexOf(fraction);-1!==newIndex&&(that.legend.selectedIndex=newIndex);var fractionToValue=d3.scale.linear().domain([0,1]).range([that.colorScheme.getMin(),that.colorScheme.getMax()]).clamp(!0);that.formBuilder.setValue("selected_value",fractionToValue(fractions[that.legend.selectedIndex])),that.fireChanged()});var $row=$("
");$row.css("height","50px").css("width","300px").css("margin-left","auto").css("margin-right","auto"),$row.appendTo(this.$div),this.colorScheme=null,$(this.legend.canvas).appendTo($row);var formBuilder=new morpheus.FormBuilder,items=[];items=items.concat({name:"selected_color",type:"color",col:"col-xs-2"},{name:"selected_value",type:"text",col:"col-xs-4"},[{name:"delete",type:"button",value:"Delete Selected Color Stop"},{name:"add",type:"button",value:"Add Color Stop"}],{name:"minimum",type:"text",col:"col-xs-4"},{name:"maximum",type:"text",col:"col-xs-4"}),options.showRelative&&(items=items.concat({name:"color_scheme",type:"radio",options:["fixed","relative"]})),items=items.concat({name:"missing_color",type:"color",col:"col-xs-2"}),items.push({name:"stepped_colors",type:"checkbox",value:!1,help:"Intervals include left end point and exclude right end point, except for the highest interval"}),_.each(items,function(item){formBuilder.append(item)}),this.$div.append(formBuilder.$form),formBuilder.$form.find("[name^=selected],[name=delete]").prop("disabled",!0),formBuilder.$form.find("[name=add]").on("click",function(e){for(var fractions=that.colorScheme.getFractions(),val=.5;val>=0&&-1!==_.indexOf(fractions,val);)val-=.1;val=Math.max(0,val),fractions.push(val);var colors=that.colorScheme.getColors();colors.push("black"),that.colorScheme.setFractions({fractions:fractions,colors:colors}),that.setSelectedIndex(_.indexOf(fractions,val)),that.fireChanged()}),formBuilder.$form.find("[name=delete]").on("click",function(e){that.deleteSelectedStop()}),formBuilder.$form.on("keyup","[name=selected_value]",_.debounce(function(e){var val=parseFloat($(this).val());isNaN(val)||(that.setSelectedValue(val),that.fireChanged())},100)),formBuilder.$form.on("change","[name=selected_color]",function(e){var colors=that.colorScheme.getColors();colors[that.legend.selectedIndex]=$(this).val(),that.colorScheme.setFractions({fractions:that.colorScheme.getFractions(),colors:colors}),that.fireChanged()}),formBuilder.$form.on("change","[name=missing_color]",function(e){var color=$(this).val();that.colorScheme.setMissingColor(color),that.fireChanged()}),formBuilder.$form.on("change","[name=stepped_colors]",function(e){that.colorScheme.setStepped($(this).prop("checked")),that.fireChanged()}),formBuilder.$form.on("keyup","[name=minimum]",_.debounce(function(e){var val=parseFloat($(this).val());isNaN(val)||(that.colorScheme.setMin(val),that.setSelectedIndex(that.legend.selectedIndex),that.fireChanged())},100)),formBuilder.$form.on("keyup","[name=maximum]",_.debounce(function(e){var val=parseFloat($(this).val());isNaN(val)||(that.colorScheme.setMax(val),that.setSelectedIndex(that.legend.selectedIndex),that.fireChanged())},100)),formBuilder.$form.on("change","[name=color_scheme]",_.throttle(function(e){that.legend.selectedIndex=-1;var val=$(this).val(),scalingMode="relative"===val?morpheus.HeatMapColorScheme.ScalingMode.RELATIVE:morpheus.HeatMapColorScheme.ScalingMode.FIXED;that.colorScheme.setScalingMode(scalingMode),that.setColorScheme(that.colorScheme),that.fireChanged()},100)),this.formBuilder=formBuilder},morpheus.HeatMapColorSchemeChooser.prototype={deleteSelectedStop:function(){var fractions=this.colorScheme.getFractions();fractions.splice(this.legend.selectedIndex,1);var colors=this.colorScheme.getColors();colors.splice(this.legend.selectedIndex,1),this.colorScheme.setFractions({fractions:fractions,colors:colors}),this.formBuilder.$form.find("[name^=selected],[name=delete]").prop("disabled",!0),this.legend.setSelectedIndex(-1),this.fireChanged()},setSelectedValue:function(val){var valueToFraction=d3.scale.linear().domain([this.colorScheme.getMin(),this.colorScheme.getMax()]).range([0,1]).clamp(!0),fractions=this.colorScheme.getFractions();fractions[this.legend.selectedIndex]=valueToFraction(val),this.colorScheme.setFractions({fractions:fractions,colors:this.colorScheme.getColors()})},setSelectedIndex:function(index){var fractions=this.colorScheme.getFractions();index>=fractions.length&&(index=-1),this.legend.setSelectedIndex(index);var formBuilder=this.formBuilder;if(formBuilder.$form.find("[name^=selected],[name=delete]").prop("disabled",-1===this.legend.selectedIndex),-1!==this.legend.selectedIndex){var fractionToValue=d3.scale.linear().domain([0,1]).range([this.colorScheme.getMin(),this.colorScheme.getMax()]).clamp(!0);formBuilder.setValue("selected_value",fractionToValue(fractions[this.legend.selectedIndex]));var context=this.legend.canvas.getContext("2d"),colors=this.colorScheme.getColors();context.fillStyle=colors[this.legend.selectedIndex],formBuilder.setValue("selected_color",context.fillStyle)}else formBuilder.setValue("selected_value","");this.draw()},setMinMax:function(){this.colorScheme.getScalingMode()===morpheus.HeatMapColorScheme.ScalingMode.RELATIVE&&(this.colorScheme.setMin(0),this.colorScheme.setMax(1))},dispose:function(){this.off("change"),this.legend.destroy(),this.formBuilder.$form.off("keyup","input"),this.formBuilder.$form.off("change","[name=color_scheme]")},restoreCurrentValue:function(){this.colorScheme.setCurrentValue&&this.colorScheme.setCurrentValue(this.currentValue)},setCurrentValue:function(value){this.currentValue=value,this.colorScheme.setCurrentValue&&this.colorScheme.setCurrentValue(this.currentValue),this.setColorScheme(this.colorScheme)},setColorScheme:function(colorScheme){this.colorScheme=colorScheme,this.setMinMax(),colorScheme.setCurrentValue&&colorScheme.setCurrentValue(this.currentValue),this.formBuilder.setValue("color_scheme",colorScheme.getScalingMode()===morpheus.HeatMapColorScheme.ScalingMode.RELATIVE?"relative":"fixed"),this.formBuilder.$form.find("[name=minimum],[name=maximum]").prop("disabled",colorScheme.getScalingMode()===morpheus.HeatMapColorScheme.ScalingMode.RELATIVE),this.formBuilder.setValue("minimum",this.colorScheme.getMin()),this.formBuilder.setValue("maximum",this.colorScheme.getMax()),this.formBuilder.setValue("stepped_colors",this.colorScheme.isStepped()),this.formBuilder.setValue("missing_color",this.colorScheme.getMissingColor()),this.draw()},getFractionToStopPix:function(){return d3.scale.linear().clamp(!0).domain([0,1]).range([this.legend.border,this.legend.getUnscaledWidth()-this.legend.border])},fireChanged:function(){this.trigger("change"),this.setColorScheme(this.colorScheme)},draw:function(){var colorScheme=this.colorScheme;colorScheme.getScalingMode()===morpheus.HeatMapColorScheme.ScalingMode.RELATIVE&&(colorScheme.setMin(0),colorScheme.setMax(1));var fractions=colorScheme.getFractions(),colors=colorScheme.getColors(),fractionToStopPix=this.getFractionToStopPix();this.legend.draw(fractions,colors,colorScheme.isStepped(),fractionToStopPix)}},morpheus.Util.extend(morpheus.HeatMapColorSchemeChooser,morpheus.Events),morpheus.HeatMapColorSchemeLegend=function(controller,$keyContent){var totalHeight,colorScheme=controller.heatmap.getColorScheme(),tracks=colorScheme.getColorByValues();$keyContent.empty();var ntracks=tracks.length;tracks.forEach(function(value){if(null!=value||1===ntracks){if("null"!=value){var $label=$(''+value+"");$keyContent.append($label),totalHeight+=$label.height()}var trackLegend=new morpheus.HeatMapColorSchemeLegendTrack(colorScheme,value);$(trackLegend.canvas).css("position",""),trackLegend.repaint(),trackLegend.on("selectionChanged",function(){controller.heatmap.setInvalid(!0),controller.heatmap.repaint()}),$keyContent.append($(trackLegend.canvas)),totalHeight+=trackLegend.getUnscaledHeight()}}),controller.options.$key&&($keyContent.append(controller.options.$key),totalHeight+=controller.options.$key.height());var $edit=$('');$edit.find("[name=options]").on("click",function(e){e.preventDefault(),controller.showOptions(),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"options"})}),totalHeight+=$edit.height(),$keyContent.append($edit),$keyContent.css({"text-overflow":"ellipsis",overflow:"hidden",width:"250px",height:totalHeight+"px"})},morpheus.HeatMapColorSchemeLegendTrack=function(colorScheme,value){morpheus.AbstractCanvas.call(this,!1);var _this=this;this.value=value,this.colorScheme=colorScheme,colorScheme.setCurrentValue(value);var hiddenValues=colorScheme.getHiddenValues(),names=colorScheme.getNames(),hasNames=null!=names,legendHeight=hasNames?14*names.length:30,bounds={width:250,height:legendHeight};this.hasNames=hasNames,this.setBounds(bounds),hasNames&&hiddenValues&&$(this.canvas).on("click",function(e){e.preventDefault(),e.stopPropagation();var clickedRow=Math.floor((e.clientY-_this.canvas.getBoundingClientRect().top)/14),fractionToValue=d3.scale.linear().domain([0,1]).range([colorScheme.getMin(),colorScheme.getMax()]).clamp(!0),fractions=colorScheme.getFractions(),value=fractionToValue(fractions[clickedRow]);hiddenValues.has(value)?hiddenValues.remove(value):hiddenValues.add(value),_this.trigger("selectionChanged"),_this.repaint()})},morpheus.HeatMapColorSchemeLegendTrack.prototype={draw:function(clip,context){var colorScheme=this.colorScheme;colorScheme.setCurrentValue(this.value),context.fillStyle="white",context.fillRect(0,0,this.getUnscaledWidth(),this.getUnscaledHeight()),context.translate(this.hasNames?14:(this.getUnscaledWidth()-200)/2,0),morpheus.HeatMapColorSchemeLegend.drawColorScheme(context,colorScheme,200)}},morpheus.Util.extend(morpheus.HeatMapColorSchemeLegendTrack,morpheus.AbstractCanvas),morpheus.Util.extend(morpheus.HeatMapColorSchemeLegendTrack,morpheus.Events),morpheus.HeatMapColorSchemeLegend.drawColorScheme=function(context,colorScheme,width,printing,hideText){var names=colorScheme.getNames(),hasNames=null!=names;if(hasNames)morpheus.HeatMapColorSchemeLegend.drawColorSchemeVertically(context,colorScheme,colorScheme.getHiddenValues(),printing);else{if(morpheus.HeatMapColorSchemeLegend.draw(context,colorScheme.getFractions(),colorScheme.getColors(),width,12,colorScheme.isStepped()),context.strokeStyle="LightGrey",context.strokeRect(0,0,width,12),hideText)return;var map=d3.scale.linear().domain([0,1]).range([0,width]).clamp(!0),fractionToValue=d3.scale.linear().domain([0,1]).range([colorScheme.getMin(),colorScheme.getMax()]).clamp(!0);if(context.textAlign="center",context.textBaseline="top",context.fillStyle="black",context.font="12px "+morpheus.CanvasUtil.FONT_NAME,colorScheme.getScalingMode()===morpheus.HeatMapColorScheme.ScalingMode.RELATIVE)context.fillText("row min",0,14),context.fillText("row max",width,14);else{for(var fractions=colorScheme.getFractions(),lastTextPixEnd=-1,halfway=parseInt(fractions.length/2),i=0;halfway>i;i++){var pix=map(fractions[i]),text="";text=hasNames?""!=names[i]?names[i]+" ("+fractionToValue(fractions[i])+")":names[i]:morpheus.Util.nf(fractionToValue(fractions[i]));var textWidth=context.measureText(text).width;pix>lastTextPixEnd&&context.fillText(text,pix,14),lastTextPixEnd=pix+textWidth/2}for(var lastTextPixStart=1e4,i=fractions.length-1;i>=halfway;i--){var pix=map(fractions[i]),text="";text=hasNames?""!=names[i]?names[i]+" ("+fractionToValue(fractions[i])+")":names[i]:morpheus.Util.nf(fractionToValue(fractions[i]));var textWidth=context.measureText(text).width;lastTextPixStart>pix&&(context.fillText(text,pix,14),lastTextPixStart=pix-textWidth/2)}}}},morpheus.HeatMapColorSchemeLegend.drawColorSchemeVertically=function(context,colorScheme,hiddenValues,printing){var fractionToValue=d3.scale.linear().domain([0,1]).range([colorScheme.getMin(),colorScheme.getMax()]).clamp(!0);context.textAlign="left",context.textBaseline="top",context.fillStyle="black";var fractions=colorScheme.getFractions(),colors=colorScheme.getColors(),names=colorScheme.getNames();context.strokeStyle="LightGrey";var xpix=0,ypix=0;context.font="12px "+morpheus.CanvasUtil.FONT_NAME;for(var i=0;ii;i++){context.fillStyle=colors[i];var x1=map(fractions[i]),x2=i===length-1?width:map(fractions[i+1]);context.fillRect(Math.min(x1,x2),0,Math.abs(x2-x1),height)}else{for(var gradient=context.createLinearGradient(0,0,width,height),i=0,length=fractions.length;length>i;i++)gradient.addColorStop(fractions[i],colors[i]);context.fillStyle=gradient,context.fillRect(0,0,width,height)}},morpheus.HeatMapColorSchemeLegend.prototype={},morpheus.HeatMapSynchronizer=function(){this.controllers=[]},morpheus.HeatMapSynchronizer.prototype={firing:!1,getProject:function(){return this.controllers[0].getProject()},zoom:function(){this.controllers[0].zoom.apply(this.controllers[0],arguments)},setTrackVisible:function(){this.controllers[0].setTrackVisible.apply(this.controllers[0],arguments)},revalidate:function(){this.controllers[0].revalidate.apply(this.controllers[0],arguments)},add:function(controller){var that=this;this.controllers.push(controller),controller.on("change",function(event){if(!that.firing){var source=event.source,method=event.name;that.firing=!0,_.each(that.controllers,function(c){c!==source&&c[method].apply(c,event.arguments)}),that.firing=!1}})}},morpheus.HeatMapElementCanvas=function(project){morpheus.AbstractCanvas.call(this,!0),this.colorScheme=null,this.project=project,this.dataset=null;var _this=this;this.columnPositions=new morpheus.Positions,this.rowPositions=new morpheus.Positions,this.lastPosition={left:-1,right:-1,top:-1,bottom:-1},project.getElementSelectionModel().on("selectionChanged",function(){_this.repaint()})},morpheus.HeatMapElementCanvas.GRID_COLOR="rgb(128,128,128)",morpheus.HeatMapElementCanvas.prototype={drawGrid:!0,getColorScheme:function(){return this.colorScheme},isDrawGrid:function(){return this.drawGrid},setDrawGrid:function(drawGrid){this.drawGrid=drawGrid},setColorScheme:function(colorScheme){this.colorScheme=colorScheme},setDataset:function(dataset){this.dataset=dataset,this.columnPositions.setLength(this.dataset.getColumnCount()),this.rowPositions.setLength(this.dataset.getRowCount())},getColumnPositions:function(){return this.columnPositions},getRowPositions:function(){return this.rowPositions},getPreferredSize:function(context){var w=Math.ceil(this.columnPositions.getPosition(this.columnPositions.getLength()-1)+this.columnPositions.getItemSize(this.columnPositions.getLength()-1)),h=Math.ceil(this.rowPositions.getPosition(this.rowPositions.getLength()-1)+this.rowPositions.getItemSize(this.rowPositions.getLength()-1));return{width:w,height:h}},prePaint:function(clip,context){var lastPosition=this.lastPosition,columnPositions=this.columnPositions,rowPositions=this.rowPositions,left=morpheus.Positions.getLeft(clip,columnPositions),right=morpheus.Positions.getRight(clip,columnPositions),top=morpheus.Positions.getTop(clip,rowPositions),bottom=morpheus.Positions.getBottom(clip,rowPositions);(this.invalid||left!==lastPosition.left||right!==lastPosition.right||top!==lastPosition.top||bottom!==lastPosition.bottom)&&(lastPosition.right=right,lastPosition.left=left,lastPosition.top=top,lastPosition.bottom=bottom,this.invalid=!0)},postPaint:function(clip,context){morpheus.CanvasUtil.resetTransform(context);var project=this.project;context.strokeStyle="Grey",context.lineWidth=1;var rowPositions=this.getRowPositions(),columnPositions=this.getColumnPositions();if(project.getHoverColumnIndex()>=0||project.getHoverRowIndex()>=0){var height=rowPositions.getItemSize(project.getHoverColumnIndex()),width=columnPositions.getItemSize(project.getHoverColumnIndex()),y=-1===project.getHoverRowIndex()?rowPositions.getPosition(rowPositions.getLength()-1):rowPositions.getPosition(project.getHoverRowIndex()),x=-1===project.getHoverColumnIndex()?columnPositions.getPosition(0):columnPositions.getPosition(project.getHoverColumnIndex());-1!==project.getHoverColumnIndex()&&context.strokeRect(x-clip.x,0,width,this.getUnscaledHeight()),-1!==project.getHoverRowIndex()&&context.strokeRect(0,y-clip.y,this.getUnscaledWidth(),height),-1!==project.getHoverColumnIndex()&&-1!==project.getHoverRowIndex()&&(context.strokeStyle="black",context.lineWidth=3,context.strokeRect(x-clip.x+1.5,y-clip.y+1.5,width-1.5,height-1.5))}var left=morpheus.Positions.getLeft(clip,columnPositions),right=morpheus.Positions.getRight(clip,columnPositions),top=morpheus.Positions.getTop(clip,rowPositions),bottom=morpheus.Positions.getBottom(clip,rowPositions);context.strokeStyle="rgb(182,213,253)",context.lineWidth=3,context.translate(-clip.x,-clip.y);var selectedElements=project.getElementSelectionModel().getViewIndices();null!=selectedElements&&selectedElements.forEach(function(id){var rowIndex=id.getArray()[0],columnIndex=id.getArray()[1];if(rowIndex>=top&&bottom>rowIndex&&columnIndex>=left&&right>columnIndex){var rowSize=rowPositions.getItemSize(rowIndex),py=rowPositions.getPosition(rowIndex),columnSize=columnPositions.getItemSize(columnIndex),px=columnPositions.getPosition(columnIndex);context.strokeRect(px+1.5,py+1.5,columnSize-1.5,rowSize-1.5)}})},setElementDrawCallback:function(elementDrawCallback){this._elementDrawCallback=elementDrawCallback},setDrawCallback:function(drawCallback){this.drawCallback=drawCallback},draw:function(clip,context){var columnPositions=this.columnPositions,rowPositions=this.rowPositions,left=morpheus.Positions.getLeft(clip,columnPositions),right=morpheus.Positions.getRight(clip,columnPositions),top=morpheus.Positions.getTop(clip,rowPositions),bottom=morpheus.Positions.getBottom(clip,rowPositions),dataset=this.dataset; -context.translate(-clip.x,-clip.y);for(var colorScheme=this.colorScheme,drawGrid=this.drawGrid,elementDrawCallback=this._elementDrawCallback,seriesNameToIndex={},i=0;irow;row++)for(var rowSize=rowPositions.getItemSize(row),py=rowPositions.getPosition(row),column=left;right>column;column++){var columnSize=columnPositions.getItemSize(column),px=columnPositions.getPosition(column);if(context.fillStyle=colorScheme.getColor(row,column,dataset.getValue(row,column)),column===left){sizer=colorScheme.getSizer(),sizeBySeriesName=sizer.getSeriesName(),sizeBySeriesIndex=null!=sizeBySeriesName?seriesNameToIndex[sizeBySeriesName]:void 0,conditionSeriesIndices=[],conditions=colorScheme.getConditions().getConditions();for(var ci=0,nconditions=conditions.length;nconditions>ci;ci++)conditionSeriesIndices.push(seriesNameToIndex[conditions[ci].series])}var yoffset=0,cellRowSize=rowSize;if(void 0!==sizeBySeriesIndex){var sizeByValue=dataset.getValue(row,column,sizeBySeriesIndex);if(!isNaN(sizeByValue)){var f=sizer.valueToFraction(sizeByValue),rowDiff=rowSize-rowSize*f;yoffset=rowDiff,cellRowSize-=rowDiff}}if(conditions.length>0){for(var condition=null,ci=0,nconditions=conditions.length;nconditions>ci;ci++){var cond=conditions[ci],condValue=dataset.getValue(row,column,conditionSeriesIndices[ci]);if(!isNaN(condValue)&&cond.accept(condValue)){condition=cond;break}}if(null!==condition){context.fillRect(px,py+yoffset,columnSize,cellRowSize);var x=px+cellRowSize/2,y=py+yoffset+columnSize/2;context.fillStyle=condition.color,morpheus.CanvasUtil.drawShape(context,condition.shape,x,y,Math.min(columnSize,cellRowSize)/4),context.fill()}else context.fillRect(px,py+yoffset,columnSize,cellRowSize)}else context.fillRect(px,py+yoffset,columnSize,cellRowSize);elementDrawCallback&&elementDrawCallback(context,dataset,row,column,px,py,columnSize,rowSize)}if(drawGrid){context.strokeStyle=morpheus.HeatMapElementCanvas.GRID_COLOR,context.lineWidth=.1;for(var row=top;bottom>row;row++)for(var rowSize=rowPositions.getItemSize(row),py=rowPositions.getPosition(row),column=left;right>column;column++){var columnSize=columnPositions.getItemSize(column),px=columnPositions.getPosition(column),grid=drawGrid&&columnSize>10&&rowSize>10;grid&&context.strokeRect(px,py,columnSize,rowSize)}}this.drawCallback&&this.drawCallback({context:context,dataset:dataset,top:top,bottom:bottom,left:left,right:right,rowPositions:rowPositions,columnPositions:columnPositions,project:this.project,clip:clip}),context.lineWidth=1,context.translate(clip.x,clip.y)}},morpheus.Util.extend(morpheus.HeatMapElementCanvas,morpheus.AbstractCanvas),morpheus.HeatMapKeyListener=function(controller){var keydown=function(e){var tagName=e.target.tagName;if("INPUT"!=tagName&&"SELECT"!=tagName&&"TEXTAREA"!=tagName){var found=!1,commandKey=morpheus.Util.IS_MAC?e.metaKey:e.ctrlKey,shiftKey=(e.altKey,e.shiftKey);if(commandKey&&65===e.which){var active=controller.getActiveComponent();if(-1!==active){found=!0;for(var selectionModel=0===active?controller.getProject().getRowSelectionModel():controller.getProject().getColumnSelectionModel(),count=0===active?controller.getProject().getSortedFilteredDataset().getRowCount():controller.getProject().getSortedFilteredDataset().getColumnCount(),indices=new morpheus.Set,i=0;count>i;i++)indices.add(i);selectionModel.setViewIndices(indices,!0),found=!0}}else if(61===e.which||187===e.which||107===e.which)controller.zoom(!0),found=!0;else if(173===e.which||189===e.which||109===e.which)controller.zoom(!1),found=!0;else if(35===e.which)controller.scrollLeft(controller.heatmap.getPreferredSize().width),controller.scrollTop(controller.heatmap.getPreferredSize().height),found=!0;else if(36===e.which)controller.scrollLeft(0),controller.scrollTop(0),found=!0;else if(34===e.which){var pos=controller.scrollTop();controller.scrollTop(pos+controller.heatmap.getUnscaledHeight()-2),found=!0}else if(33===e.which){var pos=controller.scrollTop();controller.scrollTop(pos-controller.heatmap.getUnscaledHeight()+2),found=!0}else 38===e.which?(commandKey?controller.scrollTop(0):controller.scrollTop(controller.scrollTop()-8),found=!0):40===e.which?(commandKey?controller.scrollTop(controller.heatmap.getPreferredSize().height):controller.scrollTop(controller.scrollTop()+8),found=!0):37===e.which?(commandKey?controller.scrollLeft(0):controller.scrollLeft(controller.scrollLeft()-8),found=!0):39===e.which?(commandKey?controller.scrollLeft(controller.heatmap.getPreferredSize().width):controller.scrollLeft(controller.scrollLeft()+8),found=!0):commandKey&&(83===e.which?(shiftKey?morpheus.HeatMap.showTool(new morpheus.SaveDatasetTool,controller):morpheus.HeatMap.showTool(new morpheus.SaveImageTool,controller),found=!0):79===e.which?(morpheus.HeatMap.showTool(new morpheus.OpenFileTool,controller),found=!0):70===e.which?(controller.getToolbarElement().find(e.shiftKey?"[name=searchColumns]":"[name=searchRows]").focus(),found=!0):88===e.which&&(morpheus.HeatMap.showTool(new morpheus.NewHeatMapTool,controller),found=!0));return found?(e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),!1):void 0}},$keyelement=controller.$el;$keyelement.on("keydown",keydown),$keyelement.on("dragover.morpheus dragenter.morpheus",function(e){e.preventDefault(),e.stopPropagation()}).on("drop.morpheus",function(e){if(e.originalEvent.dataTransfer&&e.originalEvent.dataTransfer.files.length){e.preventDefault(),e.stopPropagation();var files=e.originalEvent.dataTransfer.files;morpheus.HeatMap.showTool(new morpheus.OpenFileTool({file:files[0]}),controller)}}),$keyelement.on("paste.morpheus",function(e){var tagName=e.target.tagName;if("INPUT"!=tagName&&"SELECT"!=tagName&&"TEXTAREA"!=tagName){var text=e.originalEvent.clipboardData.getData("text/plain");if(null!=text&&text.length>0){e.preventDefault(),e.stopPropagation();var blob=new Blob([text]),url=window.URL.createObjectURL(blob);morpheus.HeatMap.showTool(new morpheus.OpenFileTool({file:url}),controller)}}}),$keyelement.on("mousewheel",function(e){var scrolly=e.deltaY*e.deltaFactor,scrollx=e.deltaX*e.deltaFactor;e.altKey?controller.zoom(scrolly>0,{rows:!0,columns:!0}):(0!==scrolly&&controller.scrollTop(controller.scrollTop()-scrolly),0!==scrollx&&controller.scrollLeft(controller.scrollLeft()-scrollx)),e.preventDefault(),e.stopPropagation()})},morpheus.HeatMapOptions=function(controller){function createMetadataField(isColumns){var options=[],value={},field={type:"bootstrap-select",name:isColumns?"column_annotations":"row_annotations",multiple:!0,value:value,options:options,toggle:!0};return _.each(controller.getVisibleTrackNames(isColumns),function(name){value[name]=!0}),_.each(morpheus.MetadataUtil.getMetadataNames(isColumns?controller.getProject().getFullDataset().getColumnMetadata():controller.getProject().getFullDataset().getRowMetadata()),function(name){options.push(name)}),field}function annotationsListener($select,isColumns){var names=[];_.each(controller.getVisibleTrackNames(isColumns),function(name){names.push(name)});var values=$select.val(),selectedNow=_.difference(values,names),unselectedNow=_.difference(names,values),tracks=[];_.each(selectedNow,function(name){tracks.push({name:name,isColumns:isColumns,visible:!0})}),_.each(unselectedNow,function(name){tracks.push({name:name,isColumns:isColumns,visible:!1})}),controller.setTrackVisibility(tracks),colorSchemeChooser.restoreCurrentValue()}var items=[{name:"color_by",required:!0,type:"select",options:["(None)"].concat(morpheus.MetadataUtil.getMetadataNames(controller.getProject().getFullDataset().getRowMetadata())),value:controller.heatmap.getColorScheme().getSeparateColorSchemeForRowMetadataField()},{name:"color_by_value",required:!0,type:"select",options:[]},{name:"load_predefined_scheme",required:!0,type:"select",options:[{name:"",value:""},{name:"relative",value:"gene"},{name:"binary",value:"binary"},{name:"MAF",value:"MAF"},{name:"fixed (-1.5, -0.1, 0.1, 1.5)",value:"cn"},{name:"fixed (-90, -80, 80, 90)",value:"100scale2"},{name:"fixed (-90, 90)",value:"100scale1"}]},{name:"save_color_scheme",type:"button"},{name:"load_color_scheme",type:"file"}];controller.getProject().getFullDataset().getSeriesCount()>1&&(items.push({name:"size_by",required:!0,type:"select",options:["(None)"].concat(morpheus.DatasetUtil.getSeriesNames(controller.getProject().getFullDataset()))}),items.push({name:"size_by_minimum",title:"Size by minimum",required:!0,type:"text",col:"col-xs-4"}),items.push({name:"size_by_maximum",title:"Size by maximum",required:!0,type:"text",col:"col-xs-4"}),items.push({name:"conditional_rendering",required:!0,type:"button",col:"col-xs-4"}));var displayItems=[{name:"show_grid",required:!0,type:"checkbox",value:controller.heatmap.isDrawGrid()},{name:"row_size",required:!0,type:"text",col:"col-xs-4",value:morpheus.Util.nf(controller.heatmap.getRowPositions().getSize())},{name:"column_size",required:!0,type:"text",col:"col-xs-4",value:morpheus.Util.nf(controller.heatmap.getColumnPositions().getSize())}];controller.rowDendrogram&&displayItems.push({name:"row_dendrogram_line_thickness",required:!0,type:"text",col:"col-xs-4",value:morpheus.Util.nf(controller.rowDendrogram?controller.rowDendrogram.lineWidth:1)}),controller.columnDendrogram&&displayItems.push({name:"column_dendrogram_line_thickness",required:!0,type:"text",col:"col-xs-4",value:morpheus.Util.nf(controller.columnDendrogram?controller.columnDendrogram.lineWidth:1)}),displayItems.push({name:"info_window",required:!0,type:"select",col:"col-xs-4",options:[{name:"Fixed To Top",value:0},{name:"New Window",value:1}],value:controller.tooltipMode}),displayItems.push({name:"inline_tooltip",required:!0,type:"checkbox",value:controller.options.inlineTooltip});var colorSchemeFormBuilder=new morpheus.FormBuilder;_.each(items,function(item){colorSchemeFormBuilder.append(item)});var displayFormBuilder=new morpheus.FormBuilder;_.each(displayItems,function(item){displayFormBuilder.append(item)});var colorSchemeChooser=new morpheus.HeatMapColorSchemeChooser({showRelative:!0});colorSchemeChooser.on("change",function(){controller.heatmap.getColorScheme().getSizer&&null!=controller.heatmap.getColorScheme().getSizer()&&(colorSchemeFormBuilder.setValue("size_by",controller.heatmap.getColorScheme().getSizer().getSeriesName()),colorSchemeFormBuilder.setEnabled("size_by_minimum",null!=controller.heatmap.getColorScheme().getSizer().getSeriesName()),colorSchemeFormBuilder.setEnabled("size_by_maximum",null!=controller.heatmap.getColorScheme().getSizer().getSeriesName()),colorSchemeFormBuilder.setValue("size_by_minimum",controller.heatmap.getColorScheme().getSizer().getMin()),colorSchemeFormBuilder.setValue("size_by_maximum",controller.heatmap.getColorScheme().getSizer().getMax())),controller.heatmap.setInvalid(!0),controller.heatmap.repaint(),colorSchemeChooser.restoreCurrentValue()});var annotationsBuilder=new morpheus.FormBuilder;annotationsBuilder.append(createMetadataField(!1)),annotationsBuilder.append(createMetadataField(!0));var $ca=annotationsBuilder.$form.find("[name=column_annotations]");$ca.on("change",function(e){annotationsListener($(this),!0)});var $ra=annotationsBuilder.$form.find("[name=row_annotations]");$ra.on("change",function(e){annotationsListener($(this),!1)});var annotationOptionsTabId=_.uniqueId("morpheus"),heatMapOptionsTabId=_.uniqueId("morpheus"),displayOptionsTabId=_.uniqueId("morpheus"),$metadataDiv=$('
');$metadataDiv.append($(annotationsBuilder.$form));var $heatMapDiv=$('
');$heatMapDiv.append(colorSchemeChooser.$div),$heatMapDiv.append($(colorSchemeFormBuilder.$form));var $displayDiv=$('
');$displayDiv.append($(displayFormBuilder.$form)),displayFormBuilder.$form.find("[name=show_grid]").on("click",function(e){var grid=$(this).prop("checked");controller.heatmap.setDrawGrid(grid),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()}),displayFormBuilder.$form.find("[name=inline_tooltip]").on("click",function(e){controller.options.inlineTooltip=$(this).prop("checked")}),displayFormBuilder.$form.find("[name=row_size]").on("keyup",_.debounce(function(e){controller.heatmap.getRowPositions().setSize(parseFloat($(this).val())),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()},100)),displayFormBuilder.$form.find("[name=info_window]").on("change",function(e){controller.setTooltipMode(parseInt($(this).val()))});var $colorByValue=colorSchemeFormBuilder.$form.find("[name=color_by_value]"),separateSchemesField=controller.heatmap.getColorScheme().getSeparateColorSchemeForRowMetadataField();null!=separateSchemesField&&$colorByValue.html(morpheus.Util.createOptions(morpheus.VectorUtil.createValueToIndexMap(controller.project.getFullDataset().getRowMetadata().getByName(separateSchemesField)).keys())),colorSchemeChooser.setColorScheme(controller.heatmap.getColorScheme()),null!=separateSchemesField&&colorSchemeChooser.setCurrentValue($colorByValue.val()),controller.heatmap.getColorScheme().getSizer&&null!=controller.heatmap.getColorScheme().getSizer()&&controller.heatmap.getColorScheme().getSizer().getSeriesName()&&colorSchemeFormBuilder.setValue("size_by",controller.heatmap.getColorScheme().getSizer().getSeriesName()),colorSchemeFormBuilder.$form.find("[name=size_by]").on("change",function(e){var series=$(this).val();"(None)"==series&&(series=null),colorSchemeChooser.colorScheme.getSizer().setSeriesName(series),colorSchemeChooser.fireChanged()}),colorSchemeFormBuilder.$form.find("[name=size_by_minimum]").on("keyup",_.debounce(function(e){colorSchemeChooser.colorScheme.getSizer().setMax(parseFloat($(this).val())),colorSchemeChooser.fireChanged()},100)),colorSchemeFormBuilder.$form.find("[name=conditional_rendering]").on("click",function(e){e.preventDefault();var conditionalRenderingUI=new morpheus.ConditionalRenderingUI(controller);morpheus.FormBuilder.showInModal({title:"Conditional Rendering",html:conditionalRenderingUI.$div,close:"Close",z:1051,callback:function(){}})}),colorSchemeFormBuilder.$form.find("[name=size_by_maximum]").on("keyup",_.debounce(function(e){colorSchemeChooser.colorScheme.getSizer().setMax(parseFloat($(this).val())),colorSchemeChooser.fireChanged()},100)),colorSchemeFormBuilder.find("save_color_scheme").on("click",function(e){e.preventDefault();var blob=new Blob([controller.heatmap.getColorScheme().toJson()],{type:"application/json"});saveAs(blob,"color_scheme.json")}),colorSchemeFormBuilder.on("change",function(e){"load_color_scheme"===e.name&&""!==e.value&&null!=e.value&&morpheus.Util.getText(e.value).done(function(text){var json=JSON.parse($.trim(text));controller.heatmap.getColorScheme().fromJson(json),colorSchemeChooser.setColorScheme(controller.heatmap.getColorScheme()),controller.heatmap.setInvalid(!0),controller.heatmap.repaint()}).fail(function(){morpheus.FormBuilder.showInModal({title:"Error",html:"Unable to read saved color scheme."})})}),colorSchemeFormBuilder.$form.on("change","[name=load_predefined_scheme]",function(e){var val=$(this).val();""!==val?("gene"===val?controller.heatmap.getColorScheme().setColorSupplierForCurrentValue(morpheus.HeatMapColorScheme.createColorSupplier(morpheus.HeatMapColorScheme.Predefined.RELATIVE())):"cn"===val?controller.heatmap.getColorScheme().setColorSupplierForCurrentValue(morpheus.HeatMapColorScheme.createColorSupplier(morpheus.HeatMapColorScheme.Predefined.CN())):"MAF"===val?controller.heatmap.getColorScheme().setColorSupplierForCurrentValue(morpheus.HeatMapColorScheme.createColorSupplier(morpheus.HeatMapColorScheme.Predefined.MAF())):"binary"===val?controller.heatmap.getColorScheme().setColorSupplierForCurrentValue(morpheus.HeatMapColorScheme.createColorSupplier(morpheus.HeatMapColorScheme.Predefined.BINARY())):"100scale1"===val?controller.heatmap.getColorScheme().setColorSupplierForCurrentValue(morpheus.HeatMapColorScheme.createColorSupplier(morpheus.HeatMapColorScheme.Predefined.SUMMLY())):"100scale2"===val?controller.heatmap.getColorScheme().setColorSupplierForCurrentValue(morpheus.HeatMapColorScheme.createColorSupplier(morpheus.HeatMapColorScheme.Predefined.SUMMLY2())):console.log("not found"),colorSchemeChooser.setColorScheme(controller.heatmap.getColorScheme()),controller.heatmap.setInvalid(!0),controller.heatmap.repaint(),$(this).val("")):console.log("empty option selected"),colorSchemeChooser.restoreCurrentValue()}),colorSchemeFormBuilder.$form.find("[name=color_by]").on("change",function(e){var colorByField=$(this).val();"(None)"==colorByField&&(colorByField=null),controller.heatmap.getColorScheme().setSeparateColorSchemeForRowMetadataField(colorByField),null!=colorByField&&$colorByValue.html(morpheus.Util.createOptions(morpheus.VectorUtil.createValueToIndexMap(controller.project.getFullDataset().getRowMetadata().getByName(colorByField)).keys()));var colorByValue=$colorByValue.val();controller.heatmap.getColorScheme().setCurrentValue(colorByValue),colorSchemeChooser.setCurrentValue(colorByValue),controller.heatmap.setInvalid(!0),controller.heatmap.repaint(),colorSchemeChooser.setColorScheme(controller.heatmap.getColorScheme())}),$colorByValue.on("change",function(e){null==controller.heatmap.getColorScheme().getSeparateColorSchemeForRowMetadataField()?(colorSchemeChooser.setCurrentValue(null),controller.heatmap.getColorScheme().setCurrentValue(null),colorSchemeChooser.setColorScheme(controller.heatmap.getColorScheme())):(colorSchemeChooser.setCurrentValue($colorByValue.val()),colorSchemeChooser.setColorScheme(controller.heatmap.getColorScheme()))}),displayFormBuilder.$form.find("[name=column_size]").on("keyup",_.debounce(function(e){controller.heatmap.getColumnPositions().setSize(parseFloat($(this).val())),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()},100)),displayFormBuilder.$form.find("[name=gap_size]").on("keyup",_.debounce(function(e){controller.gapSize=parseFloat($(this).val()),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()},100)),displayFormBuilder.$form.find("[name=squish_factor]").on("keyup",_.debounce(function(e){var f=parseFloat($(this).val());controller.heatmap.getColumnPositions().setSquishFactor(f),controller.heatmap.getRowPositions().setSquishFactor(f),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()},100)),displayFormBuilder.$form.find("[name=row_dendrogram_line_thickness]").on("keyup",_.debounce(function(e){controller.rowDendrogram.lineWidth=parseFloat($(this).val()),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()},100)),displayFormBuilder.$form.find("[name=column_dendrogram_line_thickness]").on("keyup",_.debounce(function(e){controller.columnDendrogram.lineWidth=parseFloat($(this).val()),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()},100));var $tab=$('
');$metadataDiv.appendTo($tab),$heatMapDiv.appendTo($tab),$displayDiv.appendTo($tab);var $div=$("
"),$ul=$('');$ul.appendTo($div),$tab.appendTo($div),$ul.find("[role=tab]:eq(1)").tab("show"),morpheus.FormBuilder.showInModal({title:"Options",html:$div,close:"Close",callback:function(){$div.find("input").off("keyup"),$ca.off("change"),$ra.off("change"),$div.remove(),colorSchemeChooser.dispose()}})},morpheus.HeatMapToolBar=function(controller){this.controller=controller,this.rowSearchResultModelIndices=[],this.columnSearchResultModelIndices=[];var _this=this,$el=$('
'),searchHtml=[],$search=$('');if($search.on("submit",function(e){e.preventDefault()}),controller.options.toolbar.searchRows&&(searchHtml.push('
'),searchHtml.push('
'),searchHtml.push('
'),searchHtml.push(''),searchHtml.push('"),searchHtml.push("
"),searchHtml.push(''),searchHtml.push("
"),searchHtml.push('
'),searchHtml.push(''),searchHtml.push('
'),searchHtml.push(''),searchHtml.push(''),searchHtml.push(''),searchHtml.push("
"),searchHtml.push("
")),controller.options.toolbar.searchColumns&&(searchHtml.push('
'),searchHtml.push('
'),searchHtml.push('
'),searchHtml.push('
'),searchHtml.push(''),searchHtml.push('"),searchHtml.push("
"),searchHtml.push('
'),searchHtml.push("
"),searchHtml.push('
'),searchHtml.push('
'),searchHtml.push(''),searchHtml.push(''),searchHtml.push(''),searchHtml.push(''),searchHtml.push(""),searchHtml.push("
")),searchHtml.push('
'),searchHtml.push('
Values
'),searchHtml.push("
"),searchHtml.push('
'),searchHtml.push('
'),searchHtml.push("
"),searchHtml.push('"),searchHtml.push('"),searchHtml.push('
'),searchHtml.push('
'),searchHtml.push('
'),searchHtml.push("
"),searchHtml.push('
'),searchHtml.push("
"),$(searchHtml.join("")).appendTo($search),controller.options.toolbar.searchValues||$search.find("[name=searchValuesDiv]").css("display","none"),controller.options.tour){var $tour=$('');$tour.prependTo($search.find("[name=right]")),$tour.on("click",function(e){e.preventDefault(),controller.options.tour(controller)})}controller.options.$help&&controller.options.$help.appendTo($search.find("[name=right]"));var $tools=$('
');$tools.on("submit",function(e){e.preventDefault()});var $toolbarForm=$('
');$toolbarForm.on("submit",function(e){e.preventDefault()});var toolbarHtml=[];controller.options.toolbar.zoom&&(toolbarHtml.push('
'),toolbarHtml.push(''),toolbarHtml.push(''),toolbarHtml.push(''),toolbarHtml.push('')),toolbarHtml.push('
'),controller.options.toolbar.sort&&toolbarHtml.push(''),controller.options.toolbar.options&&toolbarHtml.push(''),toolbarHtml.push('
'),controller.options.toolbar.saveImage&&toolbarHtml.push(''),controller.options.toolbar.saveDataset&&toolbarHtml.push(''),controller.options.toolbar.openFile&&toolbarHtml.push(''),toolbarHtml.push('
'),controller.options.toolbar.filter&&toolbarHtml.push(''),"undefined"!=typeof Plotly&&toolbarHtml.push('');var tools=[{tool:new morpheus.HClusterTool},{tool:new morpheus.MarkerSelection},{tool:new morpheus.NearestNeighbors},{tool:new morpheus.NewHeatMapTool},null,{tool:new morpheus.AdjustDataTool},{tool:new morpheus.CollapseDatasetTool},{tool:new morpheus.CreateAnnotation},{tool:new morpheus.SimilarityMatrixTool},{tool:new morpheus.TransposeTool},{tool:new morpheus.WordCloudTool}];if(this.getToolByName=function(name){for(var i=0;i'),toolbarHtml.push(''),toolbarHtml.push('
")}toolbarHtml.push('
'),controller.options.toolbar.colorKey&&(toolbarHtml.push('
'),toolbarHtml.push(''),toolbarHtml.push('"),toolbarHtml.push("
")),toolbarHtml.push('
'),toolbarHtml.push("
"),$search.appendTo($el.find("[name=toolbarSearch]")),$(toolbarHtml.join("")).appendTo($toolbarForm),$toolbarForm.appendTo($el.find("[name=toolbarButtons]")),$el.prependTo(controller.$el);var $tools=$el.find("[name=tools]");this.$tip=$el.find("[name=tip]"),$tools.on("click","li > a",function(e){e.preventDefault();var index=parseInt($(this).attr("name"));tools[index].tool?morpheus.HeatMap.showTool(tools[index].tool,controller):tools[index].action()}),this.defaultRowMatchMode="contains",this.defaultColumnMatchMode="contains";var $rowSearchOptions=$el.find("[name=rowSearchOptions]");$rowSearchOptions.on("click","li > a",function(e){e.preventDefault(), -_this.defaultRowMatchMode=$(this).attr("name"),$rowSearchOptions.find("li").removeClass("active"),$(this).parent("li").addClass("active"),_this.search(!0),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"rowSearchMatchMode"})});var $columnSearchOptions=$el.find("[name=columnSearchOptions]");$columnSearchOptions.on("click","li > a",function(e){e.preventDefault(),_this.defaultColumnMatchMode=$(this).attr("name"),$columnSearchOptions.find("li").removeClass("active"),$(this).parent("li").addClass("active"),_this.search(!1),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"columnSearchMatchMode"})});var filterModal=[],filterLabelId=_.uniqueId("morpheus");filterModal.push('");var $filterModal=$(filterModal.join(""));$filterModal.on("mousewheel",function(e){e.stopPropagation()});var $filter=$("
");$filter.appendTo($filterModal.find(".modal-body")),$filterModal.appendTo($el);var filterHtml=[];filterHtml.push('
'),filterHtml.push('
');var $filterChooser=$(filterHtml.join(""));$filterChooser.appendTo($filter);var columnFilterUI=new morpheus.FilterUI(controller.getProject(),!0),rowFilterUI=new morpheus.FilterUI(controller.getProject(),!1);controller.getProject().getRowFilter().on("focus",function(e){$filterChooser.find("[value=rows]").prop("checked",!0),columnFilterUI.$div.hide(),rowFilterUI.$div.show(),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"rowFilter"})}),controller.getProject().getColumnFilter().on("focus",function(e){$filterChooser.find("[value=columns]").prop("checked",!0),columnFilterUI.$div.show(),rowFilterUI.$div.hide(),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"columnFilter"})}),rowFilterUI.$div.appendTo($filter),columnFilterUI.$div.appendTo($filter),columnFilterUI.$div.css("display","none");var $filterRadio=$filterChooser.find("[name=rowsOrColumns]");$filterRadio.on("change",function(e){var val=$filterRadio.filter(":checked").val();"columns"===val?(columnFilterUI.$div.show(),rowFilterUI.$div.hide()):(columnFilterUI.$div.hide(),rowFilterUI.$div.show()),e.preventDefault()}),$el.find("[name=filterButton]").on("click",function(){$filterModal.modal("show"),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"filter"})}),$el.find('[data-toggle="tooltip"]').tooltip({placement:"bottom",container:"body",trigger:"hover"}).on("click",function(){$(this).tooltip("hide")});var $key=$el.find("[name=key]"),$keyContent=$el.find("[name=keyContent]");$key.dropdown().parent().on("show.bs.dropdown",function(){new morpheus.HeatMapColorSchemeLegend(controller,$keyContent),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"colorKey"})}),$el.find("[name=openFile]").on("click",function(){morpheus.HeatMap.showTool(new morpheus.OpenFileTool({customUrls:controller._customUrls}),controller)}),$el.find("[name=saveImage]").on("click",function(){morpheus.HeatMap.showTool(new morpheus.SaveImageTool,controller)}),$el.find("[name=saveDataset]").on("click",function(){morpheus.HeatMap.showTool(new morpheus.SaveDatasetTool,controller)}),$el.find("[name=chart]").on("click",function(){new morpheus.ChartTool2({project:controller.getProject(),getVisibleTrackNames:_.bind(controller.getVisibleTrackNames,controller)}),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"chart"})});var _this=this;$el.find("[name=tutorial]").on("click",function(){window.open("http://www.broadinstitute.org/cancer/software/morpheus/tutorial.html"),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"tutorial"})}),this.$previousColumnMatch=$el.find("[name=previousColumnMatch]"),this.$nextColumnMatch=$el.find("[name=nextColumnMatch]"),this.$previousRowMatch=$el.find("[name=previousRowMatch]"),this.$nextRowMatch=$el.find("[name=nextRowMatch]"),this.$dimensionsLabel=$el.find("[name=dim]"),this.$columnTextField=$el.find("[name=searchColumns]"),this.$valueTextField=$el.find("[name=searchValues]"),this.$selectionLabel=$el.find("[name=selection]"),this.$rowTextField=$el.find("[name=searchRows]"),this.$columnMatchesToTop=$el.find("[name=columnMatchesToTop]"),this.$rowMatchesToTop=$el.find("[name=rowMatchesToTop]"),this.$rowSearchDiv=$el.find("[name=rowSearchDiv]"),this.$columnSearchDiv=$el.find("[name=columnSearchDiv]"),this.$searchRowDendrogramWrapper=$el.find("[name=searchRowDendrogramWrapper]"),this.$searchRowDendrogram=$el.find("[name=searchRowDendrogram]"),this.$searchResultsRowDendrogram=$el.find("[name=searchResultsRowDendrogram]"),this.$searchColumnDendrogramWrapper=$el.find("[name=searchColumnDendrogramWrapper]"),this.$searchColumnDendrogram=$el.find("[name=searchColumnDendrogram]"),this.$searchResultsColumnDendrogram=$el.find("[name=searchResultsColumnDendrogram]"),controller.on("dendrogramAnnotated",function(e){(e.isColumns?_this.$searchColumnDendrogramWrapper:_this.$searchRowDendrogramWrapper).show()}),controller.on("dendrogramChanged",function(e){(e.isColumns?_this.$searchColumnDendrogramWrapper:_this.$searchRowDendrogramWrapper).hide()});var project=controller.getProject();morpheus.Util.autosuggest({$el:this.$rowTextField,filter:function(terms,cb){var indices=[],meta=project.getSortedFilteredDataset().getRowMetadata();controller.getVisibleTrackNames(!1).forEach(function(name){indices.push(morpheus.MetadataUtil.indexOf(meta,name))}),meta=new morpheus.MetadataModelColumnView(meta,indices),morpheus.MetadataUtil.autocomplete(meta)(terms,cb)},select:function(){_this.search(!0)}}),this.$rowTextField.on("keyup",_.debounce(function(e){13===e.which&&e.preventDefault(),_this.search(!0),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"searchRows"})},500)),morpheus.Util.autosuggest({$el:this.$columnTextField,filter:function(terms,cb){var indices=[],meta=project.getSortedFilteredDataset().getColumnMetadata();controller.getVisibleTrackNames(!0).forEach(function(name){indices.push(morpheus.MetadataUtil.indexOf(meta,name))}),meta=new morpheus.MetadataModelColumnView(meta,indices),morpheus.MetadataUtil.autocomplete(meta)(terms,cb)},select:function(){_this.search(!1)}}),this.$columnTextField.on("keyup",_.debounce(function(e){13===e.which&&e.preventDefault(),_this.search(!1),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"searchColumns"})},500)),this.$searchRowDendrogram.on("keyup",_.debounce(function(e){13===e.which&&e.preventDefault(),_this.searchDendrogram(!1),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"searchRowDendrogram"})},500)),this.$searchColumnDendrogram.on("keyup",_.debounce(function(e){13===e.which&&e.preventDefault(),_this.searchDendrogram(!0),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"searchColumnDendrogram"})},500)),morpheus.Util.autocomplete(this.$valueTextField,function(term,cb){var values=new morpheus.Set;morpheus.DatasetUtil.searchValues(project.getSortedFilteredDataset(),$.trim(_this.$valueTextField.val()),function(value,i,j){return values.add(value),3===values.size()?!1:void 0}),cb(values.values().map(function(val){return{value:val}}))},function(){}),this.$valueTextField.on("keyup",_.debounce(function(e){13===e.which&&(_this.$valueTextField.autocomplete("close"),e.preventDefault());var $searchResultsLabel=_this.$el.find("[name=searchResultsValues]"),text=$.trim(_this.$valueTextField.val());if(""===text)$searchResultsLabel.html(""),project.getElementSelectionModel().setViewIndices(null);else{var viewIndices=new morpheus.Set;morpheus.DatasetUtil.searchValues(project.getSortedFilteredDataset(),text,function(value,i,j){viewIndices.add(new morpheus.Identifier([i,j]))}),project.getElementSelectionModel().setViewIndices(viewIndices),$searchResultsLabel.html(viewIndices.size()+" match"+(1===viewIndices.size()?"":"es"))}},500)),$toolbarForm.on("submit",function(e){e.preventDefault()}),$toolbarForm.on("click","[name=in]",function(e){e.preventDefault(),controller.zoom(!0),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"zoomIn"})}),$toolbarForm.on("click","[name=out]",function(e){e.preventDefault(),controller.zoom(!1),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"zoomOut"})}),$toolbarForm.on("click","[name=options]",function(e){e.preventDefault(),controller.showOptions(),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"options"})}),$toolbarForm.on("click","[name=sort]",function(e){e.preventDefault(),new morpheus.SortDialog(project),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"sort"})}),$toolbarForm.on("click","[name=fit]",function(e){e.preventDefault(),controller.fitToWindow(!0),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"fit"})}),$toolbarForm.on("click","[name=resetZoom]",function(e){e.preventDefault(),controller.resetZoom(),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"resetZoom"})}),this.$el=$el;var updateFilterStatus=function(){controller.getProject().getRowFilter().isEnabled()||controller.getProject().getColumnFilter().isEnabled()?_this.$el.find("[name=filterButton]").addClass("btn-primary"):_this.$el.find("[name=filterButton]").removeClass("btn-primary")};updateFilterStatus(),this.$columnMatchesToTop.on("click",function(e){e.preventDefault();var $this=$(this);$this.toggleClass("btn-primary");var sortKeys=project.getColumnSortKeys();if(sortKeys=sortKeys.filter(function(key){return key instanceof morpheus.SpecifiedModelSortOrder&&"dendrogram"===key.name}),$this.hasClass("btn-primary")){var key=new morpheus.MatchesOnTopSortKey(project,_this.columnSearchResultModelIndices,"matches on top");sortKeys.splice(0,0,key),controller.scrollLeft(0)}_this.searching=!0,project.setColumnSortKeys(sortKeys,!0),_this._updateSearchIndices(!0),_this.searching=!1,morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"columnMatchesToTop"})}),this.$rowMatchesToTop.on("click",function(e){e.preventDefault();var $this=$(this);$this.toggleClass("btn-primary");var sortKeys=project.getRowSortKeys();if(sortKeys=sortKeys.filter(function(key){return key instanceof morpheus.SpecifiedModelSortOrder&&"dendrogram"===key.name}),$this.hasClass("btn-primary")){var key=new morpheus.MatchesOnTopSortKey(project,_this.rowSearchResultModelIndices,"matches on top");sortKeys.splice(0,0,key),controller.scrollTop(0)}_this.searching=!0,project.setRowSortKeys(sortKeys,!0),_this._updateSearchIndices(!1),_this.searching=!1,morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"rowMatchesToTop"})}),project.on("rowSortOrderChanged.morpheus",function(e){_this.searching||(_this._updateSearchIndices(!1),_this.$rowMatchesToTop.removeClass("btn-primary"))}),project.on("columnSortOrderChanged.morpheus",function(e){_this.searching||(_this._updateSearchIndices(!0),_this.$columnMatchesToTop.removeClass("btn-primary"))}),controller.getProject().on("rowFilterChanged.morpheus",function(e){_this.search(!0),updateFilterStatus()}),controller.getProject().on("columnFilterChanged.morpheus",function(e){_this.search(!1),updateFilterStatus()}),controller.getProject().on("datasetChanged.morpheus",function(){_this.search(!0),_this.search(!1),updateFilterStatus()}),controller.getProject().getRowSelectionModel().on("selectionChanged.morpheus",function(){_this.updateSelectionLabel()}),controller.getProject().getColumnSelectionModel().on("selectionChanged.morpheus",function(){_this.updateSelectionLabel()}),this.rowSearchResultViewIndicesSorted=null,this.currentRowSearchIndex=0,this.columnSearchResultViewIndicesSorted=null,this.currentColumnSearchIndex=-1,this.$previousColumnMatch.on("click",function(){_this.currentColumnSearchIndex--,_this.currentColumnSearchIndex<0&&(_this.currentColumnSearchIndex=_this.columnSearchResultViewIndicesSorted.length-1),controller.scrollLeft(controller.getHeatMapElementComponent().getColumnPositions().getPosition(_this.columnSearchResultViewIndicesSorted[_this.currentColumnSearchIndex])),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"previousColumnMatch"})}),this.$previousRowMatch.on("click",function(){_this.currentRowSearchIndex--,_this.currentRowSearchIndex<0&&(_this.currentRowSearchIndex=_this.rowSearchResultViewIndicesSorted.length-1),controller.scrollTop(controller.getHeatMapElementComponent().getRowPositions().getPosition(_this.rowSearchResultViewIndicesSorted[_this.currentRowSearchIndex])),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"previousRowMatch"})}),this.$nextColumnMatch.on("click",function(){_this.next(!0),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"nextColumnMatch"})}),this.$nextRowMatch.on("click",function(){_this.next(!1),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"nextRowMatch"})}),this.updateDimensionsLabel(),this.updateSelectionLabel()},morpheus.HeatMapToolBar.HIGHLIGHT_SEARCH_MODE=0,morpheus.HeatMapToolBar.FILTER_SEARCH_MODE=1,morpheus.HeatMapToolBar.MATCHES_TO_TOP_SEARCH_MODE=2,morpheus.HeatMapToolBar.SELECT_MATCHES_SEARCH_MODE=3,morpheus.HeatMapToolBar.prototype={quickColumnFilter:!1,searching:!1,rowSearchMode:morpheus.HeatMapToolBar.SELECT_MATCHES_SEARCH_MODE,columnSearchMode:morpheus.HeatMapToolBar.SELECT_MATCHES_SEARCH_MODE,_updateSearchIndices:function(isColumns){var project=this.controller.getProject();if(isColumns){for(var viewIndices=[],modelIndices=this.columnSearchResultModelIndices,i=0,length=modelIndices.length;length>i;i++){var index=project.convertModelColumnIndexToView(modelIndices[i]);-1!==index&&viewIndices.push(index)}viewIndices.sort(function(a,b){return b>a?-1:1}),this.columnSearchResultViewIndicesSorted=viewIndices,this.currentColumnSearchIndex=-1}else{for(var viewIndices=[],modelIndices=this.rowSearchResultModelIndices,i=0,length=modelIndices.length;length>i;i++){var index=project.convertModelRowIndexToView(modelIndices[i]);-1!==index&&viewIndices.push(index)}viewIndices.sort(function(a,b){return b>a?-1:1}),this.rowSearchResultViewIndicesSorted=viewIndices,this.currentRowSearchIndex=-1}},next:function(isColumns){var controller=this.controller;isColumns?(this.currentColumnSearchIndex++,this.currentColumnSearchIndex>=this.columnSearchResultViewIndicesSorted.length&&(this.currentColumnSearchIndex=0),controller.scrollLeft(controller.getHeatMapElementComponent().getColumnPositions().getPosition(this.columnSearchResultViewIndicesSorted[this.currentColumnSearchIndex]))):(this.currentRowSearchIndex++,this.currentRowSearchIndex>=this.rowSearchResultViewIndicesSorted.length&&(this.currentRowSearchIndex=0),controller.scrollTop(controller.getHeatMapElementComponent().getRowPositions().getPosition(this.rowSearchResultViewIndicesSorted[this.currentRowSearchIndex])))},setSearchText:function(options){var $tf=options.isColumns?this.$columnTextField:this.$rowTextField,existing=options.append?$.trim($tf.val()):"";""!==existing&&(existing+=" "),options.onTop&&(options.isColumns?this.$columnMatchesToTop.addClass("btn-primary"):this.$rowMatchesToTop.addClass("btn-primary")),$tf.val(existing+options.text),this.search(!options.isColumns),options.scrollTo&&this.next(options.isColumns)},updateDimensionsLabel:function(){var p=this.controller.getProject(),d=p.getFullDataset(),f=p.getSortedFilteredDataset(),text="showing "+morpheus.Util.intFormat(f.getRowCount())+" of "+morpheus.Util.intFormat(d.getRowCount())+" rows, "+morpheus.Util.intFormat(f.getColumnCount())+" of "+morpheus.Util.intFormat(d.getColumnCount())+" columns";this.$dimensionsLabel.html(text)},updateSelectionLabel:function(){var nc=this.controller.getProject().getColumnSelectionModel().count(),nr=this.controller.getProject().getRowSelectionModel().count(),text=[];text.push(morpheus.Util.intFormat(nr)+" row"),1!==nr&&text.push("s"),text.push(" selected, "),text.push(morpheus.Util.intFormat(nc)+" column"),1!==nc&&text.push("s"),text.push(" selected"),this.$selectionLabel.html(text.join(""))},searchDendrogram:function(isColumns){var text=$.trim(isColumns?this.$searchColumnDendrogram.val():this.$searchRowDendrogram.val()),dendrogram=isColumns?this.controller.columnDendrogram:this.controller.rowDendrogram,$searchResults=isColumns?this.$searchResultsColumnDendrogram:this.$searchResultsRowDendrogram,matches=morpheus.AbstractDendrogram.search(dendrogram.tree.rootNode,text);if(-1===matches?$searchResults.html(""):$searchResults.html(matches+" match"+(1===matches?"":"es")),0>=matches){var positions=isColumns?this.controller.getHeatMapElementComponent().getColumnPositions():this.controller.getHeatMapElementComponent().getRowPositions();positions.setSquishedIndices(null),isColumns?this.controller.getProject().setGroupColumns([],!0):this.controller.getProject().setGroupRows([],!0),positions.setSize(isColumns?this.controller.getFitColumnSize():this.controller.getFitRowSize())}else morpheus.AbstractDendrogram.squishNonSearchedNodes(this.controller,isColumns);this.controller.updateDataset(),this.controller.revalidate()},search:function(isRows){this.searching=!0;for(var isMatchesOnTop=isRows?this.$rowMatchesToTop.hasClass("btn-primary"):this.$columnMatchesToTop.hasClass("btn-primary"),controller=this.controller,project=controller.getProject(),sortKeys=isRows?project.getRowSortKeys():project.getColumnSortKeys(),keyIndex=-1,i=0;ii;i++){var viewIndex=searchResultViewIndices[i];searchResultsModelIndices.push(isRows?project.convertViewRowIndexToModel(viewIndex):project.convertViewColumnIndexToModel(viewIndex))}if(null!==searchResultViewIndices&&isMatchesOnTop){var key=new morpheus.MatchesOnTopSortKey(project,searchResultsModelIndices,"matches on top");sortKeys=sortKeys.filter(function(key){return!(key instanceof morpheus.MatchesOnTopSortKey)}),searchResultViewIndices=key.indices,sortKeys.splice(0,0,key),isRows?project.setRowSortKeys(sortKeys,!1):project.setColumnSortKeys(sortKeys,!1)}var searchResultsViewIndicesSet=new morpheus.Set;if(null!=searchResultViewIndices)for(var i=0,length=searchResultViewIndices.length;length>i;i++){var viewIndex=searchResultViewIndices[i];searchResultsViewIndicesSet.add(viewIndex)}null==searchResultViewIndices&&(searchResultViewIndices=[]),isRows?(this.rowSearchResultModelIndices=searchResultsModelIndices,this.rowSearchResultViewIndicesSorted=searchResultViewIndices.sort(function(a,b){return b>a?-1:1}),this.currentRowSearchIndex=-1):(this.columnSearchResultModelIndices=searchResultsModelIndices,this.columnSearchResultViewIndicesSorted=searchResultViewIndices.sort(function(a,b){return b>a?-1:1}),this.currentColumnSearchIndex=-1),(isRows?project.getRowSelectionModel():project.getColumnSelectionModel()).setViewIndices(searchResultsViewIndicesSet,!0),isMatchesOnTop&&(isRows?project.setRowSortKeys(morpheus.SortKey.keepExistingSortKeys(sortKeys,project.getRowSortKeys()),!0):project.setColumnSortKeys(morpheus.SortKey.keepExistingSortKeys(sortKeys,project.getColumnSortKeys()),!0)),this.updateDimensionsLabel(),this.updateSelectionLabel(),this.searching=!1}},morpheus.HeatMapTooltipProvider=function(heatMap,rowIndex,columnIndex,options,separator,quick){var dataset=heatMap.project.getSortedFilteredDataset(),tipText=[];if(quick||options.value&&_.each(options.value,function(pair){if(tipText.length>0&&tipText.push(separator),tipText.push(pair.name),tipText.push(": "),_.isArray(pair.value))for(var i=0;i0&&tipText.push(", "),tipText.push(pair.value[i]);else tipText.push(pair.value);tipText.push("")}),-1!==rowIndex&&-1!==columnIndex){for(var i=0,nseries=dataset.getSeriesCount();nseries>i;i++)morpheus.HeatMapTooltipProvider._matrixValueToString(dataset,rowIndex,columnIndex,i,tipText,separator,options.showSeriesNameInTooltip||i>0);if(quick){var quickRowTracks=heatMap.rowTracks.filter(function(t){return t.settings.inlineTooltip});morpheus.HeatMapTooltipProvider._tracksToString(options,quickRowTracks,dataset.getRowMetadata(),rowIndex,tipText,separator),morpheus.HeatMapTooltipProvider._tracksToString(options,heatMap.columnTracks.filter(function(t){return t.settings.inlineTooltip}),dataset.getColumnMetadata(),columnIndex,tipText,separator)}}if(quick){if(null!=options.name){var metadata=-1!==rowIndex?dataset.getRowMetadata():dataset.getColumnMetadata(),vector=metadata.getByName(options.name),track=heatMap.getTrack(options.name,-1!==columnIndex),colorByName=null!=track?track.settings.colorByField:null,additionalVector=null!=colorByName?metadata.getByName(colorByName):null;morpheus.HeatMapTooltipProvider.vectorToString(vector,-1!==rowIndex?rowIndex:columnIndex,tipText,separator,additionalVector)}}else-1!==rowIndex&&morpheus.HeatMapTooltipProvider._metadataToString(options,heatMap.rowTracks,dataset.getRowMetadata(),rowIndex,tipText,separator),-1!==columnIndex&&morpheus.HeatMapTooltipProvider._metadataToString(options,heatMap.columnTracks,dataset.getColumnMetadata(),columnIndex,tipText,separator);var rowNodes=[],columnNodes=[],selectedRowNodes=[],selectedColumnNodes=[];if(options.rowNodes&&(rowNodes=options.rowNodes),options.columnNodes&&(columnNodes=options.columnNodes),!quick){if(heatMap.rowDendrogram&&(selectedRowNodes=_.values(heatMap.rowDendrogram.selectedRootNodeIdToNode)),heatMap.columnDendrogram&&(selectedColumnNodes=_.values(heatMap.columnDendrogram.selectedRootNodeIdToNode)),selectedRowNodes.length>0&&rowNodes.length>0){var nodeIds={};_.each(selectedRowNodes,function(n){nodeIds[n.id]=!0}),rowNodes=_.filter(rowNodes,function(n){return void 0===nodeIds[n.id]})}if(selectedColumnNodes.length>0&&columnNodes.length>0){var nodeIds={};_.each(selectedColumnNodes,function(n){nodeIds[n.id]=!0}),columnNodes=_.filter(columnNodes,function(n){return void 0===nodeIds[n.id]})}}return morpheus.HeatMapTooltipProvider._nodesToString(tipText,rowNodes,null,separator),morpheus.HeatMapTooltipProvider._nodesToString(tipText,columnNodes,null,separator),quick||(selectedRowNodes.length>0&&morpheus.HeatMapTooltipProvider._nodesToString(tipText,selectedRowNodes,heatMap.rowDendrogram._selectedNodeColor,separator),selectedColumnNodes.length>0&&morpheus.HeatMapTooltipProvider._nodesToString(tipText,selectedColumnNodes,heatMap.columnDendrogram._selectedNodeColor,separator)),tipText.join("")},morpheus.HeatMapTooltipProvider._matrixValueToString=function(dataset,rowIndex,columnIndex,seriesIndex,tipText,separator,showSeriesNameInTooltip){var val=dataset.getValue(rowIndex,columnIndex,seriesIndex);if(null!=val)if(val.toObject||!_.isNumber(val)){var obj=val.toObject?val.toObject():val,keys=_.keys(obj);_.each(keys,function(key){if("__v"!==key){var v=morpheus.Util.formatObject(obj[key]);tipText.length>0&&tipText.push(separator),tipText.push(key),tipText.push(": "),tipText.push(v),tipText.push("")}})}else tipText.length>0&&tipText.push(separator),showSeriesNameInTooltip&&(tipText.push(dataset.getName(seriesIndex)),tipText.push(": ")),tipText.push(""),tipText.push(morpheus.Util.nf(val)),tipText.push("")},morpheus.HeatMapTooltipProvider.vectorToString=function(vector,index,tipText,separator,additionalVector){var arrayValueToString=function(arrayFieldName,arrayVal){if(null!=arrayVal)if(null!=arrayFieldName&&(tipText.length>0&&tipText.push(separator),tipText.push(arrayFieldName)),arrayVal.toObject){tipText.push(" ");var obj=arrayVal.toObject(),keys=_.keys(obj);_.each(keys,function(key){var subVal=obj[key];null!=subVal&&""!=subVal&&(tipText.length>0&&tipText.push(separator),tipText.push(key),tipText.push(": "),tipText.push(morpheus.Util.formatObject(subVal)),tipText.push(""))})}else tipText.push(": "),tipText.push(morpheus.Util.formatObject(arrayVal)),tipText.push("")};if(null!=vector){var primaryVal=vector.getValue(index);if(null!=primaryVal&&""!=primaryVal){var primaryFields=vector.getProperties().get(morpheus.VectorKeys.FIELDS);if(null!=primaryFields){var visibleFieldIndices=vector.getProperties().get(morpheus.VectorKeys.VISIBLE_FIELDS);void 0===visibleFieldIndices&&(visibleFieldIndices=morpheus.Util.seq(primaryFields.length));var additionalFieldNames=null!=additionalVector?additionalVector.getProperties().get(morpheus.VectorKeys.FIELDS):null,additionalVal=null!=additionalFieldNames?additionalVector.getValue(index):null;tipText.length>0&&tipText.push(separator),tipText.push(vector.getName());for(var j=0;j0&&tipText.push(separator),tipText.push(additionalVector.getName());for(var j=0;j0&&tipText.push(separator),tipText.push(vector.getName()),tipText.push(": "),tipText.push(morpheus.Util.formatObject(primaryVal)),tipText.push("")}}},morpheus.HeatMapTooltipProvider._tracksToString=function(options,tracks,metadata,index,tipText,separator){for(var i=0;ii;i++){var track=tracks[i];track.isVisible()&&track.isShowTooltip()&&(tracks[i].name===options.name?filtered.splice(0,0,track):filtered.push(track))}morpheus.HeatMapTooltipProvider._tracksToString(options,filtered,metadata,index,tipText,separator)},morpheus.HeatMapTooltipProvider._nodesToString=function(tipText,nodes,color,separator){var renderField=function(name,value){if(null!=value){if(tipText.length>0&&tipText.push(separator),color&&tipText.push(''),tipText.push(name),tipText.push(": "),_.isArray(value))for(var i=0;i0&&tipText.push(", "),tipText.push(morpheus.Util.formatObject(value[i]));else tipText.push(morpheus.Util.formatObject(value));tipText.push(""),color&&tipText.push("")}};_.each(nodes,function(node){if(node.info)for(var name in node.info){var value=node.info[name];renderField(name,value)}renderField("depth",node.depth);var nLeafNodes=1+Math.abs(node.maxIndex-node.minIndex);nLeafNodes>0&&renderField("# of leaf nodes",nLeafNodes)})},morpheus.HeatMapTrackColorLegend=function(tracks,colorModel){morpheus.AbstractCanvas.call(this,!1),this.tracks=tracks,this.colorModel=colorModel,this.canvas.style.position=""},morpheus.HeatMapTrackColorLegend.prototype={getPreferredSize:function(){var tracks=this.tracks,colorModel=this.colorModel,xpix=0,ypix=0,maxYPix=0,canvas=this.canvas,context=canvas.getContext("2d");context.font="12px "+morpheus.CanvasUtil.FONT_NAME;for(var i=0;i0?maxYPix+30:0}},draw:function(clip,context){for(var tracks=this.tracks,colorModel=this.colorModel,xpix=0,i=0;i0?maxYPix+30:0}},draw:function(clip,context){var tracks=this.tracks,shapeModel=this.shapeModel,xpix=0,ypix=0;context.textAlign="left",context.textBaseline="top",context.font="12px "+morpheus.CanvasUtil.FONT_NAME,context.fillStyle=morpheus.CanvasUtil.FONT_COLOR,context.strokeStyle="black";for(var i=0;i'),html.push(''),html.push('"),html.push("
"),this.$el=$(html.join("")),this.$el.find("button").on("click",function(e){e.stopImmediatePropagation()}),this.$el.find("[name=contact]").on("click",function(e){e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),window.open("mailto:morpheus@broadinstitute.org"),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"contact"})}),this.$el.find("[name=tutorial]").on("click",function(e){e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),window.open(morpheus.Util.URL+"tutorial.html"),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"tutorial"})}),this.$el.find("[name=linking]").on("click",function(e){e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),window.open(morpheus.Util.URL+"linking.html"),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"linking"})}),this.$el.find("[name=source]").on("click",function(e){e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),window.open("https://github.com/joshua-gould/morpheus.js"),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"source"})})},morpheus.LegendWithStops=function(){morpheus.AbstractCanvas.call(this,!1),this.setBounds({width:300,height:40});var that=this;this.hammer=morpheus.Util.hammer(this.canvas,["pan","tap","press"]).on("panmove",function(event){if(-1!==that.panStartSelectedIndex){var position=morpheus.CanvasUtil.getMousePos(event.target,event),fraction=that.fractionToStopPix.invert(position.x);fraction=Math.max(0,fraction),fraction=Math.min(1,fraction),that.trigger("moved",{fraction:fraction})}}).on("panstart",function(event){that.panStartSelectedIndex=that.findIndexForPosition(morpheus.CanvasUtil.getMousePos(event.target,event,!0))}).on("panend",function(event){that.panStartSelectedIndex=-1}).on("tap",function(event){var position=morpheus.CanvasUtil.getMousePos(event.target,event);if(event.tapCount>1){var fraction=that.fractionToStopPix.invert(position.x);that.trigger("added",{fraction:fraction})}else that.selectedIndex=that.findIndexForPosition(position),that.trigger("selectedIndex",{selectedIndex:that.selectedIndex})}),$(this.canvas).on("keydown",function(e){8!=e.which&&46!=e.which||-1===that.selectedIndex||(that.trigger("delete"),e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation())})},morpheus.LegendWithStops.prototype={selectedIndex:-1,border:7,stopHalfSize:5,panStartSelectedIndex:-1,destroy:function(){$(this.canvas).off("keyup"),this.hammer.destroy()},setSelectedIndex:function(index){this.panStartSelectedIndex=-1},findIndexForPosition:function(position){if(position.y>=22)for(var i=0,length=this.fractions.length;length>i;i++){var pix=this.fractionToStopPix(this.fractions[i]),start=pix-this.stopHalfSize,end=pix+this.stopHalfSize;if(position.x>=start&&position.x<=end)return i}return-1},draw:function(fractions,colors,stepped,fractionToStopPix){this.fractions=fractions,this.colors=colors,this.stepped=stepped,this.fractionToStopPix=fractionToStopPix;var context=this.canvas.getContext("2d");morpheus.CanvasUtil.resetTransform(context),context.clearRect(0,0,this.getUnscaledWidth(),this.getUnscaledHeight()),context.translate(this.border,0),morpheus.HeatMapColorSchemeLegend.draw(context,fractions,colors,this.getUnscaledWidth()-2*this.border,this.getUnscaledHeight()-20,stepped),context.translate(-this.border,0),context.lineWidth=1,context.strokeStyle="Grey",context.strokeRect(this.border,0,this.getUnscaledWidth()-2*this.border,this.getUnscaledHeight()-20);for(var i=0;i0&&fractions[i]===fractions[i-1])){context.fillStyle=colors[i];var pix=fractionToStopPix(fractions[i]);context.fillRect(pix-this.stopHalfSize,22,2*this.stopHalfSize,2*this.stopHalfSize),this.selectedIndex===i?(context.lineWidth=2,context.strokeStyle="black"):(context.lineWidth=1,context.strokeStyle="Grey"),context.strokeRect(pix-this.stopHalfSize,22,2*this.stopHalfSize,2*this.stopHalfSize)}}},morpheus.Util.extend(morpheus.LegendWithStops,morpheus.AbstractCanvas),morpheus.Util.extend(morpheus.LegendWithStops,morpheus.Events),morpheus.Popup={},morpheus.Popup.initted=!1,morpheus.Popup.init=function(){if(!morpheus.Popup.initted){var client=new Clipboard("a[name=Copy]",{text:function(trigger){var event={clipboardData:{setData:function(dataType,data){this.data=data}}};return morpheus.Popup.popupCallback(event,"Copy"),morpheus.Popup.hide(),event.clipboardData.data}});morpheus.Popup.client=client,morpheus.Popup.initted=!0,morpheus.Popup.$popupDiv=$(document.createElement("div")),morpheus.Popup.$popupDiv.css("position","absolute").css("zIndex",999).addClass("dropdown clearfix"),morpheus.Popup.$contextMenu=$(document.createElement("ul")),morpheus.Popup.$contextMenu.addClass("dropdown-menu").css("display","block").css("position","static").css("margin-bottom","5px"),morpheus.Popup.$contextMenu.appendTo(morpheus.Popup.$popupDiv),morpheus.Popup.$contextMenu.on("click","a",function(e){var $this=$(this),name=$.trim($this.text());"Copy"!==name&&(morpheus.Popup.popupCallback(e,name),morpheus.Popup.hide())})}},morpheus.Popup.popupInDom=!1,morpheus.Popup.hidePopupMenu=function(e){morpheus.Popup.component==e.target&&(e.preventDefault(),e.stopPropagation()),morpheus.Popup.hide()},morpheus.Popup.hide=function(){morpheus.Popup.$popupDiv.hide(),$(document.body).off("mousedown",morpheus.Popup.hidePopupMenu),morpheus.Popup.popupCallback=null,morpheus.Popup.component=null},morpheus.Popup.showPopup=function(menuItems,position,component,callback){if(morpheus.Popup.init(),morpheus.Popup.component==component)return void morpheus.Popup.hide();morpheus.Popup.popupCallback=callback,morpheus.Popup.component=component;for(var html=[],i=0,length=menuItems.length;length>i;i++){var item=menuItems[i];item.header?html.push('"):item.separator?html.push('
  • '):(html.push('
  • '),item.checked&&html.push(''),html.push(item.name),item.icon&&html.push(''),html.push(""),html.push("
  • "))}morpheus.Popup.$contextMenu.html(html.join("")),morpheus.Popup.popupInDom||(morpheus.Popup.popupInDom=!0,morpheus.Popup.$popupDiv.appendTo($(document.body))),morpheus.Popup.$popupDiv.css({display:"block",left:position.x,top:position.y}),morpheus.Popup.$popupDiv.show();var $body=$(document.body);$body.off("mousedown",morpheus.Popup.hidePopupMenu),window.setTimeout(function(){$body.on("mousedown",function(e){var $target=$(e.target);"popup-item"!==$target.data("type")&&morpheus.Popup.hidePopupMenu(e)})},1)},morpheus.RowDendrogram=function(controller,tree,positions,project){morpheus.AbstractDendrogram.call(this,controller,tree,positions,project,morpheus.AbstractDendrogram.Type.ROW)},morpheus.RowDendrogram.prototype={drawNode:function(context,node){var radius=this.getNodeRadius(node),pix=this.toPix(node);context.beginPath(),context.arc(pix[0],pix[1],radius,2*Math.PI,!1),context.fill()},isDragHotSpot:function(p){return Math.abs(this.scale(this.cutHeight)-p.x)<=2},preDraw:function(context,clip){context.setLineDash&&context.setLineDash([5]),context.strokeStyle="black";var nx=this.scale(this.cutHeight);context.beginPath(),context.moveTo(nx,clip.y),context.lineTo(nx,this.getUnscaledHeight()),context.stroke(),context.setLineDash&&context.setLineDash([])},getPreferredSize:function(){return{width:100,height:Math.ceil(this.positions.getPosition(this.positions.getLength()-1)+this.positions.getItemSize(this.positions.getLength()-1))}},paintMouseOver:function(clip,context){-1!==this.project.getHoverRowIndex()&&(morpheus.CanvasUtil.resetTransform(context),context.translate(0,-clip.y),this.drawRowBorder(context,this.positions,this.project.getHoverRowIndex(),this.getUnscaledWidth()))},drawRowBorder:function(context,positions,index,gridSize){var size=positions.getItemSize(index),pix=positions.getPosition(index);context.beginPath(),context.moveTo(0,pix+size),context.lineTo(gridSize,pix+size),context.stroke(),context.beginPath(),context.moveTo(0,pix),context.lineTo(gridSize,pix),context.stroke()},createScale:function(){return d3.scale.linear().domain([0,this.tree.maxHeight]).range([this.getUnscaledWidth(),0])},getMaxIndex:function(clip){return morpheus.Positions.getBottom(clip,this.positions)},getMinIndex:function(clip){return morpheus.Positions.getTop(clip,this.positions)},toPix:function(node){var min=this.positions.getPosition(node.minIndex)+this.positions.getItemSize(node.minIndex)/2,max=this.positions.getPosition(node.maxIndex)+this.positions.getItemSize(node.maxIndex)/2;return[this.scale(node.height),(min+max)/2]},drawPathFromNodeToParent:function(context,node){var pix=this.toPix(node),parentPix=this.toPix(node.parent);context.beginPath(),context.moveTo(pix[0],pix[1]),context.lineTo(parentPix[0],pix[1]),context.lineTo(parentPix[0],parentPix[1]),context.stroke()},drawNodePath:function(context,node,minIndex,maxIndex){var x,y,children=node.children,left=children[0],right=children[1],ry=this.toPix(right)[1],rx=this.scale(right.height),ly=this.toPix(left)[1],lx=this.scale(left.height),nx=this.scale(node.height);if(this.drawLeafNodes)x=[rx,nx,nx,lx],y=[ry,ry,ly,ly];else{var leftIsLeaf=void 0!==left.children,rightIsLeaf=void 0!==right.children;leftIsLeaf&&(lx=nx+4),rightIsLeaf&&(rx=nx+4),x=[rx,nx,nx,lx],y=[ry,ry,ly,ly]}context.beginPath(),context.moveTo(x[0],y[0]);for(var i=1,length=x.length;length>i;i++)context.lineTo(x[i],y[i]);context.stroke()}},morpheus.Util.extend(morpheus.RowDendrogram,morpheus.AbstractDendrogram),morpheus.ScentedSearch=function(model,positions,isVertical,scrollbar,controller){morpheus.AbstractCanvas.call(this,!1),this.model=model,this.positions=positions,this.isVertical=isVertical,this.scrollbar=scrollbar,this.controller=controller,this.searchIndices=[],scrollbar.decorator=this;var _this=this,mouseMove=function(e){var index=_this.getIndex(e);_this.mouseMovedIndex=index,document.body.style.cursor=0>index?"default":"pointer",scrollbar.canvas.style.cursor=0>index?"default":"pointer";var tipOptions={event:e};isVertical?controller.setToolTip(index>=0?_this.searchIndices[index]:-1,-1,tipOptions):controller.setToolTip(-1,index>=0?_this.searchIndices[index]:-1,tipOptions)},mouseExit=function(e){document.body.style.cursor="default",scrollbar.canvas.style.cursor="default"};$(scrollbar.canvas).on("mousemove",mouseMove).on("mouseexit",mouseExit)},morpheus.ScentedSearch.prototype={mouseMovedIndex:-1,getIndex:function(event){var pix=morpheus.CanvasUtil.getMousePos(event.target,event),val=pix[this.isVertical?"y":"x"];return this.getIndexForPix(val)},getIndexForPix:function(pix){var indices=this.searchIndices;if(null==indices)return-1;var tolerance=1.2;if(this.mouseMovedIndex>0){var midVal=this.positions.getPosition(indices[this.mouseMovedIndex])*scale;if(Math.abs(midVal-pix)<=tolerance)return this.mouseMovedIndex}for(var low=0,scale=this.scale,high=indices.length-1;high>=low;){var mid=low+high>>1,midVal=this.positions.getPosition(indices[mid])*scale,cmp=0;if(Math.abs(midVal-pix)<=tolerance?cmp=0:pix>midVal?cmp=-1:midVal>pix&&(cmp=1),0>cmp)low=mid+1;else{if(!(cmp>0))return mid;high=mid-1}}return-1},tap:function(position){var val=position[this.isVertical?"y":"x"],index=this.getIndexForPix(val);return this.scrollbar.canvas.style.cursor=0>index?"default":"pointer",index>=0?(this.isVertical?this.controller.scrollTop(this.positions.getPosition(this.searchIndices[index])):this.controller.scrollLeft(this.positions.getPosition(this.searchIndices[index])),!0):!1},update:function(){this.searchIndices=this.model.getViewIndices().values().sort(function(a,b){return b>a?-1:1})},draw:function(clip,context){var width=this.scrollbar.getUnscaledWidth(),height=this.scrollbar.getUnscaledHeight();this.scale=(this.isVertical?height:width)/(this.positions.getPosition(this.positions.getLength()-1)+this.positions.getItemSize(this.positions.getLength()-1));var innerColor="#FFDD00",outerColor="#CCAA00";context.strokeStyle=outerColor,context.fillStyle=innerColor,context.lineWidth=1,this.drawIndices(context,this.searchIndices),this.drawHoverIndices(context)},drawHoverIndices:function(context){var heatmap=this.controller;if(context.fillStyle="black",heatmap.mousePositionOptions&&null!=heatmap.mousePositionOptions.name){var isColumns=!this.isVertical,track=heatmap.getTrack(heatmap.mousePositionOptions.name,isColumns);if(null==track)return;if(track.settings.highlightMatchingValues){var hoverIndex=isColumns?heatmap.getProject().getHoverColumnIndex():heatmap.getProject().getHoverRowIndex();if(-1===hoverIndex)return;var vector=track.getVector(),value=vector.getValue(hoverIndex),valueToModelIndices=track.getFullVector().getProperties().get(morpheus.VectorKeys.VALUE_TO_INDICES);if(!valueToModelIndices){var fullVector=track.getFullVector();valueToModelIndices=morpheus.VectorUtil.createValueToIndicesMap(fullVector),fullVector.getProperties().set(morpheus.VectorKeys.VALUE_TO_INDICES,valueToModelIndices)}var modelIndices=valueToModelIndices.get(value);if(null==modelIndices)return void console.log("valueToModelIndices error");for(var scale=this.scale,lineLength=this.isVertical?this.scrollbar.getUnscaledWidth():this.scrollbar.getUnscaledHeight(),isVertical=this.isVertical,positions=this.positions,project=heatmap.getProject(),i=0,length=modelIndices.length;length>i;i++){var modelIndex=modelIndices[i],index=isVertical?project.convertModelRowIndexToView(modelIndex):project.convertModelColumnIndexToView(modelIndex);if(-1!==index){var pix=positions.getPosition(index)*scale;isVertical?context.fillRect(0,pix,lineLength,2):context.fillRect(pix,0,2,lineLength)}}}}},drawIndices:function(context,highlightedIndices){for(var scale=this.scale,lineLength=this.isVertical?this.scrollbar.getUnscaledWidth():this.scrollbar.getUnscaledHeight(),isVertical=this.isVertical,positions=this.positions,i=0,length=highlightedIndices.length;length>i;i++){var index=highlightedIndices[i],pix=positions.getPosition(index)*scale;isVertical?(context.fillRect(0,pix,lineLength,2),context.strokeRect(0,pix,lineLength,2)):(context.fillRect(pix,0,2,lineLength),context.strokeRect(pix,0,2,lineLength))}}},morpheus.Util.extend(morpheus.ScentedSearch,morpheus.AbstractCanvas),morpheus.ScrollBar=function(isVertical){morpheus.AbstractCanvas.call(this),this.isVertical=isVertical,$(this.canvas).css("border","1px solid #d8d8d8"),isVertical?this.setBounds({width:12}):this.setBounds({height:12}),this.field=this.isVertical?"y":"x";var that=this,mouseMove=function(event){if(!morpheus.CanvasUtil.dragging){var position=morpheus.CanvasUtil.getMousePos(event.target,event,!0),mouseOver=position[that.field]>=that.thumbPos&&position[that.field]<=that.thumbPos+that.thumbExtent;that.thumbMouseOver!==mouseOver&&(that.thumbMouseOver=mouseOver,that.repaint())}},mouseExit=function(e){!morpheus.CanvasUtil.dragging&&that.thumbMouseOver&&(that.thumbMouseOver=!1,that.repaint())};$(this.canvas).on("mousemove",mouseMove).on("mouseout",mouseExit).on("mouseenter",mouseMove),this.hammer=morpheus.Util.hammer(this.canvas,[this.isVertical?"panv":"panh","tap"]).on("panstart",function(event){var position=morpheus.CanvasUtil.getMousePos(event.target,event,!0);position[that.field]>=that.thumbPos&&position[that.field]<=that.thumbPos+that.thumbExtent?(that.draggingThumb=!0,that.dragStartThumbPos=that.thumbPos):that.draggingThumb=!1}).on("panend",function(event){that.draggingThumb=!1}).on("panmove",function(event){if(that.draggingThumb){var thumbPosPix=(morpheus.CanvasUtil.getMousePos(event.target,event),that.dragStartThumbPos+(that.isVertical?event.deltaY:event.deltaX)),f=thumbPosPix/(that.visibleExtent-that.thumbExtent),value=f*that.maxValue;that.setValue(value,!0),event.preventDefault(),event.srcEvent.stopPropagation(),event.srcEvent.stopImmediatePropagation()}}).on("tap doubletap",function(event){if(!that.draggingThumb){var position=morpheus.CanvasUtil.getMousePos(event.target,event);if(!that.decorator.tap(position)){var thumbExtentToValue=that.thumbExtent/that.totalExtent*that.totalExtent;that.scrollToTop=position[that.field]'];map.forEach(function(val,key){html.push("'),html.push(key),html.push("")}),html.push(""),formBuilder.append({name:"selected_value",type:"custom",value:html.join("")});var shapeField=new morpheus.ShapeField;formBuilder.append({col:"col-xs-2",name:"selected_shape",type:"custom",value:'
    '}),shapeField.$el.appendTo(formBuilder.find("shape"));var $valuePicker=formBuilder.$form.find("[name=valuePicker]"),selectedVal=$valuePicker.val(),_this=this;shapeField.setShapeValue(map.get(selectedVal)),shapeField.on("change",function(e){map.set(selectedVal,e.shape),_this.trigger("change",{value:selectedVal,shape:e.shape})}),$valuePicker.selectpicker().change(function(){selectedVal=$valuePicker.val(),shapeField.setShapeValue(map.get(selectedVal))}),this.$div=formBuilder.$form},morpheus.ShapeChooser.prototype={},morpheus.Util.extend(morpheus.ShapeChooser,morpheus.Events),morpheus.ShapeField=function(shapes){shapes=shapes||morpheus.VectorShapeModel.SHAPES;var _this=this,html=[],size2=8,x=4,y=4;html.push('
    '),html.push(''),html.push('
    ");var $el=$(html.join("")),$header=$el.find("[name=selection]");$el.on("click","li > a",function(e){var shape=$(this).attr("value");setShapeValue(shape),_this.trigger("change",{shape:shape})});var setShapeValue=function(val){if($header.attr("value",val),"none"===val)$header.html("(None)");else{var context=new C2S(2*size2,2*size2);context.translate(4,4),morpheus.CanvasUtil.drawShape(context,val,x,y,size2),$header.html(context.getSerializedSvg())}};this.setShapeValue=setShapeValue,this.$el=$el},morpheus.ShapeField.prototype={},morpheus.Util.extend(morpheus.ShapeField,morpheus.Events),morpheus.SortByValuesIndicator=function(project,isVertical,positions){morpheus.AbstractCanvas.call(this,!0),this.project=project,this.isVertical=isVertical,this.positions=positions,this.lastPosition={start:-1,end:-1}},morpheus.SortByValuesIndicator.prototype={prePaint:function(clip,context){var positions=this.positions,start=0,end=positions.getLength();this.isVertical?(start=morpheus.Positions.getTop(clip,positions),end=morpheus.Positions.getBottom(clip,positions)):(start=morpheus.Positions.getLeft(clip,positions),end=morpheus.Positions.getRight(clip,positions)),(this.invalid||start!==this.lastPosition.start||end!==this.lastPosition.end)&&(this.lastPosition.start=start,this.lastPosition.end=end,this.invalid=!0)},draw:function(clip,context){var project=this.project,isVertical=this.isVertical,positions=this.positions,sortKeys=isVertical?project.getColumnSortKeys():project.getRowSortKeys();context.translate(-clip.x,-clip.y),context.fillStyle="black",context.textBaseline="top",context.textAlign="left",context.font="8px "+morpheus.CanvasUtil.FONT_NAME;var start=0,end=positions.getLength();isVertical?(start=morpheus.Positions.getTop(clip,positions),end=morpheus.Positions.getBottom(clip,positions)):(start=morpheus.Positions.getLeft(clip,positions),end=morpheus.Positions.getRight(clip,positions));for(var arrowWidth=3,arrowHeight=4,i=0;i=start&&end>view){context.save();var pix=positions.getPosition(view),size=positions.getItemSize(view);isVertical?context.translate(2,pix+size/2):context.translate(pix+size/2,0),context.beginPath(),key.getSortOrder()===morpheus.SortKey.SortOrder.ASCENDING?(context.moveTo(0,0),context.lineTo(arrowWidth,arrowHeight),context.lineTo(-arrowWidth,arrowHeight)):key.getSortOrder()===morpheus.SortKey.SortOrder.DESCENDING?(context.moveTo(0,arrowHeight),context.lineTo(arrowWidth,0),context.lineTo(-arrowWidth,0)):(context.moveTo(0,0),context.lineTo(arrowWidth,arrowHeight/2),context.lineTo(0,arrowHeight),context.lineTo(-arrowWidth,arrowHeight/2)),context.fill(),context.restore()}}}}},morpheus.Util.extend(morpheus.SortByValuesIndicator,morpheus.AbstractCanvas),morpheus.SortDialog=function(project){function toggle(isColumns){_this.isColumns=isColumns;var $element=_this.build(project,isColumns);$div.empty().html($element),$div.on("click","[name=delete]",function(e){var $this=$(this);e.preventDefault(),$this.closest("div.row").remove()}),$div.on("click","[name=add]",function(e){var $this=$(this),level=[],$sibling=$this.closest("div.row");_this.createLevel(level,new morpheus.SortKey("",morpheus.SortKey.SortOrder.ASCENDING),_this.fields),$sibling.after($(level.join(""))),e.preventDefault()})}var _this=this,$chooserDiv=$('
    '),$div=$('
    '),html=[];html.push('
    '),html.push('
    '),html.push('
    '),html.push('
    '),html.push('
    '),html.push('
    '),html.push("
    "),html.push("
    "),html.push("
    "),$chooserDiv.html(html.join("")),$chooserDiv.on("change","[name=rowsOrColumns]",function(e){var $this=$(this);toggle("columns"===$this.val())}),toggle(!1);var $outer=$("
    ");$chooserDiv.appendTo($outer),$div.appendTo($outer),morpheus.FormBuilder.showOkCancel({title:"Sort",content:$outer,okCallback:function(){var $forms=$div.find("form"),sortBy=$forms.find("[name=sortBy]").map(function(){return $(this).val()}),sortOrder=$forms.find("[name=sortOrder]:checked").map(function(){return $(this).val()}),groupBy=$div.find("[name=groupBy]").val(),newSortKeys=[],modelIndices=_this.isColumns?project.getRowSelectionModel().toModelIndices():project.getColumnSelectionModel().toModelIndices(),existingSortKeys=_this.isColumns?project.getColumnSortKeys():project.getRowSortKeys(),keysToKeep=_.filter(existingSortKeys,function(key){return key instanceof morpheus.MatchesOnTopSortKey||key instanceof morpheus.SpecifiedModelSortOrder&&"dendrogram"===key.name});keysToKeep.length>0&&_.each(keysToKeep,function(key){newSortKeys.push(key)});for(var newSortKeyFields=new morpheus.Set,i=0;i'),html.push('
    '),html.push('
    '),html.push('
    ');var groupByKeys=(isColumns?project.getGroupColumns():project.getGroupRows()).map(function(key){return key.field});return html.push('"),html.push(""),html.push("
    "),$(html.join(""))},createLevel0:function(html){html.push('
    '),html.push('
    '),html.push('
    '),html.push('Add sort level'),html.push("
    "),html.push("
    "),html.push("
    ")},createLevel:function(html,key,fields){html.push('
    '),html.push('
    '),html.push('
    '),html.push('
    '),html.push('"),html.push("
    "),html.push('
    '),html.push('
    "),html.push('
    "),html.push("
    "),html.push('
    '),html.push('Delete'),html.push("
    "),html.push('
    '),html.push('Add sort level'),html.push("
    "),html.push("
    "),html.push("
    ")}},morpheus.Spacer=function(width,height){this.width=width,this.height=height},morpheus.Spacer.prototype={prefWidth:void 0,prefHeight:void 0,visible:!0,dispose:function(){},getPrefWidth:function(){return this.prefWidth},draw:function(clip){},getPreferredSize:function(){return{width:this.width,height:this.height}},setBounds:function(){},getPrefHeight:function(){return this.prefHeight},setPrefWidth:function(prefWidth){this.prefWidth=prefWidth},setPrefHeight:function(prefHeight){this.prefHeight=prefHeight},isVisible:function(){return this.visible},setVisible:function(visible){this.visible=visible},getWidth:function(){return this.width},getHeight:function(){return this.height}},morpheus.SteppedColorSupplier=function(){morpheus.AbstractColorSupplier.call(this),this.hiddenValue=0,this.hiddenValues=new morpheus.Set,this.stepped=!0},morpheus.SteppedColorSupplier.linearScale=function(value,input0,input1,pix0,pix1){return(value-input0)/(input1-input0)*(pix1-pix0)+pix0},morpheus.SteppedColorSupplier.prototype={createInstance:function(){return new morpheus.SteppedColorSupplier},isStepped:function(){return!0},getHiddenValues:function(){return this.hiddenValues},getIndexForFraction:function(f){var fractions=this.fractions;if(f<=fractions[0])return 0;if(f>=fractions[fractions.length-1])return fractions.length-1;for(var i=0;i=left&&right>f)return i}return fractions.length-1},getColor:function(row,column,value){if(this.hiddenValues.has(value)&&(value=this.hiddenValue),isNaN(value))return this.missingColor;var min=this.min,max=this.max,colors=this.colors;if(min>=value)return colors[0];if(value>=max)return colors[colors.length-1];var fraction=morpheus.SteppedColorSupplier.linearScale(value,min,max,0,100)/100;return colors[this.getIndexForFraction(fraction)]}},morpheus.Util.extend(morpheus.SteppedColorSupplier,morpheus.AbstractColorSupplier),morpheus.TabManager=function(options){function rename($a){var builder=new morpheus.FormBuilder;builder.append({name:"name",type:"text",value:$.trim($a.contents().first().text())}),morpheus.FormBuilder.showOkCancel({ -title:"Rename Tab",content:builder.$form,okCallback:function(){var name=$.trim(builder.getValue("name"));""!==name&&(_this.activeTabObject.setName(name),$a.contents().first().replaceWith(name+" "))}})}this.options=$.extend({},{autohideTabBar:!1},options);var _this=this;this.activeTabObject=null,this.activeTabId=null,this.idToTabObject=new morpheus.Map,this.$nav=$(''),this.$nav.on("click","li > a",function(e){var tabId=$(this).attr("href");e.preventDefault(),_this.activeTabId!==tabId&&$(this).tab("show")}),this.$nav.on("dblclick","li > a",function(e){e.preventDefault(),$(this).data("morpheus-rename")&&rename($(this))}),this.$nav.on("contextmenu.morpheus","li > a",function(e){e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation();var $a=$(this);return $a.data("morpheus-rename")&&morpheus.Popup.showPopup([{name:"Rename"}],{x:e.pageX,y:e.pageY},e.target,function(event,item){rename($a)}),!1}),this.$nav.on("click","button",function(e){e.preventDefault();var target=$(this).attr("data-target");_this.remove(target)}),this.$tabContent=$('
    '),this.$nav.on("shown.bs.tab",'a[data-toggle="tab"]',function(e){if(!_this.adding){var previous=_this.activeTabObject;_this.activeTabId=$(e.target).attr("href"),_this.activeTabObject=_this.idToTabObject.get(_this.activeTabId),_this.trigger("change",{tab:_this.activeTabObject,previous:previous})}})},morpheus.TabManager.prototype={setTabText:function(id,text){this.$nav.find("a").filter("[href="+id+"]").contents().first().replaceWith(text+" "),this.idToTabObject.get(id).setName(name)},addTask:function(task){var $a=this.$nav.find("a[href="+task.tabId+"]");if(0===$a.length)throw new Error(task.tabId+" not found.");var $i=$a.find("i"),tasks=$i.data("tasks");tasks||(tasks=[]),task.id=_.uniqueId("task"),tasks.push(task),$i.data("tasks",tasks),$a.removeClass("animated flash").addClass("animated flash").one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){$(this).removeClass("animated flash")}),$i.addClass("fa fa-spinner fa-spin")},removeTask:function(task){var $a=this.$nav.find("a[href="+task.tabId+"]"),$i=$a.find("i"),tasks=$i.data("tasks");tasks||(tasks=[]);for(var index=-1,i=0;i'),li.push(''),li.push(options.title),li.push(' '),options.closeable&&li.push(' '),li.push("");var $link=$(li.join(""));$link.appendTo(this.$nav);var $panel=$('
    ');return options.$el.appendTo($panel),$panel.appendTo(this.$tabContent),options.enabled===!1&&($link.addClass("disabled"),$link.find("a").addClass("btn disabled")),options.focus&&(this.$nav.find('a[data-toggle="tab"]:last').tab("show"),this.activeTabId="#"+id,this.activeTabObject=options.object,$panel.focus()),this.adding=!1,this.options.autohideTabBar&&this.$nav.css("display",this.idToTabObject.size()>1?"":"none"),{$panel:$panel,id:"#"+id}},remove:function(target){void 0===target&&(target=this.activeTabId),this.idToTabObject.remove(target),this.$nav.find("[href="+target+"]").parent().remove(),this.$tabContent.find(target).remove();var $a=this.$nav.find('a[data-toggle="tab"]:last');0===$a.length&&this.options.landingPage&&this.options.landingPage.show(),$a.tab("show"),this.options.autohideTabBar&&this.$nav.css("display",this.idToTabObject.size()>1?"":"none")},setActiveTab:function(id){id===this.activeTabId&&this.trigger("change",{tab:this.activeTabObject,previous:null});var $a=this.$nav.find("[href="+id+"]");$a.parent().removeClass("disabled"),$a.removeClass("btn disabled"),$a.tab("show")},setTabTitle:function(id,title){this.$nav.find("a").filter("[href="+id+"]").attr("title",title)},setTabEnabled:function(id,enabled){var $a=this.$nav.find("a").filter("[href="+id+"]");enabled?($a.parent().removeClass("disabled"),$a.removeClass("btn disabled")):($a.parent().addClass("disabled"),$a.addClass("btn disabled"))}},morpheus.Util.extend(morpheus.TabManager,morpheus.Events),morpheus.Table=function(options){options=morpheus.Table.createOptions(options),this.options=options,options.width||(options.width=options.$el.attr("class"));var _this=this,height=options.height,$gridDiv=$('
    ');this.$gridDiv=$gridDiv,$gridDiv.appendTo(options.$el);var columns=options.columns;this.columns=columns;var visibleColumns=columns.filter(function(c){return c.visible}),grid=new morpheus.Grid({gridOptions:{forceFitColumns:!0,select:options.select,rowHeight:options.rowHeight,autoEdit:!1,editable:!1,autoHeight:"auto"===options.height,enableTextSelectionOnCells:!0},$el:$gridDiv,items:options.items,columns:visibleColumns});if(this.grid=grid,options.search){var tableSearch=new morpheus.TableSearchUI;tableSearch.$el.prependTo(options.$el),tableSearch.setTable(this),this.tableSearch=tableSearch}if(visibleColumns.length!==this.columns.length){var select=[];select.push('");var $select=$(select.join("")),$div=$('
    ');$select.appendTo($div),$div.prependTo(options.$el),$select.selectpicker({iconBase:"fa",tickIcon:"fa-check",style:"btn-default btn-sm"}),$select.on("change",function(){var selectedItems=$select.val(),selectedItemsSet=new morpheus.Set;selectedItems.forEach(function(item){selectedItemsSet.add(parseInt(item))});var visibleColumns=[];_this.columns.forEach(function(c,i){selectedItemsSet.has(i)&&visibleColumns.push(c)}),grid.setColumns(visibleColumns),_this.resize(),_this.redraw()})}var collapsed=!1,lastWidth=-1,resize=function(){if(_this.options.responsive){var gridWidth=options.$el.width();gridWidth!==lastWidth&&(lastWidth=gridWidth,$gridDiv.css("width",gridWidth+"px"),!collapsed&&gridWidth1?(collapsed=!0,$gridDiv.addClass("slick-stacked"),_this.grid.grid.getOptions().rowHeight=options.rowHeight*columns.length,_this.grid.grid.setColumns([{id:0,tooltip:function(item,value){for(var html=[],i=0;i")},collapsed:!0,getter:function(item){return item},formatter:function(row,cell,value,columnDef,dataContext){var html=[];html.push('
    '),options.rowHeader&&html.push(options.rowHeader(dataContext));for(var i=0;i'):html.push("
    ");var c=columns[i],s=c.renderer(dataContext,c.getter(dataContext));html.push(s),html.push("
    ")}return html.push("
    "),html.join("")},sortable:!1,name:""}]),$gridDiv.find(".slick-header").hide(),_this.grid.grid.resizeCanvas(),_this.grid.grid.invalidate()):collapsed&&gridWidth>=options.collapseBreakpoint?($gridDiv.removeClass("slick-stacked"),collapsed=!1,options.showHeader&&$gridDiv.find(".slick-header").show(),_this.grid.grid.getOptions().rowHeight=options.rowHeight,_this.grid.grid.setColumns(columns),_this.grid.grid.resizeCanvas(),options.select&&_this.grid.grid.setSelectedRows(_this.grid.grid.getSelectedRows()),_this.grid.grid.invalidate()):(_this.grid.grid.resizeCanvas(),_this.grid.grid.invalidate()))}};options.showHeader||$gridDiv.find(".slick-header").hide(),options.responsive&&($(window).on("resize orientationchange",resize),$gridDiv.on("remove",function(){$(window).off("resize",resize)}),resize()),this.resize=resize,options.columns.length>1&&null!=options.items&&options.items.length>0&&this.setItems(options.items)},morpheus.Table.defaultRenderer=function(item,value){if(_.isNumber(value))return morpheus.Util.nf(value);if(morpheus.Util.isArray(value)){for(var s=[],i=0,length=value.length;length>i;i++){i>0&&s.push(", ");value[i];s.push(value[i])}return s.join("")}return""+value},morpheus.Table.prototype={setHeight:function(height){if(this.options.height=height,"auto"===height?(this.$gridDiv.css("height",""),this.grid.grid.getOptions().autoHeight=!0,this.grid.grid.setOptions(this.grid.grid.getOptions())):this.$gridDiv.css("height",height),this.grid.grid.resizeCanvas(),"auto"===height){var height=this.getItems().length*this.options.rowHeight+this.options.rowHeight;this.$gridDiv.find(".slick-viewport").css("height",height+"px")}this.grid.grid.invalidate()},setSearchVisible:function(visible){this.tableSearch&&(visible?this.tableSearch.$el.show():this.tableSearch.$el.hide())},autocomplete:function(tokens,response){var matches=[],token=null!=tokens&&tokens.length>0?tokens[tokens.selectionStartIndex]:"";token=$.trim(token);var columns=this.columns.filter(function(c){return c.searchable}),ncolumns=columns.length,showField=ncolumns>1;if(""===token){if(1>=ncolumns)return response(matches);for(var i=0;ncolumns>i;i++){var field=columns[i].name;matches.push({value:field+":",label:''+field+":",show:!0})}return matches.sort(function(a,b){return a.value===b.value?0:a.value0){if(92!==token.charCodeAt(semi-1)){var possibleField=$.trim(token.substring(0,semi));possibleField.length>0&&'"'===possibleField[0]&&'"'===possibleField[token.length-1]&&(possibleField=possibleField.substring(1,possibleField.length-1));for(var columnNameToColumn=new morpheus.Map,columnNames=columns.map(function(c){return c.name}),i=0;i1)for(var regex=new RegExp("^"+morpheus.Util.escapeRegex(token),"i"),j=0;ncolumns>j;j++){var field=columns[j].name;regex.test(field)&&matches.push({value:field+":",label:''+field+":",show:!0})}for(var set=new morpheus.Set,regex=new RegExp("^"+morpheus.Util.escapeRegex(token),"i"),items=this.getItems(),maxSize=matches.length+10,i=0,nitems=items.length;nitems>i;i++)for(var item=items[i],j=0;ncolumns>j;j++){var field=columns[j].name,value=columns[j].getter(item);if(morpheus.Util.isArray(value))for(var nvalues=value.length,k=0;nvalues>k;k++){var val=value[k];if(regex.test(val)&&!set.has(val)&&(set.add(val),matches.push({value:showField?field+":"+val:val,label:showField?''+field+':'+val+"":''+val+""})),matches.length===maxSize)return response(matches)}else if(regex.test(value)&&!set.has(value)&&(set.add(value),matches.push({value:showField?field+":"+value:value,label:showField?''+field+':'+value+"":''+value+""}),matches.length===maxSize))return response(matches)}return response(matches)},searchWithPredicates:function(predicates){if(null==predicates||0===predicates.length)return void this.grid.setFilter(null);for(var columns=this.columns.filter(function(c){return c.searchable}),columnNameToColumn=new morpheus.Map,columnNames=columns.map(function(c){return c.name}),i=0;ii;i++){var predicate=predicates[i],filterColumnName=predicate.getField();if(null!=filterColumnName){var column=columnNameToColumn.get(filterColumnName);column&&(predicate.column=column,filteredPredicates.push(predicate))}else filteredPredicates.push(predicate)}predicates=filteredPredicates,npredicates=predicates.length,this.grid.setFilter(function(item){for(var p=0;npredicates>p;p++){var searchColumns,predicate=predicates[p];searchColumns=predicate.column?[predicate.column]:columns;for(var j=0,ncolumns=searchColumns.length;ncolumns>j;j++){var value=searchColumns[j].getter(item);if(morpheus.Util.isArray(value)){for(var nvalues=value.length,i=0;nvalues>i;i++)if(predicate.accept(value[i]))return!0}else{var predicate=predicates[p];if(predicate.accept(value))return!0}}}return!1})},search:function(text){if(""===text)this.grid.setFilter(null);else{var tokens=morpheus.Util.getAutocompleteTokens(text),columns=this.columns.filter(function(c){return c.searchable}),columnNames=columns.map(function(c){return c.name}),predicates=morpheus.Util.createSearchPredicates({tokens:tokens,fields:columnNames});this.searchWithPredicates(predicates)}},getSelectedRows:function(){return this.grid.getSelectedRows()},getSelectedItems:function(){return this.grid.getSelectedItems()},getSelectedItem:function(){return this.grid.getSelectedItem()},setSelectedRows:function(rows){this.grid.setSelectedRows(rows)},getItems:function(items){return this.grid.getItems()},getAllItemCount:function(){return this.grid.getAllItemCount()},getFilteredItemCount:function(){return this.grid.getFilteredItemCount()},setFilter:function(f){this.grid.setFilter(f)},setItems:function(items){this.grid.setItems(items),this.grid.redraw()},redraw:function(){this.grid.redraw()},on:function(evtStr,handler){this.grid.on(evtStr,handler)},off:function(evtStr,handler){this.grid.off(evtStr,handler)},trigger:function(evtStr){this.grid.trigger(evtStr)}},morpheus.Table.createOptions=function(options){options=$.extend(!0,{},{items:[],height:"564px",collapseBreakpoint:500,showHeader:!0,select:!0,rowHeader:null,responsive:!0,fixedWidth:"320px"},options),options.columns||(options.columns=[{name:""}]);var columns=[];return options.columns.forEach(function(c,i){var column=$.extend(!0,{},{id:i,tooltip:function(dataContext,value){return morpheus.Table.defaultRenderer(dataContext,value)},formatter:function(row,cell,value,columnDef,dataContext){return column.renderer(dataContext,value)},comparator:function(a,b){var aNaN=null==a||_.isNumber(a)&&isNaN(a),bNaN=null==b||_.isNumber(b)&&isNaN(b);return aNaN&&bNaN?0:aNaN?1:bNaN?-1:(a.toLowerCase&&(a=a.toLowerCase()),b.toLowerCase&&(b=b.toLowerCase()),a===b?0:b>a?-1:1)},sortable:!0,searchable:!0,width:null,name:c.name,renderer:morpheus.Table.defaultRenderer},c);void 0===column.visible&&(column.visible=!0),column.getter||(column.getter=null==column.field?function(item){return item}:function(item){return item[c.field]}),options.rowHeader&&0===i&&(column.formatter=function(row,cell,value,columnDef,dataContext){return options.rowHeader(dataContext)+column.renderer(dataContext,value)}),columns.push(column)}),options.columns=columns,1===options.columns.length?options.tableClass="slick-table-compact":options.tableClass="slick-striped-table",options.rowHeight||(options.rowHeight="slick-table-compact"===options.tableClass?18:20),options},morpheus.TableSearchUI=function(){var _this=this,html=[];html.push('
    '),html.push('
    '),html.push('
    '),html.push(''),html.push('
    '),html.push("
    "),html.push("
    "),html.push("
    ");var $el=$(html.join(""));this.$el=$el,$el.find("form").on("submit",function(e){e.preventDefault()});var $search=$el.find("[name=search]"),$searchResults=$el.find("[name=searchResults]");this.$searchResults=$searchResults,$search.on("keyup",_.debounce(function(){_this.table.search($.trim($(this).val()))},100)),morpheus.Util.autosuggest({$el:$search,suggestWhenEmpty:!0,filter:function(tokens,response){_this.table.autocomplete(tokens,response)},select:function(){_this.table.search($.trim($search.val()))}})},morpheus.TableSearchUI.prototype={updateSearchLabel:function(){var filteredCount=this.table.getFilteredItemCount(),text="";filteredCount!==this.table.getAllItemCount()&&(text+=morpheus.Util.intFormat(filteredCount)+" match"+(1!==filteredCount?"es":"")),this.$searchResults.html(text)},setTable:function(table){this.table=table;var _this=this;table.options.responsive||this.$el.css("width",table.options.fixedWidth),table.on("filter",function(){_this.updateSearchLabel()})}},morpheus.TrackSelection=function(track,positions,selectionModel,isColumns,controller){function getPosition(event,useDelta){if(track.settings.squished){var total=positions.getPosition(positions.getLength()-1)+positions.getItemSize(positions.getLength()-1),squishFactor=total/(isColumns?track.getUnscaledWidth():track.getUnscaledHeight()),p=(morpheus.CanvasUtil.getClientXY(event,useDelta),morpheus.CanvasUtil.getMousePosWithScroll(event.target,event,0,0,useDelta));return p[coord]*=squishFactor,p}return morpheus.CanvasUtil.getMousePosWithScroll(event.target,event,controller.scrollLeft(),controller.scrollTop(),useDelta)}var canvas=track.canvas,startIndex=-1,coord=isColumns?"x":"y";this.hammer=morpheus.Util.hammer(canvas,["pan","tap","longpress"]).on("longpress",function(event){event.preventDefault(),event.srcEvent.stopImmediatePropagation(),event.srcEvent.stopPropagation(),controller.setSelectedTrack(track.name,isColumns),track.showPopup(event.srcEvent)}).on("panmove",function(event){var position=getPosition(event),endIndex=positions.getIndex(position[coord],!1),commandKey=morpheus.Util.IS_MAC?event.srcEvent.metaKey:event.srcEvent.ctrlKey,viewIndices=commandKey?selectionModel.getViewIndices():new morpheus.Set,_startIndex=startIndex;if(startIndex>endIndex){var tmp=endIndex;endIndex=_startIndex,_startIndex=tmp}for(var i=_startIndex;endIndex>=i;i++)viewIndices.add(i);if(selectionModel.setViewIndices(viewIndices,!0),isColumns){var scrollLeft=controller.scrollLeft(),scrollRight=scrollLeft+controller.heatmap.getUnscaledWidth();position.x>scrollRight?controller.scrollLeft(scrollLeft+8):position.xscrollBottom?controller.scrollTop(scrollTop+8):position.y1){if(isColumns&&!controller.options.columnsSortable||!isColumns&&!controller.options.rowsSortable)return;controller.sortBasedOnSelection(null,isColumns,event.srcEvent.shiftKey)}else{controller.setSelectedTrack(track.name,isColumns);var commandKey=morpheus.Util.IS_MAC?event.srcEvent.metaKey:event.srcEvent.ctrlKey;if(morpheus.Util.IS_MAC&&event.srcEvent.ctrlKey)return;var viewIndices;if(commandKey)viewIndices=selectionModel.getViewIndices(),viewIndices.has(index)?viewIndices.remove(index):viewIndices.add(index);else if(event.srcEvent.shiftKey){viewIndices=selectionModel.getViewIndices();var min=Number.MAX_VALUE,max=-Number.MAX_VALUE;for(var viewIndex in viewIndices)min=Math.min(viewIndex,min),max=Math.max(viewIndex,max);if(index>=max)for(var i=max;index>=i;i++)viewIndices.add(i);else for(var i=Math.min(index,min),max=Math.max(index,min);max>=i;i++)viewIndices.add(i)}else viewIndices=new morpheus.Set,viewIndices.add(index);selectionModel.setViewIndices(viewIndices,!0)}})},morpheus.TrackSelection.prototype={dispose:function(){this.hammer.destroy()}},morpheus.VectorTrack=function(project,name,positions,isColumns,heatmap){morpheus.AbstractCanvas.call(this,!0),this.preferredSize={width:0,height:0},this.project=project,this.positions=positions,this.isColumns=isColumns,this.name=name,this.visible=!0,this.heatmap=heatmap,this.id=_.uniqueId();var _this=this;this.updateSpanMapFunction=function(){_this.spanMap=morpheus.VectorUtil.createSpanMap(_this.getVector())},this.lastPosition={start:-1,end:-1},this.events="rowSortOrderChanged rowFilterChanged datasetChanged";var mouseMoved=function(event){var index=-1;if("mouseout"!==event.type){var position=morpheus.CanvasUtil.getMousePosWithScroll(event.target,event,heatmap.scrollLeft(),heatmap.scrollTop());if(_this.settings.squished){var total=positions.getPosition(positions.getLength()-1)+positions.getItemSize(positions.getLength()-1),squishFactor=total/(isColumns?_this.getUnscaledWidth():_this.getUnscaledHeight());position[isColumns?"x":"y"]*=squishFactor}index=isColumns?_this.positions.getIndex(position.x,!1):_this.positions.getIndex(position.y,!1)}isColumns?heatmap.setMousePosition(-1,index,{name:_this.name,event:event}):heatmap.setMousePosition(index,-1,{name:_this.name,event:event})};$(this.canvas).on("contextmenu.morpheus",function(e){return e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),heatmap.setSelectedTrack(_this.name,isColumns),_this.showPopup(e),!1}),this.settings={maxTextWidth:void 0,squished:!1,inlineTooltip:!1,tooltip:!0,discrete:!0,highlightMatchingValues:!1,discreteAutoDetermined:!1,colorBarSize:12,stackedBar:!1,renderMethod:{},selectionColor:"rgb(182,213,253)",colorByField:null,barColor:"#bdbdbd",barSize:40,arcSize:60,min:void 0,mid:void 0,max:void 0,minMaxReversed:!1},$(this.canvas).on("mousemove.morpheus mouseout.morpheus",mouseMoved)},morpheus.VectorTrack.RENDER={TEXT:0,COLOR:1,BAR:2,MOLECULE:3,TEXT_AND_COLOR:4,SHAPE:5,ARC:6,BOX_PLOT:7},morpheus.VectorTrack.vectorToString=function(vector){var formatter=function(v){return""+v},dataType=morpheus.VectorUtil.getDataType(vector);return"number"===dataType?formatter=morpheus.Util.nf:"[number]"===dataType?formatter=function(v){var s=[];if(null!=v)for(var i=0,arrayLength=v.length;arrayLength>i;i++)s.push(morpheus.Util.nf(v[i]));return s.join(", ")}:"[string]"===dataType&&(formatter=function(v){var s=[];if(null!=v)for(var i=0,arrayLength=v.length;arrayLength>i;i++)s.push(v[i]);return s.join(", ")}),formatter},morpheus.VectorTrack.prototype={settingFromConfig:function(conf){var settings=this.settings;if(_.isString(conf)){settings.renderMethod={};for(var tokens=conf.split(","),i=0,length=tokens.length;length>i;i++){var method=$.trim(tokens[i]);method=method.toUpperCase();var mapped=morpheus.VectorTrack.RENDER[method];void 0!==mapped?settings.renderMethod[mapped]=!0:"DISCRETE"===method?(settings.discrete=!0,settings.discreteAutoDetermined=!0):"CONTINUOUS"===method?(settings.discrete=!1,settings.discreteAutoDetermined=!0):"HIGHLIGHT"===method?settings.highlightMatchingValues=!0:"STACKED_BAR"===method?(settings.stackedBar=!0,settings.renderMethod[morpheus.VectorTrack.RENDER.BAR]=!0):"BOX_PLOT"===method?settings.renderMethod[morpheus.VectorTrack.RENDER.BOX_PLOT]=!0:console.log(method+" not found.")}}else _.isNumber(conf)?(settings.renderMethod={},settings.renderMethod[conf]=!0):_.isObject(conf)&&(conf.maxTextWidth=void 0,this.settings=$.extend({},this.settings,conf));this._update()},isDiscrete:function(){return this.settings.discrete},setShowTooltip:function(value){this.settings.tooltip=value},isShowTooltip:function(){return this.settings.tooltip},isRenderAs:function(value){return this.settings.renderMethod[value]},dispose:function(){morpheus.AbstractCanvas.prototype.dispose.call(this),$(this.canvas).off("contextmenu.morpheus mousemove.morpheus mouseout.morpheus"),this.project.off(this.events,this.updateSpanMapFunction)},getName:function(){return this.name},getVector:function(name){name=null==name?this.name:name;var vector=this.isColumns?this.project.getSortedFilteredDataset().getColumnMetadata().getByName(name):this.project.getSortedFilteredDataset().getRowMetadata().getByName(name);return vector?vector:new morpheus.Vector(name,0)},getFullVector:function(){var vector=this.isColumns?this.project.getFullDataset().getColumnMetadata().getByName(this.name):this.project.getFullDataset().getRowMetadata().getByName(this.name);return vector?vector:new morpheus.Vector(this.name,0)},_updatePreferredSize:function(){var size=this._computePreferredSize();this.preferredSize.width=size.width,this.preferredSize.height=size.height},_computePreferredSize:function(forPrint){var width=0,height=0;if(this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT)||this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR))if(this.positions.getSize()>=6){var context=this.canvas.getContext("2d"),textWidth=morpheus.CanvasUtil.getVectorStringWidth(context,this.getVector(),this.positions,forPrint?-1:this.isColumns?120:100);forPrint||(textWidth=Math.min(textWidth,this.isColumns?100:500),this.settings.maxTextWidth=textWidth),width+=textWidth}else forPrint||(this.settings.maxTextWidth=0);this.isRenderAs(morpheus.VectorTrack.RENDER.BAR)&&(width+=this.settings.barSize),this.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)&&(width+=this.settings.colorBarSize),this.isRenderAs(morpheus.VectorTrack.RENDER.SHAPE)&&(width+=this.settings.colorBarSize),this.isRenderAs(morpheus.VectorTrack.RENDER.MOLECULE)&&(width+=300),forPrint||this.isRenderAs(morpheus.VectorTrack.RENDER.MOLECULE)||(width=Math.min(300,width)),this.isRenderAs(morpheus.VectorTrack.RENDER.ARC)&&(width+=this.settings.arcSize),this.isRenderAs(morpheus.VectorTrack.RENDER.BOX_PLOT)&&(width+=100);var nkeys=_.keys(this.settings.renderMethod).length;return nkeys>0&&(width+=2*(nkeys-1)),width=Math.max(0,width),this.isColumns?{width:height,height:width}:{width:width,height:height}},getPreferredSize:function(){return this.preferredSize},getPrintSize:function(){return this._computePreferredSize(!0)},_createDiscreteValueMap:function(){var values=morpheus.VectorUtil.getValues(this.getFullVector());values.sort(morpheus.SortKey.ASCENDING_COMPARATOR),this.discreteValueMap=new morpheus.Map;for(var i=0,length=values.length;length>i;i++)this.discreteValueMap.set(values[i],i+1);this.settings.min=0,this.settings.mid=0,this.settings.max=values.length},_setChartMinMax:function(){if(this.isRenderAs(morpheus.VectorTrack.RENDER.BAR)||this.isRenderAs(morpheus.VectorTrack.RENDER.BOX_PLOT))if(this.settings.stackedBar||!this.settings.discrete||this.isRenderAs(morpheus.VectorTrack.RENDER.BOX_PLOT)){if(null==this.settings.min||null==this.settings.max||null==this.settings.mid){var vector=this.getFullVector(),minMax=morpheus.VectorUtil.getMinMax(vector),min=minMax.min,max=minMax.max;if(this.settings.minMaxReversed){var tmp=max;max=min,min=tmp}null==this.settings.min&&(this.settings.min=Math.min(0,min)),null==this.settings.max&&(this.settings.max=Math.max(0,max)),null==this.settings.mid&&(this.settings.mid=this.settings.min<0?0:this.settings.min)}}else this.discreteValueMap||this._createDiscreteValueMap()},_update:function(){if(!this.settings.discreteAutoDetermined&&(this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR)||this.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||this.isRenderAs(morpheus.VectorTrack.RENDER.BAR))&&((this.getFullVector().getProperties().has(morpheus.VectorKeys.FIELDS)||_.isNumber(morpheus.VectorUtil.getFirstNonNull(this.getFullVector())))&&(this.settings.discrete=!1),this.settings.discreteAutoDetermined=!0),this.isRenderAs(morpheus.VectorTrack.RENDER.MOLECULE)&&this.project.off(this.events,this.updateSpanMapFunction),this._setChartMinMax(),this.isRenderAs(morpheus.VectorTrack.RENDER.MOLECULE)&&(this.project.on(this.events,this.updateSpanMapFunction),!this.moleculeCache)){this.moleculeCache={};var _this=this,valueToModelIndices=this.getFullVector().getProperties().get(morpheus.VectorKeys.VALUE_TO_INDICES);if(!valueToModelIndices){var fullVector=this.getFullVector();valueToModelIndices=morpheus.VectorUtil.createValueToIndicesMap(fullVector),fullVector.getProperties().set(morpheus.VectorKeys.VALUE_TO_INDICES,valueToModelIndices)}if(void 0!==_this.heatmap.options.structureUrlProvider)valueToModelIndices.forEach(function(indices,value){var url=_this.heatmap.options.structureUrlProvider(value),image=new Image;image.src=url,_this.moleculeCache[value]=image}),setTimeout(2e3,function(){_this.setInvalid(!0),_this.repaint()});else for(var values=valueToModelIndices.keys(),doRequest=function(smile){$.ajax({contentType:"text/plain",context:{smile:smile},data:{string:smile,representation:"sdf"},url:"http://cactus.nci.nih.gov/chemical/structure"}).done(function(text){_this.moleculeCache[this.smile]=text,values.length>0&&doRequest(values.pop()),_this.invalid=!0,_this.repaint()})},i=0;6>i;i++)doRequest(values.pop());this.updateSpanMapFunction()}this._updatePreferredSize()},postPaint:function(clip,context){context.lineWidth=1,context.strokeStyle="Grey";var project=this.project,setup=this._setup(context,clip),vector=setup.vector,start=setup.start,end=setup.end;this.isColumns?-1!==project.getHoverColumnIndex()&&this.drawColumnBorder(context,this.positions,project.getHoverColumnIndex(),this.getUnscaledHeight()):-1!==project.getHoverRowIndex()&&this.drawRowBorder(context,this.positions,project.getHoverRowIndex(),this.getUnscaledWidth()),this._highlightMatchingValues(context,vector,start,end)},_highlightMatchingValues:function(context,viewVector,start,end){var project=this.project,positions=this.positions;context.strokeStyle="black",context.lineWidth=3;var hoverIndex=this.isColumns?project.getHoverColumnIndex():project.getHoverRowIndex(),value=viewVector.getValue(hoverIndex);if(this.settings.highlightMatchingValues&&-1!==hoverIndex&&this.heatmap.mousePositionOptions&&this.heatmap.mousePositionOptions.name===viewVector.getName()){var valueToModelIndices=this.getFullVector().getProperties().get(morpheus.VectorKeys.VALUE_TO_INDICES);if(!valueToModelIndices){var fullVector=this.getFullVector();valueToModelIndices=morpheus.VectorUtil.createValueToIndicesMap(fullVector),fullVector.getProperties().set(morpheus.VectorKeys.VALUE_TO_INDICES,valueToModelIndices)}var indices=valueToModelIndices.get(value);if(null==indices)return void console.log("valueToModelIndices error");if(indices.length<=1)return;if(this.isColumns){if(-1!==project.getHoverColumnIndex()){var height=this.getUnscaledHeight();context.beginPath();for(var i=0,nindices=indices.length;nindices>i;i++){var viewIndex=project.convertModelColumnIndexToView(indices[i]);if(viewIndex>=start&&end>viewIndex){var size=positions.getItemSize(viewIndex),pix=positions.getPosition(viewIndex);context.rect(pix,0,size,height)}}context.stroke()}}else{context.beginPath();for(var width=this.getUnscaledWidth(),indices=valueToModelIndices.get(value),i=0,nindices=indices.length;nindices>i;i++){var viewIndex=project.convertModelRowIndexToView(indices[i]);if(viewIndex>=start&&end>viewIndex){var size=positions.getItemSize(viewIndex),pix=positions.getPosition(viewIndex);context.rect(0,pix,width,size)}}context.stroke()}}},prePaint:function(clip,context){var project=this.project,positions=this.positions,height=this.getUnscaledHeight(),width=this.getUnscaledWidth(),setup=this._setup(context,clip),start=setup.start,end=setup.end; +var project=this.project,isColumns=this.isColumns,fields=morpheus.MetadataUtil.getMetadataNames(isColumns?project.getFullDataset().getColumnMetadata():project.getFullDataset().getRowMetadata()),html=[];html.push('
    '),html.push('
    '),html.push(""),html.push('"),html.push("
    "),html.push('
    '),html.push('
    '),html.push("
    "),html.push('
    '),html.push('
    '),html.push('Remove'),html.push("
    "),html.push("
    "),html.push("
    "),html.join("")}},morpheus.FormBuilder=function(options){var that=this;this.prefix=_.uniqueId("form"),this.$form=$("
    "),this.$form.attr("role","form").attr("id",this.prefix),this.vertical=options&&options.vertical,this.vertical?(this.labelClass="control-label",this.titleClass="control-label"):(this.titleClass="col-xs-12 control-label",this.labelClass="col-xs-4 control-label",this.$form.addClass("form-horizontal")),this.$form.on("submit",function(e){e.preventDefault()}),this.$form.on("dragover",function(e){var node=$(e.originalEvent.srcElement).parent().parent().prev();node.is("select")&&node.hasClass("file-input")&&($(e.originalEvent.srcElement).parent().css("border","1px solid black"),e.preventDefault(),e.stopPropagation())}).on("dragenter",function(e){var node=$(e.originalEvent.srcElement).parent().parent().prev();node.is("select")&&node.hasClass("file-input")&&($(e.originalEvent.srcElement).parent().css("border","1px solid black"),e.preventDefault(),e.stopPropagation())}).on("dragleave",function(e){var node=$(e.originalEvent.srcElement).parent().parent().prev();node.is("select")&&node.hasClass("file-input")&&($(e.originalEvent.srcElement).parent().css("border",""),e.preventDefault(),e.stopPropagation())}).on("drop",function(e){var node=$(e.originalEvent.srcElement).parent().parent().prev();if(node.is("select")&&node.hasClass("file-input")){$(e.originalEvent.srcElement).parent().css("border","");var name=node.attr("name");if(name=name.substring(0,name.length-"_picker".length),e.originalEvent.dataTransfer)if(e.originalEvent.dataTransfer.files.length){e.preventDefault(),e.stopPropagation();var files=e.originalEvent.dataTransfer.files;that.setValue(name,files[0]),that.trigger("change",{name:name,value:files[0]})}else{var url=e.originalEvent.dataTransfer.getData("URL");e.preventDefault(),e.stopPropagation(),that.setValue(name,url),that.trigger("change",{name:name,value:url})}}})},morpheus.FormBuilder.showProgressBar=function(options){var content=[];content.push('
    '),content.push('
    '),content.push('
    '),content.push('
    '),content.push("
    "),content.push('
    '),content.push(''),content.push("
    "),content.push("
    "),options.subtitle&&(content.push('
    '),content.push('

    '),content.push(options.subtitle),content.push("

    "),content.push("
    ")),content.push("
    ");var $content=$(content.join(""));return $content.find("[name=stop]").on("click",function(e){options.stop(),e.preventDefault()}),morpheus.FormBuilder.showInDraggableDiv({title:options.title,$content:$content})},morpheus.FormBuilder.showInDraggableDiv=function(options){var width=options.width||"300px",html=[];html.push('
    '),html.push('

    '+options.title+"

    "),html.push('
    '),html.push("
    ");var $div=$(html.join("")),$content=$div.find("[name=content]");return $div.find("[name=header]").on("dblclick",function(){"none"===$content.css("display")?$content.css("display",""):$content.css("display","none")}),options.$content.appendTo($content),$div.css("left",$(window).width()/2-$content.outerWidth()/2),$div.draggable({handle:"[name=header]",containment:"document"}),$div.appendTo($(document.body)),$div},morpheus.FormBuilder.promptForDataset=function(cb){var formBuilder=new morpheus.FormBuilder;formBuilder.append({name:"file",value:"",type:"file",required:!0,help:morpheus.DatasetUtil.DATASET_FILE_FORMATS});var $modal;formBuilder.on("change",function(e){var value=e.value;""!==value&&null!=value&&($modal.modal("hide"),$modal.remove(),cb(value))}),$modal=morpheus.FormBuilder.showInModal({title:"Dataset",html:formBuilder.$form,close:!1})},morpheus.FormBuilder.showInModal=function(options){var $div=morpheus.FormBuilder._showInModal({z:options.z,title:options.title,html:options.html,footer:options.close?'":null,onClose:options.callback,backdrop:options.backdrop,size:options.size});return $div},morpheus.FormBuilder.showOkCancel=function(options){options=$.extend({},{ok:!0},options);var footer=[];options.ok&&footer.push(''),options.apply&&footer.push(''),footer.push('');var $div=morpheus.FormBuilder._showInModal({title:options.title,html:options.content,footer:footer.join(""),onClose:options.hiddenCallback,size:options.size}),$ok=$div.find("[name=ok]");return $ok.on("click",function(e){options.okCallback(),$div.modal("hide")}),options.focus&&$ok.focus(),options.draggable&&$div.draggable({handle:".modal-header",containment:"document"}),$div},morpheus.FormBuilder.hasChanged=function(object,keyToUIElement){for(var keys=_.keys(keyToUIElement),i=0;i"),html.push('"),html.push("");var $div=$(html.join(""));return $div.on("mousewheel",function(e){e.stopPropagation()}),$div.find(".modal-body").html(options.html),$div.prependTo($(document.body)),$div.modal({backdrop:options.backdrop===!0}).on("hidden.bs.modal",function(e){$div.remove(),options.onClose&&options.onClose()}),$div},morpheus.FormBuilder.prototype={appendContent:function($content){this.$form.append($content)},addSeparator:function(){var html=[];html.push('
    '),this.vertical||html.push('
    '),html.push("
    "),this.vertical||html.push("
    "),html.push("
    "),this.$form.append(html.join(""))},_append:function(html,field,isFieldStart){var that=this,required=field.required,name=field.name,type=field.type;if("separator"==type)return html.push(this.vertical?'
    ':'
    '),html.push("
    "),void html.push("
    ");var title=field.title,disabled=field.disabled,help=field.help,value=field.value,showLabel=field.showLabel,col="";this.vertical||(col=field.col||"col-xs-8"),void 0===showLabel&&(showLabel="checkbox"!==type&&"button"!==type&&"radio"!==type,showLabel=showLabel||void 0!==field.options);var id=that.prefix+"_"+name;if(void 0===title&&(title=name.replace(/_/g," "),title=title[0].toUpperCase()+title.substring(1)),showLabel?(html.push('"),isFieldStart&&html.push('
    ')):isFieldStart&&!this.vertical&&html.push('
    '),"radio"===type)field.options?_.each(field.options,function(choice){var isChoiceObject=_.isObject(choice)&&void 0!==choice.value,optionValue=isChoiceObject?choice.value:choice,optionText=isChoiceObject?choice.name:choice,selected=value===optionValue;html.push('
    ")}):(html.push('
    "));else if("checkbox"===type)html.push('
    ");else if("checkbox-list"===type)html.push('
    ');else if("select"==type||"bootstrap-select"==type)"bootstrap-select"==type?html.push('"),"bootstrap-select"==field.type&&field.toggle&&(html.push('

    All | None

    '),that.$form.on("click","[name="+name+"_all]",function(evt){evt.preventDefault();var $select=that.$form.find("[name="+name+"]");$select.selectpicker("val",$.map($select.find("option"),function(o){return $(o).val()})),$select.trigger("change")}),that.$form.on("click","[name="+name+"_none]",function(evt){evt.preventDefault();var $select=that.$form.find("[name="+name+"]");$select.selectpicker("val",[]),$select.trigger("change")}));else if("textarea"==type)html.push('");else if("button"==type)html.push('");else if("custom"===type)html.push(value);else if("file"===type){html.push('"),field.url!==!1&&(html.push("
    "),html.push(''),html.push("
    ")),html.push(''),that.$form.on("change","[name="+name+"_picker]",function(evt){var $this=$(this),val=$this.val(),showTextInput="URL"===val;if("Dropbox"===val){var options={success:function(files){that.setValue(name,files[0].link),that.trigger("change",{name:name,value:files[0].link})},linkType:"direct",multiselect:!1};Dropbox.choose(options)}else"My Computer"===val&&that.$form.find("[name="+name+"_file]").click();that.$form.find("[name="+name+"_text]").css("display",showTextInput?"":"none")}),that.$form.on("keyup","[name="+name+"_text]",function(evt){var text=$.trim($(this).val());that.setValue(name,text),13===evt.which&&that.trigger("change",{name:name,value:text})}),that.$form.on("change","[name="+name+"_file]",function(evt){var files=evt.target.files;that.setValue(name,files[0]),that.trigger("change",{name:name,value:files[0]})})}else type=null==type?"text":type,"div"===type?html.push('
    "),"div"===type&&html.push("
    ");void 0!==help&&(html.push(''),html.push(help),html.push(""))},append:function(fields){var html=[],that=this,isArray=morpheus.Util.isArray(fields);isArray||(fields=[fields]),html.push('
    '),_.each(fields,function(field,index){that._append(html,field,0===index)}),html.push("
    "),html.push("
    ");var $div=$(html.join(""));this.$form.append($div);var checkBoxLists=$div.find(".checkbox-list");if(checkBoxLists.length>0){var checkBoxIndex=0;_.each(fields,function(field){if("checkbox-list"===field.type){var list=new morpheus.CheckBoxList({responsive:!1,$el:$(checkBoxLists[checkBoxIndex]),items:field.options});$(checkBoxLists[checkBoxIndex]).data("morpheus.checkbox-list",list),checkBoxIndex++}})}$div.find(".selectpicker").selectpicker({iconBase:"fa",tickIcon:"fa-check",style:"btn-default btn-sm"})},clear:function(){this.$form.empty()},getValue:function(name){var $v=this.$form.find("[name="+name+"]");return 0===$v.length&&($v=this.$form.find("[name="+name+"_picker]")),morpheus.FormBuilder.getValue($v)},setOptions:function(name,options,selectFirst){var $select=this.$form.find("[name="+name+"]"),checkBoxList=$select.data("morpheus.checkbox-list");if(checkBoxList)checkBoxList.setItems(options);else{var html=[],selection=$select.val();_.each(options,function(choice){html.push('")}),$select.html(html.join("")),$select.val(selection),selectFirst&&null==$select.val()&&$select[0].options.length>0&&$select.val($select[0].options[0].value),$select.hasClass("selectpicker")&&($select.selectpicker("refresh"),$select.selectpicker("render"))}},find:function(name){return this.$form.find("[name="+name+"]")},setHelpText:function(name,value){var v=this.$form.find("[name="+name+"_help]");v.html(value)},setValue:function(name,value){var v=this.$form.find("[name="+name+"]");if(0===v.length&&(v=this.$form.find("[name="+name+"_picker]"),"file"===v.attr("type")))return v.val(value),v.selectpicker("render"),v.data("files",value);var type=v.attr("type"),list=v.data("morpheus.checkbox-list");list?list.setValue(value):("radio"===type?v.filter("[value="+value+"]").prop("checked",!0):"checkbox"===type?v.prop("checked",value):v.val(value),v.hasClass("selectpicker")&&v.selectpicker("render"))},setVisible:function(name,visible){var $div=this.$form.find("[name="+name+"]").parents(".form-group");visible?$div.show():$div.hide()},remove:function(name){var $div=this.$form.find("[name="+name+"]").parents(".form-group");$div.remove()},setEnabled:function(name,enabled){var $div=this.$form.find("[name="+name+"]");$div.attr("disabled",!enabled),enabled?$div.parents(".form-group").find("label").removeClass("text-muted"):$div.parents(".form-group").find("label").addClass("text-muted")}},morpheus.Util.extend(morpheus.FormBuilder,morpheus.Events),morpheus.GradientColorSupplier=function(){morpheus.AbstractColorSupplier.call(this),this._updateScale()},morpheus.GradientColorSupplier.prototype={createInstance:function(){return new morpheus.GradientColorSupplier},getColor:function(row,column,value){if(isNaN(value))return this.missingColor;var min=this.min,max=this.max,colors=this.colors;if(min>=value)return colors[0];if(value>=max)return colors[colors.length-1];var fraction=morpheus.SteppedColorSupplier.linearScale(value,min,max,0,100)/100;return this.colorScale(fraction)},setFractions:function(options){morpheus.AbstractColorSupplier.prototype.setFractions.call(this,options),this._updateScale()},_updateScale:function(){this.colorScale=d3.scale.linear().domain(this.fractions).range(this.colors).clamp(!0)}},morpheus.Util.extend(morpheus.GradientColorSupplier,morpheus.AbstractColorSupplier),morpheus.Grid=function(options){function getItemColumnValue(item,column){return column.getter(item)}this.options=options;var grid,_this=this;this.items=options.items,this.modelToView=null,this.viewOrder=null;var model={getLength:function(){return null!=_this.viewOrder?_this.viewOrder.length:_this.items.length},getItem:function(index){return _this.items[null!=_this.viewOrder?_this.viewOrder[index]:index]}};this.$el=options.$el;var gridOptions=$.extend({},{select:!0,headerRowHeight:0,showHeaderRow:!1,multiColumnSort:!0,multiSelect:!1,topPanelHeight:0,enableTextSelectionOnCells:!0,forceFitColumns:!0,dataItemColumnValueExtractor:getItemColumnValue,defaultFormatter:function(row,cell,value,columnDef,dataContext){if(_.isNumber(value))return morpheus.Util.nf(value);if(morpheus.Util.isArray(value)){for(var s=[],i=0,length=value.length;length>i;i++){i>0&&s.push(", ");value[i];s.push(value[i])}return s.join("")}return value}},options.gridOptions||{});if(grid=new Slick.Grid(options.$el,model,options.columns,gridOptions),this.grid=grid,grid.registerPlugin(new morpheus.AutoTooltips2),grid.onCellChange.subscribe(function(e,args){_this.trigger("edit",args)}),gridOptions.select&&(grid.setSelectionModel(new Slick.RowSelectionModel({selectActiveRow:!0,multiSelect:gridOptions.multiSelect})),grid.getSelectionModel().onSelectedRangesChanged.subscribe(function(e){var nitems=grid.getDataLength();_this.trigger("selectionChanged",{selectedRows:grid.getSelectedRows().filter(function(row){return row>=0&&nitems>=row})})})),grid.onSort.subscribe(function(e,args){_this.sortCols=args.sortCols,_this._updateMappings(),grid.invalidate()}),options.$el.on("click",function(e){var cell=grid.getCellFromEvent(e);cell&&_this.trigger("click",{row:cell.row,target:e.target})}),options.$el.on("dblclick",function(e){var cell=grid.getCellFromEvent(e);cell&&_this.trigger("dblclick",{row:cell.row,target:e.target})}),options.sort){var gridSortColumns=[],gridColumns=grid.getColumns(),sortCols=[];options.sort.forEach(function(c){for(var column=null,i=0;i=0&&nitems>=row})},getSelectedItems:function(){for(var rows=this.grid.getSelectedRows(),selection=[],i=0,nrows=rows.length;nrows>i;i++)selection.push(this.items[this.convertViewIndexToModel(rows[i])]);return selection},getSelectedItem:function(){var rows=this.grid.getSelectedRows();return 1===rows.length?this.items[this.convertViewIndexToModel(rows[0])]:null},getItems:function(){for(var items=[],i=0,length=this.getFilteredItemCount();length>i;i++)items.push(this.items[this.convertViewIndexToModel(i)]);return items},getAllItemCount:function(){return this.items.length},getAllItems:function(){return this.items},getFilteredItemCount:function(){return this.viewOrder?this.viewOrder.length:this.items.length},redraw:function(){this.grid.invalidate()},redrawRows:function(rows){this.grid.invalidateRows(rows),this.grid.render()},setItems:function(items){this.items=items,this.grid.getSelectionModel()&&this.grid.setSelectedRows([]),this.setFilter(this.filter),this.columnsAutosized||this.autosizeColumns()},convertModelIndexToView:function(modelIndex){if(null!==this.modelToView){var index=this.modelToView.get(modelIndex);return void 0!==index?index:-1}return modelIndex},convertViewIndexToModel:function(viewIndex){return null!=this.viewOrder?viewIndex=0?this.viewOrder[viewIndex]:-1:viewIndex},_updateMappings:function(){var selectedViewIndices=null!=this.grid.getSelectionModel()?this.grid.getSelectedRows():null,selectedModelIndices=[];if(selectedViewIndices)for(var i=0,length=selectedViewIndices.length;length>i;i++)selectedModelIndices.push(this.convertViewIndexToModel(selectedViewIndices[i]));if(this.viewOrder=null,null!=this.filter){this.viewOrder=[];for(var i=0,length=this.items.length;length>i;i++)this.filter(this.items[i])&&this.viewOrder.push(i)}var cols=this.sortCols;if(cols&&cols.length>0){if(null==this.viewOrder){this.viewOrder=[];for(var i=0,length=this.items.length;length>i;i++)this.viewOrder.push(i)}var ncols=cols.length,items=this.items;this.viewOrder.sort(function(index1,index2){for(var i=0;ncols>i;i++){var getter=cols[i].sortCol.getter,sign=cols[i].sortAsc?1:-1,value1=getter(items[index1]),value2=getter(items[index2]),comparator=cols[i].sortCol.comparator,result=comparator(value1,value2)*sign;if(0!==result)return result}return 0})}if(null!=this.viewOrder){this.modelToView=new morpheus.Map;for(var i=0,length=this.viewOrder.length;length>i;i++)this.modelToView.set(this.viewOrder[i],i)}else this.modelToView=null;if(null!=this.grid.getSelectionModel()){for(var newSelectedViewIndices=[],i=0,length=selectedModelIndices.length;length>i;i++){var index=this.convertModelIndexToView(selectedModelIndices[i]);void 0!==index&&newSelectedViewIndices.push(index)}this.grid.setSelectedRows(newSelectedViewIndices)}},setSelectedRows:function(rows){this.grid.setSelectedRows(rows)},setFilter:function(filter){this.filter=filter,this._updateMappings(),this.grid.invalidate(),this.trigger("filter")},getFilter:function(){return this.filter},autosizeColumns:function(){this.columnsAutosized=!0;var columns=this.grid.getColumns(),items=this.getItems();if(columns&&!(columns.length<=1)){var div=document.createElement("div");document.body.appendChild(div);var $d=$(div);$d.css({position:"absolute",left:-1e3,top:-1e3});var $row=$('
    '),$cell=$row.find(".slick-cell");$row.appendTo($d);for(var gridWidth=this.options.$el.width(),maxWidth=Math.min(parseInt(gridWidth/2),400),getColumnWidth=function(column){$cell.html(column.name);var w=Math.max($cell.outerWidth(),4);if(column.prototypeValue)$cell.html(column.prototypeValue),w=Math.max($cell.outerWidth(),w);else for(var i=0,nrows=Math.min(items.length,10);nrows>i;i++){var text=column.formatter(i,null,column.getter(items[i]),column,items[i]);$cell.html(text),w=Math.max($cell.outerWidth(),w)}column.width=parseInt(Math.min(maxWidth,w))},totalWidth=0,i=0;itotalWidth||totalWidth>gridWidth&&(columns[columns.length-1].width-=totalWidth-gridWidth),$d.remove(),this.grid.resizeCanvas()}}},morpheus.Util.extend(morpheus.Grid,morpheus.Events),morpheus.AutoTooltips2=function(options){function init(grid){_grid=grid,$(_grid.getCanvasNode()).on("mouseover",".slick-row",showToolTip),$(_grid.getCanvasNode()).on("mouseout",".slick-row",hideToolTip),$(_grid.getCanvasNode()).on("mouseup",hideAll)}function destroy(){$(_grid.getCanvasNode()).off("mouseover",showToolTip),$(_grid.getCanvasNode()).off("mouseout",hideToolTip),$(_grid.getCanvasNode()).off("mouseup",hideAll)}function hideToolTip(e){var cell=_grid.getCellFromEvent(e);if(cell){var $node=$(_grid.getCellNode(cell.row,cell.cell));$node.data("bs.tooltip")&&$node.tooltip("hide")}}function hideAll(){$(_grid.getCanvasNode()).find("[data-original-title]").attr("data-original-title","").tooltip("hide")}function showToolTip(e){var cell=_grid.getCellFromEvent(e);if(cell){var $node=$(_grid.getCellNode(cell.row,cell.cell)),text="",c=_grid.getColumns()[cell.cell],show=!1;if(c.alwaysShowTooltip||$node[0].scrollWidth>$node[0].offsetWidth){var item=_grid.getDataItem(cell.row);text=c.tooltip(item,c.getter(item)),show=!0}$node.attr("data-original-title",text);var hasTip=$node.data("bs.tooltip");hasTip||$node.tooltip({placement:"auto",html:!0,container:"body",trigger:"manual"}),show?$node.tooltip("show"):hasTip&&$node.tooltip("hide")}}var _grid;$.extend(this,{init:init,destroy:destroy})},morpheus.HeatMap=function(options){morpheus.Util.loadTrackingCode();var _this=this;options=$.extend(!0,{},{el:null,dataset:void 0,rowAnnotations:void 0,columnAnnotations:void 0,columnGroupBy:void 0,rowGroupBy:void 0,colorScheme:void 0,rowSortBy:void 0,columnSortBy:void 0,rowDendrogram:void 0,columnDendrogram:void 0,columnDendrogramField:"id",rowDendrogramField:"id",rows:[],columns:[],tools:void 0,rowFilter:void 0,columnFilter:void 0,customUrls:void 0,height:"window",width:void 0,inheritFromParent:!0,inheritFromParentOptions:{transpose:!1},structureUrlProvider:void 0,promises:void 0,renderReady:void 0,datasetReady:void 0,loadedCallback:void 0,name:void 0,rowsSortable:!0,columnsSortable:!0,popupEnabled:!0,symmetric:!1,keyboard:!0,inlineTooltip:!0,$loadingImage:$('
    Loading...
    '),toolbar:{zoom:!0,tools:!0,searchRows:!0,searchColumns:!0,sort:!0,options:!0,saveImage:!0,saveDataset:!0,openFile:!0,filter:!0,colorKey:!0,searchValues:!1}},options),this.options=options,this.tooltipProvider=morpheus.HeatMapTooltipProvider,options.el?this.$el=$(options.el):this.$el=$("
    "),options.landingPage||(options.landingPage=new morpheus.LandingPage,options.landingPage.$el.prependTo(this.$el)),this.options.name||(this.options.name=morpheus.Util.getBaseFileName(morpheus.Util.getFileName(this.options.dataset.file?this.options.dataset.file:this.options.dataset)));null==this.options.parent;if(null==this.options.parent){this.tabManager=this.options.tabManager?this.options.tabManager:new morpheus.TabManager({landingPage:this.options.landingPage});var $a=$('');$a.tooltip({placement:"auto"});var $right=$('
    ');$a.appendTo($right),(new morpheus.HelpMenu).$el.appendTo($right),$right.appendTo(this.tabManager.$nav),this.options.tabManager||(this.tabManager.$nav.appendTo(this.$el),this.tabManager.$tabContent.appendTo(this.$el))}else this.options.inheritFromParent&&(this.popupItems=this.options.parent.popupItems,this.options.tabOpened||(this.options.tabOpened=this.options.parent.options.tabOpened),this.options.drawCallback=this.options.parent.options.drawCallback),this.tabManager=this.options.parent.tabManager;this.$content=$("
    "),this.$content.css({width:"100%","user-select":"none","-webkit-user-select":"none","-webkit-user-drag":"none","-webkit-tap-highlight-color":"rgba(0, 0, 0, 0)","-moz-user-select":"none","-moz-user-drag":"none","-moz-tap-highlight-color":"rgba(0, 0, 0, 0)","-ms-user-select":"none","-ms-user-drag":"none","-ms-tap-highlight-color":"rgba(0, 0, 0, 0)","-o-user-select":"none","-o-user-drag":"none","-o-tap-highlight-color":"rgba(0, 0, 0, 0)","overflow-x":"visible","overflow-y":"visible"});var tab=this.tabManager.add({$el:this.$content,closeable:!0,rename:!0,title:this.options.name,object:this,focus:!0});options.$loadingImage&&options.$loadingImage.appendTo(this.$content),this.tabId=tab.id,this.$tabPanel=tab.$panel,this.options.dataSource=options.dataset?options.dataset.file?options.dataset.file:options.dataset:"",this._togglingInfoWindow=!1,this.tooltipMode=0;var promises=[];if(options.promises)for(var i=0;iCause: "),message.push(err.message)),morpheus.FormBuilder.showInModal({title:"Error",html:message.join("")})}),promises.push(deferred),$.when.apply($,promises).then(function(){_this.options.$loadingImage&&_this.options.$loadingImage.remove(),_this._init(),heatMapLoaded()})}},morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS=6,morpheus.HeatMap.showTool=function(tool,controller,callback){if(tool.gui){var gui=tool.gui(controller.getProject()),formBuilder=new morpheus.FormBuilder;_.each(gui,function(item){formBuilder.append(item)});var tabId=controller.getTabManager().getActiveTabId();tool.init&&tool.init(controller.getProject(),formBuilder,{controller:controller});var $formDiv,okCallback=function(){var task={name:tool.toString(),tabId:tabId};controller.getTabManager().addTask(task);var input={};_.each(gui,function(item){input[item.name]=formBuilder.getValue(item.name)}),setTimeout(function(){try{var value=tool.execute({controller:controller,project:controller.getProject(),input:input});if(value instanceof Worker){value.onerror=function(e){task.worker.terminate(),morpheus.FormBuilder.showInModal({title:"Error",html:e,close:"Close"}),e.stack&&console.log(e.stack)};var terminate=_.bind(value.terminate,value);task.worker=value,value.terminate=function(){terminate();try{controller.getTabManager().removeTask(task)}catch(x){console.log("Error removing task")}callback&&callback(input)}}else callback&&callback(input)}catch(e){morpheus.FormBuilder.showInModal({title:"Error",html:e,close:"Close"}),e.stack&&console.log(e.stack)}finally{if(void 0===task.worker)try{controller.getTabManager().removeTask(task)}catch(x){console.log("Error removing task")}tool.dispose&&tool.dispose()}},0)};tool.ok=function(){okCallback(),$formDiv.modal("hide")};var guiOptions=$.extend({},{ok:!0},gui.options);$formDiv=morpheus.FormBuilder.showOkCancel({title:tool.toString(),apply:tool.apply,ok:guiOptions.ok,size:guiOptions.size,draggable:!0,content:formBuilder.$form,align:"right",okCallback:okCallback})}else try{tool.execute({controller:controller,project:controller.getProject(),input:{}});callback&&callback({})}catch(e){morpheus.FormBuilder.showInModal({title:"Error",html:e,close:"Close"}),e.stack&&console.log(e.stack)}finally{tool.dispose&&tool.dispose()}morpheus.Util.trackEvent({eventCategory:"Tool",eventAction:tool.toString()})},morpheus.HeatMap.getSpaces=function(groupByKeys,length,gapSize){for(var previousArray=[],nkeys=groupByKeys.length,keyIndex=0;nkeys>keyIndex;keyIndex++){var key=groupByKeys[keyIndex];previousArray.push(key.getValue(0))}var spaces=[],sum=0;spaces.push(sum);for(var i=1;length>i;i++){for(var isEqual=!0,keyIndex=0;nkeys>keyIndex;keyIndex++){var key=groupByKeys[keyIndex],comparator=key.getComparator(),val=key.getValue(i),c=comparator(val,previousArray[keyIndex]);if(0!==c){isEqual=!1;for(var keyIndex2=0;nkeys>keyIndex2;keyIndex2++)previousArray[keyIndex2]=groupByKeys[keyIndex2].getValue(i);break}}isEqual||(sum+=gapSize),spaces.push(sum)}return spaces},morpheus.HeatMap.createGroupBySpaces=function(dataset,groupByKeys,gapSize){if(groupByKeys.length>0){for(var nkeys=groupByKeys.length,keyIndex=0;nkeys>keyIndex;keyIndex++)groupByKeys[keyIndex].init(dataset);return morpheus.HeatMap.getSpaces(groupByKeys,dataset.getRowCount(),gapSize)}},morpheus.HeatMap.isDendrogramVisible=function(project,isColumns){var sortKeys=isColumns?project.getColumnSortKeys():project.getRowSortKeys(),size=isColumns?project.getSortedFilteredDataset().getColumnCount():project.getSortedFilteredDataset().getRowCount();return 1===sortKeys.length?sortKeys[0]instanceof morpheus.SpecifiedModelSortOrder&&"dendrogram"===sortKeys[0].name&&sortKeys[0].nvisible===size:void 0},morpheus.HeatMap.prototype={gapSize:10,updatingScroll:!1,autoDisplay:function(options){null==options.filename&&(options.filename="");var colorScheme;if("segtab"===options.extension||"seg"===options.extension)colorScheme={type:"fixed",map:morpheus.HeatMapColorScheme.Predefined.CN().map.map(function(item){return{value:Math.pow(2,1+item.value),color:item.color}})};else if("maf"===options.extension){colorScheme=morpheus.HeatMapColorScheme.Predefined.MAF();var colorMap=morpheus.HeatMapColorScheme.Predefined.MAF().map,rowMutProfile=this.project.getFullDataset().getRowMetadata().getByName("mutation_summary"),columnMutProfile=this.project.getFullDataset().getColumnMetadata().getByName("mutation_summary"),track=this.getTrack("mutation_summary",!1);track&&track.settingFromConfig("stacked_bar"),track=this.getTrack("mutation_summary",!0),track&&track.settingFromConfig("stacked_bar");for(var i=1;ii;i++){var key=existingSortKeys[i];if(key instanceof morpheus.SortByValuesKey&&morpheus.Util.arrayEquals(key.modelIndices,modelIndices)){priorSortKeyIndex=i,key.getSortOrder()===morpheus.SortKey.SortOrder.UNSORTED?sortOrder=morpheus.SortKey.SortOrder.DESCENDING:key.getSortOrder()===morpheus.SortKey.SortOrder.DESCENDING?sortOrder=morpheus.SortKey.SortOrder.ASCENDING:key.getSortOrder()===morpheus.SortKey.SortOrder.ASCENDING?sortOrder=morpheus.SortKey.SortOrder.TOP_N:key.getSortOrder()===morpheus.SortKey.SortOrder.TOP_N&&(sortOrder=morpheus.SortKey.SortOrder.UNSORTED);break}}null==sortOrder&&(sortOrder=morpheus.SortKey.SortOrder.DESCENDING);var sortKeys;if(append)sortKeys=isColumns?project.getRowSortKeys():project.getColumnSortKeys(),-1!==priorSortKeyIndex?sortOrder===morpheus.SortKey.SortOrder.UNSORTED?sortKeys.splice(priorSortKeyIndex,1):sortKeys[priorSortKeyIndex].setSortOrder(sortOrder):sortOrder!==morpheus.SortKey.SortOrder.UNSORTED&&sortKeys.push(new morpheus.SortByValuesKey(modelIndices,sortOrder,!isColumns)),sortKeys=morpheus.SortKey.keepExistingSortKeys(sortKeys,isColumns?project.getRowSortKeys():project.getColumnSortKeys());else{var newSortKeys=sortOrder===morpheus.SortKey.SortOrder.UNSORTED?[]:[new morpheus.SortByValuesKey(modelIndices,sortOrder,!isColumns)];sortKeys=morpheus.SortKey.keepExistingSortKeys(newSortKeys,isColumns?project.getRowSortKeys():project.getColumnSortKeys())}isColumns?(project.setRowSortKeys(sortKeys,!0),this.scrollTop(0)):(project.setColumnSortKeys(sortKeys,!0),this.scrollLeft(0))}},getToolbarElement:function(){return this.toolbar.$el},getToolbar:function(){return this.toolbar},setName:function(name){this.options.name=name},getName:function(){return this.options.name},showOptions:function(){new morpheus.HeatMapOptions(this)},getProject:function(){return this.project},setDendrogram:function(tree,isColumns,viewIndices){var dendrogram=isColumns?this.columnDendrogram:this.rowDendrogram;if(dendrogram&&(dendrogram.dispose(),dendrogram=null),null!=tree){for(var modelIndices=[],modelIndexSet=new morpheus.Set,size=isColumns?this.project.getFullDataset().getColumnCount():this.project.getFullDataset().getRowCount(),i=0;size>i;i++)modelIndexSet.add(i);for(var i=0,length=viewIndices.length;length>i;i++){var modelIndex=isColumns?this.project.convertViewColumnIndexToModel(viewIndices[i]):this.project.convertViewRowIndexToModel(viewIndices[i]);modelIndices.push(modelIndex),modelIndexSet.remove(modelIndex)}var nvisible=modelIndices.length;if(modelIndexSet.size()>0)for(var indices=modelIndexSet.values(),i=0,length=indices.length;length>i;i++)modelIndices.push(indices[i]);isColumns?(dendrogram=new morpheus.ColumnDendrogram(this,tree,this.heatmap.getColumnPositions(),this.project),dendrogram.filter=this.project.getColumnFilter().shallowClone(),this.columnDendrogram=dendrogram,this.project.setColumnSortKeys([new morpheus.SpecifiedModelSortOrder(modelIndices,nvisible,"dendrogram")],!0)):(dendrogram=new morpheus.RowDendrogram(this,tree,this.heatmap.getRowPositions(),this.project),dendrogram.filter=this.project.getRowFilter().shallowClone(),this.rowDendrogram=dendrogram,this.project.setRowSortKeys([new morpheus.SpecifiedModelSortOrder(modelIndices,nvisible,"dendrogram")],!0)),dendrogram.appendTo(this.$parent),dendrogram.$label.appendTo(this.$parent),dendrogram.$squishedLabel.appendTo(this.$parent)}else{for(var sortKeys=isColumns?this.project.getColumnSortKeys():this.project.getRowSortKeys(),i=0;i0){var tipText=[],dataset=project.getSortedFilteredDataset(),rowTracks=_this.rowTracks.filter(function(t){return t.settings.inlineTooltip}),columnTracks=_this.columnTracks.filter(function(t){return t.settings.inlineTooltip});return selectedViewIndices.forEach(function(id){var rowIndex=id.getArray()[0],columnIndex=id.getArray()[1];tipText.push(morpheus.Util.nf(dataset.getValue(rowIndex,columnIndex))),rowTracks.forEach(function(track){tipText.push(" "),tipText.push(morpheus.Util.formatObject(dataset.getRowMetadata().getByName(track.name).getValue(rowIndex)))}),columnTracks.forEach(function(track){tipText.push(" "),tipText.push(morpheus.Util.formatObject(dataset.getColumnMetadata().getByName(track.name).getValue(columnIndex)))}),tipText.push("\n")}),tipText.join("")}},_init:function(){function reorderTracks(array,isColumns){var nameOrderPairs=[],found=!1;if(_.each(array,function(item){var name=item.renameTo||item.field,order=999;null!=item.order&&(order=item.order,found=!0),nameOrderPairs.push({name:name,order:order})}),found){nameOrderPairs.sort(function(a,b){return a.order===b.order?0:a.order
    ").css("position","relative"),this.$parent.appendTo(this.$content),this.toolbar=new morpheus.HeatMapToolBar(this),this.options.customUrls&&this.setCustomUrls(this.options.customUrls),this.vscroll=new morpheus.ScrollBar(!0),this.vscroll.appendTo(this.$parent),this.vscroll.on("scroll",function(){_this.updatingScroll||_this.paintAll({paintRows:!0,paintColumns:!1,invalidateRows:!0,invalidateColumns:!1})}),this.beforeColumnTrackDivider=new morpheus.Divider(!1),this.beforeColumnTrackDivider.appendTo(this.$parent);var dragStartHeight=0;this.beforeColumnTrackDivider.on("resizeStart",function(e){dragStartHeight=_this.columnDendrogram.getUnscaledHeight()}).on("resize",function(e){var newHeight=Math.max(8,dragStartHeight+e.delta);_this.columnDendrogram.setPrefHeight(newHeight),_this.revalidate()}).on("resizeEnd",function(){dragStartHeight=0}),this.afterRowDendrogramDivider=new morpheus.Divider(!0),this.afterRowDendrogramDivider.appendTo(this.$parent);var rowDendrogramStartWidth=0;this.afterRowDendrogramDivider.on("resizeStart",function(e){rowDendrogramStartWidth=_this.rowDendrogram.getUnscaledWidth()}).on("resize",function(e){var newWidth=Math.max(8,rowDendrogramStartWidth+e.delta);_this.rowDendrogram.setPrefWidth(newWidth),_this.revalidate()}).on("resizeEnd",function(){rowDendrogramStartWidth=0}),this.afterVerticalScrollBarDivider=new morpheus.Divider(!0),this.afterVerticalScrollBarDivider.appendTo(this.$parent);var resizeStartHeatMapWidth=0;this.afterVerticalScrollBarDivider.on("resizeStart",function(e){resizeStartHeatMapWidth=_this.heatmap.getUnscaledWidth()}).on("resize",function(e){_this.heatmap.prefWidth=resizeStartHeatMapWidth+e.delta,_this.revalidate()}),this.hscroll=new morpheus.ScrollBar(!1),this.hscroll.appendTo(this.$parent),this.hscroll.on("scroll",function(){_this.updatingScroll||_this.paintAll({paintRows:!1,paintColumns:!0,invalidateRows:!1,invalidateColumns:!0})});var heatmap=new morpheus.HeatMapElementCanvas(this.project);this.options.drawCallback&&heatmap.setDrawCallback(this.options.drawCallback),$(heatmap.canvas).on("contextmenu",function(e){morpheus.Popup.showPopup([{name:"Copy",disabled:0===_this.project.getElementSelectionModel().count()},{name:"Save Image (Ctrl-S)"},{separator:!0},{name:"Show Inline Tooltip",checked:_this.options.inlineTooltip}],{x:e.pageX,y:e.pageY},e.target,function(event,item){if("Show Inline Tooltip"===item)_this.options.inlineTooltip=!_this.options.inlineTooltip;else if("Save Image (Ctrl-S)"===item)morpheus.HeatMap.showTool(new morpheus.SaveImageTool,_this);else{var text=_this.getSelectedElementsText();""!==text&&event.clipboardData.setData("text/plain",text)}}),e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation()}),heatmap.appendTo(this.$parent),this.heatmap=heatmap;var rowDendrogramSortKey=null;if(void 0!=rowDendrogram){var tree=rowDendrogram;if(tree.leafNodes.length!==this.project.getFullDataset().getRowCount())throw"# leaf nodes in row dendrogram "+tree.leafNodes.length+" != "+this.project.getFullDataset().getRowCount();if(null!=this.options.rowDendrogramField){for(var vector=dataset.getRowMetadata().getByName(this.options.rowDendrogramField),rowIndices=[],map=new morpheus.Map,re=/[,:]/g,j=0,size=vector.size();size>j;j++){var key=vector.getValue(j);map.set(key.replace(re,""),j)}for(var i=0,length=tree.leafNodes.length;length>i;i++){var index=map.get(tree.leafNodes[i].name);if(void 0===index)throw"Unable to find row dendrogram id "+tree.leafNodes[i].name+" in row annotations";rowIndices.push(index)}}else for(var i=0,length=tree.leafNodes.length;length>i;i++)rowIndices.push(i);this.rowDendrogram=new morpheus.RowDendrogram(this,tree,heatmap.getRowPositions(),this.project,!0),rowDendrogramSortKey=new morpheus.SpecifiedModelSortOrder(rowIndices,rowIndices.length,"dendrogram"),this.rowDendrogram.appendTo(this.$parent),this.rowDendrogram.$label.appendTo(this.$parent),this.rowDendrogram.$squishedLabel.appendTo(this.$parent)}var columnDendrogramSortKey=null;if(void 0!==columnDendrogram){var tree=columnDendrogram;if(tree.leafNodes.length!==this.project.getFullDataset().getColumnCount())throw"# leaf nodes "+tree.leafNodes.length+" != "+this.project.getFullDataset().getColumnCount();var columnIndices=[];if(null!=this.options.columnDendrogramField){for(var vector=dataset.getColumnMetadata().getByName(this.options.columnDendrogramField),map=new morpheus.Map,re=/[,:]/g,j=0,size=vector.size();size>j;j++){var key=vector.getValue(j);map.set(key.replace(re,""),j)}for(var i=0,length=tree.leafNodes.length;length>i;i++){var index=map.get(tree.leafNodes[i].name);if(void 0===index)throw"Unable to find column dendrogram id "+tree.leafNodes[i].name+" in column annotations";columnIndices.push(index)}}else for(var i=0,length=tree.leafNodes.length;length>i;i++)columnIndices.push(i);this.columnDendrogram=new morpheus.ColumnDendrogram(this,tree,heatmap.getColumnPositions(),this.project,!0),columnDendrogramSortKey=new morpheus.SpecifiedModelSortOrder(columnIndices,columnIndices.length,"dendrogram"),this.columnDendrogram.appendTo(this.$parent),this.columnDendrogram.$label.appendTo(this.$parent),this.columnDendrogram.$squishedLabel.appendTo(this.$parent)}if(null!==rowDendrogramSortKey&&this.project.setRowSortKeys([rowDendrogramSortKey]),null!==columnDendrogramSortKey&&this.project.setColumnSortKeys([columnDendrogramSortKey]),null!=this.options.rowGroupBy)for(var i=0;ii;i++){var display=displaySpecified?"None":void 0,v=isColumns?dataset.getColumnMetadata().get(i):dataset.getRowMetadata().get(i),name=v.getName(),option=nameToOption.get(name);if(!morpheus.MetadataUtil.DEFAULT_HIDDEN_FIELDS.has(name)||null!=option){var count=isColumns?dataset.getColumnCount():dataset.getRowCount();if(option||displaySpecified||!(count>1)||morpheus.VectorUtil.containsMoreThanOneValue(v)){null==option&&(option={}),option.title&&v.getProperties().set(morpheus.VectorKeys.TITLE,option.title),option.display&&(display="function"==typeof option.display?option.display(name):option.display);var add="None"!==display;if(add){isColumns&&null==display&&(display="pert_iname"===name||"id"===name||isFirst?"text":"color,highlight"),isFirst=!1;var track=isColumns?_this.addColumnTrack(name,display):_this.addRowTrack(name,display);if(track.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)&&option.color){var m=isColumns?_this.project.getColumnColorModel():_this.project.getRowColorModel();if(track.isDiscrete())_.each(options.color,function(p){m.setMappedValue(v,p.value,p.color)});else{var cs=m.createContinuousColorMap(v),min=Number.MAX_VALUE,max=-Number.MAX_VALUE;_.each(options.color,function(p){min=Math.min(min,p.value),max=Math.max(max,p.value)}),cs.setMin(min),cs.setMax(max);var valueToFraction=d3.scale.linear().domain([cs.getMin(),cs.getMax()]).range([0,1]).clamp(!0),fractions=[],colors=[];_.each(options.color,function(p){fractions.push(valueToFraction(p.value)),colors.push(p.color)}),cs.setFractions({fractions:fractions,colors:colors})}}if(track.isRenderAs(morpheus.VectorTrack.RENDER.SHAPE)&&option.shape){var m=isColumns?_this.project.getColumnShapeModel():_this.project.getRowShapeModel();_.each(options.shape,function(p){m.setMappedValue(v,p.value,p.shape)})}}}}}};setInitialDisplay(!1,this.options.rows),setInitialDisplay(!0,this.options.columns),reorderTracks(this.options.rows,!1),reorderTracks(this.options.columns,!0);var colorSchemeSpecified=null!=this.options.colorScheme;if(null==this.options.colorScheme){var ext="";if(this.options.dataSource)try{ext=morpheus.Util.getExtension(morpheus.Util.getFileName(this.options.dataSource))}catch(x){}var colorScheme=this.autoDisplay({extension:ext});null==colorScheme&&(colorScheme={type:"relative"}),this.options.colorScheme=colorScheme;var name=this.project.getFullDataset().getName();if("maf"===ext&&!this.options.rowSortBy){var sortKeys=[];this.project.getFullDataset().getRowMetadata().getByName("order")&&sortKeys.push(new morpheus.SortKey("order",morpheus.SortKey.SortOrder.ASCENDING)),sortKeys.push(new morpheus.SortKey("id",morpheus.SortKey.SortOrder.ASCENDING)),this.project.setRowSortKeys(sortKeys,!1)}-1!==morpheus.DatasetUtil.getSeriesIndex(this.project.getFullDataset(),"allelic_fraction")&&(this.options.sizeBy="allelic_fraction")}if(this.options.parent&&this.options.inheritFromParent&&!colorSchemeSpecified)heatmap.setColorScheme(this.options.parent.heatmap.getColorScheme().copy(this.project));else if(heatmap.setColorScheme(new morpheus.HeatMapColorScheme(this.project,this.options.colorScheme)),null!=this.options.dataset.getRowMetadata().getByName("Source")){var sourcesSet=morpheus.VectorUtil.getSet(this.options.dataset.getRowMetadata().getByName("Source"));this.heatmap.getColorScheme().setSeparateColorSchemeForRowMetadataField("Source"),sourcesSet.forEach(function(source){_this.autoDisplay({extension:morpheus.Util.getExtension(source),filename:""+source})})}if(this.options.sizeBy&&heatmap.getColorScheme().getSizer().setSeriesName(this.options.sizeBy),this.updateDataset(),this.options.uiReady&&this.options.uiReady(this),this.options.tabOpened){try{this.options.tabOpened(this)}catch(x){console.log("Error in tabOpened"),x.stack&&console.log(x.stack)}this.updateDataset()}if(this.options.renderReady){try{this.options.renderReady(this)}catch(x){console.log("Error in renderReady"),x.stack&&console.log(x.stack)}this.updateDataset()}null!=this.options.rowSize&&("fit"===this.options.rowSize?this.heatmap.getRowPositions().setSize(this.getFitRowSize()):this.heatmap.getRowPositions().setSize(this.options.rowSize),this.revalidate({paint:!1})),null!=this.options.columnSize&&("fit"===this.options.columnSize?this.heatmap.getColumnPositions().setSize(this.getFitColumnSize()):this.heatmap.getColumnPositions().setSize(this.options.columnSize),this.revalidate({paint:!1})),null!=this.options.rowSize&&null!=this.options.columnSize&&("fit"===this.options.columnSize&&(this.heatmap.getColumnPositions().setSize(this.getFitColumnSize()),this.revalidate({paint:!1})),"fit"===this.options.rowSize&&(this.heatmap.getRowPositions().setSize(this.getFitRowSize()),this.revalidate({paint:!1})),this.paintAll({paintRows:!0,paintColumns:!0,invalidateRows:!0,invalidateColumns:!0})),this.options.parent=null,this.$tipFollow=$('
    '),this.$tipFollow.appendTo(this.$parent),this.$tipInfoWindow=$('
    '),this.$tipInfoWindow.appendTo(this.$parent),this.$tipInfoWindow.dialog({close:function(event,ui){_this._togglingInfoWindow||_this.toggleInfoWindow()},autoOpen:!1,width:220,height:280,minHeight:38,minWidth:10,collision:"fit",position:{my:"right-30 bottom",at:"right top",of:this.$parent},title:"Info"}),this.getProject().on("rowFilterChanged columnFilterChanged rowGroupByChanged columnGroupByChanged rowSortOrderChanged columnSortOrderChanged datasetChanged",function(e){if("datasetChanged"===e.type){for(var dataset=_this.getProject().getFullDataset(),i=0;i<_this.rowTracks.length;i++){var track=_this.rowTracks[i];dataset.getRowMetadata().getByName(track.getName())||(_this.removeTrack(track.getName(),!1),i--)}for(var i=0;i<_this.columnTracks.length;i++){var track=_this.columnTracks[i];dataset.getColumnMetadata().getByName(track.getName())||(_this.removeTrack(track.getName(),!0),i--)}}_this.updateDataset(),_this.revalidate()}),this.getProject().on("trackChanged",function(e){var columns=e.columns;_.each(e.vectors,function(v,i){var index=_this.getTrackIndex(v.getName(),columns);if(-1===index)columns?_this.addColumnTrack(v.getName(),e.render[i]):_this.addRowTrack(v.getName(),e.render[i]);else{var track=_this.getTrackByIndex(index,columns),render=e.render[i];render&&track.settingFromConfig(render),track.setInvalid(!0)}}),_this.revalidate()}),this.getProject().on("rowTrackRemoved",function(e){_this.removeTrack(e.vector.getName(),!1),_this.revalidate()}),this.getProject().on("columnTrackRemoved",function(e){_this.removeTrack(e.vector.getName(),!0),_this.revalidate()}),this.getProject().getRowSelectionModel().on("selectionChanged",function(){for(var i=0;i<_this.columnTracks.length;i++){var track=_this.columnTracks[i];track.settings.stackedBar&&track.isRenderAs(morpheus.VectorTrack.RENDER.BAR)&&(track.setInvalid(!0),track.repaint())}_this.verticalSearchBar.update(),_this.paintAll({paintRows:!0,paintColumns:!1,invalidateRows:!1,invalidateColumns:!1})}),this.getProject().getColumnSelectionModel().on("selectionChanged",function(){_this.horizontalSearchBar.update(),_this.paintAll({paintRows:!1,paintColumns:!0,invalidateRows:!1,invalidateColumns:!1})}),$(window).on("paste.morpheus",function(e){if(_this.isActiveComponent()){var text=e.originalEvent.clipboardData.getData("text/plain");if(null!=text&&text.length>0){var blob=new Blob([text]),url=window.URL.createObjectURL(blob);e.preventDefault(),e.stopPropagation(),morpheus.HeatMap.showTool(new morpheus.OpenFileTool({file:url}),_this)}}}).on("beforecopy.morpheus",function(e){_this.isActiveComponent()&&e.preventDefault()}).on("copy.morpheus",function(ev){if(_this.isActiveComponent()){var activeComponent=_this.getActiveComponent(),project=_this.project;if(2===activeComponent){var text=_this.getSelectedElementsText();if(""!==text)return ev.originalEvent.clipboardData.setData("text/plain",text),ev.preventDefault(),void ev.stopImmediatePropagation()}var dataset=project.getSelectedDataset({emptyToAll:!1}),columnMetadata=dataset.getColumnMetadata(),rowMetadata=dataset.getRowMetadata(),visibleColumnFields=_this.getVisibleTrackNames(!0),columnFieldIndices=[];_.each(visibleColumnFields,function(name){var index=morpheus.MetadataUtil.indexOf(columnMetadata,name);-1!==index&&columnFieldIndices.push(index)}),columnMetadata=new morpheus.MetadataModelColumnView(columnMetadata,columnFieldIndices);var rowMetadata=dataset.getRowMetadata(),visibleRowFields=_this.getVisibleTrackNames(!1),rowFieldIndices=[];_.each(visibleRowFields,function(name){ +var index=morpheus.MetadataUtil.indexOf(rowMetadata,name);-1!==index&&rowFieldIndices.push(index)}),rowMetadata=new morpheus.MetadataModelColumnView(rowMetadata,rowFieldIndices);var text=[],rowsSelected=dataset.getRowCount()>0,columnsSelected=dataset.getColumnCount()>0;if(rowsSelected&&columnsSelected)text=(new morpheus.GctWriter).write(dataset);else{for(var text=[],model=rowsSelected?rowMetadata:columnMetadata,i=0,count=model.getItemCount();count>i;i++){for(var j=0,nfields=model.getMetadataCount();nfields>j;j++){var v=model.get(j);j>0&&text.push(" "),text.push(morpheus.Util.toString(v.getValue(i)))}text.push("\n")}text=text.join("")}ev.originalEvent.clipboardData.setData("text/plain",text),ev.preventDefault(),ev.stopImmediatePropagation()}}),this.options.keyboard&&new morpheus.HeatMapKeyListener(this);var dragStartScrollTop,dragStartScrollLeft;this.hammer=morpheus.Util.hammer(_this.heatmap.canvas,["pan","pinch","tap"]).on("panmove",function(event){_this.updatingScroll=!0;var rows=!1,columns=!1;if(0!==event.deltaY){var pos=dragStartScrollTop+event.deltaY;_this.scrollTop(pos),rows=!0}if(0!==event.deltaX){var pos=dragStartScrollLeft+event.deltaX;_this.scrollLeft(pos),columns=!0}_this.updatingScroll=!1,_this.paintAll({paintRows:rows,paintColumns:rows,invalidateRows:rows,invalidateColumns:columns}),event.preventDefault()}).on("panstart",function(event){dragStartScrollTop=_this.scrollTop(),dragStartScrollLeft=_this.scrollLeft()}).on("tap",function(event){var commandKey=morpheus.Util.IS_MAC?event.srcEvent.metaKey:event.srcEvent.ctrlKey;if(!morpheus.Util.IS_MAC||!event.srcEvent.ctrlKey){var position=morpheus.CanvasUtil.getMousePosWithScroll(event.target,event,_this.scrollLeft(),_this.scrollTop()),rowIndex=_this.heatmap.getRowPositions().getIndex(position.y,!1),columnIndex=_this.heatmap.getColumnPositions().getIndex(position.x,!1);_this.project.getElementSelectionModel().click(rowIndex,columnIndex,event.srcEvent.shiftKey||commandKey)}}).on("pinch",function(event){var scale=event.scale;_this.heatmap.getRowPositions().setSize(13*scale),_this.heatmap.getColumnPositions().setSize(13*scale);var reval={};-1!==_this.project.getHoverRowIndex()&&(reval.scrollTop=this.heatmap.getRowPositions().getPosition(this.project.getHoverRowIndex())),-1!==_this.project.getHoverColumnIndex()&&(reval.scrollLeft=this.heatmap.getColumnPositions().getPosition(this.project.getHoverColumnIndex())),_this.revalidate(reval),event.preventDefault()});var heatMapMouseMoved=function(event){var mouseI,mouseJ;if("mouseout"===event.type)mouseI=-1,mouseJ=-1;else{var position=morpheus.CanvasUtil.getMousePosWithScroll(event.target,event,_this.scrollLeft(),_this.scrollTop());mouseI=_this.heatmap.getRowPositions().getIndex(position.y,!1),mouseJ=_this.heatmap.getColumnPositions().getIndex(position.x,!1)}_this.setMousePosition(mouseI,mouseJ,{event:event})};$(_this.heatmap.canvas).on("mouseout",heatMapMouseMoved).on("mousemove",heatMapMouseMoved),_.each(this.options.tools,function(item){var tool=_this.toolbar.getToolByName(item.name);if(null==tool)console.log(item.name+" not found.");else try{var gui=tool.gui(_this.getProject()),formBuilder=new morpheus.FormBuilder;_.each(gui,function(item){formBuilder.append(item)});var input={};if(_.each(gui,function(item){input[item.name]=formBuilder.getValue(item.name)}),item.params)for(var key in item.params)input[key]=item.params[key];tool.execute({controller:_this,project:_this.getProject(),input:input})}catch(x){x.stack&&console.log(x.stack),console.log("Error running "+item.name)}finally{tool.dispose&&tool.dispose()}})},setMousePosition:function(i,j,options){this.mousePositionOptions=options;var updateColumns=this.project.getHoverColumnIndex()!==j,updateRows=this.project.getHoverRowIndex()!==i;updateColumns||updateRows?(this.project.setHoverRowIndex(i),this.project.setHoverColumnIndex(j),this.setToolTip(i,j,options),this.paintAll({paintRows:updateRows,paintColumns:updateColumns,invalidateRows:!1,invalidateColumns:!1})):this._updateTipFollowPosition(options),this.trigger("change",{name:"setMousePosition",source:this,arguments:arguments})},setTooltipMode:function(mode){this._togglingInfoWindow=!0,this.tooltipMode=mode,this.$tipInfoWindow.html(""),this.toolbar.$tip.html(""),this.$tipFollow.html("").css({left:-1e3,top:-1e3}),this.setToolTip(-1,-1),1===this.tooltipMode?this.$tipInfoWindow.dialog("open"):this.$tipInfoWindow.dialog("close"),this._togglingInfoWindow=!1},toggleInfoWindow:function(){this.setTooltipMode(1==this.tooltipMode?0:1)},setToolTip:function(rowIndex,columnIndex,options){options=options||{},this.options.showSeriesNameInTooltip&&(options.showSeriesNameInTooltip=!0);var tipText=this.tooltipProvider(this,rowIndex,columnIndex,options,0===this.tooltipMode?"   ":"
    "),tipFollowText="";this.options.inlineTooltip&&(tipFollowText=this.tooltipProvider(this,rowIndex,columnIndex,options,"
    ",!0)),0===this.tooltipMode?this.toolbar.$tip.html(tipText):1===this.tooltipMode&&this.$tipInfoWindow.html(tipText),""!==tipFollowText?(this.tipFollowHidden=!1,this.$tipFollow.html(tipFollowText),this._updateTipFollowPosition(options)):(this.tipFollowHidden=!0,this.$tipFollow.html("").css({left:-1e3,top:-1e3})),this.trigger("change",{name:"setToolTip",source:this,arguments:arguments})},_updateTipFollowPosition:function(options){if(!this.tipFollowHidden){var rect=this.$parent[0].getBoundingClientRect(),tipWidth=this.$tipFollow.width(),tipHeight=this.$tipFollow.height(),left=options.event.clientX-rect.left+16;left+tipWidth>=rect.right&&(left=options.event.clientX-rect.left-16-tipWidth);var top=options.event.clientY-rect.top+16;top+tipHeight>=rect.bottom-rect.top&&(top=options.event.clientY-rect.top-16-tipHeight),this.$tipFollow.css({left:left,top:top})}},setTrackVisibility:function(tracks){var _this=this;_.each(tracks,function(track){var existingTrack=_this.getTrack(track.name,track.isColumns);track.visible&&null!=existingTrack&&0===_.keys(existingTrack.renderSettings).length&&existingTrack.settingFromConfig(track.isColumns?"Color":"Text"),_this.setTrackVisible(track.name,track.visible,track.isColumns)}),this.revalidate(),this.trigger("change",{name:"setTrackVisibility",source:this,arguments:arguments})},setTrackVisible:function(name,visible,isColumns){var trackIndex=this.getTrackIndex(name,isColumns);if(-1===trackIndex){if(!visible)return;isColumns?this.addColumnTrack(name):this.addRowTrack(name)}else{var track=isColumns?this.columnTracks[trackIndex]:this.rowTracks[trackIndex],header=isColumns?this.columnTrackHeaders[trackIndex]:this.rowTrackHeaders[trackIndex];if(track.isVisible()===visible)return;track.setVisible(visible),header.setVisible(visible)}this.trigger("change",{name:"setTrackVisible",source:this,arguments:arguments})},addRowTrack:function(name,renderSettings){if(void 0===name)throw"Name not specified";if("None"!==renderSettings){null==renderSettings&&(renderSettings="[number]"===morpheus.VectorUtil.getDataType(this.project.getFullDataset().getRowMetadata().getByName(name))?"bar":morpheus.VectorTrack.RENDER.TEXT);var track=new morpheus.VectorTrack(this.project,name,this.heatmap.getRowPositions(),!1,this);track.settingFromConfig(renderSettings),this.rowTracks.push(track),track.appendTo(this.$parent),$(track.canvas).css("z-index","0");var header=new morpheus.VectorTrackHeader(this.project,name,!1,this);return this.rowTrackHeaders.push(header),header.appendTo(this.$parent),$(header.canvas).css("z-index","0"),track._selection=new morpheus.TrackSelection(track,this.heatmap.getRowPositions(),this.project.getRowSelectionModel(),!1,this),track}},addTrack:function(name,isColumns,renderSettings){isColumns?this.addColumnTrack(name,renderSettings):this.addRowTrack(name,renderSettings)},addColumnTrack:function(name,renderSettings){if(void 0===name)throw"Name not specified";if("None"!==renderSettings){null==renderSettings&&(renderSettings="[number]"===morpheus.VectorUtil.getDataType(this.project.getFullDataset().getColumnMetadata().getByName(name))?"bar":morpheus.VectorTrack.RENDER.TEXT);var track=new morpheus.VectorTrack(this.project,name,this.heatmap.getColumnPositions(),!0,this);track.settingFromConfig(renderSettings),this.columnTracks.push(track),track.appendTo(this.$parent);var header=new morpheus.VectorTrackHeader(this.project,name,!0,this);return this.columnTrackHeaders.push(header),header.appendTo(this.$parent),track._selection=new morpheus.TrackSelection(track,this.heatmap.getColumnPositions(),this.project.getColumnSelectionModel(),!0,this),track}},addPopup:function(item){this.popupItems||(this.popupItems=[]),this.popupItems.push(item)},getPopupItems:function(){return this.popupItems||[]},removeTrack:function(name,isColumns){var index=this.getTrackIndex(name,isColumns),tracks=isColumns?this.columnTracks:this.rowTracks;if(isNaN(index)||0>index||index>=tracks.length)return void console.log("removeTrack: "+name+" not found.");var headers=isColumns?this.columnTrackHeaders:this.rowTrackHeaders,track=tracks[index],header=headers[index];track.dispose(),track._selection.dispose(),header.dispose(),tracks.splice(index,1),headers.splice(index,1),this.trigger("change",{name:"removeTrack",source:this,arguments:arguments})},updateDataset:function(){var dataset=this.project.getSortedFilteredDataset();this.verticalSearchBar.update(),this.horizontalSearchBar.update(),this.heatmap.setDataset(dataset),this.heatmap.getRowPositions().spaces=morpheus.HeatMap.createGroupBySpaces(dataset,this.project.getGroupRows(),this.gapSize),this.heatmap.getColumnPositions().spaces=morpheus.HeatMap.createGroupBySpaces(new morpheus.TransposedDatasetView(dataset),this.project.getGroupColumns(),this.gapSize),this.trigger("change",{name:"updateDataset",source:this,arguments:arguments})},zoom:function(isZoomIn,options){options=$.extend({},{rows:!0,columns:!0},options),isZoomIn?(options.rows&&this.heatmap.getRowPositions().setSize(1.5*this.heatmap.getRowPositions().getSize()),options.columns&&this.heatmap.getColumnPositions().setSize(1.5*this.heatmap.getColumnPositions().getSize())):(options.rows&&this.heatmap.getRowPositions().setSize(this.heatmap.getRowPositions().getSize()/1.5),options.columns&&this.heatmap.getColumnPositions().setSize(this.heatmap.getColumnPositions().getSize()/1.5));var reval={};options.rows&&-1!==this.project.getHoverRowIndex()&&(reval.scrollTop=this.heatmap.getRowPositions().getPosition(this.project.getHoverRowIndex())),options.columns&&-1!==this.project.getHoverColumnIndex()&&(reval.scrollLeft=this.heatmap.getColumnPositions().getPosition(this.project.getHoverColumnIndex())),this.revalidate(reval),this.trigger("change",{name:"zoom",source:this,arguments:arguments})},getTrackIndex:function(name,isColumns){for(var tracks=isColumns?this.columnTracks:this.rowTracks,i=0,length=tracks.length;length>i;i++)if(void 0!==tracks[i].name&&tracks[i].name===name)return i;return-1},getNumTracks:function(isColumns){return isColumns?this.columnTracks.length:this.rowTracks.length},moveTrack:function(index,newIndex,isColumns){var tracks=isColumns?this.columnTracks:this.rowTracks,headers=isColumns?this.columnTrackHeaders:this.rowTrackHeaders,track=tracks[index];tracks.splice(index,1);var header=headers[index];headers.splice(index,1),tracks.splice(newIndex,0,track),headers.splice(newIndex,0,header),this.trigger("change",{name:"moveTrack",source:this,arguments:arguments})},getTrackByIndex:function(index,isColumns){return isColumns?this.columnTracks[index]:this.rowTracks[index]},getTrackHeaderByIndex:function(index,isColumns){return isColumns?this.columnTrackHeaders[index]:this.rowTrackHeaders[index]},getTrack:function(name,isColumns){var index=this.getTrackIndex(name,isColumns);if(-1!==index)return isColumns?this.columnTracks[index]:this.rowTracks[index]},isActiveComponent:function(){var active=document.activeElement,tagName=active.tagName;return"INPUT"==tagName||"SELECT"==tagName||"TEXTAREA"==tagName?!1:this.$tabPanel[0].contains(active)},getActiveComponent:function(){var active=document.activeElement;if("CANVAS"===active.tagName){for(var i=0,ntracks=this.columnTracks.length;ntracks>i;i++)if(this.columnTracks[i].canvas===active)return 1;for(var i=0,ntracks=this.rowTracks.length;ntracks>i;i++)if(this.rowTracks[i].canvas===active)return 0;if(this.heatmap.canvas===active)return 2}return-1},getVisibleTrackNames:function(isColumns){for(var names=[],tracks=isColumns?this.columnTracks:this.rowTracks,i=0,length=tracks.length;length>i;i++)tracks[i].isVisible()&&names.push(tracks[i].name);return names},resizeTrack:function(name,width,height,isColumns){var index=this.getTrackIndex(name,isColumns);if(-1===index)throw name+" not found in resize track";if(isColumns){var track=this.columnTracks[index],header=this.columnTrackHeaders[index];if(height&&(track.setPrefHeight(height),header.setPrefHeight(height)),width)for(var i=0;ii;i++){var track=this.rowTracks[i];track.setInvalid(invalidateRows),track.isVisible()&&(track.paint({x:0,y:y,height:unscaledHeight,width:unscaledWidth}),this.rowTrackHeaders[i].paint())}null!=this.rowDendrogram&&(this.rowDendrogram.setInvalid(invalidateRows),this.isDendrogramVisible(!1)?(this.rowDendrogram.setVisible(!0),this.rowDendrogram.paint({x:0,y:y,height:unscaledHeight,width:this.rowDendrogram.getUnscaledWidth()})):this.rowDendrogram.setVisible(!1))}if(columns){for(var i=0,length=this.columnTracks.length;length>i;i++){var track=this.columnTracks[i];track.setInvalid(invalidateColumns),track.paint({x:x,y:0,width:unscaledWidth,height:track.getUnscaledHeight()}),this.columnTrackHeaders[i].paint()}null!=this.columnDendrogram&&(this.columnDendrogram.setInvalid(invalidateColumns),this.isDendrogramVisible(!0)?(this.columnDendrogram.setVisible(!0),this.columnDendrogram.paint({x:x,y:0,width:unscaledWidth,height:this.columnDendrogram.getUnscaledHeight()})):this.columnDendrogram.setVisible(!1))}(invalidateRows||invalidateColumns)&&this.heatmap.setInvalid(!0),this.heatmap.paint({x:x,y:y,width:unscaledWidth,height:unscaledHeight}),this.trigger("change",{name:"paintAll",source:this,arguments:arguments})},scrollTop:function(pos){return void 0===pos?this.vscroll.getValue():(this.vscroll.setValue(pos,!0),void this.trigger("change",{name:"scrollTop",source:this,arguments:arguments}))},scrollLeft:function(pos){return void 0===pos?this.hscroll.getValue():(this.trigger("change",{name:"scrollLeft",source:this,arguments:arguments}),void this.hscroll.setValue(pos,!0))},setSelectedTrack:function(name,isColumns){if(name!==this.selectedTrackName||isColumns!==this.selectedTrackIsColumns){var index=this.getTrackIndex(this.selectedTrackName,this.selectedTrackIsColumns);-1!==index&&this.getTrackHeaderByIndex(index,this.selectedTrackIsColumns).setSelected(!1),this.selectedTrackName=name,this.selectedTrackIsColumns=isColumns;var index=this.getTrackIndex(this.selectedTrackName,this.selectedTrackIsColumns);-1!==index&&this.getTrackHeaderByIndex(index,this.selectedTrackIsColumns).setSelected(!0),this.trigger("change",{name:"setSelected",source:this,arguments:arguments})}},saveImage:function(file,format){var bounds=this.getTotalSize();if("svg"===format){var context=new C2S(bounds.width,bounds.height);this.snapshot(context);var svg=context.getSerializedSvg(),blob=new Blob([svg],{type:"text/plain;charset=utf-8"});saveAs(blob,file,!0)}else{var canvas=$("")[0],backingScale=morpheus.CanvasUtil.BACKING_SCALE,height=bounds.height*backingScale,width=bounds.width*backingScale;canvas.height=height,canvas.style.height=bounds.height+"px",canvas.width=width,canvas.style.width=bounds.width+"px",this.snapshot(canvas.getContext("2d")),canvas.toBlob(function(blob){if(0===blob.size)throw"Image is too large.";saveAs(blob,file,!0)})}},getTotalSize:function(options){options=$.extend({},{legend:!0},options);var heatmapPrefSize=this.heatmap.getPreferredSize(),totalSize={width:heatmapPrefSize.width,height:heatmapPrefSize.height};this.isDendrogramVisible(!1)&&(totalSize.width+=this.rowDendrogram.getUnscaledWidth()),this.isDendrogramVisible(!0)&&(totalSize.height+=this.columnDendrogram.getUnscaledHeight());for(var maxHeaderHeight=0,maxHeaderWidth=0,i=0,length=this.rowTracks.length;length>i;i++){var track=this.rowTracks[i];if(track.isVisible()){var headerSize=this.rowTrackHeaders[i].getPrintSize();totalSize.width+=Math.max(headerSize.width,track.getPrintSize().width),maxHeaderHeight=Math.max(maxHeaderHeight,headerSize.height)}}totalSize.height+=maxHeaderHeight;for(var i=0,length=this.columnTracks.length;length>i;i++){var track=this.columnTracks[i];track.isVisible()&&(totalSize.height+=track.getPrintSize().height,maxHeaderWidth=Math.max(maxHeaderWidth,this.columnTrackHeaders[i].getPrintSize().width))}if(maxHeaderWidth+=10,totalSize.width+=maxHeaderWidth,options.legend){var legendHeight=null!=this.heatmap.getColorScheme().getNames()?14*this.heatmap.getColorScheme().getNames().length:40;totalSize.height+=legendHeight}var trackLegendSize=new morpheus.HeatMapTrackColorLegend(_.filter(this.columnTracks,function(track){return track.isVisible()&&(track.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||track.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR))}),this.getProject().getColumnColorModel()).getPreferredSize();return totalSize.height+=trackLegendSize.height,totalSize.width=Math.max(totalSize.width,trackLegendSize.width),trackLegendSize=new morpheus.HeatMapTrackColorLegend(_.filter(this.rowTracks,function(track){return track.isVisible()&&(track.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||track.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR))}),this.getProject().getRowColorModel()).getPreferredSize(),totalSize.height+=trackLegendSize.height,totalSize.width=10+Math.max(totalSize.width,trackLegendSize.width),totalSize},getHeatMapElementComponent:function(){return this.heatmap},snapshot:function(context,options){options=$.extend({},{legend:!0},options);var heatmapPrefSize=this.heatmap.getPreferredSize(),legendHeight=(this.getTotalSize(options),0);options.legend&&(null!=this.heatmap.getColorScheme().getNames()?14*this.heatmap.getColorScheme().getNames().length:40,context.save(),context.translate(50,0),morpheus.HeatMapColorSchemeLegend.drawColorScheme(context,this.heatmap.getColorScheme(),200,!0),context.restore()),context.save(),context.translate(4,legendHeight);var columnTrackLegend=new morpheus.HeatMapTrackColorLegend(_.filter(this.columnTracks,function(track){return track.isVisible()&&(track.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||track.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR))}),this.getProject().getColumnColorModel());columnTrackLegend.draw({},context),context.restore();var columnTrackLegendSize=columnTrackLegend.getPreferredSize();context.save(),context.translate(4+columnTrackLegendSize.width,legendHeight);var rowTrackLegend=new morpheus.HeatMapTrackColorLegend(_.filter(this.rowTracks,function(track){return track.isVisible()&&(track.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||track.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR))}),this.getProject().getRowColorModel());rowTrackLegend.draw({},context),context.restore(),legendHeight+=Math.max(rowTrackLegend.getPreferredSize().height,columnTrackLegendSize.height);var heatmapY=this.isDendrogramVisible(!0)?this.columnDendrogram.getUnscaledHeight():0;heatmapY+=legendHeight+10;for(var heatmapX=this.isDendrogramVisible(!1)?this.rowDendrogram.getUnscaledWidth():0,totalColumnTrackHeight=0,i=0,length=this.columnTracks.length;length>i;i++){var track=this.columnTracks[i];if(track.isVisible()){var header=this.columnTrackHeaders[i];heatmapX=Math.max(heatmapX,header.getPrintSize().width);var height=track.getPrintSize().height;heatmapY+=height,totalColumnTrackHeight+=height}}heatmapX+=10;for(var i=0,length=this.rowTracks.length;length>i;i++){var track=this.rowTracks[i];if(track.isVisible()){var header=this.rowTrackHeaders[i];heatmapY=Math.max(heatmapY,header.getPrintSize().height)}}if(this.isDendrogramVisible(!1)){var rowDendrogramClip={x:0,y:0,width:this.rowDendrogram.getUnscaledWidth(),height:heatmapPrefSize.height};context.save(),context.translate(0,heatmapY),this.rowDendrogram.prePaint(rowDendrogramClip,context),this.rowDendrogram.draw(rowDendrogramClip,context),context.restore()}if(this.isDendrogramVisible(!0)){context.save(),context.translate(heatmapX,legendHeight);var columnDendrogramClip={x:0,y:0,width:heatmapPrefSize.width,height:this.columnDendrogram.getUnscaledHeight()};this.columnDendrogram.prePaint(columnDendrogramClip,context),this.columnDendrogram.draw(columnDendrogramClip,context),context.restore()}for(var columnTrackY=heatmapY-10-totalColumnTrackHeight,i=0,length=this.columnTracks.length;length>i;i++){var track=this.columnTracks[i];if(track.isVisible()){context.save();var tx=heatmapX;context.translate(tx,columnTrackY);var trackClip={x:0,y:0,width:heatmapPrefSize.width,height:track.getPrintSize().height};track.print(trackClip,context),context.restore();var header=this.columnTrackHeaders[i];context.save();var headerSize=header.getPrintSize(),headerClip={x:0,y:0,width:headerSize.width,height:headerSize.height};context.translate(tx-10,columnTrackY+trackClip.height),header.print(headerClip,context),context.restore(),columnTrackY+=Math.max(headerClip.height,trackClip.height)}}context.save(),context.translate(heatmapX,heatmapY),this.heatmap.draw({x:0,y:0,width:heatmapPrefSize.width,height:heatmapPrefSize.height},context),context.restore();for(var sum=0,i=0,length=this.rowTracks.length;length>i;i++){var track=this.rowTracks[i];if(track.isVisible()){context.save();var tx=10+heatmapX+heatmapPrefSize.width+sum,ty=heatmapY,trackClip={x:0,y:0,width:track.getPrintSize().width,height:heatmapPrefSize.height};context.translate(tx,ty),context.strokeStyle="white",context.rect(0,0,trackClip.width,trackClip.height),context.stroke(),context.clip(),track.print(trackClip,context),context.restore();var header=this.rowTrackHeaders[i];context.save();var headerSize=header.getPrintSize(),headerClip={x:0,y:0,width:headerSize.width,height:headerSize.height};context.translate(tx,ty-4),header.print(headerClip,context),context.restore(),sum+=Math.max(headerSize.width,trackClip.width)}}},resetZoom:function(){var heatmap=this.heatmap,rowSizes=heatmap.getRowPositions(),columnSizes=heatmap.getColumnPositions();rowSizes.setSize(13),columnSizes.setSize(13);var reval={};-1!==this.project.getHoverRowIndex()&&(reval.scrollTop=this.heatmap.getRowPositions().getPosition(this.project.getHoverRowIndex())),-1!==this.project.getHoverColumnIndex()&&(reval.scrollLeft=this.heatmap.getColumnPositions().getPosition(this.project.getHoverColumnIndex())),this.revalidate(reval)},getFitColumnSize:function(){var heatmap=this.heatmap,availablePixels=this.getAvailableWidth();this.rowDendrogram&&(availablePixels-=this.rowDendrogram.getUnscaledWidth());for(var trackPixels=12,i=0,length=this.rowTracks.length;length>i;i++){var track=this.rowTracks[i];track.isVisible()&&(trackPixels+=track.getUnscaledWidth())}for(var i=0,length=this.columnTracks.length;length>i;i++){var track=this.columnTracks[i];if(track.isVisible()){trackPixels+=this.columnTrackHeaders[i].getUnscaledWidth();break}}availablePixels-=trackPixels;var positions=heatmap.getColumnPositions(),totalCurrent=positions.getItemSize(positions.getLength()-1)+positions.getPosition(positions.getLength()-1),size=positions.getSize();return size*=availablePixels/totalCurrent,size=Math.min(13,size)},getFitRowSize:function(){var heatmap=this.heatmap,availablePixels=this.getAvailableHeight();this.columnDendrogram&&(availablePixels-=this.columnDendrogram.getUnscaledHeight());for(var trackPixels=12,i=0,length=this.columnTracks.length;length>i;i++){var track=this.columnTracks[i];track.isVisible()&&(trackPixels+=track.getUnscaledHeight())}availablePixels-=trackPixels;var positions=heatmap.getRowPositions(),totalCurrent=positions.getItemSize(positions.getLength()-1)+positions.getPosition(positions.getLength()-1),size=positions.getSize();return size*=availablePixels/totalCurrent,size=Math.min(13,size)},fitToWindow:function(repaint){if(this.heatmap.getRowPositions().setSize(this.getFitRowSize()),this.heatmap.getColumnPositions().setSize(this.getFitColumnSize()),repaint){var reval={};-1!==this.project.getHoverRowIndex()&&(reval.scrollTop=this.heatmap.getRowPositions().getPosition(this.project.getHoverRowIndex())),-1!==this.project.getHoverColumnIndex()&&(reval.scrollLeft=this.heatmap.getColumnPositions().getPosition(this.project.getHoverColumnIndex())),this.revalidate(reval)}},getAvailableHeight:function(){if(_.isNumber(this.options.height))return this.options.height;var height=$(window).height()-this.$parent.offset().top-24;return"window"===this.options.height?height:Math.max(Math.round(.7*screen.height),height)},getAvailableWidth:function(){return this.options.width?this.options.width:this.tabManager.getWidth()-30},revalidate:function(options){options=$.extend({},{paint:!0},options),this.updatingScroll=!0;var availableHeight=this.getAvailableHeight(),availableWidth=this.getAvailableWidth(),heatmapPrefSize=this.heatmap.getPreferredSize(),columnDendrogramHeight=0,rowDendrogramWidth=0;this.columnDendrogram&&(columnDendrogramHeight=morpheus.CanvasUtil.getPreferredSize(this.columnDendrogram).height),this.rowDendrogram&&(rowDendrogramWidth=morpheus.CanvasUtil.getPreferredSize(this.rowDendrogram).width);for(var rowTrackWidthSum=0,i=0,length=this.rowTracks.length;length>i;i++)this.rowTracks[i].isVisible()&&(rowTrackWidthSum+=Math.max(morpheus.CanvasUtil.getPreferredSize(this.rowTrackHeaders[i]).width,morpheus.CanvasUtil.getPreferredSize(this.rowTracks[i]).width));for(var ypos=columnDendrogramHeight,maxHeaderWidth=0,i=0,length=this.columnTracks.length;length>i;i++)if(this.columnTracks[i].isVisible()){var width=morpheus.CanvasUtil.getPreferredSize(this.columnTrackHeaders[i]).width;maxHeaderWidth=Math.max(maxHeaderWidth,width)}var xpos=Math.max(rowDendrogramWidth,maxHeaderWidth),heatMapWidth=heatmapPrefSize.width,maxHeatMapWidth=Math.max(50,availableWidth-rowTrackWidthSum-xpos-morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS);maxHeatMapWidth>0&&heatMapWidth>maxHeatMapWidth&&(heatMapWidth=maxHeatMapWidth,heatMapWidth=Math.min(heatMapWidth,heatmapPrefSize.width)),void 0!==this.heatmap.prefWidth&&(heatMapWidth=Math.min(heatmapPrefSize.width,this.heatmap.prefWidth)),void 0!==this.columnDendrogram?(this.columnDendrogram.setBounds({width:heatMapWidth,height:columnDendrogramHeight,left:xpos,top:0}),this.columnDendrogram.$label.css("left",xpos+this.columnDendrogram.getUnscaledWidth()+10).css("top",2),this.columnDendrogram.$squishedLabel.css("left",xpos+this.columnDendrogram.getUnscaledWidth()+10).css("top",18),this.beforeColumnTrackDivider.setVisible(!0),this.beforeColumnTrackDivider.setBounds({left:xpos-maxHeaderWidth,top:ypos,width:maxHeaderWidth}),ypos++):this.beforeColumnTrackDivider.setVisible(!1);for(var i=0,length=this.columnTracks.length;length>i;i++){var track=this.columnTracks[i];if(track.isVisible()){var size=morpheus.CanvasUtil.getPreferredSize(track),headerSize=morpheus.CanvasUtil.getPreferredSize(this.columnTrackHeaders[i]);size.height=Math.max(size.height,headerSize.height),track.setBounds({width:heatMapWidth,height:size.height,left:xpos,top:ypos}),this.columnTrackHeaders[i].setBounds({width:maxHeaderWidth,height:size.height,left:xpos-maxHeaderWidth,top:ypos}),ypos+=size.height}}ypos+=morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS;var heatMapHeight=heatmapPrefSize.height;heatMapHeight>availableHeight-ypos&&(heatMapHeight=Math.max(100,Math.min(heatmapPrefSize.height,availableHeight-ypos))),0>ypos&&(ypos=0),this.rowDendrogram?(this.rowDendrogram.setBounds({width:Math.max(rowDendrogramWidth,maxHeaderWidth),height:heatMapHeight,left:0,top:ypos}),this.rowDendrogram.$label.css("left",0).css("top",2),this.afterRowDendrogramDivider.setVisible(!0),this.afterRowDendrogramDivider.setBounds({height:heatMapHeight,left:this.rowDendrogram.getUnscaledWidth(),top:ypos}),xpos++):this.afterRowDendrogramDivider.setVisible(!1),this.heatmap.setBounds({width:heatMapWidth,height:heatMapHeight,left:xpos,top:ypos}),this.hSortByValuesIndicator.setBounds({height:4,width:heatMapWidth,left:xpos,top:ypos-4}),this.hscroll.setVisible(heatMapWidthi;i++){var track=this.rowTracks[i];if(track.isVisible()){nvisibleRowTracks++;break}}this.vSortByValuesIndicator.setBounds({width:4,height:heatMapHeight,left:xpos,top:ypos}),nvisibleRowTracks>0&&(xpos+=morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS);for(var rowAnnotationXStart=xpos,i=0,length=this.rowTracks.length;length>i;i++){var track=this.rowTracks[i];if(track.isVisible()){var size=morpheus.CanvasUtil.getPreferredSize(track),headerSize=morpheus.CanvasUtil.getPreferredSize(this.rowTrackHeaders[i]);size.width=Math.max(headerSize.width,size.width),size.height=heatMapHeight,track.setBounds({width:size.width,height:size.height,left:xpos,top:ypos}),this.rowTrackHeaders[i].setBounds({width:size.width,left:xpos,top:ypos-headerSize.height-5,height:headerSize.height}),xpos+=size.width}}this.afterVerticalScrollBarDivider.setVisible(nvisibleRowTracks>0),this.afterVerticalScrollBarDivider.setBounds({left:rowAnnotationXStart-2,top:ypos-18}),this.vscroll.setVisible(heatMapHeightj;j++){var d=this.datasetRowView.getValue(j);isNaN(d)||(this.rowCachedMax=d>this.rowCachedMax?d:this.rowCachedMax,this.rowCachedMin=d
    "),this.currentValue=null,this.legend=new morpheus.LegendWithStops,this.legend.on("added",function(e){var fractions=that.colorScheme.getFractions();fractions.push(e.fraction);var colors=that.colorScheme.getColors();colors.push("black"),that.colorScheme.setFractions({fractions:fractions,colors:colors}),that.setSelectedIndex(_.indexOf(fractions,e.fraction)),that.fireChanged()}).on("selectedIndex",function(e){that.setSelectedIndex(e.selectedIndex)}).on("delete",function(index){that.deleteSelectedStop()}).on("moved",function(e){var fraction=e.fraction,fractions=that.colorScheme.getFractions();fractions[that.legend.selectedIndex]=fraction,that.colorScheme.setFractions({fractions:fractions,colors:that.colorScheme.getColors()});var newIndex=that.colorScheme.getFractions().indexOf(fraction);-1!==newIndex&&(that.legend.selectedIndex=newIndex);var fractionToValue=d3.scale.linear().domain([0,1]).range([that.colorScheme.getMin(),that.colorScheme.getMax()]).clamp(!0);that.formBuilder.setValue("selected_value",fractionToValue(fractions[that.legend.selectedIndex])),that.fireChanged()});var $row=$("
    ");$row.css("height","50px").css("width","300px").css("margin-left","auto").css("margin-right","auto"),$row.appendTo(this.$div),this.colorScheme=null,$(this.legend.canvas).appendTo($row);var formBuilder=new morpheus.FormBuilder,items=[];items=items.concat({name:"selected_color",type:"color",col:"col-xs-2"},{name:"selected_value",type:"text",col:"col-xs-4"},[{name:"delete",type:"button",value:"Delete Selected Color Stop"},{name:"add",type:"button",value:"Add Color Stop"}],{name:"minimum",type:"text",col:"col-xs-4"},{name:"maximum",type:"text",col:"col-xs-4"}),options.showRelative&&(items=items.concat({name:"color_scheme",type:"radio",options:["fixed","relative"]})),items=items.concat({name:"missing_color",type:"color",col:"col-xs-2"}),items.push({name:"stepped_colors",type:"checkbox",value:!1,help:"Intervals include left end point and exclude right end point, except for the highest interval"}),_.each(items,function(item){formBuilder.append(item)}),this.$div.append(formBuilder.$form),formBuilder.$form.find("[name^=selected],[name=delete]").prop("disabled",!0),formBuilder.$form.find("[name=add]").on("click",function(e){for(var fractions=that.colorScheme.getFractions(),val=.5;val>=0&&-1!==_.indexOf(fractions,val);)val-=.1;val=Math.max(0,val),fractions.push(val);var colors=that.colorScheme.getColors();colors.push("black"),that.colorScheme.setFractions({fractions:fractions,colors:colors}),that.setSelectedIndex(_.indexOf(fractions,val)),that.fireChanged()}),formBuilder.$form.find("[name=delete]").on("click",function(e){that.deleteSelectedStop()}),formBuilder.$form.on("keyup","[name=selected_value]",_.debounce(function(e){var val=parseFloat($(this).val());isNaN(val)||(that.setSelectedValue(val),that.fireChanged())},100)),formBuilder.$form.on("change","[name=selected_color]",function(e){var colors=that.colorScheme.getColors();colors[that.legend.selectedIndex]=$(this).val(),that.colorScheme.setFractions({fractions:that.colorScheme.getFractions(),colors:colors}),that.fireChanged()}),formBuilder.$form.on("change","[name=missing_color]",function(e){var color=$(this).val();that.colorScheme.setMissingColor(color),that.fireChanged()}),formBuilder.$form.on("change","[name=stepped_colors]",function(e){that.colorScheme.setStepped($(this).prop("checked")),that.fireChanged()}),formBuilder.$form.on("keyup","[name=minimum]",_.debounce(function(e){var val=parseFloat($(this).val());isNaN(val)||(that.colorScheme.setMin(val),that.setSelectedIndex(that.legend.selectedIndex),that.fireChanged())},100)),formBuilder.$form.on("keyup","[name=maximum]",_.debounce(function(e){var val=parseFloat($(this).val());isNaN(val)||(that.colorScheme.setMax(val),that.setSelectedIndex(that.legend.selectedIndex),that.fireChanged())},100)),formBuilder.$form.on("change","[name=color_scheme]",_.throttle(function(e){that.legend.selectedIndex=-1;var val=$(this).val(),scalingMode="relative"===val?morpheus.HeatMapColorScheme.ScalingMode.RELATIVE:morpheus.HeatMapColorScheme.ScalingMode.FIXED;that.colorScheme.setScalingMode(scalingMode),that.setColorScheme(that.colorScheme),that.fireChanged()},100)),this.formBuilder=formBuilder},morpheus.HeatMapColorSchemeChooser.prototype={deleteSelectedStop:function(){var fractions=this.colorScheme.getFractions();fractions.splice(this.legend.selectedIndex,1);var colors=this.colorScheme.getColors();colors.splice(this.legend.selectedIndex,1),this.colorScheme.setFractions({fractions:fractions,colors:colors}),this.formBuilder.$form.find("[name^=selected],[name=delete]").prop("disabled",!0),this.legend.setSelectedIndex(-1),this.fireChanged()},setSelectedValue:function(val){var valueToFraction=d3.scale.linear().domain([this.colorScheme.getMin(),this.colorScheme.getMax()]).range([0,1]).clamp(!0),fractions=this.colorScheme.getFractions();fractions[this.legend.selectedIndex]=valueToFraction(val),this.colorScheme.setFractions({fractions:fractions,colors:this.colorScheme.getColors()})},setSelectedIndex:function(index){var fractions=this.colorScheme.getFractions();index>=fractions.length&&(index=-1),this.legend.setSelectedIndex(index);var formBuilder=this.formBuilder;if(formBuilder.$form.find("[name^=selected],[name=delete]").prop("disabled",-1===this.legend.selectedIndex),-1!==this.legend.selectedIndex){var fractionToValue=d3.scale.linear().domain([0,1]).range([this.colorScheme.getMin(),this.colorScheme.getMax()]).clamp(!0);formBuilder.setValue("selected_value",fractionToValue(fractions[this.legend.selectedIndex]));var context=this.legend.canvas.getContext("2d"),colors=this.colorScheme.getColors();context.fillStyle=colors[this.legend.selectedIndex],formBuilder.setValue("selected_color",context.fillStyle)}else formBuilder.setValue("selected_value","");this.draw()},setMinMax:function(){this.colorScheme.getScalingMode()===morpheus.HeatMapColorScheme.ScalingMode.RELATIVE&&(this.colorScheme.setMin(0),this.colorScheme.setMax(1))},dispose:function(){this.off("change"),this.legend.destroy(),this.formBuilder.$form.off("keyup","input"),this.formBuilder.$form.off("change","[name=color_scheme]")},restoreCurrentValue:function(){this.colorScheme.setCurrentValue&&this.colorScheme.setCurrentValue(this.currentValue)},setCurrentValue:function(value){this.currentValue=value,this.colorScheme.setCurrentValue&&this.colorScheme.setCurrentValue(this.currentValue),this.setColorScheme(this.colorScheme)},setColorScheme:function(colorScheme){this.colorScheme=colorScheme,this.setMinMax(),colorScheme.setCurrentValue&&colorScheme.setCurrentValue(this.currentValue),this.formBuilder.setValue("color_scheme",colorScheme.getScalingMode()===morpheus.HeatMapColorScheme.ScalingMode.RELATIVE?"relative":"fixed"),this.formBuilder.$form.find("[name=minimum],[name=maximum]").prop("disabled",colorScheme.getScalingMode()===morpheus.HeatMapColorScheme.ScalingMode.RELATIVE),this.formBuilder.setValue("minimum",this.colorScheme.getMin()),this.formBuilder.setValue("maximum",this.colorScheme.getMax()),this.formBuilder.setValue("stepped_colors",this.colorScheme.isStepped()),this.formBuilder.setValue("missing_color",this.colorScheme.getMissingColor()),this.draw()},getFractionToStopPix:function(){return d3.scale.linear().clamp(!0).domain([0,1]).range([this.legend.border,this.legend.getUnscaledWidth()-this.legend.border])},fireChanged:function(){this.trigger("change"),this.setColorScheme(this.colorScheme)},draw:function(){var colorScheme=this.colorScheme;colorScheme.getScalingMode()===morpheus.HeatMapColorScheme.ScalingMode.RELATIVE&&(colorScheme.setMin(0),colorScheme.setMax(1));var fractions=colorScheme.getFractions(),colors=colorScheme.getColors(),fractionToStopPix=this.getFractionToStopPix();this.legend.draw(fractions,colors,colorScheme.isStepped(),fractionToStopPix)}},morpheus.Util.extend(morpheus.HeatMapColorSchemeChooser,morpheus.Events),morpheus.HeatMapColorSchemeLegend=function(controller,$keyContent){var totalHeight,colorScheme=controller.heatmap.getColorScheme(),tracks=colorScheme.getColorByValues();$keyContent.empty();var ntracks=tracks.length;tracks.forEach(function(value){if(null!=value||1===ntracks){if("null"!=value){var $label=$(''+value+"");$keyContent.append($label),totalHeight+=$label.height()}var trackLegend=new morpheus.HeatMapColorSchemeLegendTrack(colorScheme,value);$(trackLegend.canvas).css("position",""),trackLegend.repaint(),trackLegend.on("selectionChanged",function(){controller.heatmap.setInvalid(!0),controller.heatmap.repaint()}),$keyContent.append($(trackLegend.canvas)),totalHeight+=trackLegend.getUnscaledHeight()}}),controller.options.$key&&($keyContent.append(controller.options.$key),totalHeight+=controller.options.$key.height());var $edit=$('');$edit.find("[name=options]").on("click",function(e){e.preventDefault(),controller.showOptions(),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"options"})}),totalHeight+=$edit.height(),$keyContent.append($edit),$keyContent.css({"text-overflow":"ellipsis",overflow:"hidden",width:"250px",height:totalHeight+"px"})},morpheus.HeatMapColorSchemeLegendTrack=function(colorScheme,value){morpheus.AbstractCanvas.call(this,!1);var _this=this;this.value=value,this.colorScheme=colorScheme,colorScheme.setCurrentValue(value);var hiddenValues=colorScheme.getHiddenValues(),names=colorScheme.getNames(),hasNames=null!=names,legendHeight=hasNames?14*names.length:30,bounds={width:250,height:legendHeight};this.hasNames=hasNames,this.setBounds(bounds),hasNames&&hiddenValues&&$(this.canvas).on("click",function(e){e.preventDefault(),e.stopPropagation();var clickedRow=Math.floor((e.clientY-_this.canvas.getBoundingClientRect().top)/14),fractionToValue=d3.scale.linear().domain([0,1]).range([colorScheme.getMin(),colorScheme.getMax()]).clamp(!0),fractions=colorScheme.getFractions(),value=fractionToValue(fractions[clickedRow]);hiddenValues.has(value)?hiddenValues.remove(value):hiddenValues.add(value),_this.trigger("selectionChanged"),_this.repaint()})},morpheus.HeatMapColorSchemeLegendTrack.prototype={draw:function(clip,context){var colorScheme=this.colorScheme;colorScheme.setCurrentValue(this.value),context.fillStyle="white",context.fillRect(0,0,this.getUnscaledWidth(),this.getUnscaledHeight()),context.translate(this.hasNames?14:(this.getUnscaledWidth()-200)/2,0),morpheus.HeatMapColorSchemeLegend.drawColorScheme(context,colorScheme,200)}},morpheus.Util.extend(morpheus.HeatMapColorSchemeLegendTrack,morpheus.AbstractCanvas),morpheus.Util.extend(morpheus.HeatMapColorSchemeLegendTrack,morpheus.Events),morpheus.HeatMapColorSchemeLegend.drawColorScheme=function(context,colorScheme,width,printing,hideText){var names=colorScheme.getNames(),hasNames=null!=names;if(hasNames)morpheus.HeatMapColorSchemeLegend.drawColorSchemeVertically(context,colorScheme,colorScheme.getHiddenValues(),printing);else{if(morpheus.HeatMapColorSchemeLegend.draw(context,colorScheme.getFractions(),colorScheme.getColors(),width,12,colorScheme.isStepped()),context.strokeStyle="LightGrey",context.strokeRect(0,0,width,12),hideText)return;var map=d3.scale.linear().domain([0,1]).range([0,width]).clamp(!0),fractionToValue=d3.scale.linear().domain([0,1]).range([colorScheme.getMin(),colorScheme.getMax()]).clamp(!0);if(context.textAlign="center",context.textBaseline="top",context.fillStyle="black",context.font="12px "+morpheus.CanvasUtil.FONT_NAME,colorScheme.getScalingMode()===morpheus.HeatMapColorScheme.ScalingMode.RELATIVE)context.fillText("row min",0,14),context.fillText("row max",width,14);else{for(var fractions=colorScheme.getFractions(),lastTextPixEnd=-1,halfway=parseInt(fractions.length/2),i=0;halfway>i;i++){var pix=map(fractions[i]),text="";text=hasNames?""!=names[i]?names[i]+" ("+fractionToValue(fractions[i])+")":names[i]:morpheus.Util.nf(fractionToValue(fractions[i]));var textWidth=context.measureText(text).width;pix>lastTextPixEnd&&context.fillText(text,pix,14),lastTextPixEnd=pix+textWidth/2}for(var lastTextPixStart=1e4,i=fractions.length-1;i>=halfway;i--){var pix=map(fractions[i]),text="";text=hasNames?""!=names[i]?names[i]+" ("+fractionToValue(fractions[i])+")":names[i]:morpheus.Util.nf(fractionToValue(fractions[i]));var textWidth=context.measureText(text).width;lastTextPixStart>pix&&(context.fillText(text,pix,14),lastTextPixStart=pix-textWidth/2)}}}},morpheus.HeatMapColorSchemeLegend.drawColorSchemeVertically=function(context,colorScheme,hiddenValues,printing){var fractionToValue=d3.scale.linear().domain([0,1]).range([colorScheme.getMin(),colorScheme.getMax()]).clamp(!0);context.textAlign="left",context.textBaseline="top",context.fillStyle="black";var fractions=colorScheme.getFractions(),colors=colorScheme.getColors(),names=colorScheme.getNames();context.strokeStyle="LightGrey";var xpix=0,ypix=0;context.font="12px "+morpheus.CanvasUtil.FONT_NAME;for(var i=0;ii;i++){context.fillStyle=colors[i];var x1=map(fractions[i]),x2=i===length-1?width:map(fractions[i+1]);context.fillRect(Math.min(x1,x2),0,Math.abs(x2-x1),height)}else{for(var gradient=context.createLinearGradient(0,0,width,height),i=0,length=fractions.length;length>i;i++)gradient.addColorStop(fractions[i],colors[i]);context.fillStyle=gradient,context.fillRect(0,0,width,height)}},morpheus.HeatMapColorSchemeLegend.prototype={},morpheus.HeatMapSynchronizer=function(){this.controllers=[]},morpheus.HeatMapSynchronizer.prototype={firing:!1,getProject:function(){return this.controllers[0].getProject()},zoom:function(){this.controllers[0].zoom.apply(this.controllers[0],arguments)},setTrackVisible:function(){this.controllers[0].setTrackVisible.apply(this.controllers[0],arguments)},revalidate:function(){this.controllers[0].revalidate.apply(this.controllers[0],arguments)},add:function(controller){var that=this;this.controllers.push(controller),controller.on("change",function(event){if(!that.firing){var source=event.source,method=event.name;that.firing=!0,_.each(that.controllers,function(c){c!==source&&c[method].apply(c,event.arguments)}),that.firing=!1}})}},morpheus.HeatMapElementCanvas=function(project){morpheus.AbstractCanvas.call(this,!0),this.colorScheme=null,this.project=project,this.dataset=null;var _this=this;this.columnPositions=new morpheus.Positions,this.rowPositions=new morpheus.Positions,this.lastPosition={left:-1,right:-1,top:-1,bottom:-1},project.getElementSelectionModel().on("selectionChanged",function(){_this.repaint()})},morpheus.HeatMapElementCanvas.GRID_COLOR="rgb(128,128,128)",morpheus.HeatMapElementCanvas.prototype={drawGrid:!0,getColorScheme:function(){return this.colorScheme},isDrawGrid:function(){return this.drawGrid},setDrawGrid:function(drawGrid){this.drawGrid=drawGrid},setColorScheme:function(colorScheme){this.colorScheme=colorScheme},setDataset:function(dataset){this.dataset=dataset,this.columnPositions.setLength(this.dataset.getColumnCount()),this.rowPositions.setLength(this.dataset.getRowCount())},getColumnPositions:function(){return this.columnPositions},getRowPositions:function(){return this.rowPositions},getPreferredSize:function(context){var w=Math.ceil(this.columnPositions.getPosition(this.columnPositions.getLength()-1)+this.columnPositions.getItemSize(this.columnPositions.getLength()-1)),h=Math.ceil(this.rowPositions.getPosition(this.rowPositions.getLength()-1)+this.rowPositions.getItemSize(this.rowPositions.getLength()-1));return{width:w,height:h}},prePaint:function(clip,context){var lastPosition=this.lastPosition,columnPositions=this.columnPositions,rowPositions=this.rowPositions,left=morpheus.Positions.getLeft(clip,columnPositions),right=morpheus.Positions.getRight(clip,columnPositions),top=morpheus.Positions.getTop(clip,rowPositions),bottom=morpheus.Positions.getBottom(clip,rowPositions);(this.invalid||left!==lastPosition.left||right!==lastPosition.right||top!==lastPosition.top||bottom!==lastPosition.bottom)&&(lastPosition.right=right,lastPosition.left=left,lastPosition.top=top,lastPosition.bottom=bottom,this.invalid=!0)},postPaint:function(clip,context){morpheus.CanvasUtil.resetTransform(context);var project=this.project;context.strokeStyle="Grey",context.lineWidth=1;var rowPositions=this.getRowPositions(),columnPositions=this.getColumnPositions();if(project.getHoverColumnIndex()>=0||project.getHoverRowIndex()>=0){var height=rowPositions.getItemSize(project.getHoverColumnIndex()),width=columnPositions.getItemSize(project.getHoverColumnIndex()),y=-1===project.getHoverRowIndex()?rowPositions.getPosition(rowPositions.getLength()-1):rowPositions.getPosition(project.getHoverRowIndex()),x=-1===project.getHoverColumnIndex()?columnPositions.getPosition(0):columnPositions.getPosition(project.getHoverColumnIndex());-1!==project.getHoverColumnIndex()&&context.strokeRect(x-clip.x,0,width,this.getUnscaledHeight()),-1!==project.getHoverRowIndex()&&context.strokeRect(0,y-clip.y,this.getUnscaledWidth(),height),-1!==project.getHoverColumnIndex()&&-1!==project.getHoverRowIndex()&&(context.strokeStyle="black",context.lineWidth=3,context.strokeRect(x-clip.x+1.5,y-clip.y+1.5,width-1.5,height-1.5))}var left=morpheus.Positions.getLeft(clip,columnPositions),right=morpheus.Positions.getRight(clip,columnPositions),top=morpheus.Positions.getTop(clip,rowPositions),bottom=morpheus.Positions.getBottom(clip,rowPositions);context.strokeStyle="rgb(182,213,253)",context.lineWidth=3,context.translate(-clip.x,-clip.y);var selectedElements=project.getElementSelectionModel().getViewIndices();null!=selectedElements&&selectedElements.forEach(function(id){var rowIndex=id.getArray()[0],columnIndex=id.getArray()[1];if(rowIndex>=top&&bottom>rowIndex&&columnIndex>=left&&right>columnIndex){var rowSize=rowPositions.getItemSize(rowIndex),py=rowPositions.getPosition(rowIndex),columnSize=columnPositions.getItemSize(columnIndex),px=columnPositions.getPosition(columnIndex);context.strokeRect(px+1.5,py+1.5,columnSize-1.5,rowSize-1.5)}})},setElementDrawCallback:function(elementDrawCallback){this._elementDrawCallback=elementDrawCallback},setDrawCallback:function(drawCallback){this.drawCallback=drawCallback},draw:function(clip,context){var columnPositions=this.columnPositions,rowPositions=this.rowPositions,left=morpheus.Positions.getLeft(clip,columnPositions),right=morpheus.Positions.getRight(clip,columnPositions),top=morpheus.Positions.getTop(clip,rowPositions),bottom=morpheus.Positions.getBottom(clip,rowPositions),dataset=this.dataset; +context.translate(-clip.x,-clip.y);for(var colorScheme=this.colorScheme,drawGrid=this.drawGrid,elementDrawCallback=this._elementDrawCallback,seriesNameToIndex={},i=0;irow;row++)for(var rowSize=rowPositions.getItemSize(row),py=rowPositions.getPosition(row),column=left;right>column;column++){var columnSize=columnPositions.getItemSize(column),px=columnPositions.getPosition(column);if(context.fillStyle=colorScheme.getColor(row,column,dataset.getValue(row,column)),column===left){sizer=colorScheme.getSizer(),sizeBySeriesName=sizer.getSeriesName(),sizeBySeriesIndex=null!=sizeBySeriesName?seriesNameToIndex[sizeBySeriesName]:void 0,conditionSeriesIndices=[],conditions=colorScheme.getConditions().getConditions();for(var ci=0,nconditions=conditions.length;nconditions>ci;ci++)conditionSeriesIndices.push(seriesNameToIndex[conditions[ci].series])}var yoffset=0,cellRowSize=rowSize;if(void 0!==sizeBySeriesIndex){var sizeByValue=dataset.getValue(row,column,sizeBySeriesIndex);if(!isNaN(sizeByValue)){var f=sizer.valueToFraction(sizeByValue),rowDiff=rowSize-rowSize*f;yoffset=rowDiff,cellRowSize-=rowDiff}}if(conditions.length>0){for(var condition=null,ci=0,nconditions=conditions.length;nconditions>ci;ci++){var cond=conditions[ci],condValue=dataset.getValue(row,column,conditionSeriesIndices[ci]);if(!isNaN(condValue)&&cond.accept(condValue)){condition=cond;break}}if(null!==condition){context.fillRect(px,py+yoffset,columnSize,cellRowSize);var x=px+cellRowSize/2,y=py+yoffset+columnSize/2;context.fillStyle=condition.color,morpheus.CanvasUtil.drawShape(context,condition.shape,x,y,Math.min(columnSize,cellRowSize)/4),context.fill()}else context.fillRect(px,py+yoffset,columnSize,cellRowSize)}else context.fillRect(px,py+yoffset,columnSize,cellRowSize);elementDrawCallback&&elementDrawCallback(context,dataset,row,column,px,py,columnSize,rowSize)}if(drawGrid){context.strokeStyle=morpheus.HeatMapElementCanvas.GRID_COLOR,context.lineWidth=.1;for(var row=top;bottom>row;row++)for(var rowSize=rowPositions.getItemSize(row),py=rowPositions.getPosition(row),column=left;right>column;column++){var columnSize=columnPositions.getItemSize(column),px=columnPositions.getPosition(column),grid=drawGrid&&columnSize>10&&rowSize>10;grid&&context.strokeRect(px,py,columnSize,rowSize)}}this.drawCallback&&this.drawCallback({context:context,dataset:dataset,top:top,bottom:bottom,left:left,right:right,rowPositions:rowPositions,columnPositions:columnPositions,project:this.project,clip:clip}),context.lineWidth=1,context.translate(clip.x,clip.y)}},morpheus.Util.extend(morpheus.HeatMapElementCanvas,morpheus.AbstractCanvas),morpheus.HeatMapKeyListener=function(controller){var keydown=function(e){var tagName=e.target.tagName;if("INPUT"!=tagName&&"SELECT"!=tagName&&"TEXTAREA"!=tagName){var found=!1,commandKey=morpheus.Util.IS_MAC?e.metaKey:e.ctrlKey,shiftKey=(e.altKey,e.shiftKey);if(commandKey&&65===e.which){var active=controller.getActiveComponent();if(-1!==active){found=!0;for(var selectionModel=0===active?controller.getProject().getRowSelectionModel():controller.getProject().getColumnSelectionModel(),count=0===active?controller.getProject().getSortedFilteredDataset().getRowCount():controller.getProject().getSortedFilteredDataset().getColumnCount(),indices=new morpheus.Set,i=0;count>i;i++)indices.add(i);selectionModel.setViewIndices(indices,!0),found=!0}}else if(61===e.which||187===e.which||107===e.which)controller.zoom(!0),found=!0;else if(173===e.which||189===e.which||109===e.which)controller.zoom(!1),found=!0;else if(35===e.which)controller.scrollLeft(controller.heatmap.getPreferredSize().width),controller.scrollTop(controller.heatmap.getPreferredSize().height),found=!0;else if(36===e.which)controller.scrollLeft(0),controller.scrollTop(0),found=!0;else if(34===e.which){var pos=controller.scrollTop();controller.scrollTop(pos+controller.heatmap.getUnscaledHeight()-2),found=!0}else if(33===e.which){var pos=controller.scrollTop();controller.scrollTop(pos-controller.heatmap.getUnscaledHeight()+2),found=!0}else 38===e.which?(commandKey?controller.scrollTop(0):controller.scrollTop(controller.scrollTop()-8),found=!0):40===e.which?(commandKey?controller.scrollTop(controller.heatmap.getPreferredSize().height):controller.scrollTop(controller.scrollTop()+8),found=!0):37===e.which?(commandKey?controller.scrollLeft(0):controller.scrollLeft(controller.scrollLeft()-8),found=!0):39===e.which?(commandKey?controller.scrollLeft(controller.heatmap.getPreferredSize().width):controller.scrollLeft(controller.scrollLeft()+8),found=!0):commandKey&&(83===e.which?(shiftKey?morpheus.HeatMap.showTool(new morpheus.SaveDatasetTool,controller):morpheus.HeatMap.showTool(new morpheus.SaveImageTool,controller),found=!0):79===e.which?(morpheus.HeatMap.showTool(new morpheus.OpenFileTool,controller),found=!0):70===e.which?(controller.getToolbarElement().find(e.shiftKey?"[name=searchColumns]":"[name=searchRows]").focus(),found=!0):88===e.which&&(morpheus.HeatMap.showTool(new morpheus.NewHeatMapTool,controller),found=!0));return found?(e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),!1):void 0}},$keyelement=controller.$content;$keyelement.on("keydown",keydown),$keyelement.on("dragover.morpheus dragenter.morpheus",function(e){e.preventDefault(),e.stopPropagation()}).on("drop.morpheus",function(e){if(e.originalEvent.dataTransfer&&e.originalEvent.dataTransfer.files.length){e.preventDefault(),e.stopPropagation();var files=e.originalEvent.dataTransfer.files;morpheus.HeatMap.showTool(new morpheus.OpenFileTool({file:files[0]}),controller)}}),$keyelement.on("paste.morpheus",function(e){var tagName=e.target.tagName;if("INPUT"!=tagName&&"SELECT"!=tagName&&"TEXTAREA"!=tagName){var text=e.originalEvent.clipboardData.getData("text/plain");if(null!=text&&text.length>0){e.preventDefault(),e.stopPropagation();var blob=new Blob([text]),url=window.URL.createObjectURL(blob);morpheus.HeatMap.showTool(new morpheus.OpenFileTool({file:url}),controller)}}}),$keyelement.on("mousewheel",function(e){var scrolly=e.deltaY*e.deltaFactor,scrollx=e.deltaX*e.deltaFactor;e.altKey?controller.zoom(scrolly>0,{rows:!0,columns:!0}):(0!==scrolly&&controller.scrollTop(controller.scrollTop()-scrolly),0!==scrollx&&controller.scrollLeft(controller.scrollLeft()-scrollx)),e.preventDefault(),e.stopPropagation()})},morpheus.HeatMapOptions=function(controller){function createMetadataField(isColumns){var options=[],value={},field={type:"bootstrap-select",name:isColumns?"column_annotations":"row_annotations",multiple:!0,value:value,options:options,toggle:!0};return _.each(controller.getVisibleTrackNames(isColumns),function(name){value[name]=!0}),_.each(morpheus.MetadataUtil.getMetadataNames(isColumns?controller.getProject().getFullDataset().getColumnMetadata():controller.getProject().getFullDataset().getRowMetadata()),function(name){options.push(name)}),field}function annotationsListener($select,isColumns){var names=[];_.each(controller.getVisibleTrackNames(isColumns),function(name){names.push(name)});var values=$select.val(),selectedNow=_.difference(values,names),unselectedNow=_.difference(names,values),tracks=[];_.each(selectedNow,function(name){tracks.push({name:name,isColumns:isColumns,visible:!0})}),_.each(unselectedNow,function(name){tracks.push({name:name,isColumns:isColumns,visible:!1})}),controller.setTrackVisibility(tracks),colorSchemeChooser.restoreCurrentValue()}var items=[{name:"color_by",required:!0,type:"select",options:["(None)"].concat(morpheus.MetadataUtil.getMetadataNames(controller.getProject().getFullDataset().getRowMetadata())),value:controller.heatmap.getColorScheme().getSeparateColorSchemeForRowMetadataField()},{name:"color_by_value",required:!0,type:"select",options:[]},{name:"load_predefined_scheme",required:!0,type:"select",options:[{name:"",value:""},{name:"relative",value:"gene"},{name:"binary",value:"binary"},{name:"MAF",value:"MAF"},{name:"fixed (-1.5, -0.1, 0.1, 1.5)",value:"cn"},{name:"fixed (-90, -80, 80, 90)",value:"100scale2"},{name:"fixed (-90, 90)",value:"100scale1"}]},{name:"save_color_scheme",type:"button"},{name:"load_color_scheme",type:"file"}];controller.getProject().getFullDataset().getSeriesCount()>1&&(items.push({name:"size_by",required:!0,type:"select",options:["(None)"].concat(morpheus.DatasetUtil.getSeriesNames(controller.getProject().getFullDataset()))}),items.push({name:"size_by_minimum",title:"Size by minimum",required:!0,type:"text",col:"col-xs-4"}),items.push({name:"size_by_maximum",title:"Size by maximum",required:!0,type:"text",col:"col-xs-4"}),items.push({name:"conditional_rendering",required:!0,type:"button",col:"col-xs-4"}));var displayItems=[{name:"show_grid",required:!0,type:"checkbox",value:controller.heatmap.isDrawGrid()},{name:"row_size",required:!0,type:"text",col:"col-xs-4",value:morpheus.Util.nf(controller.heatmap.getRowPositions().getSize())},{name:"column_size",required:!0,type:"text",col:"col-xs-4",value:morpheus.Util.nf(controller.heatmap.getColumnPositions().getSize())}];controller.rowDendrogram&&displayItems.push({name:"row_dendrogram_line_thickness",required:!0,type:"text",col:"col-xs-4",value:morpheus.Util.nf(controller.rowDendrogram?controller.rowDendrogram.lineWidth:1)}),controller.columnDendrogram&&displayItems.push({name:"column_dendrogram_line_thickness",required:!0,type:"text",col:"col-xs-4",value:morpheus.Util.nf(controller.columnDendrogram?controller.columnDendrogram.lineWidth:1)}),displayItems.push({name:"info_window",required:!0,type:"select",col:"col-xs-4",options:[{name:"Fixed To Top",value:0},{name:"New Window",value:1}],value:controller.tooltipMode}),displayItems.push({name:"inline_tooltip",required:!0,type:"checkbox",value:controller.options.inlineTooltip});var colorSchemeFormBuilder=new morpheus.FormBuilder;_.each(items,function(item){colorSchemeFormBuilder.append(item)});var displayFormBuilder=new morpheus.FormBuilder;_.each(displayItems,function(item){displayFormBuilder.append(item)});var colorSchemeChooser=new morpheus.HeatMapColorSchemeChooser({showRelative:!0});colorSchemeChooser.on("change",function(){controller.heatmap.getColorScheme().getSizer&&null!=controller.heatmap.getColorScheme().getSizer()&&(colorSchemeFormBuilder.setValue("size_by",controller.heatmap.getColorScheme().getSizer().getSeriesName()),colorSchemeFormBuilder.setEnabled("size_by_minimum",null!=controller.heatmap.getColorScheme().getSizer().getSeriesName()),colorSchemeFormBuilder.setEnabled("size_by_maximum",null!=controller.heatmap.getColorScheme().getSizer().getSeriesName()),colorSchemeFormBuilder.setValue("size_by_minimum",controller.heatmap.getColorScheme().getSizer().getMin()),colorSchemeFormBuilder.setValue("size_by_maximum",controller.heatmap.getColorScheme().getSizer().getMax())),controller.heatmap.setInvalid(!0),controller.heatmap.repaint(),colorSchemeChooser.restoreCurrentValue()});var annotationsBuilder=new morpheus.FormBuilder;annotationsBuilder.append(createMetadataField(!1)),annotationsBuilder.append(createMetadataField(!0));var $ca=annotationsBuilder.$form.find("[name=column_annotations]");$ca.on("change",function(e){annotationsListener($(this),!0)});var $ra=annotationsBuilder.$form.find("[name=row_annotations]");$ra.on("change",function(e){annotationsListener($(this),!1)});var annotationOptionsTabId=_.uniqueId("morpheus"),heatMapOptionsTabId=_.uniqueId("morpheus"),displayOptionsTabId=_.uniqueId("morpheus"),$metadataDiv=$('
    ');$metadataDiv.append($(annotationsBuilder.$form));var $heatMapDiv=$('
    ');$heatMapDiv.append(colorSchemeChooser.$div),$heatMapDiv.append($(colorSchemeFormBuilder.$form));var $displayDiv=$('
    ');$displayDiv.append($(displayFormBuilder.$form)),displayFormBuilder.$form.find("[name=show_grid]").on("click",function(e){var grid=$(this).prop("checked");controller.heatmap.setDrawGrid(grid),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()}),displayFormBuilder.$form.find("[name=inline_tooltip]").on("click",function(e){controller.options.inlineTooltip=$(this).prop("checked")}),displayFormBuilder.$form.find("[name=row_size]").on("keyup",_.debounce(function(e){controller.heatmap.getRowPositions().setSize(parseFloat($(this).val())),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()},100)),displayFormBuilder.$form.find("[name=info_window]").on("change",function(e){controller.setTooltipMode(parseInt($(this).val()))});var $colorByValue=colorSchemeFormBuilder.$form.find("[name=color_by_value]"),separateSchemesField=controller.heatmap.getColorScheme().getSeparateColorSchemeForRowMetadataField();null!=separateSchemesField&&$colorByValue.html(morpheus.Util.createOptions(morpheus.VectorUtil.createValueToIndexMap(controller.project.getFullDataset().getRowMetadata().getByName(separateSchemesField)).keys())),colorSchemeChooser.setColorScheme(controller.heatmap.getColorScheme()),null!=separateSchemesField&&colorSchemeChooser.setCurrentValue($colorByValue.val()),controller.heatmap.getColorScheme().getSizer&&null!=controller.heatmap.getColorScheme().getSizer()&&controller.heatmap.getColorScheme().getSizer().getSeriesName()&&colorSchemeFormBuilder.setValue("size_by",controller.heatmap.getColorScheme().getSizer().getSeriesName()),colorSchemeFormBuilder.$form.find("[name=size_by]").on("change",function(e){var series=$(this).val();"(None)"==series&&(series=null),colorSchemeChooser.colorScheme.getSizer().setSeriesName(series),colorSchemeChooser.fireChanged()}),colorSchemeFormBuilder.$form.find("[name=size_by_minimum]").on("keyup",_.debounce(function(e){colorSchemeChooser.colorScheme.getSizer().setMax(parseFloat($(this).val())),colorSchemeChooser.fireChanged()},100)),colorSchemeFormBuilder.$form.find("[name=conditional_rendering]").on("click",function(e){e.preventDefault();var conditionalRenderingUI=new morpheus.ConditionalRenderingUI(controller);morpheus.FormBuilder.showInModal({title:"Conditional Rendering",html:conditionalRenderingUI.$div,close:"Close",z:1051,callback:function(){}})}),colorSchemeFormBuilder.$form.find("[name=size_by_maximum]").on("keyup",_.debounce(function(e){colorSchemeChooser.colorScheme.getSizer().setMax(parseFloat($(this).val())),colorSchemeChooser.fireChanged()},100)),colorSchemeFormBuilder.find("save_color_scheme").on("click",function(e){e.preventDefault();var blob=new Blob([controller.heatmap.getColorScheme().toJson()],{type:"application/json"});saveAs(blob,"color_scheme.json")}),colorSchemeFormBuilder.on("change",function(e){"load_color_scheme"===e.name&&""!==e.value&&null!=e.value&&morpheus.Util.getText(e.value).done(function(text){var json=JSON.parse($.trim(text));controller.heatmap.getColorScheme().fromJson(json),colorSchemeChooser.setColorScheme(controller.heatmap.getColorScheme()),controller.heatmap.setInvalid(!0),controller.heatmap.repaint()}).fail(function(){morpheus.FormBuilder.showInModal({title:"Error",html:"Unable to read saved color scheme."})})}),colorSchemeFormBuilder.$form.on("change","[name=load_predefined_scheme]",function(e){var val=$(this).val();""!==val?("gene"===val?controller.heatmap.getColorScheme().setColorSupplierForCurrentValue(morpheus.HeatMapColorScheme.createColorSupplier(morpheus.HeatMapColorScheme.Predefined.RELATIVE())):"cn"===val?controller.heatmap.getColorScheme().setColorSupplierForCurrentValue(morpheus.HeatMapColorScheme.createColorSupplier(morpheus.HeatMapColorScheme.Predefined.CN())):"MAF"===val?controller.heatmap.getColorScheme().setColorSupplierForCurrentValue(morpheus.HeatMapColorScheme.createColorSupplier(morpheus.HeatMapColorScheme.Predefined.MAF())):"binary"===val?controller.heatmap.getColorScheme().setColorSupplierForCurrentValue(morpheus.HeatMapColorScheme.createColorSupplier(morpheus.HeatMapColorScheme.Predefined.BINARY())):"100scale1"===val?controller.heatmap.getColorScheme().setColorSupplierForCurrentValue(morpheus.HeatMapColorScheme.createColorSupplier(morpheus.HeatMapColorScheme.Predefined.SUMMLY())):"100scale2"===val?controller.heatmap.getColorScheme().setColorSupplierForCurrentValue(morpheus.HeatMapColorScheme.createColorSupplier(morpheus.HeatMapColorScheme.Predefined.SUMMLY2())):console.log("not found"),colorSchemeChooser.setColorScheme(controller.heatmap.getColorScheme()),controller.heatmap.setInvalid(!0),controller.heatmap.repaint(),$(this).val("")):console.log("empty option selected"),colorSchemeChooser.restoreCurrentValue()}),colorSchemeFormBuilder.$form.find("[name=color_by]").on("change",function(e){var colorByField=$(this).val();"(None)"==colorByField&&(colorByField=null),controller.heatmap.getColorScheme().setSeparateColorSchemeForRowMetadataField(colorByField),null!=colorByField&&$colorByValue.html(morpheus.Util.createOptions(morpheus.VectorUtil.createValueToIndexMap(controller.project.getFullDataset().getRowMetadata().getByName(colorByField)).keys()));var colorByValue=$colorByValue.val();controller.heatmap.getColorScheme().setCurrentValue(colorByValue),colorSchemeChooser.setCurrentValue(colorByValue),controller.heatmap.setInvalid(!0),controller.heatmap.repaint(),colorSchemeChooser.setColorScheme(controller.heatmap.getColorScheme())}),$colorByValue.on("change",function(e){null==controller.heatmap.getColorScheme().getSeparateColorSchemeForRowMetadataField()?(colorSchemeChooser.setCurrentValue(null),controller.heatmap.getColorScheme().setCurrentValue(null),colorSchemeChooser.setColorScheme(controller.heatmap.getColorScheme())):(colorSchemeChooser.setCurrentValue($colorByValue.val()),colorSchemeChooser.setColorScheme(controller.heatmap.getColorScheme()))}),displayFormBuilder.$form.find("[name=column_size]").on("keyup",_.debounce(function(e){controller.heatmap.getColumnPositions().setSize(parseFloat($(this).val())),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()},100)),displayFormBuilder.$form.find("[name=gap_size]").on("keyup",_.debounce(function(e){controller.gapSize=parseFloat($(this).val()),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()},100)),displayFormBuilder.$form.find("[name=squish_factor]").on("keyup",_.debounce(function(e){var f=parseFloat($(this).val());controller.heatmap.getColumnPositions().setSquishFactor(f),controller.heatmap.getRowPositions().setSquishFactor(f),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()},100)),displayFormBuilder.$form.find("[name=row_dendrogram_line_thickness]").on("keyup",_.debounce(function(e){controller.rowDendrogram.lineWidth=parseFloat($(this).val()),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()},100)),displayFormBuilder.$form.find("[name=column_dendrogram_line_thickness]").on("keyup",_.debounce(function(e){controller.columnDendrogram.lineWidth=parseFloat($(this).val()),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()},100));var $tab=$('
    ');$metadataDiv.appendTo($tab),$heatMapDiv.appendTo($tab),$displayDiv.appendTo($tab);var $div=$("
    "),$ul=$('');$ul.appendTo($div),$tab.appendTo($div),$ul.find("[role=tab]:eq(1)").tab("show"),morpheus.FormBuilder.showInModal({title:"Options",html:$div,close:"Close",callback:function(){$div.find("input").off("keyup"),$ca.off("change"),$ra.off("change"),$div.remove(),colorSchemeChooser.dispose()}})},morpheus.HeatMapToolBar=function(controller){this.controller=controller,this.rowSearchResultModelIndices=[],this.columnSearchResultModelIndices=[];var _this=this,$el=$('
    '),searchHtml=[],$search=$('');if($search.on("submit",function(e){e.preventDefault()}),controller.options.toolbar.searchRows&&(searchHtml.push('
    '),searchHtml.push('
    '),searchHtml.push('
    '),searchHtml.push(''),searchHtml.push('"),searchHtml.push("
    "),searchHtml.push(''),searchHtml.push("
    "),searchHtml.push('
    '),searchHtml.push(''),searchHtml.push('
    '),searchHtml.push(''),searchHtml.push(''),searchHtml.push(''),searchHtml.push("
    "),searchHtml.push("
    ")),controller.options.toolbar.searchColumns&&(searchHtml.push('
    '),searchHtml.push('
    '),searchHtml.push('
    '),searchHtml.push('
    '),searchHtml.push(''),searchHtml.push('"),searchHtml.push("
    "),searchHtml.push('
    '),searchHtml.push("
    "),searchHtml.push('
    '),searchHtml.push('
    '),searchHtml.push(''),searchHtml.push(''),searchHtml.push(''),searchHtml.push(''),searchHtml.push(""),searchHtml.push("
    ")),searchHtml.push('
    '),searchHtml.push('
    Values
    '),searchHtml.push("
    "),searchHtml.push('
    '),searchHtml.push('
    '),searchHtml.push("
    "),searchHtml.push('"),searchHtml.push('"),searchHtml.push('
    '),searchHtml.push('
    '),searchHtml.push('
    '),searchHtml.push("
    "),searchHtml.push('
    '),searchHtml.push("
    "),$(searchHtml.join("")).appendTo($search),controller.options.toolbar.searchValues||$search.find("[name=searchValuesDiv]").css("display","none"),controller.options.tour){var $tour=$('');$tour.prependTo($search.find("[name=right]")),$tour.on("click",function(e){e.preventDefault(),controller.options.tour(controller)})}controller.options.$help&&controller.options.$help.appendTo($search.find("[name=right]"));var $tools=$('
    ');$tools.on("submit",function(e){e.preventDefault()});var $toolbarForm=$('
    ');$toolbarForm.on("submit",function(e){e.preventDefault()});var toolbarHtml=[];controller.options.toolbar.zoom&&(toolbarHtml.push('
    '),toolbarHtml.push(''),toolbarHtml.push(''),toolbarHtml.push(''),toolbarHtml.push('')),toolbarHtml.push('
    '),controller.options.toolbar.sort&&toolbarHtml.push(''),controller.options.toolbar.options&&toolbarHtml.push(''),toolbarHtml.push('
    '),controller.options.toolbar.saveImage&&toolbarHtml.push(''),controller.options.toolbar.saveDataset&&toolbarHtml.push(''),controller.options.toolbar.openFile&&toolbarHtml.push(''),toolbarHtml.push('
    '),controller.options.toolbar.filter&&toolbarHtml.push(''),"undefined"!=typeof Plotly&&toolbarHtml.push('');var tools=[{tool:new morpheus.HClusterTool},{tool:new morpheus.MarkerSelection},{tool:new morpheus.NearestNeighbors},{tool:new morpheus.NewHeatMapTool},null,{tool:new morpheus.AdjustDataTool},{tool:new morpheus.CollapseDatasetTool},{tool:new morpheus.CreateAnnotation},{tool:new morpheus.SimilarityMatrixTool},{tool:new morpheus.TransposeTool},{tool:new morpheus.WordCloudTool}];if(this.getToolByName=function(name){for(var i=0;i'),toolbarHtml.push(''),toolbarHtml.push('
    ")}toolbarHtml.push('
    '),controller.options.toolbar.colorKey&&(toolbarHtml.push('
    '),toolbarHtml.push(''),toolbarHtml.push('"),toolbarHtml.push("
    ")),toolbarHtml.push('
    '),toolbarHtml.push("
    "),$search.appendTo($el.find("[name=toolbarSearch]")),$(toolbarHtml.join("")).appendTo($toolbarForm),$toolbarForm.appendTo($el.find("[name=toolbarButtons]")),$el.prependTo(controller.$content);var $tools=$el.find("[name=tools]");this.$tip=$el.find("[name=tip]"),$tools.on("click","li > a",function(e){e.preventDefault();var index=parseInt($(this).attr("name"));tools[index].tool?morpheus.HeatMap.showTool(tools[index].tool,controller):tools[index].action()}),this.defaultRowMatchMode="contains",this.defaultColumnMatchMode="contains";var $rowSearchOptions=$el.find("[name=rowSearchOptions]");$rowSearchOptions.on("click","li > a",function(e){ +e.preventDefault(),_this.defaultRowMatchMode=$(this).attr("name"),$rowSearchOptions.find("li").removeClass("active"),$(this).parent("li").addClass("active"),_this.search(!0),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"rowSearchMatchMode"})});var $columnSearchOptions=$el.find("[name=columnSearchOptions]");$columnSearchOptions.on("click","li > a",function(e){e.preventDefault(),_this.defaultColumnMatchMode=$(this).attr("name"),$columnSearchOptions.find("li").removeClass("active"),$(this).parent("li").addClass("active"),_this.search(!1),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"columnSearchMatchMode"})});var filterModal=[],filterLabelId=_.uniqueId("morpheus");filterModal.push('");var $filterModal=$(filterModal.join(""));$filterModal.on("mousewheel",function(e){e.stopPropagation()});var $filter=$("
    ");$filter.appendTo($filterModal.find(".modal-body")),$filterModal.appendTo($el);var filterHtml=[];filterHtml.push('
    '),filterHtml.push('
    ');var $filterChooser=$(filterHtml.join(""));$filterChooser.appendTo($filter);var columnFilterUI=new morpheus.FilterUI(controller.getProject(),!0),rowFilterUI=new morpheus.FilterUI(controller.getProject(),!1);controller.getProject().getRowFilter().on("focus",function(e){$filterChooser.find("[value=rows]").prop("checked",!0),columnFilterUI.$div.hide(),rowFilterUI.$div.show(),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"rowFilter"})}),controller.getProject().getColumnFilter().on("focus",function(e){$filterChooser.find("[value=columns]").prop("checked",!0),columnFilterUI.$div.show(),rowFilterUI.$div.hide(),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"columnFilter"})}),rowFilterUI.$div.appendTo($filter),columnFilterUI.$div.appendTo($filter),columnFilterUI.$div.css("display","none");var $filterRadio=$filterChooser.find("[name=rowsOrColumns]");$filterRadio.on("change",function(e){var val=$filterRadio.filter(":checked").val();"columns"===val?(columnFilterUI.$div.show(),rowFilterUI.$div.hide()):(columnFilterUI.$div.hide(),rowFilterUI.$div.show()),e.preventDefault()}),$el.find("[name=filterButton]").on("click",function(){$filterModal.modal("show"),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"filter"})}),$el.find('[data-toggle="tooltip"]').tooltip({placement:"bottom",container:"body",trigger:"hover"}).on("click",function(){$(this).tooltip("hide")});var $key=$el.find("[name=key]"),$keyContent=$el.find("[name=keyContent]");$key.dropdown().parent().on("show.bs.dropdown",function(){new morpheus.HeatMapColorSchemeLegend(controller,$keyContent),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"colorKey"})}),$el.find("[name=openFile]").on("click",function(){morpheus.HeatMap.showTool(new morpheus.OpenFileTool({customUrls:controller._customUrls}),controller)}),$el.find("[name=saveImage]").on("click",function(){morpheus.HeatMap.showTool(new morpheus.SaveImageTool,controller)}),$el.find("[name=saveDataset]").on("click",function(){morpheus.HeatMap.showTool(new morpheus.SaveDatasetTool,controller)}),$el.find("[name=chart]").on("click",function(){new morpheus.ChartTool2({project:controller.getProject(),getVisibleTrackNames:_.bind(controller.getVisibleTrackNames,controller)}),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"chart"})});var _this=this;$el.find("[name=tutorial]").on("click",function(){window.open("http://www.broadinstitute.org/cancer/software/morpheus/tutorial.html"),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"tutorial"})}),this.$previousColumnMatch=$el.find("[name=previousColumnMatch]"),this.$nextColumnMatch=$el.find("[name=nextColumnMatch]"),this.$previousRowMatch=$el.find("[name=previousRowMatch]"),this.$nextRowMatch=$el.find("[name=nextRowMatch]"),this.$dimensionsLabel=$el.find("[name=dim]"),this.$columnTextField=$el.find("[name=searchColumns]"),this.$valueTextField=$el.find("[name=searchValues]"),this.$selectionLabel=$el.find("[name=selection]"),this.$rowTextField=$el.find("[name=searchRows]"),this.$columnMatchesToTop=$el.find("[name=columnMatchesToTop]"),this.$rowMatchesToTop=$el.find("[name=rowMatchesToTop]"),this.$rowSearchDiv=$el.find("[name=rowSearchDiv]"),this.$columnSearchDiv=$el.find("[name=columnSearchDiv]"),this.$searchRowDendrogramWrapper=$el.find("[name=searchRowDendrogramWrapper]"),this.$searchRowDendrogram=$el.find("[name=searchRowDendrogram]"),this.$searchResultsRowDendrogram=$el.find("[name=searchResultsRowDendrogram]"),this.$searchColumnDendrogramWrapper=$el.find("[name=searchColumnDendrogramWrapper]"),this.$searchColumnDendrogram=$el.find("[name=searchColumnDendrogram]"),this.$searchResultsColumnDendrogram=$el.find("[name=searchResultsColumnDendrogram]"),controller.on("dendrogramAnnotated",function(e){(e.isColumns?_this.$searchColumnDendrogramWrapper:_this.$searchRowDendrogramWrapper).show()}),controller.on("dendrogramChanged",function(e){(e.isColumns?_this.$searchColumnDendrogramWrapper:_this.$searchRowDendrogramWrapper).hide()});var project=controller.getProject();morpheus.Util.autosuggest({$el:this.$rowTextField,filter:function(terms,cb){var indices=[],meta=project.getSortedFilteredDataset().getRowMetadata();controller.getVisibleTrackNames(!1).forEach(function(name){indices.push(morpheus.MetadataUtil.indexOf(meta,name))}),meta=new morpheus.MetadataModelColumnView(meta,indices),morpheus.MetadataUtil.autocomplete(meta)(terms,cb)},select:function(){_this.search(!0)}}),this.$rowTextField.on("keyup",_.debounce(function(e){13===e.which&&e.preventDefault(),_this.search(!0),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"searchRows"})},500)),morpheus.Util.autosuggest({$el:this.$columnTextField,filter:function(terms,cb){var indices=[],meta=project.getSortedFilteredDataset().getColumnMetadata();controller.getVisibleTrackNames(!0).forEach(function(name){indices.push(morpheus.MetadataUtil.indexOf(meta,name))}),meta=new morpheus.MetadataModelColumnView(meta,indices),morpheus.MetadataUtil.autocomplete(meta)(terms,cb)},select:function(){_this.search(!1)}}),this.$columnTextField.on("keyup",_.debounce(function(e){13===e.which&&e.preventDefault(),_this.search(!1),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"searchColumns"})},500)),this.$searchRowDendrogram.on("keyup",_.debounce(function(e){13===e.which&&e.preventDefault(),_this.searchDendrogram(!1),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"searchRowDendrogram"})},500)),this.$searchColumnDendrogram.on("keyup",_.debounce(function(e){13===e.which&&e.preventDefault(),_this.searchDendrogram(!0),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"searchColumnDendrogram"})},500)),morpheus.Util.autocomplete(this.$valueTextField,function(term,cb){var values=new morpheus.Set;morpheus.DatasetUtil.searchValues(project.getSortedFilteredDataset(),$.trim(_this.$valueTextField.val()),function(value,i,j){return values.add(value),3===values.size()?!1:void 0}),cb(values.values().map(function(val){return{value:val}}))},function(){}),this.$valueTextField.on("keyup",_.debounce(function(e){13===e.which&&(_this.$valueTextField.autocomplete("close"),e.preventDefault());var $searchResultsLabel=_this.$el.find("[name=searchResultsValues]"),text=$.trim(_this.$valueTextField.val());if(""===text)$searchResultsLabel.html(""),project.getElementSelectionModel().setViewIndices(null);else{var viewIndices=new morpheus.Set;morpheus.DatasetUtil.searchValues(project.getSortedFilteredDataset(),text,function(value,i,j){viewIndices.add(new morpheus.Identifier([i,j]))}),project.getElementSelectionModel().setViewIndices(viewIndices),$searchResultsLabel.html(viewIndices.size()+" match"+(1===viewIndices.size()?"":"es"))}},500)),$toolbarForm.on("submit",function(e){e.preventDefault()}),$toolbarForm.on("click","[name=in]",function(e){e.preventDefault(),controller.zoom(!0),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"zoomIn"})}),$toolbarForm.on("click","[name=out]",function(e){e.preventDefault(),controller.zoom(!1),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"zoomOut"})}),$toolbarForm.on("click","[name=options]",function(e){e.preventDefault(),controller.showOptions(),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"options"})}),$toolbarForm.on("click","[name=sort]",function(e){e.preventDefault(),new morpheus.SortDialog(project),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"sort"})}),$toolbarForm.on("click","[name=fit]",function(e){e.preventDefault(),controller.fitToWindow(!0),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"fit"})}),$toolbarForm.on("click","[name=resetZoom]",function(e){e.preventDefault(),controller.resetZoom(),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"resetZoom"})}),this.$el=$el;var updateFilterStatus=function(){controller.getProject().getRowFilter().isEnabled()||controller.getProject().getColumnFilter().isEnabled()?_this.$el.find("[name=filterButton]").addClass("btn-primary"):_this.$el.find("[name=filterButton]").removeClass("btn-primary")};updateFilterStatus(),this.$columnMatchesToTop.on("click",function(e){e.preventDefault();var $this=$(this);$this.toggleClass("btn-primary");var sortKeys=project.getColumnSortKeys();if(sortKeys=sortKeys.filter(function(key){return key instanceof morpheus.SpecifiedModelSortOrder&&"dendrogram"===key.name}),$this.hasClass("btn-primary")){var key=new morpheus.MatchesOnTopSortKey(project,_this.columnSearchResultModelIndices,"matches on top");sortKeys.splice(0,0,key),controller.scrollLeft(0)}_this.searching=!0,project.setColumnSortKeys(sortKeys,!0),_this._updateSearchIndices(!0),_this.searching=!1,morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"columnMatchesToTop"})}),this.$rowMatchesToTop.on("click",function(e){e.preventDefault();var $this=$(this);$this.toggleClass("btn-primary");var sortKeys=project.getRowSortKeys();if(sortKeys=sortKeys.filter(function(key){return key instanceof morpheus.SpecifiedModelSortOrder&&"dendrogram"===key.name}),$this.hasClass("btn-primary")){var key=new morpheus.MatchesOnTopSortKey(project,_this.rowSearchResultModelIndices,"matches on top");sortKeys.splice(0,0,key),controller.scrollTop(0)}_this.searching=!0,project.setRowSortKeys(sortKeys,!0),_this._updateSearchIndices(!1),_this.searching=!1,morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"rowMatchesToTop"})}),project.on("rowSortOrderChanged.morpheus",function(e){_this.searching||(_this._updateSearchIndices(!1),_this.$rowMatchesToTop.removeClass("btn-primary"))}),project.on("columnSortOrderChanged.morpheus",function(e){_this.searching||(_this._updateSearchIndices(!0),_this.$columnMatchesToTop.removeClass("btn-primary"))}),controller.getProject().on("rowFilterChanged.morpheus",function(e){_this.search(!0),updateFilterStatus()}),controller.getProject().on("columnFilterChanged.morpheus",function(e){_this.search(!1),updateFilterStatus()}),controller.getProject().on("datasetChanged.morpheus",function(){_this.search(!0),_this.search(!1),updateFilterStatus()}),controller.getProject().getRowSelectionModel().on("selectionChanged.morpheus",function(){_this.updateSelectionLabel()}),controller.getProject().getColumnSelectionModel().on("selectionChanged.morpheus",function(){_this.updateSelectionLabel()}),this.rowSearchResultViewIndicesSorted=null,this.currentRowSearchIndex=0,this.columnSearchResultViewIndicesSorted=null,this.currentColumnSearchIndex=-1,this.$previousColumnMatch.on("click",function(){_this.currentColumnSearchIndex--,_this.currentColumnSearchIndex<0&&(_this.currentColumnSearchIndex=_this.columnSearchResultViewIndicesSorted.length-1),controller.scrollLeft(controller.getHeatMapElementComponent().getColumnPositions().getPosition(_this.columnSearchResultViewIndicesSorted[_this.currentColumnSearchIndex])),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"previousColumnMatch"})}),this.$previousRowMatch.on("click",function(){_this.currentRowSearchIndex--,_this.currentRowSearchIndex<0&&(_this.currentRowSearchIndex=_this.rowSearchResultViewIndicesSorted.length-1),controller.scrollTop(controller.getHeatMapElementComponent().getRowPositions().getPosition(_this.rowSearchResultViewIndicesSorted[_this.currentRowSearchIndex])),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"previousRowMatch"})}),this.$nextColumnMatch.on("click",function(){_this.next(!0),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"nextColumnMatch"})}),this.$nextRowMatch.on("click",function(){_this.next(!1),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"nextRowMatch"})}),this.updateDimensionsLabel(),this.updateSelectionLabel()},morpheus.HeatMapToolBar.HIGHLIGHT_SEARCH_MODE=0,morpheus.HeatMapToolBar.FILTER_SEARCH_MODE=1,morpheus.HeatMapToolBar.MATCHES_TO_TOP_SEARCH_MODE=2,morpheus.HeatMapToolBar.SELECT_MATCHES_SEARCH_MODE=3,morpheus.HeatMapToolBar.prototype={quickColumnFilter:!1,searching:!1,rowSearchMode:morpheus.HeatMapToolBar.SELECT_MATCHES_SEARCH_MODE,columnSearchMode:morpheus.HeatMapToolBar.SELECT_MATCHES_SEARCH_MODE,_updateSearchIndices:function(isColumns){var project=this.controller.getProject();if(isColumns){for(var viewIndices=[],modelIndices=this.columnSearchResultModelIndices,i=0,length=modelIndices.length;length>i;i++){var index=project.convertModelColumnIndexToView(modelIndices[i]);-1!==index&&viewIndices.push(index)}viewIndices.sort(function(a,b){return b>a?-1:1}),this.columnSearchResultViewIndicesSorted=viewIndices,this.currentColumnSearchIndex=-1}else{for(var viewIndices=[],modelIndices=this.rowSearchResultModelIndices,i=0,length=modelIndices.length;length>i;i++){var index=project.convertModelRowIndexToView(modelIndices[i]);-1!==index&&viewIndices.push(index)}viewIndices.sort(function(a,b){return b>a?-1:1}),this.rowSearchResultViewIndicesSorted=viewIndices,this.currentRowSearchIndex=-1}},next:function(isColumns){var controller=this.controller;isColumns?(this.currentColumnSearchIndex++,this.currentColumnSearchIndex>=this.columnSearchResultViewIndicesSorted.length&&(this.currentColumnSearchIndex=0),controller.scrollLeft(controller.getHeatMapElementComponent().getColumnPositions().getPosition(this.columnSearchResultViewIndicesSorted[this.currentColumnSearchIndex]))):(this.currentRowSearchIndex++,this.currentRowSearchIndex>=this.rowSearchResultViewIndicesSorted.length&&(this.currentRowSearchIndex=0),controller.scrollTop(controller.getHeatMapElementComponent().getRowPositions().getPosition(this.rowSearchResultViewIndicesSorted[this.currentRowSearchIndex])))},setSearchText:function(options){var $tf=options.isColumns?this.$columnTextField:this.$rowTextField,existing=options.append?$.trim($tf.val()):"";""!==existing&&(existing+=" "),options.onTop&&(options.isColumns?this.$columnMatchesToTop.addClass("btn-primary"):this.$rowMatchesToTop.addClass("btn-primary")),$tf.val(existing+options.text),this.search(!options.isColumns),options.scrollTo&&this.next(options.isColumns)},updateDimensionsLabel:function(){var p=this.controller.getProject(),d=p.getFullDataset(),f=p.getSortedFilteredDataset(),text="showing "+morpheus.Util.intFormat(f.getRowCount())+" of "+morpheus.Util.intFormat(d.getRowCount())+" rows, "+morpheus.Util.intFormat(f.getColumnCount())+" of "+morpheus.Util.intFormat(d.getColumnCount())+" columns";this.$dimensionsLabel.html(text)},updateSelectionLabel:function(){var nc=this.controller.getProject().getColumnSelectionModel().count(),nr=this.controller.getProject().getRowSelectionModel().count(),text=[];text.push(morpheus.Util.intFormat(nr)+" row"),1!==nr&&text.push("s"),text.push(" selected, "),text.push(morpheus.Util.intFormat(nc)+" column"),1!==nc&&text.push("s"),text.push(" selected"),this.$selectionLabel.html(text.join(""))},searchDendrogram:function(isColumns){var text=$.trim(isColumns?this.$searchColumnDendrogram.val():this.$searchRowDendrogram.val()),dendrogram=isColumns?this.controller.columnDendrogram:this.controller.rowDendrogram,$searchResults=isColumns?this.$searchResultsColumnDendrogram:this.$searchResultsRowDendrogram,matches=morpheus.AbstractDendrogram.search(dendrogram.tree.rootNode,text);if(-1===matches?$searchResults.html(""):$searchResults.html(matches+" match"+(1===matches?"":"es")),0>=matches){var positions=isColumns?this.controller.getHeatMapElementComponent().getColumnPositions():this.controller.getHeatMapElementComponent().getRowPositions();positions.setSquishedIndices(null),isColumns?this.controller.getProject().setGroupColumns([],!0):this.controller.getProject().setGroupRows([],!0),positions.setSize(isColumns?this.controller.getFitColumnSize():this.controller.getFitRowSize())}else morpheus.AbstractDendrogram.squishNonSearchedNodes(this.controller,isColumns);this.controller.updateDataset(),this.controller.revalidate()},search:function(isRows){this.searching=!0;for(var isMatchesOnTop=isRows?this.$rowMatchesToTop.hasClass("btn-primary"):this.$columnMatchesToTop.hasClass("btn-primary"),controller=this.controller,project=controller.getProject(),sortKeys=isRows?project.getRowSortKeys():project.getColumnSortKeys(),keyIndex=-1,i=0;ii;i++){var viewIndex=searchResultViewIndices[i];searchResultsModelIndices.push(isRows?project.convertViewRowIndexToModel(viewIndex):project.convertViewColumnIndexToModel(viewIndex))}if(null!==searchResultViewIndices&&isMatchesOnTop){var key=new morpheus.MatchesOnTopSortKey(project,searchResultsModelIndices,"matches on top");sortKeys=sortKeys.filter(function(key){return!(key instanceof morpheus.MatchesOnTopSortKey)}),searchResultViewIndices=key.indices,sortKeys.splice(0,0,key),isRows?project.setRowSortKeys(sortKeys,!1):project.setColumnSortKeys(sortKeys,!1)}var searchResultsViewIndicesSet=new morpheus.Set;if(null!=searchResultViewIndices)for(var i=0,length=searchResultViewIndices.length;length>i;i++){var viewIndex=searchResultViewIndices[i];searchResultsViewIndicesSet.add(viewIndex)}null==searchResultViewIndices&&(searchResultViewIndices=[]),isRows?(this.rowSearchResultModelIndices=searchResultsModelIndices,this.rowSearchResultViewIndicesSorted=searchResultViewIndices.sort(function(a,b){return b>a?-1:1}),this.currentRowSearchIndex=-1):(this.columnSearchResultModelIndices=searchResultsModelIndices,this.columnSearchResultViewIndicesSorted=searchResultViewIndices.sort(function(a,b){return b>a?-1:1}),this.currentColumnSearchIndex=-1),(isRows?project.getRowSelectionModel():project.getColumnSelectionModel()).setViewIndices(searchResultsViewIndicesSet,!0),isMatchesOnTop&&(isRows?project.setRowSortKeys(morpheus.SortKey.keepExistingSortKeys(sortKeys,project.getRowSortKeys()),!0):project.setColumnSortKeys(morpheus.SortKey.keepExistingSortKeys(sortKeys,project.getColumnSortKeys()),!0)),this.updateDimensionsLabel(),this.updateSelectionLabel(),this.searching=!1}},morpheus.HeatMapTooltipProvider=function(heatMap,rowIndex,columnIndex,options,separator,quick){var dataset=heatMap.project.getSortedFilteredDataset(),tipText=[];if(quick||options.value&&_.each(options.value,function(pair){if(tipText.length>0&&tipText.push(separator),tipText.push(pair.name),tipText.push(": "),_.isArray(pair.value))for(var i=0;i0&&tipText.push(", "),tipText.push(pair.value[i]);else tipText.push(pair.value);tipText.push("")}),-1!==rowIndex&&-1!==columnIndex){for(var i=0,nseries=dataset.getSeriesCount();nseries>i;i++)morpheus.HeatMapTooltipProvider._matrixValueToString(dataset,rowIndex,columnIndex,i,tipText,separator,options.showSeriesNameInTooltip||i>0);if(quick){var quickRowTracks=heatMap.rowTracks.filter(function(t){return t.settings.inlineTooltip});morpheus.HeatMapTooltipProvider._tracksToString(options,quickRowTracks,dataset.getRowMetadata(),rowIndex,tipText,separator),morpheus.HeatMapTooltipProvider._tracksToString(options,heatMap.columnTracks.filter(function(t){return t.settings.inlineTooltip}),dataset.getColumnMetadata(),columnIndex,tipText,separator)}}if(quick){if(null!=options.name){var metadata=-1!==rowIndex?dataset.getRowMetadata():dataset.getColumnMetadata(),vector=metadata.getByName(options.name),track=heatMap.getTrack(options.name,-1!==columnIndex),colorByName=null!=track?track.settings.colorByField:null,additionalVector=null!=colorByName?metadata.getByName(colorByName):null;morpheus.HeatMapTooltipProvider.vectorToString(vector,-1!==rowIndex?rowIndex:columnIndex,tipText,separator,additionalVector)}}else-1!==rowIndex&&morpheus.HeatMapTooltipProvider._metadataToString(options,heatMap.rowTracks,dataset.getRowMetadata(),rowIndex,tipText,separator),-1!==columnIndex&&morpheus.HeatMapTooltipProvider._metadataToString(options,heatMap.columnTracks,dataset.getColumnMetadata(),columnIndex,tipText,separator);var rowNodes=[],columnNodes=[],selectedRowNodes=[],selectedColumnNodes=[];if(options.rowNodes&&(rowNodes=options.rowNodes),options.columnNodes&&(columnNodes=options.columnNodes),!quick){if(heatMap.rowDendrogram&&(selectedRowNodes=_.values(heatMap.rowDendrogram.selectedRootNodeIdToNode)),heatMap.columnDendrogram&&(selectedColumnNodes=_.values(heatMap.columnDendrogram.selectedRootNodeIdToNode)),selectedRowNodes.length>0&&rowNodes.length>0){var nodeIds={};_.each(selectedRowNodes,function(n){nodeIds[n.id]=!0}),rowNodes=_.filter(rowNodes,function(n){return void 0===nodeIds[n.id]})}if(selectedColumnNodes.length>0&&columnNodes.length>0){var nodeIds={};_.each(selectedColumnNodes,function(n){nodeIds[n.id]=!0}),columnNodes=_.filter(columnNodes,function(n){return void 0===nodeIds[n.id]})}}return morpheus.HeatMapTooltipProvider._nodesToString(tipText,rowNodes,null,separator),morpheus.HeatMapTooltipProvider._nodesToString(tipText,columnNodes,null,separator),quick||(selectedRowNodes.length>0&&morpheus.HeatMapTooltipProvider._nodesToString(tipText,selectedRowNodes,heatMap.rowDendrogram._selectedNodeColor,separator),selectedColumnNodes.length>0&&morpheus.HeatMapTooltipProvider._nodesToString(tipText,selectedColumnNodes,heatMap.columnDendrogram._selectedNodeColor,separator)),tipText.join("")},morpheus.HeatMapTooltipProvider._matrixValueToString=function(dataset,rowIndex,columnIndex,seriesIndex,tipText,separator,showSeriesNameInTooltip){var val=dataset.getValue(rowIndex,columnIndex,seriesIndex);if(null!=val)if(val.toObject||!_.isNumber(val)){var obj=val.toObject?val.toObject():val,keys=_.keys(obj);_.each(keys,function(key){if("__v"!==key){var v=morpheus.Util.formatObject(obj[key]);tipText.length>0&&tipText.push(separator),tipText.push(key),tipText.push(": "),tipText.push(v),tipText.push("")}})}else tipText.length>0&&tipText.push(separator),showSeriesNameInTooltip&&(tipText.push(dataset.getName(seriesIndex)),tipText.push(": ")),tipText.push(""),tipText.push(morpheus.Util.nf(val)),tipText.push("")},morpheus.HeatMapTooltipProvider.vectorToString=function(vector,index,tipText,separator,additionalVector){var arrayValueToString=function(arrayFieldName,arrayVal){if(null!=arrayVal)if(null!=arrayFieldName&&(tipText.length>0&&tipText.push(separator),tipText.push(arrayFieldName)),arrayVal.toObject){tipText.push(" ");var obj=arrayVal.toObject(),keys=_.keys(obj);_.each(keys,function(key){var subVal=obj[key];null!=subVal&&""!=subVal&&(tipText.length>0&&tipText.push(separator),tipText.push(key),tipText.push(": "),tipText.push(morpheus.Util.formatObject(subVal)),tipText.push(""))})}else tipText.push(": "),tipText.push(morpheus.Util.formatObject(arrayVal)),tipText.push("")};if(null!=vector){var primaryVal=vector.getValue(index);if(null!=primaryVal&&""!=primaryVal){var primaryFields=vector.getProperties().get(morpheus.VectorKeys.FIELDS);if(null!=primaryFields){var visibleFieldIndices=vector.getProperties().get(morpheus.VectorKeys.VISIBLE_FIELDS);void 0===visibleFieldIndices&&(visibleFieldIndices=morpheus.Util.seq(primaryFields.length));var additionalFieldNames=null!=additionalVector?additionalVector.getProperties().get(morpheus.VectorKeys.FIELDS):null,additionalVal=null!=additionalFieldNames?additionalVector.getValue(index):null;tipText.length>0&&tipText.push(separator),tipText.push(vector.getName());for(var j=0;j0&&tipText.push(separator),tipText.push(additionalVector.getName());for(var j=0;j0&&tipText.push(separator),tipText.push(vector.getName()),tipText.push(": "),tipText.push(morpheus.Util.formatObject(primaryVal)),tipText.push("")}}},morpheus.HeatMapTooltipProvider._tracksToString=function(options,tracks,metadata,index,tipText,separator){for(var i=0;ii;i++){var track=tracks[i];track.isVisible()&&track.isShowTooltip()&&(tracks[i].name===options.name?filtered.splice(0,0,track):filtered.push(track))}morpheus.HeatMapTooltipProvider._tracksToString(options,filtered,metadata,index,tipText,separator)},morpheus.HeatMapTooltipProvider._nodesToString=function(tipText,nodes,color,separator){var renderField=function(name,value){if(null!=value){if(tipText.length>0&&tipText.push(separator),color&&tipText.push(''),tipText.push(name),tipText.push(": "),_.isArray(value))for(var i=0;i0&&tipText.push(", "),tipText.push(morpheus.Util.formatObject(value[i]));else tipText.push(morpheus.Util.formatObject(value));tipText.push(""),color&&tipText.push("")}};_.each(nodes,function(node){if(node.info)for(var name in node.info){var value=node.info[name];renderField(name,value)}renderField("depth",node.depth);var nLeafNodes=1+Math.abs(node.maxIndex-node.minIndex);nLeafNodes>0&&renderField("# of leaf nodes",nLeafNodes)})},morpheus.HeatMapTrackColorLegend=function(tracks,colorModel){morpheus.AbstractCanvas.call(this,!1),this.tracks=tracks,this.colorModel=colorModel,this.canvas.style.position=""},morpheus.HeatMapTrackColorLegend.prototype={getPreferredSize:function(){var tracks=this.tracks,colorModel=this.colorModel,xpix=0,ypix=0,maxYPix=0,canvas=this.canvas,context=canvas.getContext("2d");context.font="12px "+morpheus.CanvasUtil.FONT_NAME;for(var i=0;i0?maxYPix+30:0}},draw:function(clip,context){for(var tracks=this.tracks,colorModel=this.colorModel,xpix=0,i=0;i0?maxYPix+30:0}},draw:function(clip,context){var tracks=this.tracks,shapeModel=this.shapeModel,xpix=0,ypix=0;context.textAlign="left",context.textBaseline="top",context.font="12px "+morpheus.CanvasUtil.FONT_NAME,context.fillStyle=morpheus.CanvasUtil.FONT_COLOR,context.strokeStyle="black";for(var i=0;i'),html.push(''),html.push('"),html.push("
    "),this.$el=$(html.join("")),this.$el.find("button").on("click",function(e){e.stopImmediatePropagation()}),this.$el.find("[name=contact]").on("click",function(e){e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),window.open("mailto:morpheus@broadinstitute.org"),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"contact"})}),this.$el.find("[name=tutorial]").on("click",function(e){e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),window.open(morpheus.Util.URL+"tutorial.html"),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"tutorial"})}),this.$el.find("[name=linking]").on("click",function(e){e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),window.open(morpheus.Util.URL+"linking.html"),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"linking"})}),this.$el.find("[name=source]").on("click",function(e){e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),window.open("https://github.com/joshua-gould/morpheus.js"),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"source"})})},morpheus.LegendWithStops=function(){morpheus.AbstractCanvas.call(this,!1),this.setBounds({width:300,height:40});var that=this;this.hammer=morpheus.Util.hammer(this.canvas,["pan","tap","press"]).on("panmove",function(event){if(-1!==that.panStartSelectedIndex){var position=morpheus.CanvasUtil.getMousePos(event.target,event),fraction=that.fractionToStopPix.invert(position.x);fraction=Math.max(0,fraction),fraction=Math.min(1,fraction),that.trigger("moved",{fraction:fraction})}}).on("panstart",function(event){that.panStartSelectedIndex=that.findIndexForPosition(morpheus.CanvasUtil.getMousePos(event.target,event,!0))}).on("panend",function(event){that.panStartSelectedIndex=-1}).on("tap",function(event){var position=morpheus.CanvasUtil.getMousePos(event.target,event);if(event.tapCount>1){var fraction=that.fractionToStopPix.invert(position.x);that.trigger("added",{fraction:fraction})}else that.selectedIndex=that.findIndexForPosition(position),that.trigger("selectedIndex",{selectedIndex:that.selectedIndex})}),$(this.canvas).on("keydown",function(e){8!=e.which&&46!=e.which||-1===that.selectedIndex||(that.trigger("delete"),e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation())})},morpheus.LegendWithStops.prototype={selectedIndex:-1,border:7,stopHalfSize:5,panStartSelectedIndex:-1,destroy:function(){$(this.canvas).off("keyup"),this.hammer.destroy()},setSelectedIndex:function(index){this.panStartSelectedIndex=-1},findIndexForPosition:function(position){if(position.y>=22)for(var i=0,length=this.fractions.length;length>i;i++){var pix=this.fractionToStopPix(this.fractions[i]),start=pix-this.stopHalfSize,end=pix+this.stopHalfSize;if(position.x>=start&&position.x<=end)return i}return-1},draw:function(fractions,colors,stepped,fractionToStopPix){this.fractions=fractions,this.colors=colors,this.stepped=stepped,this.fractionToStopPix=fractionToStopPix;var context=this.canvas.getContext("2d");morpheus.CanvasUtil.resetTransform(context),context.clearRect(0,0,this.getUnscaledWidth(),this.getUnscaledHeight()),context.translate(this.border,0),morpheus.HeatMapColorSchemeLegend.draw(context,fractions,colors,this.getUnscaledWidth()-2*this.border,this.getUnscaledHeight()-20,stepped),context.translate(-this.border,0),context.lineWidth=1,context.strokeStyle="Grey",context.strokeRect(this.border,0,this.getUnscaledWidth()-2*this.border,this.getUnscaledHeight()-20);for(var i=0;i0&&fractions[i]===fractions[i-1])){context.fillStyle=colors[i];var pix=fractionToStopPix(fractions[i]);context.fillRect(pix-this.stopHalfSize,22,2*this.stopHalfSize,2*this.stopHalfSize),this.selectedIndex===i?(context.lineWidth=2,context.strokeStyle="black"):(context.lineWidth=1,context.strokeStyle="Grey"),context.strokeRect(pix-this.stopHalfSize,22,2*this.stopHalfSize,2*this.stopHalfSize)}}},morpheus.Util.extend(morpheus.LegendWithStops,morpheus.AbstractCanvas),morpheus.Util.extend(morpheus.LegendWithStops,morpheus.Events),morpheus.Popup={},morpheus.Popup.initted=!1,morpheus.Popup.init=function(){if(!morpheus.Popup.initted){var client=new Clipboard("a[name=Copy]",{text:function(trigger){var event={clipboardData:{setData:function(dataType,data){this.data=data}}};return morpheus.Popup.popupCallback(event,"Copy"),morpheus.Popup.hide(),event.clipboardData.data}});morpheus.Popup.client=client,morpheus.Popup.initted=!0,morpheus.Popup.$popupDiv=$(document.createElement("div")),morpheus.Popup.$popupDiv.css("position","absolute").css("zIndex",999).addClass("dropdown clearfix"),morpheus.Popup.$contextMenu=$(document.createElement("ul")),morpheus.Popup.$contextMenu.addClass("dropdown-menu").css("display","block").css("position","static").css("margin-bottom","5px"),morpheus.Popup.$contextMenu.appendTo(morpheus.Popup.$popupDiv),morpheus.Popup.$contextMenu.on("click","a",function(e){var $this=$(this),name=$.trim($this.text());"Copy"!==name&&(morpheus.Popup.popupCallback(e,name),morpheus.Popup.hide())})}},morpheus.Popup.popupInDom=!1,morpheus.Popup.hidePopupMenu=function(e){morpheus.Popup.component==e.target&&(e.preventDefault(),e.stopPropagation()),morpheus.Popup.hide()},morpheus.Popup.hide=function(){morpheus.Popup.$popupDiv.hide(),$(document.body).off("mousedown",morpheus.Popup.hidePopupMenu),morpheus.Popup.popupCallback=null,morpheus.Popup.component=null},morpheus.Popup.showPopup=function(menuItems,position,component,callback){if(morpheus.Popup.init(),morpheus.Popup.component==component)return void morpheus.Popup.hide();morpheus.Popup.popupCallback=callback,morpheus.Popup.component=component;for(var html=[],i=0,length=menuItems.length;length>i;i++){var item=menuItems[i];item.header?html.push('"):item.separator?html.push('
  • '):(html.push('
  • '),item.checked&&html.push(''),html.push(item.name),item.icon&&html.push(''),html.push(""),html.push("
  • "))}morpheus.Popup.$contextMenu.html(html.join("")),morpheus.Popup.popupInDom||(morpheus.Popup.popupInDom=!0,morpheus.Popup.$popupDiv.appendTo($(document.body))),morpheus.Popup.$popupDiv.css({display:"block",left:position.x,top:position.y}),morpheus.Popup.$popupDiv.show();var $body=$(document.body);$body.off("mousedown",morpheus.Popup.hidePopupMenu),window.setTimeout(function(){$body.on("mousedown",function(e){var $target=$(e.target);"popup-item"!==$target.data("type")&&morpheus.Popup.hidePopupMenu(e)})},1)},morpheus.RowDendrogram=function(controller,tree,positions,project){morpheus.AbstractDendrogram.call(this,controller,tree,positions,project,morpheus.AbstractDendrogram.Type.ROW)},morpheus.RowDendrogram.prototype={drawNode:function(context,node){var radius=this.getNodeRadius(node),pix=this.toPix(node);context.beginPath(),context.arc(pix[0],pix[1],radius,2*Math.PI,!1),context.fill()},isDragHotSpot:function(p){return Math.abs(this.scale(this.cutHeight)-p.x)<=2},preDraw:function(context,clip){context.setLineDash&&context.setLineDash([5]),context.strokeStyle="black";var nx=this.scale(this.cutHeight);context.beginPath(),context.moveTo(nx,clip.y),context.lineTo(nx,this.getUnscaledHeight()),context.stroke(),context.setLineDash&&context.setLineDash([])},getPreferredSize:function(){return{width:100,height:Math.ceil(this.positions.getPosition(this.positions.getLength()-1)+this.positions.getItemSize(this.positions.getLength()-1))}},paintMouseOver:function(clip,context){-1!==this.project.getHoverRowIndex()&&(morpheus.CanvasUtil.resetTransform(context),context.translate(0,-clip.y),this.drawRowBorder(context,this.positions,this.project.getHoverRowIndex(),this.getUnscaledWidth()))},drawRowBorder:function(context,positions,index,gridSize){var size=positions.getItemSize(index),pix=positions.getPosition(index);context.beginPath(),context.moveTo(0,pix+size),context.lineTo(gridSize,pix+size),context.stroke(),context.beginPath(),context.moveTo(0,pix),context.lineTo(gridSize,pix),context.stroke()},createScale:function(){return d3.scale.linear().domain([0,this.tree.maxHeight]).range([this.getUnscaledWidth(),0])},getMaxIndex:function(clip){return morpheus.Positions.getBottom(clip,this.positions)},getMinIndex:function(clip){return morpheus.Positions.getTop(clip,this.positions)},toPix:function(node){var min=this.positions.getPosition(node.minIndex)+this.positions.getItemSize(node.minIndex)/2,max=this.positions.getPosition(node.maxIndex)+this.positions.getItemSize(node.maxIndex)/2;return[this.scale(node.height),(min+max)/2]},drawPathFromNodeToParent:function(context,node){var pix=this.toPix(node),parentPix=this.toPix(node.parent);context.beginPath(),context.moveTo(pix[0],pix[1]),context.lineTo(parentPix[0],pix[1]),context.lineTo(parentPix[0],parentPix[1]),context.stroke()},drawNodePath:function(context,node,minIndex,maxIndex){var x,y,children=node.children,left=children[0],right=children[1],ry=this.toPix(right)[1],rx=this.scale(right.height),ly=this.toPix(left)[1],lx=this.scale(left.height),nx=this.scale(node.height);if(this.drawLeafNodes)x=[rx,nx,nx,lx],y=[ry,ry,ly,ly];else{var leftIsLeaf=void 0!==left.children,rightIsLeaf=void 0!==right.children;leftIsLeaf&&(lx=nx+4),rightIsLeaf&&(rx=nx+4),x=[rx,nx,nx,lx],y=[ry,ry,ly,ly]}context.beginPath(),context.moveTo(x[0],y[0]);for(var i=1,length=x.length;length>i;i++)context.lineTo(x[i],y[i]);context.stroke()}},morpheus.Util.extend(morpheus.RowDendrogram,morpheus.AbstractDendrogram),morpheus.ScentedSearch=function(model,positions,isVertical,scrollbar,controller){morpheus.AbstractCanvas.call(this,!1),this.model=model,this.positions=positions,this.isVertical=isVertical,this.scrollbar=scrollbar,this.controller=controller,this.searchIndices=[],scrollbar.decorator=this;var _this=this,mouseMove=function(e){var index=_this.getIndex(e);_this.mouseMovedIndex=index,document.body.style.cursor=0>index?"default":"pointer",scrollbar.canvas.style.cursor=0>index?"default":"pointer";var tipOptions={event:e};isVertical?controller.setToolTip(index>=0?_this.searchIndices[index]:-1,-1,tipOptions):controller.setToolTip(-1,index>=0?_this.searchIndices[index]:-1,tipOptions)},mouseExit=function(e){document.body.style.cursor="default",scrollbar.canvas.style.cursor="default"};$(scrollbar.canvas).on("mousemove",mouseMove).on("mouseexit",mouseExit)},morpheus.ScentedSearch.prototype={mouseMovedIndex:-1,getIndex:function(event){var pix=morpheus.CanvasUtil.getMousePos(event.target,event),val=pix[this.isVertical?"y":"x"];return this.getIndexForPix(val)},getIndexForPix:function(pix){var indices=this.searchIndices;if(null==indices)return-1;var tolerance=1.2;if(this.mouseMovedIndex>0){var midVal=this.positions.getPosition(indices[this.mouseMovedIndex])*scale;if(Math.abs(midVal-pix)<=tolerance)return this.mouseMovedIndex}for(var low=0,scale=this.scale,high=indices.length-1;high>=low;){var mid=low+high>>1,midVal=this.positions.getPosition(indices[mid])*scale,cmp=0;if(Math.abs(midVal-pix)<=tolerance?cmp=0:pix>midVal?cmp=-1:midVal>pix&&(cmp=1),0>cmp)low=mid+1;else{if(!(cmp>0))return mid;high=mid-1}}return-1},tap:function(position){var val=position[this.isVertical?"y":"x"],index=this.getIndexForPix(val);return this.scrollbar.canvas.style.cursor=0>index?"default":"pointer",index>=0?(this.isVertical?this.controller.scrollTop(this.positions.getPosition(this.searchIndices[index])):this.controller.scrollLeft(this.positions.getPosition(this.searchIndices[index])),!0):!1},update:function(){this.searchIndices=this.model.getViewIndices().values().sort(function(a,b){return b>a?-1:1})},draw:function(clip,context){var width=this.scrollbar.getUnscaledWidth(),height=this.scrollbar.getUnscaledHeight();this.scale=(this.isVertical?height:width)/(this.positions.getPosition(this.positions.getLength()-1)+this.positions.getItemSize(this.positions.getLength()-1));var innerColor="#FFDD00",outerColor="#CCAA00";context.strokeStyle=outerColor,context.fillStyle=innerColor,context.lineWidth=1,this.drawIndices(context,this.searchIndices),this.drawHoverIndices(context)},drawHoverIndices:function(context){var heatmap=this.controller;if(context.fillStyle="black",heatmap.mousePositionOptions&&null!=heatmap.mousePositionOptions.name){var isColumns=!this.isVertical,track=heatmap.getTrack(heatmap.mousePositionOptions.name,isColumns);if(null==track)return;if(track.settings.highlightMatchingValues){var hoverIndex=isColumns?heatmap.getProject().getHoverColumnIndex():heatmap.getProject().getHoverRowIndex();if(-1===hoverIndex)return;var vector=track.getVector(),value=vector.getValue(hoverIndex),valueToModelIndices=track.getFullVector().getProperties().get(morpheus.VectorKeys.VALUE_TO_INDICES);if(!valueToModelIndices){var fullVector=track.getFullVector();valueToModelIndices=morpheus.VectorUtil.createValueToIndicesMap(fullVector),fullVector.getProperties().set(morpheus.VectorKeys.VALUE_TO_INDICES,valueToModelIndices)}var modelIndices=valueToModelIndices.get(value);if(null==modelIndices)return void console.log("valueToModelIndices error");for(var scale=this.scale,lineLength=this.isVertical?this.scrollbar.getUnscaledWidth():this.scrollbar.getUnscaledHeight(),isVertical=this.isVertical,positions=this.positions,project=heatmap.getProject(),i=0,length=modelIndices.length;length>i;i++){var modelIndex=modelIndices[i],index=isVertical?project.convertModelRowIndexToView(modelIndex):project.convertModelColumnIndexToView(modelIndex);if(-1!==index){var pix=positions.getPosition(index)*scale;isVertical?context.fillRect(0,pix,lineLength,2):context.fillRect(pix,0,2,lineLength)}}}}},drawIndices:function(context,highlightedIndices){for(var scale=this.scale,lineLength=this.isVertical?this.scrollbar.getUnscaledWidth():this.scrollbar.getUnscaledHeight(),isVertical=this.isVertical,positions=this.positions,i=0,length=highlightedIndices.length;length>i;i++){var index=highlightedIndices[i],pix=positions.getPosition(index)*scale;isVertical?(context.fillRect(0,pix,lineLength,2),context.strokeRect(0,pix,lineLength,2)):(context.fillRect(pix,0,2,lineLength),context.strokeRect(pix,0,2,lineLength))}}},morpheus.Util.extend(morpheus.ScentedSearch,morpheus.AbstractCanvas),morpheus.ScrollBar=function(isVertical){morpheus.AbstractCanvas.call(this),this.isVertical=isVertical,$(this.canvas).css("border","1px solid #d8d8d8"),isVertical?this.setBounds({width:12}):this.setBounds({height:12}),this.field=this.isVertical?"y":"x";var that=this,mouseMove=function(event){if(!morpheus.CanvasUtil.dragging){var position=morpheus.CanvasUtil.getMousePos(event.target,event,!0),mouseOver=position[that.field]>=that.thumbPos&&position[that.field]<=that.thumbPos+that.thumbExtent;that.thumbMouseOver!==mouseOver&&(that.thumbMouseOver=mouseOver,that.repaint())}},mouseExit=function(e){!morpheus.CanvasUtil.dragging&&that.thumbMouseOver&&(that.thumbMouseOver=!1,that.repaint())};$(this.canvas).on("mousemove",mouseMove).on("mouseout",mouseExit).on("mouseenter",mouseMove),this.hammer=morpheus.Util.hammer(this.canvas,[this.isVertical?"panv":"panh","tap"]).on("panstart",function(event){var position=morpheus.CanvasUtil.getMousePos(event.target,event,!0);position[that.field]>=that.thumbPos&&position[that.field]<=that.thumbPos+that.thumbExtent?(that.draggingThumb=!0,that.dragStartThumbPos=that.thumbPos):that.draggingThumb=!1}).on("panend",function(event){that.draggingThumb=!1}).on("panmove",function(event){if(that.draggingThumb){var thumbPosPix=(morpheus.CanvasUtil.getMousePos(event.target,event),that.dragStartThumbPos+(that.isVertical?event.deltaY:event.deltaX)),f=thumbPosPix/(that.visibleExtent-that.thumbExtent),value=f*that.maxValue;that.setValue(value,!0),event.preventDefault(),event.srcEvent.stopPropagation(),event.srcEvent.stopImmediatePropagation()}}).on("tap doubletap",function(event){if(!that.draggingThumb){var position=morpheus.CanvasUtil.getMousePos(event.target,event);if(!that.decorator.tap(position)){var thumbExtentToValue=that.thumbExtent/that.totalExtent*that.totalExtent;that.scrollToTop=position[that.field]'];map.forEach(function(val,key){html.push("'),html.push(key),html.push("")}),html.push(""),formBuilder.append({name:"selected_value",type:"custom",value:html.join("")});var shapeField=new morpheus.ShapeField;formBuilder.append({col:"col-xs-2",name:"selected_shape",type:"custom",value:'
    '}),shapeField.$el.appendTo(formBuilder.find("shape"));var $valuePicker=formBuilder.$form.find("[name=valuePicker]"),selectedVal=$valuePicker.val(),_this=this;shapeField.setShapeValue(map.get(selectedVal)),shapeField.on("change",function(e){map.set(selectedVal,e.shape),_this.trigger("change",{value:selectedVal,shape:e.shape})}),$valuePicker.selectpicker().change(function(){selectedVal=$valuePicker.val(),shapeField.setShapeValue(map.get(selectedVal))}),this.$div=formBuilder.$form},morpheus.ShapeChooser.prototype={},morpheus.Util.extend(morpheus.ShapeChooser,morpheus.Events),morpheus.ShapeField=function(shapes){shapes=shapes||morpheus.VectorShapeModel.SHAPES;var _this=this,html=[],size2=8,x=4,y=4;html.push('
    '),html.push(''),html.push('
    ");var $el=$(html.join("")),$header=$el.find("[name=selection]");$el.on("click","li > a",function(e){var shape=$(this).attr("value");setShapeValue(shape),_this.trigger("change",{shape:shape})});var setShapeValue=function(val){if($header.attr("value",val),"none"===val)$header.html("(None)");else{var context=new C2S(2*size2,2*size2);context.translate(4,4),morpheus.CanvasUtil.drawShape(context,val,x,y,size2),$header.html(context.getSerializedSvg())}};this.setShapeValue=setShapeValue,this.$el=$el},morpheus.ShapeField.prototype={},morpheus.Util.extend(morpheus.ShapeField,morpheus.Events),morpheus.SortByValuesIndicator=function(project,isVertical,positions){morpheus.AbstractCanvas.call(this,!0),this.project=project,this.isVertical=isVertical,this.positions=positions,this.lastPosition={start:-1,end:-1}},morpheus.SortByValuesIndicator.prototype={prePaint:function(clip,context){var positions=this.positions,start=0,end=positions.getLength();this.isVertical?(start=morpheus.Positions.getTop(clip,positions),end=morpheus.Positions.getBottom(clip,positions)):(start=morpheus.Positions.getLeft(clip,positions),end=morpheus.Positions.getRight(clip,positions)),(this.invalid||start!==this.lastPosition.start||end!==this.lastPosition.end)&&(this.lastPosition.start=start,this.lastPosition.end=end,this.invalid=!0)},draw:function(clip,context){var project=this.project,isVertical=this.isVertical,positions=this.positions,sortKeys=isVertical?project.getColumnSortKeys():project.getRowSortKeys();context.translate(-clip.x,-clip.y),context.fillStyle="black",context.textBaseline="top",context.textAlign="left",context.font="8px "+morpheus.CanvasUtil.FONT_NAME;var start=0,end=positions.getLength();isVertical?(start=morpheus.Positions.getTop(clip,positions),end=morpheus.Positions.getBottom(clip,positions)):(start=morpheus.Positions.getLeft(clip,positions),end=morpheus.Positions.getRight(clip,positions));for(var arrowWidth=3,arrowHeight=4,i=0;i=start&&end>view){context.save();var pix=positions.getPosition(view),size=positions.getItemSize(view);isVertical?context.translate(2,pix+size/2):context.translate(pix+size/2,0),context.beginPath(),key.getSortOrder()===morpheus.SortKey.SortOrder.ASCENDING?(context.moveTo(0,0),context.lineTo(arrowWidth,arrowHeight),context.lineTo(-arrowWidth,arrowHeight)):key.getSortOrder()===morpheus.SortKey.SortOrder.DESCENDING?(context.moveTo(0,arrowHeight),context.lineTo(arrowWidth,0),context.lineTo(-arrowWidth,0)):(context.moveTo(0,0),context.lineTo(arrowWidth,arrowHeight/2),context.lineTo(0,arrowHeight),context.lineTo(-arrowWidth,arrowHeight/2)),context.fill(),context.restore()}}}}},morpheus.Util.extend(morpheus.SortByValuesIndicator,morpheus.AbstractCanvas),morpheus.SortDialog=function(project){function toggle(isColumns){_this.isColumns=isColumns;var $element=_this.build(project,isColumns);$div.empty().html($element),$div.on("click","[name=delete]",function(e){var $this=$(this);e.preventDefault(),$this.closest("div.row").remove()}),$div.on("click","[name=add]",function(e){var $this=$(this),level=[],$sibling=$this.closest("div.row");_this.createLevel(level,new morpheus.SortKey("",morpheus.SortKey.SortOrder.ASCENDING),_this.fields),$sibling.after($(level.join(""))),e.preventDefault()})}var _this=this,$chooserDiv=$('
    '),$div=$('
    '),html=[];html.push('
    '),html.push('
    '),html.push('
    '),html.push('
    '),html.push('
    '),html.push('
    '),html.push("
    "),html.push("
    "),html.push("
    "),$chooserDiv.html(html.join("")),$chooserDiv.on("change","[name=rowsOrColumns]",function(e){var $this=$(this);toggle("columns"===$this.val())}),toggle(!1);var $outer=$("
    ");$chooserDiv.appendTo($outer),$div.appendTo($outer),morpheus.FormBuilder.showOkCancel({title:"Sort",content:$outer,okCallback:function(){var $forms=$div.find("form"),sortBy=$forms.find("[name=sortBy]").map(function(){return $(this).val()}),sortOrder=$forms.find("[name=sortOrder]:checked").map(function(){return $(this).val()}),groupBy=$div.find("[name=groupBy]").val(),newSortKeys=[],modelIndices=_this.isColumns?project.getRowSelectionModel().toModelIndices():project.getColumnSelectionModel().toModelIndices(),existingSortKeys=_this.isColumns?project.getColumnSortKeys():project.getRowSortKeys(),keysToKeep=_.filter(existingSortKeys,function(key){return key instanceof morpheus.MatchesOnTopSortKey||key instanceof morpheus.SpecifiedModelSortOrder&&"dendrogram"===key.name});keysToKeep.length>0&&_.each(keysToKeep,function(key){newSortKeys.push(key)});for(var newSortKeyFields=new morpheus.Set,i=0;i'),html.push('
    '),html.push('
    '),html.push('
    ');var groupByKeys=(isColumns?project.getGroupColumns():project.getGroupRows()).map(function(key){return key.field});return html.push('"),html.push(""),html.push("
    "),$(html.join(""))},createLevel0:function(html){html.push('
    '),html.push('
    '),html.push('
    '),html.push('Add sort level'),html.push("
    "),html.push("
    "),html.push("
    ")},createLevel:function(html,key,fields){html.push('
    '),html.push('
    '),html.push('
    '),html.push('
    '),html.push('"),html.push("
    "),html.push('
    '),html.push('
    "),html.push('
    "),html.push("
    "),html.push('
    '),html.push('Delete'),html.push("
    "),html.push('
    '),html.push('Add sort level'),html.push("
    "),html.push("
    "),html.push("
    ")}},morpheus.Spacer=function(width,height){this.width=width,this.height=height},morpheus.Spacer.prototype={prefWidth:void 0,prefHeight:void 0,visible:!0,dispose:function(){},getPrefWidth:function(){return this.prefWidth},draw:function(clip){},getPreferredSize:function(){return{width:this.width,height:this.height}},setBounds:function(){},getPrefHeight:function(){return this.prefHeight},setPrefWidth:function(prefWidth){this.prefWidth=prefWidth},setPrefHeight:function(prefHeight){this.prefHeight=prefHeight},isVisible:function(){return this.visible},setVisible:function(visible){this.visible=visible},getWidth:function(){return this.width},getHeight:function(){return this.height}},morpheus.SteppedColorSupplier=function(){morpheus.AbstractColorSupplier.call(this),this.hiddenValue=0,this.hiddenValues=new morpheus.Set,this.stepped=!0},morpheus.SteppedColorSupplier.linearScale=function(value,input0,input1,pix0,pix1){return(value-input0)/(input1-input0)*(pix1-pix0)+pix0},morpheus.SteppedColorSupplier.prototype={createInstance:function(){return new morpheus.SteppedColorSupplier},isStepped:function(){return!0},getHiddenValues:function(){return this.hiddenValues},getIndexForFraction:function(f){var fractions=this.fractions;if(f<=fractions[0])return 0;if(f>=fractions[fractions.length-1])return fractions.length-1;for(var i=0;i=left&&right>f)return i}return fractions.length-1},getColor:function(row,column,value){if(this.hiddenValues.has(value)&&(value=this.hiddenValue),isNaN(value))return this.missingColor;var min=this.min,max=this.max,colors=this.colors;if(min>=value)return colors[0];if(value>=max)return colors[colors.length-1];var fraction=morpheus.SteppedColorSupplier.linearScale(value,min,max,0,100)/100;return colors[this.getIndexForFraction(fraction)]}},morpheus.Util.extend(morpheus.SteppedColorSupplier,morpheus.AbstractColorSupplier),morpheus.TabManager=function(options){function rename($a){var builder=new morpheus.FormBuilder;builder.append({name:"name",type:"text", +value:$.trim($a.contents().first().text())}),morpheus.FormBuilder.showOkCancel({title:"Rename Tab",content:builder.$form,okCallback:function(){var name=$.trim(builder.getValue("name"));""!==name&&(_this.activeTabObject.setName(name),$a.contents().first().replaceWith(name+" "))}})}this.options=$.extend({},{autohideTabBar:!1},options);var _this=this;this.activeTabObject=null,this.activeTabId=null,this.idToTabObject=new morpheus.Map,this.$nav=$(''),this.$nav.on("click","li > a",function(e){var tabId=$(this).attr("href");e.preventDefault(),_this.activeTabId!==tabId&&$(this).tab("show")}),this.$nav.on("dblclick","li > a",function(e){e.preventDefault(),$(this).data("morpheus-rename")&&rename($(this))}),this.$nav.on("contextmenu.morpheus","li > a",function(e){e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation();var $a=$(this);return $a.data("morpheus-rename")&&morpheus.Popup.showPopup([{name:"Rename"}],{x:e.pageX,y:e.pageY},e.target,function(event,item){rename($a)}),!1}),this.$nav.on("click","button",function(e){e.preventDefault();var target=$(this).attr("data-target");_this.remove(target)}),this.$tabContent=$('
    '),this.$nav.on("shown.bs.tab",'a[data-toggle="tab"]',function(e){if(!_this.adding){var previous=_this.activeTabObject;_this.activeTabId=$(e.target).attr("href"),_this.activeTabObject=_this.idToTabObject.get(_this.activeTabId),_this.trigger("change",{tab:_this.activeTabObject,previous:previous})}})},morpheus.TabManager.prototype={setTabText:function(id,text){this.$nav.find("a").filter("[href="+id+"]").contents().first().replaceWith(text+" "),this.idToTabObject.get(id).setName(name)},addTask:function(task){var $a=this.$nav.find("a[href="+task.tabId+"]");if(0===$a.length)throw new Error(task.tabId+" not found.");var $i=$a.find("i"),tasks=$i.data("tasks");tasks||(tasks=[]),task.id=_.uniqueId("task"),tasks.push(task),$i.data("tasks",tasks),$a.removeClass("animated flash").addClass("animated flash").one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){$(this).removeClass("animated flash")}),$i.addClass("fa fa-spinner fa-spin")},removeTask:function(task){var $a=this.$nav.find("a[href="+task.tabId+"]"),$i=$a.find("i"),tasks=$i.data("tasks");tasks||(tasks=[]);for(var index=-1,i=0;i'),li.push(''),li.push(options.title),li.push(' '),options.closeable&&li.push(' '),li.push("");var $link=$(li.join(""));$link.appendTo(this.$nav);var $panel=$('
    ');return options.$el.appendTo($panel),$panel.appendTo(this.$tabContent),options.enabled===!1&&($link.addClass("disabled"),$link.find("a").addClass("btn disabled")),options.focus&&(this.$nav.find('a[data-toggle="tab"]:last').tab("show"),this.activeTabId="#"+id,this.activeTabObject=options.object,$panel.focus()),this.adding=!1,this.options.autohideTabBar&&this.$nav.css("display",this.idToTabObject.size()>1?"":"none"),{$panel:$panel,id:"#"+id}},remove:function(target){void 0===target&&(target=this.activeTabId),this.idToTabObject.remove(target),this.$nav.find("[href="+target+"]").parent().remove(),this.$tabContent.find(target).remove();var $a=this.$nav.find('a[data-toggle="tab"]:last');0===$a.length&&this.options.landingPage&&this.options.landingPage.show(),$a.tab("show"),this.options.autohideTabBar&&this.$nav.css("display",this.idToTabObject.size()>1?"":"none")},setActiveTab:function(id){id===this.activeTabId&&this.trigger("change",{tab:this.activeTabObject,previous:null});var $a=this.$nav.find("[href="+id+"]");$a.parent().removeClass("disabled"),$a.removeClass("btn disabled"),$a.tab("show")},setTabTitle:function(id,title){this.$nav.find("a").filter("[href="+id+"]").attr("title",title)},setTabEnabled:function(id,enabled){var $a=this.$nav.find("a").filter("[href="+id+"]");enabled?($a.parent().removeClass("disabled"),$a.removeClass("btn disabled")):($a.parent().addClass("disabled"),$a.addClass("btn disabled"))}},morpheus.Util.extend(morpheus.TabManager,morpheus.Events),morpheus.Table=function(options){options=morpheus.Table.createOptions(options),this.options=options,options.width||(options.width=options.$el.attr("class"));var _this=this,height=options.height,$gridDiv=$('
    ');this.$gridDiv=$gridDiv,$gridDiv.appendTo(options.$el);var columns=options.columns;this.columns=columns;var visibleColumns=columns.filter(function(c){return c.visible}),grid=new morpheus.Grid({gridOptions:{forceFitColumns:!0,select:options.select,rowHeight:options.rowHeight,autoEdit:!1,editable:!1,autoHeight:"auto"===options.height,enableTextSelectionOnCells:!0},$el:$gridDiv,items:options.items,columns:visibleColumns});if(this.grid=grid,options.search){var tableSearch=new morpheus.TableSearchUI;tableSearch.$el.prependTo(options.$el),tableSearch.setTable(this),this.tableSearch=tableSearch}if(visibleColumns.length!==this.columns.length){var select=[];select.push('");var $select=$(select.join("")),$div=$('
    ');$select.appendTo($div),$div.prependTo(options.$el),$select.selectpicker({iconBase:"fa",tickIcon:"fa-check",style:"btn-default btn-sm"}),$select.on("change",function(){var selectedItems=$select.val(),selectedItemsSet=new morpheus.Set;selectedItems.forEach(function(item){selectedItemsSet.add(parseInt(item))});var visibleColumns=[];_this.columns.forEach(function(c,i){selectedItemsSet.has(i)&&visibleColumns.push(c)}),grid.setColumns(visibleColumns),_this.resize(),_this.redraw()})}var collapsed=!1,lastWidth=-1,resize=function(){if(_this.options.responsive){var gridWidth=options.$el.width();gridWidth!==lastWidth&&(lastWidth=gridWidth,$gridDiv.css("width",gridWidth+"px"),!collapsed&&gridWidth1?(collapsed=!0,$gridDiv.addClass("slick-stacked"),_this.grid.grid.getOptions().rowHeight=options.rowHeight*columns.length,_this.grid.grid.setColumns([{id:0,tooltip:function(item,value){for(var html=[],i=0;i")},collapsed:!0,getter:function(item){return item},formatter:function(row,cell,value,columnDef,dataContext){var html=[];html.push('
    '),options.rowHeader&&html.push(options.rowHeader(dataContext));for(var i=0;i'):html.push("
    ");var c=columns[i],s=c.renderer(dataContext,c.getter(dataContext));html.push(s),html.push("
    ")}return html.push("
    "),html.join("")},sortable:!1,name:""}]),$gridDiv.find(".slick-header").hide(),_this.grid.grid.resizeCanvas(),_this.grid.grid.invalidate()):collapsed&&gridWidth>=options.collapseBreakpoint?($gridDiv.removeClass("slick-stacked"),collapsed=!1,options.showHeader&&$gridDiv.find(".slick-header").show(),_this.grid.grid.getOptions().rowHeight=options.rowHeight,_this.grid.grid.setColumns(columns),_this.grid.grid.resizeCanvas(),options.select&&_this.grid.grid.setSelectedRows(_this.grid.grid.getSelectedRows()),_this.grid.grid.invalidate()):(_this.grid.grid.resizeCanvas(),_this.grid.grid.invalidate()))}};options.showHeader||$gridDiv.find(".slick-header").hide(),options.responsive&&($(window).on("resize orientationchange",resize),$gridDiv.on("remove",function(){$(window).off("resize",resize)}),resize()),this.resize=resize,options.columns.length>1&&null!=options.items&&options.items.length>0&&this.setItems(options.items)},morpheus.Table.defaultRenderer=function(item,value){if(_.isNumber(value))return morpheus.Util.nf(value);if(morpheus.Util.isArray(value)){for(var s=[],i=0,length=value.length;length>i;i++){i>0&&s.push(", ");value[i];s.push(value[i])}return s.join("")}return""+value},morpheus.Table.prototype={setHeight:function(height){if(this.options.height=height,"auto"===height?(this.$gridDiv.css("height",""),this.grid.grid.getOptions().autoHeight=!0,this.grid.grid.setOptions(this.grid.grid.getOptions())):this.$gridDiv.css("height",height),this.grid.grid.resizeCanvas(),"auto"===height){var height=this.getItems().length*this.options.rowHeight+this.options.rowHeight;this.$gridDiv.find(".slick-viewport").css("height",height+"px")}this.grid.grid.invalidate()},setSearchVisible:function(visible){this.tableSearch&&(visible?this.tableSearch.$el.show():this.tableSearch.$el.hide())},autocomplete:function(tokens,response){var matches=[],token=null!=tokens&&tokens.length>0?tokens[tokens.selectionStartIndex]:"";token=$.trim(token);var columns=this.columns.filter(function(c){return c.searchable}),ncolumns=columns.length,showField=ncolumns>1;if(""===token){if(1>=ncolumns)return response(matches);for(var i=0;ncolumns>i;i++){var field=columns[i].name;matches.push({value:field+":",label:''+field+":",show:!0})}return matches.sort(function(a,b){return a.value===b.value?0:a.value0){if(92!==token.charCodeAt(semi-1)){var possibleField=$.trim(token.substring(0,semi));possibleField.length>0&&'"'===possibleField[0]&&'"'===possibleField[token.length-1]&&(possibleField=possibleField.substring(1,possibleField.length-1));for(var columnNameToColumn=new morpheus.Map,columnNames=columns.map(function(c){return c.name}),i=0;i1)for(var regex=new RegExp("^"+morpheus.Util.escapeRegex(token),"i"),j=0;ncolumns>j;j++){var field=columns[j].name;regex.test(field)&&matches.push({value:field+":",label:''+field+":",show:!0})}for(var set=new morpheus.Set,regex=new RegExp("^"+morpheus.Util.escapeRegex(token),"i"),items=this.getItems(),maxSize=matches.length+10,i=0,nitems=items.length;nitems>i;i++)for(var item=items[i],j=0;ncolumns>j;j++){var field=columns[j].name,value=columns[j].getter(item);if(morpheus.Util.isArray(value))for(var nvalues=value.length,k=0;nvalues>k;k++){var val=value[k];if(regex.test(val)&&!set.has(val)&&(set.add(val),matches.push({value:showField?field+":"+val:val,label:showField?''+field+':'+val+"":''+val+""})),matches.length===maxSize)return response(matches)}else if(regex.test(value)&&!set.has(value)&&(set.add(value),matches.push({value:showField?field+":"+value:value,label:showField?''+field+':'+value+"":''+value+""}),matches.length===maxSize))return response(matches)}return response(matches)},searchWithPredicates:function(predicates){if(null==predicates||0===predicates.length)return void this.grid.setFilter(null);for(var columns=this.columns.filter(function(c){return c.searchable}),columnNameToColumn=new morpheus.Map,columnNames=columns.map(function(c){return c.name}),i=0;ii;i++){var predicate=predicates[i],filterColumnName=predicate.getField();if(null!=filterColumnName){var column=columnNameToColumn.get(filterColumnName);column&&(predicate.column=column,filteredPredicates.push(predicate))}else filteredPredicates.push(predicate)}predicates=filteredPredicates,npredicates=predicates.length,this.grid.setFilter(function(item){for(var p=0;npredicates>p;p++){var searchColumns,predicate=predicates[p];searchColumns=predicate.column?[predicate.column]:columns;for(var j=0,ncolumns=searchColumns.length;ncolumns>j;j++){var value=searchColumns[j].getter(item);if(morpheus.Util.isArray(value)){for(var nvalues=value.length,i=0;nvalues>i;i++)if(predicate.accept(value[i]))return!0}else{var predicate=predicates[p];if(predicate.accept(value))return!0}}}return!1})},search:function(text){if(""===text)this.grid.setFilter(null);else{var tokens=morpheus.Util.getAutocompleteTokens(text),columns=this.columns.filter(function(c){return c.searchable}),columnNames=columns.map(function(c){return c.name}),predicates=morpheus.Util.createSearchPredicates({tokens:tokens,fields:columnNames});this.searchWithPredicates(predicates)}},getSelectedRows:function(){return this.grid.getSelectedRows()},getSelectedItems:function(){return this.grid.getSelectedItems()},getSelectedItem:function(){return this.grid.getSelectedItem()},setSelectedRows:function(rows){this.grid.setSelectedRows(rows)},getItems:function(items){return this.grid.getItems()},getAllItemCount:function(){return this.grid.getAllItemCount()},getFilteredItemCount:function(){return this.grid.getFilteredItemCount()},setFilter:function(f){this.grid.setFilter(f)},setItems:function(items){this.grid.setItems(items),this.grid.redraw()},redraw:function(){this.grid.redraw()},on:function(evtStr,handler){this.grid.on(evtStr,handler)},off:function(evtStr,handler){this.grid.off(evtStr,handler)},trigger:function(evtStr){this.grid.trigger(evtStr)}},morpheus.Table.createOptions=function(options){options=$.extend(!0,{},{items:[],height:"564px",collapseBreakpoint:500,showHeader:!0,select:!0,rowHeader:null,responsive:!0,fixedWidth:"320px"},options),options.columns||(options.columns=[{name:""}]);var columns=[];return options.columns.forEach(function(c,i){var column=$.extend(!0,{},{id:i,tooltip:function(dataContext,value){return morpheus.Table.defaultRenderer(dataContext,value)},formatter:function(row,cell,value,columnDef,dataContext){return column.renderer(dataContext,value)},comparator:function(a,b){var aNaN=null==a||_.isNumber(a)&&isNaN(a),bNaN=null==b||_.isNumber(b)&&isNaN(b);return aNaN&&bNaN?0:aNaN?1:bNaN?-1:(a.toLowerCase&&(a=a.toLowerCase()),b.toLowerCase&&(b=b.toLowerCase()),a===b?0:b>a?-1:1)},sortable:!0,searchable:!0,width:null,name:c.name,renderer:morpheus.Table.defaultRenderer},c);void 0===column.visible&&(column.visible=!0),column.getter||(column.getter=null==column.field?function(item){return item}:function(item){return item[c.field]}),options.rowHeader&&0===i&&(column.formatter=function(row,cell,value,columnDef,dataContext){return options.rowHeader(dataContext)+column.renderer(dataContext,value)}),columns.push(column)}),options.columns=columns,1===options.columns.length?options.tableClass="slick-table-compact":options.tableClass="slick-striped-table",options.rowHeight||(options.rowHeight="slick-table-compact"===options.tableClass?18:20),options},morpheus.TableSearchUI=function(){var _this=this,html=[];html.push('
    '),html.push('
    '),html.push('
    '),html.push(''),html.push('
    '),html.push("
    "),html.push("
    "),html.push("
    ");var $el=$(html.join(""));this.$el=$el,$el.find("form").on("submit",function(e){e.preventDefault()});var $search=$el.find("[name=search]"),$searchResults=$el.find("[name=searchResults]");this.$searchResults=$searchResults,$search.on("keyup",_.debounce(function(){_this.table.search($.trim($(this).val()))},100)),morpheus.Util.autosuggest({$el:$search,suggestWhenEmpty:!0,filter:function(tokens,response){_this.table.autocomplete(tokens,response)},select:function(){_this.table.search($.trim($search.val()))}})},morpheus.TableSearchUI.prototype={updateSearchLabel:function(){var filteredCount=this.table.getFilteredItemCount(),text="";filteredCount!==this.table.getAllItemCount()&&(text+=morpheus.Util.intFormat(filteredCount)+" match"+(1!==filteredCount?"es":"")),this.$searchResults.html(text)},setTable:function(table){this.table=table;var _this=this;table.options.responsive||this.$el.css("width",table.options.fixedWidth),table.on("filter",function(){_this.updateSearchLabel()})}},morpheus.TrackSelection=function(track,positions,selectionModel,isColumns,controller){function getPosition(event,useDelta){if(track.settings.squished){var total=positions.getPosition(positions.getLength()-1)+positions.getItemSize(positions.getLength()-1),squishFactor=total/(isColumns?track.getUnscaledWidth():track.getUnscaledHeight()),p=(morpheus.CanvasUtil.getClientXY(event,useDelta),morpheus.CanvasUtil.getMousePosWithScroll(event.target,event,0,0,useDelta));return p[coord]*=squishFactor,p}return morpheus.CanvasUtil.getMousePosWithScroll(event.target,event,controller.scrollLeft(),controller.scrollTop(),useDelta)}var canvas=track.canvas,startIndex=-1,coord=isColumns?"x":"y";this.hammer=morpheus.Util.hammer(canvas,["pan","tap","longpress"]).on("longpress",function(event){event.preventDefault(),event.srcEvent.stopImmediatePropagation(),event.srcEvent.stopPropagation(),controller.setSelectedTrack(track.name,isColumns),track.showPopup(event.srcEvent)}).on("panmove",function(event){var position=getPosition(event),endIndex=positions.getIndex(position[coord],!1),commandKey=morpheus.Util.IS_MAC?event.srcEvent.metaKey:event.srcEvent.ctrlKey,viewIndices=commandKey?selectionModel.getViewIndices():new morpheus.Set,_startIndex=startIndex;if(startIndex>endIndex){var tmp=endIndex;endIndex=_startIndex,_startIndex=tmp}for(var i=_startIndex;endIndex>=i;i++)viewIndices.add(i);if(selectionModel.setViewIndices(viewIndices,!0),isColumns){var scrollLeft=controller.scrollLeft(),scrollRight=scrollLeft+controller.heatmap.getUnscaledWidth();position.x>scrollRight?controller.scrollLeft(scrollLeft+8):position.xscrollBottom?controller.scrollTop(scrollTop+8):position.y1){if(isColumns&&!controller.options.columnsSortable||!isColumns&&!controller.options.rowsSortable)return;controller.sortBasedOnSelection(null,isColumns,event.srcEvent.shiftKey)}else{controller.setSelectedTrack(track.name,isColumns);var commandKey=morpheus.Util.IS_MAC?event.srcEvent.metaKey:event.srcEvent.ctrlKey;if(morpheus.Util.IS_MAC&&event.srcEvent.ctrlKey)return;var viewIndices;if(commandKey)viewIndices=selectionModel.getViewIndices(),viewIndices.has(index)?viewIndices.remove(index):viewIndices.add(index);else if(event.srcEvent.shiftKey){viewIndices=selectionModel.getViewIndices();var min=Number.MAX_VALUE,max=-Number.MAX_VALUE;for(var viewIndex in viewIndices)min=Math.min(viewIndex,min),max=Math.max(viewIndex,max);if(index>=max)for(var i=max;index>=i;i++)viewIndices.add(i);else for(var i=Math.min(index,min),max=Math.max(index,min);max>=i;i++)viewIndices.add(i)}else viewIndices=new morpheus.Set,viewIndices.add(index);selectionModel.setViewIndices(viewIndices,!0)}})},morpheus.TrackSelection.prototype={dispose:function(){this.hammer.destroy()}},morpheus.VectorTrack=function(project,name,positions,isColumns,heatmap){morpheus.AbstractCanvas.call(this,!0),this.preferredSize={width:0,height:0},this.project=project,this.positions=positions,this.isColumns=isColumns,this.name=name,this.visible=!0,this.heatmap=heatmap,this.id=_.uniqueId();var _this=this;this.updateSpanMapFunction=function(){_this.spanMap=morpheus.VectorUtil.createSpanMap(_this.getVector())},this.lastPosition={start:-1,end:-1},this.events="rowSortOrderChanged rowFilterChanged datasetChanged";var mouseMoved=function(event){var index=-1;if("mouseout"!==event.type){var position=morpheus.CanvasUtil.getMousePosWithScroll(event.target,event,heatmap.scrollLeft(),heatmap.scrollTop());if(_this.settings.squished){var total=positions.getPosition(positions.getLength()-1)+positions.getItemSize(positions.getLength()-1),squishFactor=total/(isColumns?_this.getUnscaledWidth():_this.getUnscaledHeight());position[isColumns?"x":"y"]*=squishFactor}index=isColumns?_this.positions.getIndex(position.x,!1):_this.positions.getIndex(position.y,!1)}isColumns?heatmap.setMousePosition(-1,index,{name:_this.name,event:event}):heatmap.setMousePosition(index,-1,{name:_this.name,event:event})};$(this.canvas).on("contextmenu.morpheus",function(e){return e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),heatmap.setSelectedTrack(_this.name,isColumns),_this.showPopup(e),!1}),this.settings={maxTextWidth:void 0,squished:!1,inlineTooltip:!1,tooltip:!0,discrete:!0,highlightMatchingValues:!1,discreteAutoDetermined:!1,colorBarSize:12,stackedBar:!1,renderMethod:{},selectionColor:"rgb(182,213,253)",colorByField:null,barColor:"#bdbdbd",barSize:40,arcSize:60,min:void 0,mid:void 0,max:void 0,minMaxReversed:!1},$(this.canvas).on("mousemove.morpheus mouseout.morpheus",mouseMoved)},morpheus.VectorTrack.RENDER={TEXT:0,COLOR:1,BAR:2,MOLECULE:3,TEXT_AND_COLOR:4,SHAPE:5,ARC:6,BOX_PLOT:7},morpheus.VectorTrack.vectorToString=function(vector){var formatter=function(v){return""+v},dataType=morpheus.VectorUtil.getDataType(vector);return"number"===dataType?formatter=morpheus.Util.nf:"[number]"===dataType?formatter=function(v){var s=[];if(null!=v)for(var i=0,arrayLength=v.length;arrayLength>i;i++)s.push(morpheus.Util.nf(v[i]));return s.join(", ")}:"[string]"===dataType&&(formatter=function(v){var s=[];if(null!=v)for(var i=0,arrayLength=v.length;arrayLength>i;i++)s.push(v[i]);return s.join(", ")}),formatter},morpheus.VectorTrack.prototype={settingFromConfig:function(conf){var settings=this.settings;if(_.isString(conf)){settings.renderMethod={};for(var tokens=conf.split(","),i=0,length=tokens.length;length>i;i++){var method=$.trim(tokens[i]);method=method.toUpperCase();var mapped=morpheus.VectorTrack.RENDER[method];void 0!==mapped?settings.renderMethod[mapped]=!0:"DISCRETE"===method?(settings.discrete=!0,settings.discreteAutoDetermined=!0):"CONTINUOUS"===method?(settings.discrete=!1,settings.discreteAutoDetermined=!0):"HIGHLIGHT"===method?settings.highlightMatchingValues=!0:"STACKED_BAR"===method?(settings.stackedBar=!0,settings.renderMethod[morpheus.VectorTrack.RENDER.BAR]=!0):"BOX_PLOT"===method?settings.renderMethod[morpheus.VectorTrack.RENDER.BOX_PLOT]=!0:console.log(method+" not found.")}}else _.isNumber(conf)?(settings.renderMethod={},settings.renderMethod[conf]=!0):_.isObject(conf)&&(conf.maxTextWidth=void 0,this.settings=$.extend({},this.settings,conf));this._update()},isDiscrete:function(){return this.settings.discrete},setShowTooltip:function(value){this.settings.tooltip=value},isShowTooltip:function(){return this.settings.tooltip},isRenderAs:function(value){return this.settings.renderMethod[value]},dispose:function(){morpheus.AbstractCanvas.prototype.dispose.call(this),$(this.canvas).off("contextmenu.morpheus mousemove.morpheus mouseout.morpheus"),this.project.off(this.events,this.updateSpanMapFunction)},getName:function(){return this.name},getVector:function(name){name=null==name?this.name:name;var vector=this.isColumns?this.project.getSortedFilteredDataset().getColumnMetadata().getByName(name):this.project.getSortedFilteredDataset().getRowMetadata().getByName(name);return vector?vector:new morpheus.Vector(name,0)},getFullVector:function(){var vector=this.isColumns?this.project.getFullDataset().getColumnMetadata().getByName(this.name):this.project.getFullDataset().getRowMetadata().getByName(this.name);return vector?vector:new morpheus.Vector(this.name,0)},_updatePreferredSize:function(){var size=this._computePreferredSize();this.preferredSize.width=size.width,this.preferredSize.height=size.height},_computePreferredSize:function(forPrint){var width=0,height=0;if(this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT)||this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR))if(this.positions.getSize()>=6){var context=this.canvas.getContext("2d"),textWidth=morpheus.CanvasUtil.getVectorStringWidth(context,this.getVector(),this.positions,forPrint?-1:this.isColumns?120:100);forPrint||(textWidth=Math.min(textWidth,this.isColumns?100:500),this.settings.maxTextWidth=textWidth),width+=textWidth}else forPrint||(this.settings.maxTextWidth=0);this.isRenderAs(morpheus.VectorTrack.RENDER.BAR)&&(width+=this.settings.barSize),this.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)&&(width+=this.settings.colorBarSize),this.isRenderAs(morpheus.VectorTrack.RENDER.SHAPE)&&(width+=this.settings.colorBarSize),this.isRenderAs(morpheus.VectorTrack.RENDER.MOLECULE)&&(width+=300),forPrint||this.isRenderAs(morpheus.VectorTrack.RENDER.MOLECULE)||(width=Math.min(300,width)),this.isRenderAs(morpheus.VectorTrack.RENDER.ARC)&&(width+=this.settings.arcSize),this.isRenderAs(morpheus.VectorTrack.RENDER.BOX_PLOT)&&(width+=100);var nkeys=_.keys(this.settings.renderMethod).length;return nkeys>0&&(width+=2*(nkeys-1)),width=Math.max(0,width),this.isColumns?{width:height,height:width}:{width:width,height:height}},getPreferredSize:function(){return this.preferredSize},getPrintSize:function(){return this._computePreferredSize(!0)},_createDiscreteValueMap:function(){var values=morpheus.VectorUtil.getValues(this.getFullVector());values.sort(morpheus.SortKey.ASCENDING_COMPARATOR),this.discreteValueMap=new morpheus.Map;for(var i=0,length=values.length;length>i;i++)this.discreteValueMap.set(values[i],i+1);this.settings.min=0,this.settings.mid=0,this.settings.max=values.length},_setChartMinMax:function(){if(this.isRenderAs(morpheus.VectorTrack.RENDER.BAR)||this.isRenderAs(morpheus.VectorTrack.RENDER.BOX_PLOT))if(this.settings.stackedBar||!this.settings.discrete||this.isRenderAs(morpheus.VectorTrack.RENDER.BOX_PLOT)){if(null==this.settings.min||null==this.settings.max||null==this.settings.mid){var vector=this.getFullVector(),minMax=morpheus.VectorUtil.getMinMax(vector),min=minMax.min,max=minMax.max;if(this.settings.minMaxReversed){var tmp=max;max=min,min=tmp}null==this.settings.min&&(this.settings.min=Math.min(0,min)),null==this.settings.max&&(this.settings.max=Math.max(0,max)),null==this.settings.mid&&(this.settings.mid=this.settings.min<0?0:this.settings.min)}}else this.discreteValueMap||this._createDiscreteValueMap()},_update:function(){if(!this.settings.discreteAutoDetermined&&(this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR)||this.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||this.isRenderAs(morpheus.VectorTrack.RENDER.BAR))&&((this.getFullVector().getProperties().has(morpheus.VectorKeys.FIELDS)||"number"===morpheus.VectorUtil.getDataType(this.getFullVector()))&&(this.settings.discrete=!1,this.settings.highlightMatchingValues=!1),this.settings.discreteAutoDetermined=!0),this.isRenderAs(morpheus.VectorTrack.RENDER.MOLECULE)&&this.project.off(this.events,this.updateSpanMapFunction),this._setChartMinMax(),this.isRenderAs(morpheus.VectorTrack.RENDER.MOLECULE)&&(this.project.on(this.events,this.updateSpanMapFunction),!this.moleculeCache)){this.moleculeCache={};var _this=this,valueToModelIndices=this.getFullVector().getProperties().get(morpheus.VectorKeys.VALUE_TO_INDICES);if(!valueToModelIndices){var fullVector=this.getFullVector();valueToModelIndices=morpheus.VectorUtil.createValueToIndicesMap(fullVector),fullVector.getProperties().set(morpheus.VectorKeys.VALUE_TO_INDICES,valueToModelIndices)}if(void 0!==_this.heatmap.options.structureUrlProvider)valueToModelIndices.forEach(function(indices,value){var url=_this.heatmap.options.structureUrlProvider(value),image=new Image;image.src=url,_this.moleculeCache[value]=image}),setTimeout(2e3,function(){_this.setInvalid(!0),_this.repaint()});else for(var values=valueToModelIndices.keys(),doRequest=function(smile){$.ajax({contentType:"text/plain",context:{smile:smile},data:{string:smile,representation:"sdf"},url:"http://cactus.nci.nih.gov/chemical/structure"}).done(function(text){_this.moleculeCache[this.smile]=text,values.length>0&&doRequest(values.pop()),_this.invalid=!0,_this.repaint()})},i=0;6>i;i++)doRequest(values.pop());this.updateSpanMapFunction()}this._updatePreferredSize()},postPaint:function(clip,context){context.lineWidth=1,context.strokeStyle="Grey";var project=this.project,setup=this._setup(context,clip),vector=setup.vector,start=setup.start,end=setup.end;this.isColumns?-1!==project.getHoverColumnIndex()&&this.drawColumnBorder(context,this.positions,project.getHoverColumnIndex(),this.getUnscaledHeight()):-1!==project.getHoverRowIndex()&&this.drawRowBorder(context,this.positions,project.getHoverRowIndex(),this.getUnscaledWidth()),this._highlightMatchingValues(context,vector,start,end)},_highlightMatchingValues:function(context,viewVector,start,end){var project=this.project,positions=this.positions;context.strokeStyle="black",context.lineWidth=3;var hoverIndex=this.isColumns?project.getHoverColumnIndex():project.getHoverRowIndex(),value=viewVector.getValue(hoverIndex);if(this.settings.highlightMatchingValues&&-1!==hoverIndex&&this.heatmap.mousePositionOptions&&this.heatmap.mousePositionOptions.name===viewVector.getName()){var valueToModelIndices=this.getFullVector().getProperties().get(morpheus.VectorKeys.VALUE_TO_INDICES);if(!valueToModelIndices){var fullVector=this.getFullVector();valueToModelIndices=morpheus.VectorUtil.createValueToIndicesMap(fullVector),fullVector.getProperties().set(morpheus.VectorKeys.VALUE_TO_INDICES,valueToModelIndices)}var indices=valueToModelIndices.get(value);if(null==indices)return void console.log("valueToModelIndices error");if(indices.length<=1)return;if(this.isColumns){if(-1!==project.getHoverColumnIndex()){var height=this.getUnscaledHeight();context.beginPath();for(var i=0,nindices=indices.length;nindices>i;i++){var viewIndex=project.convertModelColumnIndexToView(indices[i]);if(viewIndex>=start&&end>viewIndex){var size=positions.getItemSize(viewIndex),pix=positions.getPosition(viewIndex);context.rect(pix,0,size,height)}}context.stroke()}}else{context.beginPath();for(var width=this.getUnscaledWidth(),indices=valueToModelIndices.get(value),i=0,nindices=indices.length;nindices>i;i++){var viewIndex=project.convertModelRowIndexToView(indices[i]);if(viewIndex>=start&&end>viewIndex){var size=positions.getItemSize(viewIndex),pix=positions.getPosition(viewIndex);context.rect(0,pix,width,size)}}context.stroke()}}},prePaint:function(clip,context){var project=this.project,positions=this.positions,height=this.getUnscaledHeight(),width=this.getUnscaledWidth(),setup=this._setup(context,clip),start=setup.start,end=setup.end; context.lineWidth=1,context.fillStyle=this.settings.selectionColor;if(this.isColumns){var viewIndices=project.getColumnSelectionModel().getViewIndices();viewIndices.forEach(function(i){if(i>=start&&end>=i){var size=positions.getItemSize(i),pix=positions.getPosition(i);context.fillRect(pix,0,size,height)}})}else if(!this.isRenderAs(morpheus.VectorTrack.RENDER.MOLECULE)){var viewIndices=project.getRowSelectionModel().getViewIndices();viewIndices.forEach(function(i){if(i>=start&&end>=i){var size=positions.getItemSize(i),pix=positions.getPosition(i);context.fillRect(0,pix,width,size)}})}(this.invalid||start!==this.lastPosition.start||end!==this.lastPosition.end)&&(this.lastPosition.start=start,this.lastPosition.end=end,this.invalid=!0)},drawRowBorder:function(context,positions,index,gridSize){var size=positions.getItemSize(index),pix=positions.getPosition(index);context.beginPath(),context.moveTo(0,pix+size),context.lineTo(gridSize,pix+size),context.stroke(),context.beginPath(),context.moveTo(0,pix),context.lineTo(gridSize,pix),context.stroke()},drawColumnBorder:function(context,positions,index,gridSize){var size=positions.getItemSize(index),pix=positions.getPosition(index);context.beginPath(),context.moveTo(pix+size,0),context.lineTo(pix+size,gridSize),context.stroke(),context.beginPath(),context.moveTo(pix,0),context.lineTo(pix,gridSize),context.stroke()},isSquished:function(){return this.settings.squished},_setup:function(context,clip){var start=0,vector=this.getVector(),end=vector.size(),settings=this.settings,positions=this.positions,width=clip.width,height=clip.height;if(settings.squished||(this.isColumns?(start=morpheus.Positions.getLeft(clip,positions),end=morpheus.Positions.getRight(clip,positions)):(start=morpheus.Positions.getTop(clip,positions),end=morpheus.Positions.getBottom(clip,positions))),settings.squished){var total=positions.getPosition(positions.getLength()-1)+positions.getItemSize(positions.getLength()-1);if(this.isColumns){var squishFactor=width/total;context.scale(squishFactor,1)}else{var squishFactor=height/total;context.scale(1,squishFactor)}}else context.translate(-clip.x,-clip.y);return{start:start,end:end,vector:vector}},draw:function(clip,context){this._draw(clip,context,this.isColumns?this.getUnscaledHeight():this.getUnscaledWidth())},print:function(clip,context){this._draw(clip,context,this.isColumns?clip.height:clip.width)},_draw:function(clip,context,availableSpace){var fullAvailableSpace=availableSpace,positions=this.positions,setup=this._setup(context,clip),start=setup.start,end=setup.end,vector=setup.vector;context.textAlign="left",context.fillStyle=morpheus.CanvasUtil.FONT_COLOR;var fontSize=Math.min(24,positions.getSize()-2),size=0;if(context.font=fontSize+"px "+morpheus.CanvasUtil.FONT_NAME,context.strokeStyle=morpheus.HeatMapElementCanvas.GRID_COLOR,context.lineWidth=.1,this.heatmap.heatmap.isDrawGrid()&&!this.settings.squished)if(this.isColumns)for(var gridSize=availableSpace,i=start;end>i;i++){var size=positions.getItemSize(i),pix=positions.getPosition(i);size>7&&(context.beginPath(),context.moveTo(pix+size,0),context.lineTo(pix+size,gridSize),context.stroke())}else if(!this.isRenderAs(morpheus.VectorTrack.RENDER.MOLECULE))for(var gridSize=availableSpace,i=start;end>i;i++){var size=positions.getItemSize(i),pix=positions.getPosition(i);size>7&&(context.beginPath(),context.moveTo(0,pix+size),context.lineTo(gridSize,pix+size),context.stroke())}context.lineWidth=1;var offset=1;if(this.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)&&(this.renderColor(context,vector,start,end,clip,this.isColumns?availableSpace:0,!this.settings.discrete),offset+=this.settings.colorBarSize+2,availableSpace-=offset),!this.settings.squished&&this.isRenderAs(morpheus.VectorTrack.RENDER.SHAPE)&&(this.renderShape(context,vector,start,end,clip,this.isColumns?availableSpace-offset:offset),offset+=this.settings.colorBarSize+2,availableSpace-=offset),this.isRenderAs(morpheus.VectorTrack.RENDER.ARC)&&(this.renderArc(context,vector,start,end,clip,this.settings.arcSize),offset+=this.settings.arcSize+2,availableSpace-=offset),!this.settings.squished&&this.isRenderAs(morpheus.VectorTrack.RENDER.MOLECULE)&&this.renderMolecule(context,vector,start,end,clip,offset,availableSpace),this.isRenderAs(morpheus.VectorTrack.RENDER.BOX_PLOT)){var barSize=this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT)?this.settings.barSize:availableSpace-2;offset++,this.renderBoxPlot(context,vector,start,end,clip,offset,barSize),offset+=barSize+2,availableSpace-=offset}if(this.isRenderAs(morpheus.VectorTrack.RENDER.BAR)){var barSize=this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT)?this.settings.barSize:availableSpace-1;if(this.settings.stackedBar)this.renderStackedBar(context,vector,start,end,clip,offset,barSize);else{var fields=vector.getProperties().get(morpheus.VectorKeys.FIELDS),visibleFieldIndices=vector.getProperties().get(morpheus.VectorKeys.VISIBLE_FIELDS);null!=fields&&null==visibleFieldIndices&&(visibleFieldIndices=morpheus.Util.seq(fields.length)),null!=fields?this.renderUnstackedBar(context,vector,start,end,clip,offset,barSize,visibleFieldIndices):this.renderBar(context,vector,start,end,clip,offset,barSize)}offset+=barSize+2,availableSpace-=offset}!this.settings.squished&&this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR)&&(this.renderText(context,vector,!0,start,end,clip,offset,this.isColumns?fullAvailableSpace:0),offset+=this.settings.maxTextWidth+2,availableSpace-=offset),this.textWidth=0,!this.settings.squished&&this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT)&&(this.textWidth=availableSpace,this.renderText(context,vector,!1,start,end,clip,offset,this.isColumns?fullAvailableSpace:0),offset+=this.settings.textWidth+2,availableSpace-=offset)},showPopup:function(e,isHeader){function addSection(name){items.length>0&&items.push({separator:!0}),items=items.concat(sectionToItems[name])}if(this.heatmap.options.popupEnabled){var _this=this,project=this.project,isColumns=this.isColumns,hasSelection=isColumns?project.getColumnSelectionModel().count()>0:project.getRowSelectionModel().count()>0,ANNOTATE_SELECTION="Annotate Selection",INVERT_SELECTION="Invert Selection",SELECT_ALL="Select All",SHOW_SELECTION_ONLY="Show Selection Only",CLEAR_SELECTION="Clear Selection",HIGHLIGHT_MATCHING_VALUES="Highlight Matching Values",FIELDS="Fields...",DELETE="Delete...",TOOLTIP="Show In Tooltip",HIDE="Hide",REMOVE_SHOW_SELECTION_ONLY="Show All",SORT_ASC="Sort Ascending",SORT_DESC="Sort Descending",FILTER="Filter...",SORT_SEL_ASC="Sort Heat Map Ascending",SORT_SEL_DESC="Sort Heat Map Descending",SORT_SEL_TOP_N="Sort Heat Map Descending/Ascending",DISPLAY_BAR="Show Bar Chart",DISPLAY_STACKED_BAR="Stacked",DISPLAY_COLOR="Show Color",DISPLAY_TEXT="Show Text",DISPLAY_SHAPE="Show Shape",DISPLAY_ARC="Show Arc",DISPLAY_TEXT_AND_COLOR="Show Colored Text",DISPLAY_STRUCTURE="Show Chemical Structure",DISPLAY_CONTINUOUS="Continuous",TOGGLE="Expand/Collapse",positions=this.positions,heatmap=this.heatmap,sectionToItems={Sort:[],Selection:[],Display:[]};if(isHeader&§ionToItems.Sort.push({name:FILTER}),!isColumns){var toggle=!1,dataset=project.getSortedFilteredDataset();try{project.getRowSelectionModel().getViewIndices().forEach(function(index){if(-1!==dataset.getState(index))throw toggle=!0,"break"})}catch(x){}toggle&§ionToItems.Selection.push({name:TOGGLE})}var customItems=this.heatmap.getPopupItems();customItems&&customItems.length>0&&customItems.forEach(function(item){item.columns===isColumns&§ionToItems[item.section].push(item)}),sectionToItems.Selection.length>0&§ionToItems.Selection.push({separator:!0}),sectionToItems.Selection.push({name:"Copy"}),sectionToItems.Selection.push({separator:!0}),sectionToItems.Selection.push({name:ANNOTATE_SELECTION}),sectionToItems.Selection.push({name:INVERT_SELECTION}),sectionToItems.Selection.push({name:SELECT_ALL}),sectionToItems.Selection.push({name:CLEAR_SELECTION});var combinedFilter=isColumns?project.getColumnFilter():project.getRowFilter(),showSelectionOnlyIndex=combinedFilter.indexOf(SHOW_SELECTION_ONLY);-1!==showSelectionOnlyIndex&§ionToItems.Selection.push({name:REMOVE_SHOW_SELECTION_ONLY}),isHeader||(sectionToItems.Sort.push({name:SORT_SEL_ASC,disabled:!hasSelection}),sectionToItems.Sort.push({name:SORT_SEL_DESC,disabled:!hasSelection}),sectionToItems.Sort.push({name:SORT_SEL_TOP_N,disabled:!hasSelection}));var dataType=morpheus.VectorUtil.getDataType(this.getFullVector()),arrayFields=this.getFullVector().getProperties().get(morpheus.VectorKeys.FIELDS),isArray=void 0!==arrayFields,isNumber="number"===dataType||"[number]"===dataType;(isNumber||isArray)&§ionToItems.Display.push({name:DISPLAY_BAR,checked:this.isRenderAs(morpheus.VectorTrack.RENDER.BAR)}),isArray&&(sectionToItems.Display.push({name:DISPLAY_STACKED_BAR,checked:this.settings.stackedBar}),sectionToItems.Display.push({name:FIELDS})),isArray||(sectionToItems.Display.push({name:DISPLAY_COLOR,checked:this.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)}),sectionToItems.Display.push({name:DISPLAY_TEXT,checked:this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT)}),sectionToItems.Display.push({name:DISPLAY_SHAPE,checked:this.isRenderAs(morpheus.VectorTrack.RENDER.SHAPE)})),isArray||isNumber||this.isColumns||-1===name.toLowerCase().indexOf("smile")||sectionToItems.Display.push({name:DISPLAY_STRUCTURE,checked:this.isRenderAs(morpheus.VectorTrack.RENDER.MOLECULE)}),sectionToItems.Display.push({name:TOOLTIP,checked:this.settings.inlineTooltip}),isArray||sectionToItems.Display.push({name:HIGHLIGHT_MATCHING_VALUES,checked:this.settings.highlightMatchingValues}),sectionToItems.Display.push({name:"Squished",checked:this.settings.squished}),(this.isRenderAs(morpheus.VectorTrack.RENDER.BAR)||this.isRenderAs(morpheus.VectorTrack.RENDER.BOX_PLOT))&&(sectionToItems.Display.push({separator:!0}),this.isRenderAs(morpheus.VectorTrack.RENDER.BAR)&§ionToItems.Display.push({name:"Edit Bar Color..."}),sectionToItems.Display.push({name:"Auto Range"}),sectionToItems.Display.push({name:"Custom Range..."})),(this.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR)||this.isRenderAs(morpheus.VectorTrack.RENDER.BAR)||this.isRenderAs(morpheus.VectorTrack.RENDER.SHAPE))&&(sectionToItems.Display.push({separator:!0}),isNumber&§ionToItems.Display.push({name:DISPLAY_CONTINUOUS,checked:!this.settings.discrete}),(this.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR)||this.isRenderAs(morpheus.VectorTrack.RENDER.BAR)&&isArray)&§ionToItems.Display.push({name:"Edit Colors..."}),this.isRenderAs(morpheus.VectorTrack.RENDER.SHAPE)&§ionToItems.Display.push({name:"Edit Shapes..."}),(this.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR)||this.isRenderAs(morpheus.VectorTrack.RENDER.BAR)&&isArray)&§ionToItems.Display.push({name:"Color Key",icon:"fa fa-key"})),this.isRenderAs(morpheus.VectorTrack.RENDER.SHAPE)&§ionToItems.Display.push({name:"Shape Key",icon:"fa fa-key"}),sectionToItems.Display.push({separator:!0}),sectionToItems.Display.push({name:HIDE}),sectionToItems.Display.push({separator:!0}),sectionToItems.Display.push({name:DELETE});var items=[];addSection("Sort"),_.each(sectionToItems.Selection,function(item){item.name!==REMOVE_SHOW_SELECTION_ONLY&&item.name!==SELECT_ALL&&(item.disabled=!hasSelection)}),addSection(isHeader?"Display":"Selection"),e.preventDefault&&e.preventDefault(),morpheus.Popup.showPopup(items,{x:e.pageX,y:e.pageY},e.target,function(event,item){var customItem;if("Copy"===item){var dataset=project.getSortedFilteredDataset(),v=isColumns?dataset.getColumnMetadata().getByName(_this.name):dataset.getRowMetadata().getByName(_this.name),selectionModel=isColumns?project.getColumnSelectionModel():project.getRowSelectionModel(),text=[];selectionModel.getViewIndices().forEach(function(index){text.push(morpheus.Util.toString(v.getValue(index)))}),event.clipboardData.setData("text/plain",text.join(" "))}else if(item===FIELDS){var visibleFields,visibleFieldIndices=_this.getFullVector().getProperties().get(morpheus.VectorKeys.VISIBLE_FIELDS);if(null==visibleFieldIndices)visibleFields=arrayFields.slice(0);else{visibleFields=[];for(var i=0;ii;i++)viewIndices.has(i)||inverse.add(i);model.setViewIndices(inverse,!0)}else if(item===FILTER){var filter,vector=_this.getFullVector(),index=_this.isColumns?_this.project.getColumnFilter().indexOf(vector.getName()):_this.project.getRowFilter().indexOf(vector.getName());if(-1===index){if(morpheus.VectorUtil.isNumber(vector)&&morpheus.VectorUtil.containsMoreThanNValues(vector,9))filter=new morpheus.RangeFilter(NaN,NaN,vector.getName());else{var set=morpheus.VectorUtil.getSet(vector),array=set.values();array.sort(morpheus.SortKey.ASCENDING_COMPARATOR),filter=new morpheus.VectorFilter(set,set.size(),vector.getName())}filter&&(_this.isColumns?_this.project.getColumnFilter().add(filter,!0):_this.project.getRowFilter().add(filter,!0))}_this.isColumns?_this.project.getColumnFilter().trigger("focus",{}):_this.project.getRowFilter().trigger("focus",{})}else if(item===SORT_ASC||item===SORT_DESC){var sortKey=new morpheus.SortKey(_this.name,item===SORT_ASC?morpheus.SortKey.SortOrder.ASCENDING:morpheus.SortKey.SortOrder.DESCENDING);_this.isColumns?_this.project.setColumnSortKeys(morpheus.SortKey.keepExistingSortKeys([sortKey],project.getColumnSortKeys()),!0):_this.project.setRowSortKeys(morpheus.SortKey.keepExistingSortKeys([sortKey],project.getRowSortKeys()),!0)}else if(item==SORT_SEL_ASC||item==SORT_SEL_DESC||item===SORT_SEL_TOP_N){var sortOrder;sortOrder=item===SORT_SEL_ASC?morpheus.SortKey.SortOrder.ASCENDING:item===SORT_SEL_DESC?morpheus.SortKey.SortOrder.DESCENDING:morpheus.SortKey.SortOrder.TOP_N,heatmap.sortBasedOnSelection(sortOrder,isColumns,e&&e.shiftKey)}else if(item===SELECT_ALL){for(var selectionModel=isColumns?heatmap.getProject().getColumnSelectionModel():heatmap.getProject().getRowSelectionModel(),count=isColumns?heatmap.getProject().getSortedFilteredDataset().getColumnCount():heatmap.getProject().getSortedFilteredDataset().getRowCount(),indices=new morpheus.Set,i=0;count>i;i++)indices.add(i);selectionModel.setViewIndices(indices,!0)}else if("Auto Range"===item)delete _this.settings.min,delete _this.settings.max,delete _this.settings.mid,_this._update(),heatmap.revalidate();else if("Custom Range..."===item){var formBuilder=new morpheus.FormBuilder,items=[{name:"min",required:!0,type:"number",value:_this.settings.min},{name:"mid",required:!0,type:"number",value:_this.settings.mid},{name:"max",required:!0,type:"number",value:_this.settings.max}];_.each(items,function(item){formBuilder.append(item)}),morpheus.FormBuilder.showOkCancel({title:"Range",content:formBuilder.$form,okCallback:function(){_this.settings.min=parseFloat(formBuilder.getValue("min")),_this.settings.mid=parseFloat(formBuilder.getValue("mid")),_this.settings.max=parseFloat(formBuilder.getValue("max")),_this._update(),heatmap.revalidate()}})}else if("Squished"===item)_this.settings.squished=!_this.settings.squished,heatmap.revalidate();else if("Color Key"===item){var legend=new morpheus.HeatMapTrackColorLegend([_this],isColumns?_this.project.getColumnColorModel():_this.project.getRowColorModel()),size=legend.getPreferredSize();legend.setBounds(size),legend.repaint(),morpheus.FormBuilder.showInModal({title:"Color Key",html:legend.canvas})}else if("Shape Key"===item){var legend=new morpheus.HeatMapTrackShapeLegend([_this],isColumns?_this.project.getColumnShapeModel():_this.project.getRowShapeModel()),size=legend.getPreferredSize();legend.setBounds(size),legend.repaint(),morpheus.FormBuilder.showInModal({title:"Shape Key",html:legend.canvas})}else if("Edit Shapes..."===item){var shapeModel=(new morpheus.FormBuilder,isColumns?_this.project.getColumnShapeModel():_this.project.getRowShapeModel()),chooser=new morpheus.ShapeChooser({map:shapeModel.getMap(_this.name)});chooser.on("change",function(event){shapeModel.setMappedValue(_this.getFullVector(),event.value,event.shape),_this.setInvalid(!0),_this.repaint()}),morpheus.FormBuilder.showInModal({title:"Edit Shapes",html:chooser.$div,close:"Close"})}else if("Edit Colors..."===item){var colorSchemeChooser,colorModel=isColumns?_this.project.getColumnColorModel():_this.project.getRowColorModel();_this.settings.discrete?(colorSchemeChooser=new morpheus.DiscreteColorSchemeChooser({colorScheme:{scale:colorModel.getDiscreteColorScheme(_this.getFullVector())}}),colorSchemeChooser.on("change",function(event){colorModel.setMappedValue(_this.getFullVector(),event.value,event.color),_this.setInvalid(!0),_this.repaint()})):(colorSchemeChooser=new morpheus.HeatMapColorSchemeChooser({showRelative:!1}),colorSchemeChooser.setColorScheme(colorModel.getContinuousColorScheme(_this.getFullVector())),colorSchemeChooser.on("change",function(event){_this.setInvalid(!0),_this.repaint()})),morpheus.FormBuilder.showInModal({title:"Edit Colors",html:colorSchemeChooser.$div,close:"Close",callback:function(){colorSchemeChooser.dispose()}})}else if(item===TOOLTIP)_this.settings.inlineTooltip=!_this.settings.inlineTooltip;else if(item===HIGHLIGHT_MATCHING_VALUES)_this.settings.highlightMatchingValues=!_this.settings.highlightMatchingValues;else if(customItem=_.find(customItems,function(customItem){return customItem.name===item&&customItem.columns===isColumns}))if(customItem.task){var task={tabId:_this.heatmap.getTabManager().getActiveTabId()};_this.heatmap.getTabManager().addTask(task),setTimeout(function(){try{customItem.callback(heatmap)}catch(x){}_this.heatmap.getTabManager().removeTask(task)},1)}else customItem.callback(heatmap);else if(item===DISPLAY_CONTINUOUS)_this.settings.discrete=!_this.settings.discrete,_this._setChartMinMax(),_this.setInvalid(!0),_this.repaint();else if(item===HIDE)heatmap.setTrackVisible(_this.name,!1,_this.isColumns),heatmap.revalidate();else if(item===DISPLAY_STACKED_BAR)_this.settings.stackedBar=!_this.settings.stackedBar,_this._update(),heatmap.revalidate();else{item===DISPLAY_BAR?item=morpheus.VectorTrack.RENDER.BAR:item===DISPLAY_COLOR?item=morpheus.VectorTrack.RENDER.COLOR:item===DISPLAY_TEXT?item=morpheus.VectorTrack.RENDER.TEXT:item===DISPLAY_TEXT_AND_COLOR?item=morpheus.VectorTrack.RENDER.TEXT_AND_COLOR:item===DISPLAY_STRUCTURE?item=morpheus.VectorTrack.RENDER.MOLECULE:item===DISPLAY_SHAPE?item=morpheus.VectorTrack.RENDER.SHAPE:item===DISPLAY_ARC?item=morpheus.VectorTrack.RENDER.ARC:console.log("Unknown item "+item);var show=!_this.isRenderAs(item);show?_this.settings.renderMethod[item]=!0:delete _this.settings.renderMethod[item],_this._update(),heatmap.revalidate()}})}},renderColor:function(context,vector,start,end,clip,offset,continuous){var isColumns=this.isColumns,positions=this.positions,colorModel=isColumns?this.project.getColumnColorModel():this.project.getRowColorModel(),settings=this.settings,canvasSize=isColumns?this.getUnscaledHeight():this.getUnscaledWidth();settings.colorBarSize>canvasSize&&(settings.colorBarSize=canvasSize>=5?canvasSize-1:canvasSize);var getColor;getColor=continuous?_.bind(colorModel.getContinuousMappedValue,colorModel):_.bind(colorModel.getMappedValue,colorModel);for(var i=start;end>i;i++){var value=vector.getValue(i),position=positions.getPosition(i),size=positions.getItemSize(i),color=getColor(vector,value);context.fillStyle=color,isColumns?(context.beginPath(),context.rect(position,offset-settings.colorBarSize,size,settings.colorBarSize),context.fill()):(context.beginPath(),context.rect(offset,position,settings.colorBarSize,size),context.fill())}},renderShape:function(context,vector,start,end,clip,offset){var isColumns=this.isColumns,positions=this.positions,shapeModel=isColumns?this.project.getColumnShapeModel():this.project.getRowShapeModel(),settings=this.settings,canvasSize=isColumns?this.getUnscaledHeight():this.getUnscaledWidth();settings.colorBarSize>canvasSize&&(settings.colorBarSize=canvasSize>=5?canvasSize-1:canvasSize),context.fillStyle="black",context.strokeStyle="black";var lineWidth=context.lineWidth;context.lineWidth=1;for(var i=start;end>i;i++){var value=vector.getValue(i),position=positions.getPosition(i),itemSize=positions.getItemSize(i),minSize=Math.min(settings.colorBarSize,itemSize),size2=minSize/2,shape=shapeModel.getMappedValue(vector,value),x=isColumns?position+itemSize/2:offset+size2,y=isColumns?offset-size2:position+itemSize/2;size2-=.5,morpheus.CanvasUtil.drawShape(context,shape,x,y,size2)}context.lineWidth=lineWidth},renderArc:function(context,vector,start,end,clip,size){var isColumns=this.isColumns,positions=this.positions;this.project;context.save(),context.lineWidth=1;var fill=(d3.scale.linear().domain([1,size]).range([.8,1]).clamp(!0),d3.scale.category20b()),valueToIndices=morpheus.VectorUtil.createValueToIndicesMap(vector),total=positions.getPosition(positions.getLength()-1)+positions.getItemSize(positions.getLength()-1);context.translate(clip.x,clip.y);var width=clip.width,height=clip.height;if(isColumns){var squishFactor=width/total;context.scale(squishFactor,1)}else{var squishFactor=height/total;context.scale(1,squishFactor)}start=0,end=vector.size();for(var i=start;end>i;i++){var value=vector.getValue(i);if(null!=value){context.strokeStyle=fill(value);for(var indices=valueToIndices.get(value),pix=positions.getPosition(i)+positions.getItemSize(i)/2,j=0,nindices=indices.length;nindices>j;j++){var viewIndex=indices[j];if(viewIndex!==i){var endPix=positions.getPosition(viewIndex)+positions.getItemSize(viewIndex)/2,midPix=(endPix+pix)/2,arcRadius=(Math.abs(i-viewIndex),size);isColumns?(context.beginPath(),context.moveTo(pix,arcRadius),context.quadraticCurveTo(midPix,1,endPix,arcRadius)):(context.beginPath(),context.moveTo(1,pix),context.quadraticCurveTo(arcRadius,midPix,1,endPix)),context.stroke()}}}}context.restore()},sdfToSvg:function(sdf,width,height){this.jsme||"undefined"==typeof JSApplet||(this.jsmeId=_.uniqueId("m"),this.$jsmeDiv=$('
    ').appendTo($(document.body)),this.jsme=new JSApplet.JSME(this.jsmeId,"380px","340px",{})),this.jsme.readMolFile(sdf);var svg=$("#"+this.jsmeId+" > div > div > div:nth-child(2) > svg"),svgWidth=svg.width.baseVal.value,svgHeight=svg.height.baseVal.value,scale=Math.min(width/svgWidth,height/svgHeight),text=''+svg.innerHTML+"";return text},renderMolecule:function(context,vector,start,end,clip,offset){var positions=(this.isColumns,this.positions);context.fillStyle=morpheus.CanvasUtil.FONT_COLOR,context.strokeStyle="black";for(var width=this.getUnscaledWidth(),customUrlProvider=void 0!==this.heatmap.options.structureUrlProvider,dummyTarget={childNodes:[],getContext:function(){return context}},i=start;end>i;i++){var spanEnd=this.spanMap.get(i);if(void 0!==spanEnd){var startPix=positions.getPosition(i),endPix=positions.getPosition(spanEnd-1)+positions.getSize(),size=endPix-startPix,value=vector.getValue(i),cache=this.moleculeCache[value];if(cache)if(customUrlProvider){if(cache.complete){var scaleFactor=Math.min(size/cache.height,width/cache.width),scaledWidth=cache.width*scaleFactor,scaledHeight=cache.height*scaleFactor,diff=cache.height-scaledHeight;startPix+=diff/2;try{context.drawImage(cache,offset,startPix,scaledWidth,scaledHeight)}catch(x){}}}else{var text=this.sdfToSvg(cache,width,size);canvg(dummyTarget,text,{ignoreMouse:!0,ignoreAnimation:!0,offsetY:startPix,ignoreClear:!0,ignoreDimensions:!0})}}}},createChartScale:function(availableSpace){var domain,range;this.settings.mid!==this.settings.min&&this.settings.mid!==this.settings.max?(domain=[this.settings.min,this.settings.mid,this.settings.max],range=this.isColumns?[availableSpace,availableSpace/2,0]:[0,availableSpace/2,availableSpace]):(domain=[this.settings.min,this.settings.max],range=this.isColumns?[availableSpace,0]:[0,availableSpace]);var scale=d3.scale.linear().domain(domain).range(range).clamp(!0);return scale},renderBar:function(context,vector,start,end,clip,offset,availableSpace){var isColumns=this.isColumns,positions=this.positions;context.fillStyle=this.settings.barColor;for(var scale=this.createChartScale(availableSpace),midPix=scale(this.settings.mid),settings=this.settings,discrete=settings.discrete&&null!=this.discreteValueMap,i=start;end>i;i++){var value=vector.getValue(i);discrete&&(value=this.discreteValueMap.get(value));var position=positions.getPosition(i),size=positions.getItemSize(i),scaledValue=scale(value);isColumns?(context.beginPath(),context.rect(position,Math.min(midPix,scaledValue),size,Math.abs(midPix-scaledValue)),context.fill()):(context.beginPath(),context.rect(offset+Math.min(midPix,scaledValue),position,Math.abs(midPix-scaledValue),size),context.fill())}},renderBoxPlot:function(context,vector,start,end,clip,offset,availableSpace){var isColumns=this.isColumns,positions=this.positions;context.strokeStyle="black",context.save(),context.translate(offset,0);var scale=this.createChartScale(availableSpace),visibleFieldIndices=vector.getProperties().get(morpheus.VectorKeys.VISIBLE_FIELDS);null==visibleFieldIndices&&(visibleFieldIndices=morpheus.Util.seq(vector.getProperties().get(morpheus.VectorKeys.FIELDS).length));for(var colorByVector=null!=this.settings.colorByField?this.getVector(this.settings.colorByField):null,colorModel=isColumns?this.project.getColumnColorModel():this.project.getRowColorModel(),i=start;end>i;i++){var array=vector.getValue(i);if(null!=array){var itemSize=positions.getItemSize(i);if(3>=itemSize)continue;var radius=2,pix=positions.getPosition(i),start=pix+1,end=pix+itemSize-1,center=(start+end)/2,_itemSize=itemSize-2,lineHeight=Math.max(2,_itemSize-8),box=array.box;if(null==box){var v=morpheus.VectorUtil.arrayAsVector(array);box=morpheus.BoxPlotItem(null!=visibleFieldIndices?new morpheus.SlicedVector(v,visibleFieldIndices):v),array.box=box}if(context.fillStyle="#bdbdbd",!isColumns){context.fillRect(Math.min(scale(box.q1),scale(box.q3)),start,Math.abs(scale(box.q1)-scale(box.q3)),_itemSize),context.fillRect(Math.min(scale(box.q1),scale(box.lowerAdjacentValue)),center-lineHeight/2,Math.abs(scale(box.q1)-scale(box.lowerAdjacentValue)),lineHeight),context.fillRect(Math.min(scale(box.q3),scale(box.upperAdjacentValue)),center-lineHeight/2,Math.abs(scale(box.q3)-scale(box.upperAdjacentValue)),lineHeight),context.fillStyle="#636363";for(var j=0,length=visibleFieldIndices.length;length>j;j++){var value=array[visibleFieldIndices[j]];if(null!=value){if(null!=colorByVector){var colorByArray=colorByVector.getValue(i);if(null!=colorByArray){var color=colorModel.getMappedValue(colorByVector,colorByArray[visibleFieldIndices[j]]);context.fillStyle=color}else context.fillStyle="#636363"}var pix=scale(value);context.beginPath(),context.arc(pix,center,radius,2*Math.PI,!1),context.fill()}}}}}context.restore()},renderStackedBar:function(context,vector,start,end,clip,offset,availableSpace){var isColumns=this.isColumns,positions=this.positions,scale=this.createChartScale(availableSpace),midPix=scale(this.settings.mid),colorModel=(this.settings,isColumns?this.project.getColumnColorModel():this.project.getRowColorModel()),selectionModel=isColumns?this.project.getRowSelectionModel():null,selectedModelIndices=null==selectionModel?[]:selectionModel.toModelIndices();context.strokeStyle="black",context.lineWidth=2;for(var i=start;end>i;i++){ var array=vector.getValue(i);if(null!=array){var selectedBins=new morpheus.Set;if(null!=array.modelIndexToBin)for(var j=0;jj;j++){var value=array[j];value>=this.settings.mid?positivePairs.push({value:value,index:j}):0>value&&negativePairs.push({value:value,index:j})}for(var positiveIndices=morpheus.Util.indexSortPairs(positivePairs,!1),j=0,length=positiveIndices.length;length>j;j++){var index=positiveIndices[j],value=array[index],color=colorModel.getMappedValue(vector,index);context.fillStyle=color;var scaledValue=scale(value),nextScaledValue=j===length-1?midPix:scale(array[positiveIndices[j+1]]);if(isColumns?(context.beginPath(),context.rect(position,Math.min(nextScaledValue,scaledValue),size,Math.abs(nextScaledValue-scaledValue)),context.fill()):(context.beginPath(),context.rect(offset+Math.min(nextScaledValue,scaledValue),position,Math.abs(nextScaledValue-scaledValue),size),context.fill()),selectedBins.has(index)){context.beginPath();var ytop=(nextScaledValue+scaledValue)/2;context.moveTo(position,ytop),context.lineTo(position+size,ytop),context.stroke()}}for(var negativeIndices=morpheus.Util.indexSortPairs(negativePairs,!0),j=0,length=negativeIndices.length;length>j;j++){var index=negativeIndices[j],value=array[index],color=colorModel.getMappedValue(vector,index);context.fillStyle=color;var scaledValue=scale(value),nextScaledValue=j===length-1?midPix:scale(array[negativeIndices[j+1]]);if(isColumns?(context.beginPath(),context.rect(position,Math.min(nextScaledValue,scaledValue),size,Math.abs(nextScaledValue-scaledValue)),context.fill()):(context.beginPath(),context.rect(offset+Math.min(nextScaledValue,scaledValue),position,Math.abs(nextScaledValue-scaledValue),size),context.fill()),selectedBins.has(index)){context.beginPath();var ytop=(nextScaledValue+scaledValue)/2;context.moveTo(position,ytop),context.lineTo(position+size,ytop),context.stroke()}}}}context.lineWidth=1},renderUnstackedBar:function(context,vector,start,end,clip,offset,availableSpace,fieldIndices){var isColumns=this.isColumns,positions=this.positions,nvalues=fieldIndices.length,colorModel=(this.settings,isColumns?this.project.getColumnColorModel():this.project.getRowColorModel());context.fillStyle=this.settings.barColor;var barSpacer=0,barWidth=(availableSpace-(nvalues-1)*barSpacer)/nvalues,colorByVector=null!=this.settings.colorByField?this.getVector(this.settings.colorByField):null;context.strokeStyle="white";for(var i=start;end>i;i++){var array=vector.getValue(i);if(null!=array)for(var position=positions.getPosition(i),itemSize=positions.getItemSize(i),scale=this.createChartScale(itemSize-1),midPix=scale(this.settings.mid),xpix=0,j=0;nvalues>j;j++){var value=array[fieldIndices[j]];if(null!=colorByVector){var colorByArray=colorByVector.getValue(i),color=colorModel.getMappedValue(colorByVector,null!=colorByArray?colorByArray[fieldIndices[j]]:null);context.fillStyle=color}var scaledValue=scale(value);if(isColumns)context.beginPath(),context.rect(Math.min(midPix,scaledValue),offset+xpix,Math.abs(midPix-scaledValue),barWidth),context.fill();else{context.beginPath();var barHeight=Math.abs(midPix-scaledValue),ypix=position+itemSize-Math.max(midPix,scaledValue);context.rect(offset+xpix,ypix,barWidth,barHeight),context.fill()}xpix+=barWidth+barSpacer}}},renderText:function(context,vector,isColor,start,end,clip,offset,canvasSize){context.fillStyle=morpheus.CanvasUtil.FONT_COLOR,context.textBaseline="middle";var positions=this.positions,isColumns=this.isColumns,colorModel=isColumns?this.project.getColumnColorModel():this.project.getRowColorModel();isColumns&&context.translate(clip.x,clip.y);for(var toStringFunction=morpheus.VectorTrack.vectorToString(vector),i=start;end>i;i++){var size=this.positions.getItemSize(i);if(!(6>size)){var value=vector.getValue(i);if(null!=value){value=toStringFunction(value);var position=positions.getPosition(i);isColor&&(context.fillStyle=colorModel.getMappedValue(vector,value)),isColumns?(context.save(),context.translate(position+size/2-clip.x,canvasSize-clip.y-offset),context.rotate(-Math.PI/2),context.fillText(value,0,0),context.restore()):context.fillText(value,offset,position+size/2)}}}}},morpheus.Util.extend(morpheus.VectorTrack,morpheus.AbstractCanvas),morpheus.VectorTrackHeader=function(project,name,isColumns,controller){function getResizeCursor(pos){return isColumns&&pos.y>=_this.getUnscaledHeight()-3?"ns-resize":pos.x>=_this.getUnscaledWidth()-3?"ew-resize":void 0}morpheus.AbstractCanvas.call(this),this.project=project,this.name=name,this.isColumns=isColumns;var canvas=this.canvas;this.controller=controller;var vector=(isColumns?project.getFullDataset().getColumnMetadata():project.getFullDataset().getRowMetadata()).getByName(name);vector&&vector.getProperties().has(morpheus.VectorKeys.TITLE)&&(this.canvas.setAttribute("title",vector.getProperties().get(morpheus.VectorKeys.TITLE)),$(this.canvas).tooltip());var _this=this;this.setBounds({height:this.defaultFontHeight+morpheus.VectorTrackHeader.FONT_OFFSET});var mouseMove=function(event){if(!morpheus.CanvasUtil.dragging){var pos=morpheus.CanvasUtil.getMousePos(event.target,event),cursor=getResizeCursor(pos);canvas.style.cursor=cursor?cursor:"default",_this.isMouseOver=!0,_this.repaint()}},mouseExit=function(e){morpheus.CanvasUtil.dragging||(canvas.style.cursor="default"),_this.isMouseOver=!1,_this.repaint()},showPopup=function(e){controller.setSelectedTrack(_this.name,isColumns);var track=controller.getTrack(_this.name,isColumns);if(!track)throw _this.name+" track not found";return e.preventDefault(),e.stopPropagation&&e.stopPropagation(),e.stopImmediatePropagation&&e.stopImmediatePropagation(),track.showPopup(e,!0),!1};this.selectedBackgroundColor="#c8c8c8",this.backgroundColor="#f9f9f9",$(this.canvas).css("background-color",this.backgroundColor).on("mousemove.morpheus",mouseMove).on("mouseout.morpheus",mouseExit).on("mouseenter.morpheus",mouseMove),$(this.canvas).on("contextmenu.morpheus",showPopup);var resizeCursor,dragStartPosition,dragStartWidth=0,dragStartHeight=0,dragging=!1;this.hammer=morpheus.Util.hammer(canvas,["pan","tap","longpress"]).on("longpress",function(event){event.preventDefault(),controller.setSelectedTrack(_this.name,isColumns);var track=controller.getTrack(_this.name,isColumns);track.showPopup(event.srcEvent,!0)}).on("panend",function(event){_this.isMouseOver=!1,morpheus.CanvasUtil.dragging=!1,canvas.style.cursor="default";var index=controller.getTrackIndex(_this.name,isColumns),header=controller.getTrackHeaderByIndex(index,isColumns),track=controller.getTrackByIndex(index,isColumns),$canvas=$(track.canvas);$canvas.css("z-index","0"),$(header.canvas).css("z-index","0"),controller.revalidate()}).on("panstart",function(event){if(_this.isMouseOver=!1,!morpheus.CanvasUtil.dragging)if(resizeCursor=getResizeCursor(morpheus.CanvasUtil.getMousePos(event.target,event,!0)))morpheus.CanvasUtil.dragging=!0,canvas.style.cursor=resizeCursor,dragStartWidth=_this.getUnscaledWidth(),dragStartHeight=_this.getUnscaledHeight(),event.preventDefault(),dragging=!1;else{var index=controller.getTrackIndex(_this.name,isColumns);if(-1==index)throw _this.name+" not found";var header=controller.getTrackHeaderByIndex(index,isColumns),track=controller.getTrackByIndex(index,isColumns);controller.setSelectedTrack(_this.name,isColumns);var $canvas=$(track.canvas);dragStartPosition=$canvas.position(),$canvas.css("z-index","100"),$(header.canvas).css("z-index","100"),morpheus.CanvasUtil.dragging=!0,resizeCursor=void 0,dragging=!0}}).on("panmove",function(event){if(_this.isMouseOver=!1,resizeCursor){var width,height;if("ew-resize"===resizeCursor){var dx=event.deltaX;width=Math.max(8,dragStartWidth+dx)}if("ns-resize"===resizeCursor){var dy=event.deltaY;height=Math.max(8,dragStartHeight+dy)}controller.resizeTrack(_this.name,width,height,isColumns)}else if(dragging){var index=controller.getTrackIndex(_this.name,isColumns),header=controller.getTrackHeaderByIndex(index,isColumns),track=controller.getTrackByIndex(index,isColumns),ntracks=controller.getNumTracks(isColumns),delta=isColumns?event.deltaY:event.deltaX,newIndex=index+(delta>0?1:-1);newIndex=Math.min(Math.max(0,newIndex),ntracks-1);var prop=isColumns?"top":"left",w=isColumns?"getUnscaledHeight":"getUnscaledWidth",trackBounds={};trackBounds[prop]=dragStartPosition[prop]+delta,track.setBounds(trackBounds),header.setBounds(trackBounds);var dragOverTrack=controller.getTrackByIndex(newIndex,isColumns),dragOverWidth=dragOverTrack[w](),dragOverLeft=$(dragOverTrack.canvas).position()[prop],dragleft=dragStartPosition[prop]+delta,dragright=dragleft+track[w]();if((delta>0&&dragright>=dragOverLeft+dragOverWidth/2||0>delta&&dragOverLeft+dragOverWidth/2>=dragleft)&&index!==newIndex){controller.moveTrack(index,newIndex,isColumns);var otherHeader=controller.getTrackHeaderByIndex(index,isColumns),otherTrack=controller.getTrackByIndex(index,isColumns),$movedCanvas=$(otherTrack.canvas),newLeft=$movedCanvas.position()[prop];0>delta?newLeft+=track[w]():newLeft-=track[w]();var otherBounds={};otherBounds[prop]=newLeft,otherTrack.setBounds(otherBounds),otherHeader.setBounds(otherBounds)}}}).on("tap",function(event){if((!morpheus.Util.IS_MAC||!event.srcEvent.ctrlKey)&&(_this.isMouseOver=!1,controller.setSelectedTrack(_this.name,isColumns),(!isColumns||controller.options.columnsSortable)&&(isColumns||controller.options.rowsSortable))){var sortOrder,sortKey,additionalSort=event.srcEvent.shiftKey,isGroupBy=!1,existingSortKeyIndex=_this.getSortKeyIndexForColumnName(_this.getSortKeys(),_this.name);-1!=existingSortKeyIndex?(sortKey=_this.getSortKeys()[existingSortKeyIndex],sortOrder=sortKey.getSortOrder()===morpheus.SortKey.SortOrder.UNSORTED?morpheus.SortKey.SortOrder.ASCENDING:sortKey.getSortOrder()===morpheus.SortKey.SortOrder.ASCENDING?morpheus.SortKey.SortOrder.DESCENDING:morpheus.SortKey.SortOrder.UNSORTED):(sortKey=new morpheus.SortKey(_this.name,morpheus.SortKey.SortOrder.ASCENDING),sortOrder=morpheus.SortKey.SortOrder.ASCENDING),null!=sortKey&&(sortKey.setSortOrder(sortOrder),_this.setSortingStatus(_this.getSortKeys(),sortKey,additionalSort,isGroupBy))}})},morpheus.VectorTrackHeader.FONT_OFFSET=2,morpheus.VectorTrackHeader.prototype={selected:!1,isMouseOver:!1,defaultFontHeight:11,dispose:function(){morpheus.AbstractCanvas.prototype.dispose.call(this),$(this.canvas).off("contextmenu.morpheus mousemove.morpheus mouseout.morpheus mouseenter.morpheus"),this.hammer.destroy()},getPreferredSize:function(){var size=this.getPrintSize();return size.width+=22,this.isColumns||(size.height=this.defaultFontHeight+morpheus.VectorTrackHeader.FONT_OFFSET),size},getPrintSize:function(){var context=this.canvas.getContext("2d");context.font=this.defaultFontHeight+"px "+morpheus.CanvasUtil.FONT_NAME;var width=4+context.measureText(this.name).width;return{width:width,height:this.getUnscaledHeight()}},getSortKeys:function(){return this.isColumns?this.project.getColumnSortKeys():this.project.getRowSortKeys()},setOrder:function(sortKeys){this.isColumns?this.project.setColumnSortKeys(morpheus.SortKey.keepExistingSortKeys(sortKeys,this.project.getColumnSortKeys()),!1):this.project.setRowSortKeys(morpheus.SortKey.keepExistingSortKeys(sortKeys,this.project.getRowSortKeys()),!1)},setGroupBy:function(groupBy){for(var existingGroupBy=this.isColumns?this.project.groupColumns:this.project.groupRows,index=-1,i=0,length=existingGroupBy.length;length>i;i++)if(existingGroupBy[i].toString()===groupBy.toString()){index=i;break}var newGroupBy=[groupBy];-1!==index&&(newGroupBy=existingGroupBy,newGroupBy.splice(index,1)),this.isColumns?this.project.setGroupColumns(newGroupBy,!0):this.project.setGroupRows(newGroupBy,!0)},setSelected:function(selected){selected!=this.selected&&(this.selected=selected,$(this.canvas).css({"background-color":this.selected?this.selectedBackgroundColor:this.backgroundColor}))},setSortingStatus:function(sortKeys,sortKey,additionalSort,isGroupBy){if(!isGroupBy)if(sortKey.getSortOrder()!=morpheus.SortKey.SortOrder.UNSORTED||additionalSort){if(additionalSort&&0==sortKeys.length&&(additionalSort=!1),additionalSort){var sortKeyIndex=this.getSortKeyIndexForColumnName(sortKeys,sortKey.toString());-1===sortKeyIndex?sortKeys.push(sortKey):sortKeys[sortKeyIndex]=sortKey}else sortKeys=[sortKey];this.setOrder(sortKeys)}else this.setOrder([]);isGroupBy?this.setGroupBy(sortKey):this.isColumns?this.project.trigger("columnSortOrderChanged"):this.project.trigger("rowSortOrderChanged")},getSortKeyIndexForColumnName:function(sortKeys,columnName){if(null!=sortKeys)for(var i=0,size=sortKeys.length;size>i;i++)if(columnName===sortKeys[i].toString())return i;return-1},print:function(clip,context){clip.height<=6||(context.textBaseline="bottom",this.isColumns?(context.textAlign="right",context.font=Math.min(this.defaultFontHeight,clip.height-morpheus.VectorTrackHeader.FONT_OFFSET)+"px "+morpheus.CanvasUtil.FONT_NAME):(context.textAlign="left",context.font=clip.height-morpheus.VectorTrackHeader.FONT_OFFSET+"px "+morpheus.CanvasUtil.FONT_NAME),context.fillStyle=morpheus.CanvasUtil.FONT_COLOR,context.fillText(this.name,0,0))},draw:function(clip,context){var sortKeys=this.getSortKeys(),name=this.name,existingSortKeyIndex=this.getSortKeyIndexForColumnName(sortKeys,name);if(morpheus.CanvasUtil.resetTransform(context),context.clearRect(0,0,this.getUnscaledWidth(),this.getUnscaledHeight()),!(this.getUnscaledHeight()<5)){this.isColumns?(context.beginPath(),context.moveTo(0,this.getUnscaledHeight()),context.lineTo(this.getUnscaledWidth(),this.getUnscaledHeight()),context.stroke(),context.textAlign="right"):(context.beginPath(),context.moveTo(this.getUnscaledWidth(),0),context.lineTo(this.getUnscaledWidth(),this.getUnscaledHeight()),context.stroke(),context.textAlign="left");var fontHeight=Math.min(this.defaultFontHeight,this.getUnscaledHeight()-morpheus.VectorTrackHeader.FONT_OFFSET),squished=this.controller.getTrack(this.name,this.isColumns).settings.squished;context.font=(squished?"Italic ":"")+fontHeight+"px "+morpheus.CanvasUtil.FONT_NAME;var textWidth=context.measureText(name).width,isColumns=this.isColumns,xpix=this.isColumns?this.getUnscaledWidth()-2:10;isColumns&&(-1!=existingSortKeyIndex&&(xpix-=6),sortKeys.length>1&&(xpix-=6));var ypix=this.isColumns?this.getUnscaledHeight()/2:this.getUnscaledHeight()-(this.defaultFontHeight+morpheus.VectorTrackHeader.FONT_OFFSET)/2;if(context.textBaseline="middle",this.isMouseOver){context.fillStyle="rgb(0,0,0)";for(var xdot=xpix-(isColumns?textWidth+4:4),ydot=ypix-3,i=0;2>i;i++)for(var j=0;3>j;j++)context.fillRect(xdot-3*i,ydot+3*j,1.5,1.5)}if(context.fillStyle=morpheus.CanvasUtil.FONT_COLOR,context.fillText(name,xpix,ypix),context.fillStyle=morpheus.CanvasUtil.FONT_COLOR,-1!==existingSortKeyIndex){context.beginPath();var x=this.isColumns?xpix+4:xpix+textWidth+6,arrowHeight=Math.min(8,this.getUnscaledHeight()/2-1),arrowWidth=3;sortKeys[existingSortKeyIndex].getSortOrder()===morpheus.SortKey.SortOrder.ASCENDING?(context.translate(x,ypix-arrowHeight),context.moveTo(0,0),context.lineTo(arrowWidth,arrowHeight),context.lineTo(-arrowWidth,arrowHeight)):sortKeys[existingSortKeyIndex].getSortOrder()===morpheus.SortKey.SortOrder.DESCENDING?(context.translate(x,ypix),context.moveTo(0,arrowHeight),context.lineTo(arrowWidth,0),context.lineTo(-arrowWidth,0)):(context.translate(x,ypix-arrowHeight/2),context.moveTo(0,0),context.lineTo(arrowWidth,arrowHeight/2),context.lineTo(0,arrowHeight),context.lineTo(-arrowWidth,arrowHeight/2)),context.fill(),morpheus.CanvasUtil.resetTransform(context),sortKeys.length>1&&(context.textAlign="left",context.font="8px "+morpheus.CanvasUtil.FONT_NAME,context.fillText(""+(existingSortKeyIndex+1),x+4,ypix-3))}}}},morpheus.Util.extend(morpheus.VectorTrackHeader,morpheus.AbstractCanvas),morpheus.AverageLinkage=function(nelements,distmatrix){var j,n,clusterid,number,result;clusterid=[],number=[],result=[];for(var i=0;nelements-1>i;i++)result[i]={left:0,right:0,distance:0};for(j=0;nelements>j;j++)number[j]=1,clusterid[j]=j;var r={};for(n=nelements;n>1;n--){morpheus.HCluster.findClosestPair(n,distmatrix,r),result[nelements-n]={},result[nelements-n].distance=r.distance;var is=r.ip,js=r.jp;result[nelements-n].left=clusterid[is],result[nelements-n].right=clusterid[js];var sum=number[is]+number[js];for(j=0;js>j;j++)distmatrix[js][j]=distmatrix[is][j]*number[is]+distmatrix[js][j]*number[js],distmatrix[js][j]/=sum;for(j=js+1;is>j;j++)distmatrix[j][js]=distmatrix[is][j]*number[is]+distmatrix[j][js]*number[js],distmatrix[j][js]/=sum;for(j=is+1;n>j;j++)distmatrix[j][js]=distmatrix[j][is]*number[is]+distmatrix[j][js]*number[js],distmatrix[j][js]/=sum;for(j=0;is>j;j++)distmatrix[is][j]=distmatrix[n-1][j];for(j=is+1;n-1>j;j++)distmatrix[j][is]=distmatrix[n-1][j];number[js]=sum,number[is]=number[n-1],clusterid[js]=n-nelements-1,clusterid[is]=clusterid[n-1]}return result},morpheus.CollapseDataset=function(dataset,collapseToFields,summarizeFunction,shallowCopy){for(var vectors=[],i=0;iseries;series++)collapsedDataset.addSeries({name:dataset.getName(i),dataType:"Float32"});shallowCopy?collapsedDataset.setColumnMetadata(dataset.getColumnMetadata()):morpheus.MetadataUtil.copy(dataset.getColumnMetadata(),collapsedDataset.getColumnMetadata());for(var nfields=collapseToFields.length,collapseToVectors=[],i=0;nfields>i;i++)collapseToVectors.push(collapsedDataset.getRowMetadata().add(collapseToFields[i]));var counter=0;return idToIndices.forEach(function(rowIndices,key){for(var slice=morpheus.DatasetUtil.slicedView(dataset,rowIndices,null),view=new morpheus.DatasetColumnView(slice),series=0;nseries>series;series++){view.setSeriesIndex(series);for(var j=0,ncols=dataset.getColumnCount();ncols>j;j++)view.setIndex(j),collapsedDataset.setValue(counter,j,summarizeFunction(view),series)}for(var i=0;nfields>i;i++){var collapsedToVector=collapseToVectors[i],vector=vectors[i];collapsedToVector.setValue(counter,vector.getValue(rowIndices[0]))}counter++}),collapsedDataset},morpheus.CompleteLinkage=function(nelements,distmatrix){for(var j,n,clusterid=[],result=[],i=0;nelements-1>i;i++)result[i]={left:0,right:0,distance:0};for(j=0;nelements>j;j++)clusterid[j]=j;var r={};for(n=nelements;n>1;n--){morpheus.HCluster.findClosestPair(n,distmatrix,r),result[nelements-n].distance=r.distance;var is=r.ip,js=r.jp;for(j=0;js>j;j++)distmatrix[js][j]=Math.max(distmatrix[is][j],distmatrix[js][j]);for(j=js+1;is>j;j++)distmatrix[j][js]=Math.max(distmatrix[is][j],distmatrix[j][js]);for(j=is+1;n>j;j++)distmatrix[j][js]=Math.max(distmatrix[j][is],distmatrix[j][js]);for(j=0;is>j;j++)distmatrix[is][j]=distmatrix[n-1][j];for(j=is+1;n-1>j;j++)distmatrix[j][is]=distmatrix[n-1][j];result[nelements-n].left=clusterid[is],result[nelements-n].right=clusterid[js],clusterid[js]=n-nelements-1,clusterid[is]=clusterid[n-1]}return result},morpheus.HCluster=function(distmatrix,linkageAlgorithm){var nelements=distmatrix.length,nNodes=nelements-1;if(-1===nNodes){var root={id:0,height:0,index:0,minIndex:0,maxIndex:0,depth:0};return this.tree={maxHeight:0,rootNode:root,leafNodes:[],nLeafNodes:0},void(this.reorderedIndices=[0])}for(var tree=linkageAlgorithm(nelements,distmatrix),nodeorder=[],nodecounts=[],order=[],nodeID=[],i=0;nelements>i;i++)order[i]=i;for(var leftIds=[],rightIds=[],i=0;nNodes>i;i++){var order1,order2,counts1,counts2,ID1,ID2,min1=tree[i].left,min2=tree[i].right;if(nodeID[i]=nNodes+(i+2),0>min1){var index1=-min1-1;order1=nodeorder[index1],counts1=nodecounts[index1],ID1=nodeID[index1],tree[i].distance=Math.max(tree[i].distance,tree[index1].distance)}else order1=order[min1],counts1=1,ID1=min1;if(0>min2){var index2=-min2-1;order2=nodeorder[index2],counts2=nodecounts[index2],ID2=nodeID[index2],tree[i].distance=Math.max(tree[i].distance,tree[index2].distance)}else order2=order[min2],counts2=1,ID2=min2;leftIds[i]=ID1,rightIds[i]=ID2,nodecounts[i]=counts1+counts2,nodeorder[i]=(counts1*order1+counts2*order2)/(counts1+counts2)}for(var reorderedIndices=morpheus.HCluster.treeSort(nNodes,order,nodeorder,nodecounts,tree),idToIndex={},i=0,length=reorderedIndices.length;length>i;i++){var index=reorderedIndices[i];idToIndex[index]=i}for(var node,nodeIdToNode={},i=0,length=nodeID.length;length>i;i++){var id=nodeID[i],leftId=leftIds[i],lnode=nodeIdToNode[leftId];if(void 0===lnode){lnode={id:leftId};var index=idToIndex[leftId];lnode.index=index,lnode.minIndex=index,lnode.maxIndex=index,nodeIdToNode[lnode.id]=lnode}var rightId=rightIds[i],rnode=nodeIdToNode[rightId];if(void 0===rnode){rnode={id:rightId};var index=idToIndex[rightId];rnode.index=index,rnode.minIndex=index,rnode.maxIndex=index,nodeIdToNode[rnode.id]=rnode}node={id:id,children:[lnode,rnode],height:tree[i].distance,index:(rnode.index+lnode.index)/2},node.minIndex=Math.min(rnode.minIndex,lnode.minIndex),node.maxIndex=Math.max(rnode.maxIndex,lnode.maxIndex),lnode.parent=node,rnode.parent=node,nodeIdToNode[node.id]=node}this.reorderedIndices=reorderedIndices;for(var leafNodes=[],i=0,length=reorderedIndices.length;length>i;i++){var leaf=nodeIdToNode[reorderedIndices[i]];leaf.height=0,leafNodes.push(leaf)}morpheus.AbstractDendrogram.setNodeDepths(node),this.tree={maxHeight:node.height,rootNode:node,leafNodes:leafNodes,nLeafNodes:leafNodes.length}},morpheus.HCluster.findClosestPair=function(n,distmatrix,r){var i,j,temp,distance=distmatrix[1][0],ip=1,jp=0;for(i=1;n>i;i++)for(j=0;i>j;j++)temp=distmatrix[i][j],distance>temp&&(distance=temp,ip=i,jp=j);r.distance=distance,r.ip=ip,r.jp=jp},morpheus.HCluster.computeDistanceMatrix=function(dataset,distanceFunction){for(var matrix=[],n=dataset.getRowCount(),i=1;n>i;i++)matrix[i]=new Float32Array(i);if(0===distanceFunction)for(var i=1;n>i;i++)for(var j=0;i>j;j++)matrix[i][j]=dataset.getValue(i,j);else if(1===distanceFunction)for(var i=1;n>i;i++)for(var j=0;i>j;j++)matrix[i][j]=1-dataset.getValue(i,j);else for(var list1=new morpheus.DatasetRowView(dataset),list2=new morpheus.DatasetRowView(dataset),i=1;n>i;i++){list1.setIndex(i);for(var j=0;i>j;j++)matrix[i][j]=distanceFunction(list1,list2.setIndex(j))}return matrix},morpheus.HCluster.treeSort=function(nNodes,order,nodeorder,nodecounts,tree){var i,nElements=nNodes+1,neworder=[],clusterids=[];for(i=0;nElements>i;i++)clusterids[i]=i,neworder[i]=0;for(i=0;nNodes>i;i++){var i1=tree[i].left,i2=tree[i].right,order1=0>i1?nodeorder[-i1-1]:order[i1],order2=0>i2?nodeorder[-i2-1]:order[i2],count1=0>i1?nodecounts[-i1-1]:1,count2=0>i2?nodecounts[-i2-1]:1;if(i2>i1){var j,increase=order2>order1?count1:count2;for(j=0;nElements>j;j++){var clusterid=clusterids[j];clusterid==i1&&order1>=order2&&(neworder[j]+=increase),clusterid==i2&&order2>order1&&(neworder[j]+=increase),clusterid!=i1&&clusterid!=i2||(clusterids[j]=-i-1)}}else{var j,increase=order2>=order1?count1:count2;for(j=0;nElements>j;j++){var clusterid=clusterids[j];clusterid==i1&&order1>order2&&(neworder[j]+=increase),clusterid==i2&&order2>=order1&&(neworder[j]+=increase),clusterid!=i1&&clusterid!=i2||(clusterids[j]=-i-1)}}}return morpheus.Util.indexSort(neworder,!0)},morpheus.HClusterGroupBy=function(dataset,groupByFieldNames,distanceFunction,linkageMethod){var vectors=(dataset.getRowMetadata(),morpheus.MetadataUtil.getVectors(dataset.getRowMetadata(),groupByFieldNames)),idToIndices=morpheus.VectorUtil.createValuesToIndicesMap(vectors),reorderedIndices=[],offset=0,root={id:-1,children:[],height:0},tree={maxHeight:0,rootNode:root,leafNodes:[],nLeafNodes:0};idToIndices.forEach(function(rowIndices,id){var hcl,originalIndicesForGroup=idToIndices.get(id),subset=morpheus.DatasetUtil.slicedView(dataset,originalIndicesForGroup,null),distanceMatrix=morpheus.HCluster.computeDistanceMatrix(subset,distanceFunction);hcl=new morpheus.HCluster(distanceMatrix,linkageMethod);for(var reorderedGroupIndices=hcl.reorderedIndices,i=0,rows=subset.getRowCount();rows>i;i++){var originalIndex=originalIndicesForGroup[reorderedGroupIndices[i]];reorderedIndices.push(originalIndex)}morpheus.AbstractDendrogram.dfs(hcl.tree.rootNode,function(node){return node.index+=offset,node.minIndex+=offset,node.maxIndex+=offset,node.id+=offset,!0}),0===hcl.tree.leafNodes.length?tree.leafNodes=tree.leafNodes.concat([hcl.tree.rootNode]):tree.leafNodes=tree.leafNodes.concat(hcl.tree.leafNodes),root.children.push(hcl.tree.rootNode),isNaN(hcl.tree.maxHeight)||(tree.maxHeight=Math.max(tree.maxHeight,hcl.tree.maxHeight)),offset+=subset.getRowCount()}),tree.nLeafNodes=tree.leafNodes.length,tree.rootNode.height=tree.maxHeight,this.tree=tree,this.reorderedIndices=reorderedIndices},morpheus.PermutationPValues=function(dataset,aIndices,bIndices,numPermutations,f){for(var numRows=dataset.getRowCount(),scores=new Float32Array(numRows),smoothPValues=!0,list1=new morpheus.DatasetRowView(new morpheus.SlicedDatasetView(dataset,null,aIndices)),list2=new morpheus.DatasetRowView(new morpheus.SlicedDatasetView(dataset,null,bIndices)),i=0;numRows>i;i++)scores[i]=f(list1.setIndex(i),list2.setIndex(i));dataset=new morpheus.SlicedDatasetView(dataset,null,aIndices.concat(bIndices));var rowSpecificPValues=new Float32Array(numRows),permuter=new morpheus.UnbalancedPermuter(aIndices.length,bIndices.length),permutationScore=new morpheus.TwoClassPermutationScore;permutationScore.init(dataset,f);for(var permutationIndex=0;numPermutations>permutationIndex;permutationIndex++){permutationScore.setPermutation(permuter.next());for(var i=0;numRows>i;i++){var permutedScore=permutationScore.getScore(i),score=scores[i];permutedScore>=score&&rowSpecificPValues[i]++}}for(var N=numPermutations,kArray=new Uint32Array(numRows),i=0;numRows>i;i++){var k=rowSpecificPValues[i];kArray[i]=k;var p;p=smoothPValues?(k+1)/(N+2):k/N;var oneMinusP=1-p;if(p>oneMinusP&&(p=oneMinusP),p*=2,0===p){for(var val=dataset.getValue(i,0),flat=!0,j=1,cols=dataset.getColumnCount();cols>j&♭j++)dataset.getValue(i,j)!=val&&(flat=!1);flat&&(p=1)}rowSpecificPValues[i]=p}this.rowSpecificPValues=rowSpecificPValues,this.k=kArray,this.fdr=morpheus.FDR_BH(rowSpecificPValues),this.scores=scores},morpheus.PermutationPValues.prototype={getBonferroni:function(index){return Math.min(this.rowSpecificPValues[index]*this.numRows,1)}},morpheus.UnbalancedPermuter=function(numClassZero,numClassOne){function getRandomIntInclusive(min,max){return Math.floor(Math.random()*(max-min+1))+min}for(var assignments=new Uint32Array(numClassZero+numClassOne),indices=new Uint32Array(numClassZero+numClassOne),i=0;i=1;i--){var j=getRandomIntInclusive(0,i),tmp=indices[j];indices[j]=indices[i],indices[i]=tmp}for(var i=0;n>i;i++)assignments[i]=0;for(var i=0;numClassOne>i;i++)assignments[indices[i]]=1;return assignments}},morpheus.TwoClassPermutationScore=function(){this.classZeroView=null,this.classOneView=null},morpheus.TwoClassPermutationScore.prototype={getScore:function(index){return this.classZeroView.setIndex(index),this.classOneView.setIndex(index),this.f(this.classZeroView,this.classOneView)},init:function(dataset,f){this.dataset=dataset,this.classZeroView=new morpheus.DatasetRowView(dataset),this.classOneView=new morpheus.DatasetRowView(dataset),this.f=f},setPermutation:function(permutedAssignments){for(var zeroIndices=[],oneIndices=[],i=0,length=permutedAssignments.length;length>i;i++)0===permutedAssignments[i]?zeroIndices.push(i):oneIndices.push(i);this.classZeroView.setDataset(new morpheus.SlicedDatasetView(this.dataset,null,zeroIndices)),this.classOneView.setDataset(new morpheus.SlicedDatasetView(this.dataset,null,oneIndices))}},morpheus.Ranking=function(values){for(var ranks=[],i=0,length=values.length;length>i;i++)ranks.push({value:values[i],position:i});if(0===ranks.length)return[];ranks.sort(function(a,b){return a.valueranks[i-1].value?(pos=i+1,tiesTrace.length>1&&morpheus.Ranking.fillAverage(out,tiesTrace),tiesTrace=[],tiesTrace.push(ranks[i].position)):tiesTrace.push(ranks[i].position),out[ranks[i].position]=pos;return tiesTrace.length>1&&morpheus.Ranking.fillAverage(out,tiesTrace),out},morpheus.Ranking.fill=function(data,tiesTrace,value){for(var i=0,length=tiesTrace.length;length>i;i++)data[tiesTrace[i]]=value},morpheus.Ranking.fillAverage=function(ranks,tiesTrace){var c=ranks[tiesTrace[0]],length=tiesTrace.length;morpheus.Ranking.fill(ranks,tiesTrace,(2*c+length-1)/2)},morpheus.SingleLinkage=function(nelements,distmatrix){var i,j,k,nnodes=nelements-1,temp=[],index=[],vector=[],result=[];for(i=0;nelements>i;i++)result[i]={left:0,right:0,distance:0};for(i=0;nnodes>i;i++)vector[i]=i;for(i=0;nelements>i;i++){for(result[i].distance=Number.MAX_VALUE,j=0;i>j;j++)temp[j]=distmatrix[i][j];for(j=0;i>j;j++)k=vector[j],result[j].distance>=temp[j]?(result[j].distancej;j++)result[j].distance>=result[vector[j]].distance&&(vector[j]=i)}for(i=0;nnodes>i;i++)result[i].left=i;for(result.sort(function(node1,node2){var term1=node1.distance,term2=node2.distance;return term2>term1?-1:term1>term2?1:0}),i=0;nelements>i;i++)index[i]=i;for(i=0;nnodes>i;i++)j=result[i].left,k=vector[j],result[i].left=index[j],result[i].right=index[k],index[k]=-i-1;var result2=[];for(i=0;nelements-1>i;i++)result2[i]=result[i];return result2}; \ No newline at end of file diff --git a/src/ui/heat_map.js b/src/ui/heat_map.js index b5f9019..b228da0 100644 --- a/src/ui/heat_map.js +++ b/src/ui/heat_map.js @@ -270,8 +270,8 @@ morpheus.HeatMap = function(options) { } this.tabManager = this.options.parent.tabManager; } - this.$el = $('
    '); - this.$el.css({ + this.$content = $('
    '); + this.$content.css({ 'width' : '100%', 'user-select' : 'none', @@ -297,7 +297,7 @@ morpheus.HeatMap = function(options) { }); var tab = this.tabManager.add({ - $el : this.$el, + $el : this.$content, closeable : true, rename : true, title : this.options.name, @@ -305,7 +305,7 @@ morpheus.HeatMap = function(options) { focus : true }); if (options.$loadingImage) { - options.$loadingImage.appendTo(this.$el); + options.$loadingImage.appendTo(this.$content); } this.tabId = tab.id; @@ -314,7 +314,6 @@ morpheus.HeatMap = function(options) { : (options.dataset.file ? options.dataset.file : options.dataset); this._togglingInfoWindow = false; this.tooltipMode = 0; // 0=docked, 1=dialog, 2=follow - this.el = this.$el[0]; var promises = []; if (options.promises) { @@ -373,7 +372,7 @@ morpheus.HeatMap = function(options) { }; $(window).on('orientationchange resize', resize); - _this.$el.on('remove', function() { + _this.$content.on('remove', function() { $(window).off('orientationchange resize', resize); }); } @@ -1097,7 +1096,7 @@ morpheus.HeatMap.prototype = { this.whenLoaded = null; this.$parent = $('
    ').css('position', 'relative'); - this.$parent.appendTo(this.$el); + this.$parent.appendTo(this.$content); this.toolbar = new morpheus.HeatMapToolBar(this); if (this.options.customUrls) { this.setCustomUrls(this.options.customUrls); diff --git a/src/ui/heat_map_key_listener.js b/src/ui/heat_map_key_listener.js index 154b9c6..d5a011b 100644 --- a/src/ui/heat_map_key_listener.js +++ b/src/ui/heat_map_key_listener.js @@ -134,7 +134,7 @@ morpheus.HeatMapKeyListener = function(controller) { return false; } }; - var $keyelement = controller.$el; + var $keyelement = controller.$content; $keyelement.on('keydown', keydown); $keyelement.on('dragover.morpheus dragenter.morpheus', function(e) { e.preventDefault(); diff --git a/src/ui/heat_map_toolbar.js b/src/ui/heat_map_toolbar.js index 6782a91..8787b02 100644 --- a/src/ui/heat_map_toolbar.js +++ b/src/ui/heat_map_toolbar.js @@ -271,7 +271,7 @@ morpheus.HeatMapToolBar = function(controller) { $search.appendTo($el.find('[name=toolbarSearch]')); $(toolbarHtml.join('')).appendTo($toolbarForm); $toolbarForm.appendTo($el.find('[name=toolbarButtons]')); - $el.prependTo(controller.$el); + $el.prependTo(controller.$content); // gapi.hangout.render('hangout-div', { // 'widget_size' : '72', // 'render' : 'createhangout' diff --git a/src/ui/vector_track.js b/src/ui/vector_track.js index bb9694d..d9aa195 100644 --- a/src/ui/vector_track.js +++ b/src/ui/vector_track.js @@ -352,9 +352,9 @@ morpheus.VectorTrack.prototype = { .isRenderAs(morpheus.VectorTrack.RENDER.BAR))) { if (this.getFullVector().getProperties().has( morpheus.VectorKeys.FIELDS) - || _.isNumber(morpheus.VectorUtil.getFirstNonNull(this - .getFullVector()))) { + || morpheus.VectorUtil.getDataType(this.getFullVector()) === 'number') { this.settings.discrete = false; + this.settings.highlightMatchingValues = false; } this.settings.discreteAutoDetermined = true; } @@ -398,24 +398,24 @@ morpheus.VectorTrack.prototype = { var doRequest = function(smile) { $ .ajax( - { - contentType : 'text/plain', - context : { - smile : smile - }, - data : { - 'string' : smile, - 'representation' : 'sdf' - }, - url : 'http://cactus.nci.nih.gov/chemical/structure', - }).done(function(text) { - _this.moleculeCache[this.smile] = text; - if (values.length > 0) { - doRequest(values.pop()); - } - _this.invalid = true; - _this.repaint(); - }); + { + contentType : 'text/plain', + context : { + smile : smile + }, + data : { + 'string' : smile, + 'representation' : 'sdf' + }, + url : 'http://cactus.nci.nih.gov/chemical/structure', + }).done(function(text) { + _this.moleculeCache[this.smile] = text; + if (values.length > 0) { + doRequest(values.pop()); + } + _this.invalid = true; + _this.repaint(); + }); }; for (var i = 0; i < 6; i++) { doRequest(values.pop()); @@ -1075,10 +1075,10 @@ morpheus.VectorTrack.prototype = { morpheus.Popup .showPopup( items, - { - x : e.pageX, - y : e.pageY - }, + { + x : e.pageX, + y : e.pageY + }, e.target, function(event, item) { var customItem; @@ -1278,12 +1278,12 @@ morpheus.VectorTrack.prototype = { project .trigger( 'trackChanged', - { - vectors : [ v ], - render : existingVector != null ? [] + { + vectors : [ v ], + render : existingVector != null ? [] : [ morpheus.VectorTrack.RENDER.TEXT ], - columns : isColumns - }); + columns : isColumns + }); } }); } else if (item === DELETE) { @@ -1358,18 +1358,18 @@ morpheus.VectorTrack.prototype = { project .trigger( 'rowTrackRemoved', - { - vector : _this + { + vector : _this .getFullVector() - }); + }); } else { project .trigger( 'columnTrackRemoved', - { - vector : _this + { + vector : _this .getFullVector() - }); + }); } } }); @@ -1589,13 +1589,13 @@ morpheus.VectorTrack.prototype = { .getRowColorModel(); if (_this.settings.discrete) { colorSchemeChooser = new morpheus.DiscreteColorSchemeChooser( - { - colorScheme : { - scale : colorModel + { + colorScheme : { + scale : colorModel .getDiscreteColorScheme(_this .getFullVector()) - } - }); + } + }); colorSchemeChooser.on('change', function( event) { colorModel.setMappedValue(_this @@ -1606,9 +1606,9 @@ morpheus.VectorTrack.prototype = { }); } else { colorSchemeChooser = new morpheus.HeatMapColorSchemeChooser( - { - showRelative : false, - }); + { + showRelative : false, + }); colorSchemeChooser .setColorScheme(colorModel .getContinuousColorScheme(_this -- GitLab