')):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(' "),choice.icon&&html.push(' '),optionText=optionText[0].toUpperCase()+optionText.substring(1),html.push(optionText),html.push("
")}):(html.push('
'),html.push(' "),html.push(value[0].toUpperCase()+value.substring(1)),html.push("
"));else if("checkbox"===type)html.push('
'),html.push(' "),html.push(title),html.push("
");else if("checkbox-list"===type)html.push('
');else if("select"==type||"bootstrap-select"==type)"bootstrap-select"==type?html.push('
"),_.each(field.options,function(choice){if(choice&&choice.divider)html.push(' ');else{html.push('"),html.push(optionText),html.push(" ")}}),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('
'),field.icon&&html.push(' '),html.push(value?value:title),html.push(" ");else if("custom"===type)html.push(value);else if("file"===type){html.push('
');var npre=1,options=[];field.options&&(options=options.concat(field.options),npre=1+field.options.length),options.push("My Computer"),options.push("URL"),"undefined"!=typeof Dropbox&&options.push("Dropbox"),_.each(options,function(choice,index){var isChoiceObject=_.isObject(choice)&&void 0!==choice.value,optionValue=isChoiceObject?choice.value:choice,optionText=isChoiceObject?choice.name:choice;html.push('0&&html.push(' data-icon="fa fa-star"'),html.push(">"),html.push(optionText),html.push(" ")}),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('
"),html.push(optionText),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;i Cause: "),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;i
i;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"),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(22,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(22,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(heatMapHeight0,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;i
i;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("
")),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(' '),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('
'),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(''),filterModal.push('
'),filterModal.push('
'),filterModal.push('"),filterModal.push('
'),filterModal.push(""),filterModal.push("
"),filterModal.push("
"),filterModal.push("
"),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(' Rows
'),filterHtml.push(' Columns
');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