'),"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){var isMultiple=field.multiple;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(results){var val=isMultiple?results.map(function(result){return result.link}):results[0].link;that.setValue(name,val),that.trigger("change",{name:name,value:val})},linkType:"direct",multiselect:isMultiple};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());isMultiple&&(text=text.split(",").filter(function(t){return t=$.trim(t),""!==t})),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,isMultiple?files: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.val(value),v.selectpicker("render"),v.data("files",value);var type=v.attr("type"),list=v.data("morpheus.checkbox-list");list?list.setValue(value):("radio"===type?v.filter("[value="+value+"]").prop("checked",!0):"checkbox"===type?v.prop("checked",value):v.val(value),v.hasClass("selectpicker")&&v.selectpicker("render"))},setVisible:function(name,visible){var $div=this.$form.find("[name="+name+"]").parents(".form-group");visible?$div.show():$div.hide()},remove:function(name){var $div=this.$form.find("[name="+name+"]").parents(".form-group");$div.remove()},setEnabled:function(name,enabled){var $div=this.$form.find("[name="+name+"]");$div.attr("disabled",!enabled),enabled?$div.parents(".form-group").find("label").removeClass("text-muted"):$div.parents(".form-group").find("label").addClass("text-muted")}},morpheus.Util.extend(morpheus.FormBuilder,morpheus.Events),morpheus.GradientColorSupplier=function(){morpheus.AbstractColorSupplier.call(this),this._updateScale()},morpheus.GradientColorSupplier.prototype={createInstance:function(){return new morpheus.GradientColorSupplier},getColor:function(row,column,value){if(isNaN(value))return this.missingColor;var min=this.min,max=this.max,colors=this.colors;if(min>=value)return colors[0];if(value>=max)return colors[colors.length-1];var fraction=morpheus.SteppedColorSupplier.linearScale(value,min,max,0,100)/100;return this.colorScale(fraction)},setFractions:function(options){morpheus.AbstractColorSupplier.prototype.setFractions.call(this,options),this._updateScale()},_updateScale:function(){this.colorScale=d3.scale.linear().domain(this.fractions).range(this.colors).clamp(!0)}},morpheus.Util.extend(morpheus.GradientColorSupplier,morpheus.AbstractColorSupplier),morpheus.Grid=function(options){function getItemColumnValue(item,column){return column.getter(item)}this.options=options;var grid,_this=this;this.items=options.items,this.modelToView=null,this.viewOrder=null,this.filter=new morpheus.CombinedGridFilter;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();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.maybeAutoResizeColumns()},maybeAutoResizeColumns:function(){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.filter.init(),!this.filter.isEmpty())){this.viewOrder=[];for(var i=0,length=this.items.length;length>i;i++)this.filter.accept(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,comparator=cols[i].sortAsc?morpheus.SortKey.ASCENDING_COMPARATOR:morpheus.SortKey.DESCENDING_COMPARATOR,value1=getter(items[index1]),value2=getter(items[index2]),result=comparator(value1,value2);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(){var columns=this.grid.getColumns(),items=this.getItems();if(items&&0!==items.length&&columns&&0!==columns.length){var gridWidth=this.options.$el.width()-30;if(!(0>=gridWidth)&&(this.columnsAutosized=!0,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"),$header=$row.find(".slick-header-column");$row.appendTo($d);for(var maxWidth=Math.min(parseInt(gridWidth/2),400),getColumnWidth=function(column){var w=$header.html(column.name).outerWidth()+13;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 html=column.formatter(i,null,column.getter(items[i]),column,items[i]),$html=$(html);$html.find(".slick-cell-wrapper").attr("class",""),$cell.html($html),w=Math.max($cell.outerWidth(),w)}column.width=parseInt(Math.min(maxWidth,w))},totalWidth=0,i=0;i$checkNode[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.CombinedGridFilter=function(){this.filters=[]},morpheus.CombinedGridFilter.prototype={add:function(filter){this.filters.push(filter)},getFilters:function(){return this.filters},get:function(index){return this.filters[index]},set:function(index,f){this.filters[index]=f},init:function(){for(var i=0;iLoading... '),closeable:!0,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){if(this.tabManager=this.options.tabManager?this.options.tabManager:new morpheus.TabManager({landingPage:this.options.landingPage}),!morpheus.HelpMenu.ADDED){morpheus.HelpMenu.ADDED=!0;var $a=$('
');$a.tooltip({placement:"auto"});var $right=$('
');$a.appendTo($right),(new morpheus.HelpMenu).$el.appendTo($right),$right.appendTo(this.tabManager.$nav)}this.options.tabManager||(this.tabManager.$nav.appendTo(this.$el),this.tabManager.$tabContent.appendTo(this.$el))}else this.options.inheritFromParent&&(this.popupItems=this.options.parent.popupItems,this.options.tabOpened||(this.options.tabOpened=this.options.parent.options.tabOpened),this.options.drawCallback=this.options.parent.options.drawCallback),this.tabManager=this.options.parent.tabManager;this.$content=$("
"),this.$content.css({width:"100%","user-select":"none","-webkit-user-select":"none","-webkit-user-drag":"none","-webkit-tap-highlight-color":"rgba(0, 0, 0, 0)","-moz-user-select":"none","-moz-user-drag":"none","-moz-tap-highlight-color":"rgba(0, 0, 0, 0)","-ms-user-select":"none","-ms-user-drag":"none","-ms-tap-highlight-color":"rgba(0, 0, 0, 0)","-o-user-select":"none","-o-user-drag":"none","-o-tap-highlight-color":"rgba(0, 0, 0, 0)","overflow-x":"visible","overflow-y":"visible"});var tab=this.tabManager.add({$el:this.$content,closeable:this.options.closeable,rename:!0,title:this.options.name,object:this,focus:!0});options.$loadingImage&&options.$loadingImage.appendTo(this.$content),this.tabId=tab.id,this.$tabPanel=tab.$panel,this.options.dataSource=options.dataset?options.dataset.file?options.dataset.file:options.dataset:"",this._togglingInfoWindow=!1,this.tooltipMode=0;var promises=[];if(options.promises)for(var i=0;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;i
i;i++){var key=existingSortKeys[i];if(key instanceof morpheus.SortByValuesKey&&morpheus.Util.arrayEquals(key.modelIndices,modelIndices)){priorSortKeyIndex=i,key.getSortOrder()===morpheus.SortKey.SortOrder.UNSORTED?sortOrder=morpheus.SortKey.SortOrder.DESCENDING:key.getSortOrder()===morpheus.SortKey.SortOrder.DESCENDING?sortOrder=morpheus.SortKey.SortOrder.ASCENDING:key.getSortOrder()===morpheus.SortKey.SortOrder.ASCENDING?sortOrder=morpheus.SortKey.SortOrder.TOP_N:key.getSortOrder()===morpheus.SortKey.SortOrder.TOP_N&&(sortOrder=morpheus.SortKey.SortOrder.UNSORTED);break}}null==sortOrder&&(sortOrder=morpheus.SortKey.SortOrder.DESCENDING);var sortKeys;if(append)sortKeys=isColumns?project.getRowSortKeys():project.getColumnSortKeys(),-1!==priorSortKeyIndex?sortOrder===morpheus.SortKey.SortOrder.UNSORTED?sortKeys.splice(priorSortKeyIndex,1):sortKeys[priorSortKeyIndex].setSortOrder(sortOrder):sortOrder!==morpheus.SortKey.SortOrder.UNSORTED&&sortKeys.push(new morpheus.SortByValuesKey(modelIndices,sortOrder,!isColumns)),sortKeys=morpheus.SortKey.keepExistingSortKeys(sortKeys,isColumns?project.getRowSortKeys():project.getColumnSortKeys());else{var newSortKeys=sortOrder===morpheus.SortKey.SortOrder.UNSORTED?[]:[new morpheus.SortByValuesKey(modelIndices,sortOrder,!isColumns)];sortKeys=morpheus.SortKey.keepExistingSortKeys(newSortKeys,isColumns?project.getRowSortKeys():project.getColumnSortKeys())}isColumns?(project.setRowSortKeys(sortKeys,!0),this.scrollTop(0)):(project.setColumnSortKeys(sortKeys,!0),this.scrollLeft(0))}},getToolbarElement:function(){return this.toolbar.$el},getToolbar:function(){return this.toolbar},setName:function(name){this.options.name=name},getName:function(){return this.options.name},showOptions:function(){new morpheus.HeatMapOptions(this)},getProject:function(){return this.project},setDendrogram:function(tree,isColumns,viewIndices){var dendrogram=isColumns?this.columnDendrogram:this.rowDendrogram;if(dendrogram&&(dendrogram.dispose(),dendrogram=null),null!=tree){for(var modelIndices=[],modelIndexSet=new morpheus.Set,size=isColumns?this.project.getFullDataset().getColumnCount():this.project.getFullDataset().getRowCount(),i=0;size>i;i++)modelIndexSet.add(i);for(var i=0,length=viewIndices.length;length>i;i++){var modelIndex=isColumns?this.project.convertViewColumnIndexToModel(viewIndices[i]):this.project.convertViewRowIndexToModel(viewIndices[i]);modelIndices.push(modelIndex),modelIndexSet.remove(modelIndex)}var nvisible=modelIndices.length;if(modelIndexSet.size()>0)for(var indices=modelIndexSet.values(),i=0,length=indices.length;length>i;i++)modelIndices.push(indices[i]);isColumns?(dendrogram=new morpheus.ColumnDendrogram(this,tree,this.heatmap.getColumnPositions(),this.project),dendrogram.filter=this.project.getColumnFilter().shallowClone(),this.columnDendrogram=dendrogram,this.project.setColumnSortKeys([new morpheus.SpecifiedModelSortOrder(modelIndices,nvisible,"dendrogram")],!0)):(dendrogram=new morpheus.RowDendrogram(this,tree,this.heatmap.getRowPositions(),this.project),dendrogram.filter=this.project.getRowFilter().shallowClone(),this.rowDendrogram=dendrogram,this.project.setRowSortKeys([new morpheus.SpecifiedModelSortOrder(modelIndices,nvisible,"dendrogram")],!0)),dendrogram.appendTo(this.$parent),dendrogram.$label.appendTo(this.$parent),dendrogram.$squishedLabel.appendTo(this.$parent)}else{for(var sortKeys=isColumns?this.project.getColumnSortKeys():this.project.getRowSortKeys(),i=0;i0){var tipText=[],dataset=project.getSortedFilteredDataset(),rowTracks=_this.rowTracks.filter(function(t){return t.settings.inlineTooltip}),columnTracks=_this.columnTracks.filter(function(t){return t.settings.inlineTooltip});return selectedViewIndices.forEach(function(id){var rowIndex=id.getArray()[0],columnIndex=id.getArray()[1];tipText.push(morpheus.Util.nf(dataset.getValue(rowIndex,columnIndex))),rowTracks.forEach(function(track){tipText.push(" "),tipText.push(morpheus.Util.formatObject(dataset.getRowMetadata().getByName(track.name).getValue(rowIndex)))}),columnTracks.forEach(function(track){tipText.push(" "),tipText.push(morpheus.Util.formatObject(dataset.getColumnMetadata().getByName(track.name).getValue(columnIndex)))}),tipText.push("\n")}),tipText.join("")}},_init:function(){function reorderTracks(array,isColumns){var nameOrderPairs=[],found=!1;if(_.each(array,function(item){var name=item.renameTo||item.field,order=999;null!=item.order&&(order=item.order,found=!0),nameOrderPairs.push({name:name,order:order})}),found){nameOrderPairs.sort(function(a,b){return a.order===b.order?0:a.order ").css("position","relative"),this.$parent.appendTo(this.$content),this.toolbar=new morpheus.HeatMapToolBar(this),this.options.customUrls&&this.setCustomUrls(this.options.customUrls),this.vscroll=new morpheus.ScrollBar(!0),this.vscroll.appendTo(this.$parent),this.vscroll.on("scroll",function(){_this.updatingScroll||_this.paintAll({paintRows:!0,paintColumns:!1,invalidateRows:!0,invalidateColumns:!1})}),this.beforeColumnTrackDivider=new morpheus.Divider(!1),this.beforeColumnTrackDivider.appendTo(this.$parent);var dragStartHeight=0;this.beforeColumnTrackDivider.on("resizeStart",function(e){dragStartHeight=_this.columnDendrogram.getUnscaledHeight()}).on("resize",function(e){var newHeight=Math.max(8,dragStartHeight+e.delta);_this.columnDendrogram.setPrefHeight(newHeight),_this.revalidate()}).on("resizeEnd",function(){dragStartHeight=0}),this.afterRowDendrogramDivider=new morpheus.Divider(!0),this.afterRowDendrogramDivider.appendTo(this.$parent);var rowDendrogramStartWidth=0;this.afterRowDendrogramDivider.on("resizeStart",function(e){rowDendrogramStartWidth=_this.rowDendrogram.getUnscaledWidth()}).on("resize",function(e){var newWidth=Math.max(8,rowDendrogramStartWidth+e.delta);_this.rowDendrogram.setPrefWidth(newWidth),_this.revalidate()}).on("resizeEnd",function(){rowDendrogramStartWidth=0}),this.afterVerticalScrollBarDivider=new morpheus.Divider(!0),this.afterVerticalScrollBarDivider.appendTo(this.$parent);var resizeStartHeatMapWidth=0;this.afterVerticalScrollBarDivider.on("resizeStart",function(e){resizeStartHeatMapWidth=_this.heatmap.getUnscaledWidth()}).on("resize",function(e){_this.heatmap.prefWidth=resizeStartHeatMapWidth+e.delta,_this.revalidate()}),this.hscroll=new morpheus.ScrollBar(!1),this.hscroll.appendTo(this.$parent),this.hscroll.on("scroll",function(){_this.updatingScroll||_this.paintAll({paintRows:!1,paintColumns:!0,invalidateRows:!1,invalidateColumns:!0})});var heatmap=new morpheus.HeatMapElementCanvas(this.project);this.options.drawCallback&&heatmap.setDrawCallback(this.options.drawCallback),$(heatmap.canvas).on("contextmenu",function(e){morpheus.Popup.showPopup([{name:"Copy",disabled:0===_this.project.getElementSelectionModel().count()},{name:"Save Image (Ctrl-S)"},{separator:!0},{name:"Show Inline Tooltip",checked:_this.options.inlineTooltip}],{x:e.pageX,y:e.pageY},e.target,function(event,item){if("Show Inline Tooltip"===item)_this.options.inlineTooltip=!_this.options.inlineTooltip;else if("Save Image (Ctrl-S)"===item)morpheus.HeatMap.showTool(new morpheus.SaveImageTool,_this);else{var text=_this.getSelectedElementsText();""!==text&&event.clipboardData.setData("text/plain",text)}}),e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation()}),heatmap.appendTo(this.$parent),this.heatmap=heatmap;var rowDendrogramSortKey=null;if(void 0!=rowDendrogram){var tree=rowDendrogram;if(tree.leafNodes.length!==this.project.getFullDataset().getRowCount())throw"# leaf nodes in row dendrogram "+tree.leafNodes.length+" != "+this.project.getFullDataset().getRowCount();if(null!=this.options.rowDendrogramField){for(var vector=dataset.getRowMetadata().getByName(this.options.rowDendrogramField),rowIndices=[],map=new morpheus.Map,re=/[,:]/g,j=0,size=vector.size();size>j;j++){var key=vector.getValue(j);map.set(key.replace(re,""),j)}for(var i=0,length=tree.leafNodes.length;length>i;i++){var index=map.get(tree.leafNodes[i].name);if(void 0===index)throw"Unable to find row dendrogram id "+tree.leafNodes[i].name+" in row annotations";rowIndices.push(index)}}else for(var i=0,length=tree.leafNodes.length;length>i;i++)rowIndices.push(i);this.rowDendrogram=new morpheus.RowDendrogram(this,tree,heatmap.getRowPositions(),this.project,!0),rowDendrogramSortKey=new morpheus.SpecifiedModelSortOrder(rowIndices,rowIndices.length,"dendrogram"),this.rowDendrogram.appendTo(this.$parent),this.rowDendrogram.$label.appendTo(this.$parent),this.rowDendrogram.$squishedLabel.appendTo(this.$parent)}var columnDendrogramSortKey=null;if(void 0!==columnDendrogram){var tree=columnDendrogram;if(tree.leafNodes.length!==this.project.getFullDataset().getColumnCount())throw"# leaf nodes "+tree.leafNodes.length+" != "+this.project.getFullDataset().getColumnCount();var columnIndices=[];if(null!=this.options.columnDendrogramField){for(var vector=dataset.getColumnMetadata().getByName(this.options.columnDendrogramField),map=new morpheus.Map,re=/[,:]/g,j=0,size=vector.size();size>j;j++){var key=vector.getValue(j);map.set(key.replace(re,""),j)}for(var i=0,length=tree.leafNodes.length;length>i;i++){var index=map.get(tree.leafNodes[i].name);if(void 0===index)throw"Unable to find column dendrogram id "+tree.leafNodes[i].name+" in column annotations";columnIndices.push(index)}}else for(var i=0,length=tree.leafNodes.length;length>i;i++)columnIndices.push(i);this.columnDendrogram=new morpheus.ColumnDendrogram(this,tree,heatmap.getColumnPositions(),this.project,!0),columnDendrogramSortKey=new morpheus.SpecifiedModelSortOrder(columnIndices,columnIndices.length,"dendrogram"),this.columnDendrogram.appendTo(this.$parent),this.columnDendrogram.$label.appendTo(this.$parent),this.columnDendrogram.$squishedLabel.appendTo(this.$parent)}if(null!==rowDendrogramSortKey&&this.project.setRowSortKeys([rowDendrogramSortKey]),null!==columnDendrogramSortKey&&this.project.setColumnSortKeys([columnDendrogramSortKey]),null!=this.options.rowGroupBy)for(var i=0;i