Ext.namespace("Ext.ux");
Ext.namespace("Ext.ux.vardb");
Ext.namespace("Ext.ux.vardb.data");
Ext.namespace("Ext.ux.vardb.cart");
Ext.namespace("Ext.ux.vardb.search");
Ext.namespace("Ext.ux.vardb.regex");
Ext.namespace("Ext.ux.vardb.blast");
Ext.namespace("Ext.ux.vardb.phiblast");
Ext.namespace("Ext.ux.vardb.viewer");
Ext.namespace("Ext.ux.vardb.tags");
Ext.namespace("Ext.ux.vardb.explorer");
Ext.namespace("Ext.ux.vardb.explorer.quickcart");
Ext.namespace("Ext.ux.vardb.admin");
Ext.BLANK_IMAGE_URL="http://extjs.cachefly.net/ext-3.2.0/resources/images/default/s.gif";
Ext.Ajax.timeout=600000;
Ext.ux.GridPrinter.stylesheetPath="/vardb/css/printgrid.css";
(Ext.ux.vardb.Constants=function(){return{tooltips:{accession:"Unique accession number",tags:"Clinical and user-defined tags",group:"Group",description:"Description/defline",taxon:"NCBI taxonomy browser ID",gene:"region of biological interest identified as a gene and for which a name has been assigned",sequence:"Nucleotide sequence",ntlength:"Length of nucleotide sequence",translation:"Translated sequence",aalength:"Length of protein sequence",truncated:"Not a full length coding sequence",pseudogene:"Does not form a valid translated protein",rating:"Sequence annotation quality",pathogen_dtype:"Pathogen type",pathogen:"Organism name",disease:"Primary disease",family:"Gene/protein family",ortholog:"Ortholog group",subgroup:"Gene family subgroup",country:"locality of isolation of the sequenced organism indicated in terms of political names for nations, oceans or seas, followed by regions and localities",subregion:"Sub region of collection site",ref:"PubMed reference",isolate:"individual isolate from which the sequence was obtained",isolation_source:"describes the physical, environmental and/or local geographical source of the biological sample from which the sequence was derived",molwt:"Molecular weight",segment:"Name of viral or phage segment sequenced",serotype:"Serological variety of a species characterized by its antigenic properties",serogroup:"Serological group of a species characterized by its antigenic properties",serovar:"serological variety of a species characterized by its antigenic properties",hsubtype:"Virus subtype",host:"natural (as opposed to laboratory) host to the organism from which sequenced molecule was obtained",lab_host:"Scientific name of the laboratory host used to propagate the source organism from the sequenced molecule was obtained",specific_host:"Specific host",plasmid:"name of naturally occurring plasmid from which the sequence was obtained",codedby:"Gene coding this product",oldid:"Old accession or identifier",natype:"Nucleic acid type",clone:"Clone used in sequencing",location:"Location on chromosome",locus_tag:"Gene locus identifier",product:"Name of the product associated with the feature",uniprot:"UniProt identifier",udate:"Entry date",domains:"Pfam domain architecture",method:"Domain detection method",model:"Pfam model",score:"Pfam model score",evalue:"Pfam model E-value score",resolution:"Resolution (Angstroms)",numhsps:"Number of high scoring pairs",hitevalue:"E-value for first high-scoring pair",hitbitscore:"Bit score for first high-scoring pair",hitlength:"Length of BLAST hit"}};
}());
(Ext.ux.vardb.Vardb=function(){return{webapp:"/vardb",chartswf:"http://extjs.cachefly.net/ext-3.2.0/resources/charts.swf",onReady:function(){Ext.QuickTips.init();
this.createSpinner();
Ext.ux.Lightbox.register("a[rel^=lightbox]");
},getTerm:function(identifier){var params={identifier:identifier};
this.ajaxRequest("/ajax/term.json",params,function(term){var popup=new Ext.ux.vardb.TermPopup({term:term});
});
},gotoUrl:function(url,params){var href=this.buildHref(url,params);
document.location.href=href;
},buildHref:function(url,params){var qs=(params)?Ext.urlEncode(params):"";
if(qs!==""){qs="?"+qs;
}return this.webapp+url+qs;
},popup:function(resourceType,identifier){if(resourceType==="SEQUENCE"){this.sequencePopup(identifier);
}else{if(resourceType==="TAXON"){this.taxonPopup(identifier);
}else{if(resourceType==="DISEASE"){this.diseasePopup(identifier);
}else{if(resourceType==="PATHOGEN"){this.pathogenPopup(identifier);
}else{if(resourceType==="FAMILY"){this.familyPopup(identifier);
}else{if(resourceType==="SUBGROUP"){this.subgroupPopup(identifier);
}else{if(resourceType==="ORTHOLOG"){this.orthologPopup(identifier);
}else{if(resourceType==="COUNTRY"){this.countryPopup(identifier);
}else{if(resourceType==="REF"){this.refPopup(identifier);
}else{if(resourceType==="STRUCTURE"){this.structurePopup(identifier);
}else{if(resourceType==="GENOME"){this.genomePopup(identifier);
}else{if(resourceType==="CHROMOSOME"){this.chromosomePopup(identifier);
}else{alert("popup type not supported: resourceType="+resourceType+", identifier="+identifier);
}}}}}}}}}}}}},sequencePopup:function(identifier){this.ajaxRequest("/ajax/sequence.json",{identifier:identifier},function(data){var popup=new Ext.ux.vardb.SequencePopup({data:data});
});
},taxonPopup:function(identifier){this.ajaxRequest("/ajax/taxon.json",{identifier:identifier},function(data){var popup=new Ext.ux.vardb.TaxonPopup({data:data});
});
},diseasePopup:function(identifier){this.ajaxRequest("/ajax/disease.json",{identifier:identifier},function(data){var popup=new Ext.ux.vardb.DiseasePopup({data:data});
});
},pathogenPopup:function(identifier){this.ajaxRequest("/ajax/pathogen.json",{identifier:identifier},function(data){var popup=new Ext.ux.vardb.PathogenPopup({data:data});
});
},familyPopup:function(identifier){this.ajaxRequest("/ajax/family.json",{identifier:identifier},function(data){var popup=new Ext.ux.vardb.FamilyPopup({data:data});
});
},subgroupPopup:function(identifier){this.ajaxRequest("/ajax/subgroup.json",{identifier:identifier},function(data){var popup=new Ext.ux.vardb.SubgroupPopup({data:data});
});
},orthologPopup:function(identifier){this.ajaxRequest("/ajax/ortholog.json",{identifier:identifier},function(data){var popup=new Ext.ux.vardb.OrthologPopup({data:data});
});
},countryPopup:function(identifier){this.ajaxRequest("/ajax/country.json",{identifier:identifier},function(data){var popup=new Ext.ux.vardb.CountryPopup({data:data});
});
},refPopup:function(identifier){this.ajaxRequest("/ajax/reference.json",{identifier:identifier},function(data){var popup=new Ext.ux.vardb.RefPopup({data:data});
});
},structurePopup:function(identifier){this.ajaxRequest("/ajax/structure.json",{identifier:identifier},function(data){var popup=new Ext.ux.vardb.StructurePopup({data:data});
});
},genomePopup:function(identifier){this.ajaxRequest("/ajax/genome.json",{identifier:identifier},function(data){var popup=new Ext.ux.vardb.GenomePopup({data:data});
});
},chromosomePopup:function(identifier){this.ajaxRequest("/ajax/chromosome.json",{identifier:identifier},function(data){var popup=new Ext.ux.vardb.ChromosomePopup({data:data});
});
},openWindow:function(url,title,options){title=title||"varDB";
options=options||"scrollbars=1,resizable=1";
var win=window.open(url,title,options);
if(!win){win=window.open("",title,options);
win.location.href=url;
}if(window.focus){win.focus();
}return win;
},deleteUserSequences:function(ids,callback){var message="Permanently delete selected user sequences? ("+ids.length+")";
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,"/ajax/usersequences/delete/ids.json",{ids:ids.join(",")},function(json){Ext.MessageBox.alert("Info",json.message);
if(callback){callback(json);
}});
},deleteAllUserSequences:function(callback){var message="Permanently delete all uploaded user sequences?";
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,"/ajax/usersequences/delete/all.json",{},callback);
},downloadSequencesBySequenceId:function(ids,params,callback){var message="Download the selected sequences? ("+ids.length+")";
Ext.MessageBox.confirm("Confirm",message,function(btn){if(btn==="yes"){params.ids=ids.join(",");
Ext.ux.vardb.Vardb.openWindow(Ext.ux.vardb.Vardb.buildHref("/download/sequences.txt",params));
if(callback){callback();
}}});
},downloadSequencesByListId:function(list_id,filter,params,callback){var message="Downloading all sequence using the current filter. ";
Ext.MessageBox.confirm("Confirm",message,function(btn){if(btn==="yes"){params.list_id=list_id;
params.filter=filter;
this.openWindow(this.buildHref("/download/sequences/"+list_id+".txt",params));
if(callback){callback();
}}},this);
},downloadPropertiesBySequenceId:function(ids,params,callback){var message="Downloading properties for "+ids.length+" sequences. ";
if(ids.length>100){message+=" This may take a while if the number of sequences is large. ";
}message+="Continue?";
Ext.MessageBox.confirm("Confirm",message,function(btn){if(btn==="yes"){params.ids=ids.join(",");
this.openWindow(this.buildHref("/download/properties.txt",params));
if(callback){callback();
}}},this);
},downloadPropertiesByListId:function(list_id,filter,params,callback){var message="Downloading properties for all sequences under current filter. ";
message+="This may take a while if the number of sequences is large. ";
message+="Continue?";
Ext.MessageBox.confirm("Confirm",message,function(btn){if(btn==="yes"){params.list_id=list_id;
params.filter=filter;
this.openWindow(this.buildHref("/download/properties/"+list_id+".txt",params));
if(callback){callback();
}}},this);
},summarize:function(grid){var url="/ajax/lists/summarize.json";
var ids=grid.getSelectedIds();
var total=grid.store.getTotalCount();
var params={list_id:grid.list_id};
if(ids.length>0){url="/ajax/summarize_ids.json";
params.ids=ids.join(",");
total=ids.length;
}var message="Generate summary statistics for the selected sequences? ("+total+"). ";
message+="For large sequence sets it may take a while.";
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,url,params,function(data){var dialog=new Ext.ux.vardb.Summary({data:data});
});
},lengthHistogram:function(grid,type){var url="/ajax/lists/lengths.img";
var ids=grid.getSelectedIds();
var filter=grid.store.baseParams.filter;
var total=grid.store.getTotalCount();
var params={list_id:grid.list_id,filter:filter,type:type};
if(ids.length>0){url="/ajax/lengths_ids.img";
params.ids=ids.join(",");
total=ids.length;
}if(total===1){alert("Cannot generate histogram as only one sequence is selected.");
return;
}var message="Generate a histogram of "+type+" lengths? ("+total+")";
if(total>100){message+="This will take a few minutes when the number of sequences is large";
}Ext.MessageBox.confirm("Confirm",message,function(btn){if(btn!=="yes"){return;
}var win=new Ext.Window({layout:"fit",width:480,height:520,title:"Length histogram",html:'<img src="'+Ext.ux.vardb.Vardb.buildHref(url,params)+'"/>',buttons:[{text:"Close",handler:function(){win.hide();
}}]});
win.show();
});
},createWebLogo:function(id,regex){var weblogo=new Ext.ux.vardb.regex.WebLogo({id:id,regex:regex});
},editGroup:function(group_id){alert("TODO editGroup (group_id="+group_id+")");
},deleteUserAlignment:function(identifier,callback){var message="Delete alignment?";
var url="/ajax/delete_user_alignment.json";
var params={identifier:identifier};
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,url,params,function(json){Ext.ux.vardb.Vardb.info(json.message);
if(callback){callback(json);
}});
},info:function(msg){var win=new Ext.ux.window.MessageWindow({title:"varDB notification",html:msg,origin:{offY:-25,offX:-25},autoHeight:true,iconCls:"icon-info",help:false,hideFx:{delay:1000,mode:"ghost"}});
win.show(Ext.getDoc());
},ajaxRequest:function(url,params,callback){params=params||{};
callback=callback||Ext.emptyFn;
Ext.Ajax.request({url:this.webapp+url,params:params,method:"post",failure:Ext.ux.vardb.Vardb.onFailure,success:function(response,options){var json=Ext.decode(response.responseText);
callback(json);
}});
},ajaxRequestConfirm:function(message,url,params,callback){Ext.MessageBox.confirm("Confirm",message,function(btn){if(btn!=="yes"){return;
}Ext.ux.vardb.Vardb.ajaxRequest(url,params,callback);
});
},createSpinner:function(){Ext.DomHelper.append(document.body,{id:"spinner",tag:"div",html:"Loading..."});
Ext.Ajax.on("beforerequest",function(conn,options){Ext.get("spinner").show();
},this);
Ext.Ajax.on("requestcomplete",function(conn,response,options){Ext.get("spinner").hide();
},this);
Ext.Ajax.on("requestexception",function(conn,response,options){Ext.MessageBox.alert("Failed",response.responseText);
Ext.get("spinner").hide();
},this);
},createReloadButton:function(handler){var button=new Ext.Button({tooltip:"Reload",iconCls:"x-tbar-loading",handler:handler});
return button;
},createSelectList:function(data,fieldName,fieldLabel,value){var combo=new Ext.form.ComboBox({store:new Ext.data.ArrayStore({fields:["value","display"],data:data}),hiddenName:fieldName,fieldLabel:fieldLabel,valueField:"value",displayField:"display",width:150,mode:"local",triggerAction:"all",value:value,selectOnFocus:true,forceSelection:true});
return combo;
},createSelectableTemplate:function(){var template=new Ext.Template('<td class="x-grid3-col x-grid3-cell x-grid3-td-{id} x-selectable {css}" style="{style}" tabIndex="0" {cellAttr}>','<div class="x-grid3-cell-inner x-grid3-col-{id}" {attr}>{value}</div>',"</td>");
return template;
},onFailure:function(response,options){Ext.MessageBox.alert("Failed",response.responseText);
},onFormFailure:function(form,action){switch(action.failureType){case Ext.form.Action.CLIENT_INVALID:Ext.Msg.alert("Failure","Form fields may not be submitted with invalid values");
break;
case Ext.form.Action.CONNECT_FAILURE:Ext.Msg.alert("Failure","Ajax communication failed");
break;
case Ext.form.Action.SERVER_INVALID:Ext.Msg.alert("Failure",action.response.responseText);
}}};
}());
var vardb=Ext.ux.vardb.Vardb;
(Ext.ux.vardb.Cart=function(){return{cart:function(){var url=vardb.webapp+"/explorer.html";
Ext.ux.vardb.Vardb.openWindow(url,"cart");
},quickCart:function(){Ext.ux.vardb.Vardb.ajaxRequest("/ajax/explorer.json",{},function(explorer){var cart=explorer.carts[0];
var quickcart=new Ext.ux.vardb.quickcart.QuickCart({list_id:cart.list_id});
});
},addSelectedToCart:function(grid,list_id,callback){var ids=grid.getSelectedIds();
this.addSequencesToCart(list_id,ids,callback);
},addSequenceToCart:function(id,callback){this.addSequencesToCart([id],callback);
},addSequencesToCart:function(ids,callback){if(ids.length===0){alert("No sequences selected");
return;
}var message="Add the selected sequences to your cart? ("+ids.length+")";
Ext.ux.vardb.Cart.updateCartConfirm(message,"/ajax/lists/add_ids_to_cart.json",{ids:ids.join(",")},callback);
},addSequencesToNewCart:function(ids,callback){if(ids.length===0){alert("No sequences selected");
return;
}var message="Create a new cart using the selected sequences? ("+ids.length+")";
Ext.ux.vardb.Cart.updateCartConfirm(message,"/ajax/lists/add_ids_to_new_cart.json",{ids:ids.join(",")},callback);
},addListToCart:function(list_id,total,callback){var message="Add the selected sequences to your cart? ("+total+")";
Ext.ux.vardb.Cart.updateCartConfirm(message,"/ajax/lists/add_list_to_cart.json",{list_id:list_id},callback);
},addListToNewCart:function(list_id,total,callback){var message="Create a new cart using the selected sequences? ("+total+")";
Ext.ux.vardb.Cart.updateCartConfirm(message,"/ajax/lists/add_list_to_new_cart.json",{list_id:list_id},callback);
},addListToList:function(from_list_id,to_list_id,total,callback){var message="Add the selected sequences ("+total+")";
Ext.ux.vardb.Cart.updateCartConfirm(message,"/ajax/lists/add_list_to_list.json",{from_list_id:from_list_id,to_list_id:to_list_id},callback);
},addFilterToCart:function(list_id,filter,callback){var message="Add the selected sequences to your cart?";
Ext.ux.vardb.Cart.updateCartConfirm(message,"/ajax/lists/add_filter_to_cart.json",{list_id:list_id,filter:filter},callback);
},addFilterToNewCart:function(list_id,filter,callback){var message="Create a new cart and add the selected sequences?";
Ext.ux.vardb.Cart.updateCartConfirm(message,"/ajax/lists/add_filter_to_new_cart.json",{list_id:list_id,filter:filter},callback);
},addResourcesToCart:function(grid,type,list_id,callback){var ids=grid.getSelectedIds();
if(ids.length===0){alert("No resources selected");
return;
}var message=(list_id==="cart")?"Add the selected sequences to your cart?":"Add the selected sequences as a new cart?";
message+=" ("+ids.length+")";
var url=(list_id==="cart")?"/ajax/lists/add_resources_to_cart.json":"/ajax/lists/add_resources_to_new_cart.json";
var params={type:type,ids:ids.join(",")};
Ext.ux.vardb.Cart.updateCartConfirm(message,url,params,callback);
},addResourceToCart:function(type,id,num,list_id,callback){var message=(list_id==="cart")?"Add the selected item to your cart?":"Add the selected item to as a new cart";
if(num){message+=" ("+num+" items of type "+type+")";
}var params={type:type,ids:id,list_id:list_id};
Ext.ux.vardb.Cart.updateCartConfirm(message,"/ajax/lists/add_resources.json",params,callback);
},emptyCart:function(callback){var message="Remove all sequences from your cart?";
Ext.ux.vardb.Cart.updateCartConfirm(message,"/ajax/lists/empty_cart.json",{},callback);
},addSequencesToList:function(list_id,ids,callback){if(ids.length===0){alert("No sequences selected");
return;
}var message="Add selected sequences? ("+ids.length+")";
var params={list_id:list_id,ids:ids.join(",")};
Ext.ux.vardb.Cart.updateCartConfirm(message,"/ajax/lists/add_ids.json",params,callback);
},addFilter:function(list_id,filter,total,callback){if(!filter||filter===""){throw ("No filter specified");
}var message="Add selected sequences? ("+total+")";
var params={list_id:list_id,filter:filter};
Ext.ux.vardb.Cart.updateCartConfirm(message,"/ajax/lists/add_filter.json",params,callback);
},removeFromList:function(grid,callback){var ids=grid.getSelectedIds();
if(ids.length>0){this.removeSequencesFromList(grid.list_id,ids,callback);
}else{var total=grid.store.getTotalCount();
var filter=grid.store.baseParams.filter.trim();
if(filter===""){this.removeAllFromList(grid.list_id,total,callback);
}else{this.removeFilterFromList(grid.list_id,filter,total,callback);
}}},removeSequencesFromList:function(list_id,ids,callback){if(ids.length===0){alert("No sequences selected");
return;
}var message="Remove the selected sequences? ("+ids.length+")";
var params={list_id:list_id,ids:ids.join(",")};
Ext.ux.vardb.Cart.updateCartConfirm(message,"/ajax/lists/delete_ids.json",params,callback);
},removeFilterFromList:function(list_id,filter,total,callback){if(!filter||filter===""){throw ("No filter specified");
}var message="Remove the selected sequences? ("+total+")";
var params={list_id:list_id,filter:filter};
Ext.ux.vardb.Cart.updateCartConfirm(message,"/ajax/lists/delete_filter.json",params,callback);
},removeAllFromList:function(list_id,total,callback){var message="Remove all sequences? ("+total+")";
var params={list_id:list_id};
Ext.ux.vardb.Cart.updateCartConfirm(message,"/ajax/lists/delete_all.json",params,callback);
},updateCartConfirm:function(message,url,params,callback){Ext.MessageBox.confirm("Confirm",message,function(btn){if(btn!=="yes"){return;
}Ext.ux.vardb.Cart.updateCart(url,params,callback);
});
},updateCart:function(url,params,callback){Ext.ux.vardb.Vardb.ajaxRequest(url,params,function(json){Ext.ux.vardb.Vardb.info(json.message);
if(callback){callback(json);
}});
},createSubsetFromSelection:function(ids,callback){var message="Create a new subset using the selected sequences ("+ids.length+")?";
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,"/ajax/lists/create_subset_fromids.json",{ids:ids.join(",")},callback);
},createSubsetFromFilter:function(grid,callback){var total=grid.store.getTotalCount();
var message="No sequences selected. Use all sequences in current view? ("+total+")";
var params={list_id:grid.list_id,filter:grid.store.baseParams.filter};
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,"/ajax/lists/create_subset.json",params,callback);
},addCart:function(callback){var message="Create an empty cart?";
var params={};
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,"/ajax/lists/add_cart.json",params,callback);
},createSubset:function(grid,callback){var ids=grid.getSelectedIds();
if(ids.length>0){this.createSubsetFromSelection(ids,callback);
}else{this.createSubsetFromFilter(grid,callback);
}},cloneCart:function(grid,callback){var total=grid.store.getTotalCount();
var message="Create a copy of the current cart? ("+total+")";
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,"/ajax/lists/clone.json",{list_id:grid.list_id},callback);
},deleteCart:function(list_id,callback){var message="Permanently delete this cart?";
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,"/ajax/lists/delete.json",{list_id:list_id},callback);
},createTagCloud:function(grid){var params={list_id:grid.list_id,filter:grid.store.baseParams.filter};
Ext.ux.vardb.Vardb.ajaxRequest("/ajax/lists/tagcloud.json",params,function(tagcloud){var dialog=new Ext.ux.vardb.tags.TagCloud({tagcloud:tagcloud});
});
},summarize:function(grid){var url="/ajax/cart/summarize/cart.json";
var filter=grid.store.baseParams.filter.trim();
var ids=grid.getSelectedIds();
var total=grid.store.getTotalCount();
var params={list_id:grid.list_id};
if(ids.length>0){url="/search/ajax/summarize/ids.json";
params.ids=ids.join(",");
total=ids.length;
}else{if(filter!==""){url="/ajax/cart/summarize/filter.json";
params.filter=filter;
}}var message="Generate summary statistics for the selected sequences? ("+total+")";
message+="For large sequence sets it may take a while.";
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,url,params,function(data){var dialog=new Ext.ux.vardb.Summary({data:data});
});
},summarizeGroups:function(grid){Ext.ux.vardb.Vardb.ajaxRequest("/ajax/lists/summarize_groups.json",{list_id:grid.list_id},function(data){var dialog=new Ext.ux.vardb.Summary({data:data});
});
},removeGroups:function(list_id,callback){var message="Remove all groups?";
var url="/ajax/lists/remove_groups.json";
var params={};
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,url,params,callback);
},editGroup:function(group_id){},deleteQueries:function(ids,callback){var url="/search/ajax/delete_queries.json";
var params={ids:ids.join(",")};
var message="Delete the selected searches? ("+ids.length+")";
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,url,params,callback);
},deleteAllQueries:function(total,callback){var url="/search/ajax/delete_all_queries.json";
var params={};
var message="Delete all searches? ("+total+")";
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,url,params,callback);
}};
}());
Ext.ux.vardb.Grid=Ext.extend(Ext.grid.GridPanel,{stripeRows:true,initComponent:function(){Ext.ux.vardb.Grid.superclass.initComponent.apply(this,arguments);
},selectAll:function(){this.getSelectionModel().selectAll();
},unselectAll:function(){this.getSelectionModel().clearSelections();
},invertSelection:function(){var rows=this.getSelectionModel().getSelections();
var indexes=[],index,i;
for(i=0;
i<rows.length;
i++){indexes.push(this.getStore().indexOf(rows[i]));
}this.selectAll();
for(i=0;
i<indexes.length;
i++){index=indexes[i];
this.getSelectionModel().deselectRow(index);
}},getSelectedIds:function(){var rows=this.getSelectionModel().getSelections();
var ids=[],index;
for(index=0;
index<rows.length;
index++){ids.push(rows[index].id);
}return ids;
},getSelectedId:function(){var ids=this.getSelectedIds();
if(ids.length<1){alert("Please select an item");
throw"param";
}if(ids.length>1){alert("Please select only one item");
throw"param";
}return ids[0];
},createSelectMenu:function(){var grid=this;
var menu={text:"Select",enableScrolling:false,menu:{items:[{text:"Select all",handler:function(btn){grid.selectAll();
}},{text:"Unselect all",handler:function(btn){grid.unselectAll();
}},"-",{text:"Invert selection",handler:function(btn){grid.invertSelection();
}}]}};
return menu;
},createCartMenu:function(type){var grid=this;
function addSequences(list_id){Ext.ux.vardb.Cart.addResourcesToCart(grid,type,list_id);
}var menu={text:"Cart",enableScrolling:false,menu:{items:[{text:"Add to cart",handler:function(btn){addSequences("cart");
}},{text:"Add as new cart",handler:function(btn){addSequences("new");
}},"-",{text:"Open cart",handler:function(btn){Ext.ux.vardb.Cart.cart();
}},{text:"Empty cart",handler:function(btn){Ext.ux.vardb.Cart.emptyCart();
}}]}};
return menu;
},createResourceToolbar:function(type){var self=this;
var tbar=new Ext.Toolbar({items:[self.createPrintButton(),"-",self.createSelectMenu(),"-",self.createCartMenu(type)]});
return tbar;
},createPrintButton:function(){return{iconCls:"icon-print",scope:this,handler:this.printHandler};
},printHandler:function(){Ext.ux.GridPrinter.print(this);
},createReloadButton:function(){var self=this;
var button=Ext.ux.vardb.Vardb.createReloadButton(function(){self.store.reload();
});
return button;
}});
Ext.ux.vardb.Login=Ext.extend(Ext.form.FormPanel,{title:"Login",labelWidth:100,url:vardb.webapp+"/j_spring_security_check",frame:true,width:300,bodyStyle:"padding:5px 5px 0",defaultType:"textfield",monitorValid:true,iconCls:"login-icon",initComponent:function(){var self=this;
var config={items:[{fieldLabel:"Username",name:"j_username",allowBlank:false,value:this.username},{fieldLabel:"Password",name:"j_password",allowBlank:false,inputType:"password",listeners:{specialkey:function(field,e){if(e.getKey()===e.ENTER){self.submitForm();
}}}},{fieldLabel:"Remember me",name:"_spring_security_remember_me",xtype:"checkbox"}],buttons:[{text:"Login",formBind:true,scope:this,handler:this.submitForm}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.Login.superclass.initComponent.apply(this,arguments);
},onRender:function(){Ext.ux.vardb.Login.superclass.onRender.apply(this,arguments);
this.on("afterlayout",function(){if(this.username){this.getForm().findField("j_password").focus();
}else{this.getForm().findField("j_username").focus();
}},this);
},submitForm:function(){var self=this;
this.getForm().submit({method:"post",waitTitle:"Connecting",waitMsg:"Sending data...",url:vardb.webapp+"/j_spring_security_check",success:function(form,action){var json=Ext.decode(action.response.responseText);
var redirect=(!json.redirect)?vardb.webapp+"/homepage.html":json.redirect;
window.location=redirect;
},failure:function(form,action){var json=Ext.decode(action.response.responseText);
Ext.MessageBox.alert("Failed",json.message);
self.getForm().reset();
}});
}});
Ext.ux.vardb.SelectList=Ext.extend(Ext.form.ComboBox,{valueField:"value",displayField:"display",width:150,mode:"local",triggerAction:"all",selectOnFocus:true,forceSelection:true,initComponent:function(){if(!(this.data instanceof Array)){var arr=this.data.split(",");
var index,value,display;
this.data=[];
for(index=0;
index<arr.length;
index++){value=display=arr[index];
if(display===" "){display="&nbsp;";
}this.data.push([value,display]);
}}var config={store:new Ext.data.ArrayStore({fields:[this.valueField,this.displayField],data:this.data})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.SelectList.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.NewUserForm=Ext.extend(Ext.form.FormPanel,{title:"User information",labelWidth:75,url:vardb.webapp+"/newuser.html",frame:true,width:550,bodyStyle:"padding: 5px 5px 0",defaultType:"textfield",monitorValid:true,initComponent:function(){var config={initialConfig:{standardSubmit:true},defaults:{width:300,allowBlank:false},items:[{fieldLabel:"Username*",name:"username",plugins:[Ext.ux.plugins.RemoteValidator],rvOptions:{url:vardb.webapp+"/ajax/validate/user.json"}},{fieldLabel:"Password 1*",name:"password1",inputType:"password"},{fieldLabel:"Password 2*",name:"password2",inputType:"password"},{fieldLabel:"First name",name:"firstname",allowBlank:true},{fieldLabel:"Last name",name:"lastname",allowBlank:true},{fieldLabel:"Affiliation",name:"affiliation",allowBlank:true},{fieldLabel:"Email*",name:"email",vtype:"email"}],buttons:[{text:"Submit",formBind:true,scope:this,handler:this.submitHandler},{text:"Reset",formBind:true,scope:this,handler:function(){this.getForm().reset();
}}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.NewUserForm.superclass.initComponent.apply(this,arguments);
},onRender:function(){Ext.ux.vardb.NewUserForm.superclass.onRender.apply(this,arguments);
this.on("afterlayout",function(){this.getForm().findField("username").focus();
},this);
},submitHandler:function(){var form=this.getForm();
var password1=form.findField("password1").getValue();
var password2=form.findField("password2").getValue();
if(password1!==password2){Ext.MessageBox.alert("Alert","Passwords do not match.");
form.findField("password1").setValue("");
form.findField("password2").setValue("");
return;
}form.getEl().dom.action=vardb.webapp+"/newuser.html";
form.getEl().dom.method="post";
form.getEl().dom.submit();
}});
Ext.ux.vardb.FeedbackForm=Ext.extend(Ext.form.FormPanel,{title:"Please use the form below to send your comments or suggestions to varDB. ",labelWidth:75,frame:true,width:550,bodyStyle:"padding: 5px 5px 0",defaultType:"textfield",monitorValid:true,iconCls:"icon-email",initComponent:function(){var purposeCombo=new Ext.ux.vardb.SelectList({data:[["COMMENT","Comment"],["QUESTION","Question"],["CORRECTION","Correction"],["SUBMISSION","Submission"]],name:"purpose",fieldLabel:"Purpose",value:this.purpose});
var config={defaults:{width:350,allowBlank:true},items:[{fieldLabel:"Name",name:"name",value:this.name},{fieldLabel:"Affiliation",name:"affiliation",value:this.affiliation},{fieldLabel:"Email*",name:"email",vtype:"email",allowBlank:false,value:this.email},purposeCombo,{fieldLabel:"Comments*",name:"comments",xtype:"textarea",allowBlank:false,grow:true}],buttons:[{text:"Submit",formBind:true,scope:this,handler:this.submitHandler},{text:"Reset",scope:this,handler:function(){this.getForm().reset();
}}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.FeedbackForm.superclass.initComponent.apply(this,arguments);
},submitHandler:function(){if(!this.getForm().isValid()){return;
}this.getForm().getEl().dom.action=vardb.webapp+"/contact.html";
this.getForm().getEl().dom.method="post";
this.getForm().getEl().dom.submit();
}});
Ext.ux.vardb.EditUserForm=Ext.extend(Ext.form.FormPanel,{title:"User information",labelWidth:75,url:vardb.webapp+"/ajax/user.json",frame:true,width:550,bodyStyle:"padding: 5px 5px 0",defaultType:"textfield",trackResetOnLoad:true,disabled:true,monitorValid:true,initComponent:function(){var config={defaults:{width:300,allowBlank:false},items:[{fieldLabel:"Username*",name:"username"},{fieldLabel:"First name",name:"firstname",allowBlank:true},{fieldLabel:"Last name",name:"lastname",allowBlank:true},{fieldLabel:"Affiliation",name:"affiliation",allowBlank:true},{fieldLabel:"Email*",name:"email",vtype:"email"}],buttons:[{text:"Submit",formBind:true,scope:this,handler:this.submitForm},{text:"Reset",formBind:true,scope:this,handler:function(){this.getForm().reset();
}}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.EditUserForm.superclass.initComponent.apply(this,arguments);
},onRender:function(){var self=this;
Ext.ux.vardb.EditUserForm.superclass.onRender.apply(this,arguments);
this.on("afterlayout",function(){this.load({url:vardb.webapp+"/ajax/user.json",method:"GET",success:function(){self.enable();
}});
},this,{single:true});
},submitForm:function(){this.getForm().submit({method:"post",waitTitle:"Connecting",waitMsg:"Sending data...",url:vardb.webapp+"/ajax/user.json",success:function(form,action){var json=Ext.decode(action.response.responseText);
Ext.MessageBox.alert("Success",json.message);
window.location=vardb.webapp+"/user.html";
},failure:function(form,action){var json=Ext.decode(action.response.responseText);
Ext.MessageBox.alert("Failed",json.errors.join("\n"));
}});
}});
Ext.ux.vardb.CommentWindow=Ext.extend(Ext.Window,{title:"Enter a comment",closable:true,resizable:true,bodyStyle:"padding: 0",layout:"fit",iconCls:"icon-user_comment",initComponent:function(){var commentField={xtype:"htmleditor",id:"comment-window-text-htmleditor",hideLabel:true,name:"text",anchor:"0",enableAlignments:false};
var form=new Ext.form.FormPanel({collapsible:false,frame:false,width:500,height:150,bodyStyle:"padding: 0",items:[commentField],buttons:[{id:"vardb-comment-window-clear-btn",text:"Clear",formBind:true,scope:this,handler:function(){this.form.getForm().reset();
}},{id:"vardb-comment-window-submit-btn",text:"Submit",formBind:true,scope:this,handler:this.submitComment}]});
var config={items:form};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.CommentWindow.superclass.initComponent.apply(this,arguments);
this.form=form;
this.show();
},submitComment:function(){var self=this;
var value=this.form.getForm().findField("text").getValue().trim();
this.form.getForm().findField("text").setValue(value);
this.form.getForm().submit({method:"post",waitTitle:"Connecting",waitMsg:"Submitting comment...",url:vardb.webapp+"/ajax/comments/submit.json",params:{type:self.type,identifier:self.identifier},failure:Ext.ux.vardb.Vardb.onFailure,success:function(form,action){var json=Ext.decode(action.response.responseText);
if(self.callback){self.callback();
}self.close();
Ext.MessageBox.alert("Success","Your comment was successfully submitted");
}});
}});
Ext.ux.vardb.Comments=Ext.extend(Ext.Panel,{width:"600",autoScroll:true,pagesize:5,iconCls:"icon-user_comment",initComponent:function(){var self=this;
if(!this.type){throw"Ext.ux.vardb.Comments: type not set";
}if(!this.identifier){throw"Ext.ux.vardb.Comments: identifier not set";
}var reader=new Ext.data.JsonReader({root:"comments",totalProperty:"totalCount",idProperty:"id",fields:[{name:"id",type:"int"},{name:"username"},{name:"type"},{name:"identifier"},{name:"text"},{name:"date"}]});
var store=new Ext.data.Store({url:vardb.webapp+"/ajax/comments.json",reader:reader,remoteSort:true,sortInfo:{field:"date",direction:"DESC"},baseParams:{type:this.type,identifier:this.identifier}});
var resultTpl=new Ext.XTemplate('<tpl for="."><div class="comment-item"><tpl if="username!=\'system\'"><h3><span>{date:date("M j, Y, g:i A")}<br /></span><a href="javascript:void(0)">{username} wrote:</a></h3></tpl><p>{text}</p></div></tpl>');
var addButton=new Ext.Button({id:"vardb-comments-submit-btn",text:"Submit a comment",scope:this,handler:this.submitHandler});
var config={items:new Ext.DataView({tpl:resultTpl,store:store,itemSelector:"div.comment-item",emptyText:'<div class="comment-item"><p style="margin-top:5px;margin-bottom:5px;">No comments have been submitted for this item.</p></div>'}),tbar:new Ext.Toolbar({items:['<span class="comments-heading">User comments</span>',"->","-",addButton]}),bbar:new Ext.PagingToolbar({pageSize:this.pagesize,store:store,displayInfo:true,displayMsg:"{0} - {1} of {2}",emptyMsg:""})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.Comments.superclass.initComponent.apply(this,arguments);
store.load({params:{start:0,limit:this.pagesize}});
this.store=store;
},submitHandler:function(){var self=this;
var win=new Ext.ux.vardb.CommentWindow({type:self.type,identifier:self.identifier,callback:function(){self.store.reload();
}});
}});
Ext.ux.vardb.MainMenu=Ext.extend(Ext.Toolbar,{height:25,anonymous:true,admin:false,initComponent:function(){var config={defaults:{enableScrolling:false},items:[this.createHomepageMenu(),"-",this.createResourceMenu(),"-",this.createBlastMenu(),"-",this.createToolMenu(),"-",this.createUserMenu(),"-",this.createAdminMenu(),"->",this.createSearchSelect(),this.createSearchTextBox(),"-",this.createSearchButton()]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.MainMenu.superclass.initComponent.apply(this,arguments);
},createHomepageMenu:function(){var menu={text:"Homepage",handler:function(){vardb.gotoUrl("/homepage.html");
}};
return menu;
},createResourceMenu:function(){var menu={text:"Resources",enableScrolling:false,menu:{items:[{text:"Pathogens",handler:function(){vardb.gotoUrl("/pathogens.html");
}},{text:"Families",handler:function(){vardb.gotoUrl("/families.html");
}},{text:"Diseases",handler:function(){vardb.gotoUrl("/diseases.html");
}},{text:"Pfam motifs",handler:function(){vardb.gotoUrl("/pfams.html");
}},{text:"Structures",handler:function(){vardb.gotoUrl("/structures.html");
}},{text:"Genomes",handler:function(){vardb.gotoUrl("/genomes.html");
}},{text:"Map",handler:function(){vardb.gotoUrl("/search/map.html");
}},{text:"Alignments",handler:function(){vardb.gotoUrl("/alignments.html");
}},{text:"Clinical data",handler:function(){vardb.gotoUrl("/bundles.html");
}},"-",{text:"Tutorials",handler:function(){vardb.gotoUrl("/tutorials.html");
}},{text:"Antigenic variation",handler:function(){vardb.gotoUrl("/antigenicvariation.html");
}},{text:"Database construction",handler:function(){vardb.gotoUrl("/database.html");
}},{text:"Terms",handler:function(){vardb.gotoUrl("/terms.html");
}},{text:"Links",handler:function(){vardb.gotoUrl("/links.html");
}},{text:"Images",handler:function(){vardb.gotoUrl("/images.html");
}},{text:"References",handler:function(){vardb.gotoUrl("/references.html");
}}]}};
return menu;
},createBlastMenu:function(){var menu={text:"BLAST",menu:{items:[{text:"PSI",handler:function(){vardb.gotoUrl("/blast/blast.html");
}},{text:"PSI-BLAST",handler:function(){vardb.gotoUrl("/blast/psiblast.html");
}},{text:"PHI-BLAST",handler:function(){vardb.gotoUrl("/blast/phiblast.html");
}},{text:"Netblast",handler:function(){vardb.gotoUrl("/analysis/netblast.html");
}}]}};
return menu;
},createToolMenu:function(){var menu={text:"Tools",menu:{items:[{text:"Search sequences",handler:function(){vardb.gotoUrl("/search/sequences.html");
}},{text:"PROSITE/regex search",handler:function(){vardb.gotoUrl("/regex/search.html");
}},{text:"MAFFT alignment tool",handler:function(){vardb.gotoUrl("/mafft.html");
}},{text:"Alignment viewer",handler:function(){vardb.gotoUrl("/alignments/view.html");
}},{text:"Create a codon alignment",handler:function(){vardb.gotoUrl("/analysis/codonalign.html");
}},{text:"Gblocks",handler:function(){vardb.gotoUrl("/analysis/gblocks.html");
}},{text:"Analyze variability",handler:function(){vardb.gotoUrl("/analysis/variability.html");
}}]}};
return menu;
},createUserMenu:function(){var items=[];
if(this.anonymous){items.push({text:"New account",handler:function(){vardb.gotoUrl("/newuser.html");
}});
items.push({text:"Login",handler:function(){vardb.gotoUrl("/login.html");
}});
}else{items.push({text:"Logout",handler:function(){vardb.gotoUrl("/logout.html");
}});
items.push({text:"Edit user information",handler:function(){vardb.gotoUrl("/edituser.html");
}});
items.push({text:"Change password",handler:function(){vardb.gotoUrl("/changepassword.html");
}});
items.push({text:"Contact us",handler:function(){vardb.gotoUrl("/contact.html");
}});
}items.push("-");
items.push({text:"Explorer",handler:function(){vardb.gotoUrl("/explorer.html");
}});
items.push("-");
items.push({text:"My searches",handler:function(){vardb.gotoUrl("/user/searches.html");
}});
items.push({text:"My analyses",handler:function(){vardb.gotoUrl("/user/analyses.html");
}});
items.push({text:"My sequences",handler:function(){vardb.gotoUrl("/user/sequences.html");
}});
items.push({text:"My alignments",handler:function(){vardb.gotoUrl("/user/alignments.html");
}});
var menu={text:"User",menu:{items:items}};
return menu;
},createAdminMenu:function(){if(!this.admin){return"";
}var menu={text:"Admin",menu:{items:[{text:"Admin page",handler:function(){vardb.gotoUrl("/admin/index.html");
}},{text:"Update XML",handler:function(){vardb.gotoUrl("/admin/setup.html");
}},{text:"Update sequences",handler:function(){vardb.gotoUrl("/admin/load/table.html");
}},{text:"Update counts",handler:function(){vardb.gotoUrl("/admin/update/counts.html");
}},{text:"Clear cache",handler:function(){vardb.gotoUrl("/admin/cache/clear.html");
}},{text:"Users",handler:function(){vardb.gotoUrl("/admin/users.html");
}}]}};
return menu;
},createSearchSelect:function(){var combo=new Ext.form.ComboBox({store:new Ext.data.ArrayStore({fields:["value","display"],data:[["SEQUENCES","Sequences"],["GOOGLE","Google"]]}),itemId:"searchtype",hiddenName:"type",valueField:"value",displayField:"display",width:110,mode:"local",triggerAction:"all",value:"SEQUENCES",selectOnFocus:true,forceSelection:true});
return combo;
},createSearchTextBox:function(){var self=this;
var store=new Ext.data.Store({url:vardb.webapp+"/search/ajax/suggestions.json",reader:new Ext.data.JsonReader({root:"results",totalProperty:"totalCount",idProperty:"keyword"},[{name:"keyword",mapping:"keyword"},{name:"type",mapping:"type"},{name:"identifier",mapping:"identifier"}]),baseParams:{limit:20}});
var combo=new Ext.form.ComboBox({itemId:"searchtextbox",store:store,minChars:2,displayField:"keyword",loadingText:"Searching...",width:150,listWidth:200,hideTrigger:true,emptyText:"Search...",queryDelay:800,forceSelection:false,foundMatch:false,listeners:{select:function(field,record,index){this.foundMatch=true;
},specialkey:function(field,e){if(e.getKey()===e.ENTER&&this.foundMatch){self.submitSearchHandler();
}}}});
return combo;
},createSearchButton:function(){var button=new Ext.Button({text:"Go",width:32,scope:this,handler:this.submitSearchHandler});
return button;
},submitSearchHandler:function(){var value=this.getComponent("searchtextbox").getValue().trim();
var type=this.getComponent("searchtype").getValue().trim();
if(value===""){return;
}var form=document.forms.searchform;
form.elements.query.value=value;
if(type==="SEQUENCES"){if(value.indexOf(" ")!==-1){form.elements.query.value='"'+value+'"';
}}else{if(type==="GOOGLE"){form.action=vardb.webapp+"/search/google.html";
}else{throw"unsupported search type: "+type;
}}form.submit();
}});
Ext.ux.vardb.AbstractForm=Ext.extend(Ext.form.FormPanel,{collapsible:false,frame:true,bodyStyle:"padding: 5px 5px 0 5px;",createFieldset:function(config,items){Ext.applyIf(config,{xtype:"fieldset",collapsible:true,collapsed:false,items:items});
return config;
},createRow:function(items){var column={layout:"column",items:items};
return column;
},createControl:function(controlConfig,formConfig){if(!controlConfig.fieldLabel){if(controlConfig.name){controlConfig.fieldLabel=controlConfig.name;
}else{if(controlConfig.hiddenName){controlConfig.fieldLabel=controlConfig.hiddenName;
}}}if(!controlConfig.value&&this.data){if(controlConfig.name&&this.data[controlConfig.name]){controlConfig.value=this.data[controlConfig.name];
}else{if(controlConfig.hiddenName&&this.data[controlConfig.hiddenName]){controlConfig.value=this.data[controlConfig.hiddenName];
}}}formConfig=formConfig||{};
var rmargin=0;
Ext.applyIf(formConfig,{layout:"form",labelWidth:this.getTextMetrics().getWidth(controlConfig.fieldLabel)+rmargin,bodyStyle:"padding-right: 7px",items:[controlConfig]});
return formConfig;
},createDateControl:function(controlConfig,formConfig){Ext.applyIf(controlConfig,{xtype:"datefield",width:100});
return this.createControl(controlConfig,formConfig);
},createTextControl:function(controlConfig,formConfig){Ext.applyIf(controlConfig,{xtype:"textfield",width:80});
return this.createControl(controlConfig,formConfig);
},createTextAreaControl:function(controlConfig,formConfig){Ext.applyIf(controlConfig,{xtype:"textarea",anchor:"-4",height:100});
formConfig=formConfig||{};
Ext.applyIf(formConfig,{labelAlign:"top",width:"100%"});
return this.createControl(controlConfig,formConfig);
},createNumberControl:function(controlConfig,formConfig){Ext.applyIf(controlConfig,{xtype:"numberfield",width:30});
return this.createControl(controlConfig,formConfig);
},createCheckbox:function(controlConfig,formConfig){Ext.applyIf(controlConfig,{xtype:"checkbox"});
return this.createControl(controlConfig,formConfig);
},createSelectList:function(controlConfig,formConfig){return this.createControl(new Ext.ux.vardb.SelectList(controlConfig),formConfig);
},createTextBox:function(controlConfig,formConfig){Ext.applyIf(controlConfig,{xtype:"textbox",width:this.getTextMetrics().getWidth(controlConfig.text)});
return this.createControl(controlConfig,formConfig);
},createFileUploadControl:function(controlConfig,formConfig){Ext.applyIf(controlConfig,{xtype:"fileuploadfield",fieldLabel:"File",anchor:"-4",buttonText:"",buttonCfg:{iconCls:"upload-icon"}});
formConfig=formConfig||{};
Ext.applyIf(formConfig,{width:"100%"});
return this.createControl(controlConfig,formConfig);
},getTextMetrics:function(){if(this.textMetrics){return this.textMetrics;
}if(this.renderTo){this.textMetrics=Ext.util.TextMetrics.createInstance(this.renderTo);
}else{this.textMetrics=Ext.util.TextMetrics.createInstance(document.body);
}return this.textMetrics;
},createClearButton:function(){var btn={text:"Clear",formBind:true,scope:this,handler:this.resetHandler};
return btn;
},createStandardSubmitButton:function(){var btn={text:"Submit",formBind:true,scope:this,handler:this.standardSubmitHandler};
return btn;
},createExampleButton:function(){var btn={text:"Example",formBind:true,scope:this,handler:this.showExampleHandler};
return btn;
},checkValidation:function(){return true;
},standardSubmitHandler:function(){if(!this.checkValidation()){return;
}var form=this.getForm().getEl().dom;
form.action=this.url;
form.method="post";
form.submit();
},resetHandler:function(){this.getForm().reset();
},showExampleHandler:function(){},checkNotEmpty:function(fieldnames,message){var arr=fieldnames.split(",");
var index,fieldname;
for(index=0;
index<arr.length;
index++){fieldname=arr[index];
if(this.getForm().findField(fieldname).getValue().trim()!==""){return true;
}}Ext.MessageBox.alert("Field validation",message);
return false;
}});
Ext.ux.vardb.ResourceGrid=Ext.extend(Ext.ux.vardb.Grid,{title:"Resources",frame:true,autoHeight:true,autoWidth:true,collapsible:false,style:"margin: 20px 0 0 0",initComponent:function(){var self=this;
var reader=new Ext.data.JsonReader({root:"rows",idProperty:"id",fields:[{name:"id",type:"int"},{name:"resourceType"},{name:"identifier"},{name:"name"},{name:"description"},{name:"numsequences",type:"int"}]});
var store=new Ext.data.Store({reader:reader,data:this.data,sortInfo:{field:"name",direction:"ASC"}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var config={viewConfig:{forceFit:true},hidden:this.data.rows.length<1,sm:sm,store:store,columns:[sm,{header:"Name",width:60,sortable:true,dataIndex:"name",renderer:this.renderName},{header:"Description",width:100,sortable:true,dataIndex:"description"},{header:"Sequences",width:65,sortable:true,dataIndex:"numsequences",align:"right",renderer:this.renderCount}],tbar:new Ext.Toolbar({items:[self.createPrintButton(),"-",self.createSelectMenu(),"-",self.createCartMenu("PARALOG")]})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.ResourceGrid.superclass.initComponent.apply(this,arguments);
this.viewConfig.emptyText='<div class="emptyText">Table is empty.</div>';
},renderName:function(value,p,record){var resourceType=record.data.resourceType;
var folder=resourceType.toLowerCase()+"s";
if(resourceType==="FAMILY"){folder="families";
}return String.format('<a href="'+vardb.webapp+'/{2}/{1}.html">{0}</a>',value,record.data.identifier,folder);
},renderCount:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/search/sequences.html?query={2}={1}">{0}</a>',value,record.data.identifier,record.data.resourceType.toLowerCase());
}});
(Ext.ux.vardb.Renderer=function(){return{renderAccession:function(value,p,r){return String.format('<a href="'+vardb.webapp+'/sequences/{0}.html" target="_blank">{1}</a>',r.data.identifier,value);
},renderAccessionPopup:function(value,p,r){return String.format('<a href="javascript:void(0)" onclick="vardb.sequencePopup(\'{0}\')">{1}{2}</a>',r.data.identifier,value,(r.data.uploaded?"*":""));
},renderTaxon:function(value,p,r){return String.format('<a href="http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?mode=Info&id={0}&lvl=3&lin=f&keep=1&srchmode=1&unlock" target="_blank">{1}</a>',r.data.taxon_identifier,value);
},renderTaxonPopup:function(value,p,r){var identifier=r.data.taxon_identifier?r.data.taxon_identifier:r.data.identifier;
return String.format('<a href="javascript:void(0)" onclick="vardb.taxonPopup(\'{1}\')">{0}</a>',value,identifier);
},renderPathogen:function(value,p,r){return String.format('<a href="'+vardb.webapp+'/pathogens/{0}.html">{1}</a>',r.data.pathogen_identifier,value);
},renderPathogenPopup:function(value,p,r){var identifier=r.data.pathogen_identifier?r.data.pathogen_identifier:r.data.identifier;
return String.format('<a href="javascript:void(0)" onclick="vardb.pathogenPopup(\'{1}\')">{0}</a>',value,identifier);
},renderFamily:function(value,p,r){return String.format('<a href="'+vardb.webapp+'/families/{0}.html">{1}</a>',r.data.family_identifier,value);
},renderFamilyPopup:function(value,p,r){var identifier=r.data.family_identifier?r.data.family_identifier:r.data.identifier;
return String.format('<a href="javascript:void(0)" onclick="vardb.familyPopup(\'{1}\')">{0}</a>',value,identifier);
},renderSubgroup:function(value,p,r){return String.format('<a href="'+vardb.webapp+'/subgroups/{0}.html">{1}</a>',r.data.subgroup_identifier,value);
},renderSubgroupPopup:function(value,p,r){var identifier=r.data.subgroup_identifier?r.data.subgroup_identifier:r.data.identifier;
return String.format('<a href="javascript:void(0)" onclick="vardb.subgroupPopup(\'{1}\')">{0}</a>',value,identifier);
},renderGenome:function(value,p,r){return String.format('<a href="'+vardb.webapp+'/genomes/{0}.html">{1}</a>',r.data.genome_identifier,value);
},renderGenomePopup:function(value,p,r){var identifier=r.data.genome_identifier?r.data.genome_identifier:r.data.identifier;
return String.format('<a href="javascript:void(0)" onclick="vardb.genomePopup(\'{1}\')">{0}</a>',value,identifier);
},renderGenomeBrowser:function(value,p,r){return String.format('<a href="'+vardb.webapp+'/browser.html?genome={0}">{1}</a>',r.data.genome_identifier,value);
},renderChromosomePopup:function(value,p,r){var identifier=r.data.chromosome_identifier?r.data.chromosome_identifier:r.data.identifier;
return String.format('<a href="javascript:void(0)" onclick="vardb.chromosomePopup(\'{1}\')">{0}</a>',value,identifier);
},renderOrtholog:function(value,p,r){if(r.data.ortholog_identifier===""){return"";
}return String.format('<a href="'+vardb.webapp+'/orthologs/{0}.html">{1}</a>',r.data.ortholog_identifier,value);
},renderOrthologPopup:function(value,p,r){var identifier=r.data.ortholog_identifier?r.data.ortholog_identifier:r.data.identifier;
return String.format('<a href="javascript:void(0)" onclick="vardb.orthologPopup(\'{1}\')">{0}</a>',value,identifier);
},renderDisease:function(value,p,r){return String.format('<a href="'+vardb.webapp+'/diseases/{0}.html">{1}</a>',r.data.disease_identifier,value);
},renderDiseasePopup:function(value,p,r){var identifier=r.data.disease_identifier?r.data.disease_identifier:r.data.identifier;
return String.format('<a href="javascript:void(0)" onclick="vardb.diseasePopup(\'{1}\')">{0}</a>',value,identifier);
},renderTruncated:function(value,p,r){return r.data.truncated===true?"truncated":"";
},renderPseudogene:function(value,p,r){return r.data.pseudogene===true?"pseudogene":"";
},renderRef:function(value,p,r){return Ext.ux.vardb.Renderer.renderRefPopup(value,p,r);
},renderRefPopup:function(value,p,r){var identifier=r.data.ref_identifier?r.data.ref_identifier:r.data.identifier;
return String.format('<a href="javascript:void(0)" onclick="vardb.refPopup(\'{1}\')">{0}</a>',value,identifier);
},renderModel:function(value,p,r){return String.format('<a href="http://pfam.sanger.ac.uk/family?acc={0}" target="_blank">{0}</a>',value);
},renderLength:function(value,p,r){if(value===0){return"";
}else{return value;
}},renderEmail:function(value,p,r){return String.format('<a href="mailto:{0}">{0}</a>',value);
},renderTags:function(value,p,r,list_id){if(!r.data.tags_name){return"";
}var tags_id=r.data.tags_id.split(",");
var tags_name=r.data.tags_name.split(",");
var tags_description=r.data.tags_description.split(",");
var tags_color=r.data.tags_color.split(",");
var tags_bgcolor=r.data.tags_bgcolor.split(",");
var tags_bundle=r.data.tags_bundle.split(",");
var tags_readonly=r.data.tags_readonly.split(",");
var index,buffer=[],tag_id,tag_name,description,color,bgcolor,bundle_name,readonly,str,style,title;
for(index=0;
index<tags_name.length;
index++){tag_id=tags_id[index];
tag_name=tags_name[index];
description=tags_description[index];
color=tags_color[index];
bgcolor=tags_bgcolor[index];
readonly=tags_readonly[index];
if(readonly==="true"){color="gray";
bgcolor="white";
}style="color:"+color+";background-color:"+bgcolor+";";
bundle_name=tags_bundle[index]+" bundle";
readonly=tags_readonly[index];
title="["+bundle_name+"]";
if(description!==""){title+=": "+description;
}str='<a href="javascript:void(0)" onclick="Ext.ux.vardb.tags.Services.editTag(\''+tag_id+'\')" style="'+style+'" title="'+title+'">'+tag_name+"</a>";
buffer.push(str);
}return buffer.join(", ");
},renderGroup:function(value,p,r){if(!r.data.group_name){return"";
}var style="color:"+r.data.group_color+";background-color:"+r.data.group_bgcolor+";";
var title=r.data.group_description||r.data.group+name;
var str='<a href="javascript:void(0)" onclick="Ext.ux.vardb.Vardb.editGroup(\''+r.data.group_id+'\')" style="'+style+'" title="'+title+'">'+r.data.group_name+"</a>";
return str;
},chunkSequence:function(sequence,max){max=max||80;
function Chunk(str,index){var start=index*max;
var end=start+max;
if(end>str.length){this.line=str.substring(start);
}else{this.line=str.substring(start,end);
}}var chunks=[],index;
var numchunks=Math.floor(sequence.length/max);
if(sequence.length%max>0){numchunks++;
}for(index=0;
index<numchunks;
index++){chunks.push(new Chunk(sequence,index));
}return chunks;
},formatSequence:function(value){var index,aa,str="";
for(index=0;
index<value.length;
index++){aa=value.substring(index,index+1);
str+='<span class="'+aa.toUpperCase()+'">'+aa+"</span>";
}return str;
},renderGenbankAccession:function(value,p,r){return String.format('<a href="http://www.ncbi.nlm.nih.gov/protein/{0}" target="_blank">{0}</a>',value);
},renderNameLink:function(value,p,r){return String.format('<a href="#">{0}</a>',value);
},renderAlignment:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/alignments/{1}.html">{0}</a>',value,record.data.identifier);
}};
}());
(Ext.ux.vardb.ColumnBuilder=function(){return{r:Ext.ux.vardb.Renderer,t:Ext.ux.vardb.Constants.tooltips,createColumn:function(defaults,overrides){overrides=overrides||{};
Ext.applyIf(defaults,{sortable:true});
Ext.applyIf(defaults,overrides);
return defaults;
},accessionColumn:function(overrides){return this.createColumn({header:"Accession",width:80,dataIndex:"accession",hideable:false,renderer:this.r.renderAccessionPopup,tooltip:this.t.accession},overrides);
},tagsColumn:function(overrides){return this.createColumn({header:"Tags",sortable:false,width:75,dataIndex:"tags_name",renderer:this.r.renderTags,tooltip:this.t.tags},overrides);
},groupsColumn:function(overrides){return this.createColumn({header:"Groups",sortable:false,width:75,dataIndex:"group_name",renderer:this.r.renderGroup,tooltip:this.t.group},overrides);
},deflineColumn:function(overrides){return this.createColumn({header:"Description",width:75,dataIndex:"defline",tooltip:this.t.description},overrides);
},taxonColumn:function(overrides){return this.createColumn({header:"Taxon",width:75,dataIndex:"taxon_name",renderer:this.r.renderTaxonPopup,tooltip:this.t.taxon},overrides);
},strainColumn:function(overrides){return this.createColumn({header:"Strain",width:50,dataIndex:"strain",tooltip:this.t.strain},overrides);
},geneColumn:function(overrides){return this.createColumn({header:"Gene",width:40,dataIndex:"gene",renderer:this.r.renderFamilyPopup,tooltip:this.t.gene},overrides);
},productColumn:function(overrides){return this.createColumn({header:"Product",width:50,dataIndex:"product",tooltip:this.t.product},overrides);
},ntlengthColumn:function(overrides){return this.createColumn({header:"Nt",width:40,align:"right",dataIndex:"ntlength",tooltip:this.t.ntlength,renderer:this.r.renderLength},overrides);
},aalengthColumn:function(overrides){return this.createColumn({header:"Aa",width:40,align:"right",dataIndex:"aalength",tooltip:this.t.aalength,renderer:this.r.renderLength},overrides);
},sequenceColumn:function(overrides){return this.createColumn({header:"Sequence",width:100,dataIndex:"sequence",tooltip:this.t.sequence},overrides);
},translationColumn:function(overrides){return this.createColumn({header:"Translation",dataIndex:"translation",width:100,tooltip:this.t.translation},overrides);
},truncatedColumn:function(overrides){return this.createColumn({header:"Truncated",width:40,dataIndex:"truncated",renderer:this.r.renderTruncated,tooltip:this.t.truncated},overrides);
},pseudogeneColumn:function(overrides){return this.createColumn({header:"Pseudogene",width:40,dataIndex:"pseudogene",renderer:this.r.renderPseudogene,tooltip:this.t.pseudogene},overrides);
},ratingColumn:function(overrides){return this.createColumn({header:"Rating",dataIndex:"rating",renderer:this.r.renderRating,tooltip:this.t.rating},overrides);
},pathogen_dtypeColumn:function(overrides){return this.createColumn({header:"Type",dataIndex:"pathogen_dtype",tooltip:this.t.pathogen_dtype},overrides);
},pathogenColumn:function(overrides){return this.createColumn({header:"Pathogen",dataIndex:"pathogen_name",renderer:this.r.renderPathogenPopup,tooltip:this.t.pathogen},overrides);
},diseaseColumn:function(overrides){return this.createColumn({header:"Disease",dataIndex:"disease_name",renderer:this.r.renderDiseasePopup,tooltip:this.t.disease},overrides);
},familyColumn:function(overrides){return this.createColumn({header:"Family",dataIndex:"family_name",renderer:this.r.renderFamilyPopup,tooltip:this.t.family},overrides);
},orthologColumn:function(overrides){return this.createColumn({header:"Ortholog",dataIndex:"ortholog_name",renderer:this.r.renderOrthologPopup,tooltip:this.t.ortholog},overrides);
},subgroupColumn:function(overrides){return this.createColumn({header:"Subgroup",dataIndex:"subgroup_name",tooltip:this.t.subgroup},overrides);
},countryColumn:function(overrides){return this.createColumn({header:"Country",dataIndex:"country_name",tooltip:this.t.country},overrides);
},subregionColumn:function(overrides){return this.createColumn({header:"Subregion",dataIndex:"subregion",tooltip:this.t.subregion},overrides);
},refColumn:function(overrides){return this.createColumn({header:"Ref",dataIndex:"ref_name",renderer:this.r.renderRef,tooltip:this.t.ref},overrides);
},isolateColumn:function(overrides){return this.createColumn({header:"Isolate",dataIndex:"isolate",tooltip:this.t.isolate},overrides);
},isolation_sourceColumn:function(overrides){return this.createColumn({header:"Isolation source",dataIndex:"isolation_source",tooltip:this.t.isolation_source},overrides);
},molwtColumn:function(overrides){return this.createColumn({header:"Mol. wt.",dataIndex:"molwt",tooltip:this.t.molwt},overrides);
},segmentColumn:function(overrides){return this.createColumn({header:"Segment",dataIndex:"segment",tooltip:this.t.segment},overrides);
},serotypeColumn:function(overrides){return this.createColumn({header:"Serotype",dataIndex:"serotype",tooltip:this.t.serotype},overrides);
},serogroupColumn:function(overrides){return this.createColumn({header:"Serogroup",dataIndex:"serogroup",tooltip:this.t.serogroup},overrides);
},serovarColumn:function(overrides){return this.createColumn({header:"Serovar",dataIndex:"serovar",tooltip:this.t.serovar},overrides);
},subtypeColumn:function(overrides){return this.createColumn({header:"Subtype",dataIndex:"subtype",tooltip:this.t.subtype},overrides);
},hostColumn:function(overrides){return this.createColumn({header:"Host",dataIndex:"host",tooltip:this.t.host},overrides);
},lab_hostColumn:function(overrides){return this.createColumn({header:"Lab host",dataIndex:"lab_host",tooltip:this.t.lab_host},overrides);
},specific_hostColumn:function(overrides){return this.createColumn({header:"Specific host",dataIndex:"specific_host",tooltip:this.t.specific_host},overrides);
},plasmidColumn:function(overrides){return this.createColumn({header:"Plasmid",dataIndex:"plasmid",tooltip:this.t.plasmid},overrides);
},codedbyColumn:function(overrides){return this.createColumn({header:"Coded by",dataIndex:"codedby",tooltip:this.t.codedby},overrides);
},oldidColumn:function(overrides){return this.createColumn({header:"Old ID",dataIndex:"oldid",tooltip:this.t.oldid},overrides);
},natypeColumn:function(overrides){return this.createColumn({header:"NA type",dataIndex:"natype",tooltip:this.t.natype},overrides);
},cloneColumn:function(overrides){return this.createColumn({header:"Clone",dataIndex:"clone",tooltip:this.t.clone},overrides);
},locationColumn:function(overrides){return this.createColumn({header:"Location",dataIndex:"location",tooltip:this.t.location},overrides);
},locus_tagColumn:function(overrides){return this.createColumn({header:"Locus tag",dataIndex:"locus_tag",tooltip:this.t.locus_tag},overrides);
},uniprotColumn:function(overrides){return this.createColumn({header:"UniProt",dataIndex:"uniprot",tooltip:this.t.uniprot},overrides);
},udateColumn:function(overrides){return this.createColumn({header:"Udate",dataIndex:"udate",tooltip:this.t.udate},overrides);
},domainsColumn:function(overrides){return this.createColumn({header:"Domains",width:100,dataIndex:"domains",tooltip:this.t.domains},overrides);
},methodColumn:function(overrides){return this.createColumn({header:"Method",width:70,dataIndex:"method",tooltip:this.t.method},overrides);
},modelColumn:function(overrides){return this.createColumn({header:"Model",width:40,dataIndex:"model",tooltip:this.t.model},overrides);
},scoreColumn:function(overrides){return this.createColumn({header:"Score",width:40,dataIndex:"score",align:"right",tooltip:this.t.score},overrides);
},evalueColumn:function(overrides){return this.createColumn({header:"E-value",width:40,dataIndex:"evalue",align:"right",tooltip:this.t.evalue},overrides);
},numhspsColumn:function(overrides){return this.createColumn({header:"HSPs",width:40,dataIndex:"numhsps",align:"right",tooltip:this.t.numhsps},overrides);
},hitevalueColumn:function(overrides){return this.createColumn({header:"E-value",width:40,dataIndex:"hitevalue",align:"right",tooltip:this.t.hitevalue},overrides);
},hitbitscoreColumn:function(overrides){return this.createColumn({header:"Bit score",width:50,dataIndex:"hitbitscore",align:"right",tooltip:this.t.hitbitscore},overrides);
},hitlengthColumn:function(overrides){return this.createColumn({header:"Hit length",width:50,dataIndex:"hitlength",align:"right",tooltip:this.t.hitlength},overrides);
}};
}());
Ext.ux.vardb.Download=function(url,params){params=params||{};
var win;
var form;
function submitHandler(){params.type=form.getForm().findField("type").getValue();
params.format=form.getForm().findField("format").getValue();
params.destination=form.getForm().findField("destination").getValue();
var href=Ext.ux.vardb.Vardb.buildHref(url,params);
Ext.ux.vardb.Vardb.openWindow(href);
win.hide();
}function selectList(data,fieldName,fieldLabel,value){var combo=new Ext.ux.vardb.SelectList({data:data,name:fieldName,fieldLabel:fieldLabel,value:value});
return combo;
}function createTypeField(){var options=[];
options.push(["AA","Protein sequences"]);
options.push(["NT","DNA sequences"]);
options.push(["CDS","Coding sequences"]);
options.push(["PAIRS","Coding + protein sequences"]);
return selectList(options,"type","Type","AA");
}function createFormatField(){var options=[];
options.push(["FASTA","Fasta"]);
options.push(["PIR","Pir"]);
return selectList(options,"format","Format","FASTA");
}function createDestinationField(){var options=[];
options.push(["SCREEN","Screen"]);
options.push(["FILE","File"]);
return selectList(options,"destination","To","SCREEN");
}form=new Ext.FormPanel({labelWidth:100,url:"",defaults:{width:230,allowBlank:false},defaultType:"textfield",items:[createTypeField(),createFormatField(),createDestinationField()],buttons:[{text:"Download",formBind:true,handler:submitHandler},{text:"Cancel",handler:function(){win.hide();
}}]});
win=new Ext.Window({title:"Download sequences",width:400,closable:true,resizable:true,items:[form]});
win.show();
};
Ext.ux.vardb.Properties=function(url,params){params=params||{};
var dialog;
var form;
function submitHandler(){params.destination=form.getForm().findField("destination").getValue();
var href=Ext.ux.vardb.Vardb.buildHref(url,params);
Ext.ux.vardb.Vardb.openWindow(href);
dialog.hide();
}function selectList(data,fieldName,fieldLabel,value){var combo=new Ext.ux.vardb.SelectList({data:data,name:fieldName,fieldLabel:fieldLabel,value:value});
}function createDestinationField(){var options=[];
options.push(["SCREEN","Screen"]);
options.push(["FILE","File"]);
return selectList(options,"destination","To","SCREEN");
}form=new Ext.FormPanel({labelWidth:100,url:"",defaults:{width:230,allowBlank:false},defaultType:"textfield",items:[createDestinationField()],buttons:[{text:"Download",formBind:true,handler:submitHandler},{text:"Cancel",handler:function(){dialog.hide();
}}]});
dialog=new Ext.Window({title:"Download sequence properties",width:400,closable:true,resizable:true,items:[form]});
dialog.show();
};
Ext.ux.vardb.DownloadSequencesDialog=Ext.extend(Ext.Window,{title:"Download sequences",width:400,closable:true,resizable:true,warningThreshold:1000,initComponent:function(){this.form=new Ext.FormPanel({labelWidth:60,url:"",defaults:{width:230,allowBlank:false},defaultType:"textfield",items:[this.createTypeField(),this.createFormatField(),this.createDestinationField()],buttons:[{text:"Download",formBind:true,scope:this,handler:this.submitHandler},{text:"Cancel",scope:this,handler:function(){this.hide();
}}]});
this.items=[this.form];
Ext.ux.vardb.DownloadSequencesDialog.superclass.initComponent.apply(this,arguments);
this.show();
},submitHandler:function(){var self=this;
var list_id=this.grid.list_id;
var filter=this.grid.store.baseParams.filter.trim();
var params={};
params.type=this.form.getForm().findField("type").getValue();
params.format=this.form.getForm().findField("format").getValue();
params.destination=this.form.getForm().findField("destination").getValue();
var callback=function(){self.close();
};
var ids=this.grid.getSelectedIds();
if(ids.length>0){Ext.ux.vardb.Vardb.downloadSequencesBySequenceId(ids,params,callback);
}else{Ext.ux.vardb.Vardb.downloadSequencesByListId(list_id,filter,params,callback);
}},createSelectList:function(data,fieldName,fieldLabel,value){var combo=new Ext.ux.vardb.SelectList({data:data,name:fieldName,fieldLabel:fieldLabel,value:value});
return combo;
},createTypeField:function(){var options=[["AA","Protein sequences"],["NT","DNA sequences"],["CDS","Coding sequences (spliced)"],["ACCESSIONS","Accessions only"],["PAIRS","Paired protein and DNA sequences"]];
return this.createSelectList(options,"type","Type","AA");
},createFormatField:function(){var options=[["FASTA","Fasta"]];
return this.createSelectList(options,"format","Format","FASTA");
},createDestinationField:function(){var options=[["SCREEN","Screen"],["FILE","File"]];
return this.createSelectList(options,"destination","To","SCREEN");
}});
Ext.ux.vardb.DownloadPropertiesDialog=Ext.extend(Ext.Window,{title:"Download sequence properties",width:800,height:500,closable:true,autoScroll:true,resizable:true,warningThreshold:1000,initComponent:function(){var items=[];
items.push(this.createDestinationCombo());
items.push(this.createPropertyCheckboxGroup("Core properties",this.coreProperties));
items.push(this.createPropertyCheckboxGroup("Chromosome/contig properties",this.contigProperties));
items.push(this.createPropertyCheckboxGroup("Pfam properties",this.pfamProperties));
items.push(this.createPropertyCheckboxGroup("GenBank properties",this.genbankProperties));
var form=new Ext.FormPanel({border:false,items:items});
var config={items:form,buttons:[{text:"Cancel",formBind:true,scope:this,handler:function(){this.hide();
}},{text:"Download",formBind:true,scope:this,handler:this.submitHandler}]};
this.form=form;
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.DownloadPropertiesDialog.superclass.initComponent.apply(this,arguments);
this.show();
},createDestinationCombo:function(){var destinationCombo=new Ext.ux.vardb.SelectList({data:[["SCREEN","Screen"],["FILE","File"],["XLS","Spreadsheet"]],name:"destination",fieldLabel:"Destination",value:"SCREEN",emptyText:" ",width:230});
return destinationCombo;
},createPropertyCheckboxGroup:function(title,properties){var maxcolumns=6;
var items=[];
var index,property,name,checked;
for(index=0;
index<properties.length;
index++){property=properties[index];
name=property[0];
checked=property[1];
items.push({boxLabel:name,name:"property."+name,checked:checked});
}var checkboxes={xtype:"xcheckboxgroup",hideLabel:true,columns:maxcolumns,autoHeight:true,items:items};
var fieldset={xtype:"fieldset",title:title,autoHeight:true,collapsible:true,collapsed:false,items:checkboxes};
return fieldset;
},submitHandler:function(){var self=this;
var list_id=this.grid.list_id;
var filter=this.grid.store.baseParams.filter.trim();
var params={};
params.destination=this.form.getForm().findField("destination").getValue();
params.properties=this.getSelectedProperties().join(",");
var callback=function(){self.close();
};
var ids=this.grid.getSelectedIds();
if(ids.length>0){Ext.ux.vardb.Vardb.downloadPropertiesBySequenceId(ids,params,callback);
}else{Ext.ux.vardb.Vardb.downloadPropertiesByListId(list_id,filter,params,callback);
}},getSelectedProperties:function(){var properties=[];
var values=this.form.getForm().getValues(true).split("&");
var index,value,start,before,after;
for(index=0;
index<values.length;
index++){value=values[index];
start=value.indexOf(".");
if(start===-1){continue;
}before=value.substring(0,start);
after=value.substring(start+1);
if(after.indexOf("=on")!==-1){after=after.substring(0,after.indexOf("=on"));
}if(before==="property"){properties.push(after);
}}return properties;
},coreProperties:[["accession",true],["pathogen",true],["taxon",true],["family",true],["pseudogene",true],["aalength",true],["ntlength",true],["splicing",true],["ortholog",false],["subgroup",false],["ref",false],["rating",false],["strand",false],["sequence",false],["spliced",false],["translation",false]],contigProperties:[["genome",false],["chromosome",false],["start",false],["end",false],["codon_start",false],["transl_table",false]],pfamProperties:[["domains",true],["method",true],["model",true],["score",true],["evalue",true]],genbankProperties:[["gene",true],["product",true],["udate",true],["natype",true],["locus_tag",false],["division",false],["circular",false],["country",false],["subregion",false],["collection_date",false],["strain",false],["serogroup",false],["serotype",false],["clone",false],["segment",false],["specific_host",false],["isolate",false],["isolation_source",false],["mol_type",false],["locus",false],["allele",false],["geneid",false],["plasmid",false],["protein",false],["protein_gi",false],["protein_id",false],["gi",false],["uniprot",false],["molwt",false],["ec",false]]});
Ext.ux.vardb.SequenceGrid=Ext.extend(Ext.ux.vardb.Grid,{frame:false,autoWidth:true,autoHeight:true,enableColumnMove:true,stripeRows:true,loadMask:true,collapsible:false,animCollapse:false,pagesize:5,title:"Sequences",initComponent:function(){var self=this;
if(this.renderTo){this.frame=true;
}var reader=new Ext.data.JsonReader({root:"sequences",totalProperty:"totalCount",idProperty:"sequence_id",fields:[{name:"id",type:"int"},{name:"identifier"},{name:"accession"},{name:"rating"},{name:"taxon_identifier"},{name:"taxon_name"},{name:"pathogen_identifier"},{name:"pathogen_name"},{name:"pathogen_dtype"},{name:"family_identifier"},{name:"family_name"},{name:"subgroup_identifier"},{name:"subgroup_name"},{name:"ortholog_identifier"},{name:"ortholog_name"},{name:"disease_identifier"},{name:"disease_name"},{name:"country_identifier"},{name:"country_name"},{name:"ref_identifier"},{name:"ref_name"},{name:"strain"},{name:"pseudogene"},{name:"truncated"},{name:"location"},{name:"domains"},{name:"locus_tag"},{name:"defline"},{name:"gene"},{name:"product"},{name:"uniprot"},{name:"udate"},{name:"ntlength",type:"int"},{name:"aalength",type:"int"},{name:"method"},{name:"model"},{name:"score"},{name:"evalue"},{name:"selected"},{name:"translation"},{name:"tags_id"},{name:"tags_name"},{name:"tags_description"},{name:"tags_color"},{name:"tags_bgcolor"},{name:"tags_bundle"},{name:"tags_readonly"}]});
var store=new Ext.data.Store({url:vardb.webapp+"/search/ajax/browse.json",reader:reader,remoteSort:true,sortInfo:{field:"accession",direction:"ASC"},baseParams:{filter:self.filter}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var r=Ext.ux.vardb.Renderer;
var tooltips=Ext.ux.vardb.Constants.tooltips;
var builder=Ext.ux.vardb.ColumnBuilder;
var columns=[sm,builder.accessionColumn(),builder.tagsColumn(),builder.deflineColumn(),builder.strainColumn(),builder.geneColumn(),builder.productColumn(),builder.ntlengthColumn(),builder.aalengthColumn()];
var config={sm:sm,store:store,viewConfig:{forceFit:true},columns:columns,tbar:new Ext.PagingToolbar({pageSize:self.pagesize,store:store,displayInfo:true,displayMsg:"{0} - {1} of {2}",emptyMsg:"None",items:["-",self.createSelectMenu(),"-",self.createTagMenu(),"-",self.createDownloadMenu(),"-",self.createCartMenu(),"-"]})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.SequenceGrid.superclass.initComponent.apply(this,arguments);
this.viewConfig.emptyText='<div class="emptyText">No sequences.</div>';
store.load({params:{start:0,limit:this.pagesize}});
},addToolbarMenu:function(item){var toolbar=this.getTopToolbar();
toolbar.insert(toolbar.items.getCount()-2,item);
toolbar.doLayout();
},addSequences:function(list_id){var ids=this.getSelectedIds();
if(ids.length>0){Ext.ux.vardb.Cart.addSelected(this,list_id);
}else{Ext.ux.vardb.Cart.addResource(this.resource.type,this.resource.id,this.getStore().getTotalCount(),list_id);
}},createTagMenu:function(){var self=this;
var menu={text:"Tags",enableScrolling:false,menu:{items:[{text:"Tag sequences",handler:function(){var dialog=new Ext.ux.vardb.tags.ApplyTagDialog({grid:self,callback:function(tag){self.store.reload();
}});
}},"-",{text:" Tag cloud",scope:self,handler:function(){self.createTagCloud();
}}]}};
return menu;
},createTagCloud:function(){Ext.ux.vardb.tags.Services.createTagCloudFromFilter(this.store.baseParams.filter);
},createDownloadMenu:function(){var self=this;
var menu={text:"Download",enableScrolling:false,menu:{items:[{text:"Sequences",scope:this,handler:function(){self.downloadSequences();
}},{text:"Properties",scope:this,handler:function(){self.downloadProperties();
}}]}};
return menu;
},createCartMenu:function(){var self=this;
var menu={text:"Cart",enableScrolling:false,menu:{items:[{text:"Add to cart",scope:this,handler:function(btn){self.addSequences("cart");
}},{text:"Add as new cart",scope:this,handler:function(btn){self.addSequences("new");
}},"-",{text:"Open cart",scope:this,handler:function(btn){Ext.ux.vardb.Cart.cart();
}},{text:"Empty cart",scope:this,handler:function(btn){Ext.ux.vardb.Cart.emptyCart();
}},"-",{text:"Search these sequences",scope:this,handler:function(btn){Ext.ux.vardb.Vardb.searchSequences(self.filter);
}}]}};
return menu;
},createSummaryMenu:function(){var self=this;
var summaryMenu={text:"Summarize",enableScrolling:false,menu:{items:[{text:"Summarize",handler:function(){Ext.ux.vardb.Vardb.summarize(self);
}}]}};
return summaryMenu;
},downloadSelected:function(ids){var dialog=new Ext.ux.vardb.Download("/download/sequences.txt",{ids:ids.join(",")});
},downloadAll:function(){var dialog=new Ext.ux.vardb.Download("/download/simple/sequences.txt",{query:this.filter});
},downloadSequences:function(){var ids=this.getSelectedIds();
if(ids.length>0){this.downloadSelected(ids);
}else{this.downloadAll();
}},downloadPropertiesSelected:function(ids){var dialog=new Ext.ux.vardb.Properties("/download/properties.txt",{ids:ids.join(",")});
},downloadPropertiesAll:function(){var dialog=new Ext.ux.vardb.Properties("/download/simple/properties.txt",{query:this.filter});
},downloadProperties:function(){var ids=this.getSelectedIds();
if(ids.length>0){this.downloadPropertiesSelected(ids);
}else{this.downloadPropertiesAll();
}}});
Ext.ux.vardb.LiveSequenceGrid=Ext.extend(Ext.ux.grid.livegrid.GridPanel,{region:"center",layout:"fit",stripeRows:true,bufferSize:90,nearLimit:30,initComponent:function(){var counts=this.counts;
var list_id=this.list_id;
this.isVirus=(counts.numdivisions===1&&counts.divisions[0].identifier==="VIRUS");
this.isLow=(counts.numratings===1&&counts.ratings[0].identifier==="L1");
this.isCore=(counts.numsources===1&&counts.sources[0].identifier==="core");
var fields=[{name:"sequence_id"},{name:"identifier"},{name:"accession"},{name:"uploaded",type:"boolean"},{name:"taxon_identifier"},{name:"taxon_name"},{name:"pathogen_identifier"},{name:"pathogen_name"},{name:"pathogen_dtype"},{name:"family_identifier"},{name:"family_name"},{name:"subgroup_identifier"},{name:"subgroup_name"},{name:"ortholog_identifier"},{name:"ortholog_name"},{name:"disease_identifier"},{name:"disease_name"},{name:"country_identifier"},{name:"country_name"},{name:"ref_identifier"},{name:"ref_name"},{name:"strain"},{name:"isolate"},{name:"isolation_source"},{name:"molwt"},{name:"subregion"},{name:"segment"},{name:"serotype"},{name:"serogroup"},{name:"serovar"},{name:"subtype"},{name:"host"},{name:"lab_host"},{name:"specific_host"},{name:"plasmid"},{name:"codedby"},{name:"oldid"},{name:"natype"},{name:"clone"},{name:"pseudogene"},{name:"truncated"},{name:"location"},{name:"domains"},{name:"locus_tag"},{name:"defline"},{name:"gene"},{name:"product"},{name:"uniprot"},{name:"udate"},{name:"ntlength",type:"int"},{name:"aalength",type:"int"},{name:"method"},{name:"model"},{name:"score"},{name:"evalue"},{name:"sequence"},{name:"translation"},{name:"group_id"},{name:"group_name"},{name:"group_description"},{name:"group_color"},{name:"group_bgcolor"},{name:"tags_id"},{name:"tags_name"},{name:"tags_description"},{name:"tags_color"},{name:"tags_bgcolor"},{name:"tags_bundle"},{name:"tags_readonly"}];
var reader=new Ext.ux.grid.livegrid.JsonReader({root:"sequences",totalProperty:"totalCount",idProperty:"sequence_id",fields:fields});
var store=new Ext.ux.grid.livegrid.Store({url:vardb.webapp+"/ajax/lists/page.json",reader:reader,bufferSize:this.bufferSize,remoteSort:true,sortInfo:{field:"accession",direction:"ASC"},baseParams:{list_id:list_id,filter:""}});
var sm=new Ext.ux.grid.livegrid.RowSelectionModel();
var view=new Ext.ux.grid.livegrid.GridView({nearLimit:this.nearLimit,forceFit:true,loadMask:{msg:"Please wait..."}});
var r=Ext.ux.vardb.Renderer;
function renderTags(value,p,r){return Ext.ux.vardb.Renderer.renderTags(value,p,r,list_id);
}var builder=Ext.ux.vardb.ColumnBuilder;
var columns=[new Ext.grid.RowNumberer({header:"Row",width:40}),builder.accessionColumn(),builder.tagsColumn({renderer:renderTags}),builder.groupsColumn(),builder.deflineColumn(),builder.taxonColumn(),builder.geneColumn(),builder.ntlengthColumn(),builder.translationColumn({hidden:this.isCore}),builder.aalengthColumn({hidden:this.isCore}),builder.truncatedColumn({hidden:(counts.truncated===0)}),builder.pseudogeneColumn({hidden:(counts.pseudogenes===0)}),builder.pathogen_dtypeColumn({hidden:(counts.numdivisions<1)}),builder.pathogenColumn({hidden:(counts.numpathogens<1)}),builder.diseaseColumn({hidden:(counts.numdiseases<1)}),builder.familyColumn({hidden:(counts.numfamilies<1)}),builder.orthologColumn({hidden:(counts.numorthologs<1)}),builder.subgroupColumn({hidden:(counts.numsubgroups<1)}),builder.countryColumn({hidden:(counts.numcountries<1)}),builder.subregionColumn({hidden:(counts.numcountries<1)}),builder.refColumn({hidden:(counts.numrefs<=1)}),builder.isolateColumn({hidden:true}),builder.isolation_sourceColumn({hidden:true}),builder.molwtColumn({hidden:!this.isVirus}),builder.strainColumn({hidden:!this.isVirus}),builder.segmentColumn({hidden:!this.isVirus}),builder.serotypeColumn({hidden:!this.isVirus}),builder.serovarColumn({hidden:!this.isVirus}),builder.subtypeColumn({hidden:!this.isVirus}),builder.hostColumn({hidden:true}),builder.lab_hostColumn({hidden:true}),builder.specific_hostColumn({hidden:true}),builder.plasmidColumn({hidden:true}),builder.codedbyColumn({hidden:true}),builder.oldidColumn({hidden:true}),builder.natypeColumn({hidden:true}),builder.cloneColumn({hidden:true}),builder.locationColumn({hidden:true}),builder.locus_tagColumn({hidden:true}),builder.productColumn({hidden:true}),builder.uniprotColumn({hidden:true}),builder.udateColumn({hidden:true}),builder.domainsColumn(),builder.methodColumn(),builder.modelColumn(),builder.scoreColumn(),builder.evalueColumn()];
var config={store:store,sm:sm,view:view,columnLines:true,loadMask:{msg:"Loading..."},colModel:new Ext.grid.ColumnModel({columns:columns,defaults:{sortable:true}}),tbar:new Ext.ux.grid.livegrid.Toolbar({view:view,displayInfo:true,items:this.toolbaritems})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.LiveSequenceGrid.superclass.initComponent.apply(this,arguments);
},onRender:function(){Ext.ux.vardb.LiveSequenceGrid.superclass.onRender.apply(this,arguments);
this.store.load();
},getSelectedIds:function(){var rows=this.getSelectionModel().getSelections();
var ids=[],index;
for(index=0;
index<rows.length;
index++){ids.push(rows[index].id);
}return ids;
},filterTable:function(filter){this.store.baseParams.filter=filter;
this.store.reload();
},reloadTable:function(){this.store.reload();
},addToolbarMenu:function(item){var toolbar=this.getTopToolbar();
toolbar.insert(toolbar.items.getCount()-2,item);
toolbar.doLayout();
},createCartMenu:function(){var self=this;
var menu={text:"Cart",menu:{items:[{text:"Add to cart",scope:this,handler:function(btn){this.addToCart();
}},{text:"Add to new cart",scope:this,handler:function(btn){this.addToNewCart();
}},"-",{text:"Open cart",handler:function(btn){Ext.ux.vardb.Cart.cart();
}},{text:"Empty cart",handler:function(btn){Ext.ux.vardb.Cart.emptyCart();
}}]}};
return menu;
},createSortMenu:function(){var self=this;
var menu={text:"Sort",handler:function(btn){var dialog=new Ext.ux.vardb.SortDialog({grid:self});
}};
return menu;
},createTagMenu:function(){var self=this;
var menu={text:"Tags",menu:{items:[{text:"Tag sequences",handler:function(){var dialog=new Ext.ux.vardb.tags.ApplyTagDialog({grid:self,callback:function(tag){self.store.reload();
}});
}},{text:"Un-tag sequences",handler:function(){var dialog=Ext.ux.vardb.tags.Services.untagSequences(self,function(){self.reloadTable();
});
}},"-",{text:" Tag cloud",scope:self,handler:function(){Ext.ux.vardb.Cart.createTagCloud(self);
}}]}};
return menu;
},createDownloadMenu:function(){var self=this;
var downloadMenu={text:"Download",menu:{items:[{text:"Sequences",handler:function(btn){var dialog=new Ext.ux.vardb.DownloadSequencesDialog({grid:self});
}},{text:"Table",handler:function(btn){var dialog=new Ext.ux.vardb.DownloadPropertiesDialog({grid:self});
}}]}};
return downloadMenu;
},addToCart:function(){var ids=this.getSelectedIds();
var filter=this.store.baseParams.filter;
if(ids.length>0){Ext.ux.vardb.Cart.addSequencesToCart(ids);
}else{Ext.ux.vardb.Cart.addFilterToCart(this.list_id,filter);
}},addToNewCart:function(){var ids=this.getSelectedIds();
var filter=this.store.baseParams.filter;
if(ids.length>0){Ext.ux.vardb.Cart.addSequencesToNewCart(ids);
}else{Ext.ux.vardb.Cart.addFilterToNewCart(this.list_id,filter);
}},createSummaryMenu:function(){var self=this;
var summaryMenu={text:"Summarize",menu:{items:[{text:"Summarize",handler:function(){Ext.ux.vardb.Vardb.summarize(self);
}},{text:"Summarize by group",handler:function(){Ext.ux.vardb.Cart.summarizeGroups(self);
}},"-",{text:"NT sequence lengths",handler:function(){Ext.ux.vardb.Vardb.lengthHistogram(self,"NT");
}},{text:"AA sequence lengths",handler:function(){Ext.ux.vardb.Vardb.lengthHistogram(self,"AA");
}}]}};
return summaryMenu;
}});
Ext.ux.vardb.Alignments=Ext.extend(Ext.ux.vardb.Grid,{frame:true,autoWidth:true,autoHeight:true,collapsible:false,title:"Alignments",initComponent:function(){var self=this;
var reader=new Ext.data.JsonReader({root:"rows",idProperty:"identifier",fields:[{name:"identifier"},{name:"name"},{name:"numcolumns",type:"int"},{name:"numsequences",type:"int"}]});
var store=new Ext.data.Store({reader:reader,data:this.data});
var expander=new Ext.grid.RowExpander({tpl:new Ext.XTemplate('<br/><img src="/vardb/alignments/{identifier}.img?width=500"/><br/><br/>')});
var r=Ext.ux.vardb.Renderer;
var config={store:store,viewConfig:{forceFit:true},plugins:expander,columns:[expander,{header:"Alignment",width:100,sortable:true,dataIndex:"identifier",renderer:r.renderAlignment},{header:"Columns",width:20,sortable:true,dataIndex:"numcolumns",align:"right"},{header:"Sequences",width:20,sortable:true,dataIndex:"numsequences",align:"right"}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.Alignments.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.Announcements=Ext.extend(Ext.Panel,{title:"Recent announcements",height:145,width:"95%",autoScroll:true,initComponent:function(){var fields=[{name:"title"},{name:"author"},{name:"pubDate",type:"date"},{name:"link"},{name:"description"},{name:"content"}];
var store=new Ext.data.Store({url:vardb.webapp+"/ajax/announcements.xml",reader:new Ext.data.XmlReader({record:"item"},fields)});
store.setDefaultSort("pubDate","DESC");
var resultTpl=new Ext.XTemplate('<tpl for=".">','<div class="announcement-item">','<h3><span>{pubDate:date("M j, Y")}<br /></span>','<a href="{link}" target="_blank">{title}</a></h3>',"<p>{[this.previewDescription(values.description)]}</p>","</div>","</tpl>",{max:100,previewDescription:function(str){str=Ext.util.Format.stripTags(str.trim());
return Ext.util.Format.ellipsis(str,this.max,false);
}});
var config={items:new Ext.DataView({tpl:resultTpl,store:store,itemSelector:"div.announcement-item"})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.Announcements.superclass.initComponent.apply(this,arguments);
store.load();
}});
Ext.ux.vardb.BrowseByCategory=Ext.extend(Ext.FormPanel,{labelWidth:100,frame:false,title:"Browse by category",bodyStyle:"padding:5px 5px 0",width:"95%",iconCls:"icon-chart_organisation",initComponent:function(){this.ntsequenceCount=new Ext.Toolbar.TextItem("DNA sequences: "+this.data.statistics.ntsequences);
this.aasequenceCount=new Ext.Toolbar.TextItem("Protein sequences: "+this.data.statistics.aasequences);
var statusbar=new Ext.Toolbar({items:["->",this.ntsequenceCount," ",this.aasequenceCount]});
var config={defaults:{width:350},bbar:statusbar,items:[this.comboList(this.data.families,"Gene families","family"),this.comboList(this.data.pathogens,"Pathogens","pathogen"),this.comboList(this.data.diseases,"Diseases","disease")]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.BrowseByCategory.superclass.initComponent.apply(this,arguments);
this.on("afterrender",function(){this.ntsequenceCount.addClass("custom-status-text-panel");
this.aasequenceCount.addClass("custom-status-text-panel");
},this);
},comboList:function(data,fieldLabel,type){var combo=new Ext.form.ComboBox({store:new Ext.data.JsonStore({fields:["identifier","name"],data:data}),valueField:"identifier",displayField:"name",mode:"local",triggerAction:"all",emptyText:(data.length-1)+" "+fieldLabel.toLowerCase(),forceSelection:true,fieldLabel:fieldLabel,typeAhead:true,onSelect:function(record){if(type==="family"){if(record.data.identifier==="families"){vardb.gotoUrl("/families.html");
}else{vardb.gotoUrl("/families/"+record.data.identifier+".html");
}}else{if(type==="pathogen"){if(record.data.identifier==="pathogens"){vardb.gotoUrl("/pathogens.html");
}else{vardb.gotoUrl("/pathogens/"+record.data.identifier+".html");
}}else{if(type==="disease"){if(record.data.identifier==="diseases"){vardb.gotoUrl("/diseases.html");
}else{vardb.gotoUrl("/diseases/"+record.data.identifier+".html");
}}}}}});
return combo;
}});
Ext.ux.vardb.Chains=Ext.extend(Ext.ux.vardb.Grid,{frame:true,autoHeight:true,autoWidth:true,collapsible:false,title:"Chains",initComponent:function(){var self=this;
var reader=new Ext.data.JsonReader({root:"chains",idProperty:"id",fields:[{name:"id",type:"int"},{name:"identifier"},{name:"name"},{name:"swissprot"},{name:"length",type:"int"},{name:"sequence"},{name:"numsequences",type:"int"}]});
var store=new Ext.data.Store({reader:reader,data:this.data,sortInfo:{field:"identifier",direction:"ASC"}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var expander=new Ext.grid.RowExpander({tpl:new Ext.XTemplate('<p style="background-color:white;margin-left:10px;font-family:monospace;">',">{identifier}<br/>",'<tpl for="Ext.ux.vardb.Renderer.chunkSequence(sequence,60)">',"{[Ext.ux.vardb.Renderer.formatSequence(values.line)]}<br/>","</tpl>","</p>")});
var config={viewConfig:{forceFit:true},sm:sm,store:store,plugins:expander,columns:[expander,sm,{header:"Name",width:40,sortable:true,dataIndex:"name",renderer:this.renderName},{header:"SwissProt",width:60,sortable:true,dataIndex:"swissprot"},{header:"Length",width:40,sortable:true,dataIndex:"length"},{header:"Sequences",width:20,sortable:true,dataIndex:"numsequences",align:"right",renderer:this.renderCount}],tbar:new Ext.Toolbar({items:[self.createPrintButton(),"-",self.createSelectMenu()]})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.Chromosomes.superclass.initComponent.apply(this,arguments);
},renderName:function(value,p,record){return String.format("<a href=\"javascript:jmolform.highlightChain('{0}')\">{0}</a>",value);
},renderCount:function(value,p,record){var query=escape("chain="+record.data.identifier);
return String.format('<a href="'+vardb.webapp+'/search/sequences.html?query={1}">{0}</a>',value,query);
}});
Ext.ux.vardb.Chromosomes=Ext.extend(Ext.ux.vardb.Grid,{frame:true,autoHeight:true,autoWidth:true,collapsible:false,pagesize:100,title:"Chromosomes (may include scaffolds, contigs, plasmids, etc.)",initComponent:function(){var self=this;
if(!this.identifier){throw"identifier property not set in Ext.ux.vardb.Chromosomes";
}var reader=new Ext.data.JsonReader({root:"chromosomes",totalProperty:"totalCount",idProperty:"id",fields:[{name:"id",type:"int"},{name:"identifier"},{name:"name"},{name:"description"},{name:"numbases"},{name:"accession"},{name:"number",type:"int"},{name:"numsequences",type:"int"}]});
var store=new Ext.data.Store({url:vardb.webapp+"/genomes/ajax/chromosomes.json",reader:reader,remoteSort:true,sortInfo:{field:"number,accession",direction:"ASC,ASC"},baseParams:{identifier:this.identifier}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var config={viewConfig:{forceFit:true},sm:sm,store:store,columns:[sm,{header:"Chromosome",width:60,sortable:true,dataIndex:"name",renderer:this.renderName},{header:"Description",width:100,sortable:true,dataIndex:"description"},{header:"Bases",width:20,sortable:true,dataIndex:"numbases",align:"right"},{header:"Accession",width:20,sortable:true,dataIndex:"accession",align:"right",renderer:this.renderAccession},{header:"Sequences",width:20,sortable:true,dataIndex:"numsequences",align:"right",renderer:this.renderCount}],tbar:new Ext.PagingToolbar({pageSize:this.pagesize,store:store,displayInfo:true,displayMsg:"{0} - {1} of {2}",emptyMsg:"None",items:["-",self.createSelectMenu(),"-",self.createCartMenu("CHROMOSOME")]})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.Chromosomes.superclass.initComponent.apply(this,arguments);
store.load({params:{start:0,limit:this.pagesize}});
},renderName:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/chromosomes/{1}.html">{0}</a>',value,record.data.identifier);
},renderAccession:function(value,p,record){if(value===""){return"";
}return String.format('<a href="http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?db=nuccore&id={0}" target="_ncbi">{0}</a>',value);
},renderCount:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/search/sequences.html?query={2}={1}">{0}</a>',value,record.data.identifier,"CHROMOSOME");
}});
Ext.ux.vardb.Countries=Ext.extend(Ext.ux.vardb.Grid,{frame:true,autoHeight:true,autoWidth:true,collapsible:false,stripeRows:true,title:"Countries",initComponent:function(){var self=this;
var reader=new Ext.data.JsonReader({root:"rows",idProperty:"id",fields:[{name:"id",type:"int"},{name:"identifier"},{name:"region"},{name:"iso"},{name:"lat"},{name:"lng"},{name:"numsequences",type:"int"}]});
var store=new Ext.data.GroupingStore({reader:reader,data:this.data,sortInfo:{field:"identifier",direction:"ASC"},groupField:"region"});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var view=new Ext.grid.GroupingView({forceFit:true,hideGroupedColumn:true,groupTextTpl:'{text} ({[values.rs.length]} {[values.rs.length > 1 ? "items" : "item"]})'});
var config={sm:sm,store:store,view:view,columns:[sm,{header:"Country",width:100,sortable:true,dataIndex:"identifier",renderer:self.renderCountry},{header:"Region",width:60,sortable:true,dataIndex:"region"},{header:"ISO",width:15,sortable:true,dataIndex:"iso",align:"center"},{header:"Lat",width:130,sortable:true,align:"right",dataIndex:"lat"},{header:"Long",width:130,sortable:true,align:"right",dataIndex:"lng"},{header:"Sequences",width:60,sortable:true,dataIndex:"numsequences",align:"right",renderer:self.renderCount}],tbar:new Ext.Toolbar({items:[self.createPrintButton(),"-",self.createSelectMenu(),"-",self.createCartMenu("COUNTRY")]})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.Countries.superclass.initComponent.apply(this,arguments);
},renderCountry:function(value,p,record){return"<a href=\"javascript:vardb.countryPopup('"+record.data.identifier+"')\">"+value+"</a>";
},renderCount:function(value,p,record){var identifier=record.data.identifier;
if(identifier.indexOf(" ")!==-1){identifier='"'+identifier+'"';
}return"<a href='"+vardb.webapp+"/search/sequences.html?query=country="+identifier+"'>"+value+"</a>";
}});
Ext.ux.vardb.Diseases=Ext.extend(Ext.ux.vardb.Grid,{frame:true,autoHeight:true,autoWidth:true,collapsible:false,title:"Diseases",initComponent:function(){var self=this;
var reader=new Ext.data.JsonReader({root:"rows",idProperty:"id",fields:[{name:"id",type:"int"},{name:"resourceType"},{name:"identifier"},{name:"name"},{name:"description"},{name:"host"},{name:"human"},{name:"numsequences",type:"int"}]});
var store=new Ext.data.GroupingStore({reader:reader,data:this.data,sortInfo:{field:"name",direction:"ASC"}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var view=new Ext.grid.GroupingView({forceFit:true,hideGroupedColumn:true,groupTextTpl:'{text} ({[values.rs.length]} {[values.rs.length > 1 ? "items" : "item"]})'});
var config={store:store,view:view,sm:sm,columns:[sm,{header:"Name",width:60,sortable:true,dataIndex:"name",renderer:self.renderName},{header:"Description",width:100,sortable:true,dataIndex:"description"},{header:"Human",width:15,sortable:true,dataIndex:"human",align:"center",renderer:self.renderHuman},{header:"Host",sortable:true,dataIndex:"host"},{header:"Sequences",width:20,sortable:true,dataIndex:"numsequences",align:"right",renderer:self.renderCount}],tbar:new Ext.Toolbar({items:[self.createPrintButton(),"-",self.createSelectMenu(),"-",self.createCartMenu("DISEASE")]})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.Diseases.superclass.initComponent.apply(this,arguments);
},renderName:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/diseases/{1}.html">{0}</a>',value,record.data.identifier);
},renderHuman:function(value,p,record){return(record.data.human===true?"*":"");
},renderCount:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/search/sequences.html?query=disease={1}">{0}</a>',value,record.data.identifier);
}});
Ext.ux.vardb.Drugs=Ext.extend(Ext.ux.vardb.Grid,{frame:true,autoHeight:true,autoWidth:true,collapsible:false,stripeRows:true,title:"Drugs",initComponent:function(){var self=this;
var reader=new Ext.data.JsonReader({root:"rows",idProperty:"id",fields:[{name:"id",type:"int"},{name:"identifier"},{name:"name"},{name:"activity"},{name:"target"}]});
var store=new Ext.data.GroupingStore({reader:reader,data:this.data,sortInfo:{field:"identifier",direction:"ASC"}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var view=new Ext.grid.GroupingView({forceFit:true,hideGroupedColumn:true,groupTextTpl:'{text} ({[values.rs.length]} {[values.rs.length > 1 ? "items" : "item"]})'});
var config={store:store,view:view,sm:sm,columns:[sm,{header:"Name",width:60,sortable:true,dataIndex:"name",renderer:self.renderName},{header:"Activity",width:100,sortable:true,dataIndex:"activity"},{header:"Target",width:100,sortable:true,dataIndex:"target"}],tbar:new Ext.Toolbar({items:[self.createPrintButton(),"-",self.createSelectMenu()]})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.Drugs.superclass.initComponent.apply(this,arguments);
},renderName:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/drugs/{1}.html">{0}</a>',value,record.data.identifier);
}});
Ext.ux.vardb.FamilyGrid=Ext.extend(Ext.ux.vardb.Grid,{frame:true,width:600,autoHeight:true,collapsible:false,initComponent:function(){var self=this;
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var reader=new Ext.data.JsonReader({root:"rows",idProperty:"id",fields:[{name:"id",type:"int"},{name:"pathogen_name"},{name:"pathogen_identifier"},{name:"ortholog_name"},{name:"ortholog_identifier"},{name:"family_name"},{name:"family_identifier"},{name:"family_description"},{name:"family_numsequences",type:"int"}]});
var store=new Ext.data.GroupingStore({reader:reader,data:this.data,sortInfo:{field:"family_identifier",direction:"ASC"}});
if(this.groupBy){store.groupBy(self.groupBy);
}var columns=[sm,{header:"Family",width:50,sortable:true,dataIndex:"family_name",renderer:Ext.ux.vardb.Renderer.renderFamily},{header:"Pathogen",width:30,sortable:true,dataIndex:"pathogen_name",renderer:Ext.ux.vardb.Renderer.renderPathogen},{header:"Ortholog",width:30,sortable:true,dataIndex:"ortholog_name",renderer:self.renderOrtholog},{header:"Description",width:50,sortable:true,dataIndex:"family_description"},{header:"Sequences",width:20,sortable:true,dataIndex:"family_numsequences",align:"right",renderer:self.renderCount}];
var view=new Ext.grid.GroupingView({forceFit:true,hideGroupedColumn:true,groupTextTpl:'{text} ({[values.rs.length]} {[values.rs.length > 1 ? "members" : "member"]})'});
var config={store:store,columns:columns,view:view,sm:sm,tbar:new Ext.Toolbar({items:[self.createPrintButton(),"-",self.createSelectMenu(),"-",self.createCartMenu("FAMILY")]})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.FamilyGrid.superclass.initComponent.apply(this,arguments);
},renderOrtholog:function(value,p,record){var identifier=record.data.ortholog_identifier;
if(identifier===""){return"Unclassified";
}return String.format('<a href="'+vardb.webapp+'/orthologs/{1}.html">{0}</a>',value,identifier);
},renderCount:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/search/sequences.html?query=family={1}">{0}</a>',value,record.data.family_identifier);
}});
Ext.ux.vardb.Families=Ext.extend(Ext.TabPanel,{activeTab:0,width:600,deferredRender:true,layoutOnTabChange:true,initComponent:function(){var data=this.data;
var families=new Ext.ux.vardb.FamilyGrid({title:"Families",data:data});
var orthologs=new Ext.ux.vardb.FamilyGrid({title:"Ortholog groups",data:data,groupBy:"ortholog_name"});
var pathogens=new Ext.ux.vardb.FamilyGrid({title:"Pathogens",data:data,groupBy:"pathogen_name"});
function hideUnclassified(record,id){return(record.data.ortholog_identifier!=="");
}orthologs.getStore().filterBy(hideUnclassified);
var config={defaults:{autoHeight:true,width:600},items:[families,orthologs,pathogens]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.Families.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.Genes=Ext.extend(Ext.ux.vardb.Grid,{frame:true,autoHeight:true,autoWidth:true,collapsible:false,title:"Sequences",initComponent:function(){var self=this;
var reader=new Ext.data.JsonReader({root:"rows",idProperty:"id",fields:[{name:"id",type:"int"},{name:"resourceType"},{name:"identifier"},{name:"description"},{name:"start",type:"int"},{name:"end",type:"int"},{name:"strand"}]});
var store=new Ext.data.Store({reader:reader,data:this.data,sortInfo:{field:"id",direction:"ASC"}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var config={viewConfig:{forceFit:true},sm:sm,store:store,columns:[sm,{header:"Name",width:30,sortable:true,dataIndex:"identifier",renderer:Ext.ux.vardb.Renderer.renderAccession},{header:"Description",width:100,sortable:true,dataIndex:"description"},{header:"Start",width:20,sortable:true,dataIndex:"start",align:"left"},{header:"End",width:20,sortable:true,dataIndex:"end",align:"left"},{header:"Strand",width:20,sortable:true,dataIndex:"strand"}],tbar:new Ext.Toolbar({items:[self.createPrintButton(),"-",self.createSelectMenu()]})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.Genes.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.Genomes=Ext.extend(Ext.ux.vardb.Grid,{frame:true,width:600,autoHeight:true,collapsible:false,title:"Genomes",initComponent:function(){var self=this;
var reader=new Ext.data.JsonReader({root:"rows",idProperty:"genome_id",fields:[{name:"genome_id",type:"int"},{name:"genome_identifier"},{name:"genome_name"},{name:"center"},{name:"url"},{name:"numchromosomes",type:"int"},{name:"genome_count",type:"int"},{name:"pathogen_identifier"},{name:"pathogen_name"},{name:"pathogen_count",type:"int"}]});
var store=new Ext.data.GroupingStore({reader:reader,data:this.data,sortInfo:{field:"pathogen_name",direction:"ASC"},groupField:"pathogen_name"});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var r=Ext.ux.vardb.Renderer;
var config={sm:sm,store:store,columns:[sm,{header:"Genome",width:80,sortable:true,dataIndex:"genome_name",renderer:this.renderName},{header:"Pathogen",width:20,sortable:true,dataIndex:"pathogen_name",renderer:r.renderPathogen},{header:"Center",width:40,sortable:true,dataIndex:"center",renderer:this.renderCenter},{header:"Sequences",width:20,sortable:true,dataIndex:"genome_count",align:"right",renderer:this.renderCount}],view:new Ext.grid.GroupingView({forceFit:true,hideGroupedColumn:true,groupTextTpl:'{text} ({[values.rs.length]} {[values.rs.length > 1 ? "items" : "item"]})'}),tbar:new Ext.Toolbar({items:[self.createPrintButton(),"-",self.createSelectMenu(),"-",self.createCartMenu("GENOME")]})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.Genomes.superclass.initComponent.apply(this,arguments);
},renderName:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/genomes/{1}.html">{0}</a>',value,record.data.genome_identifier);
},renderCount:function(value,p,record){if(record.data.genome_count<1){return value;
}return String.format('<a href="'+vardb.webapp+'/search/sequences.html?query=genome={1}">{0}</a>',value,record.data.genome_identifier);
},renderCenter:function(value,p,record){if(record.data.url===""){return value;
}return String.format('<a href="{1}" target="_blank">{0}</a>',value,record.data.url);
}});
Ext.ux.vardb.Hierarchies=function(renderTo,data){var reader=new Ext.data.JsonReader({root:"rows",idProperty:"id",fields:[{name:"id"},{name:"description"},{name:"name"}]});
function renderName(value,p,record){return String.format('<a href="'+vardb.webapp+'/hierarchies/{1}.html">{0}</a>',value,record.data.id);
}function renderBrite(value,p,record){return String.format('<a href="http://www.genome.jp/kegg-bin/get_htext?{1}.keg" target="_blank">{0}</a>',value,record.data.id);
}var store=new Ext.data.Store({reader:reader,data:data,sortInfo:{field:"name",direction:"ASC"}});
Ext.ux.vardb.grid=new Ext.ux.vardb.Grid({store:store,columns:[{header:"Name",width:60,sortable:true,dataIndex:"name",renderer:renderName},{header:"Description",width:100,sortable:true,dataIndex:"description"},{header:"KEGG BRITE",width:20,sortable:true,dataIndex:"id",renderer:renderBrite}],viewConfig:{forceFit:true},frame:true,autoHeight:true,autoWidth:true,collapsible:false,stripeRows:true,title:"Hierarchies",renderTo:renderTo});
};
Ext.ux.vardb.Hierarchy=function(renderTo,id,name){var tree=new Ext.tree.TreePanel({el:renderTo,animate:false,autoHeight:true,loader:new Ext.tree.TreeLoader({dataUrl:vardb.webapp+"/hierarchy/nodes.json"})});
var root=new Ext.tree.AsyncTreeNode({text:name,id:id});
tree.setRootNode(root);
tree.render();
root.expand(false,false);
Ext.ux.vardb.data.tree=tree;
};
Ext.ux.vardb.JmolForm=Ext.extend(Ext.form.FormPanel,{title:"Enter Jmol commands to update the viewer",collapsible:true,width:580,frame:true,labelWidth:50,scheme:"spacefill 100%",color:"temperature",chainHighlightColor:"orange",alignHighlightColor:"orange",command:"spacefill 100%; color temperature",initComponent:function(){var self=this;
var sequences_field={xtype:"textarea",hideLabel:true,name:"command",value:this.command,width:500,height:50};
var resetButton={xtype:"button",text:"Reset",formBind:true,scope:this,handler:function(){this.resetJmol();
}};
var updateButton={xtype:"button",text:"Update",formBind:true,scope:this,handler:function(){this.updateJmol();
}};
var schemeCombo=new Ext.ux.vardb.SelectList({data:[["spacefill 100%","CPK Spacefill"],["wireframe 0.15; spacefill 20%","Ball and stick"],["wireframe 0.3; spacefill 0","Sticks"],["wireframe 0.01; spacefill 0","Wireframe"]],hiddenName:"scheme",fieldLabel:"Scheme",value:this.scheme,anchor:"-4",editable:false,typeAhead:true,listeners:{select:function(field,record,index){self.scheme=this.getValue();
self.setCommand(self.scheme+"; color "+self.color);
}}});
var chains=[],index,chain,values=[];
for(index=0;
index<this.data.chains.length;
index++){chain=this.data.chains[index];
chains.push([chain.name,chain.name]);
values.push(chain.name);
}var chainCombo=new Ext.form.MultiSelectField({store:chains,value:values.join(";"),hiddenName:"chains",fieldLabel:"Chains",valueField:"id",displayField:"name",mode:"local",listeners:{change:function(field,record,index){var chains=this.getValue().split(";");
var command="select all; wireframe off; spacefill off;";
if(chains.length>0){command+=" select :"+chains.join(", :")+"; "+self.scheme+"; color "+self.color;
}self.setCommand(command);
}}});
var config={items:[{xtype:"container",layout:"column",anchor:"-4",items:[{layout:"form",width:510,items:[sequences_field]},{layout:"form",items:[updateButton,resetButton]}]},{xtype:"container",layout:"column",anchor:"-4",items:[{layout:"form",width:220,items:[schemeCombo]},{layout:"form",items:[chainCombo]}]}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.JmolForm.superclass.initComponent.apply(this,arguments);
},updateJmol:function(){var command=this.getForm().findField("command").getValue().trim();
if(command===""){return;
}jmolScript(command);
},setCommand:function(command){this.getForm().findField("command").setValue(command);
this.updateJmol();
},resetJmol:function(){jmolScript("reset");
this.setCommand(this.command);
},highlightChain:function(chain){this.resetJmol();
var command="select *:"+chain+"; color "+this.chainHighlightColor;
this.setCommand(command);
},alignToStructure:function(sequence_id,identifier){this.resetJmol();
var self=this;
var params={sequence_id:sequence_id,identifier:identifier};
Ext.ux.vardb.Vardb.ajaxRequest("/analysis/ajax/structure/align.json",params,function(json){var command="define hits "+json.hits+"; select hits; spacefill; color "+self.alignHighlightColor;
self.setCommand(command);
});
}});
Ext.ux.vardb.OrthologFamilies=Ext.extend(Ext.ux.vardb.Grid,{frame:true,autoWidth:true,autoHeight:true,collapsible:false,title:"Gene families in ortholog group",initComponent:function(){var self=this;
var reader=new Ext.data.JsonReader({root:"rows",idProperty:"id",fields:[{name:"id",type:"int"},{name:"pathogen_name"},{name:"pathogen_identifier"},{name:"family_name"},{name:"family_identifier"},{name:"family_description"},{name:"family_count",type:"int"}]});
var store=new Ext.data.Store({reader:reader,data:this.data,sortInfo:{field:"pathogen_name",direction:"ASC"}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var config={store:store,sm:sm,viewConfig:{forceFit:true},columns:[sm,{header:"Pathogen",width:30,sortable:true,dataIndex:"pathogen_name",renderer:Ext.ux.vardb.Renderer.renderPathogen},{id:"family_identifier",header:"Family",width:50,sortable:true,dataIndex:"family_name",renderer:Ext.ux.vardb.Renderer.renderFamily},{header:"Description",width:50,sortable:true,dataIndex:"family_description"},{header:"Sequences",width:20,sortable:true,dataIndex:"family_count",align:"right",renderer:this.renderCount}],tbar:this.createResourceToolbar("ORTHOLOG")};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.OrthologFamilies.superclass.initComponent.apply(this,arguments);
},renderCount:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/search/sequences.html?query=family={1}">{0}</a>',value,record.data.family_identifier);
}});
Ext.ux.vardb.Paralogs=Ext.extend(Ext.ux.vardb.Grid,{title:"Paralog groups",frame:true,autoHeight:true,autoWidth:true,collapsible:false,stripeRows:true,initComponent:function(){var self=this;
var reader=new Ext.data.JsonReader({root:"rows",idProperty:"id",fields:[{name:"id",type:"int"},{name:"resourceType"},{name:"identifier"},{name:"name"},{name:"description"},{name:"numsequences",type:"int"}]});
var store=new Ext.data.Store({reader:reader,data:this.data,sortInfo:{field:"name",direction:"ASC"}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var config={viewConfig:{forceFit:true},sm:sm,store:store,columns:[sm,{header:"Name",width:60,sortable:true,dataIndex:"name",renderer:this.renderName},{header:"Description",width:100,sortable:true,dataIndex:"description"},{header:"Sequences",width:65,sortable:true,dataIndex:"numsequences",align:"right",renderer:this.renderCount}],tbar:new Ext.Toolbar({items:[self.createPrintButton(),"-",self.createSelectMenu(),"-",self.createCartMenu("PARALOG")]})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.Paralogs.superclass.initComponent.apply(this,arguments);
},renderName:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/paralogs/{1}.html">{0}</a>',value,record.data.identifier);
},renderCount:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/search/sequences.html?query=paralog={1}">{0}</a>',value,record.data.identifier);
}});
Ext.ux.vardb.PathogenGrid=Ext.extend(Ext.ux.vardb.Grid,{frame:true,collapsible:false,title:"title",initComponent:function(){var self=this;
var reader=new Ext.data.JsonReader({root:"rows",idProperty:"id",fields:[{name:"id",type:"int"},{name:"identifier"},{name:"name"},{name:"description"},{name:"dtype"},{name:"gccontent",type:"float"},{name:"numsequences",type:"int"},{name:"size"},{name:"morphology"},{name:"gram"},{name:"aerobic"},{name:"plasmids"},{name:"appendages"},{name:"baltimore"},{name:"baltimore_brief"},{name:"baltimore_long"},{name:"na_type"},{name:"sense"},{name:"strandedness"},{name:"shape"}]});
var view=new Ext.grid.GroupingView({forceFit:true,hideGroupedColumn:false,groupTextTpl:'{text} ({[values.rs.length]} {[values.rs.length > 1 ? "items" : "item"]})'});
var store=new Ext.data.GroupingStore({reader:reader,data:this.data,sortInfo:{field:"identifier",direction:"ASC"}});
if(this.dtype){store.filterBy(function(record,id){return record.data.dtype===self.dtype;
});
}if(this.groupBy){store.groupBy(self.groupBy);
}var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var columns=[];
columns.push(sm);
columns.push({header:"Name",width:40,sortable:true,dataIndex:"name",renderer:this.renderName});
columns.push({header:"Description",width:60,sortable:true,dataIndex:"description"});
columns.push({header:"Type",hidden:true,width:40,sortable:true,dataIndex:"dtype"});
if(this.dtype==="BACTERIA"){columns.push({header:"Gram",width:10,sortable:true,dataIndex:"gram",align:"center",renderer:this.renderGram});
columns.push({header:"Morphology",width:20,sortable:true,dataIndex:"morphology"});
}if(this.dtype==="VIRUS"){columns.push({header:"NA type",width:20,sortable:true,dataIndex:"na_type"});
columns.push({header:"Sense",width:20,sortable:true,dataIndex:"sense"});
columns.push({header:"Strand",width:20,sortable:true,dataIndex:"strandedness"});
columns.push({header:"Shape",width:20,sortable:true,dataIndex:"shape"});
columns.push({header:"Baltimore",width:20,sortable:true,dataIndex:"baltimore",renderer:this.renderBaltimore});
}columns.push({header:"GC content",width:20,sortable:true,dataIndex:"gccontent",align:"right"});
columns.push({header:"Sequences",width:20,sortable:true,dataIndex:"numsequences",align:"right",renderer:this.renderCount});
var config={store:store,columns:columns,view:view,sm:sm,tbar:new Ext.Toolbar({items:[self.createPrintButton(),"-",self.createSelectMenu(),"-",self.createCartMenu("PATHOGEN")]})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.PathogenGrid.superclass.initComponent.apply(this,arguments);
},renderName:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/pathogens/{1}.html">{0}</a>',value,record.data.identifier);
},renderGram:function(value,p,record){if(value===""){return"";
}return(value==="POSITIVE")?"+":"-";
},renderBaltimore:function(value,p,record){return String.format('<span title="{1}">{0}</a>',record.data.baltimore_long,record.data.baltimore_brief);
},renderCount:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/search/sequences.html?query=pathogen={1}">{0}</a>',value,record.data.identifier);
}});
Ext.ux.vardb.Pathogens=Ext.extend(Ext.TabPanel,{activeTab:0,width:600,deferredRender:true,layoutOnTabChange:true,initComponent:function(){var data=this.data;
var all=new Ext.ux.vardb.PathogenGrid({data:data,title:"All"});
var protists=new Ext.ux.vardb.PathogenGrid({data:data,title:"Protists",dtype:"PROTIST"});
var fungi=new Ext.ux.vardb.PathogenGrid({data:data,title:"Fungi",dtype:"FUNGUS"});
var bacteria=new Ext.ux.vardb.PathogenGrid({data:data,title:"Bacteria",dtype:"BACTERIA",groupBy:"gram"});
var viruses=new Ext.ux.vardb.PathogenGrid({data:data,title:"Viruses",dtype:"VIRUS",groupBy:"baltimore"});
var config={defaults:{autoHeight:true,width:600},items:[all,protists,fungi,bacteria,viruses]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.Pathogens.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.PfamGrid=Ext.extend(Ext.ux.vardb.Grid,{frame:true,width:600,height:700,autoScroll:true,collapsible:false,title:"Pfam families",groupByClans:false,initComponent:function(){var reader=new Ext.data.JsonReader({root:"rows",idProperty:"id",fields:[{name:"id",type:"int"},{name:"identifier"},{name:"name"},{name:"url"},{name:"type"},{name:"description"},{name:"clan_identifier"},{name:"clan_name"},{name:"numsequences",type:"int"}]});
var store=new Ext.data.GroupingStore({reader:reader,data:this.data,sortInfo:{field:"identifier",direction:"ASC"},groupField:this.groupByClans?"clan_identifier":null});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var view=new Ext.grid.GroupingView({forceFit:true,hideGroupedColumn:true,groupTextTpl:'{text} ({[values.rs.length]} {[values.rs.length > 1 ? "items" : "item"]})'});
var table=this;
table.grid=this;
var config={hidden:this.data.rows.length<1,store:store,columns:[sm,{header:"Name",sortable:true,dataIndex:"identifier",renderer:this.renderName},{header:"Accession",width:65,sortable:true,dataIndex:"name",renderer:this.renderAccession},{header:"Type",width:60,sortable:true,dataIndex:"type",renderer:this.renderPfamType},{header:"Description",sortable:true,dataIndex:"description"},{header:"Clan",sortable:true,dataIndex:"clan_identifier",renderer:this.renderClan},{header:"Sequences",width:60,sortable:true,dataIndex:"numsequences",align:"right",renderer:this.renderCount}],view:view,sm:sm,tbar:new Ext.Toolbar({items:[this.createPrintButton(),"-",this.createSelectMenu(),"-",this.createCartMenu("PFAM")]})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.PfamGrid.superclass.initComponent.apply(this,arguments);
if(this.groupByClans){store.filter("clan_name",/^\S/);
}},renderName:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/pfams/{0}.html">{0}</a>',value);
},renderClan:function(value,p,record){if(record.data.clan_name===""){return"";
}return String.format('<a href="http://pfam.sanger.ac.uk/clan?acc={1}" target="_blank">{0}</a>',value,record.data.clan_name);
},renderAccession:function(value,p,record){return String.format('<a href="{1}" target="_blank">{0}</a>',value,record.data.url);
},renderPfamType:function(value,p,record){return String.format("<a href=\"javascript:vardb.getTerm('pfam_terms')\">{0}</a>",value,record.data.type);
},renderCount:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/search/sequences.html?query=pfam={1}">{0}</a>',value,record.data.identifier);
}});
Ext.ux.vardb.Pfams=Ext.extend(Ext.TabPanel,{activeTab:0,width:600,frame:true,deferredRender:true,initComponent:function(){var data=this.data;
var config={defaults:{autoHeight:true},items:[new Ext.ux.vardb.PfamGrid({data:data}),new Ext.ux.vardb.PfamGrid({data:data,title:"Clans",groupByClans:true})]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.Pfams.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.AssociatedPfamGrid=Ext.extend(Ext.ux.vardb.PfamGrid,{frame:true,width:600,autoHeight:true,collapsible:false,title:"Frequently co-occurring Pfam domains",initComponent:function(){var reader=new Ext.data.JsonReader({root:"rows",idProperty:"id",fields:[{name:"id",type:"int"},{name:"identifier"},{name:"name"},{name:"url"},{name:"type"},{name:"description"},{name:"clan_identifier"},{name:"clan_name"},{name:"numsequences",type:"int"}]});
var store=new Ext.data.Store({reader:reader,data:this.data,sortInfo:{field:"identifier",direction:"ASC"}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var table=this;
table.grid=this;
var config={store:store,columns:[sm,{header:"Name",sortable:true,dataIndex:"identifier",renderer:this.renderName},{header:"Accession",width:65,sortable:true,dataIndex:"name",renderer:this.renderAccession},{header:"Type",width:60,sortable:true,dataIndex:"type",renderer:this.renderPfamType},{header:"Description",sortable:true,dataIndex:"description"},{header:"Clan",sortable:true,dataIndex:"clan_identifier",renderer:this.renderClan},{header:"Frequency",width:60,sortable:true,dataIndex:"numsequences",align:"right"}],viewConfig:{forceFit:true},sm:sm,tbar:new Ext.Toolbar({items:[this.createPrintButton(),"-",this.createSelectMenu()]})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.Grid.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.Refs=Ext.extend(Ext.ux.vardb.Grid,{frame:true,autoHeight:true,autoWidth:true,collapsible:false,pagesize:20,title:"References",initComponent:function(){var self=this;
var reader=new Ext.data.JsonReader({root:"references",totalProperty:"totalCount",idProperty:"id",fields:[{name:"id",type:"int"},{name:"identifier"},{name:"name"},{name:"year"},{name:"title"},{name:"citation"},{name:"abstrct"},{name:"pmid"},{name:"numsequences",type:"int"}]});
var store=new Ext.data.Store({url:vardb.webapp+"/ajax/references.json",reader:reader,remoteSort:true,sortInfo:{field:"authors,year",direction:"ASC,ASC"}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var expander=new Ext.grid.RowExpander({tpl:new Ext.XTemplate('<p style="background-color:white;padding: 5px;">','<div class="references">{citation}</div>',"<br/>",'<div style="padding:2px;">{abstrct}</div>',"</p>")});
var config={sm:sm,store:store,viewConfig:{forceFit:true},plugins:expander,columns:[expander,sm,{header:"Name",width:125,sortable:true,dataIndex:"name"},{header:"Title",width:230,sortable:true,dataIndex:"title"},{header:"Year",width:60,sortable:true,dataIndex:"year"},{header:"PubMed",width:60,sortable:true,dataIndex:"pmid",align:"right",renderer:this.renderPmid},{header:"Sequences",width:50,sortable:true,dataIndex:"numsequences",align:"right",renderer:this.renderCount}],tbar:new Ext.PagingToolbar({pageSize:this.pagesize,store:store,displayInfo:true,displayMsg:"{0} - {1} of {2}",emptyMsg:"None",items:["-",this.createSelectMenu(),"-",this.createCartMenu("REF")]})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.Refs.superclass.initComponent.apply(this,arguments);
store.load({params:{start:0,limit:this.pagesize}});
},renderPmid:function(value,p,record){var href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=pubmed&cmd=Retrieve&dopt=AbstractPlus&list_uids={0}&query_hl=22&itool=pubmed_docsum";
return String.format('<span class="pmid"><a href="'+href+'" target="_blank">{0}</a></span>',value);
},renderCount:function(value,p,record){if(value<1){return"";
}return String.format('<a href="'+vardb.webapp+'/search/sequences.html?query=ref={1}">{0}</a>',value,record.data.identifier);
}});
Ext.ux.vardb.Structures=Ext.extend(Ext.ux.vardb.Grid,{frame:true,autoHeight:true,autoWidth:true,collapsible:false,title:"PDB Structures",initComponent:function(){var self=this;
var reader=new Ext.data.JsonReader({root:"rows",idProperty:"id",fields:[{name:"id",type:"int"},{name:"identifier"},{name:"name"},{name:"description"},{name:"resolution"},{name:"technique"},{name:"numchains",type:"int"},{name:"numsequences",type:"int"}]});
var store=new Ext.data.Store({reader:reader,data:this.data,sortInfo:{field:"identifier",direction:"ASC"}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var tooltips=Ext.ux.vardb.Constants.tooltips;
var config={autoExpandColumn:"description",sm:sm,store:store,columns:[sm,{header:"Name",width:40,sortable:true,dataIndex:"name",renderer:this.renderName},{id:"description",header:"Description",sortable:true,dataIndex:"description"},{header:"Res.",width:20,sortable:true,align:"right",tooltip:tooltips.resolution,dataIndex:"resolution"},{header:"Technique",width:125,sortable:true,dataIndex:"technique"},{header:"Chains",width:40,sortable:true,dataIndex:"numchains"},{header:"Sequences",width:20,sortable:true,dataIndex:"numsequences",align:"right",renderer:this.renderCount}],tbar:new Ext.Toolbar({items:[self.createPrintButton(),"-",self.createSelectMenu()]})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.Structures.superclass.initComponent.apply(this,arguments);
},renderName:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/structures/{1}.html">{0}</a>',value,record.data.identifier);
},renderCount:function(value,p,record){var query=escape("structure="+record.data.identifier);
return String.format('<a href="'+vardb.webapp+'/search/sequences.html?query={1}">{0}</a>',value,query);
}});
Ext.ux.vardb.Taxa=function(renderTo){var tree=new Ext.tree.TreePanel({el:renderTo,animate:true,autoHeight:true,loader:new Ext.tree.TreeLoader({dataUrl:vardb.webapp+"/taxon/tree.json"})});
var root=new Ext.tree.AsyncTreeNode({text:"Cellular Organisms",id:"131567"});
tree.setRootNode(root);
tree.render();
root.expand(false,false);
Ext.ux.vardb.data.tree=tree;
};
Ext.ux.vardb.Terms=function(data,applyTo){var pagesize=10;
var fields=[{name:"identifier",mapping:"identifier"},{name:"term",mapping:"term"},{name:"definition",mapping:"definition"},{name:"ref",mapping:"ref"}];
var store=new Ext.data.ArrayStore({fields:fields,data:data});
var resultTpl=new Ext.XTemplate('<tpl for="."><div class="announcement-item"><h3>{term}</h3><p>{definition}</p><p style="text-align:right;font-size:80%;">{ref}</div></div></tpl>');
var panel=new Ext.Panel({applyTo:applyTo,title:"Terms",autoHeight:true,width:"95%",autoScroll:true,items:new Ext.DataView({tpl:resultTpl,store:store,itemSelector:"div.announcement-item"})});
};
Ext.ux.vardb.Map=function(config){var countries=config.data.rows;
var applyTo=config.applyTo;
var map=new google.maps.Map2(document.getElementById(applyTo));
map.setMapType(G_HYBRID_MAP);
map.setCenter(new google.maps.LatLng(0,0),1);
map.addControl(new google.maps.LargeMapControl());
map.addControl(new google.maps.MapTypeControl());
map.addControl(new google.maps.ScaleControl());
map.enableScrollWheelZoom();
var tinyIcon=new google.maps.Icon();
tinyIcon.image="http://labs.google.com/ridefinder/images/mm_20_red.png";
tinyIcon.shadow="http://labs.google.com/ridefinder/images/mm_20_shadow.png";
tinyIcon.iconSize=new google.maps.Size(12,20);
tinyIcon.shadowSize=new google.maps.Size(22,20);
tinyIcon.iconAnchor=new google.maps.Point(6,20);
tinyIcon.infoWindowAnchor=new google.maps.Point(5,1);
var index,country,identifier,point,title,query,marker,onClick;
for(index=0;
index<countries.length;
index++){country=countries[index];
point=new google.maps.LatLng(country.lat,country.lng);
title=country.identifier+" ("+country.numsequences+")";
identifier=country.identifier;
if(identifier.indexOf(" ")!==-1){identifier='"'+identifier+'"';
}query="country="+identifier;
marker=new google.maps.Marker(point,{icon:tinyIcon,title:title});
onClick=new Function("Ext.ux.vardb.Vardb.searchSequences('"+query+"');");
google.maps.Event.addListener(marker,"click",onClick);
map.addOverlay(marker);
}return map;
};
Ext.ux.vardb.UserSequenceGrid=Ext.extend(Ext.ux.vardb.SequenceGrid,{title:"User-uploaded sequences",pagesize:20,initComponent:function(){var config={};
Ext.ux.vardb.UserSequenceGrid.superclass.initComponent.apply(this,arguments);
this.viewConfig.emptyText='<div class="emptyText">There are currently no user-uploaded sequences.</div>';
},onRender:function(){Ext.ux.vardb.UserSequenceGrid.superclass.onRender.apply(this,arguments);
var self=this;
this.addToolbarMenu({text:"Upload",menu:new Ext.menu.Menu({items:[{text:"Upload sequences",handler:self.uploadSequences},"-",{text:"Delete selected sequences",handler:self.deleteSelectedUserSequences},{text:"Delete all uploaded sequences",handler:self.deleteAllUserSequences}]})});
},uploadSequences:function(){var self=this;
var dialog=new Ext.ux.vardb.UploadSequencesDialog({maxUserSequences:self.maxUserSequences,callback:function(json){self.store.reload();
}});
},deleteSelectedUserSequences:function(){var self=this;
var ids=this.getSelectedIds();
Ext.ux.vardb.Vardb.deleteUserSequences(ids,function(){self.store.reload();
});
},deleteAllUserSequences:function(){var self=this;
Ext.ux.vardb.Vardb.deleteAllUserSequences(function(){self.store.reload();
});
}});
Ext.ux.vardb.AnalysesGrid=Ext.extend(Ext.ux.vardb.Grid,{frame:true,stripeRows:true,loadMask:true,autoHeight:true,title:"Analyses",initComponent:function(){var grid=this;
var controller=this.controller;
var reader=new Ext.data.JsonReader({root:"rows",totalProperty:"totalCount",idProperty:"list_id",fields:[{name:"id"},{name:"dtype"},{name:"date"}]});
var store=new Ext.data.Store({url:vardb.webapp+"/ajax/user/analyses.json",remoteSort:true,sortInfo:{field:"date",direction:"DESC"},reader:reader});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20,singleSelect:true});
var reloadButton=Ext.ux.vardb.Vardb.createReloadButton(function(){store.reload();
});
var toolbar=new Ext.Toolbar({items:[this.createSelectMenu(),"->",reloadButton]});
var config={viewConfig:{forceFit:true},sm:sm,store:store,columns:[sm,{header:"Type",width:100,sortable:true,dataIndex:"dtype",renderer:this.renderDtype},{header:"Date",width:100,sortable:true,align:"right",dataIndex:"date"}],tbar:toolbar};
store.load();
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.AnalysesGrid.superclass.initComponent.apply(this,arguments);
this.viewConfig.emptyText='<div class="emptyText">No analyses.</div>';
},renderDtype:function(value,p,r){var url=vardb.webapp+"/analysis/"+r.data.dtype.toLowerCase()+"/load.html?id="+r.data.id;
return String.format('<a href="{1}">{0}</a>',value,url);
}});
Ext.ux.vardb.FieldCombo=Ext.extend(Ext.form.ComboBox,{name:"field",valueField:"value",displayField:"display",fieldLabel:"Condition",width:100,mode:"local",triggerAction:"all",emptyText:"Field",selectOnFocus:true,forceSelection:true,listWidth:200,initComponent:function(){var config={store:this.createStore()};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.FieldCombo.superclass.initComponent.apply(this,arguments);
},addField:function(data,value,display){if(!display){display=value;
}data.push([value,display]);
},createStore:function(){var data=[];
this.addField(data,"any");
this.addField(data,"accession");
this.addField(data,"pathogen_identifier","pathogen");
this.addField(data,"family_identifier","family");
this.addField(data,"ortholog_identifier","ortholog");
this.addField(data,"division");
this.addField(data,"natype");
this.addField(data,"ref_identifier","ref");
this.addField(data,"taxon_identifier","taxon");
this.addField(data,"country_region","region");
this.addField(data,"country_identifier","country");
this.addField(data,"subregion");
this.addField(data,"strain");
this.addField(data,"serogroup");
this.addField(data,"serotype");
this.addField(data,"clone");
this.addField(data,"segment");
this.addField(data,"specific_host");
this.addField(data,"isolate");
this.addField(data,"isolation_source");
this.addField(data,"mol_type");
this.addField(data,"locus");
this.addField(data,"gene");
this.addField(data,"locus_tag");
this.addField(data,"allele");
this.addField(data,"strand");
this.addField(data,"splicing");
this.addField(data,"geneid");
this.addField(data,"plasmid");
this.addField(data,"product");
this.addField(data,"protein");
this.addField(data,"protein_id");
this.addField(data,"uniprot");
this.addField(data,"ec");
this.addField(data,"defline");
var store=new Ext.data.ArrayStore({fields:["value","display"],data:data});
return store;
}});
Ext.ux.vardb.UniqueValuesCombo=Ext.extend(Ext.form.ComboBox,{name:"value",valueField:"value",displayField:"display",hideLabel:true,minChars:0,typeAhead:true,typeAheadDelay:500,queryDelay:500,loadingText:"Searching...",width:250,listWidth:300,emptyText:"Value",resizable:true,initComponent:function(){var store=new Ext.data.Store({url:vardb.webapp+"/search/ajax/unique.json",reader:new Ext.data.JsonReader({root:"values",totalProperty:"totalCount",idProperty:"value"},[{name:"value",mapping:"value"},{name:"numsequences",mapping:"numsequences",type:"int"},{name:"display",mapping:"display"}]),baseParams:{limit:100,field:"",query:""}});
var config={store:store};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.UniqueValuesCombo.superclass.initComponent.apply(this,arguments);
},setField:function(field){this.store.baseParams.field=field;
this.store.reload();
this.enable();
}});
Ext.ux.vardb.FilterForm=Ext.extend(Ext.form.FormPanel,{title:"Filter",frame:true,controlWidth:180,padding:5,listWidth:180,labelAlign:"top",labelWidth:80,spacerWidth:10,autoScroll:true,separator:";",forceLayout:true,numconditions:3,initComponent:function(){var self=this;
var controls=this.createControls(this.counts);
var config={items:controls};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.FilterForm.superclass.initComponent.apply(this,arguments);
},createSingleSelect:function(fieldName,fieldLabel,data,numsequences){if(data.length===0){return null;
}var emptyText=numsequences+" "+fieldLabel;
var self=this;
var select=new Ext.ux.Andrie.Select({name:fieldName,fieldLabel:fieldLabel,multiSelect:false,minLength:0,valueField:"identifier",emptyText:emptyText,displayField:"name",triggerAction:"all",mode:"local",width:self.controlWidth,listWidth:self.listWidth,store:new Ext.data.ArrayStore({fields:["identifier","name"],data:data})});
return select;
},createMultiSelect:function(fieldName,fieldLabel,data,emptyText){if(data.length===0){return null;
}if(data.length===1){emptyText=data[0][1];
}if(!emptyText){emptyText=data.length+" "+fieldLabel;
}var self=this;
var select=new Ext.ux.form.LovCombo({name:fieldName,fieldLabel:fieldLabel,emptyText:emptyText,separator:self.separator,width:self.controlWidth,hideOnSelect:false,maxHeight:200,triggerAction:"all",valueField:"id",displayField:"name",mode:"local",store:new Ext.data.SimpleStore({id:0,fields:[{name:"id"},"name"],data:data})});
return select;
},createDateControl:function(fieldName,fieldLabel){var field=new Ext.form.DateField({fieldLabel:fieldLabel,name:fieldName});
return field;
},createLengthControl:function(fieldName,fieldLabel){var lowerField=new Ext.form.NumberField({fieldLabel:fieldLabel,name:fieldName+"lower",width:50});
var upperField=new Ext.form.NumberField({name:fieldName+"upper",width:50});
var field={layout:"column",anchor:"100%",items:[{items:{html:fieldLabel+":&nbsp;"}},{items:[lowerField]},{items:{html:"&nbsp;-&nbsp;"}},{items:[upperField]}]};
return field;
},createFilterButton:function(){var filterButton={xtype:"button",text:"Filter",formBind:true,scope:this,handler:this.filterHandler};
return{layout:"fit",height:30,style:"margin: 0 0 3px 0",items:[filterButton]};
},createResetButton:function(){var resetButton={xtype:"button",text:"Reset",formBind:true,scope:this,handler:this.resetHandler};
return{layout:"fit",height:30,style:"margin: 0 0 3px 0",items:[resetButton]};
},createControls:function(counts){var controls=[];
function addControl(control){if(control){controls.push(control);
}}addControl(this.createFilterButton());
addControl(this.createResetButton());
addControl(this.createMultiSelect("diseases","Diseases",this.getCountData(counts.diseases)));
addControl(this.createMultiSelect("divisions","Divisions",this.getCountData(counts.divisions)));
addControl(this.createMultiSelect("pathogens","Pathogens",this.getCountData(counts.pathogens)));
addControl(this.createMultiSelect("families","Families",this.getCountData(counts.families)));
addControl(this.createMultiSelect("subgroups","Subgroups",this.getCountData(counts.subgroups)));
addControl(this.createMultiSelect("orthologs","Orthologs",this.getCountData(counts.orthologs)));
addControl(this.createMultiSelect("genomes","Genomes",this.getCountData(counts.genomes)));
addControl(this.createMultiSelect("pfams","Pfam domains",this.getCountData(counts.pfams)));
addControl(this.createMultiSelect("countries","Countries",this.getCountData(counts.countries)));
addControl(this.createMultiSelect("refs","Publications",this.getCountData(counts.refs)));
addControl(this.createMultiSelect("sources","Sources",this.getCountData(counts.sources)));
addControl(this.createMultiSelect("bundles","Bundles",this.getCountData(counts.bundles)));
addControl(this.createMultiSelect("groups","Groups",this.getCountData(counts.groups)));
addControl(this.createMultiSelect("tags","Tags",this.getCountData(counts.tags)));
addControl(this.createSingleSelect("pseudogenes","Pseudogenes",this.getPseudogeneData(counts),counts.pseudogenes));
addControl(this.createSingleSelect("truncated","Truncated",this.getTruncatedData(counts),counts.truncated));
addControl(this.createSingleSelect("uploaded","Uploaded",this.getUploadedData(counts),counts.uploaded));
if(controls.length>0){addControl(this.createDateControl("startdate","Start date"));
addControl(this.createDateControl("enddate","End date"));
addControl(this.createLengthControl("ntlength","NT length"));
addControl(this.createLengthControl("aalength","AA length"));
}addControl(this.createConditionsFieldset());
addControl(this.createFilterButton());
return controls;
},createConditionsFieldset:function(){this.numrows=0;
var andOrField=new Ext.ux.vardb.SelectList({data:[["AND","And"],["OR","Or"]],name:"conditionandor",hideLabel:true,value:"AND",width:50});
var addConditionButton={xtype:"button",text:"Add condition",formBind:true,scope:this,handler:this.addCondition};
this.conditionsfieldset=new Ext.form.FieldSet({title:"Conditions",collapsible:true,items:[{xtype:"container",layout:"column",items:[andOrField,{html:"&nbsp;&nbsp;"},addConditionButton]}]});
var index;
for(index=0;
index<this.numconditions;
index++){this.addRow();
}return this.conditionsfieldset;
},addCondition:function(){this.addRow();
this.doLayout();
},addRow:function(){this.numrows++;
var fieldCombo=new Ext.ux.vardb.FieldCombo({name:"conditionfield"+this.numrows,width:55,hideLabel:true});
var valueCombo=new Ext.ux.vardb.UniqueValuesCombo({name:"conditionvalue"+this.numrows,width:55});
fieldCombo.on("select",function(field,record,index){valueCombo.setField(record.data.value);
});
var operatorField=new Ext.ux.vardb.SelectList({data:[["=","="],["!=","!="]],name:"conditionoperator"+this.numrows,hideLabel:true,value:"=",width:35});
var row={xtype:"container",layout:"column",items:[{layout:"form",bodyStyle:"padding-right: 3px",items:fieldCombo},{bodyStyle:"padding-right: 3px; padding-top: 3px",items:operatorField},{layout:"form",items:valueCombo}]};
this.conditionsfieldset.add(row);
},getCountData:function(items){var data=[];
if(!items){return data;
}var index,item,identifier,name;
for(index=0;
index<items.length;
index++){item=items[index];
identifier=item.identifier;
name=item.name+" ("+item.numsequences+")";
data.push([identifier,name]);
}return data;
},getRatingData:function(counts){var data=[];
var index,rating,identifier,name;
for(index=0;
index<counts.ratings.length;
index++){rating=counts.ratings[index];
if(rating.numsequences<1){continue;
}identifier=rating.identifier;
name=rating.quality+" ("+rating.numsequences+")";
data.push([identifier,name]);
}return data;
},getPseudogeneData:function(counts){var data=[];
if(counts.pseudogenes===0){return data;
}data.push(["exclude","Exclude pseudogenes"]);
data.push(["only","Show only pseudogenes"]);
return data;
},getTruncatedData:function(counts){var data=[];
if(counts.truncated===0){return data;
}data.push(["exclude","Exclude truncated sequences"]);
data.push(["only","Show only truncated sequences"]);
return data;
},getUploadedData:function(counts){var data=[];
if(counts.uploaded===0){return data;
}data.push(["exclude","Exclude uploaded sequences"]);
data.push(["only","Show only uploaded sequences"]);
return data;
},createPseudogeneFilter:function(list){var control=this.getForm().findField("pseudogenes");
if(!control){return;
}var pseudogenes=control.getValue();
if(pseudogenes==="exclude"){this.addFilter(list,"pseudogene=false");
}else{if(pseudogenes==="only"){this.addFilter(list,"pseudogene=true");
}}},createTruncatedFilter:function(list){var control=this.getForm().findField("truncated");
if(!control){return;
}var truncated=control.getValue();
if(truncated==="exclude"){this.addFilter(list,"truncated=false");
}else{if(truncated==="only"){this.addFilter(list,"truncated=true");
}}},createUploadedFilter:function(list){var control=this.getForm().findField("uploaded");
if(!control){return;
}var uploaded=control.getValue();
if(uploaded==="exclude"){this.addFilter(list,"uploaded=false");
}else{if(uploaded==="only"){this.addFilter(list,"uploaded=true");
}}},createDateFilter:function(list){var date,dateformat="Ymd";
var startdatefield=this.getForm().findField("startdate");
if(startdatefield&&startdatefield.getValue()!==""){date=startdatefield.getValue();
this.addFilter(list,"after="+date.format(dateformat));
}var enddatefield=this.getForm().findField("enddate");
if(enddatefield&&enddatefield.getValue()!==""){date=enddatefield.getValue();
this.addFilter(list,"before="+date.format(dateformat));
}},createLengthFilter:function(list){var date,dateformat="Ymd";
var ntlower=this.getForm().findField("ntlengthlower").getValue();
var ntupper=this.getForm().findField("ntlengthupper").getValue();
var aalower=this.getForm().findField("aalengthlower").getValue();
var aaupper=this.getForm().findField("aalengthupper").getValue();
if(ntlower!==""){this.addFilter(list,"ntlength>="+ntlower);
}if(ntupper!==""){this.addFilter(list,"ntlength<="+ntupper);
}if(aalower!==""){this.addFilter(list,"aalength>="+aalower);
}if(aaupper!==""){this.addFilter(list,"aalength<="+aaupper);
}},createConditionFilter:function(list){var conditions=[];
var rownum,field,operator,value;
var form=this.getForm();
for(rownum=1;
rownum<=this.numrows;
rownum++){if(!form.findField("conditionfield"+rownum)){continue;
}field=form.findField("conditionfield"+rownum).getValue().trim();
operator=form.findField("conditionoperator"+rownum).getValue();
value=form.findField("conditionvalue"+rownum).getValue().trim();
if(field===""||value===""){continue;
}if(value.indexOf(" ")!==-1){value='"'+value+'"';
}conditions.push(field+operator+value);
}if(conditions.length===0){return;
}var andor=form.findField("conditionandor").getValue();
var query="("+conditions.join(" "+andor+" ")+")";
this.addFilter(list,query);
},createMultiFilter:function(list,field,type){var control=this.getForm().findField(field);
if(!control||control.disabled){return;
}var index,value;
var values=control.getValue().split(this.separator);
if(values.length===0){return;
}var sublist=[];
for(index=0;
index<values.length;
index++){value=values[index];
if(value===null||value===""){continue;
}if(value.indexOf(" ")!==-1){value='"'+value+'"';
}sublist.push(type+"="+value);
}if(sublist.length===0){return;
}var filter=sublist.join(" OR ");
if(sublist.length!==1){filter="("+filter+")";
}this.addFilter(list,filter);
},createFilter:function(){var list=[];
this.createMultiFilter(list,"diseases","disease");
this.createMultiFilter(list,"divisions","division");
this.createMultiFilter(list,"pathogens","pathogen");
this.createMultiFilter(list,"families","family");
this.createMultiFilter(list,"genomes","genome");
this.createMultiFilter(list,"countries","country");
this.createMultiFilter(list,"pfams","pfam");
this.createMultiFilter(list,"refs","ref");
this.createMultiFilter(list,"sources","source");
this.createMultiFilter(list,"bundles","bundle");
this.createMultiFilter(list,"groups","group");
this.createMultiFilter(list,"tags","tag");
this.createDateFilter(list);
this.createPseudogeneFilter(list);
this.createTruncatedFilter(list);
this.createUploadedFilter(list);
this.createLengthFilter(list);
this.createConditionFilter(list);
var filter=list.join(" AND ");
return filter;
},addFilter:function(list,item){if(item!==null&&item!==""){list.push(item);
}},filterHandler:function(){var filter=this.createFilter();
if(this.onFilter){this.onFilter(filter);
}},resetHandler:function(){this.getForm().reset();
this.filterHandler();
}});
Ext.ux.vardb.SortDialog=Ext.extend(Ext.Window,{title:"Sort",width:300,height:160,closable:true,resizable:true,numsortfields:3,initComponent:function(){if(!this.grid){throw"Grid has not been set";
}var sortstate=this.grid.store.getSortState();
var curfields=sortstate.field.split(",");
var curdirs=sortstate.direction.split(",");
var items=[],num,field,dir,container;
for(num=1;
num<=this.numsortfields;
num++){if(curfields.length>=num){field=curfields[num-1];
dir=curdirs[num-1];
}else{field="none";
dir="ASC";
}container={layout:"column",border:false,items:[{layout:"form",width:200,items:this.createSortField("sort"+num,field)},{layout:"form",columnWidth:1,items:this.createDirectionField("dir"+num,dir)}]};
items.push(container);
}this.form=new Ext.FormPanel({labelWidth:45,autoHeight:true,frame:true,items:items});
var config={defaults:{split:true},items:[this.form],buttons:[{text:"Search",formBind:true,scope:this,handler:this.submitHandler}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.SortDialog.superclass.initComponent.apply(this,arguments);
this.show();
},submitHandler:function(){var form=this.form.getForm();
if(!form.isValid()){return;
}var fields=[];
var dirs=[];
var num;
for(num=1;
num<=this.numsortfields;
num++){var field=form.findField("sort"+num).getValue();
var dir=form.findField("dir"+num).getValue();
if(field!=="none"){fields.push(field);
dirs.push(dir);
}}this.grid.store.setDefaultSort(fields.join(","),dirs.join(","));
this.grid.store.reload();
this.close();
},selectList:function(data,fieldName,fieldLabel,value,config){config=config||{};
Ext.applyIf(config,{store:new Ext.data.ArrayStore({fields:["value","display"],data:data}),name:fieldName,fieldLabel:fieldLabel,valueField:"value",displayField:"display",width:150,mode:"local",triggerAction:"all",value:value,selectOnFocus:true,forceSelection:true});
return new Ext.form.ComboBox(config);
},createSortField:function(name,value){var options=[["none",""],["accession","accession"],["rating","rating"],["taxon_name","taxon"],["pathogen_name","pathogen"],["family_name","family"],["subgroup_name","subgroup"],["ortholog_name","ortholog"],["disease_name","disease"],["country_name","country"],["ref_name","reference"],["strain","strain"],["isolate","isolate"],["isolation_source","isolation_source"],["molwt","molwt"],["subregion","subregion"],["segment","segment"],["serotype","serotype"],["serogroup","serogroup"],["serovar","serovar"],["subtype","subtype"],["host","host"],["lab_host","lab_host"],["specific_host","specific_host"],["plasmid","plasmid"],["codedby","codedby"],["oldid","oldid"],["natype","natype"],["clone","clone"],["pseudogene","pseudogene"],["truncated","truncated"],["location","location"],["domains","domains"],["locus_tag","locus_tag"],["defline","description"],["gene","gene"],["product","product"],["uniprot","uniprot"],["udate","udate"],["ntlength","ntlength"],["aalength","aalength"],["method","method"],["model","model"],["score","score"],["evalue","evalue"],["sequence","sequence"],["translation","translation"]];
return this.selectList(options,name,"Sort by",value);
},createDirectionField:function(name,value){var options=[];
options.push(["ASC","Asc"]);
options.push(["DESC","Desc"]);
return this.selectList(options,name,"Direction",value,{width:50,hideLabel:true,labelSeparator:""});
}});
Ext.ux.vardb.Summary=Ext.extend(Ext.Window,{layout:"fit",width:600,height:400,title:"Sequence property summary",maximizable:true,bodyStyle:"background-color: white; padding: 3px",initComponent:function(){var group=this.data.groups[0];
var tabpanel=new Ext.TabPanel({activeTab:0,items:[{title:"Properties",autoScroll:true,html:this.formatSummary()},new Ext.ux.vardb.LengthChart({title:"AA lengths",data:group.aalengths.bins}),new Ext.ux.vardb.LengthChart({title:"NT lengths",data:group.ntlengths.bins})]});
var config={items:[tabpanel],buttons:[{text:"Close",scope:this,handler:function(){this.hide();
}}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.Summary.superclass.initComponent.apply(this,arguments);
this.show();
},formatSummary:function(){var buffer=[],group,i;
for(i=0;
i<this.data.groups.length;
i++){group=this.data.groups[i];
buffer.push(this.formatGroup(group));
}var html=buffer.join("\n");
return html;
},formatGroup:function(group){var buffer=[];
buffer.push('<h2 style="color:#3764A0;border-bottom:2px solid #99BBE8;">'+group.name+"</h2>");
buffer.push("Count: "+group.numsequences+"<br/>");
buffer.push("GC content: "+group.gc.mean+"<br/>");
buffer.push("GC3 content: "+group.gc3.mean+"<br/>");
buffer.push("GC3 skew: "+group.gc3skew.mean+"<br/>");
buffer.push("Protein length: "+group.aalengths.mean+"<br/>");
buffer.push("Nucleotide length: "+group.ntlengths.mean+"<br/>");
buffer.push("<br/>");
return buffer.join("\n");
}});
Ext.ux.vardb.UserAlignments=Ext.extend(Ext.ux.vardb.Grid,{title:"User Alignments",frame:true,autoHeight:true,enableColumnMove:true,stripeRows:true,loadMask:true,collapsible:false,animCollapse:false,initComponent:function(){var grid=this;
var store=new Ext.data.Store({url:vardb.webapp+"/ajax/user/alignments.json",remoteSort:true,sortInfo:{field:"name",direction:"ASC"},reader:new Ext.data.JsonReader({root:"alignments",totalProperty:"totalCount",idProperty:"identifier",fields:[{name:"id",type:"int"},{name:"identifier"},{name:"name"},{name:"description"},{name:"type"},{name:"numsequences",type:"int"},{name:"numcolumns",type:"int"},{name:"updated"}]})});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var expander=new Ext.grid.RowExpander({tpl:new Ext.XTemplate('<br/><img src="/vardb/alignments/{identifier}.img?width=500"/><br/><br/>')});
var config={viewConfig:{forceFit:true},sm:sm,store:store,plugins:expander,columns:[sm,{header:"Name",sortable:true,dataIndex:"name",renderer:Ext.ux.vardb.Renderer.renderAlignment},{header:"Type",sortable:true,dataIndex:"type",align:"right",width:20},{header:"Rows",sortable:true,dataIndex:"numsequences",align:"right",width:20},{header:"Cols",sortable:true,dataIndex:"numcolumns",align:"right",width:20},{header:"Date",sortable:true,dataIndex:"updated",align:"right",width:50}],tbar:this.createToolbar()};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.UserAlignments.superclass.initComponent.apply(this,arguments);
this.viewConfig.emptyText='<div class="emptyText">No alignments.</div>';
store.load();
},uploadAlignmentHandler:function(){var self=this;
var dialog=new Ext.ux.vardb.UploadAlignmentDialog({callback:function(alignment){self.store.reload();
}});
},deleteAlignmentHandler:function(){var self=this;
Ext.ux.vardb.Vardb.deleteUserAlignment(this.getSelectedId(),function(){self.store.reload();
});
},createActionMenu:function(){var self=this;
var menu={text:"Action",menu:{items:[{text:"Upload alignment",scope:this,handler:this.uploadAlignmentHandler},{text:"Delete alignment",scope:this,handler:this.deleteAlignmentHandler}]}};
return menu;
},createToolbar:function(){var toolbar=new Ext.Toolbar({items:[this.createPrintButton(),"-",this.createSelectMenu(),"-",this.createActionMenu(),"->",this.createReloadButton()]});
return toolbar;
}});
Ext.ux.vardb.UploadSequencesDialog=Ext.extend(Ext.Window,{title:"Upload sequences",width:600,closable:true,resizable:true,maxUserSequences:50,initComponent:function(){var explanation=[];
explanation.push("Upload or copy/paste sequences in FASTA format.");
explanation.push("Currently, only "+this.maxUserSequences+" sequences can be uploaded per user.");
explanation.push("Sequences with the same name will be replaced, whereas sequences with a different type will be updated.");
explanation.push("Uploaded sequences will be marked with an asterisk(*).");
var explanationField={xtype:"label",style:"margin: 0 0 10px 0",html:explanation.join(" ")};
var familyField={xtype:"combo",hiddenName:"family",hideLabel:true,valueField:"identifier",displayField:"name",triggerAction:"all",emptyText:"Select a gene/protein family",selectOnFocus:true,allowBlank:false,store:new Ext.data.Store({url:vardb.webapp+"/ajax/families.json",reader:new Ext.data.JsonReader({root:"rows"},[{name:"id",mapping:"id"},{name:"identifier",mapping:"identifier"},{name:"name",mapping:"name"}])})};
var typeField={xtype:"combo",hiddenName:"type",fieldLabel:"Sequence type",valueField:"value",displayField:"label",store:[["AA","Protein sequences"],["NT","Nucleotide sequences"]],mode:"local",triggerAction:"all",selectOnFocus:true,allowBlank:false,value:"AA"};
var uploadField={xtype:"fileuploadfield",emptyText:"Upload sequence file in Fasta format",fieldLabel:"Sequence File",name:"sequencefile",width:400,buttonText:"",buttonCfg:{iconCls:"upload-icon"}};
var textField={xtype:"textarea",fieldLabel:"Or copy/paste sequences in FASTA format",name:"sequencetext",value:"",width:400,height:200,allowBlank:true};
this.form=new Ext.FormPanel({fileUpload:true,url:"",defaults:{width:230,labelWidth:70},defaultType:"textfield",bodyStyle:"padding: 2px",labelAlign:"top",items:[explanationField,familyField,typeField,uploadField,textField],buttons:[{text:"Upload",formBind:true,scope:this,handler:this.submitHandler},{text:"Cancel",scope:this,handler:function(){this.hide();
}}]});
this.items=[this.form];
Ext.ux.vardb.UploadSequencesDialog.superclass.initComponent.apply(this,arguments);
this.show();
},submitHandler:function(){if(!this.form.getForm().isValid()){return;
}var self=this;
this.form.getForm().submit({url:vardb.webapp+"/ajax/sequences/upload.json",waitMsg:"Uploading sequences",failure:Ext.ux.vardb.Vardb.onFormFailure,success:function(form,action){var json=Ext.decode(action.response.responseText);
self.hide();
Ext.MessageBox.alert("Success",json.message);
if(self.callback){self.callback(json);
}}});
}});
Ext.ux.vardb.UploadAlignmentDialog=Ext.extend(Ext.Window,{title:"Upload alignment",width:600,closable:true,resizable:true,initComponent:function(){var explanationField={xtype:"label",style:"margin: 0 0 10px 0",html:"Upload or copy/paste an alignment in FASTA or ClustalW format."};
var nameField={name:"name",fieldLabel:"Title",emptyText:"User alignment",width:400};
var typeField={xtype:"combo",hiddenName:"type",fieldLabel:"Sequence type",valueField:"value",displayField:"label",store:[["AA","Protein alignment"],["NT","Nucleotide alignment"]],mode:"local",triggerAction:"all",selectOnFocus:true,allowBlank:false,value:"AA"};
var uploadField={xtype:"fileuploadfield",emptyText:"Upload alignment file in FASTA or ClustalW format",fieldLabel:"Sequence File",name:"sequencefile",width:400,buttonText:"",buttonCfg:{iconCls:"upload-icon"}};
var textField={xtype:"textarea",fieldLabel:"Or copy/paste sequences in FASTA or ClustalW format",name:"sequencetext",value:"",width:400,height:200,allowBlank:true};
this.form=new Ext.FormPanel({fileUpload:true,url:"",defaults:{width:230,labelWidth:70},defaultType:"textfield",bodyStyle:"padding: 2px",labelAlign:"top",items:[explanationField,nameField,typeField,uploadField,textField],buttons:[{text:"Upload",formBind:true,scope:this,handler:this.submitHandler},{text:"Cancel",scope:this,handler:function(){this.hide();
}}]});
this.items=[this.form];
Ext.ux.vardb.UploadAlignmentDialog.superclass.initComponent.apply(this,arguments);
this.show();
},submitHandler:function(){if(!this.form.getForm().isValid()){return;
}var self=this;
this.form.getForm().submit({url:vardb.webapp+"/ajax/alignments/upload.json",waitMsg:"Uploading alignment",failure:Ext.ux.vardb.Vardb.onFormFailure,success:function(form,action){var json=Ext.decode(action.response.responseText);
self.hide();
Ext.MessageBox.alert("Success",json.message);
if(self.callback){self.callback(json);
}}});
}});
Ext.ux.vardb.UserAlignmentSelectList=Ext.extend(Ext.ux.form.ComboBoxAdd,{hiddenName:"alignmentIdentifier",valueField:"identifier",displayField:"name",fieldLabel:"Your alignments",typeAhead:true,minChars:0,loadingText:"Loading...",width:350,emptyText:"Select an alignment",sequenceType:undefined,initComponent:function(){var self=this;
var store=new Ext.data.Store({url:vardb.webapp+"/ajax/user/alignments.json",reader:new Ext.data.JsonReader({root:"alignments",totalProperty:"totalCount",idProperty:"identifier",fields:[{name:"id",type:"int"},{name:"identifier"},{name:"name"},{name:"description"},{name:"type"},{name:"numsequences",type:"int"},{name:"numcolumns",type:"int"},{name:"updated"}]})});
if(this.sequenceType){store.baseParams.sequenceType=this.sequenceType;
}var config={store:store};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.UserAlignmentSelectList.superclass.initComponent.apply(this,arguments);
this.addListener("add",function(e){var dialog=new Ext.ux.vardb.UploadAlignmentDialog({callback:function(json){store.reload();
}});
},this);
}});
Ext.ux.vardb.tags.ApplyTagDialog=Ext.extend(Ext.Window,{title:"Tag sequences",width:400,closable:true,resizable:true,initComponent:function(){var self=this;
var store=new Ext.data.Store({url:vardb.webapp+"/tags/ajax/usertags.json",reader:new Ext.data.JsonReader({root:"tags",totalProperty:"totalCount"},[{name:"id",type:"int"},{name:"name"},{name:"numsequences",mapping:"numsequences",type:"int"}])});
var tagCombo=new Ext.ux.form.ComboBoxAdd({name:"tag_id",allowBlank:false,store:store,valueField:"id",displayField:"name",fieldLabel:"Tag",typeAhead:true,minChars:0,loadingText:"Loading...",width:249,listWidth:300,emptyText:"Select a tag",resizable:true,listeners:{add:function(e){var dialog=new Ext.ux.vardb.tags.NewTagDialog({x:self.getPosition()[0]+30,y:self.getPosition()[1]+30,callback:function(tag){tagCombo.insert(0,tag);
}});
}}});
var form=new Ext.FormPanel({labelWidth:50,url:"",defaults:{allowBlank:true},items:tagCombo,buttons:[{text:"Submit",formBind:true,scope:self,handler:self.submitHandler},{text:"Cancel",scope:self,handler:function(){self.hide();
}}]});
var config={items:[form]};
this.form=form;
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.tags.ApplyTagDialog.superclass.initComponent.apply(this,arguments);
this.show();
},submitHandler:function(){var self=this;
var callback=function(){if(self.grid){self.grid.store.reload();
}self.hide();
};
var tag_id=this.form.getForm().findField("tag_id").getValue();
if(tag_id===""){alert("Please select a tag.");
return;
}if(this.grid){var ids=this.grid.getSelectedIds();
var total=ids.length;
if(total>0){Ext.ux.vardb.tags.Services.tagSequencesById(tag_id,ids,callback);
}else{total=this.grid.store.getTotalCount();
var filter=this.grid.store.baseParams.filter;
if(this.grid.list_id){Ext.ux.vardb.tags.Services.tagSequencesByList(tag_id,this.grid.list_id,filter,total,callback);
}else{Ext.ux.vardb.tags.Services.tagSequencesByFilter(tag_id,filter,total,callback);
}}}else{if(this.sequence_id){Ext.ux.vardb.tags.Services.tagSequencesById([this.sequence_id]);
}else{throw"no grid or sequence_id is defined in ApplyTagDialog";
}}}});
Ext.ux.vardb.tags.AttributeDialog=Ext.extend(Ext.Window,{title:"Add Attribute",width:400,closable:true,resizable:true,tag_id:undefined,callback:Ext.emptyFn,initComponent:function(){var nameField={xtype:"textfield",fieldLabel:"Name",name:"name",vtype:"alphanum"};
var valueField={xtype:"textfield",fieldLabel:"Value",name:"value"};
var typeField={xtype:"combo",hiddenName:"type",fieldLabel:"Type",store:"STRING,INTEGER,FLOAT".split(","),mode:"local",triggerAction:"all",emptyText:" ",selectOnFocus:true,value:"STRING"};
this.form=new Ext.FormPanel({labelWidth:50,url:"",monitorValid:true,defaults:{width:200,allowBlank:false},items:[nameField,valueField,typeField],buttons:[{text:"Submit",formBind:true,scope:this,handler:this.submitHandler},{text:"Cancel",scope:this,handler:function(){this.hide();
}}]});
this.items=[this.form];
Ext.ux.vardb.tags.AttributeDialog.superclass.initComponent.apply(this,arguments);
this.show();
},submitHandler:function(){var win=this;
var name=this.form.getForm().findField("name").getValue();
var value=this.form.getForm().findField("value").getValue();
var type=this.form.getForm().findField("type").getValue();
var params={tag_id:win.tag_id,name:name,value:value,type:type};
Ext.ux.vardb.Vardb.ajaxRequest("/tags/ajax/attributes/add.json",params,function(attribute){win.hide();
if(win.callback){win.callback(attribute);
}});
}});
Ext.ux.vardb.tags.AttributeSummaryDialog=function(bundle_id){var grid;
var win;
function showDialog(bundle_id){var reader=new Ext.data.JsonReader({root:"values",idProperty:"name",fields:[{name:"name"},{name:"value"},{name:"numsequences",type:"int"}]});
var store=new Ext.data.GroupingStore({url:vardb.webapp+"/tags/ajax/analysis/bundles/summarize.json",reader:reader,sortInfo:{field:"value",direction:"ASC"},groupField:"name",baseParams:{bundle_id:bundle_id}});
grid=new Ext.grid.EditorGridPanel({store:store,columns:[{header:"Name",width:100,sortable:true,dataIndex:"name"},{header:"Value",width:100,sortable:true,dataIndex:"value"},{header:"Count",width:50,sortable:true,dataIndex:"numsequences"}],view:new Ext.grid.GroupingView({forceFit:true,hideGroupedColumn:false,groupTextTpl:'{text} ({[values.rs.length]} {[values.rs.length > 1 ? "distinct values" : "distinct value"]})'}),stripeRows:true,autoWidth:true,autoHeight:true});
win=new Ext.Window({title:"Summary",width:600,height:400,closable:true,items:[grid],autoScroll:true,buttons:[{text:"Close",handler:function(){win.hide();
}}]});
win.show();
}showDialog(bundle_id);
};
Ext.ux.vardb.tags.BundleDialog=Ext.extend(Ext.Window,{layout:"fit",width:600,height:360,closable:true,resizable:true,closeAction:"hide",plain:true,initComponent:function(){var bundle=this.bundle;
var config={title:"Bundle: "+bundle.name,items:[new Ext.ux.vardb.tags.Bundle({bundle:bundle,frame:false})],buttons:[{text:"Close",scope:this,handler:function(){this.hide();
}}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.tags.BundleDialog.superclass.initComponent.apply(this,arguments);
this.show();
}});
Ext.ux.vardb.tags.Bundle=Ext.extend(Ext.TabPanel,{frame:true,initComponent:function(){var bundle=this.bundle;
var sequenceGrid=new Ext.ux.vardb.SequenceGrid({resource:{type:"BUNDLE",id:bundle.bundle_id},pagesize:20,filter:"bundle="+bundle.identifier});
var tagGrid=new Ext.ux.vardb.tags.BundleTagGrid({bundle:bundle});
var joinGrid=new Ext.ux.vardb.tags.JoinGrid({bundle:bundle});
var config={title:"Bundle: "+bundle.name,activeTab:0,width:600,defaults:{layout:"fit",autoHeight:true},deferredRender:false,items:[tagGrid,sequenceGrid,joinGrid]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.tags.Bundle.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.tags.BundleTagGrid=Ext.extend(Ext.ux.vardb.Grid,{title:"Tags",frame:false,autoWidth:true,autoHeight:true,enableColumnMove:true,stripeRows:true,loadMask:true,collapsible:false,animCollapse:false,pagesize:20,initComponent:function(){this.bundle_id=this.bundle.bundle_id;
var self=this;
var store=new Ext.data.Store({url:vardb.webapp+"/tags/ajax/bundle.json",reader:new Ext.data.JsonReader(),remoteSort:true,sortInfo:{field:"name",direction:"ASC"},baseParams:{bundle_id:this.bundle_id}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
function renderTagName(value,p,r){return'<a href="#" onclick="Ext.ux.vardb.tags.Services.editTag(\''+r.data.id+"')\">"+value+"</a>";
}var columns=[sm,{header:"Name",width:100,sortable:true,dataIndex:"name",renderer:renderTagName}];
var index,field;
for(index=0;
index<this.bundle.definitions.length;
index++){field=this.bundle.definitions[index];
columns.push({header:field.name,sortable:true,dataIndex:field.name,tooltip:field.description});
}columns.push({header:"Count",width:50,sortable:true,dataIndex:"numsequences"});
var editmenu=this.createSelectMenu();
var downloadmenu={text:"Download",menu:{items:[{text:"Download bundle",handler:function(btn){var dialog=new Ext.ux.vardb.tags.DownloadBundleDialog({grid:self});
}}]}};
var tbar=new Ext.PagingToolbar({plugins:new Ext.ux.Andrie.pPageSize({variations:[5,10,20,30,50,100]}),pageSize:this.pagesize,store:store,displayInfo:true,displayMsg:"{0} - {1} of {2}",emptyMsg:"No items to display",items:["-",editmenu,"-",downloadmenu]});
var config={viewConfig:{forceFit:true},store:store,columns:columns,sm:sm,tbar:tbar};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.tags.BundleTagGrid.superclass.initComponent.apply(this,arguments);
this.store.load({params:{start:0,limit:this.pagesize}});
}});
Ext.ux.vardb.tags.JoinGrid=Ext.extend(Ext.ux.vardb.Grid,{title:"Join",frame:false,autoWidth:true,autoHeight:true,enableColumnMove:true,stripeRows:true,loadMask:true,collapsible:false,animCollapse:false,pagesize:20,initComponent:function(){this.bundle_id=this.bundle.bundle_id;
var self=this;
var store=new Ext.data.Store({url:vardb.webapp+"/tags/ajax/join_by_bundle.json",reader:new Ext.data.JsonReader(),remoteSort:true,sortInfo:{field:"name",direction:"ASC"},baseParams:{bundle_id:this.bundle_id}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var r=Ext.ux.vardb.Renderer;
var columns=[sm,{header:"Accession",dataIndex:"accession",renderer:this.renderAccession},{header:"genome",dataIndex:"genome"},{header:"family",dataIndex:"family"},{header:"taxon",dataIndex:"taxon"},{header:"gene",dataIndex:"gene"},{header:"pseudogene",dataIndex:"pseudogene"},{header:"truncated",dataIndex:"truncated"},{header:"ntlength",dataIndex:"ntlength"},{header:"aalength",dataIndex:"aalength"}];
var index,field;
for(index=0;
index<this.bundle.definitions.length;
index++){field=this.bundle.definitions[index];
columns.push({header:field.name,sortable:false,dataIndex:this.bundle.name+"$"+field.name,tooltip:field.description});
}var editmenu=this.createSelectMenu();
var tbar=new Ext.PagingToolbar({plugins:new Ext.ux.Andrie.pPageSize({variations:[5,10,20,30,50,100]}),pageSize:this.pagesize,store:store,displayInfo:true,displayMsg:"{0} - {1} of {2}",emptyMsg:"No items to display",items:["-",editmenu]});
var config={viewConfig:{forceFit:true},store:store,columns:columns,sm:sm,tbar:tbar};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.tags.JoinGrid.superclass.initComponent.apply(this,arguments);
this.addListener("activate",function(tab){tab.store.load({params:{start:0,limit:tab.pagesize}});
});
},renderAccession:function(value,p,r){return String.format('<a href="#" onclick="vardb.sequencePopup(\'{0}\')">{1}</a>',r.data.accession,value);
}});
Ext.ux.vardb.tags.Bundles=Ext.extend(Ext.ux.vardb.Grid,{title:"Clinical data sets",frame:true,autoHeight:true,autoWidth:true,collapsible:false,stripeRows:true,initComponent:function(){var reader=new Ext.data.JsonReader({root:"rows",idProperty:"bundle_id",fields:[{name:"bundle_id",type:"int"},{name:"identifier"},{name:"name"},{name:"title"},{name:"description"},{name:"numtags",type:"int"},{name:"numsequences",type:"int"}]});
var store=new Ext.data.Store({reader:reader,data:this.data,sortInfo:{field:"name",direction:"ASC"}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var columns=[sm,{header:"Name",width:60,sortable:true,dataIndex:"name",renderer:this.renderName},{header:"Title",width:60,sortable:true,dataIndex:"title"},{header:"Description",width:100,sortable:true,dataIndex:"description"},{header:"Tags",width:20,sortable:true,align:"right",dataIndex:"numtags"},{header:"Sequences",width:20,sortable:true,align:"right",dataIndex:"numsequences"}];
var config={viewConfig:{forceFit:true},columns:columns,sm:sm,store:store};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.tags.Bundles.superclass.initComponent.apply(this,arguments);
},renderName:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/bundles/{1}.html">{0}</a>',value,record.data.identifier);
},renderCount:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/search/sequences.html?query=bundle={1}">{0}</a>',value,record.data.name);
}});
Ext.ux.vardb.tags.DefinitionDialog=Ext.extend(Ext.Window,{title:"Add attribute definition",width:400,closable:true,resizable:true,initComponent:function(){var nameField={xtype:"textfield",fieldLabel:"Name",name:"name"};
var typeField={xtype:"combo",hiddenName:"type",fieldLabel:"Type",store:"STRING,INTEGER,FLOAT".split(","),mode:"local",triggerAction:"all",emptyText:" ",selectOnFocus:true,value:"STRING"};
this.form=new Ext.FormPanel({labelWidth:50,url:"",defaults:{width:200,allowBlank:false},items:[nameField,typeField],buttons:[{text:"Submit",formBind:true,scope:this,handler:this.submitHandler},{text:"Cancel",scope:this,handler:function(){this.hide();
}}]});
var config={items:[this.form]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.tags.DefinitionDialog.superclass.initComponent.apply(this,arguments);
this.show();
},submitHandler:function(){var name=this.form.getForm().findField("name").getValue();
var type=this.form.getForm().findField("type").getValue();
var self=this;
var params={bundle_id:this.bundle_id,name:name,type:type};
Ext.ux.vardb.Vardb.ajaxRequest("/tags/ajax/definitions/add.json",params,function(definition){self.hide();
if(self.callback){self.callback();
}});
}});
Ext.ux.vardb.tags.DownloadBundleDialog=Ext.extend(Ext.Window,{title:"Download bundle",width:400,closable:true,resizable:true,initComponent:function(){var destinationField=this.createDestinationField();
this.form=new Ext.FormPanel({labelWidth:100,url:"",defaults:{width:230,allowBlank:false},defaultType:"textfield",items:[destinationField],buttons:[{text:"Download",formBind:true,scope:this,handler:this.submitHandler},{text:"Cancel",scope:this,handler:function(){this.hide();
}}]});
this.items=[this.form];
Ext.ux.vardb.tags.DownloadBundleDialog.superclass.initComponent.apply(this,arguments);
this.show();
},submitHandler:function(){var params={};
params.bundle_id=this.grid.bundle_id;
params.destination=this.form.getForm().findField("destination").getValue();
var ids=this.grid.getSelectedIds();
if(ids.length>0){params.ids=ids.join(",");
}var url="/tags/download/bundle.txt";
var href=Ext.ux.vardb.Vardb.buildHref(url,params);
Ext.ux.vardb.Vardb.openWindow(href);
this.hide();
},createDestinationField:function(){var options=[];
options.push(["SCREEN","Screen"]);
options.push(["FILE","File"]);
options.push(["XLS","Spreadsheet"]);
return this.createSelectList(options,"destination","To","SCREEN");
},createSelectList:function(data,fieldName,fieldLabel,value){var combo=new Ext.form.ComboBox({store:new Ext.data.ArrayStore({fields:["value","display"],data:data}),name:fieldName,fieldLabel:fieldLabel,valueField:"value",displayField:"display",width:150,mode:"local",triggerAction:"all",value:value,selectOnFocus:true,forceSelection:true});
return combo;
}});
Ext.ux.vardb.tags.EditBundleDialog=Ext.extend(Ext.util.Observable,{constructor:function(config){Ext.ux.vardb.tags.EditBundleDialog.superclass.constructor.call(this,config);
var dialog=this;
Ext.ux.vardb.Vardb.ajaxRequest("/tags/ajax/bundle.json",{name:name},function(bundle){dialog.createWindow(bundle);
});
},createWindow:function(bundle){this.bundle=bundle;
var tabs=[];
tabs.push({title:"Bundle",items:this.createForm(bundle)});
tabs.push({title:"Attribute definitions",autoScroll:true,items:this.createDefinitionsGrid(bundle)});
var tabpanel=new Ext.TabPanel({activeTab:0,deferredRender:false,border:false,defaults:{autoScroll:true},items:tabs});
var win=new Ext.Window({title:"Bundle: "+bundle.name,width:600,height:400,closable:true,plain:true,items:tabpanel,buttons:[{text:"Close",handler:function(){win.hide();
}}]});
this.win=win;
this.win.show();
return win;
},createForm:function(bundle){var dialog=this;
var nameField={xtype:"textfield",fieldLabel:"Name",name:"name",value:bundle.name};
var form=new Ext.FormPanel({labelWidth:50,url:"",defaults:{width:200,allowBlank:false},frame:true,items:[nameField],buttons:[{text:"Submit",formBind:true,handler:dialog.submitHandler},{text:"Cancel",handler:function(){dialog.win.hide();
}}]});
this.form=form;
return form;
},submitHandler:function(){var name=this.form.getForm().findField("name").getValue();
var params={bundle_id:this.bundle.bundle_id,name:name};
Ext.ux.vardb.Vardb.ajaxRequest("/tags/ajax/tags/new.json",params,function(json){alert(json.message);
});
},createDefinitionsGrid:function(bundle){var dialog=this;
var data=[];
var index,definition,row;
for(index=0;
index<bundle.definitions.length;
index++){definition=bundle.definitions[index];
row=[];
row.push(definition.id);
row.push(definition.name);
row.push(definition.description);
row.push(definition.type);
data.push(row);
}var store=new Ext.data.ArrayStore({fields:[{name:"id",type:"int"},{name:"name"},{name:"description"},{name:"type"}]});
store.loadData(data);
var menu={text:"Edit",menu:{items:[{text:"Add definition",handler:function(btn){this.addDefinition(bundle);
}},{text:"Delete definition(s)",handler:function(btn){this.deleteDefinitions(this.bundle_grid);
}}]}};
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var typeEditor=new Ext.form.ComboBox({store:new Ext.data.ArrayStore({fields:["value","display"],data:[["STRING","String"],["INTEGER","Integer"],["FLOAT","Float"],["BOOLEAN","Boolean"],["DATE","Date"]]}),valueField:"value",displayField:"display",value:"STRING",mode:"local",typeAhead:true,triggerAction:"all",listClass:"x-combo-list-small"});
var bundle_grid=new Ext.grid.EditorGridPanel({store:store,columns:[sm,{header:"Name",width:100,sortable:true,dataIndex:"name",editor:new Ext.form.TextField({})},{header:"Description",width:200,sortable:true,dataIndex:"description",editor:new Ext.form.TextField({})},{header:"Type",width:50,sortable:true,dataIndex:"type",editor:typeEditor}],stripeRows:true,sm:sm,autoWidth:true,autoHeight:true,frame:false,tbar:new Ext.Toolbar({items:[menu]}),listeners:{afteredit:function(e){this.updateDefinition(e);
}}});
this.bundle_grid=bundle_grid;
return bundle_grid;
},addDefinition:function(){var dialog=new Ext.ux.vardb.tags.DefinitionDialog({bundle_id:this.bundle.bundle_id,callback:function(definition){alert("reload grid to see new definition");
}});
},updateDefinition:function(e){if(e.originalValue===e.value){return;
}var params={bundle_id:this.bundle.bundle_id,definition_id:e.record.data.id,field:e.field,value:e.value};
Ext.ux.vardb.Vardb.ajaxRequest("/tags/ajax/definitions/update.json",params);
},deleteDefinitions:function(grid){var ids=grid.getSelectedIds();
if(ids.length<1){alert("No definitions selected");
return;
}var message="Really delete the selected definitions ("+ids.length+")? This will delete this attribute from all tags in this bundle.";
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,"/tags/ajax/definitions/delete.json",{name:name},function(json){var index,id,record;
var store=grid.getStore();
for(index=0;
index<ids.length;
index++){id=ids[index];
record=store.getAt(store.find("id",id));
store.remove(record);
}});
}});
Ext.ux.vardb.tags.EditTagDialog=Ext.extend(Ext.Window,{width:600,layout:"fit",height:400,closable:true,shadow:false,initComponent:function(){var tag=this.tag;
var self=this;
var form=this.createTagForm(tag);
var attributeGrid=this.createAttributeGrid(tag);
var sequenceGrid=new Ext.ux.vardb.SequenceGrid({resource:{type:"TAG",id:tag.tag_id},pagesize:20,filter:"tag="+tag.name});
var tabpanel=new Ext.TabPanel({activeTab:0,border:false,defaults:{layout:"fit"},deferredRender:false,items:[form,attributeGrid,sequenceGrid]});
var bundleButton=new Ext.Button({text:"Open bundle",formBind:true,scope:this,handler:function(){Ext.ux.vardb.tags.Services.showBundle(tag.bundle_id);
}});
var attachButton=new Ext.Button({text:"Attach bundle",formBind:true,scope:this,handler:function(){this.attachBundle(tag.bundle_id);
self.hide();
}});
var closeButton=new Ext.Button({text:"Close",formBind:true,handler:function(){self.hide();
}});
var buttons=[];
buttons.push(bundleButton);
if(tag.readonly){buttons.push(attachButton);
}buttons.push(closeButton);
var config={title:"Tag: "+tag.name+" (Bundle: "+tag.bundle_name+")",items:tabpanel,buttons:buttons};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.tags.EditTagDialog.superclass.initComponent.apply(this,arguments);
this.show();
},createTagForm:function(tag){var form;
function submitHandler(){var params=form.getForm().getValues();
params.tag_id=tag.tag_id;
Ext.ux.vardb.Vardb.ajaxRequest("/tags/ajax/tags/update.json",params,function(attribute){Ext.MessageBox.alert("Success","Tag updated");
});
}var nameField={xtype:"textfield",fieldLabel:"Name",name:"name",value:tag.name,disabled:tag.readonly,width:200,allowBlank:false,vtype:"alphanum"};
var descriptionField={xtype:"textfield",fieldLabel:"Description",name:"description",value:tag.description,disabled:tag.readonly,allowBlank:true,width:400};
var colorField=new Ext.ux.ColorField({fieldLabel:"Color",name:"color",value:tag.color,showHexValue:true});
var bgcolorField=new Ext.ux.ColorField({fieldLabel:"Background",name:"bgcolor",value:tag.bgcolor,showHexValue:true});
var submitButton=new Ext.Button({text:"Submit",formBind:true,handler:submitHandler});
var items=[nameField,descriptionField];
if(!tag.readonly){items.push(colorField);
items.push(bgcolorField);
}var buttons=[];
if(!tag.readonly){buttons.push(submitButton);
}form=new Ext.FormPanel({layout:"form",labelWidth:70,frame:true,monitorValid:true,items:items,buttons:buttons});
var tab={title:"Tag",items:form};
return tab;
},createAttributeGrid:function(tag){var self=this;
var grid;
function updateAttribute(e){if(tag.readonly){Ext.MessageBox.alert("Warning","This bundle is read-only");
return;
}if(e.originalValue===e.value){return;
}var params={tag_id:tag.tag_id,attribute_id:e.record.data.id,field:e.field,value:e.value};
Ext.ux.vardb.Vardb.ajaxRequest("/tags/ajax/attributes/update.json",params);
}var data=[];
var index,attribute,row;
for(index=0;
index<tag.attributes.length;
index++){attribute=tag.attributes[index];
row=[];
row.push(attribute.id);
row.push(attribute.name);
row.push(attribute.value);
row.push(attribute.type);
data.push(row);
}var store=new Ext.data.ArrayStore({id:0,fields:[{name:"id",type:"int"},{name:"name"},{name:"value"},{name:"type"}]});
store.loadData(data);
var menu={text:"Edit",disabled:tag.readonly,menu:{items:[{text:"Add attribute",handler:function(btn){self.addAttribute(grid,tag.tag_id);
}},{text:"Delete attribute(s)",handler:function(btn){self.deleteAttributes(grid);
}}]}};
var tbar=new Ext.Toolbar({items:[menu]});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var typeEditor=new Ext.form.ComboBox({store:new Ext.data.ArrayStore({fields:["value","display"],data:[["STRING","String"],["INTEGER","Integer"],["FLOAT","Float"],["BOOLEAN","Boolean"],["DATE","Date"]]}),valueField:"value",displayField:"display",value:"STRING",mode:"local",typeAhead:true,triggerAction:"all",listClass:"x-combo-list-small"});
var nameColumn={header:"Name",width:100,sortable:true,dataIndex:"name"};
var valueColumn={header:"Value",width:200,sortable:true,dataIndex:"value"};
var typeColumn={header:"Type",width:50,sortable:true,dataIndex:"type"};
if(!tag.readonly){nameColumn.editor=new Ext.form.TextField({});
valueColumn.editor=new Ext.form.TextField({});
typeColumn.editor=typeEditor;
}grid=new Ext.grid.EditorGridPanel({title:"Attributes",store:store,columns:[sm,nameColumn,valueColumn,typeColumn],viewConfig:{forceFit:true},stripeRows:true,sm:sm,autoWidth:true,autoScroll:true,tbar:tbar,listeners:{afteredit:function(e){updateAttribute(e);
}}});
return grid;
},addAttribute:function(grid,tag_id){var dialog=new Ext.ux.vardb.tags.AttributeDialog({tag_id:tag_id,callback:function(attribute){var record=[attribute.id,attribute.name,attribute.value,attribute.type];
var records=[record];
grid.getStore().loadData(records,true);
}});
},deleteAttributes:function(grid){var ids=grid.getSelectedIds();
if(ids.length<1){alert("No attributes selected");
return;
}var message="Delete the selected attributes ("+ids.length+")?";
var params={tag_id:this.tag.tag_id,ids:ids.join(",")};
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,"/tags/ajax/attributes/delete.json",params,function(json){var store=grid.getStore();
var index,id,record;
for(index=0;
index<ids.length;
index++){id=ids[index];
record=store.getAt(store.find("id",id));
store.remove(record);
}});
},untagSequences:function(grid,tag_id){var ids=grid.getSelectedIds();
var total=ids.length;
if(total===0){total=grid.store.getTotalCount();
}var message="Un-tag the selected sequences ("+total+")?";
var params={tag_id:tag_id,ids:ids.join(",")};
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,"/tags/ajax/tags/remove.json",params,function(tag){grid.getStore().reload();
});
},attachBundle:function(bundle_id){var message="Add this reference bundle to the workspace?";
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,"/tags/ajax/bundles/attach.json",{},function(bundle){Ext.MessageBox.alert("Success","Reference bundle attached");
if(explorer){explorer.addBundle(bundle.bundle_id);
}});
}});
Ext.ux.vardb.tags.JoinDialog=Ext.extend(Ext.Window,{title:"Create join",width:800,height:400,closable:true,autoScroll:true,initComponent:function(){var items=[];
items.push(this.createDestinationCombo());
items.push(this.createPropertyCheckboxGroup());
var index,bundle,checkbox;
for(index=0;
index<this.bundles.rows.length;
index++){bundle=this.bundles.rows[index];
if(bundle.definitions.length>0){items.push(this.createBundleCheckboxGroup(bundle));
}}this.form=new Ext.FormPanel({items:items});
var config={items:this.form,buttons:[{text:"Close",scope:this,handler:function(){this.hide();
}},{text:"Create",scope:this,handler:function(){this.createJoin();
}}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.tags.JoinDialog.superclass.initComponent.apply(this,arguments);
this.show();
},createDestinationCombo:function(){var destinationCombo=new Ext.ux.vardb.SelectList({data:[["SCREEN","Screen"],["FILE","File"],["XLS","Spreadsheet"]],name:"destination",fieldLabel:"Destination",value:"SCREEN",emptyText:" ",width:230});
return destinationCombo;
},createPropertyCheckboxGroup:function(){var maxcolumns=6;
var items=[];
var index,property,item;
for(index=0;
index<this.properties.length;
index++){property=this.properties[index];
item={boxLabel:property,name:"property."+property};
if(property==="accession"){item.checked=true;
}items.push(item);
}var checkboxes={xtype:"xcheckboxgroup",hideLabel:true,columns:maxcolumns,items:items};
var fieldset={xtype:"fieldset",title:"Sequence properties",autoHeight:true,collapsible:true,collapsed:false,items:checkboxes};
return fieldset;
},createBundleCheckboxGroup:function(bundle){var items=[],index,definition,item;
var checked=(this.bundles.rows.length===1);
for(index=0;
index<bundle.definitions.length;
index++){definition=bundle.definitions[index];
item={boxLabel:definition.name,name:bundle.bundle_id+"."+definition.id,checked:checked};
items.push(item);
}var checkboxes={xtype:"checkboxgroup",hideLabel:true,columns:bundle.definitions.length>4?4:bundle.definitions.length,items:items};
var fieldset={xtype:"fieldset",title:"Bundle: "+bundle.name,collapsible:true,autoHeight:true,items:checkboxes};
return fieldset;
},createJoin:function(){var properties=[],bundle_ids=[],definition_ids=[];
var values=this.form.getForm().getValues(true).split("&");
var index,value,start,before,after;
for(index=0;
index<values.length;
index++){value=values[index];
start=value.indexOf(".");
if(start===-1){continue;
}before=value.substring(0,start);
after=value.substring(start+1);
if(after.indexOf("=on")!==-1){after=after.substring(0,after.indexOf("=on"));
}if(before==="property"){properties.push(after);
}else{if(bundle_ids.indexOf(before)===-1){bundle_ids.push(before);
}definition_ids.push(after);
}}var params={destination:this.form.getForm().findField("destination").getValue(),properties:properties.join(","),bundle_ids:bundle_ids.join(","),definition_ids:definition_ids.join(",")};
if(this.list_id){params.list_id=this.list_id;
}var url=Ext.ux.vardb.Vardb.buildHref("/tags/download/join.txt",params);
Ext.ux.vardb.Vardb.openWindow(url);
},properties:["accession","genome","chromosome","family","ortholog","rating","udate","division","natype","circular","ref","taxon","country","subregion","collection_date","strain","serogroup","serotype","clone","segment","specific_host","isolate","isolation_source","mol_type","locus","gene","locus_tag","allele","pseudogene","start","end","strand","splicing","domains","sequence","ntlength","spliced","geneid","plasmid","codon_start","transl_table","product","translation","aalength","protein","protein_gi","protein_id","gi","uniprot","molwt","ec"]});
Ext.ux.vardb.tags.NamePromptDialog=Ext.extend(Ext.Window,{width:250,closable:true,resizable:false,initComponent:function(){this.title="New "+this.type;
var nameField={xtype:"textfield",fieldLabel:"Enter a name for the "+this.type,name:"name",width:220,allowBlank:false,vtype:"alphanum"};
this.form=new Ext.FormPanel({labelAlign:"top",border:false,frame:true,items:[nameField],buttons:[{text:"Submit",formBind:true,scope:this,handler:this.submitHandler},{text:"Cancel",scope:this,handler:function(){this.hide();
}}]});
this.items=[this.form];
Ext.ux.vardb.tags.NamePromptDialog.superclass.initComponent.apply(this,arguments);
this.show();
},submitHandler:function(){if(!this.form.getForm().isValid()){return;
}var name=this.form.getForm().findField("name").getValue().trim();
if(name===""){Ext.MessageBox.alert("Alert","Name is blank");
return;
}this.hide();
if(this.callback){this.callback(name);
}}});
Ext.ux.vardb.tags.NewTagDialog=Ext.extend(Ext.Window,{title:"Create a new tag",width:400,closable:true,resizable:true,initComponent:function(){var nameField={xtype:"textfield",fieldLabel:"Tag",name:"name",value:"",allowBlank:true,validateOnBlur:false,vtype:"alphanum"};
this.form=new Ext.FormPanel({labelWidth:50,url:"",defaults:{width:230,allowBlank:false},monitorValid:true,items:[nameField],buttons:[{text:"Submit",formBind:true,scope:this,handler:this.submitHandler},{text:"Cancel",scope:this,handler:function(){this.hide();
}}]});
var config={items:[this.form]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.tags.NewTagDialog.superclass.initComponent.apply(this,arguments);
this.show();
},submitHandler:function(){var win=this;
var name=this.form.getForm().findField("name").getValue();
var message='Create new tag "'+name+'"?';
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,"/tags/ajax/tags/new.json",{name:name},function(tag){win.hide();
win.callback(tag);
});
}});
(Ext.ux.vardb.tags.Services=function(){return{createBundle:function(callback){var dialog=new Ext.ux.vardb.tags.NamePromptDialog({type:"bundle",callback:function(name){Ext.ux.vardb.Vardb.ajaxRequest("/tags/ajax/bundles/new.json",{name:name},callback);
}});
},deleteBundle:function(bundle_id,callback){var message="Delete/detach this bundle?";
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,"/tags/ajax/bundles/delete.json",{bundle_id:bundle_id},function(json){if(callback){callback(bundle_id);
}});
},editTag:function(tag_id){Ext.ux.vardb.Vardb.ajaxRequest("/tags/ajax/tags/tag.json",{tag_id:tag_id},function(tag){var dialog=new Ext.ux.vardb.tags.EditTagDialog({tag:tag});
});
},showBundle:function(bundle_id){Ext.ux.vardb.Vardb.ajaxRequest("/tags/ajax/bundle.json",{bundle_id:bundle_id,start:0,limit:0},function(bundle){var dialog=new Ext.ux.vardb.tags.BundleDialog({bundle:bundle});
});
},joinByBundle:function(bundle_id){Ext.ux.vardb.Vardb.ajaxRequest("/tags/ajax/bundles.json",{bundle_ids:bundle_id},function(bundles){var dialog=new Ext.ux.vardb.tags.JoinDialog({bundles:bundles});
});
},createTagCloudFromFilter:function(filter){Ext.ux.vardb.Vardb.ajaxRequest("/tags/ajax/tagcloud.json",{filter:filter},function(tagcloud){var dialog=new Ext.ux.vardb.tags.TagCloud({tagcloud:tagcloud});
});
},createTagCloudFromQuery:function(id,filter){Ext.ux.vardb.Vardb.ajaxRequest("/search/ajax/tagcloud.json",{id:id},function(tagcloud){var dialog=new Ext.ux.vardb.tags.TagCloud({tagcloud:tagcloud});
});
},formatTag:function(tag){var title="["+tag.bundle_name+"]";
if(tag.description!==""){title+=tag.description;
}var color=tag.readonly?"gray":tag.color;
var bgcolor=tag.readonly?"white":tag.bgcolor;
var style="color:"+color+";background-color:"+bgcolor+";";
var str='<a href="javascript:Ext.ux.vardb.tags.Services.editTag('+tag.id+')" title="'+title+'" style="'+style+'">'+tag.name+"</a>";
return str;
},createTag:function(name,callback){var message='Create new tag "'+name+'"?';
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,"/tags/ajax/tags/new.json",{name:name},callback);
},tagSequencesById:function(tag_id,ids,callback){var message="Tag the selected sequences ("+ids.length+")?";
var params={tag_id:tag_id,ids:ids.join(",")};
this.submitTagUpdate(message,"/tags/ajax/tag_sequences_by_id.json",params,callback);
},tagSequencesByList:function(tag_id,list_id,filter,total,callback){var message="Tag the selected sequences ("+total+")?";
var params={tag_id:tag_id,list_id:list_id,filter:filter};
this.submitTagUpdate(message,"/tags/ajax/tag_sequences_by_list.json",params,callback);
},tagSequencesByFilter:function(tag_id,filter,total,callback){var message="Tag the selected sequences ("+total+")?";
var params={tag_id:tag_id,filter:filter};
this.submitTagUpdate(message,"/tags/ajax/tag_sequences_by_filter.json",params,callback);
},submitTagUpdate:function(message,url,params,callback){Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,url,params,function(json){Ext.ux.vardb.Vardb.info(json.message);
if(callback){callback(json);
}});
},untagSequences:function(grid,callback){var ids=grid.getSelectedIds();
var total=ids.length;
if(total===0){Ext.MessageBox.alert("Warning","No sequences selected");
return;
}var message="Un-tag the selected sequences ("+total+")?";
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,"/tags/ajax/untag.json",{ids:ids.join(",")},callback);
}};
}());
Ext.ux.vardb.tags.SummaryDialog=Ext.extend(Ext.Window,{title:"Summary",width:400,height:400,closable:true,autoScroll:true,initComponent:function(){var self=this;
var reader=new Ext.data.JsonReader({root:"values",idProperty:"name",fields:[{name:"name"},{name:"value"},{name:"numsequences",type:"int"}]});
var store=new Ext.data.GroupingStore({url:vardb.webapp+"/tags/ajax/analysis/bundles/summarize.json",reader:reader,sortInfo:{field:"value",direction:"ASC"},groupField:"name",baseParams:{bundle_id:this.bundle_id}});
store.load();
var grid=new Ext.ux.vardb.Grid({store:store,columns:[{header:"Name",sortable:true,dataIndex:"name"},{header:"Value",width:100,sortable:true,dataIndex:"value"},{header:"Count",width:25,sortable:true,dataIndex:"numsequences"}],view:new Ext.grid.GroupingView({forceFit:true,hideGroupedColumn:true,groupTextTpl:'{text} ({[values.rs.length]} {[values.rs.length > 1 ? "distinct values" : "distinct value"]})'}),stripeRows:true,autoWidth:true,autoHeight:true});
var config={items:[grid],buttons:[{text:"Close",handler:function(){self.hide();
}}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.tags.SummaryDialog.superclass.initComponent.apply(this,arguments);
this.show();
}});
Ext.ux.vardb.tags.TagCloud=Ext.extend(Ext.Window,{layout:"fit",width:600,height:400,title:"Tag clouds",autoScroll:true,maximizable:true,bodyStyle:"background-color: white; padding: 3px",initComponent:function(){var buffer=[],facet,tag,i,j;
for(i=0;
i<this.tagcloud.facets.length;
i++){facet=this.tagcloud.facets[i];
if(facet.tags.length>0){buffer.push(this.formatFacet(facet));
}}var html=buffer.join("\n");
var config={html:html,buttons:[{text:"Close",scope:this,handler:function(){this.hide();
}}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.tags.TagCloud.superclass.initComponent.apply(this,arguments);
this.show();
},formatFacet:function(facet){var tags=[],tag,index,html;
for(index=0;
index<facet.tags.length;
index++){tag=facet.tags[index];
html='<a href="#" onclick="'+this.formatLink(tag)+'" style="font-size:'+tag.fontsize+'pt;text-decoration:none;">';
html+=tag.name.replace(" ","&nbsp;")+"&nbsp;("+tag.numsequences+")";
html+="</a>";
tags.push(html);
}var buffer=[];
buffer.push('<h2 style="color:#3764A0;border-bottom:2px solid #99BBE8;">'+facet.name+"&nbsp;("+facet.tags.length+" tags)</h2>");
buffer.push(tags.join("&nbsp; "));
buffer.push("<br/><br/>");
return buffer.join("\n");
},formatLink:function(tag){return"Ext.ux.vardb.popup('"+tag.resourceType+"','"+tag.identifier+"')";
}});
Ext.ux.vardb.tags.UploadBundleDialog=Ext.extend(Ext.Window,{title:"Upload bundle",width:600,closable:true,resizable:true,initComponent:function(){this.addEvents({bundleuploaded:true});
var nameField={xtype:"textfield",fieldLabel:"Name",name:"name",value:"",width:400,allowBlank:true};
var uploadField={xtype:"fileuploadfield",emptyText:"Upload a tab-delimited tag file",fieldLabel:"File",name:"bundlefile",width:400,buttonText:"",buttonCfg:{iconCls:"upload-icon"}};
var textField={xtype:"textarea",fieldLabel:"Text",name:"bundletext",value:"",width:400,height:200,allowBlank:true};
this.form=new Ext.FormPanel({fileUpload:true,url:"",defaults:{width:230,labelWidth:50},defaultType:"textfield",items:[nameField,uploadField,textField],buttons:[{text:"Upload",formBind:true,scope:this,handler:this.submitHandler},{text:"Cancel",scope:this,handler:function(){this.hide();
}}]});
this.items=[this.form];
Ext.ux.vardb.tags.UploadBundleDialog.superclass.initComponent.apply(this,arguments);
this.show();
},submitHandler:function(){if(!this.form.getForm().isValid()){return;
}var win=this;
this.form.getForm().submit({url:vardb.webapp+"/tags/ajax/bundles/upload.json",waitMsg:"Uploading bundle file",scope:this,failure:Ext.ux.vardb.Vardb.onFormFailure,success:function(form,action){var bundle=action.result;
win.hide();
Ext.MessageBox.alert("Success",bundle.message);
this.fireEvent("bundleuploaded",bundle);
}});
}});
Ext.ux.vardb.tags.UploadJoinDialog=Ext.extend(Ext.Window,{title:"Upload join",width:600,closable:true,resizable:true,initComponent:function(){var orderCombo=new Ext.ux.vardb.SelectList({data:[["SEQUENCE_TAG","Sequence, Tag"],["TAG_SEQUENCE","Tag, Sequence"]],hiddenName:"columnorder",fieldLabel:"Column order",value:"SEQUENCE_TAG"});
var uploadField={xtype:"fileuploadfield",emptyText:"Upload a tab-delimited join file",fieldLabel:"File",name:"joinfile",width:400,buttonText:"",buttonCfg:{iconCls:"upload-icon"}};
this.form=new Ext.FormPanel({fileUpload:true,labelWidth:80,defaults:{width:230},defaultType:"textfield",items:[orderCombo,uploadField],buttons:[{text:"Upload",formBind:true,scope:this,handler:this.submitHandler},{text:"Cancel",scope:this,handler:function(){this.hide();
}}]});
this.items=[this.form];
Ext.ux.vardb.tags.UploadJoinDialog.superclass.initComponent.apply(this,arguments);
this.show();
},submitHandler:function(){if(!this.form.getForm().isValid()){return;
}var self=this;
this.form.getForm().submit({url:vardb.webapp+"/tags/ajax/joins/upload.json",params:{bundle_id:self.bundle_id},waitMsg:"Uploading bundle file",failure:Ext.ux.vardb.Vardb.onFormFailure,success:function(form,action){var json=action.result;
self.hide();
Ext.MessageBox.alert("Success",json.message);
if(self.callback){self.callback(json);
}}});
}});
Ext.ux.vardb.tags.UploadTagsDialog=Ext.extend(Ext.Window,{title:"Upload tags",width:600,closable:true,resizable:true,initComponent:function(){var titleField={xtype:"label",html:"<b>Add tags and attributes either by file upload or by pasting into box</b><br/>"};
var idField={xtype:"hidden",name:"bundle_id",value:this.bundle_id};
var uploadField={xtype:"fileuploadfield",emptyText:"Upload a tab-delimited tag file",fieldLabel:"File",name:"bundlefile",width:400,buttonText:"",buttonCfg:{iconCls:"upload-icon"}};
var textField={xtype:"textarea",fieldLabel:"Text",name:"bundletext",width:400,height:200,allowBlank:true};
this.form=new Ext.FormPanel({fileUpload:true,url:"",defaults:{width:230,labelWidth:50},defaultType:"textfield",items:[titleField,idField,uploadField,textField],buttons:[{text:"Upload",formBind:true,scope:this,handler:this.submitHandler},{text:"Cancel",scope:this,handler:function(){this.hide();
}}]});
this.items=[this.form];
Ext.ux.vardb.tags.UploadTagsDialog.superclass.initComponent.apply(this,arguments);
this.show();
},submitHandler:function(){if(!this.form.getForm().isValid()){return;
}var win=this;
this.form.getForm().submit({url:vardb.webapp+"/tags/ajax/tags/upload.json",waitMsg:"Uploading bundle file",failure:Ext.ux.vardb.Vardb.onFormFailure,success:function(form,action){var bundle=action.result;
win.hide();
Ext.MessageBox.alert("Success",bundle.message);
if(win.callback){win.callback(bundle);
}}});
}});
Ext.ux.vardb.Popup=Ext.extend(Ext.Window,{layout:"fit",width:600,height:360,closable:true,resizable:true,plain:true,shim:true,initComponent:function(){var config={layout:"fit",width:600,height:360,closable:true,resizable:true,plain:true,buttons:[{text:"Close",scope:this,handler:function(){this.hide();
}}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.Popup.superclass.initComponent.apply(this,arguments);
this.show();
},createTabPanel:function(tabs){var tabpanel=new Ext.TabPanel({activeTab:0,autoScroll:true,defaults:{layout:"fit"},deferredRender:false,items:tabs});
return tabpanel;
},addField:function(fields,data,header,dataIndex,renderer){if(!data[dataIndex]||data[dataIndex]===""){return;
}var field={dataIndex:dataIndex,header:header};
if(renderer){field.renderer=renderer;
}fields.push(field);
},createPropertyGrid:function(fields,data){var grid=new Ext.ux.grid.PropertyGrid({title:"Properties",autoHeight:true,disableSelection:true,stripeRows:true,editable:false,nameWidth:100,fields:fields,source:data});
return grid;
}});
Ext.ux.vardb.SequencePopup=Ext.extend(Ext.ux.vardb.Popup,{initComponent:function(){var tabs=[];
tabs.push(this.createPropertyTab(this.data));
this.createNucleotideSequenceTab(this.data,tabs);
this.createCodingSequenceTab(this.data,tabs);
this.createTranslationTab(this.data,tabs);
this.createTagsTab(this.data,tabs);
this.createGcContentTab(this.data,tabs);
this.createImageTab(this.data,tabs);
var config={title:"Sequence: "+this.data.accession,items:this.createTabPanel(tabs)};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.SequencePopup.superclass.initComponent.apply(this,arguments);
},createPropertyTab:function(data){var self=this;
var fields=[];
this.addField(fields,data,"Accession","accession",this.renderAccession);
this.addField(fields,data,"Rating","rating");
this.addField(fields,data,"Taxon","taxon_name",function(value){return String.format('<a href="#" onclick="vardb.taxonPopup(\'{1}\')">{0}</a>',value,data.taxon_identifier);
});
this.addField(fields,data,"Disease","disease_name",function(value){return String.format('<a href="#" onclick="vardb.diseasePopup(\'{1}\')">{0}</a>',value,data.disease_identifier);
});
this.addField(fields,data,"Pathogen","pathogen_name",function(value){return String.format('<a href="#" onclick="vardb.pathogenPopup(\'{1}\')">{0}</a>',value,data.pathogen_identifier);
});
this.addField(fields,data,"Ortholog","ortholog_name",function(value){return String.format('<a href="#" onclick="vardb.orthologPopup(\'{1}\')">{0}</a>',value,data.ortholog_identifier);
});
this.addField(fields,data,"Family","family_name",function(value){return String.format('<a href="#" onclick="vardb.familyPopup(\'{1}\')">{0}</a>',value,data.family_identifier);
});
this.addField(fields,data,"Subgroup","subgroup_name",function(value){return String.format('<a href="#" onclick="vardb.subgroupPopup(\'{1}\')">{0}</a>',value,data.subgroup_identifier);
});
this.addField(fields,data,"Country","country_name",function(value){return String.format('<a href="#" onclick="vardb.countryPopup(\'{1}\')">{0}</a>',value,data.country_identifier);
});
this.addField(fields,data,"Ref","ref_name",function(value){return String.format('<a href="#" onclick="vardb.refPopup(\'{1}\')">{0}</a>',value,data.ref_identifier);
});
this.addField(fields,data,"Strain","strain");
this.addField(fields,data,"Pseugodene","pseudogene");
this.addField(fields,data,"Truncated","truncated");
this.addField(fields,data,"Location","location");
this.addField(fields,data,"Locus tag","locus_tag");
this.addField(fields,data,"Description","defline");
this.addField(fields,data,"Gene","gene");
this.addField(fields,data,"Product","product");
this.addField(fields,data,"UniProt","uniprot");
this.addField(fields,data,"Date","udate");
this.addField(fields,data,"Length","ntlength");
this.addField(fields,data,"Isolate","isolate");
this.addField(fields,data,"Division","division");
this.addField(fields,data,"Natype","natype");
this.addField(fields,data,"Collection date","collection_date");
this.addField(fields,data,"Serotype","serotype");
this.addField(fields,data,"Serogroup","serogroup");
this.addField(fields,data,"Serovar","serovar");
this.addField(fields,data,"Subtype","subtype");
this.addField(fields,data,"Clone","clone");
this.addField(fields,data,"Segment","segment");
this.addField(fields,data,"Host","host");
this.addField(fields,data,"Specific host","specific_host");
this.addField(fields,data,"Lab host","lab_host");
this.addField(fields,data,"Isolation source","isolation_source");
this.addField(fields,data,"Molecule type","mol_type");
this.addField(fields,data,"Locus","locus");
this.addField(fields,data,"Allele","allele");
this.addField(fields,data,"Strand","strand");
this.addField(fields,data,"Geneid","geneid");
this.addField(fields,data,"Plasmid","plasmid");
this.addField(fields,data,"Codon start","codon_start");
this.addField(fields,data,"Translation table","transl_table");
this.addField(fields,data,"Protein","protein");
this.addField(fields,data,"Protein ID","protein_id");
this.addField(fields,data,"GI","gi");
this.addField(fields,data,"Molecular weight","molwt");
this.addField(fields,data,"EC number","ec");
this.addField(fields,data,"Architecture","architecture");
this.addField(fields,data,"Method","method");
this.addField(fields,data,"Model","model");
this.addField(fields,data,"Score","score");
this.addField(fields,data,"E-value","evalue");
return this.createPropertyGrid(fields,data);
},renderAccession:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/sequences/{1}.html" target="_new">{0}</a>',value,value);
},formatSequence:function(accession,sequence){var template=new Ext.XTemplate('<p style="font-family:monospace;">',">{accession}<br/>",'<tpl for="chunks">',"{line}<br/>","</tpl>","</p>");
var chunks=Ext.ux.vardb.Renderer.chunkSequence(sequence,80);
return template.apply({accession:accession,chunks:chunks});
},formatImage:function(sequence){return'<img src="'+vardb.webapp+"/graphics/sequence.img?identifier="+sequence.identifier+'"/>';
},createNucleotideSequenceTab:function(sequence,tabs){if(!sequence.sequence){return;
}var tab={title:"Nucleotide sequence",autoScroll:true,html:this.formatSequence(sequence.accession,sequence.sequence)};
tabs.push(tab);
},createCodingSequenceTab:function(sequence,tabs){if(!sequence.codingSequence){return;
}var tab={title:"Coding sequence",autoScroll:true,html:this.formatSequence(sequence.accession,sequence.codingSequence)};
tabs.push(tab);
},createTranslationTab:function(sequence,tabs){if(!sequence.translation){return;
}var tab={title:"Translation",autoScroll:true,html:this.formatSequence(sequence.accession,sequence.translation)};
tabs.push(tab);
},createTagsTab:function(sequence,tabs){if(sequence.tags.length===0){return;
}var data=[];
var index,tag,row;
for(index=0;
index<sequence.tags.length;
index++){tag=sequence.tags[index];
row=[];
row.push(tag.id);
row.push(tag.name);
data.push(row);
}var store=new Ext.data.JsonStore({fields:[{name:"id",type:"int"},{name:"name"}]});
store.loadData(data);
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
function renderTag(value,p,r){return'<a href="#" onclick="Ext.ux.vardb.tags.Services.editTag(\''+r.data.id+"')\">"+value+"</a><br/>";
}var grid=new Ext.ux.vardb.Grid({title:"Tags",store:store,columns:[sm,{header:"Tag",width:100,sortable:true,dataIndex:"name",renderer:renderTag}],viewConfig:{forceFit:true},sm:sm,stripeRows:true,autoWidth:true,autoHeight:true});
tabs.push(grid);
},createImageTab:function(sequence,tabs){var tab={title:"Image",autoScroll:true,html:this.formatImage(sequence)};
tabs.push(tab);
},createGcContentTab:function(sequence,tabs){if(!sequence.sequence){return;
}var tab=new Ext.ux.vardb.GcChart({sequence:sequence.sequence,title:"GC Content"});
tabs.push(tab);
}});
Ext.ux.vardb.PathogenPopup=Ext.extend(Ext.ux.vardb.Popup,{initComponent:function(){var tabs=[];
tabs.push(this.createPropertyTab(this.data));
tabs.push(this.createGrid(this.data.families,"Families",Ext.ux.vardb.Renderer.renderFamilyPopup));
tabs.push(this.createGrid(this.data.diseases,"Diseases",Ext.ux.vardb.Renderer.renderDiseasePopup));
tabs.push(this.createSequenceTab(this.data));
var config={title:"Pathogen: "+this.data.name,items:this.createTabPanel(tabs)};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.PathogenPopup.superclass.initComponent.apply(this,arguments);
},createPropertyTab:function(data){var fields=[];
this.addField(fields,data,"Identifier","identifier");
this.addField(fields,data,"Name","name");
this.addField(fields,data,"Description","description");
this.addField(fields,data,"Type","dtype");
this.addField(fields,data,"Distribution","distribution");
this.addField(fields,data,"Lifecycle","lifecycle");
this.addField(fields,data,"Chromosomes","chromosomes");
this.addField(fields,data,"GC content","gccontent");
this.addField(fields,data,"Genes","numgenes");
this.addField(fields,data,"Proteins","numproteins");
this.addField(fields,data,"Bases","numbases");
this.addField(fields,data,"Antigenic variation","antigenicvariation");
return this.createPropertyGrid(fields,data);
},createGrid:function(data,title,renderName){var store=new Ext.data.JsonStore({fields:[{name:"id",type:"int"},{name:"resourceType"},{name:"identifier"},{name:"name"},{name:"description"},{name:"numsequences",type:"int"}],sortInfo:{field:"name",direction:"ASC"}});
store.loadData(data);
var grid=new Ext.ux.vardb.Grid({store:store,columns:[{header:"Name",width:50,sortable:true,dataIndex:"name",renderer:renderName},{header:"Description",width:300,sortable:true,dataIndex:"description"}],viewConfig:{forceFit:true},title:title,stripeRows:true,autoWidth:true,autoHeight:true});
return grid;
},createSequenceTab:function(data){var grid=new Ext.ux.vardb.SequenceGrid({resource:{type:"PATHOGEN",id:data.id},filter:"pathogen="+data.identifier,pagesize:10});
return grid;
}});
Ext.ux.vardb.FamilyPopup=Ext.extend(Ext.ux.vardb.Popup,{initComponent:function(){var tabs=[];
tabs.push(this.createPropertyTab(this.data));
if(this.data.subgroups.length>0){tabs.push(this.createSubgroupGrid(this.data.subgroups));
}tabs.push(this.createSequenceTab(this.data));
var config={title:"Family: "+this.data.name,items:this.createTabPanel(tabs)};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.FamilyPopup.superclass.initComponent.apply(this,arguments);
},createPropertyTab:function(data){var fields=[];
this.addField(fields,data,"Identifier","identifier");
this.addField(fields,data,"Name","name");
this.addField(fields,data,"Description","description");
this.addField(fields,data,"Pathogen","pathogen_name");
this.addField(fields,data,"Alias","alias");
this.addField(fields,data,"Antigenic variation","antigenicvariation");
this.addField(fields,data,"Ortholog","ortholog_name");
this.addField(fields,data,"Family size","familysize");
this.addField(fields,data,"Switching rate","switchingrate");
this.addField(fields,data,"Chromosomes","chromosomes");
this.addField(fields,data,"Expression","expression");
this.addField(fields,data,"Introns","introns");
this.addField(fields,data,"Protein","protein");
this.addField(fields,data,"Daltons","daltons");
this.addField(fields,data,"Ligands","ligands");
return this.createPropertyGrid(fields,data);
},createSubgroupGrid:function(data,title){var store=new Ext.data.JsonStore({fields:[{name:"id",type:"int"},{name:"resourceType"},{name:"identifier"},{name:"name"},{name:"description"},{name:"numsequences",type:"int"}],sortInfo:{field:"name",direction:"ASC"}});
store.loadData(data);
var grid=new Ext.ux.vardb.Grid({store:store,columns:[{header:"Name",width:50,sortable:true,dataIndex:"name",renderer:Ext.ux.vardb.Renderer.renderSubgroupPopup},{header:"Description",width:300,sortable:true,dataIndex:"description"}],viewConfig:{forceFit:true},title:"Subgroups",stripeRows:true,autoWidth:true,autoHeight:true});
return grid;
},createSequenceTab:function(data){var grid=new Ext.ux.vardb.SequenceGrid({resource:{type:"FAMILY",id:data.id},filter:"family="+data.identifier,pagesize:10});
return grid;
}});
Ext.ux.vardb.DiseasePopup=Ext.extend(Ext.ux.vardb.Popup,{initComponent:function(){var tabs=[];
tabs.push(this.createPropertyTab(this.data));
tabs.push(this.createPathogenGrid(this.data.pathogens));
tabs.push(this.createDrugGrid(this.data.drugs));
tabs.push(this.createSequenceTab(this.data));
var config={title:"Disease: "+this.data.name,items:this.createTabPanel(tabs)};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.DiseasePopup.superclass.initComponent.apply(this,arguments);
},createPropertyTab:function(data){var fields=[];
this.addField(fields,data,"Identifier","identifier");
this.addField(fields,data,"Name","name");
this.addField(fields,data,"Description","description");
this.addField(fields,data,"ICD-10","icd10");
this.addField(fields,data,"Host","host");
this.addField(fields,data,"Distribution","distribution");
this.addField(fields,data,"Morbidity","morbidity");
this.addField(fields,data,"Mortality","mortality");
this.addField(fields,data,"Pathogenesis","pathogenesis");
this.addField(fields,data,"Transmission","transmission");
this.addField(fields,data,"Symptoms","symptoms");
this.addField(fields,data,"Diagnosis","diagnosis");
this.addField(fields,data,"Treatment","treatment");
this.addField(fields,data,"Vaccines","vaccines");
this.addField(fields,data,"History","history");
return this.createPropertyGrid(fields,data);
},createPathogenGrid:function(data){var store=new Ext.data.JsonStore({fields:[{name:"id",type:"int"},{name:"resourceType"},{name:"identifier"},{name:"name"},{name:"description"},{name:"numsequences",type:"int"}],sortInfo:{field:"name",direction:"ASC"}});
store.loadData(data);
var grid=new Ext.ux.vardb.Grid({store:store,columns:[{header:"Name",sortable:true,dataIndex:"name",renderer:Ext.ux.vardb.Renderer.renderPathogenPopup},{header:"Description",width:350,sortable:true,dataIndex:"description"}],viewConfig:{forceFit:true},title:"Pathogens",stripeRows:true,autoWidth:true,autoHeight:true});
return grid;
},createDrugGrid:function(data){var store=new Ext.data.JsonStore({fields:[{name:"id",type:"int"},{name:"resourceType"},{name:"identifier"},{name:"name"},{name:"description"},{name:"numsequences",type:"int"}],sortInfo:{field:"name",direction:"ASC"}});
store.loadData(data);
var grid=new Ext.ux.vardb.Grid({store:store,columns:[{header:"Name",width:50,sortable:true,dataIndex:"identifier"},{header:"Description",width:300,sortable:true,dataIndex:"name"}],viewConfig:{forceFit:true},title:"Drugs",stripeRows:true,autoWidth:true,autoHeight:true});
return grid;
},createSequenceTab:function(data){var grid=new Ext.ux.vardb.SequenceGrid({resource:{type:"DISEASE",id:data.id},filter:"disease="+data.identifier,pagesize:10});
return grid;
}});
Ext.ux.vardb.OrthologPopup=Ext.extend(Ext.ux.vardb.Popup,{initComponent:function(){var tabs=[];
tabs.push(this.createPropertyTab(this.data));
tabs.push(this.createFamilyGrid(this.data.families));
tabs.push(this.createSequenceTab(this.data));
var config={title:"Ortholog: "+this.data.name,items:this.createTabPanel(tabs)};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.OrthologPopup.superclass.initComponent.apply(this,arguments);
},createPropertyTab:function(data){var fields=[];
this.addField(fields,data,"Identifier","identifier");
this.addField(fields,data,"Name","name");
this.addField(fields,data,"Description","description");
return this.createPropertyGrid(fields,data);
},createFamilyGrid:function(data){var store=new Ext.data.JsonStore({fields:[{name:"id",type:"int"},{name:"pathogen_name"},{name:"pathogen_identifier"},{name:"family_name"},{name:"family_identifier"},{name:"description"},{name:"numsequences",type:"int"}],sortInfo:{field:"pathogen_name",direction:"ASC"}});
store.loadData(data);
var grid=new Ext.ux.vardb.Grid({store:store,columns:[{header:"Name",sortable:true,dataIndex:"pathogen_name",renderer:Ext.ux.vardb.Renderer.renderFamilyPopup},{header:"Description",width:350,sortable:true,dataIndex:"description"}],viewConfig:{forceFit:true},title:"Families",stripeRows:true,autoWidth:true,autoHeight:true});
return grid;
},createSequenceTab:function(data){var grid=new Ext.ux.vardb.SequenceGrid({resource:{type:"ORTHOLOG",id:data.id},filter:"ortholog="+data.identifier,pagesize:10});
return grid;
}});
Ext.ux.vardb.RefPopup=Ext.extend(Ext.ux.vardb.Popup,{initComponent:function(){var tabs=[];
tabs.push(this.createPropertyTab(this.data));
tabs.push(this.createAbstractTab(this.data));
tabs.push(this.createCitationTab(this.data));
tabs.push(this.createSequenceTab(this.data));
var config={title:"Reference: "+this.data.name,items:this.createTabPanel(tabs)};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.RefPopup.superclass.initComponent.apply(this,arguments);
},createPropertyTab:function(data){var fields=[];
this.addField(fields,data,"Identifier","identifier");
this.addField(fields,data,"Name","name");
this.addField(fields,data,"Type","type");
this.addField(fields,data,"Pubmed ID","pmid",this.renderPmid);
this.addField(fields,data,"Authors","authors");
this.addField(fields,data,"Year","year");
this.addField(fields,data,"Title","title");
this.addField(fields,data,"Journal","journal");
this.addField(fields,data,"Volume","volume");
this.addField(fields,data,"Pages","pages");
this.addField(fields,data,"Publisher","publisher");
this.addField(fields,data,"City","city");
this.addField(fields,data,"Abbreviation","abbreviation");
return this.createPropertyGrid(fields,data);
},renderPmid:function(value,p,r){return String.format('<a href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=pubmed&cmd=Retrieve&dopt=AbstractPlus&list_uids={0}&query_hl=22&itool=pubmed_docsum" target="_blank">{0}</a>',value);
},createAbstractTab:function(reference){var tab={};
tab.title="Abstract";
tab.html=reference.abstrct;
tab.autoScroll=true;
return tab;
},createCitationTab:function(reference){var tab={};
tab.title="Citation";
tab.html=reference.citation;
tab.autoScroll=true;
return tab;
},createSequenceTab:function(data){var grid=new Ext.ux.vardb.SequenceGrid({resource:{type:"REF",id:data.id},filter:"ref="+data.identifier,pagesize:10});
return grid;
}});
Ext.ux.vardb.CountryPopup=Ext.extend(Ext.ux.vardb.Popup,{initComponent:function(){var tabs=[];
tabs.push(this.createPropertyTab(this.data));
tabs.push(this.createSequenceTab(this.data));
var config={title:"Country: "+this.data.name,items:this.createTabPanel(tabs)};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.CountryPopup.superclass.initComponent.apply(this,arguments);
},createPropertyTab:function(data){var fields=[];
this.addField(fields,data,"Identifier","identifier");
this.addField(fields,data,"Name","name");
this.addField(fields,data,"Description","description");
return this.createPropertyGrid(fields,data);
},createSequenceTab:function(data){var grid=new Ext.ux.vardb.SequenceGrid({resource:{type:"COUNTRY",id:data.id},filter:"country="+data.identifier,pagesize:10});
return grid;
}});
Ext.ux.vardb.StructurePopup=Ext.extend(Ext.ux.vardb.Popup,{initComponent:function(){var tabs=[];
tabs.push(this.createPropertyTab(this.data));
tabs.push(this.createChainGrid(this.data.chains));
tabs.push(this.createSequenceTab(this.data));
var config={title:"Structure: "+this.data.name,items:this.createTabPanel(tabs)};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.StructurePopup.superclass.initComponent.apply(this,arguments);
},createPropertyTab:function(data){var fields=[];
this.addField(fields,data,"Identifier","identifier");
this.addField(fields,data,"Name","name");
this.addField(fields,data,"Description","description");
return this.createPropertyGrid(fields,data);
},createChainGrid:function(data){var store=new Ext.data.JsonStore({fields:[{name:"id",type:"int"},{name:"identifier"},{name:"name"},{name:"swissprot"},{name:"length"},{name:"numsequences",type:"int"}],sortInfo:{field:"name",direction:"ASC"}});
store.loadData(data);
var grid=new Ext.ux.vardb.Grid({store:store,columns:[{header:"Name",sortable:true,dataIndex:"name"},{header:"Swissprot",width:350,sortable:true,dataIndex:"swissprot"},{header:"Length",width:350,sortable:true,dataIndex:"length"},{header:"Sequences",width:350,sortable:true,dataIndex:"numsequences"}],viewConfig:{forceFit:true},title:"Chains",stripeRows:true,autoWidth:true,autoHeight:true});
return grid;
},createSequenceTab:function(data){var grid=new Ext.ux.vardb.SequenceGrid({resource:{type:"STRUCTURE",id:data.id},filter:"structure="+data.identifier,pagesize:10});
return grid;
}});
Ext.ux.vardb.SubgroupPopup=Ext.extend(Ext.ux.vardb.Popup,{initComponent:function(){var tabs=[];
tabs.push(this.createPropertyTab(this.data));
tabs.push(this.createSequenceTab(this.data));
var config={title:"Country: "+this.data.name,items:this.createTabPanel(tabs)};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.SubgroupPopup.superclass.initComponent.apply(this,arguments);
},createPropertyTab:function(data){var fields=[];
this.addField(fields,data,"Identifier","identifier");
this.addField(fields,data,"Name","name");
this.addField(fields,data,"Description","description");
return this.createPropertyGrid(fields,data);
},createSequenceTab:function(data){var grid=new Ext.ux.vardb.SequenceGrid({resource:{type:"SUBGROUP",id:data.id},filter:"subgroup="+data.identifier,pagesize:10});
return grid;
}});
Ext.ux.vardb.TaxonPopup=Ext.extend(Ext.ux.vardb.Popup,{initComponent:function(){var tabs=[];
tabs.push(this.createPropertyTab(this.data));
tabs.push(this.createLineageTab(this.data));
tabs.push(this.createSequenceTab(this.data));
var config={title:"Taxon: "+this.data.name,items:this.createTabPanel(tabs)};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.TaxonPopup.superclass.initComponent.apply(this,arguments);
},createPropertyTab:function(data){var fields=[];
this.addField(fields,data,"Identifier","identifier");
this.addField(fields,data,"Name","name");
this.addField(fields,data,"Level","level");
this.addField(fields,data,"NCBI ID","taxid",this.renderTaxid);
return this.createPropertyGrid(fields,data);
},renderTaxid:function(value,p,r){return String.format('<a href="http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?mode=Info&id={0}&lvl=3&lin=f&keep=1&srchmode=1&unlock" target="_blank">{0}</a>',value);
},createLineageTab:function(taxon){var lineage=taxon.lineage.split(",").join(" &#187; ");
var tab={};
tab.title="Lineage";
tab.html=lineage;
tab.autoScroll=true;
return tab;
},createSequenceTab:function(data){var grid=new Ext.ux.vardb.SequenceGrid({resource:{type:"TAXON",id:data.id},filter:"taxon="+data.identifier,pagesize:10});
return grid;
}});
Ext.ux.vardb.GenomePopup=Ext.extend(Ext.ux.vardb.Popup,{initComponent:function(){var tabs=[];
tabs.push(this.createPropertyTab(this.data));
tabs.push(this.createChromosomeGrid(this.data.chromosomes));
tabs.push(this.createSequenceTab(this.data));
var config={title:"Genome: "+this.data.name,items:this.createTabPanel(tabs)};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.GenomePopup.superclass.initComponent.apply(this,arguments);
},createPropertyTab:function(data){var fields=[];
this.addField(fields,data,"Identifier","identifier");
this.addField(fields,data,"Name","name");
this.addField(fields,data,"Description","description");
this.addField(fields,data,"Chromosomes","numchromosomes");
this.addField(fields,data,"Center","center");
return this.createPropertyGrid(fields,data);
},createChromosomeGrid:function(data){var store=new Ext.data.JsonStore({fields:[{name:"id",type:"int"},{name:"identifier"},{name:"name"},{name:"description"},{name:"numbases"},{name:"accession"},{name:"numsequences",type:"int"}],sortInfo:{field:"name",direction:"ASC"}});
store.loadData(data);
var grid=new Ext.ux.vardb.Grid({store:store,columns:[{header:"Name",sortable:true,dataIndex:"name",renderer:Ext.ux.vardb.Renderer.renderChromosomePopup},{header:"Description",width:350,sortable:true,dataIndex:"description"},{header:"Bases",width:350,sortable:true,dataIndex:"numbases"},{header:"Accession",width:350,sortable:true,dataIndex:"accession"},{header:"Sequences",width:350,sortable:true,dataIndex:"numsequences"}],viewConfig:{forceFit:true},title:"Chromosomes",stripeRows:true,autoWidth:true,autoHeight:true});
return grid;
},createSequenceTab:function(data){var grid=new Ext.ux.vardb.SequenceGrid({resource:{type:"GENOME",id:data.id},filter:"genome="+data.identifier,pagesize:10});
return grid;
}});
Ext.ux.vardb.ChromosomePopup=Ext.extend(Ext.ux.vardb.Popup,{initComponent:function(){var tabs=[];
tabs.push(this.createPropertyTab(this.data));
tabs.push(this.createSequenceTab(this.data));
var config={title:"Ortholog: "+this.data.name,items:this.createTabPanel(tabs)};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.ChromosomePopup.superclass.initComponent.apply(this,arguments);
},createPropertyTab:function(data){var fields=[];
this.addField(fields,data,"Identifier","identifier");
this.addField(fields,data,"Name","name");
this.addField(fields,data,"Description","description");
this.addField(fields,data,"Bases","numbases");
return this.createPropertyGrid(fields,data);
},createSequenceTab:function(data){var grid=new Ext.ux.vardb.SequenceGrid({resource:{type:"CHROMOSOME",id:data.id},filter:"chromosome="+data.identifier,pagesize:10});
return grid;
}});
Ext.ux.vardb.TermPopup=Ext.extend(Ext.Window,{layout:"fit",width:400,height:250,plain:true,title:"Definition",initComponent:function(){var self=this;
var config={items:new Ext.TabPanel({activeTab:0,deferredRender:false,border:false,items:[{title:this.term.term,html:this.term.definition,autoScroll:true}]}),buttons:[{text:"Close",handler:function(){self.hide();
}}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.TermPopup.superclass.initComponent.apply(this,arguments);
this.show();
}});
Ext.ux.vardb.GcChart=Ext.extend(Ext.Panel,{layout:"fit",height:150,windowsize:10,windowoffset:5,initComponent:function(){if(!this.sequence){throw"No sequence provided for GcChart";
}this.windowsize=Math.round(this.sequence.length/200);
this.windowoffset=Math.round(this.windowsize/2);
var data=[],index,subsequence,gc;
for(index=0;
index<this.sequence.length-this.windowsize;
index+=this.windowoffset){subsequence=this.sequence.substring(index,index+this.windowsize);
gc=this.getGcContent(subsequence);
data.push({column:index+1,gc:gc});
}var store=new Ext.data.JsonStore({fields:["column","gc"],data:data});
var config={items:{xtype:"linechart",url:vardb.chartswf,store:store,xField:"column",xAxis:new Ext.chart.NumericAxis({displayName:"Column",majorUnit:10,minorUnit:5,minimum:1}),yAxis:new Ext.chart.NumericAxis({displayName:"GC content",majorUnit:0.2,minorUnit:0.1,minimum:0,maximum:1}),series:[{type:"line",displayName:"GC",yField:"gc",style:{color:1393291,size:2}}]}};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.GcChart.superclass.initComponent.apply(this,arguments);
},getGcContent:function(sequence){sequence=sequence.toUpperCase();
if(sequence.length===0){return 0;
}var gc=0,index,nt;
for(index=0;
index<sequence.length;
index++){nt=sequence.charAt(index);
if(nt==="G"||nt==="C"){gc++;
}}return parseFloat(gc)/parseFloat(sequence.length);
}});
Ext.ux.vardb.VariabilityCharts=Ext.extend(Ext.TabPanel,{title:"Variability",frame:true,activeTab:0,width:600,height:200,deferredRender:true,layoutOnTabChange:false,initComponent:function(){var config={items:[new Ext.ux.vardb.VariabilityChart({type:"shannon",data:this.shannon}),new Ext.ux.vardb.VariabilityChart({type:"simpson",data:this.simpson}),new Ext.ux.vardb.VariabilityChart({type:"wukabat",data:this.wukabat})]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.VariabilityCharts.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.VariabilityChart=Ext.extend(Ext.Panel,{layout:"fit",type:"shannon",height:200,initComponent:function(){if(!this.data){throw"No variability data provided for VariabilityChart";
}var data=[],index,variability;
for(index=0;
index<this.data.length;
index++){variability=this.data[index];
data.push({column:index+1,variability:variability});
}var store=new Ext.data.JsonStore({fields:["column","variability"],data:data});
var config={title:this.getTitle(),items:{xtype:"linechart",url:vardb.chartswf,store:store,xField:"column",xAxis:new Ext.chart.NumericAxis({displayName:"Column",minimum:1,majorUnit:10,minorUnit:5}),yAxis:this.createYAxis(),series:[{type:"line",displayName:"Variability",yField:"variability",style:{color:this.getColor(),size:2}}]}};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.VariabilityChart.superclass.initComponent.apply(this,arguments);
},getTitle:function(){if(this.type==="shannon"){return"Shannon entropy";
}else{if(this.type==="simpson"){return"Simpson diversity";
}else{if(this.type==="wukabat"){return"Wu-Kabat variability coefficient";
}}}return"Variability";
},createYAxis:function(){var config={displayName:"Variability",minimum:0};
if(this.type==="shannon"){config.maximum=4;
config.majorUnit=1;
config.minorUnit=0.5;
}else{if(this.type==="simpson"){config.maximum=1;
config.majorUnit=0.2;
config.minorUnit=0.1;
}}return new Ext.chart.NumericAxis(config);
},getColor:function(){if(this.type==="shannon"){return 255;
}else{if(this.type==="simpson"){return 65280;
}else{if(this.type==="wukabat"){return 16711680;
}}}return 11184810;
}});
Ext.ux.vardb.AminoAcidUsageChart=Ext.extend(Ext.Panel,{layout:"fit",title:"Amino acid usage",height:200,colors:[255,16711680,65280],hasRefSet:false,initComponent:function(){if(!this.data){throw"No aa usage data provided for AminoAcidUsageChart";
}var series=[],fields=["aa"],index,type,color,size;
for(index=0;
index<this.seriesNames.length;
index++){type=this.hasRefSet&&index===0?"line":"column";
color=this.hasRefSet&&index===0?"0xAAAAAA":this.colors[index%this.colors.length];
size=this.hasRefSet&&index===0?1:6;
fields.push("freq"+index);
series.push({type:type,displayName:this.seriesNames[index],yField:"freq"+index,style:{color:color,size:size}});
}var store=new Ext.data.JsonStore({fields:fields,data:this.data});
var config={items:{xtype:"columnchart",url:vardb.chartswf,store:store,series:series,xField:"aa",yAxis:new Ext.chart.NumericAxis({displayName:"Frequency",minimum:0,majorUnit:0.1,minorUnit:0.05})}};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.AminoAcidUsageChart.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.CodonUsageChart=Ext.extend(Ext.Panel,{layout:"fit",title:"Codon usage",height:200,colors:[255,16711680,65280],hasRefSet:true,initComponent:function(){if(!this.data){throw"No codon usage data provided for CodonUsageChart";
}var series=[],fields=["codon"],index,type,color,size;
for(index=0;
index<this.seriesNames.length;
index++){type=this.hasRefSet&&index===0?"line":"column";
color=this.hasRefSet&&index===0?"0xAAAAAA":this.colors[(index-1)%this.colors.length];
size=this.hasRefSet&&index===0?1:4;
fields.push("freq"+index);
series.push({type:type,displayName:this.seriesNames[index],yField:"freq"+index,style:{color:color,size:size}});
}var store=new Ext.data.JsonStore({fields:fields,data:this.data});
var config={items:{xtype:"columnchart",url:vardb.chartswf,store:store,xField:"codon",series:series,yAxis:new Ext.chart.NumericAxis({displayName:"Frequency",minimum:0,majorUnit:0.1,minorUnit:0.05}),chartStyle:{legend:{display:"right"},xAxis:{labelRotation:-90}}}};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.CodonUsageChart.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.LengthChart=Ext.extend(Ext.Panel,{layout:"fit",title:"Lengths",height:200,initComponent:function(){if(!this.data){throw"No length data provided for LengthChart";
}var series1={type:"column",displayName:"Lengths",yField:"count",style:{color:"0x0000FF",size:4}};
var store=new Ext.data.JsonStore({fields:["midpoint","count"],data:this.data});
var config={items:{xtype:"columnchart",url:vardb.chartswf,store:store,xField:"midpoint",series:[series1],yAxis:new Ext.chart.NumericAxis({displayName:"Frequency"})}};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.LengthChart.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.SelectonChart=Ext.extend(Ext.Panel,{layout:"fit",height:200,title:"Selecton results",initComponent:function(){if(!this.data){throw"No selection data provided for SelectonChart";
}var store=new Ext.data.JsonStore({fields:[{name:"column",type:"int"},{name:"aa"},{name:"kaKs",type:"float"},{name:"level"}],data:this.data.positions});
var config={items:{xtype:"linechart",url:vardb.chartswf,store:store,xField:"column",xAxis:new Ext.chart.NumericAxis({displayName:"Column",minimum:0,majorUnit:10,minorUnit:5}),yAxis:new Ext.chart.NumericAxis({displayName:"Ka/Ks",minimum:0,majorUnit:0.2,minorUnit:0.1}),series:[{type:"line",displayName:"Selection",yField:"kaKs",style:{color:"0xAAAAAA",size:2}}]}};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.SelectonChart.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.AlignmentViewerForm=Ext.extend(Ext.ux.vardb.AbstractForm,{title:"Inspect alignments using a simple browser-based alignment viewer",width:580,labelWidth:50,standardSubmit:true,fileUpload:true,url:vardb.webapp+"/alignments/view.html",initComponent:function(){var config={initialConfig:{standardSubmit:true,fileUpload:true},items:[this.createRow([this.createControl(new Ext.ux.vardb.UserAlignmentSelectList({hiddenName:"alignmentIdentifier"}))]),this.createRow([this.createTextAreaControl({name:"sequences",fieldLabel:"Enter a multiple sequence alignment in FASTA or CLUSTALW format"})]),this.createRow([this.createFileUploadControl({name:"file",fieldLabel:"File",emptyText:"Or upload an alignment file (FASTA or ClustalW)"})])],buttons:[this.createClearButton(),this.createStandardSubmitButton()]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.AlignmentViewerForm.superclass.initComponent.apply(this,arguments);
},checkValidation:function(){if(!this.checkNotEmpty("sequences,file,alignmentIdentifier","Please enter an alignment or select a file to upload")){return false;
}return true;
}});
Ext.ux.vardb.CodonUsageForm=Ext.extend(Ext.ux.vardb.AbstractForm,{title:"Codon Usage",width:580,bodyStyle:"padding: 10px 10px 0 10px;",labelWidth:30,standardSubmit:true,fileUpload:true,url:vardb.webapp+"/analysis/codonusage.html",initComponent:function(){var config={initialConfig:{standardSubmit:true,fileUpload:true},items:[this.createRow([this.createControl(new Ext.ux.vardb.UserAlignmentSelectList({hiddenName:"alignmentIdentifier",sequenceType:"NT"}))]),this.createRow([this.createTextAreaControl({name:"sequences",fieldLabel:"Enter a codon multiple sequence alignment in FASTA or CLUSTALW format"})]),this.createRow([this.createFileUploadControl({name:"file",fieldLabel:"File",emptyText:"Upload an alignment file"})])],buttons:[this.createExampleButton(),this.createClearButton(),this.createStandardSubmitButton()]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.CodonUsageForm.superclass.initComponent.apply(this,arguments);
},checkValidation:function(){if(!this.checkNotEmpty("sequences,file,alignmentIdentifier","Please enter an alignment or select a file to upload")){return false;
}return true;
},showExampleHandler:function(){var form=this.getForm();
vardb.ajaxRequest("/demo/codonusage.json",{},function(json){form.findField("sequences").setValue(json.sequences);
});
}});
Ext.ux.vardb.CodonUsageTable=Ext.extend(Ext.TabPanel,{title:"Codon usage",frame:true,autoHeight:true,activeTab:0,deferredRender:true,layoutOnTabChange:true,percentFormat:"0.00",initComponent:function(){this.calculateFrequencies();
var config={defaults:{autoHeight:true,bodyStyle:"padding: 5px"},hidden:this.data.rows.length<1,items:[this.createGcTab(),this.createCodonTab(),this.createSynonymousCodonTab(),this.createAminoAcidTab(),this.createGroupTab()]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.CodonUsageTable.superclass.initComponent.apply(this,arguments);
},createGcTab:function(){var table={layout:"table",layoutConfig:{columns:2},border:false,bodyStyle:"font-family: verdana;",defaults:{bodyStyle:"padding-left: 2px; padding-right: 2px; font-size: 8pt;"},items:[{html:"<b>G content</b>"},{html:Ext.util.Format.number(this.data.gcContent.g,this.percentFormat)+" %"},{html:"<b>C content</b>"},{html:Ext.util.Format.number(this.data.gcContent.c,this.percentFormat)+" %"},{html:"<b>A content</b>"},{html:Ext.util.Format.number(this.data.gcContent.a,this.percentFormat)+" %"},{html:"<b>T content</b>"},{html:Ext.util.Format.number(this.data.gcContent.t,this.percentFormat)+" %"},{html:"<b>GC</b>"},{html:Ext.util.Format.number(this.data.gcContent.gc,this.percentFormat)+" %"},{html:"<b>GC3</b>"},{html:Ext.util.Format.number(this.data.gcContent.gc3,this.percentFormat)+" %"},{html:"<b>GC3 skew</b>"},{html:Ext.util.Format.number(this.data.gcContent.gc3skew,this.percentFormat)}]};
var tab={title:"GC content",items:table};
return tab;
},createCodonTab:function(){var table={layout:"table",layoutConfig:{columns:4},border:false,bodyStyle:"font-family: verdana;",defaults:{bodyStyle:"padding-left: 2px; padding-right: 2px; font-size: 8pt;"},items:[]};
var i,j,codon,aa,codons;
table.items.push({html:"<b>Codon</b>"});
table.items.push({html:"<b>Amino acid</b>"});
table.items.push({html:"<b>Count</b>"});
table.items.push({html:"<b>Percent</b>"});
for(i=0;
i<this.data.rows.length;
i++){codon=this.data.rows[i];
aa=this.getAminoAcidByCode(codon.aa);
table.items.push({html:codon.codon});
table.items.push({html:aa.longname});
table.items.push({html:codon.count,bodyStyle:"text-align: right;"});
table.items.push({html:Ext.util.Format.number(100*codon.freq,"0.0")+" %",bodyStyle:"text-align: right;"});
}var tab={title:"Codons",items:table};
return tab;
},createSynonymousCodonTab:function(){var table={layout:"table",layoutConfig:{columns:8},border:false,bodyStyle:"font-family: verdana;",defaults:{bodyStyle:"padding-left: 2px; padding-right: 2px; font-size: 8pt;"},items:[]};
var i,j,codon,aa,codons;
table.items.push({html:"<b>Amino acid</b>"});
table.items.push({html:"<b>Percent</b>"});
for(i=1;
i<=6;
i++){table.items.push({html:"<b>Codon "+i+"</b>"});
}for(i=0;
i<this.aminoAcids.length;
i++){aa=this.aminoAcids[i];
if(aa.code==="*"&&aa.count===0){continue;
}codons=this.getCodonsByAminoAcid(aa.code);
table.items.push({html:aa.longname+"<br/>&nbsp;"});
table.items.push({html:'<div qtip="'+aa.count+'">'+aa.percent+"<br/>&nbsp;</div>",bodyStyle:"text-align: right;"});
for(j=0;
j<codons.length;
j++){codon=codons[j];
table.items.push({html:'<div qtip="'+codon.count+'">'+codon.codon+"<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"+codon.rscu+"</div>"});
}if(codons.length<6){table.items.push({html:"&nbsp;<br/>&nbsp;",colspan:6-codons.length,bodyStyle:"background-color: #EEEEEE"});
}}var tab={title:"Synonymous Codons",items:table};
return tab;
},createAminoAcidTab:function(){var table={layout:"table",layoutConfig:{columns:3},border:false,bodyStyle:"font-family: verdana; text-align: right;",defaults:{bodyStyle:"padding-left: 2px; padding-right: 2px; font-size: 8pt;"},items:[{html:"<b>Amino acid</b>",bodyStyle:"text-align: left;"},{html:"<b>Count</b>"},{html:"<b>Percentage</b>"}]};
var i,aa;
for(i=0;
i<this.aminoAcids.length;
i++){aa=this.aminoAcids[i];
if(aa.code==="*"){continue;
}table.items.push({html:aa.longname,bodyStyle:"text-align: left;"});
table.items.push({html:aa.count});
table.items.push({html:aa.percent});
}var tab={title:"Amino acids",items:[table]};
return tab;
},createGroupTab:function(){var table={layout:"table",layoutConfig:{columns:3},border:false,bodyStyle:"font-family: verdana; text-align: right;",defaults:{bodyStyle:"padding-left: 2px; padding-right: 2px; font-size: 8pt;"},items:[{html:"<b>Group</b>",bodyStyle:"text-align: left;"},{html:"<b>Count</b>"},{html:"<b>Percentage</b>"}]};
var i,group,count;
for(i=0;
i<this.aminoAcidGroups.length;
i++){group=this.aminoAcidGroups[i];
table.items.push({html:group.longname,bodyStyle:"text-align: left;"});
table.items.push({html:group.count});
table.items.push({html:group.percent});
}var tab={title:"Amino acid groups",items:[table]};
return tab;
},getCodonsByAminoAcid:function(aa,sortfield){if(!sortfield){sortfield="rscu";
}var codons=[],index,codon;
for(index=0;
index<this.data.rows.length;
index++){codon=this.data.rows[index];
if(codon.aa===aa){codons.push(codon);
}}codons.sort(function(codon1,codon2){return codon2[sortfield]-codon1[sortfield];
});
return codons;
},getTotal:function(){var index,total=0,codon;
for(index=0;
index<this.data.rows.length;
index++){codon=this.data.rows[index];
total+=codon.count;
}return total;
},sumAminoAcidCounts:function(aa){var sum=0,index,codon;
for(index=0;
index<this.data.rows.length;
index++){codon=this.data.rows[index];
if(codon.aa===aa){sum+=codon.count;
}}return sum;
},sumGroupCounts:function(group){var sum=0,i,aa;
for(i=0;
i<this.aminoAcids.length;
i++){aa=this.aminoAcids[i];
if(aa.group===group){sum+=this.sumAminoAcidCounts(aa.code);
}}return sum;
},calculateFrequencies:function(){this.data.rows.sort(function(codon1,codon2){return codon2.count-codon1.count;
});
var i,aa,group;
var total=this.getTotal();
for(i=0;
i<this.aminoAcids.length;
i++){aa=this.aminoAcids[i];
aa.count=this.sumAminoAcidCounts(aa.code);
aa.percent=Ext.util.Format.number(100*aa.count/total,this.percentFormat)+" %";
}this.aminoAcids.sort(function(aa1,aa2){return aa2.count-aa1.count;
});
for(i=0;
i<this.aminoAcidGroups.length;
i++){group=this.aminoAcidGroups[i];
group.count=this.sumGroupCounts(group.code);
group.percent=Ext.util.Format.number(100*group.count/total,this.percentFormat)+"%";
}this.aminoAcidGroups.sort(function(g1,g2){return g2.count-g1.count;
});
},getAminoAcidByCode:function(code){var i,aa;
for(i=0;
i<this.aminoAcids.length;
i++){aa=this.aminoAcids[i];
if(aa.code===code){return aa;
}}return null;
},aminoAcids:[{code:"G",shortname:"Gly",longname:"Glycine",group:"SMALL",type:"TINY"},{code:"A",shortname:"Ala",longname:"Alanine",group:"SMALL",type:"TINY"},{code:"S",shortname:"Ser",longname:"Serine",group:"NUCLEOPHILIC",type:"TINY"},{code:"T",shortname:"Thr",longname:"Threonine",group:"NUCLEOPHILIC",type:"TINY"},{code:"C",shortname:"Cys",longname:"Cysteine",group:"NUCLEOPHILIC",type:"CYSTEINE"},{code:"V",shortname:"Val",longname:"Valine",group:"HYDROPHOBIC",type:"ALIPHATIC"},{code:"L",shortname:"Leu",longname:"Leucine",group:"HYDROPHOBIC",type:"ALIPHATIC"},{code:"I",shortname:"Ile",longname:"Isoleucine",group:"HYDROPHOBIC",type:"ALIPHATIC"},{code:"M",shortname:"Met",longname:"Methionine",group:"HYDROPHOBIC",type:"OTHER"},{code:"P",shortname:"Pro",longname:"Proline",group:"HYDROPHOBIC",type:"OTHER"},{code:"F",shortname:"Phe",longname:"Phenylalanine",group:"AROMATIC",type:"AROMATIC"},{code:"Y",shortname:"Tyr",longname:"Tyrosine",group:"AROMATIC",type:"POLAR"},{code:"W",shortname:"Trp",longname:"Tryptophan",group:"AROMATIC",type:"AROMATIC"},{code:"D",shortname:"Asp",longname:"Aspartic Acid",group:"ACIDIC",type:"POLAR"},{code:"E",shortname:"Glu",longname:"Glutamic Acid",group:"ACIDIC",type:"POLAR"},{code:"N",shortname:"Asn",longname:"Asparagine",group:"AMIDE",type:"POLAR"},{code:"Q",shortname:"Gln",longname:"Glutamine",group:"AMIDE",type:"POLAR"},{code:"H",shortname:"His",longname:"Histidine",group:"BASIC",type:"POLAR"},{code:"K",shortname:"Lys",longname:"Lysine",group:"BASIC",type:"POLAR"},{code:"R",shortname:"Arg",longname:"Arginine",group:"BASIC",type:"POLAR"},{code:"*",shortname:"Stop",longname:"Stop"}],aminoAcidGroups:[{code:"SMALL",longname:"Small"},{code:"NUCLEOPHILIC",longname:"Nucleophilic"},{code:"HYDROPHOBIC",longname:"Hydrophobic"},{code:"AROMATIC",longname:"Aromatic"},{code:"ACIDIC",longname:"Acidic"},{code:"AMIDE",longname:"Amide"},{code:"BASIC",longname:"Basic"}]});
Ext.ux.vardb.GblocksForm=Ext.extend(Ext.ux.vardb.AbstractForm,{title:"Gblocks",width:580,bodyStyle:"padding: 10px 10px 0 10px;",labelWidth:50,standardSubmit:true,fileUpload:true,url:vardb.webapp+"/analysis/gblocks.html",initComponent:function(){this.data=this.data||{};
Ext.applyIf(this.data,{gaps:"HALF",type:"PROTEIN",minBlock:10,minConserved:0.5,minFlanking:0.5,maxNonconserved:8});
var config={initialConfig:{standardSubmit:true,fileUpload:true},items:[this.gblocksFieldset(),this.msaFieldset()],buttons:[this.createExampleButton(),this.createClearButton(),this.createStandardSubmitButton()]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.GblocksForm.superclass.initComponent.apply(this,arguments);
},gblocksFieldset:function(){return this.createFieldset({title:"Parameters"},[this.createRow([this.createTextControl({name:"minBlock",fieldLabel:"Min block",width:30}),this.createSelectList({data:[["NONE","None"],["HALF","Half"],["ALL","All"]],hiddenName:"gaps",fieldLabel:"Allowed gaps",width:80}),this.createSelectList({data:[["PROTEIN","Protein"],["DNA","DNA"],["CODONS","Codons"]],hiddenName:"type",fieldLabel:"Type",width:80})]),this.createRow([this.createTextControl({name:"minConserved",fieldLabel:"Min conserved",width:30}),this.createTextControl({name:"minFlanking",fieldLabel:"Min flanking",width:30}),this.createTextControl({name:"maxNonconserved",fieldLabel:"Max non-conserved",width:30})])]);
},msaFieldset:function(){return this.createFieldset({title:"Multiple sequence alignment"},[this.createRow([this.createControl(new Ext.ux.vardb.UserAlignmentSelectList())]),this.createRow([this.createTextAreaControl({name:"sequences",fieldLabel:"Enter a multiple sequence alignment in FASTA or CLUSTALW format"})]),this.createRow([this.createFileUploadControl({name:"file",fieldLabel:"File"})])]);
},checkValidation:function(){if(!this.checkNotEmpty("sequences,file,alignmentIdentifier","Please enter an alignment or select a file to upload")){return false;
}return true;
},showExampleHandler:function(){var form=this.getForm();
vardb.ajaxRequest("/demo/gblocks.json",{},function(json){form.findField("sequences").setValue(json.sequences);
});
}});
Ext.ux.vardb.HvAlignForm=Ext.extend(Ext.ux.vardb.AbstractForm,{title:"Align protein hypervariable regions",width:580,labelWidth:50,standardSubmit:true,fileUpload:true,url:vardb.webapp+"/analysis/hvalign.html",initComponent:function(){var config={initialConfig:{standardSubmit:true,fileUpload:true},items:[this.gblocksFieldset(),this.mafftFieldset(),this.blastclustFieldset(),this.msaFieldset()],buttons:[this.createExampleButton(),this.createClearButton(),this.createStandardSubmitButton()]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.HvAlignForm.superclass.initComponent.apply(this,arguments);
},gblocksFieldset:function(){var gblocks_gaps=new Ext.ux.vardb.SelectList({data:[["NONE","None"],["HALF","With half"],["ALL","All"]],hiddenName:"gblocks_gaps",fieldLabel:"Allowed gap positions",width:100,value:this.gblocks_gaps,anchor:"-4",editable:false,typeAhead:true});
var gblocks_minBlock={xtype:"textfield",fieldLabel:"Min block",name:"gblocks_minBlock",value:this.gblocks_minBlock,width:30};
var gblocks_minConserved={xtype:"textfield",fieldLabel:"Min conserved",name:"gblocks_minConserved",value:this.gblocks_minConserved,width:30};
var gblocks_minFlanking={xtype:"textfield",fieldLabel:"Min flanking",name:"gblocks_minFlanking",value:this.gblocks_minFlanking,width:30};
var gblocks_maxNonconserved={xtype:"textfield",fieldLabel:"Max non-conserved",name:"gblocks_maxNonconserved",value:this.gblocks_maxNonconserved,width:30};
var fieldset={xtype:"fieldset",title:"GBlocks settings",autoHeight:true,collapsible:true,collapsed:false,items:[{layout:"column",items:[{width:250,layout:"form",labelWidth:130,items:[gblocks_gaps]},{width:150,layout:"form",labelWidth:115,items:[gblocks_maxNonconserved]}]},{layout:"column",items:[{width:110,layout:"form",labelWidth:60,items:[gblocks_minBlock]},{width:140,layout:"form",labelWidth:90,items:[gblocks_minConserved]},{width:130,layout:"form",labelWidth:75,items:[gblocks_minFlanking]}]}]};
return fieldset;
},comboField:function(name,fieldLabel,value,data){if(!(data instanceof Array)){data=data.split(",");
}var field={xtype:"combo",hiddenName:name,fieldLabel:fieldLabel,store:data,valueField:"value",displayField:"label",mode:"local",triggerAction:"all",forceSelection:true,selectOnFocus:true,typeAhead:true,width:90,listWidth:200,value:value};
return field;
},mafftFieldset:function(){var strategies=[];
strategies.push(["AUTO","Auto (Moderately accurate)"]);
strategies.push(["FFT_NS_1","FFT-NS-1 (Very fast)"]);
strategies.push(["FFT_NS_2","FFT-NS-2 (Fast; progressive)"]);
strategies.push(["FFT_NS_i2","FFT-NS-i2 (Medium; iterative)"]);
strategies.push(["FFT_NS_i","FFT-NS-i (Slow)"]);
strategies.push(["L_INS_i","L-INS-i (Very slow)"]);
strategies.push(["E_INS_i","E-INS-i (Very slow)"]);
var strategyField=this.comboField("strategy","Strategy",this.mafft_strategy,strategies);
var matrixField=this.comboField("mafft_scorematrix","Matrix",this.mafft_scorematrix,"BLOSUM30,BLOSUM45,BLOSUM62,BLOSUM80,JTT100,JTT200");
var opField={xtype:"textfield",fieldLabel:"Op",name:"mafft_op",value:this.mafft_op,width:40};
var epField={xtype:"textfield",fieldLabel:"Ep",name:"mafft_ep",value:this.mafft_ep,width:40};
var fieldset={xtype:"fieldset",title:"Mafft settings",autoHeight:true,collapsible:true,collapsed:false,items:[{layout:"column",items:[{width:160,layout:"form",labelWidth:50,items:[strategyField]},{width:160,layout:"form",labelWidth:50,items:[matrixField]},{width:80,layout:"form",labelWidth:25,items:[opField]},{width:80,layout:"form",labelWidth:25,items:[epField]}]}]};
return fieldset;
},blastclustFieldset:function(){var blastclust_minimumLength_field={xtype:"textfield",fieldLabel:"Min length",name:"blastclust_minimumLength",value:this.blastclust_minimumLength,width:30};
var blastclust_blastclust_minimumSize_field={xtype:"textfield",fieldLabel:"Min size",name:"blastclust_minimumSize",value:this.blastclust_minimumSize,width:30};
var fieldset={xtype:"fieldset",title:"Blastclust settings",autoHeight:true,collapsible:true,collapsed:false,items:[{layout:"column",items:[{width:120,layout:"form",labelWidth:70,items:[blastclust_minimumLength_field]},{width:120,layout:"form",labelWidth:50,items:[blastclust_blastclust_minimumSize_field]}]}]};
return fieldset;
},msaFieldset:function(){return this.createFieldset({title:"Multiple sequence alignment"},[this.createRow([this.createTextAreaControl({name:"sequences",value:this.sequences,fieldLabel:"Enter a multiple sequence alignment in FASTA or CLUSTALW format"})]),this.createRow([this.createFileUploadControl({name:"file",fieldLabel:"File",emptyText:"Upload an alignment file"})])]);
},checkValidation:function(){if(!this.checkNotEmpty("sequences,file","Please enter an alignment or select a file to upload")){return false;
}return true;
},showExampleHandler:function(){var form=this.getForm();
vardb.ajaxRequest("/demo/hvalign.json",{},function(json){form.findField("sequences").setValue(json.sequences);
});
}});
Ext.ux.vardb.JalviewForm=Ext.extend(Ext.ux.vardb.AbstractForm,{title:"Open alignment in Jalview",width:580,labelWidth:50,standardSubmit:true,fileUpload:true,url:vardb.webapp+"/jalview.html",initComponent:function(){var config={initialConfig:{standardSubmit:true,fileUpload:true},items:[this.createRow([this.createControl(new Ext.ux.vardb.UserAlignmentSelectList({hiddenName:"alignmentIdentifier"}))]),this.createRow([this.createTextAreaControl({name:"sequences",fieldLabel:"Enter a multiple sequence alignment in FASTA or CLUSTALW format"})]),this.createRow([this.createFileUploadControl({name:"file",fieldLabel:"File",emptyText:"Or upload an alignment file (FASTA or ClustalW)"})])],buttons:[this.createClearButton(),this.createStandardSubmitButton()]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.JalviewForm.superclass.initComponent.apply(this,arguments);
},checkValidation:function(){if(!this.checkNotEmpty("sequences,file,alignmentIdentifier","Please enter an alignment or select a file to upload")){return false;
}return true;
}});
Ext.ux.vardb.MafftForm=Ext.extend(Ext.ux.vardb.AbstractForm,{title:"Align sequences using MAFFT",width:600,standardSubmit:true,fileUpload:true,url:vardb.webapp+"/mafft.html",strategy:"AUTO",scorematrix:"BLOSUM45",op:"2.0",ep:"0.0",initComponent:function(){var config={defaults:{allowBlank:false},initialConfig:{standardSubmit:true,fileUpload:true},items:[this.paramFieldset(),this.msaFieldset()],buttons:[this.createExampleButton(),this.createClearButton(),this.createStandardSubmitButton()]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.MafftForm.superclass.initComponent.apply(this,arguments);
},paramFieldset:function(){var strategies=[];
strategies.push(["AUTO","Auto (Moderately accurate)"]);
strategies.push(["FFT_NS_1","FFT-NS-1 (Very fast)"]);
strategies.push(["FFT_NS_2","FFT-NS-2 (Fast; progressive)"]);
strategies.push(["FFT_NS_i2","FFT-NS-i2 (Medium; iterative)"]);
strategies.push(["FFT_NS_i","FFT-NS-i (Slow)"]);
strategies.push(["L_INS_i","L-INS-i (Very slow)"]);
strategies.push(["E_INS_i","E-INS-i (Very slow)"]);
return this.createFieldset({title:"Parameters"},[this.createRow([this.createTextControl({name:"name",fieldLabel:"Title",emptyText:"User alignment",width:400})]),this.createRow([this.createSelectList({data:strategies,hiddenName:"strategy",fieldLabel:"Strategy",value:this.strategy,width:180}),this.createSelectList({data:"BLOSUM30,BLOSUM45,BLOSUM62,BLOSUM80,JTT100,JTT200",hiddenName:"matrix",fieldLabel:"Score matrix",value:this.scorematrix,width:90})]),this.createRow([this.createSelectList({hiddenName:"sequenceType",fieldLabel:"Sequence type",data:[["AA","Protein alignment"],["NT","Nucleotide alignment"]],value:"AA"})]),this.createRow([this.createTextControl({name:"op",fieldLabel:"Gap open",value:this.op,width:50}),this.createTextControl({name:"ep",fieldLabel:"Gap extension",value:this.ep,width:50})])]);
},msaFieldset:function(){return this.createFieldset({title:"Sequences to align"},[this.createRow([this.createTextAreaControl({name:"sequences",value:this.sequences,fieldLabel:"Enter sequences in FASTA format"})]),this.createRow([this.createFileUploadControl({name:"file",fieldLabel:"File",emptyText:"Upload a FASTA sequence file"})])]);
},checkValidation:function(){if(!this.checkNotEmpty("sequences,file","Please enter FASTA-formatted sequences or select a file to upload")){return false;
}return true;
},showExampleHandler:function(){var form=this.getForm();
vardb.ajaxRequest("/demo/mafft.json",{},function(json){form.findField("sequences").setValue(json.sequences);
});
}});
Ext.ux.vardb.AbstractCodonAlignForm=Ext.extend(Ext.ux.vardb.AbstractForm,{width:580,standardSubmit:true,fileUpload:true,initComponent:function(){var config={initialConfig:{standardSubmit:true,fileUpload:true},items:[this.createNucleotideFieldset(),this.createProteinFieldset()],buttons:[this.createExampleButton(),this.createClearButton(),this.createStandardSubmitButton()]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.AbstractCodonAlignForm.superclass.initComponent.apply(this,arguments);
},createNucleotideFieldset:function(){return this.createFieldset({title:"Nucleotide sequences"},[this.createRow([this.createTextAreaControl({name:"ntsequences",fieldLabel:"Enter unaligned nucleotide sequences in FASTA format"})]),this.createRow([this.createFileUploadControl({name:"ntfile",fieldLabel:"File"})])]);
},createProteinFieldset:function(){return this.createFieldset({title:"Protein sequences"},[this.createRow([this.createTextAreaControl({name:"aasequences",fieldLabel:"Enter a multiple sequence alignment in FASTA or CLUSTALW format"})]),this.createRow([this.createFileUploadControl({name:"aafile",fieldLabel:"File"})])]);
},checkValidation:function(){if(!this.checkNotEmpty("aasequences,aafile","Please enter a protien alignment or select a file to upload")){return false;
}if(!this.checkNotEmpty("ntsequences,ntfile","Please enter nucleotide sequences or select a file to upload")){return false;
}return true;
},showExampleHandler:function(){var form=this.getForm();
vardb.ajaxRequest("/demo/codonalign.json",{},function(json){form.findField("ntsequences").setValue(json.ntsequences);
form.findField("aasequences").setValue(json.aasequences);
});
}});
Ext.ux.vardb.Pal2NalForm=Ext.extend(Ext.ux.vardb.AbstractCodonAlignForm,{title:"PAL2NAL",url:vardb.webapp+"/analysis/pal2nal.html"});
Ext.ux.vardb.RevTransForm=Ext.extend(Ext.ux.vardb.AbstractCodonAlignForm,{title:"RevTrans",url:vardb.webapp+"/analysis/revtrans.html"});
Ext.ux.vardb.CodonAlignForm=Ext.extend(Ext.TabPanel,{activeTab:0,width:600,frame:true,deferredRender:true,initComponent:function(){var data=this.data;
var config={defaults:{autoHeight:true},items:[new Ext.ux.vardb.RevTransForm({}),new Ext.ux.vardb.Pal2NalForm({})]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.CodonAlignForm.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.VariabilityForm=Ext.extend(Ext.ux.vardb.AbstractForm,{title:"Variability",width:580,bodyStyle:"padding: 10px 10px 0 10px;",labelWidth:30,standardSubmit:true,fileUpload:true,url:vardb.webapp+"/analysis/variability.html",initComponent:function(){var config={initialConfig:{standardSubmit:true,fileUpload:true},items:[this.createRow([this.createControl(new Ext.ux.vardb.UserAlignmentSelectList({hiddenName:"alignmentIdentifier"}))]),this.createRow([this.createTextAreaControl({name:"sequences",fieldLabel:"Enter a multiple sequence alignment in FASTA or CLUSTALW format"})]),this.createRow([this.createFileUploadControl({name:"file",fieldLabel:"File",emptyText:"Upload an alignment file"})])],buttons:[this.createExampleButton(),this.createClearButton(),this.createStandardSubmitButton()]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.VariabilityForm.superclass.initComponent.apply(this,arguments);
},checkValidation:function(){if(!this.checkNotEmpty("sequences,file,alignmentIdentifier","Please enter an alignment or select a file to upload")){return false;
}return true;
},showExampleHandler:function(){var form=this.getForm();
vardb.ajaxRequest("/demo/variability.json",{},function(json){form.findField("sequences").setValue(json.sequences);
});
}});
Ext.ux.vardb.blast.BlastClustForm=Ext.extend(Ext.ux.vardb.AbstractForm,{title:"BLASTclust",width:580,labelWidth:35,url:vardb.webapp+"/analysis/blastclust.html",initComponent:function(){var self=this;
var config={defaults:{allowBlank:false},initialConfig:{standardSubmit:true,fileUpload:true},monitorValid:true,items:[this.createRow([this.createTextControl({name:"name",fieldLabel:"Title",value:"BLASTClust results",anchor:"-4"},{width:"100%"})]),this.createRow([this.createSelectList({data:[["true","Protein"],["false","DNA"]],hiddenName:"protein",fieldLabel:"Type",value:""+this.protein,width:100}),this.createTextControl({name:"minimumLength",fieldLabel:"Minimum length",value:this.minimumLength,width:50}),this.createTextControl({name:"similarityThreshold",fieldLabel:"Similary Threshold",value:this.similarityThreshold,width:50})]),this.createRow([this.createTextAreaControl({name:"sequences",fieldLabel:"Enter sequences in FASTA format"})]),this.createRow([this.createFileUploadControl({name:"file",fieldLabel:"File",emptyText:"Or upload an a FASTA-formatted sequence file"})])],buttons:[this.createExampleButton(),this.createClearButton(),this.createStandardSubmitButton()]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.blast.BlastClustForm.superclass.initComponent.apply(this,arguments);
},checkValidation:function(){if(!this.checkNotEmpty("sequences,file","Please enter sequences or select a file to upload")){return false;
}return true;
},showExampleHandler:function(){var form=this.getForm();
vardb.ajaxRequest("/demo/blastclust.json",{},function(json){form.findField("sequences").setValue(json.sequences);
});
}});
Ext.ux.vardb.VariabilityGrid=Ext.extend(Ext.ux.vardb.Grid,{frame:true,width:600,height:500,trackMouseOver:false,collapsible:false,title:"Variability",initComponent:function(){var self=this;
var reader=new Ext.data.JsonReader({root:"rows",idProperty:"number",fields:[{name:"number",type:"int"},{name:"consensus"},{name:"shannon",type:"float"},{name:"simpson",type:"float"},{name:"wukabat",type:"float"}]});
var store=new Ext.data.Store({reader:reader,data:this.data,sortInfo:{field:"number",direction:"ASC"}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var r=Ext.ux.vardb.Renderer;
var format="0.000";
var config={sm:sm,store:store,columns:[sm,{header:"Position",width:20,sortable:true,dataIndex:"number"},{header:"Consensus",sortable:true,dataIndex:"consensus"},{header:"Shannon",xtype:"numbercolumn",sortable:true,dataIndex:"shannon",align:"right",tooltip:"Shannon entropy",format:format},{header:"Simpson",xtype:"numbercolumn",sortable:true,dataIndex:"simpson",align:"right",tooltop:"Simpson diversity",format:format},{header:"Wu-Kabat",xtype:"numbercolumn",sortable:true,dataIndex:"wukabat",align:"right",tooltip:"Wu-Kabat coefficient",format:format}],viewConfig:{forceFit:true},tbar:new Ext.Toolbar({items:[this.createPrintButton(),"-",self.createSelectMenu()]})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.VariabilityGrid.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.SelectonForm=Ext.extend(Ext.ux.vardb.AbstractForm,{title:"Selecton",width:580,bodyStyle:"padding: 10px 10px 0 10px;",labelWidth:30,standardSubmit:true,fileUpload:true,url:vardb.webapp+"/analysis/selecton.html",initComponent:function(){var config={initialConfig:{standardSubmit:true,fileUpload:true},items:[this.createRow([this.createTextAreaControl({name:"sequences",fieldLabel:"Enter a codon alignment in FASTA or CLUSTALW format"})]),this.createRow([this.createFileUploadControl({name:"file",fieldLabel:"File",emptyText:"Upload an alignment file"})])],buttons:[this.createExampleButton(),this.createClearButton(),this.createStandardSubmitButton()]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.SelectonForm.superclass.initComponent.apply(this,arguments);
},checkValidation:function(){if(!this.checkNotEmpty("sequences,file","Please enter an alignment or select a file to upload")){return false;
}return true;
},showExampleHandler:function(){var form=this.getForm();
vardb.ajaxRequest("/demo/selecton.json",{},function(json){form.findField("sequences").setValue(json.sequences);
});
}});
Ext.ux.vardb.OligoRepForm=Ext.extend(Ext.ux.vardb.AbstractForm,{title:"Oligo Repeat Finder",width:580,bodyStyle:"padding: 10px 10px 0 10px;",labelWidth:30,standardSubmit:true,fileUpload:true,url:vardb.webapp+"/analysis/oligorep.html",initComponent:function(){var config={initialConfig:{standardSubmit:true,fileUpload:true},items:[this.createFieldset({title:"Parameters"},[this.createRow([this.createCheckbox({name:"directRepeats",fieldLabel:"Direct repeats",checked:true}),this.createCheckbox({name:"complementaryRepeats",fieldLabel:"Complementary repeats",checked:true})]),this.createRow([this.createCheckbox({name:"symmetricRepeats",fieldLabel:"Symmetric repeats",checked:true}),this.createCheckbox({name:"invertedRepeat",fieldLabel:"Inverted repeats",checked:true})]),this.createRow([this.createNumberControl({name:"minLength",fieldLabel:"Min. length",value:7}),this.createNumberControl({name:"maxLength",fieldLabel:"Max length",value:20}),this.createNumberControl({name:"maxMismatches",fieldLabel:"Max. mismatches",value:5}),this.createTextControl({name:"limit",fieldLabel:"Limit",value:"0.0001"})])]),this.createFieldset({title:"Sequences"},[this.createRow([this.createTextAreaControl({name:"text",fieldLabel:"Enter sequences in FASTA or CLUSTALW format"})]),this.createRow([this.createFileUploadControl({name:"file",fieldLabel:"File",emptyText:"Upload an alignment file"})])])],buttons:[this.createExampleButton(),this.createClearButton(),this.createStandardSubmitButton()]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.OligoRepForm.superclass.initComponent.apply(this,arguments);
},checkValidation:function(){if(!this.checkNotEmpty("text,file","Please enter an alignment or select a file to upload")){return false;
}return true;
},showExampleHandler:function(){var form=this.getForm();
vardb.ajaxRequest("/demo/oligorep.json",{},function(json){form.findField("text").setValue(json.sequences);
});
}});
Ext.ux.vardb.SelectonGrid=Ext.extend(Ext.ux.vardb.Grid,{frame:true,width:500,height:500,trackMouseOver:false,collapsible:false,title:"Variability",initComponent:function(){var self=this;
var reader=new Ext.data.JsonReader({root:"positions",idProperty:"number",fields:[{name:"column",type:"int"},{name:"aa"},{name:"kaKs",type:"float"},{name:"level"}]});
var store=new Ext.data.Store({reader:reader,data:this.data,sortInfo:{field:"column",direction:"ASC"}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var r=Ext.ux.vardb.Renderer;
var format="0.000";
var config={sm:sm,store:store,columns:[sm,{header:"Position",width:20,sortable:true,dataIndex:"column"},{header:"Consensus",sortable:true,dataIndex:"aa"},{header:"Ka/Ks",xtype:"numbercolumn",sortable:true,dataIndex:"kaKs",align:"right",tooltip:"Ka/Ks",format:format},{header:"Level",sortable:true,dataIndex:"level",align:"center",tooltip:"selection level",renderer:this.levelRenderer}],viewConfig:{forceFit:true},tbar:new Ext.Toolbar({items:[self.createSelectMenu()]})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.SelectonGrid.superclass.initComponent.apply(this,arguments);
},levelRenderer:function(value,p,r){var bgcolor="white";
var description="";
if(value==="S1"){bgcolor="ffbd00";
description="Positive selection - high";
}else{if(value==="S2"){bgcolor="ffff78";
description="Positive selection - intermediate";
}else{if(value==="S3"){bgcolor="ffffff";
description="Positive selection - low";
}else{if(value==="S4"){bgcolor="fcedf4";
description="No selection";
}else{if(value==="S5"){bgcolor="fac9de";
description="Purifying selection - low";
}else{if(value==="S6"){bgcolor="f07dab";
description="Purifying selection - intermediate";
}else{if(value==="S7"){bgcolor="a02560";
description="Purifying selection - high";
}}}}}}}return'<span style="background-color:#'+bgcolor+'">'+description+"</span>";
}});
Ext.ux.vardb.blast.Form=Ext.extend(Ext.form.FormPanel,{renderTo:"formdiv",labelWidth:80,frame:true,width:600,height:362,autoHeight:Ext.isIE?false:true,bodyStyle:"padding:5px 5px 0",collapsible:true,standardSubmit:true,fileUpload:true,initComponent:function(){this.parameterFields=this.parameterFields||[];
this.advancedFields1=this.advancedFields1||[];
this.advancedFields2=this.advancedFields2||[];
var evalueField=this.createComboField("evalue","Expect",this.evalue,"0.0001,0.01,1,10,100,1000");
var maxresultsField=this.createComboField("maxresults","Max results",this.maxresults,"10,50,100,250,500,1000");
var lowcomplexityField=this.createComboField("lowcomplexity","Filter",this.lowcomplexity,"true,false");
var matrixField=this.createComboField("matrixValue","Score matrix",this.matrix,"BLOSUM62,BLOSUM80,PAM30,PAM70,PAM250");
var gapopenField={xtype:"numberfield",fieldLabel:"Gap open",name:"gapopen",width:30};
var gapextendField={xtype:"numberfield",fieldLabel:"Gap extend",name:"gapextend",width:30};
if(this.gapopen){gapopenField.value=this.gapopen;
}if(this.gapextend){gapopenField.value=this.gapopen;
}this.advancedFields1.splice(0,0,evalueField,maxresultsField,matrixField);
this.advancedFields2.splice(0,0,lowcomplexityField,gapopenField,gapextendField);
var queryFieldset=this.getQueryFieldset();
var parametersFieldset={xtype:"fieldset",title:"Parameters",collapsible:true,autoHeight:true,items:[{layout:"column",items:[{columnWidth:0.9,layout:"form",items:this.parameterFields}]}]};
var advancedFieldset={xtype:"fieldset",title:"Advanced",collapsible:true,collapsed:false,autoHeight:true,items:[{layout:"column",items:[{columnWidth:0.5,layout:"form",items:this.advancedFields1},{columnWidth:0.5,layout:"form",items:this.advancedFields2}]}]};
var submitButton={xtype:"button",text:"Submit",scope:this,handler:this.submitHandler};
var clearButton={xtype:"button",text:"Clear",scope:this,handler:this.resetHandler};
var config={initialConfig:{standardSubmit:true,fileUpload:true},items:[queryFieldset,parametersFieldset,advancedFieldset],buttons:[clearButton,submitButton]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.blast.Form.superclass.initComponent.apply(this,arguments);
},submitHandler:function(){var form=this.getForm().getEl().dom;
form.action=this.url;
form.method="post";
form.submit();
},resetHandler:function(){this.getForm().reset();
},getQueryFieldset:function(){var form=this;
var queryField={xtype:"textarea",fieldLabel:"Enter a sequence in FASTA or bare sequence format",name:"query",grow:false,anchor:"-4",height:150,allowBlank:false};
if(this.query){queryField.value=this.query;
}var queryFieldset={layout:"form",labelAlign:"top",items:[queryField]};
return queryFieldset;
},createComboField:function(name,fieldLabel,value,data){if(!(data instanceof Array)){data=data.split(",");
}var field={xtype:"combo",hiddenName:name,fieldLabel:fieldLabel,store:data,valueField:"value",displayField:"label",mode:"local",triggerAction:"all",emptyText:" ",selectOnFocus:true,value:value};
return field;
},createProgramField:function(){var programs=[];
programs.push(["blastp","BLASTP (protein query vs. protein database)"]);
programs.push(["tblastn","TBLASTN (protein query vs. nucleotide database)"]);
programs.push(["blastn","BLASTN (nucleotide query vs. nucleotide database)"]);
programs.push(["blastx","BLASTX (nucleotide query vs. protein database)"]);
programs.push(["tblastx","TBLASTX (6-frame nucleotide query vs. 6-frame nucleotide database)"]);
var programField=this.createComboField("programValue","Blast program",this.program,programs);
programField.width=400;
return programField;
}});
Ext.ux.vardb.blast.BlastForm=Ext.extend(Ext.ux.vardb.blast.Form,{title:"BLAST",initComponent:function(){var programField=this.createProgramField();
var config={url:vardb.webapp+"/blast/blast.html",parameterFields:[programField]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.blast.BlastForm.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.blast.PhiBlastForm=Ext.extend(Ext.ux.vardb.blast.Form,{title:"PHI-BLAST",initComponent:function(){var patternField={xtype:"textfield",fieldLabel:"Pattern",name:"pattern",grow:false,width:400,value:this.pattern};
var wordsizeField={xtype:"numberfield",fieldLabel:"Word size",name:"wordsize",grow:false,width:35,value:this.wordsize};
var config={url:vardb.webapp+"/blast/phiblast.html",parameterFields:[patternField],advancedFields1:[wordsizeField]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.blast.PhiBlastForm.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.blast.PsiBlastForm=Ext.extend(Ext.ux.vardb.blast.Form,{title:"PSI-BLAST",initComponent:function(){var iterationsField={xtype:"numberfield",fieldLabel:"Iterations",name:"iterations",grow:false,width:30,value:this.iterations};
var wordsizeField={xtype:"numberfield",fieldLabel:"Word size",name:"wordsize",width:35,value:this.wordsize};
var config={url:vardb.webapp+"/blast/psiblast.html",parameterFields:[iterationsField],advancedFields1:[wordsizeField]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.blast.PsiBlastForm.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.blast.NetBlastForm=Ext.extend(Ext.ux.vardb.blast.Form,{database:"nr",entrezterm:"",megablast:true,initComponent:function(){var programField=this.createProgramField();
var databaseField={xtype:"textfield",fieldLabel:"Databases",name:"database",width:400,value:this.database};
var entreztermField={xtype:"textfield",fieldLabel:"Entrez term",name:"entrezterm",width:400,value:this.entrezterm};
var megablastField=this.createComboField("megablast","Megablast",this.megablast,"true,false");
var config={title:"Netblast",url:vardb.webapp+"/analysis/netblast.html",parameterFields:[programField,databaseField,entreztermField],advancedFields1:[megablastField]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.blast.NetBlastForm.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.blast.RowExpander=function(config){config=config||{};
Ext.applyIf(config,{numcolumns:120});
var template=new Ext.XTemplate("<br/>",'<tpl for="this.hsps(values)">','<p class="x-selectable" style="background-color:white;margin-left:10px;">',"Score = {bitscore}, E = {evalue}, ","Identities = {identity}/{alignlength}, ","Positive = {positive}/{alignlength}<br/>","<br/>",'<span class="identity" style="font-family:monospace;">','<tpl for="this.chunk(qseq,midline,hseq)">',"{[this.format(values.qseqchunk,values.midlinechunk)]} query<br/>",'<span style="color:gray;">{[values.midlinechunk]}</span><br/>',"{[this.format(values.hseqchunk,values.midlinechunk)]} hit<br/>","<br/>","</tpl>","</p>","</tpl>",{hsps:function(data){var list=[],index,hsp;
var bitscores=data.bitscores.split(",");
var evalues=data.evalues.split(",");
var queryfroms=data.queryfroms.split(",");
var querytos=data.querytos.split(",");
var hitfroms=data.hitfroms.split(",");
var hittos=data.hittos.split(",");
var queryframes=data.queryframes.split(",");
var hitframes=data.hitframes.split(",");
var identitys=data.identitys.split(",");
var positives=data.positives.split(",");
var alignlengths=data.alignlengths.split(",");
var qseqs=data.qseqs.split(",");
var hseqs=data.hseqs.split(",");
var midlines=data.midlines.split(",");
for(index=0;
index<bitscores.length;
index++){hsp={};
hsp.bitscore=bitscores[index];
hsp.evalue=evalues[index];
hsp.queryfrom=queryfroms[index];
hsp.queryto=querytos[index];
hsp.hitfrom=hitfroms[index];
hsp.hitto=hittos[index];
hsp.queryframe=queryframes[index];
hsp.hitframe=hitframes[index];
hsp.identity=identitys[index];
hsp.positive=positives[index];
hsp.alignlength=alignlengths[index];
hsp.qseq=qseqs[index];
hsp.hseq=hseqs[index];
hsp.midline=midlines[index];
list.push(hsp);
}return list;
},chunk:function(qseq,midline,hseq){var chunks=[];
var max=config.numcolumns;
var numchunks=qseq.length/max;
var index;
function truncate(str,index,max){var start=index*max;
var end=start+max;
if(end>=str.length){return str.substring(start);
}else{return str.substring(start,end);
}}function Chunk(qseq,midline,hseq,index,max){this.qseqchunk=truncate(qseq,index,max);
this.midlinechunk=truncate(midline,index,max);
this.hseqchunk=truncate(hseq,index,max);
}for(index=0;
index<numchunks;
index++){chunks.push(new Chunk(qseq,midline,hseq,index,max));
}return chunks;
},format:function(value,midline){var index,aa,consensus,identity,str="";
for(index=0;
index<value.length;
index++){aa=value.substring(index,index+1);
consensus=midline.substring(index,index+1);
identity="";
if((consensus===aa||consensus==="|")&&consensus!=="-"){identity="p60";
}else{if(consensus==="+"){identity="p40";
}}str+='<span class="'+aa.toUpperCase()+" "+identity+'">'+aa+"</span>";
}return str;
}});
var expander=new Ext.grid.RowExpander({tpl:template});
return expander;
};
Ext.ux.vardb.blast.BlastReader=function(config){config=config||{};
var fields=[{name:"id",type:"int"},{name:"identifier"},{name:"accession"},{name:"rating"},{name:"taxon_identifier"},{name:"taxon_name"},{name:"pathogen_identifier"},{name:"pathogen_name"},{name:"family_identifier"},{name:"family_name"},{name:"disease_identifier"},{name:"disease_name"},{name:"ortholog_identifier"},{name:"ortholog_name"},{name:"country_identifier"},{name:"country_name"},{name:"ref_identifier"},{name:"ref_name"},{name:"strain"},{name:"pseudogene"},{name:"truncated"},{name:"defline"},{name:"gene"},{name:"product"},{name:"chainname"},{name:"hitnumber",type:"int"},{name:"hitid"},{name:"hitaccession"},{name:"hitdef"},{name:"hitlength",type:"int"},{name:"numhsps"},{name:"hitbitscore"},{name:"hitevalue"},{name:"bitscores"},{name:"evalues"},{name:"queryfroms"},{name:"querytos"},{name:"hitfroms"},{name:"hittos"},{name:"queryframes"},{name:"hitframes"},{name:"identitys"},{name:"positives"},{name:"alignlengths"},{name:"qseqs"},{name:"hseqs"},{name:"midlines"},{name:"tags_id"},{name:"tags_name"},{name:"tags_description"},{name:"tags_color"},{name:"tags_bgcolor"},{name:"tags_bundle"},{name:"tags_readonly"}];
var reader=new Ext.data.JsonReader({root:"hits",totalProperty:"totalCount",idProperty:"id",fields:fields});
return reader;
};
Ext.ux.vardb.blast.Grid=Ext.extend(Ext.ux.vardb.SequenceGrid,{frame:true,autoHeight:true,autoWidth:true,collapsible:true,stripeRows:true,pagesize:20,initComponent:function(){var self=this;
var url=vardb.webapp+"/blast/ajax/hits.json";
if(this.blasttype==="PSIBLAST"){url=vardb.webapp+"/blast/ajax/psiblasthits.json";
}var store=new Ext.data.Store({url:url,reader:new Ext.ux.vardb.blast.BlastReader({}),remoteSort:true,baseParams:{id:this.list_id,filter:""}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var expander=new Ext.ux.vardb.blast.RowExpander();
var r=Ext.ux.vardb.Renderer;
var builder=Ext.ux.vardb.ColumnBuilder;
var columns=[expander,sm,builder.accessionColumn(),builder.tagsColumn(),builder.deflineColumn(),builder.numhspsColumn(),builder.hitlengthColumn(),builder.hitevalueColumn(),builder.hitbitscoreColumn(),builder.pathogenColumn(),builder.familyColumn(),builder.diseaseColumn(),builder.orthologColumn(),builder.countryColumn(),builder.refColumn(),builder.strainColumn(),builder.geneColumn(),builder.productColumn(),builder.truncatedColumn(),builder.pseudogeneColumn()];
var tbar=new Ext.PagingToolbar({pageSize:this.pagesize,store:store,displayInfo:true,displayMsg:"{0} - {1} of {2}",emptyMsg:"None",items:["-",self.createSelectMenu(),"-",self.createTagMenu(),"-",self.createDownloadMenu(),"-",self.createCartMenu(),"-",self.createSummaryMenu(),"-",self.createBlastMenu()]});
var viewConfig={forceFit:true,templates:{cell:Ext.ux.vardb.Vardb.createSelectableTemplate()}};
var config={store:store,columns:columns,viewConfig:viewConfig,sm:sm,plugins:expander,tbar:tbar};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.SequenceGrid.superclass.initComponent.apply(this,arguments);
store.on("load",function(){if(store.getTotalCount()>0){expander.expandRow(0);
}});
store.load({params:{start:0,limit:this.pagesize}});
},createBlastMenu:function(type){var self=this;
var menu={text:"Blast",enableScrolling:false,menu:{items:[{text:"BLAST XML",handler:function(btn){vardb.gotoUrl("/blast/load.xml",{id:self.list_id});
}}]}};
return menu;
}});
Ext.ux.vardb.blast.NetblastGrid=Ext.extend(Ext.ux.vardb.SequenceGrid,{title:"Netblast results",frame:true,autoHeight:true,autoWidth:true,collapsible:false,stripeRows:true,initComponent:function(){var self=this;
var store=new Ext.data.Store({url:vardb.webapp+"/analysis/ajax/netblast/hits.json",reader:new Ext.ux.vardb.blast.BlastReader(),remoteSort:false,baseParams:{id:this.analysis_id}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var expander=new Ext.ux.vardb.blast.RowExpander({numcolumns:90});
var r=Ext.ux.vardb.Renderer;
var builder=Ext.ux.vardb.ColumnBuilder;
var columns=[expander,sm,{header:"Num",dataIndex:"hitnumber",width:20,sortable:true,tooltip:"Hit number"},{header:"Accession",dataIndex:"accession",width:80,sortable:true,renderer:r.renderGenbankAccession},{header:"Description",width:75,dataIndex:"hitdef"},builder.numhspsColumn(),builder.hitlengthColumn(),builder.hitevalueColumn(),builder.hitbitscoreColumn()];
var tbar=new Ext.Toolbar({items:[self.createPrintButton(),"-",self.createSelectMenu(),"-",self.createBlastMenu()]});
var viewConfig={forceFit:true,emptyText:"No rows to display",templates:{cell:Ext.ux.vardb.Vardb.createSelectableTemplate()}};
var config={store:store,columns:columns,viewConfig:viewConfig,sm:sm,plugins:expander,tbar:tbar};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.SequenceGrid.superclass.initComponent.apply(this,arguments);
store.on("load",function(){expander.expandRow(0);
});
store.load({params:{start:0,limit:this.pagesize}});
},createBlastMenu:function(type){var self=this;
var menu={text:"Blast",enableScrolling:false,menu:{items:[{text:"BLAST XML",handler:function(btn){vardb.gotoUrl("/analysis/netblast/load.xml",{id:self.analysis_id});
}}]}};
return menu;
}});
Ext.ux.vardb.ChainHitsGrid=Ext.extend(Ext.ux.vardb.SequenceGrid,{frame:true,autoHeight:true,autoWidth:true,collapsible:true,stripeRows:true,pagesize:20,initComponent:function(){var self=this;
var store=new Ext.data.Store({url:vardb.webapp+"/blast/ajax/chainblasthits.json",reader:new Ext.ux.vardb.blast.BlastReader({}),remoteSort:true,baseParams:{identifier:this.identifier,filter:""}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var expander=new Ext.ux.vardb.blast.RowExpander({numcolumns:90});
var r=Ext.ux.vardb.Renderer;
var builder=Ext.ux.vardb.ColumnBuilder;
var columns=[expander,sm,builder.accessionColumn(),builder.tagsColumn(),builder.deflineColumn(),{header:"Chain",dataIndex:"chainname",width:20,sortable:false},builder.numhspsColumn(),builder.hitlengthColumn(),builder.hitevalueColumn(),builder.hitbitscoreColumn(),builder.pathogenColumn(),builder.familyColumn(),builder.orthologColumn()];
var tbar=new Ext.PagingToolbar({pageSize:this.pagesize,store:store,displayInfo:true,displayMsg:"{0} - {1} of {2}",emptyMsg:"None",items:["-",self.createSelectMenu(),"-",self.createTagMenu(),"-",self.createDownloadMenu(),"-",self.createCartMenu(),"-",self.createSummaryMenu(),"-",self.createStructureMenu()]});
var viewConfig={forceFit:true,templates:{cell:Ext.ux.vardb.Vardb.createSelectableTemplate()}};
var config={store:store,columns:columns,viewConfig:viewConfig,sm:sm,plugins:expander,tbar:tbar};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.SequenceGrid.superclass.initComponent.apply(this,arguments);
store.load({params:{start:0,limit:this.pagesize}});
},createStructureMenu:function(){var self=this;
var menu={text:"Jmol",enableScrolling:false,menu:{items:[{text:"Align to structure",handler:function(){var sequence_id=self.getSelectedId();
jmolform.alignToStructure(sequence_id,self.identifier);
}},"-",{text:"Reset structure",handler:function(){Ext.ux.vardb.Vardb.resetStructure();
}}]}};
return menu;
}});
Ext.ux.vardb.blast.Results=Ext.extend(Ext.Panel,{title:"BLAST results",frame:true,autoWidth:true,height:620,layout:"border",initComponent:function(){var grid=new Ext.ux.vardb.blast.Grid({list_id:this.list_id,counts:this.counts,region:"center",blasttype:this.blasttype});
var form=new Ext.ux.vardb.FilterForm({list_id:this.list_id,counts:this.counts,region:"west",collapsible:true,collapseMode:"mini",width:220,onFilter:function(filter){grid.store.baseParams.filter=filter;
grid.store.reload();
}});
var tabpanel={xtype:"tabpanel",region:"west",collapsible:true,collapseMode:"mini",activeTab:0,width:200,items:[form]};
var config={autoScroll:true,defaults:{split:true,autoScroll:true},items:[form,grid]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.blast.Results.superclass.initComponent.apply(this,arguments);
}});
Ext.namespace("Ext.ux.vardb.quickcart");
Ext.ux.vardb.quickcart.QuickCart=Ext.extend(Ext.Window,{title:"QuickCart",width:600,height:328,layout:"border",closable:true,resizable:true,initComponent:function(){this.addEvents({filter:true,addsequences:true,deletesequences:true});
this.tree=new Ext.ux.vardb.quickcart.Tree({list_id:this.list_id,region:"west",controller:this});
this.form=new Ext.ux.vardb.quickcart.Form({list_id:this.list_id,region:"north",controller:this});
this.grid=new Ext.ux.vardb.quickcart.Grid({list_id:this.list_id,region:"center",controller:this});
this.addActionMenu(this.grid);
var config={items:[this.tree,{xtype:"panel",region:"center",layout:"border",items:[this.form,this.grid]}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.quickcart.QuickCart.superclass.initComponent.apply(this,arguments);
this.show();
},setFilter:function(filter){this.filter=filter;
this.fireEvent("filter",this.list_id,filter);
},getFilter:function(){return this.filter;
},reloadGrid:function(){this.grid.store.reload();
},addSequencesHandler:function(){var self=this;
var xy=this.getPosition();
var offset=30;
var dialog=new Ext.ux.vardb.quickcart.QuickSearch({list_id:this.list_id,x:xy[0]+offset,y:xy[1]+offset});
dialog.on("addsequences",function(json){self.reloadGrid();
});
},removeSequencesHandler:function(){var self=this;
var ids=this.grid.getSelectedIds();
Ext.ux.vardb.Cart.removeSequencesFromList(this.list_id,ids,function(){self.reloadGrid();
});
},emptyCartHandler:function(){var self=this;
Ext.ux.vardb.Cart.emptyCart(function(){self.reloadGrid();
});
},downloadSequencesHandler:function(){var dialog=new Ext.ux.vardb.DownloadSequencesDialog({grid:this.grid});
},downloadPropertiesHandler:function(){var dialog=new Ext.ux.vardb.DownloadPropertiesDialog({grid:this.grid});
},addActionMenu:function(grid){var addremoveMenu={text:"Add/Remove",menu:{items:[{text:"Add sequences",scope:this,handler:this.addSequencesHandler},"-",{text:"Remove selected sequences",scope:this,handler:this.removeSequencesHandler},{text:"Empty cart",scope:this,handler:this.emptyCartHandler}]}};
var downloadMenu={text:"Download",menu:{items:[{text:"Sequences",scope:this,handler:this.downloadSequencesHandler},{text:"Properties",scope:this,handler:this.downloadPropertiesHandler}]}};
var selectMenu=grid.createSelectMenu();
var menu={text:"Actions",menu:{items:[addremoveMenu,"-",selectMenu,"-",downloadMenu]}};
var toolbar=grid.getTopToolbar();
toolbar.insert(toolbar.items.getCount()-2,menu);
}});
Ext.ux.vardb.quickcart.Form=Ext.extend(Ext.FormPanel,{labelWidth:35,height:35,frame:true,initComponent:function(){this.filterFieldName="query_"+this.list_id;
var self=this;
var textfield={name:this.filterFieldName,xtype:"textfield",fieldLabel:"Filter",anchor:"100%",width:260,listeners:{specialkey:function(field,e){if(e.getKey()===e.ENTER){self.onSubmitHandler();
}}}};
var button={xtype:"button",text:"Filter",formBind:true,scope:this,handler:this.onSubmitHandler};
var clear={xtype:"button",text:"Reset",formBind:true,scope:this,handler:this.onResetHandler};
var fieldset={layout:"column",anchor:"100%",items:[{layout:"form",bodyStyle:"padding-right: 5px",items:[textfield]},{bodyStyle:"padding-right: 5px",items:[button]},{items:[clear]}]};
var config={items:[fieldset]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.quickcart.Form.superclass.initComponent.apply(this,arguments);
this.controller.addListener("filter",function(list_id,filter){if(list_id!==this.list_id){return;
}var field=this.getForm().findField(this.filterFieldName);
field.setValue(filter);
},this);
},onSubmitHandler:function(){var field=this.getForm().findField(this.filterFieldName);
var filter=field.getValue();
this.controller.setFilter(filter);
},onSpecialKey:function(field,e){if(e.getKey()===e.ENTER){this.onSubmitHandler();
}},onResetHandler:function(){this.controller.setFilter("");
}});
Ext.ux.vardb.quickcart.Grid=Ext.extend(Ext.ux.vardb.Grid,{frame:false,autoWidth:true,autoHeight:true,enableColumnMove:true,stripeRows:true,loadMask:true,collapsible:false,animCollapse:false,pagesize:10,initComponent:function(){var list_id=this.list_id;
var fields=[{name:"sequence_id"},{name:"identifier"},{name:"accession"},{name:"rating"},{name:"taxon_identifier"},{name:"taxon_name"},{name:"pathogen_identifier"},{name:"pathogen_name"},{name:"pathogen_dtype"},{name:"family_identifier"},{name:"family_name"},{name:"subgroup_identifier"},{name:"subgroup_name"},{name:"ortholog_identifier"},{name:"ortholog_name"},{name:"disease_identifier"},{name:"disease_name"},{name:"country_identifier"},{name:"country_name"},{name:"ref_identifier"},{name:"ref_name"},{name:"strain"},{name:"pseudogene"},{name:"truncated"},{name:"location"},{name:"domains"},{name:"locus_tag"},{name:"defline"},{name:"gene"},{name:"product"},{name:"uniprot"},{name:"udate"},{name:"ntlength",type:"int"},{name:"aalength",type:"int"},{name:"method"},{name:"model"},{name:"score"},{name:"evalue"},{name:"sequence"},{name:"translation"},{name:"tags_id"},{name:"tags_name"},{name:"tags_description"},{name:"tags_color"},{name:"tags_bgcolor"},{name:"tags_bundle"},{name:"tags_readonly"}];
var reader=new Ext.data.JsonReader({root:"sequences",totalProperty:"totalCount",idProperty:"sequence_id",fields:fields});
var store=new Ext.data.Store({url:vardb.webapp+"/ajax/lists/page.json",reader:reader,remoteSort:true,sortInfo:{field:"accession",direction:"ASC"},baseParams:{list_id:list_id,filter:""}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var r=Ext.ux.vardb.Renderer;
function renderTags(value,p,r){return Ext.ux.vardb.Renderer.renderTags(value,p,r,list_id);
}var builder=Ext.ux.vardb.ColumnBuilder;
var columns=[sm,builder.accessionColumn(),builder.tagsColumn({renderer:renderTags}),builder.deflineColumn(),builder.taxonColumn(),builder.geneColumn()];
var config={viewConfig:{forceFit:true,deferEmptyText:false,emptyText:"Cart is empty"},sm:sm,store:store,columns:columns,tbar:new Ext.PagingToolbar({store:store,pageSize:this.pagesize,displayInfo:true,displayMsg:"{0}-{1} of {2}",emptyMsg:"",items:["-"]})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.quickcart.Grid.superclass.initComponent.apply(this,arguments);
store.load({params:{start:0,limit:this.pagesize}});
this.controller.addListener("filter",function(list_id,filter){if(list_id!==this.list_id){return;
}this.filterTable(filter);
},this);
this.controller.addListener("addsequences",function(list_id){if(list_id!==this.list_id){return;
}this.reloadTable();
},this);
this.controller.addListener("deletesequences",function(list_id){if(list_id!==this.list_id){return;
}this.reloadTable();
},this);
},filterTable:function(filter){this.store.baseParams.filter=filter;
this.store.load({params:{start:0,limit:this.pagesize}});
},reloadTable:function(){this.store.reload();
}});
Ext.ux.vardb.quickcart.Tree=Ext.extend(Ext.tree.TreePanel,{collapsed:false,collapsible:true,title:"Filters",width:175,split:true,rootVisible:false,initComponent:function(){var list_id=this.list_id;
var root=new Ext.tree.AsyncTreeNode({});
var loader=new Ext.tree.TreeLoader({dataUrl:vardb.webapp+"/ajax/quicktree.json",baseParams:{list_id:list_id}});
var config={root:root,loader:loader};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.quickcart.Tree.superclass.initComponent.apply(this,arguments);
this.addListener("click",this.onClickHandler,this);
this.controller.addListener("filter",function(list_id,filter){if(list_id!==this.list_id){return;
}},this);
this.controller.addListener("addsequences",function(list_id){if(list_id!==this.list_id){return;
}this.updateTree();
},this);
this.controller.addListener("deletesequences",function(list_id){if(list_id!==this.list_id){return;
}this.updateTree();
},this);
},updateTree:function(){this.loader.load(this.root,Ext.emptyFn);
},onClickHandler:function(node){var filter=node.attributes.filter;
if(!filter){return;
}this.controller.setFilter(filter);
}});
Ext.namespace("Ext.ux.vardb.quickcart");
Ext.ux.vardb.quickcart.QuickSearch=Ext.extend(Ext.Window,{title:"QuickSearch",width:600,height:344,layout:"border",closable:true,resizable:true,initComponent:function(){var self=this;
this.addEvents({addsequences:true});
this.grid=new Ext.ux.vardb.quickcart.SearchGrid({});
if(this.list_id){this.addAddSequencesButton(this.grid);
}else{this.addAddSequencesMenu(this.grid);
}function loadGrid(query){Ext.ux.vardb.Vardb.ajaxRequest("/ajax/search/sequences.json",{query:query},function(json){self.grid.enable();
self.grid.store.baseParams.list_id=json.list_id;
self.grid.store.load({params:{start:0,limit:self.grid.pagesize}});
});
}var combo=new Ext.ux.vardb.quickcart.Suggestions({callback:loadGrid});
var submitButton={xtype:"button",text:"Submit",formBind:true,scope:this,handler:function(){loadGrid(combo.getValue());
}};
var queryfieldset={layout:"column",anchor:"100%",items:[{layout:"form",labelWidth:40,bodyStyle:"padding-right: 5px",items:[combo]},{items:[submitButton]}]};
this.form=new Ext.FormPanel({height:36,url:"",region:"north",frame:true,border:true,items:[queryfieldset]});
var config={defaults:{split:true},items:[this.form,this.grid]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.quickcart.QuickSearch.superclass.initComponent.apply(this,arguments);
this.show();
if(this.query){combo.setValue(this.query);
loadGrid(this.query);
}},addAddSequencesButton:function(grid){var addButton={xtype:"button",text:"Add sequences",scope:this,handler:this.addSequencesHandler};
var toolbar=grid.getTopToolbar();
toolbar.insert(toolbar.items.getCount()-2,addButton);
},addAddSequencesMenu:function(grid){var menu={text:"Add sequences",menu:{items:[{text:"Add to cart",scope:this,handler:this.addSequencesToCartHandler},{text:"Add as new cart",scope:this,handler:this.addSequencesToNewCartHandler}]}};
var toolbar=grid.getTopToolbar();
toolbar.insert(toolbar.items.getCount()-2,menu);
},addSequencesHandler:function(){var self=this;
var ids=this.grid.getSelectedIds();
function callback(json){self.fireEvent("addsequences",json);
}if(ids.length>0){Ext.ux.vardb.Cart.addSequencesToList(this.list_id,ids,callback);
}else{var from_list_id=this.grid.store.baseParams.list_id;
var to_list_id=this.list_id;
var total=this.grid.store.getTotalCount();
Ext.ux.vardb.Cart.addListToList(from_list_id,to_list_id,total,this.callback);
}},addSequencesToCartHandler:function(){var self=this;
var ids=this.grid.getSelectedIds();
function callback(json){self.fireEvent("addsequences",json);
}if(ids.length>0){Ext.ux.vardb.Cart.addSequencesToCart(ids,callback);
}else{var list_id=this.grid.store.baseParams.list_id;
var total=this.grid.store.getTotalCount();
Ext.ux.vardb.Cart.addListToCart(list_id,total,this.callback);
}},addSequencesToNewCartHandler:function(){var self=this;
var ids=this.grid.getSelectedIds();
function callback(json){self.fireEvent("addsequences",json);
}if(ids.length>0){Ext.ux.vardb.Cart.addSequencesToNewCart(ids,callback);
}else{var list_id=this.grid.store.baseParams.list_id;
var total=this.grid.store.getTotalCount();
Ext.ux.vardb.Cart.addListToNewCart(list_id,total,this.callback);
}}});
Ext.ux.vardb.quickcart.SearchGrid=Ext.extend(Ext.ux.vardb.Grid,{region:"center",frame:false,autoWidth:true,autoHeight:true,enableColumnMove:true,stripeRows:true,loadMask:true,collapsible:false,animCollapse:false,autoScroll:true,pagesize:10,initComponent:function(){var self=this;
var reader=new Ext.data.JsonReader({root:"sequences",totalProperty:"totalCount",idProperty:"sequence_id",fields:[{name:"sequence_id",type:"int"},{name:"identifier"},{name:"accession"},{name:"uploaded",type:"boolean"},{name:"rating"},{name:"taxon_identifier"},{name:"taxon_name"},{name:"pathogen_identifier"},{name:"pathogen_name"},{name:"pathogen_dtype"},{name:"family_identifier"},{name:"family_name"},{name:"subgroup_identifier"},{name:"subgroup_name"},{name:"ortholog_identifier"},{name:"ortholog_name"},{name:"disease_identifier"},{name:"disease_name"},{name:"country_identifier"},{name:"country_name"},{name:"ref_identifier"},{name:"ref_name"},{name:"strain"},{name:"pseudogene"},{name:"truncated"},{name:"location"},{name:"domains"},{name:"locus_tag"},{name:"defline"},{name:"gene"},{name:"product"},{name:"uniprot"},{name:"udate"},{name:"ntlength",type:"int"},{name:"aalength",type:"int"},{name:"method"},{name:"model"},{name:"score"},{name:"evalue"},{name:"selected"},{name:"translation"}]});
var store=new Ext.data.Store({url:vardb.webapp+"/ajax/lists/page.json",reader:reader,remoteSort:true,baseParams:{limit:this.pagesize}});
store.setDefaultSort("accession","asc");
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var builder=Ext.ux.vardb.ColumnBuilder;
var columns=[sm,builder.accessionColumn(),builder.tagsColumn(),builder.deflineColumn(),builder.taxonColumn(),builder.geneColumn(),builder.productColumn(),builder.ntlengthColumn(),builder.aalengthColumn()];
var toolbar=new Ext.PagingToolbar({pageSize:this.pagesize,store:store,displayInfo:true,displayMsg:"{0} - {1} of {2}",emptyMsg:"None",items:["-",this.createSelectMenu(),"-"]});
var config={disabled:true,viewConfig:{forceFit:true,deferEmptyText:false,emptyText:"No sequences to display"},store:store,columns:columns,sm:sm,tbar:toolbar};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.quickcart.SearchGrid.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.quickcart.Suggestions=function(config){config.callback=config.callback||Ext.emptyFn;
var store=new Ext.data.Store({url:vardb.webapp+"/search/ajax/suggestions.json",reader:new Ext.data.JsonReader({root:"results",totalProperty:"totalCount",idProperty:"keyword"},[{name:"keyword",mapping:"keyword"},{name:"type",mapping:"type"},{name:"identifier",mapping:"identifier"}]),baseParams:{limit:20}});
var combo=new Ext.form.ComboBox({store:store,minChars:2,fieldLabel:"Search",displayField:"keyword",typeAhead:true,loadingText:"Searching...",width:300,listWidth:200,hideTrigger:true,emptyText:"Search...",listeners:{specialkey:function(field,e){var value;
if(e.getKey()===e.ENTER){value=field.getValue().trim();
if(value!==""){config.callback(value);
}}}}});
return combo;
};
Ext.ux.vardb.explorer.CopyDialog=Ext.extend(Ext.Window,{title:"Copy/move sequences",width:400,closable:true,initComponent:function(){this.list_id=this.grid.list_id;
var store=new Ext.data.Store({url:vardb.webapp+"/ajax/user/carts.json",remoteSort:true,sortInfo:{field:"title",direction:"ASC"},reader:new Ext.data.JsonReader({root:"carts",totalProperty:"totalCount",idProperty:"list_id",fields:[{name:"list_id"},{name:"title"},{name:"cart",type:"boolean"},{name:"numsequences",type:"int"}]})});
store.load();
var cartField={xtype:"combo",hiddenName:"list_id",fieldLabel:"Destination",store:store,valueField:"list_id",displayField:"title",mode:"remote",triggerAction:"all",emptyText:"Select a cart",selectOnFocus:true,allowBlank:false};
var modeField={xtype:"combo",hiddenName:"mode",fieldLabel:"Mode",store:[["COPY","Copy sequences"],["MOVE","Move sequences"]],valueField:"value",displayField:"label",mode:"local",triggerAction:"all",selectOnFocus:true,value:this.mode};
this.form=new Ext.FormPanel({labelWidth:70,defaults:{width:200},items:[cartField,modeField],buttons:[{text:"Submit",formBind:true,scope:this,handler:this.submitHandler},{text:"Cancel",formBind:true,scope:this,handler:function(){this.hide();
}}]});
var config={items:this.form};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.explorer.CopyDialog.superclass.initComponent.apply(this,arguments);
this.show();
},submitHandler:function(){var to_list_id=this.form.getForm().findField("list_id").getValue();
var name=this.form.getForm().findField("list_id").getRawValue();
if(this.list_id===""){Ext.MessageBox.alert("Warning","Please select a cart");
return;
}var mode=this.form.getForm().findField("mode").getValue();
var params=this.getSelection(this.grid,"FILTERED");
params.from_list_id=this.list_id;
params.to_list_id=to_list_id;
var self=this;
var message=mode+" "+params.total+" sequences to "+name+"?";
var url="/ajax/lists/"+mode.toLowerCase()+".json";
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,url,params,this.callback);
},getSelection:function(grid,selection){var params={},filter;
params.total=0;
var ids=grid.getSelectedIds();
if(!selection){selection="FILTERED";
}if(ids.length>0){selection="CHECKED";
}if(selection==="CHECKED"){if(ids.length===0){if(!confirm("No sequences selected. Use current filter instead? ("+grid.store.getTotalCount()+")")){return;
}selection="FILTERED";
}else{params.ids=ids.join(",");
params.total=ids.length;
}}if(selection==="FILTERED"){filter=grid.store.baseParams.filter.trim();
if(filter===""){selection="ALL";
}else{params.filter=filter;
params.total=grid.store.getTotalCount();
}}if(selection==="ALL"){params.total=grid.store.getTotalCount();
}return params;
}});
Ext.ux.vardb.explorer.BatchLookupDialog=Ext.extend(Ext.Window,{title:"Bulk lookup by accessions",width:180,closable:true,resizable:true,constructor:function(callback){this.callback=callback;
Ext.ux.vardb.explorer.BatchLookupDialog.superclass.constructor.call(this);
},initComponent:function(){var accessionsField={xtype:"textarea",fieldLabel:"Accessions",name:"accessions",anchor:"-2",height:200,allowBlank:false};
this.form=new Ext.FormPanel({labelAlign:"top",bodyStyle:"padding: 5px 5px 0",defaults:{labelWidth:70},items:[accessionsField],buttons:[{text:"Submit",formBind:true,scope:this,handler:this.submitHandler},{text:"Cancel",scope:this,handler:function(){this.hide();
}}]});
this.items=[this.form];
Ext.ux.vardb.explorer.BatchLookupDialog.superclass.initComponent.apply(this,arguments);
this.show();
},submitHandler:function(){if(!this.form.getForm().isValid()){return;
}var self=this;
this.form.getForm().submit({url:vardb.webapp+"/ajax/lists/create_subset_fromaccessions.json",waitMsg:"Looking up accessions",failure:Ext.ux.vardb.Vardb.onFormFailure,scope:this,success:function(form,action){var cart=action.result;
self.hide();
if(self.callback){self.callback(cart);
}}});
}});
Ext.namespace("Ext.ux.vardb.explorer.regex");
Ext.ux.vardb.explorer.RegexDialog=Ext.extend(Ext.Window,{title:"Regular expression search",width:700,height:450,layout:"border",closable:true,resizable:true,pagesize:10,initComponent:function(){this.list_id=this.grid.list_id;
var self=this;
var controller=this.controller;
var list_id=this.list_id;
var regextab=Ext.ux.vardb.explorer.regex.RegexTab(controller,this);
var prositetab=Ext.ux.vardb.explorer.regex.PrositeTab(controller,this);
var aatab=Ext.ux.vardb.explorer.regex.AminoAcidTab(controller,this);
function onSequencesAdded(){}this.sequencegrid=new Ext.ux.vardb.explorer.regex.SequenceTable({controller:controller,list_id:list_id,pagesize:this.pagesize,onSuccess:onSequencesAdded});
this.matchgrid=new Ext.ux.vardb.explorer.regex.MatchTable({controller:controller,list_id:list_id,pagesize:this.pagesize,onSuccess:onSequencesAdded});
var formtabs=new Ext.TabPanel({deferredRender:true,layoutOnTabChange:true,defaults:{autoScroll:true},activeTab:0,region:"north",items:[regextab,prositetab,aatab]});
var gridtabs=new Ext.TabPanel({deferredRender:true,layoutOnTabChange:true,defaults:{autoScroll:true,hideMode:"offsets"},activeTab:0,region:"center",items:[this.sequencegrid,this.matchgrid]});
var closeButton={text:"Close",handler:function(){self.hide();
}};
this.items=[formtabs,gridtabs];
this.buttons=[closeButton];
this.defaults={split:false};
Ext.ux.vardb.explorer.RegexDialog.superclass.initComponent.apply(this,arguments);
this.show();
},doSearch:function(form,query,type){if(!form.getForm().isValid()){return;
}if(query===""){Ext.Msg.alert("Warning","Please enter a query");
return;
}var self=this;
form.getForm().submit({url:vardb.webapp+"/explorer/ajax/regex/search.json",params:{list_id:self.list_id,type:type},waitMsg:"Searching...",failure:Ext.ux.vardb.Vardb.onFormFailure,success:function(form,action){var identifier=action.result.identifier;
self.sequencegrid.enable();
self.sequencegrid.store.baseParams.identifier=identifier;
self.sequencegrid.store.load({params:{start:0,limit:self.pagesize}});
self.matchgrid.enable();
self.matchgrid.store.baseParams.identifier=identifier;
self.matchgrid.store.load({params:{start:0,limit:self.pagesize}});
}});
}});
Ext.ux.vardb.explorer.regex.FormTab=function(controller,dialog,config){var form;
function submitHandler(){var query=form.getForm().findField("query").getValue().trim();
dialog.doSearch(form,query,config.type);
}var instructionsField={xtype:"label",html:config.instructions+"<br/><br/>"};
var queryField={xtype:"textfield",fieldLabel:"Query",name:"query",width:300,value:config.example};
var submitButton=new Ext.Button({text:"Search",formBind:true,handler:submitHandler});
var fieldset={layout:"column",defaults:{bodyStyle:"padding-right: 5px"},items:[{layout:"form",labelWidth:45,items:[queryField]},{layout:"form",items:[submitButton]}]};
form=new Ext.FormPanel({title:config.title,labelWidth:60,autoHeight:true,frame:true,items:[instructionsField,fieldset]});
return form;
};
Ext.ux.vardb.explorer.regex.RegexTab=function(controller,dialog){var config={type:"REGEX",title:"Perl syntax",example:"DIGDI[IRV]",instructions:"Enter a regular expression using classic Perl-like syntax"};
return Ext.ux.vardb.explorer.regex.RegexTab.superclass.constructor.call(this,controller,dialog,config);
};
Ext.extend(Ext.ux.vardb.explorer.regex.RegexTab,Ext.ux.vardb.explorer.regex.FormTab);
Ext.ux.vardb.explorer.regex.PrositeTab=function(controller,dialog){var config={type:"PROSITE",title:"Prosite syntax",example:"[HKR]-[HKR]-x-x-[HKR].",instructions:'Enter a search query using <a href="http://br.expasy.org/tools/scnpsit3.html#pattern_syntax" target="_new">PROSITE</a> conventions'};
return Ext.ux.vardb.explorer.regex.PrositeTab.superclass.constructor.call(this,controller,dialog,config);
};
Ext.extend(Ext.ux.vardb.explorer.regex.PrositeTab,Ext.ux.vardb.explorer.regex.FormTab);
Ext.ux.vardb.explorer.regex.AminoAcidTab=function(controller,dialog){var config={type:"AA",title:"Amino acid pattern",example:"CX8CX3CX3-4CXC",instructions:"Enter a search query using single-letter amino acid codes or X for any amino acid, alteration using (H/K/R), and ranges using X4 or X4-8"};
return Ext.ux.vardb.explorer.regex.AminoAcidTab.superclass.constructor.call(this,controller,dialog,config);
};
Ext.extend(Ext.ux.vardb.explorer.regex.AminoAcidTab,Ext.ux.vardb.explorer.regex.FormTab);
Ext.ux.vardb.explorer.regex.SequenceTable=Ext.extend(Ext.ux.vardb.Grid,{initComponent:function(){var self=this;
var reader=new Ext.data.JsonReader({root:"sequences",totalProperty:"totalCount",idProperty:"id",fields:[{name:"id",type:"int"},{name:"identifier"},{name:"accession"},{name:"uploaded"},{name:"taxon_identifier"},{name:"taxon_name"},{name:"pathogen_identifier"},{name:"pathogen_name"},{name:"family_identifier"},{name:"family_name"},{name:"pseudogene"},{name:"truncated"},{name:"defline"},{name:"gene"},{name:"product"},{name:"translation"},{name:"hits"},{name:"matches"},{name:"tags_id"},{name:"tags_name"},{name:"tags_description"},{name:"tags_color"},{name:"tags_bgcolor"},{name:"tags_bundle"},{name:"tags_readonly"}]});
var store=new Ext.data.Store({url:vardb.webapp+"/explorer/ajax/regex/sequences.json",reader:reader,remoteSort:true});
store.setDefaultSort("accession","asc");
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var r=Ext.ux.vardb.Renderer;
function renderTags(value,p,r){return Ext.ux.vardb.Renderer.renderTags(value,p,r,this.list_id);
}var expander=new Ext.ux.vardb.explorer.regex.Expander(80);
var tooltips=Ext.ux.vardb.Constants.tooltips;
var columns=[expander,sm,{header:"Accession",width:75,sortable:true,dataIndex:"accession",renderer:r.renderAccessionPopup},{header:"Tags",sortable:false,width:75,dataIndex:"tags_name",renderer:renderTags,tooltip:tooltips.tags},{header:"Description",width:75,sortable:true,dataIndex:"defline",tooltip:tooltips.defline},{header:"Taxon",width:50,sortable:true,dataIndex:"taxon_name",renderer:r.renderPathogenPopup},{header:"Family",width:50,sortable:true,dataIndex:"family_name",renderer:r.renderFamilyPopup},{header:"Gene",width:50,sortable:true,dataIndex:"gene"},{header:"Product",width:50,sortable:true,dataIndex:"product"},{header:"Matches",sortable:false,dataIndex:"hits"}];
var table=this;
var addToWorksheetButton={xtype:"button",text:"Add to current worksheet",formBind:true,scope:this,handler:this.addToWorksheet};
var addToCartButton={xtype:"button",text:"Add to cart",formBind:true,scope:this,handler:this.addToWorksheet};
var addAsNewcartButton={xtype:"button",text:"Add as new cart",formBind:true,scope:this,handler:function(){Ext.ux.vardb.explorer.Services.createSubset(self,self.controller,self.onSuccess);
}};
var items=[];
if(this.list_id){items.push(addToWorksheetButton);
}items.push(addToCartButton);
items.push(addAsNewcartButton);
var actionmenu={text:"Action",menu:{items:items}};
var tagmenu={text:"Tags",menu:{items:[{text:"Tag sequences",handler:function(){var dialog=new Ext.ux.vardb.tags.ApplyTagDialog({grid:self,callback:self.onTagSequences});
}}]}};
var toolbar=new Ext.PagingToolbar({plugins:new Ext.ux.Andrie.pPageSize({variations:[5,10,20,30]}),pageSize:this.pagesize,store:store,displayInfo:true,displayMsg:"{0} - {1} of {2}",emptyMsg:"None",items:["-",this.createSelectMenu(),"-",actionmenu,"-",tagmenu]});
var config={title:"Sequences",disabled:true,maskDisabled:false,frame:false,autoWidth:true,height:400,enableColumnMove:true,stripeRows:true,store:store,loadMask:true,collapsible:false,animCollapse:false,columns:columns,viewConfig:{forceFit:true},sm:sm,plugins:expander,tbar:toolbar};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.explorer.regex.SequenceTable.superclass.initComponent.apply(this,arguments);
},addToWorksheet:function(){var ids=this.getSelectedIds();
if(ids.length>0){this.addSelectedSequences(ids);
}else{this.addAllSequences();
}},onAddedToWorksheet:function(){this.controller.fireEvent("addsequences",this.list_id);
this.onSuccess();
},onTagSequences:function(){this.store.reload();
},addSelectedSequences:function(ids){var self=this;
Ext.MessageBox.confirm("Confirm","Add the "+ids.length+" selected items to the current worksheet?",function(btn){if(btn!=="yes"){return;
}var url="/ajax/cart/sequences/add.json";
var params={ids:ids.join(",")};
if(self.list_id){params.list_id=self.list_id;
}Ext.ux.vardb.Cart.updateCart(url,params,self.onAddedToWorksheet);
});
},addAllSequences:function(){var self=this;
var total=this.store.getTotalCount();
var message="No items selected. Add all the search results to the current worksheet? ("+total+")";
Ext.MessageBox.confirm("Confirm",message,function(btn){if(btn!=="yes"){return;
}var url="/ajax/cart/query/add.json";
var params={query:self.store.baseParams.query};
if(self.list_id){params.list_id=self.list_id;
}Ext.ux.vardb.Cart.updateCart(url,params,self.onAddedToWorksheet);
});
}});
Ext.ux.vardb.explorer.regex.Expander=function(maxcolumns){function formatMatches(sequence,matches){var positions=[],index;
for(index=0;
index<sequence.length;
index++){positions[index]=[];
}var colors=["red","green","orange","yellow","blue","gray"];
var colorindex=0;
var groups=[],color;
var pattern,name,locations,location,start,end,i,j,position;
var patterns=matches.split(";");
for(i=0;
i<patterns.length;
i++){pattern=patterns[i];
name=pattern.substring(0,pattern.indexOf(":"));
if(!groups[name]){color=colors[colorindex];
colorindex++;
if(colorindex>=colors.length){colorindex=0;
}groups[name]=color;
}locations=pattern.substring(pattern.indexOf(":")+1).split(",");
for(j=0;
j<locations.length;
j++){location=locations[j];
start=parseInt(location.substring(0,location.indexOf("-")),10);
end=parseInt(location.substring(location.indexOf("-")+1),10);
for(position=start;
position<=end;
position++){positions[position].push(name);
}}}var buffer=[],aa;
for(index=0;
index<sequence.length;
index++){aa=sequence.substring(index,index+1);
if(positions[index].length>0){color=groups[positions[index][0]];
buffer.push('<span style="color:'+color+';" title="');
buffer.push(positions[index].join(","));
buffer.push('">');
}buffer.push(aa);
if(positions[index].length>0){buffer.push("</span>");
}if(index!==0&&index%maxcolumns===0){buffer.push("<br/>");
}}return buffer.join("");
}var expander=new Ext.grid.RowExpander({tpl:new Ext.XTemplate('<p style="background-color:white;margin-left:10px;font-family:monospace;">',"{[this.formatSequence(values.translation,values.matches)]}<br/>","</p>",{formatSequence:function(translation,matches){return formatMatches(translation,matches);
}})});
return expander;
};
Ext.ux.vardb.explorer.regex.MatchTable=Ext.extend(Ext.ux.vardb.Grid,{initComponent:function(){var reader=new Ext.data.JsonReader({root:"matches",totalProperty:"totalCount",fields:[{name:"regex"},{name:"match"},{name:"count",type:"int"}]});
var store=new Ext.data.GroupingStore({url:vardb.webapp+"/explorer/ajax/regex/matches.json",reader:reader,sortInfo:{field:"count",direction:"DESC"},remoteSort:true,remoteGroup:true});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
function renderRegex(value,p,r){return String.format("<a href=\"#\" onclick=\"new Ext.ux.vardb.explorer.WebLogo({identifier: '{1}', regex: '{2}'})\">{0}</span>",value,store.baseParams.identifier,r.data.regex);
}function renderMatch(value,p,r){return String.format('<span style="font-family:monospace;">{0}</span>',value);
}var columns=[{header:"Pattern",width:75,sortable:true,dataIndex:"regex",renderer:renderRegex},{header:"Match",width:75,sortable:true,dataIndex:"match",renderer:renderMatch},{header:"Count",width:50,sortable:true,dataIndex:"count"}];
var view=new Ext.grid.GroupingView({forceFit:true,hideGroupedColumn:true,groupTextTpl:'{text} ({[values.rs.length]} {[values.rs.length > 1 ? "matches" : "match"]})'});
var toolbar=new Ext.PagingToolbar({plugins:new Ext.ux.Andrie.pPageSize({variations:[5,10,20,30]}),pageSize:this.pagesize,store:store,displayInfo:true,displayMsg:"{0} - {1} of {2}",emptyMsg:"None"});
var config={title:"Matches",disabled:true,maskDisabled:false,frame:false,autoWidth:true,height:400,enableColumnMove:true,stripeRows:true,store:store,loadMask:true,collapsible:false,animCollapse:false,columns:columns,view:view,sm:sm,tbar:toolbar};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.explorer.regex.MatchTable.superclass.initComponent.apply(this,arguments);
},onAddedToWorksheet:function(){this.controller.fireEvent("addsequences",this.list_id);
this.onSuccess();
},addSelectedSequences:function(ids){var self=this;
Ext.MessageBox.confirm("Confirm","Add the "+ids.length+" selected items to the current worksheet?",function(btn){if(btn!=="yes"){return;
}var url="/ajax/cart/sequences/add.json";
var params={ids:ids.join(",")};
if(self.list_id){params.list_id=self.list_id;
}Ext.ux.vardb.Cart.updateCart(url,params,self.onAddedToWorksheet);
});
},addAllSequences:function(){var self=this;
var total=this.store.getTotalCount();
var message="No items selected. Add all the search results to the current worksheet? ("+total+")";
Ext.MessageBox.confirm("Confirm",message,function(btn){if(btn!=="yes"){return;
}var url="/ajax/cart/query/add.json";
var params={query:self.store.baseParams.query};
if(self.list_id){params.list_id=self.list_id;
}Ext.ux.vardb.Cart.updateCart(url,params,self.onAddedToWorksheet);
});
},addToWorksheet:function(){var ids=this.getSelectedIds();
if(ids.length>0){this.addSelectedSequences(ids);
}else{this.addAllSequences();
}}});
Ext.ux.vardb.explorer.GagDialog=Ext.extend(Ext.Window,{title:"Glycosaminoglycan binding site search",width:700,height:450,layout:"border",closable:true,resizable:true,defaults:{split:true},initComponent:function(){var patternField=this.createPatternField("XBBXBX,XBBXXBX,XBBXXXBX,XBBBXXBX".split(","));
var bField=this.createMacroField("b","Basic residues (B)","HKR");
var xField=this.createMacroField("x","Any residue (X)","GASTCVLIMPFYWDENQHKR");
this.sequencegrid=new Ext.ux.vardb.explorer.regex.SequenceTable(this.controller,this.list_id,this.pagesize,this.onSequencesAdded);
this.matchgrid=new Ext.ux.vardb.explorer.regex.MatchTable(this.controller,this.list_id,this.pagesize,this.onSequencesAdded);
var submitButton=new Ext.Button({text:"Search",formBind:true,scope:this,handler:this.submitHandler});
var fieldset={layout:"column",defaults:{bodyStyle:"padding-right: 5px"},items:[{layout:"form",items:[patternField]},{layout:"form",items:[submitButton]}]};
this.form=new Ext.FormPanel({labelWidth:100,autoHeight:true,region:"north",frame:true,items:[fieldset,bField,xField]});
var tabs=new Ext.TabPanel({deferredRender:true,layoutOnTabChange:true,defaults:{autoScroll:true,hideMode:"offsets"},activeTab:0,region:"center",items:[this.sequencegrid,this.matchgrid]});
var config={items:[this.form,tabs],buttons:[{text:"Close",scope:this,handler:function(){this.hide();
}}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.explorer.GagDialog.superclass.initComponent.apply(this,arguments);
this.show();
},submitHandler:function(){if(!this.form.getForm().isValid()){return;
}var self=this;
this.form.getForm().submit({url:vardb.webapp+"/explorer/ajax/regex/gagsearch.json",params:{list_id:self.list_id},waitMsg:"Searching...",failure:Ext.ux.vardb.Vardb.onFormFailure,success:function(form,action){var identifier=action.result.identifier;
self.sequencegrid.enable();
self.sequencegrid.store.baseParams.identifier=identifier;
self.sequencegrid.store.load({params:{start:0,limit:self.pagesize}});
self.matchgrid.enable();
self.matchgrid.store.baseParams.identifier=identifier;
self.matchgrid.store.load({params:{start:0,limit:self.pagesize}});
}});
},createPatternField:function(patterns){var data=[],index,pattern;
for(index=0;
index<patterns.length;
index++){pattern=patterns[index];
data.push([pattern,pattern]);
}var field=new Ext.ux.Andrie.Select({fieldLabel:"GAG patterns",width:300,multiSelect:true,minLength:1,name:"query",valueField:"identifier",displayField:"name",triggerAction:"all",mode:"local",emptyText:"Select a pattern",forceSelection:true,value:patterns,store:new Ext.data.ArrayStore({fields:["identifier","name"],data:data})});
return field;
},createMacroField:function(fieldName,fieldLabel,values){var residues="HKRGASTCVLIMPFYWDENQ";
var data=[],index,residue;
for(index=0;
index<residues.length;
index++){residue=residues.substring(index,index+1);
data.push([residue,residue]);
}var value=[];
for(index=0;
index<values.length;
index++){value.push(values.substring(index,index+1));
}var field=new Ext.ux.Andrie.Select({fieldLabel:fieldLabel,width:300,multiSelect:true,minLength:1,name:fieldName,valueField:"identifier",displayField:"name",triggerAction:"all",mode:"local",emptyText:"Select a pattern",forceSelection:true,value:value,store:new Ext.data.ArrayStore({fields:["identifier","name"],data:data})});
return field;
},onSequencesAdded:function(cart){}});
Ext.ux.vardb.explorer.WebLogo=Ext.extend(Ext.Window,{layout:"fit",width:250,height:210,title:"Web logo",initComponent:function(){var html=String.format('<img src="{0}/explorer/ajax/regex/weblogo.img?identifier={1}&regex={2}" alt="Generating..."/>',vardb.webapp,this.identifier,escape(this.regex));
var config={html:html,buttons:[{text:"Close",scope:this,handler:function(){this.hide();
}}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.explorer.WebLogo.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.explorer.BundleTab=Ext.extend(Ext.ux.vardb.Grid,{hideMode:Ext.isIE?"offsets":"display",headerAsText:false,closable:true,frame:false,autoWidth:true,autoHeight:true,enableColumnMove:true,stripeRows:true,loadMask:true,collapsible:false,animCollapse:false,tabtype:"BUNDLE",pagesize:30,initComponent:function(){var grid=this;
this.bundle_id=this.bundle.bundle_id;
var bundle_id=this.bundle_id;
var controller=this.controller;
var reader=new Ext.data.JsonReader();
var store=new Ext.data.Store({url:vardb.webapp+"/tags/ajax/bundle.json",reader:reader,remoteSort:true,sortInfo:{field:"name",direction:"ASC"},baseParams:{bundle_id:bundle_id}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
function renderTagName(value,p,r){return'<a href="#" onclick="Ext.ux.vardb.tags.Services.editTag(\''+r.data.id+"')\">"+value+"</a>";
}var columns=[],index,field;
columns.push(sm);
columns.push({header:"Name",width:100,sortable:true,dataIndex:"name",renderer:renderTagName});
for(index=0;
index<this.bundle.definitions.length;
index++){field=this.bundle.definitions[index];
columns.push({header:field.name,sortable:true,dataIndex:field.name,tooltip:field.description});
}columns.push({header:"Count",width:50,sortable:true,dataIndex:"numsequences"});
var editmenu=this.createSelectMenu();
var tagmenu={text:"Tags",disabled:this.bundle.readonly,menu:{items:[{text:"Edit bundle",handler:function(btn){var dialog=new Ext.ux.vardb.tags.EditBundleDialog({bundle_id:bundle_id});
}},"-",{text:"Add tag",handler:function(btn){grid.newTag(bundle_id);
}},{text:"Upload tags",handler:function(btn){var dialog=new Ext.ux.vardb.tags.UploadTagsDialog({bundle_id:bundle_id,callback:function(bundle){grid.loadGrid();
}});
}},{text:"Add attribute",handler:function(btn){var dialog=new Ext.ux.vardb.tags.DefinitionDialog({bundle_id:bundle_id,callback:this.loadGrid});
}},{text:"Delete tag(s)",handler:function(btn){grid.deleteSelectedTags(bundle_id);
}},"-",{text:"Upload join file",handler:function(){var dialog=new Ext.ux.vardb.tags.UploadJoinDialog({bundle_id:bundle_id,callback:function(json){controller.fireEvent("updatejoin");
}});
}}]}};
var downloadmenu={text:"Download",menu:{items:[{text:"Download bundle",handler:function(btn){var dialog=new Ext.ux.vardb.tags.DownloadBundleDialog({grid:grid});
}},{text:"Create/download join",handler:function(btn){Ext.ux.vardb.tags.Services.joinByBundle(bundle_id);
}}]}};
var analysismenu={text:"Analysis",menu:{items:[{text:"Summary",handler:function(btn){var dialog=new Ext.ux.vardb.tags.SummaryDialog({bundle_id:bundle_id});
}}]}};
var reloadMenu={text:"Reload",handler:function(btn){grid.reloadTable();
}};
var toolbar=new Ext.PagingToolbar({plugins:new Ext.ux.Andrie.pPageSize({variations:[5,10,20,30]}),pageSize:this.pagesize,store:store,displayInfo:true,displayMsg:"Tags {0} - {1} of {2}",emptyMsg:"No tags to display",items:["-",reloadMenu,"-",editmenu,"-",tagmenu,"-",downloadmenu,"-",analysismenu]});
var config={id:"tab_bundle_"+this.bundle.bundle_id,title:this.bundle.name,tabTip:this.bundle.description,viewConfig:{forceFit:true},tbar:toolbar,sm:sm,store:store,columns:columns};
store.load({params:{start:0,limit:this.pagesize}});
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.explorer.BundleTab.superclass.initComponent.apply(this,arguments);
this.viewConfig.emptyText='<div class="emptyText">No tags.</div>';
controller.addListener("addtag",function(tag){if(tag.bundle_id!==bundle_id){return;
}grid.reloadTable();
});
controller.addListener("deletetag",function(tag){if(tag.bundle_id!==bundle_id){return;
}grid.reloadTable();
});
controller.addListener("addattribute",function(attribute){if(attribute.bundle_id!==bundle_id){return;
}grid.reloadTable();
});
controller.addListener("deleteattribute",function(tag){if(tag.bundle_id!==bundle_id){return;
}grid.reloadTable();
});
},reloadTable:function(){this.store.reload();
},loadGrid:function(){this.store.reload();
},deleteSelectedTags:function(bundle_id){var grid=this;
var ids=this.getSelectedIds();
if(ids.length===0){Ext.MessageBox.alert("Alert","No tags selected");
return;
}var message="Remove the selected tags? ("+ids.length+")";
if(ids.length===1){message="Remove the selected tag? ("+ids.length+")";
}var params={bundle_id:bundle_id,ids:ids.join(",")};
Ext.ux.vardb.Vardb.ajaxRequestConfirm(message,"/tags/ajax/tags/delete.json",params,function(json){Ext.MessageBox.alert("Success",json.message);
grid.store.load({params:{start:0}});
});
},newTag:function(bundle_id){var controller=this.controller;
var dialog=new Ext.ux.vardb.tags.NamePromptDialog({type:"tag",callback:function(name){var params={bundle_id:bundle_id,name:name,ids:""};
Ext.ux.vardb.Vardb.ajaxRequest("/tags/ajax/tags/new.json",params,function(tag){controller.fireEvent("addtag",tag);
});
}});
}});
Ext.ux.vardb.explorer.AlignmentTab=Ext.extend(Ext.ux.vardb.Grid,{tabtype:"ALIGNMENT",pagesize:30,headerAsText:false,closable:true,layout:"fit",frame:true,enableColumnMove:true,loadMask:true,collapsible:false,animCollapse:false,initComponent:function(){var grid=this;
var identifier=this.alignment.identifier;
var store=new Ext.data.Store({url:vardb.webapp+"/ajax/alignment.json",baseParams:{identifier:this.alignment.identifier},remoteSort:true,sortInfo:{field:"accession",direction:"ASC"},reader:new Ext.data.JsonReader({root:"sequences",totalProperty:"totalCount",idProperty:"identifier",fields:[{name:"id",type:"int"},{name:"identifier"},{name:"accession"},{name:"uploaded",type:"boolean"},{name:"translation"}]})});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
function renderAccession(value,p,r){if(value==="Consensus"){return value;
}return String.format('<a href="#" onclick="vardb.sequencePopup(\'{0}\')">{1}</a>',r.data.accession,value);
}function renderTranslation(value,p,r){return'<span style="font-family:monospace;">'+value+"</span>";
}var tooltips=Ext.ux.vardb.Constants.tooltips;
var cm=new Ext.grid.ColumnModel([sm,{header:"Accession",width:100,dataIndex:"accession",renderer:renderAccession,tooltip:tooltips.accession},{header:"Translation",width:800,dataIndex:"translation",renderer:renderTranslation,tooltip:tooltips.accession}]);
function onDelete(){alert("sequence deleted from alignment");
}var editmenu=this.createSelectMenu();
var viewmenu={text:"Viewers",menu:{items:[{text:"Fasta",scope:this,handler:function(){this.openWindow(identifier+".faln");
}},{text:"ClustalW",scope:this,handler:function(){this.openWindow(identifier+".aln");
}},"-",{text:"varDB viewer",scope:this,handler:function(){this.openWindow(identifier+"/viewer.html");
}},{text:"JalView",scope:this,handler:function(){this.openWindow(identifier+"/jalview.html");
}}]}};
var analysismenu={text:"Tools",menu:{items:[{text:"Analyze Variability",handler:function(){alert("NOT IMPLEMENTED YET");
}}]}};
var toolbar=new Ext.PagingToolbar({plugins:new Ext.ux.Andrie.pPageSize({variations:[5,10,20,30]}),pageSize:this.pagesize,store:store,displayInfo:true,displayMsg:"{0} - {1} of {2}",emptyMsg:"None",items:["-",editmenu,"-",viewmenu,"-",analysismenu]});
var config={id:"tab_alignment_"+this.alignment.identifier,title:this.alignment.name,viewConfig:{forceFit:true},cm:cm,sm:sm,store:store,tbar:toolbar};
store.load({params:{start:0,limit:this.pagesize}});
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.explorer.AlignmentTab.superclass.initComponent.apply(this,arguments);
},openWindow:function(suburl){var url=vardb.webapp+"/alignments/"+suburl;
Ext.ux.vardb.Vardb.openWindow(url);
}});
Ext.ux.vardb.explorer.AlignDialog=Ext.extend(Ext.Window,{title:"Align sequences using Mafft",width:400,closable:true,resizable:true,initComponent:function(){var params={};
params.name="alignment";
params.strategy="AUTO";
var matrixField=new Ext.ux.vardb.SelectList({data:[["BLOSUM30","BLOSUM30"],["BLOSUM45","BLOSUM45"],["BLOSUM62","BLOSUM62"],["BLOSUM80","BLOSUM80"],["JTT100","JTT100"],["JTT200","JTT200"]],hiddenName:"matrix",fieldLabel:"Score matrix",value:"BLOSUM62"});
var strategyField=new Ext.ux.vardb.SelectList({data:[["AUTO","Auto (Moderately accurate)"],["FFT_NS_1","FFT-NS-1 (Very fast)"],["FFT_NS_2","FFT-NS-2 (Fast; progressive)"],["FFT_NS_i2","FFT-NS-i2 (Medium; iterative)"],["FFT_NS_i","FFT-NS-i (Slow)"],["L_INS_i","L-INS-i (Very slow)"],["E_INS_i","E-INS-i (Very slow)"]],hiddenName:"strategy",fieldLabel:"Strategy",value:"AUTO"});
var op_field={xtype:"textfield",fieldLabel:"Gap open",name:"op",width:50};
var ep_field={xtype:"textfield",fieldLabel:"Gap extension",name:"ep",width:50};
var nameField={xtype:"textfield",fieldLabel:"Title",name:"name",value:params.name,width:232};
var typeField={xtype:"combo",hiddenName:"sequenceType",fieldLabel:"Sequence type",valueField:"value",displayField:"label",store:[["AA","Protein alignment"],["NT","Nucleotide alignment"]],mode:"local",triggerAction:"all",selectOnFocus:true,allowBlank:false,value:"AA"};
this.form=new Ext.FormPanel({labelWidth:100,url:"",defaults:{width:230,allowBlank:false},defaultType:"textfield",items:[nameField,typeField,strategyField,matrixField,op_field,ep_field],buttons:[{text:"Align",formBind:true,scope:this,handler:this.submitHandler},{text:"Cancel",scope:this,handler:function(){this.hide();
}}]});
var config={items:[this.form]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.explorer.AlignDialog.superclass.initComponent.apply(this,arguments);
this.show();
},openWindow:function(url,params,message,num){message+=" ("+num+")";
var self=this;
Ext.MessageBox.confirm("Confirm",message,function(btn){if(btn!=="yes"){return;
}var href=Ext.ux.vardb.Vardb.buildHref(url,params);
var options="x=500,y=500,width=500,height=300,scrollbars=1,resizable=1";
Ext.ux.vardb.Vardb.openWindow(href,"Alignment progress",options);
self.hide();
});
},doAlignment:function(url,params,message,num){if(num===0){Ext.MessageBox.alert("Alert","No sequences selected");
return;
}if(num===1){Ext.MessageBox.alert("Alert","At least 2 sequences are needed to create an alignment");
return;
}this.openWindow(url,params,message,num);
},alignSelected:function(params,ids){var url="/alignlist.html";
params.ids=ids.join(",");
params.name+=" ("+ids.length+" selected)";
var message="Align the selected sequences?";
var num=ids.length;
this.doAlignment(url,params,message,num);
},alignFiltered:function(params){var url="/alignlist.html";
params.filter=this.grid.store.baseParams.filter.trim();
if(params.filter!==""){params.name+=" ("+params.filter+")";
}var message="Align all sequences using current filter?";
var num=this.grid.store.getTotalCount();
this.doAlignment(url,params,message,num);
},submitHandler:function(){var params={};
params.list_id=this.grid.list_id;
params.name=this.form.getForm().findField("name").getValue();
params.sequenceType=this.form.getForm().findField("sequenceType").getValue();
params.strategy=this.form.getForm().findField("strategy").getValue();
params.matrix=this.form.getForm().findField("matrix").getValue();
params.op=this.form.getForm().findField("op").getValue();
params.ep=this.form.getForm().findField("ep").getValue();
var ids=this.grid.getSelectedIds();
if(ids.length>0){this.alignSelected(params,ids);
}else{this.alignFiltered(params);
}}});
Ext.ux.vardb.explorer.BlastClustDialog=Ext.extend(Ext.Window,{title:"BLASTclust",width:400,closable:true,resizable:true,initComponent:function(){var self=this;
var nameField={xtype:"textfield",fieldLabel:"Title",name:"name",value:"BLASTClust results",width:232};
this.progressBar=new Ext.ProgressBar({autoWidth:true,hidden:true,text:"Working..."});
this.submitButton=new Ext.Button({text:"Run Blastclust",scope:self,formBind:true,handler:this.submitHandler});
var typeField=new Ext.ux.vardb.SelectList({data:[["true","Protein"],["false","DNA"]],hiddenName:"protein",fieldLabel:"Type",value:"true"});
var minimumLengthField={xtype:"textfield",fieldLabel:"Minimum length",name:"minimumLength",value:"0.8",width:50};
var similarityThresholdField={xtype:"textfield",fieldLabel:"Similary Threshold",name:"similarityThreshold",value:"60",width:50};
this.form=new Ext.FormPanel({labelWidth:100,url:"",defaults:{width:230,allowBlank:false},defaultType:"textfield",monitorValid:true,items:[nameField,typeField,minimumLengthField,similarityThresholdField,this.progressBar],buttons:[this.submitButton,{text:"Cancel",scope:this,handler:function(){this.hide();
}}]});
var config={items:[this.form]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.explorer.BlastClustDialog.superclass.initComponent.apply(this,arguments);
this.show();
},submitHandler:function(){var win=this;
this.submitButton.disable();
var total=this.grid.store.getTotalCount();
Ext.MessageBox.confirm("Confirm","Run BLASTclust on all sequences? ("+total+")",function(btn){if(btn!=="yes"){return;
}win.form.getForm().submit({method:"post",waitTitle:"Connecting",waitMsg:"Sending data...",url:vardb.webapp+"/ajax/blastclust.json",params:{list_id:win.grid.list_id},timeout:30*60*1000,success:function(form,action){var cart=Ext.decode(action.response.responseText);
win.progressBar.reset();
win.progressBar.updateText("Done.");
win.controller.addCart(cart.list_id);
win.hide();
},failure:function(form,action){win.progressBar.reset();
win.hide();
Ext.ux.vardb.Vardb.onFormFailure(form,action);
}});
});
}});
Ext.ux.vardb.explorer.GroupDialog=Ext.extend(Ext.Window,{title:"Define groups",width:600,closable:true,numgroups:4,resizable:true,autoScroll:true,initComponent:function(){var self=this;
if(!this.grid){throw"grid property is not assigned in GroupDialog";
}if(this.numgroups>=10){this.autoHeight=false;
this.height=400;
}var items=[],num;
for(num=1;
num<=this.numgroups;
num++){items.push(this.createRow(num));
}var addGroupButton=new Ext.Button({text:"Add group",scope:self,handler:this.addGroup});
var submitButton=new Ext.Button({text:"Submit",scope:self,formBind:true,handler:this.submitHandler});
var form=new Ext.FormPanel({defaultType:"textfield",monitorValid:true,frame:true,items:items,buttons:[addGroupButton,submitButton]});
var config={items:[form],form:form};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.explorer.GroupDialog.superclass.initComponent.apply(this,arguments);
this.show();
},createRow:function(num){var row={xtype:"panel",layout:"column",anchor:"100%",items:[{columnWidth:0.35,layout:"form",labelWidth:55,items:[{xtype:"textfield",fieldLabel:"Group "+num,name:"group"+num+"name",anchor:"-5",allowBlank:(num>2)}]},{columnWidth:0.65,labelWidth:60,layout:"form",items:[{xtype:"textfield",fieldLabel:"Condition",name:"group"+num+"condition",anchor:"-5",allowBlank:(num>2)}]},{width:60,layout:"form",items:[{xtype:"button",text:"Preview",scope:this,formBind:true,handler:function(){this.previewQuery(num);
}}]}]};
return row;
},previewQuery:function(num){var query=this.form.getForm().findField("group"+num+"condition").getValue().trim();
if(query===""){alert("No condition specified.");
return;
}query=query+=" AND cart="+this.grid.list_id;
var dialog=new Ext.ux.vardb.explorer.Search({controller:this.controller,query:query});
},addGroup:function(){var num=this.numgroups+1;
var row=this.createRow(num);
this.form.add(row);
this.numgroups=num;
this.doLayout();
},submitHandler:function(){var self=this;
Ext.MessageBox.confirm("Confirm","Remove any existing groups and create groups based on the provided conditions?",function(btn){if(btn!=="yes"){return;
}self.form.getForm().submit({method:"post",waitTitle:"Connecting",waitMsg:"Sending data...",url:vardb.webapp+"/ajax/cart/groups/define.json",params:{list_id:self.grid.list_id,numgroups:self.numgroups},timeout:30*60*1000,success:function(form,action){var json=Ext.decode(action.response.responseText);
self.hide();
if(self.callback){self.callback(json);
}},failure:function(form,action){self.hide();
Ext.ux.vardb.Vardb.onFormFailure(form,action);
}});
});
}});
Ext.ux.vardb.explorer.SequenceGrid=Ext.extend(Ext.ux.vardb.LiveSequenceGrid,{initComponent:function(){var toolbaritems=this.createToolbarItems();
var config={toolbaritems:toolbaritems};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.explorer.SequenceGrid.superclass.initComponent.apply(this,arguments);
},addSequencesHandler:function(){var self=this;
var dialog=new Ext.ux.vardb.quickcart.QuickSearch({list_id:self.list_id});
dialog.on("addsequences",function(json){self.reloadGrid();
dialog.close();
});
},removeSequencesHandler:function(){var self=this;
Ext.ux.vardb.Cart.removeFromList(self,function(json){self.controller.fireEvent("deletesequences",self.list_id);
});
},createEditMenu:function(){var self=this;
var menu={text:"Edit",menu:{items:[{text:"Find/Add sequences",scope:this,handler:this.addSequencesHandler},{text:"Remove sequences",scope:this,handler:this.removeSequencesHandler}]}};
return menu;
},createSubsetHandler:function(){var self=this;
Ext.ux.vardb.Cart.createSubset(self,function(json){var tab=self.controller.addCart(json.list_id);
});
},cloneCartHandler:function(){var self=this;
Ext.ux.vardb.Cart.cloneCart(self,function(json){var tab=self.controller.addCart(json.list_id);
});
},copySequencesHandler:function(){var self=this;
var dialog=new Ext.ux.vardb.explorer.CopyDialog({grid:self,mode:"COPY",callback:function(json){dialog.close();
self.controller.fireEvent("addsequences",self.list_id);
self.controller.fireEvent("addsequences",json.list_id);
}});
},moveSequencesHandler:function(){var self=this;
var dialog=new Ext.ux.vardb.explorer.CopyDialog({grid:self,mode:"MOVE",callback:function(json){dialog.close();
self.controller.fireEvent("addsequences",self.list_id);
self.controller.fireEvent("addsequences",json.list_id);
}});
},createSubsetMenu:function(){var self=this;
var menu={text:"Subsets",menu:{items:[{text:"Create subset",scope:this,handler:this.createSubsetHandler},{text:"Clone cart",scope:this,handler:this.cloneCartHandler},"-",{text:"Copy sequences",scope:this,handler:this.copySequencesHandler},{text:"Move sequences",scope:this,handler:this.moveSequencesHandler}]}};
return menu;
},createToolMenu:function(){var self=this;
var menu={text:"Tools",menu:{items:[{text:"Regular expression search",scope:this,handler:function(btn){var dialog=new Ext.ux.vardb.explorer.RegexDialog({controller:self.controller,grid:self});
}},{text:"GAG binding site search",scope:this,handler:function(btn){var dialog=new Ext.ux.vardb.explorer.GagDialog({controller:self.controller,grid:self});
}},"-",{text:"BLASTClust",scope:this,handler:function(btn){var dialog=new Ext.ux.vardb.explorer.BlastClustDialog({controller:self.controller,grid:self});
}}]}};
return menu;
},mafftHandler:function(){var dialog=new Ext.ux.vardb.explorer.AlignDialog({grid:this});
},createAlignmentMenu:function(){var self=this;
var menu={text:"Align",menu:{items:[{text:"Mafft",scope:this,handler:this.mafftHandler}]}};
return menu;
},defineGroupsHandler:function(){var self=this;
var groups=new Ext.ux.vardb.explorer.GroupDialog({grid:self,callback:function(){self.reloadTable();
}});
},removeGroupsHandler:function(){var self=this;
Ext.ux.vardb.Cart.removeGroups(self.list_id,function(json){self.reloadTable();
});
},createGroupMenu:function(){var self=this;
var menu={text:"Groups",menu:{items:[{text:"Define groups",scope:this,handler:this.defineGroupsHandler},"-",{text:"Remove groups",scope:this,handler:this.removeGroupsHandler}]}};
return menu;
},tagSequencesHandler:function(){var self=this;
var dialog=new Ext.ux.vardb.tags.ApplyTagDialog({grid:self,callback:function(tag){self.controller.fireEvent("addtag",tag);
self.store.reload();
}});
},untagSequencesHandler:function(){var self=this;
Ext.ux.vardb.tags.Services.untagSequences(self,function(){self.reloadTable();
});
},createBundleHandler:function(){var self=this;
Ext.ux.vardb.tags.Services.createBundle(function(bundle){self.controller.addBundle(bundle.bundle_id);
});
},uploadBundleHandler:function(){var self=this;
var dialog=new Ext.ux.vardb.tags.UploadBundleDialog();
dialog.on({bundleuploaded:function(bundle){self.controller.onBundleUploaded(bundle);
}});
},createJoinHandler:function(){var self=this;
Ext.ux.vardb.Vardb.ajaxRequest("/ajax/lists/bundles.json",{list_id:self.list_id},function(bundles){var dialog=new Ext.ux.vardb.explorer.JoinDialog({controller:self.controller,list_id:self.list_id,bundles:bundles});
});
},tagCloudHandler:function(){Ext.ux.vardb.Cart.createTagCloud(this);
},createTagMenu:function(){var menu={text:"Tags",menu:{items:[{text:"Tag sequences",scope:this,handler:this.tagSequencesHandler},{text:"Un-tag sequences",scope:this,handler:this.untagSequencesHandler},"-",{text:"Create bundle",scope:this,handler:this.createBundleHandler},{text:"Upload bundle",scope:this,handler:this.uploadBundleHandler},"-",{text:" Tag cloud",scope:this,handler:this.tagCloudHandler}]}};
return menu;
},createToolbarItems:function(){var items=["<b>Cart</b>","-",this.createEditMenu(),"-",this.createSortMenu(),"-",this.createSubsetMenu(),"-",this.createTagMenu(),"-",this.createGroupMenu(),"-",this.createSummaryMenu(),"-",this.createDownloadMenu(),"-",this.createAlignmentMenu(),"-"];
return items;
}});
Ext.ux.vardb.explorer.CartTab=Ext.extend(Ext.Panel,{layout:"border",closable:true,headerAsText:false,hideMode:Ext.isIE?"offsets":"display",tabtype:"cart",forceLayout:true,initComponent:function(){var cart=this.cart;
var grid=new Ext.ux.vardb.explorer.SequenceGrid({controller:this.controller,list_id:this.cart.list_id,pagesize:20,counts:this.cart.counts,region:"center"});
var form=new Ext.ux.vardb.FilterForm({list_id:this.cart.list_id,counts:this.cart.counts,region:"east",collapsible:true,width:220,onFilter:function(filter){grid.store.baseParams.filter=filter;
grid.store.reload();
}});
var config={id:"tab_cart_"+cart.list_id,title:cart.title,defaults:{split:false},items:[form,grid]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.explorer.CartTab.superclass.initComponent.apply(this,arguments);
this.grid=grid;
this.form=form;
}});
Ext.ux.vardb.explorer.JoinDialog=Ext.extend(Ext.Window,{title:"Create join",width:600,height:300,closable:true,autoScroll:true,initComponent:function(){var items=[];
items.push(this.createPropertyCheckboxGroup());
var index,bundle,checkbox;
for(index=0;
index<this.bundles.rows.length;
index++){bundle=this.bundles.rows[index];
if(bundle.definitions.length>0){items.push(this.createBundleCheckboxGroup(bundle));
}}var tabpanel=new Ext.TabPanel({activeTab:0,deferredRender:true,autoScroll:true,enableTabScroll:true,layoutOnTabChange:true,items:items});
this.form=new Ext.FormPanel({items:[tabpanel]});
var config={items:[this.form],buttons:[{text:"Create Join Tab",scope:this,handler:function(){this.createJoin();
}}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.tags.JoinDialog.superclass.initComponent.apply(this,arguments);
this.show();
},createPropertyCheckboxGroup:function(){function createCheckboxGroup(title,properties){var items=[],index,property,item;
items.push({xtype:"label",text:title,cls:"x-form-check-group-label",anchor:"-15"});
for(index=0;
index<properties.length;
index++){property=properties[index];
items.push({boxLabel:property.name,name:"property."+property.name,checked:property.checked});
}return items;
}var checkboxgroup={title:"Sequence properties",xtype:"checkboxgroup",itemCls:"x-check-group-alt",fieldLabel:"Sequence properties",allowBlank:false,anchor:"95%",items:[{columnWidth:".25",items:createCheckboxGroup("Basic",this.properties.basic)},{columnWidth:".25",items:createCheckboxGroup("Physical",this.properties.physical)},{columnWidth:".25",items:createCheckboxGroup("Taxonomic",this.properties.taxonomic)},{columnWidth:".25",items:createCheckboxGroup("DB xrefs",this.properties.xrefs)}]};
return checkboxgroup;
},createBundleCheckboxGroup:function(bundle){var items=[],index,definition,item;
var checked=(this.bundles.rows.length===1);
for(index=0;
index<bundle.definitions.length;
index++){definition=bundle.definitions[index];
item={boxLabel:definition.name,name:bundle.bundle_id+"."+definition.id,checked:checked};
items.push(item);
}var checkboxes={xtype:"checkboxgroup",title:"Bundle: "+bundle.name,closable:true,columns:bundle.definitions.length>4?4:bundle.definitions.length,autoHeight:true,autoScroll:true,height:this.height,items:items};
return checkboxes;
},createJoin:function(){var properties=[],bundle_ids=[],definition_ids=[];
var values=this.form.getForm().getValues(true).split("&");
var index,value,start,before,after;
for(index=0;
index<values.length;
index++){value=values[index];
start=value.indexOf(".");
if(start===-1){continue;
}before=value.substring(0,start);
after=value.substring(start+1);
if(after.indexOf("=on")!==-1){after=after.substring(0,after.indexOf("=on"));
}if(before==="property"){properties.push(after);
}else{if(bundle_ids.indexOf(before)===-1){bundle_ids.push(before);
}definition_ids.push(after);
}}if(bundle_ids.length===0){Ext.MessageBox.alert("Warning","Cannot create join unless one or more bundle fields are selected");
return;
}var params={list_id:this.list_id,properties:properties.join(","),bundle_ids:bundle_ids.join(","),definition_ids:definition_ids.join(",")};
this.controller.addJoinTab(params);
this.close();
},properties:{basic:[{name:"accession",checked:true},{name:"gene",checked:true},{name:"product",checked:true},{name:"family",checked:true},{name:"genome",checked:true},{name:"chromosome",checked:false},{name:"ortholog",checked:false},{name:"ref",checked:false},{name:"rating",checked:false},{name:"domains",checked:false}],physical:[{name:"sequence",checked:false},{name:"ntlength",checked:true},{name:"spliced",checked:false},{name:"translation",checked:false},{name:"aalength",checked:true},{name:"codon_start",checked:false},{name:"transl_table",checked:false},{name:"protein",checked:false},{name:"molwt",checked:false},{name:"pseudogene",checked:true},{name:"truncated",checked:true},{name:"locus",checked:false},{name:"locus_tag",checked:false},{name:"strand",checked:false},{name:"start",checked:false},{name:"end",checked:false},{name:"splicing",checked:false},{name:"natype",checked:false},{name:"circular",checked:false},{name:"mol_type",checked:false}],taxonomic:[{name:"division",checked:false},{name:"taxon",checked:true},{name:"strain",checked:false},{name:"country",checked:false},{name:"subregion",checked:false},{name:"collection_date",checked:false},{name:"udate",checked:false},{name:"specific_host",checked:false},{name:"isolate",checked:false},{name:"isolation_source",checked:false},{name:"serogroup",checked:false},{name:"serotype",checked:false},{name:"clone",checked:false},{name:"segment",checked:false},{name:"allele",checked:false},{name:"plasmid",checked:false}],xrefs:[{name:"gi",checked:false},{name:"geneid",checked:false},{name:"protein_gi",checked:false},{name:"protein_id",checked:false},{name:"uniprot",checked:false},{name:"ec",checked:false}]}});
Ext.ux.vardb.explorer.JoinGrid=Ext.extend(Ext.ux.vardb.Grid,{title:"Join",frame:true,enableColumnMove:true,stripeRows:true,loadMask:true,collapsible:false,animCollapse:false,closable:true,pagesize:20,tooltip:"If this tab is closed, the join can be re-created using the Tags/Create join menu item",initComponent:function(){var self=this;
var store=new Ext.data.Store({url:vardb.webapp+"/tags/ajax/join_by_list.json",reader:new Ext.data.JsonReader(),remoteSort:true,sortInfo:{field:"name",direction:"ASC"},baseParams:{list_id:this.list_id,properties:this.properties,bundle_ids:this.bundle_ids,definition_ids:this.definition_ids}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var r=Ext.ux.vardb.Renderer;
var columns=[sm,{header:"accession",dataIndex:"accession",renderer:this.renderAccession},{header:"genome",dataIndex:"genome",renderer:this.renderGenome},{header:"family",dataIndex:"family",renderer:this.renderFamily},{header:"taxon",dataIndex:"taxon",renderer:this.renderTaxon},{header:"gene",dataIndex:"gene"},{header:"pseudogene",dataIndex:"pseudogene",renderer:r.renderPseudogene},{header:"truncated",dataIndex:"truncated",renderer:r.renderTruncated},{header:"ntlength",dataIndex:"ntlength",align:"right"},{header:"aalength",dataIndex:"aalength",align:"right"}];
var i,j,field,bundle,hidden;
for(i=0;
i<this.bundles.rows.length;
i++){bundle=this.bundles.rows[i];
for(j=0;
j<bundle.definitions.length;
j++){field=bundle.definitions[j];
if(this.isFieldHidden(field.id)){continue;
}columns.push({header:field.name,sortable:false,dataIndex:bundle.name+"$"+field.name,tooltip:field.description});
}}var editmenu=this.createSelectMenu();
var tbar=new Ext.PagingToolbar({plugins:new Ext.ux.Andrie.pPageSize({variations:[5,10,20,30,50,100]}),pageSize:this.pagesize,store:store,displayInfo:true,displayMsg:"{0} - {1} of {2}",emptyMsg:"No items to display",items:["-",editmenu]});
var config={viewConfig:{forceFit:true},store:store,columns:columns,sm:sm,tbar:tbar};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.explorer.JoinGrid.superclass.initComponent.apply(this,arguments);
this.addListener("activate",function(tab){tab.store.load({params:{start:0,limit:tab.pagesize}});
});
},isFieldHidden:function(definition_id){var index;
var definition_ids=this.definition_ids.split(",");
for(index=0;
index<definition_ids.length;
index++){if(parseInt(definition_ids[index],10)===parseInt(definition_id,10)){return false;
}}return true;
},renderAccession:function(value,p,r){return String.format('<a href="#" onclick="vardb.sequencePopup(\'{0}\')">{1}</a>',r.data.accession,value);
},renderFamily:function(value,p,r){return String.format('<a href="#" onclick="vardb.familyPopup(\'{0}\')">{1}</a>',r.data.family,value);
},renderGenome:function(value,p,r){return String.format('<a href="'+vardb.webapp+'/genomes/{0}.html" target="_blank">{1}</a>',r.data.genome,value);
},renderTaxon:function(value,p,r){return String.format('<a href="#" onclick="vardb.taxonPopup(\'{0}\')">{1}</a>',r.data.taxon,value);
}});
Ext.ux.vardb.explorer.Toolbar=Ext.extend(Ext.Toolbar,{height:25,initComponent:function(){var controller=this.controller;
var searchmenu={text:"Search",handler:function(btn){var dialog=new Ext.ux.vardb.quickcart.QuickSearch({});
dialog.on("addsequences",function(json){controller.onAddSequences(json);
});
}};
var batchlookupmenu={text:"Batch lookup",handler:function(btn){var dialog=new Ext.ux.vardb.explorer.BatchLookupDialog(function(cart){controller.addCart(cart.list_id);
});
}};
var usersequencesmenu={text:"Upload sequences",disabled:this.controller.userdetails.anonymous,handler:function(btn){var dialog=new Ext.ux.vardb.UploadSequencesDialog({maxUserSequences:controller.configuration.maxUserSequences,callback:function(cart){controller.addCart(cart.list_id);
}});
}};
var config={items:['<a href="'+vardb.webapp+'/homepage.html" class="explorer-toolbar" target="_blank">varDB homepage</a>',"-",searchmenu,"-",batchlookupmenu,"-",usersequencesmenu,"->",'<a href="'+vardb.webapp+'/user.html" class="explorer-toolbar" target="_blank">'+this.controller.userdetails.name+"</a>"]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.explorer.Toolbar.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.explorer.CartGrid=Ext.extend(Ext.ux.vardb.Grid,{id:"cartpanel",title:"Sequence carts",frame:false,autoWidth:true,height:166,stripeRows:true,loadMask:true,autoScroll:true,initComponent:function(){var self=this;
var store=new Ext.data.Store({url:vardb.webapp+"/ajax/user/carts.json",remoteSort:true,sortInfo:{field:"title",direction:"ASC"},reader:new Ext.data.JsonReader({root:"carts",totalProperty:"totalCount",idProperty:"list_id",fields:[{name:"list_id"},{name:"title"},{name:"cart",type:"boolean"},{name:"numsequences",type:"int"}]})});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20,singleSelect:true});
var config={viewConfig:{forceFit:true},sm:sm,store:store,columns:[sm,{header:"Name",width:70,sortable:true,dataIndex:"title",renderer:Ext.ux.vardb.Renderer.renderNameLink},{header:"Count",width:50,sortable:true,align:"right",dataIndex:"numsequences"}],tbar:this.createToolbar()};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.explorer.CartGrid.superclass.initComponent.apply(this,arguments);
this.viewConfig.emptyText='<div class="emptyText">No carts.</div>';
function onCellClick(grid,rowIndex,columnIndex,e){var fieldName=grid.getColumnModel().getDataIndex(columnIndex);
if(fieldName!=="title"){return;
}var record=grid.getStore().getAt(rowIndex);
self.controller.addCart(record.data.list_id);
}this.addListener("cellclick",onCellClick);
store.load();
},addCartHandler:function(){var self=this;
Ext.ux.vardb.Cart.addCart(function(json){self.controller.fireEvent("addcart",json.list_id);
});
},deleteCartHandler:function(){var self=this;
var id=this.getSelectedId();
Ext.ux.vardb.Cart.deleteCart(id,function(json){self.controller.fireEvent("deletecart",id);
});
},createActionMenu:function(){var menu={text:"Action",menu:{items:[{text:"Add cart",scope:this,handler:this.addCartHandler},{text:"Delete cart",scope:this,handler:this.deleteCartHandler}]}};
return menu;
},createToolbar:function(){var toolbar=new Ext.Toolbar({items:[this.createPrintButton(),"-",this.createSelectMenu(),"-",this.createActionMenu(),"->",this.createReloadButton()]});
return toolbar;
}});
Ext.ux.vardb.explorer.BundleGrid=Ext.extend(Ext.ux.vardb.Grid,{id:"bundlepanel",title:"Tag sets (bundles)",frame:false,autoWidth:true,height:166,stripeRows:true,loadMask:true,autoScroll:true,initComponent:function(){var self=this;
var store=new Ext.data.Store({url:vardb.webapp+"/ajax/user/bundles.json",remoteSort:true,sortInfo:{field:"title",direction:"ASC"},reader:new Ext.data.JsonReader({root:"rows",totalProperty:"totalCount",idProperty:"bundle_id",fields:[{name:"bundle_id",type:"int"},{name:"name"},{name:"readonly",type:"boolean"},{name:"numtags",type:"int"},{name:"numsequences",type:"int"}]})});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20,singleSelect:true});
var config={viewConfig:{forceFit:true},sm:sm,store:store,tbar:this.createToolbar(),columns:[sm,{header:"Name",width:80,sortable:true,dataIndex:"name",renderer:Ext.ux.vardb.Renderer.renderNameLink},{header:"Tags",width:50,sortable:true,dataIndex:"numtags",align:"right"},{header:"Sequences",width:50,sortable:true,dataIndex:"numsequences",align:"right"}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.explorer.BundleGrid.superclass.initComponent.apply(this,arguments);
this.viewConfig.emptyText='<div class="emptyText">No bundles.</div>';
function onCellClick(grid,rowIndex,columnIndex,e){var fieldName=grid.getColumnModel().getDataIndex(columnIndex);
if(fieldName!=="name"){return;
}var record=grid.getStore().getAt(rowIndex);
self.controller.addBundle(record.data.bundle_id);
}this.addListener("cellclick",onCellClick);
store.load();
},createBundleHandler:function(){var self=this;
Ext.ux.vardb.tags.Services.createBundle(function(bundle){self.controller.addBundle(bundle.bundle_id);
});
},deleteBundleHandler:function(){var self=this;
var id=this.getSelectedId();
Ext.ux.vardb.tags.Services.deleteBundle(id,function(bundle_id){self.controller.fireEvent("deletebundle",bundle_id);
});
},uploadBundleHandler:function(){var self=this;
var dialog=new Ext.ux.vardb.tags.UploadBundleDialog();
dialog.on({bundleuploaded:function(bundle){self.controller.onBundleUploaded(bundle);
}});
},createActionMenu:function(){var menu={text:"Action",menu:{items:[{text:"Create bundle",scope:this,handler:this.createBundleHandler},{text:"Upload bundle",scope:this,handler:this.uploadBundleHandler},{text:"Delete bundle",scope:this,handler:this.deleteBundleHandler}]}};
return menu;
},createToolbar:function(){var toolbar=new Ext.Toolbar({items:[this.createPrintButton(),"-",this.createSelectMenu(),"-",this.createActionMenu(),"->",this.createReloadButton()]});
return toolbar;
}});
Ext.ux.vardb.explorer.AlignmentGrid=Ext.extend(Ext.ux.vardb.Grid,{id:"alignmentpanel",title:"Alignments",frame:false,autoWidth:true,height:166,stripeRows:true,loadMask:true,autoScroll:true,initComponent:function(){var grid=this;
var controller=this.controller;
var store=new Ext.data.Store({url:vardb.webapp+"/ajax/user/alignments.json",remoteSort:true,sortInfo:{field:"name",direction:"ASC"},reader:new Ext.data.JsonReader({root:"alignments",totalProperty:"totalCount",idProperty:"identifier",fields:[{name:"id",type:"int"},{name:"identifier"},{name:"name"},{name:"description"},{name:"type"},{name:"numsequences",type:"int"},{name:"numcolumns",type:"int"},{name:"updated"}]})});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20,singleSelect:true});
var config={viewConfig:{forceFit:true},sm:sm,store:store,columns:[sm,{header:"Name",sortable:true,dataIndex:"name",renderer:Ext.ux.vardb.Renderer.renderNameLink},{header:"Rows",sortable:true,dataIndex:"numsequences",align:"right"},{header:"Cols",sortable:true,dataIndex:"numcolumns",align:"right"}],tbar:this.createToolbar()};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.explorer.AlignmentGrid.superclass.initComponent.apply(this,arguments);
this.viewConfig.emptyText='<div class="emptyText">No alignments.</div>';
function onCellClick(grid,rowIndex,columnIndex,e){var fieldName=grid.getColumnModel().getDataIndex(columnIndex);
if(fieldName!=="name"){return;
}var record=grid.getStore().getAt(rowIndex);
controller.addAlignment(record.data);
}this.addListener("cellclick",onCellClick);
store.load();
},deleteAlignmentHandler:function(){var self=this;
Ext.ux.vardb.Vardb.deleteUserAlignment(this.getSelectedId(),function(){self.store.reload();
});
},createActionMenu:function(){var self=this;
var menu={text:"Action",menu:{items:[{text:"Delete alignment",scope:this,handler:this.deleteAlignmentHandler}]}};
return menu;
},createToolbar:function(){var toolbar=new Ext.Toolbar({items:[this.createPrintButton(),"-",this.createSelectMenu(),"-",this.createActionMenu(),"->",this.createReloadButton()]});
return toolbar;
}});
Ext.ux.vardb.explorer.TaskGrid=Ext.extend(Ext.ux.vardb.Grid,{id:"taskpanel",title:"Tasks",frame:false,layout:"fit",autoWidth:true,autoHeight:true,maxHeight:180,autoScroll:true,enableColumnMove:true,stripeRows:true,loadMask:true,collapsible:false,animCollapse:false,initComponent:function(){var self=this;
var store=new Ext.data.Store({url:vardb.webapp+"/ajax/user/tasks.json",remoteSort:true,sortInfo:{field:"name",direction:"ASC"},reader:new Ext.data.JsonReader({root:"tasks",totalProperty:"totalCount",idProperty:"id",fields:[{name:"id"},{name:"name"},{name:"status"},{name:"cancelled",type:"boolean"},{name:"completed",type:"boolean"},{name:"redirect"},{name:"starttime"},{name:"endtime"}]})});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20,singleSelect:true});
var config={viewConfig:{forceFit:true},sm:sm,store:store,columns:[sm,{header:"Name",sortable:true,dataIndex:"name",renderer:this.renderName},{header:"Status",sortable:true,dataIndex:"status"},{header:"Started",sortable:true,dataIndex:"starttime"}],tbar:this.createToolbar()};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.explorer.TaskGrid.superclass.initComponent.apply(this,arguments);
this.viewConfig.emptyText='<div class="emptyText">No tasks.</div>';
store.load();
},renderName:function(value,p,record){return String.format('<a href="{1}" target="_blank">{0}</a>',value,vardb.webapp+"/task.html?id="+record.data.id);
},createToolbar:function(){var toolbar=new Ext.Toolbar({items:[this.createSelectMenu(),"->",this.createReloadButton()]});
return toolbar;
}});
Ext.ux.vardb.explorer.Accordian=Ext.extend(Ext.Panel,{id:"accordian",region:"west",split:true,collapsible:false,collapseMode:"mini",width:200,minWidth:150,border:true,baseCls:"x-plain",initComponent:function(){var self=this;
var controller=this.controller;
this.cartgrid=new Ext.ux.vardb.explorer.CartGrid({controller:controller});
this.bundlegrid=new Ext.ux.vardb.explorer.BundleGrid({controller:controller});
this.alignmentgrid=new Ext.ux.vardb.explorer.AlignmentGrid({controller:controller});
var config={defaults:{frame:true,collapsible:true,titleCollapse:true},items:[this.cartgrid,this.bundlegrid,this.alignmentgrid]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.explorer.Accordian.superclass.initComponent.apply(this,arguments);
controller.addListener("addcart",function(list_id){self.cartgrid.store.reload();
Ext.getCmp("cartpanel").expand();
});
controller.addListener("opencart",function(list_id){});
controller.addListener("deletecart",function(bundle_id){self.cartgrid.store.reload();
});
controller.addListener("addbundle",function(bundle_id){self.bundlegrid.store.reload();
Ext.getCmp("bundlepanel").expand();
});
controller.addListener("deletebundle",function(bundle_id){self.bundlegrid.store.reload();
});
controller.addListener("starttask",function(bundle_id){self.taskgrid.store.reload();
});
}});
Ext.ux.vardb.explorer.Explorer=Ext.extend(Ext.Viewport,{layout:"border",anonymous:true,title:"Title",initComponent:function(){this.alignments=[];
this.addEvents({addcart:true,opencart:true,deletecart:true,filter:true,addsequences:true,deletesequences:true,addbundle:true,deletebundle:true,addtag:true,deletetag:true,addattribute:true,deleteattribute:true,updatejoin:true,addalignment:true,startjob:true});
this.tabpanel=new Ext.TabPanel({region:"center",xtype:"tabpanel",baseCls:"x-plain",deferredRender:true,layoutOnTabChange:true,defaults:{autoScroll:true,hideMode:"offsets"},activeTab:0,enableTabScroll:true});
var header={xtype:"panel",region:"north",height:55,items:[{html:'<div id="explorer-header"><h1>varDB Explorer</h1></div>',height:30,border:false},new Ext.ux.vardb.explorer.Toolbar({controller:this})]};
this.accordian=new Ext.ux.vardb.explorer.Accordian({controller:this});
var config={items:[header,this.accordian,this.tabpanel]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.explorer.Explorer.superclass.initComponent.apply(this,arguments);
this.addCart(this.carts[0].list_id,function(){Ext.get("loading").remove();
});
},addCartTab:function(cart){var tab=new Ext.ux.vardb.explorer.CartTab({controller:this,cart:cart});
this.tabpanel.add(tab);
this.tabpanel.setActiveTab(tab);
},addBundleTab:function(bundle){var controller=this;
var params={bundle_id:bundle.bundle_id,start:0,limit:0};
Ext.ux.vardb.Vardb.ajaxRequest("/tags/ajax/bundle.json",params,function(bundle){var tab=new Ext.ux.vardb.explorer.BundleTab({controller:controller,bundle:bundle});
controller.tabpanel.add(tab);
controller.tabpanel.setActiveTab(tab);
});
},addAlignmentTab:function(alignment){var tab=new Ext.ux.vardb.explorer.AlignmentTab({controller:this,alignment:alignment});
this.tabpanel.add(tab);
this.tabpanel.setActiveTab(tab);
},addJoinTab:function(params){var controller=this;
params.controller=controller;
Ext.ux.vardb.Vardb.ajaxRequest("/tags/ajax/bundles.json",{bundle_ids:params.bundle_ids},function(bundles){params.bundles=bundles;
var tab=new Ext.ux.vardb.explorer.JoinGrid(params);
controller.tabpanel.add(tab);
controller.tabpanel.setActiveTab(tab);
});
},deleteBundle:function(bundle_id){if(!confirm("Permanently delete this bundle?")){return false;
}Ext.ux.vardb.Vardb.ajaxRequest("/tags/ajax/bundles/delete.json",{bundle_id:bundle_id});
this.fireEvent("deletebundle",bundle_id);
return true;
},addCart:function(list_id,callback){var self=this;
Ext.ux.vardb.Vardb.ajaxRequest("/ajax/lists/cart.json",{list_id:list_id},function(cart){self.carts.push(cart);
self.addCartTab(cart);
self.fireEvent("opencart",cart.list_id);
if(callback){callback(cart);
}});
},addBundle:function(bundle_id){var controller=this;
Ext.ux.vardb.Vardb.ajaxRequest("/tags/ajax/bundle.json",{bundle_id:bundle_id,start:0,limit:0},function(bundle){controller.addBundleTab(bundle);
controller.fireEvent("addbundle",bundle.bundle_id);
});
},addAlignment:function(alignment){this.addAlignmentTab(alignment);
this.fireEvent("addalignment",alignment.identifier);
},onAddSequences:function(json){this.accordian.cartgrid.store.reload();
},onBundleUploaded:function(bundle){this.addBundle(bundle.bundle_id);
}});
Ext.ux.vardb.regex.RegexForm=Ext.extend(Ext.TabPanel,{deferredRender:true,layoutOnTabChange:true,activeTab:0,width:770,autoHeight:true,title:"Pattern search",pagesize:10,initComponent:function(){var self=this;
var tabs=[];
tabs.push(new Ext.ux.vardb.regex.RegexTab({families:self.families}));
tabs.push(new Ext.ux.vardb.regex.PrositeTab({families:self.families}));
tabs.push(new Ext.ux.vardb.regex.AminoAcidTab({families:self.families}));
tabs.push(new Ext.ux.vardb.regex.NucleotideTab({families:self.families}));
tabs.push(new Ext.ux.vardb.regex.PssmTab({families:self.families}));
var index,tab;
if(this.regexType&&this.query){for(index=0;
index<tabs.length;
index++){tab=tabs[index];
if(tab.regexType===this.regexType){tab.query=this.query;
tab.sequenceType=this.sequenceType;
this.activeTab=index;
}}}var config={defaults:{autoScroll:true},items:tabs};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.regex.RegexForm.superclass.initComponent.apply(this,arguments);
},doSearch:function(form){if(!form.getForm().isValid()){return;
}if(form.getForm().findField("query").getValue().trim()===""){Ext.Msg.alert("Warning","Please enter a query");
return;
}var self=this;
form.getForm().submit({url:vardb.webapp+"/regex/ajax/search.json",waitMsg:"Searching...",failure:Ext.ux.vardb.Vardb.onFormFailure});
}});
Ext.ux.vardb.regex.FormTab=Ext.extend(Ext.ux.vardb.AbstractForm,{title:"Title",labelWidth:60,autoHeight:true,frame:true,instructions:"Instructions",example:"Example",showSequenceType:false,sequenceType:"AA",initComponent:function(){var self=this;
var typeField={xtype:"hidden",name:"regexType",value:this.regexType};
var instructionsField={xtype:"textbox",text:this.instructions+"<br/><br/>"};
var queryField=this.createQueryField();
var sequenceType=this.createSequenceTypeField();
var familyField=this.createFamilyCombo();
var submitButton=new Ext.Button({text:"Search",formBind:true,scope:this,handler:this.submitHandler});
var fieldset={layout:"column",defaults:{bodyStyle:"padding-right: 5px"},items:[{layout:"form",labelWidth:45,items:[queryField]},{layout:"form",labelWidth:35,items:[sequenceType]},{layout:"form",items:[submitButton]}]};
var config={initialConfig:{standardSubmit:true},items:[typeField,instructionsField,fieldset,familyField]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.regex.FormTab.superclass.initComponent.apply(this,arguments);
},createQueryField:function(){var queryField={xtype:"textfield",fieldLabel:"Query",name:"query",width:300,value:this.query||this.example};
return queryField;
},createSequenceTypeField:function(){if(this.showSequenceType){return this.createSequenceTypeCombo();
}else{return this.createSequenceTypeHidden();
}},createSequenceTypeHidden:function(){var field={xtype:"hidden",name:"sequenceType",value:this.sequenceType};
return field;
},createSequenceTypeCombo:function(){var field=new Ext.ux.vardb.SelectList({data:[["AA","Protein sequences"],["NT","DNA sequences"]],hiddenName:"sequenceType",fieldLabel:"Type",value:this.sequenceType,emptyText:" ",width:120});
return field;
},createFamilyCombo:function(){var data=this.families;
var field=new Ext.form.MultiSelectField({store:new Ext.data.ArrayStore({fields:["value","display"],data:data}),hiddenName:"family",fieldLabel:"Family",valueField:"value",displayField:"display",mode:"local",containerHeight:200,width:300,emptyText:"Search only selected families"});
return field;
},submitHandler:function(){if(!this.getForm().isValid()){return;
}if(this.getForm().findField("query").getValue().trim()===""){Ext.Msg.alert("Warning","Please enter a query");
return;
}this.getForm().getEl().dom.action=vardb.webapp+"/regex/search.html";
this.getForm().getEl().dom.method="post";
this.getForm().submit();
}});
Ext.ux.vardb.regex.RegexTab=Ext.extend(Ext.ux.vardb.regex.FormTab,{regexType:"REGEX",sequenceType:"AA",showSequenceType:true,title:"Perl syntax",example:"DIGDI[IRV]",instructions:"Enter a regular expression using classic Perl-like syntax",initComponent:function(){var self=this;
var config={};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.regex.RegexTab.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.regex.PrositeTab=Ext.extend(Ext.ux.vardb.regex.FormTab,{regexType:"PROSITE",title:"Prosite syntax",example:"[HKR]-[HKR]-x-x-[HKR].",instructions:'Enter a search query using <a href="http://br.expasy.org/tools/scnpsit3.html#pattern_syntax" target="_new">PROSITE</a> conventions',initComponent:function(){var self=this;
var config={};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.regex.PrositeTab.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.regex.AminoAcidTab=Ext.extend(Ext.ux.vardb.regex.FormTab,{regexType:"AA",title:"Amino acid pattern",example:"CX8CX3CX3-4CXC",instructions:"Enter a search query using single-letter amino acid codes or X for any amino acid, alteration using (H/K/R), and ranges using X4 or X4-8",initComponent:function(){var self=this;
var config={};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.regex.AminoAcidTab.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.regex.NucleotideTab=Ext.extend(Ext.ux.vardb.regex.FormTab,{regexType:"NT",sequenceType:"NT",title:"Nucleotide pattern",example:"RGYW",instructions:"Enter a search query using single-letter IUPAC nucleotide codes (e.g. ACGT and RYMKSWHBVDN), alteration using (A/G/T), and ranges using A4 or A4-8",initComponent:function(){var self=this;
var config={};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.regex.NucleotideTab.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.regex.PssmTab=Ext.extend(Ext.ux.vardb.regex.FormTab,{regexType:"PSSM",sequenceType:"NT",title:"PSSM pattern",showSequenceType:true,example:"A  [ 0  0  1 25 19  7  1  2  2  0 ]\nC  [ 0  0  0  0 13  1  2 17 35 36 ]\nG  [38 38 37 13  1  3  2  0  0  0 ]\nT  [ 0  0  0  0  5 27 33 19  1  2 ]\n",instructions:"Enter a position-specific scoring matrix",queryFieldHeight:100,initComponent:function(){var self=this;
var config={};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.regex.NucleotideTab.superclass.initComponent.apply(this,arguments);
},createQueryField:function(){var queryField={xtype:"textarea",fieldLabel:"Query",name:"query",width:300,height:100,value:this.query||this.example};
return queryField;
}});
Ext.ux.vardb.regex.SequenceGrid=Ext.extend(Ext.ux.vardb.Grid,{initComponent:function(){var self=this;
var reader=new Ext.data.JsonReader({root:"sequences",totalProperty:"totalCount",idProperty:"id",fields:[{name:"id",type:"int"},{name:"identifier"},{name:"accession"},{name:"uploaded"},{name:"taxon_identifier"},{name:"taxon_name"},{name:"pathogen_identifier"},{name:"pathogen_name"},{name:"family_identifier"},{name:"family_name"},{name:"pseudogene"},{name:"truncated"},{name:"defline"},{name:"gene"},{name:"product"},{name:"sequence"},{name:"translation"},{name:"hits"},{name:"matches"},{name:"tags_id"},{name:"tags_name"},{name:"tags_description"},{name:"tags_color"},{name:"tags_bgcolor"},{name:"tags_bundle"},{name:"tags_readonly"}]});
var store=new Ext.data.Store({url:vardb.webapp+"/regex/ajax/sequences.json",reader:reader,remoteSort:true,baseParams:{id:this.list_id}});
store.setDefaultSort("accession","asc");
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var r=Ext.ux.vardb.Renderer;
var tooltips=Ext.ux.vardb.Constants.tooltips;
var expander=new Ext.ux.vardb.regex.Expander({maxcolumns:80,sequenceType:this.sequenceType});
var columns=[expander,sm,{header:"Accession",width:75,sortable:true,dataIndex:"accession",renderer:r.renderAccessionPopup},{header:"Tags",sortable:false,width:75,dataIndex:"tags_name",renderer:r.renderTags,tooltip:tooltips.tags},{header:"Description",width:75,sortable:true,dataIndex:"defline"},{header:"Taxon",width:50,sortable:true,dataIndex:"taxon_name",renderer:r.renderPathogenPopup},{header:"Family",width:50,sortable:true,dataIndex:"family_name",renderer:r.renderFamilyPopup},{header:"Gene",width:50,sortable:true,dataIndex:"gene"},{header:"Product",width:50,sortable:true,dataIndex:"product"},{header:"Match locations",sortable:false,dataIndex:"hits"}];
var table=this;
var addToWorksheetButton={xtype:"button",text:"Add to current worksheet",formBind:true,scope:this,handler:this.addToWorksheet};
var addToCartButton={xtype:"button",text:"Add to cart",formBind:true,scope:this,handler:this.addToWorksheet};
var items=[];
items.push(addToCartButton);
var actionmenu={text:"Action",menu:{items:items}};
var tagmenu={text:"Tags",menu:{items:[{text:"Tag sequences",handler:function(){var dialog=new Ext.ux.vardb.tags.ApplyTagDialog({grid:self,callback:self.onTagSequences});
}}]}};
var toolbar=new Ext.PagingToolbar({plugins:new Ext.ux.Andrie.pPageSize({variations:[5,10,20,30]}),pageSize:this.pagesize,store:store,displayInfo:true,displayMsg:"{0} - {1} of {2}",emptyMsg:"None",items:["-",this.createSelectMenu(),"-",actionmenu,"-",tagmenu]});
var config={title:"Sequences",frame:false,autoWidth:true,height:400,enableColumnMove:true,stripeRows:true,store:store,loadMask:true,collapsible:false,animCollapse:false,columns:columns,viewConfig:{forceFit:true},sm:sm,plugins:expander,tbar:toolbar};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.regex.SequenceGrid.superclass.initComponent.apply(this,arguments);
store.load({params:{start:0,limit:this.pagesize}});
},onTagSequences:function(){this.store.reload();
}});
Ext.ux.vardb.regex.Expander=function(config){Ext.applyIf(config,{maxcolumns:80});
function formatMatches(sequence,matches){var positions=[],index;
for(index=0;
index<sequence.length;
index++){positions[index]=[];
}var colors=["red","green","orange","yellow","blue","gray"];
var colorindex=0;
var groups=[],color;
var pattern,name,locations,location,start,end,i,j,position;
var patterns=matches.split(";");
for(i=0;
i<patterns.length;
i++){pattern=patterns[i];
name=pattern.substring(0,pattern.indexOf(":"));
if(!groups[name]){color=colors[colorindex];
colorindex++;
if(colorindex>=colors.length){colorindex=0;
}groups[name]=color;
}locations=pattern.substring(pattern.indexOf(":")+1).split(",");
for(j=0;
j<locations.length;
j++){location=locations[j];
start=parseInt(location.substring(0,location.indexOf("-")),10);
end=parseInt(location.substring(location.indexOf("-")+1),10);
for(position=start;
position<=end;
position++){if(position>=positions.length){throw"position out of bounds: position="+position+" start="+start+" end="+end;
}positions[position].push(name);
}}}var buffer=[],aa;
for(index=0;
index<sequence.length;
index++){aa=sequence.substring(index,index+1);
if(positions[index].length>0){color=groups[positions[index][0]];
buffer.push('<span style="color:'+color+';" title="');
buffer.push(positions[index].join(","));
buffer.push('">');
}buffer.push(aa);
if(positions[index].length>0){buffer.push("</span>");
}if(index!==0&&index%config.maxcolumns===0){buffer.push("<br/>");
}}return buffer.join("");
}var expander=new Ext.grid.RowExpander({tpl:new Ext.XTemplate('<p style="background-color:white;margin-left:10px;font-family:monospace;">',"{[this.formatSequence(values.sequence,values.translation,values.matches)]}<br/>","</p>",{formatSequence:function(nt,aa,matches){var seq=(config.sequenceType==="NT")?nt:aa;
return formatMatches(seq,matches);
}})});
return expander;
};
Ext.ux.vardb.regex.MatchGrid=Ext.extend(Ext.ux.vardb.Grid,{initComponent:function(){var reader=new Ext.data.JsonReader({root:"matches",totalProperty:"totalCount",fields:[{name:"regex"},{name:"match"},{name:"count",type:"int"}]});
var store=new Ext.data.GroupingStore({url:vardb.webapp+"/regex/ajax/matches.json",reader:reader,sortInfo:{field:"count",direction:"DESC"},remoteSort:true,remoteGroup:true,baseParams:{id:this.list_id}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
function renderRegex(value,p,r){return String.format("<a href=\"javascript:vardb.createWebLogo('{1}','{2}')\">{0}</a>",value,store.baseParams.id,r.data.regex);
}function renderMatch(value,p,r){return String.format('<span style="font-family:monospace;">{0}</span>',value);
}var columns=[{header:"Pattern",width:75,sortable:true,dataIndex:"regex",renderer:renderRegex},{header:"Match",width:75,sortable:true,dataIndex:"match",renderer:renderMatch},{header:"Count",width:50,sortable:true,dataIndex:"count"}];
var view=new Ext.grid.GroupingView({forceFit:true,hideGroupedColumn:true,groupTextTpl:'{text} ({[values.rs.length]} {[values.rs.length > 1 ? "matches" : "match"]})'});
var toolbar=new Ext.PagingToolbar({plugins:new Ext.ux.Andrie.pPageSize({variations:[5,10,20,30]}),pageSize:this.pagesize,store:store,displayInfo:true,displayMsg:"{0} - {1} of {2}",emptyMsg:"None"});
var config={title:"Matches",frame:false,autoWidth:true,height:400,enableColumnMove:true,stripeRows:true,store:store,loadMask:true,collapsible:false,animCollapse:false,columns:columns,view:view,sm:sm,tbar:toolbar};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.regex.MatchGrid.superclass.initComponent.apply(this,arguments);
store.load({params:{start:0,limit:this.pagesize}});
}});
Ext.ux.vardb.regex.WebLogo=Ext.extend(Ext.Window,{layout:"fit",width:250,height:210,title:"Web logo",initComponent:function(){var html=String.format('<img src="{0}/regex/weblogo.img?id={1}&regex={2}" alt="Generating..."/>',vardb.webapp,this.id,escape(this.regex));
var config={html:html,buttons:[{text:"Close",scope:this,handler:function(){this.hide();
}}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.regex.WebLogo.superclass.initComponent.apply(this,arguments);
this.show();
}});
Ext.ux.vardb.regex.Results=Ext.extend(Ext.Panel,{title:"Results",frame:true,autoWidth:true,height:800,layout:"border",initComponent:function(){var sequencegrid=new Ext.ux.vardb.regex.SequenceGrid({list_id:this.list_id,pagesize:this.pagesize,counts:this.counts,sequenceType:this.sequenceType});
var matchgrid=new Ext.ux.vardb.regex.MatchGrid({list_id:this.list_id,pagesize:this.pagesize});
var filterform=new Ext.ux.vardb.FilterForm({list_id:this.list_id,counts:this.counts,onFilter:function(filter){sequencegrid.store.baseParams.filter=filter;
sequencegrid.store.reload();
}});
var filtertabs={xtype:"tabpanel",region:"west",collapsible:true,collapseMode:"mini",activeTab:0,width:200,items:[filterform]};
var gridtabs=new Ext.TabPanel({deferredRender:true,layoutOnTabChange:true,defaults:{autoScroll:true},activeTab:0,region:"center",items:[sequencegrid,matchgrid]});
var config={defaults:{split:true},items:[filtertabs,gridtabs]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.regex.Results.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.search.Search=Ext.extend(Ext.TabPanel,{title:"Search",query:"",plain:true,activeTab:0,width:800,deferredRender:true,layoutOnTabChange:true,initComponent:function(){var basic=new Ext.ux.vardb.search.BasicForm({query:this.query});
var advanced=new Ext.ux.vardb.search.AdvancedForm({});
var batchlookup=new Ext.ux.vardb.search.BatchLookupForm({});
var config={defaults:{autoHeight:true},items:[basic,advanced,batchlookup]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.search.Search.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.search.BasicForm=Ext.extend(Ext.form.FormPanel,{title:"Basic",collapsible:true,labelWidth:80,autoWidth:true,border:true,frame:true,padding:5,controlWidth:200,initComponent:function(){var self=this;
var submitButton={xtype:"button",text:"Submit",formBind:true,scope:this,handler:this.submitHandler};
var filterField={xtype:"textfield",fieldLabel:"Query",name:"query",value:this.query,width:550,qtipText:"Enter one or more keywords, optionally included a field prefix (e.g., disease=malaria)",listeners:{specialkey:function(field,e){if(e.getKey()===e.ENTER){self.submitHandler();
}}}};
var queryfieldset={layout:"column",anchor:"100%",items:[{layout:"form",labelWidth:40,bodyStyle:"padding-right: "+this.padding+"px",items:[filterField]},{items:[submitButton]}]};
var resetButton={xtype:"button",text:"Reset",formBind:true,scope:this,handler:this.resetHandler};
var descriptionField={xtype:"box",autoEl:{tag:"div",children:[{tag:"div",style:"margin:0 0 10px 0",html:"Enter one or more keywords, optionally including a field prefix (e.g., disease=malaria)."}]}};
var config={initialConfig:{standardSubmit:true},items:[descriptionField,queryfieldset]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.search.BasicForm.superclass.initComponent.apply(this,arguments);
},submitHandler:function(){this.getForm().getEl().dom.action=vardb.webapp+"/search/sequences.html";
this.getForm().getEl().dom.method="post";
this.getForm().submit();
return;
}});
Ext.ux.vardb.search.AdvancedForm=Ext.extend(Ext.form.FormPanel,{title:"Advanced",autoWidth:true,autoHeight:true,frame:true,padding:5,numconditions:1,initComponent:function(){var self=this;
this.numrows=0;
var submitButton={xtype:"button",text:"Submit",formBind:true,scope:this,handler:this.submitHandler};
var addConditionButton={xtype:"button",text:"Add condition",style:"margin-right: "+this.padding+"px",formBind:true,scope:this,handler:this.addCondition};
var filterField={xtype:"textfield",fieldLabel:"Query",name:"query",value:this.query,width:600,qtipText:"Enter one or more keywords, optionally included a field prefix (e.g., disease=malaria)",listeners:{specialkey:function(field,e){if(e.getKey()===e.ENTER){self.submitHandler();
}}}};
var resetButton={xtype:"button",text:"Reset",formBind:true,scope:this,handler:this.resetHandler};
var descriptionField={xtype:"box",autoEl:{tag:"div",children:[{tag:"div",style:"margin:0 0 10px 0",html:'Select a field, operator, and value to add a term, or click "Add condition" to add another condition.'}]}};
var hiddenField={xtype:"hidden",name:"query"};
var fieldset=new Ext.form.FieldSet({title:"Conditions",collapsible:true,items:[]});
var config={initialConfig:{standardSubmit:true},items:[hiddenField,descriptionField,fieldset,{layout:"column",items:[addConditionButton,submitButton]}]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.search.AdvancedForm.superclass.initComponent.apply(this,arguments);
this.fieldset=fieldset;
var items=[],index;
for(index=0;
index<this.numconditions;
index++){this.addRow();
}this.doLayout();
},submitHandler:function(){var conditions=[];
var rownum,field,operator,value;
for(rownum=1;
rownum<=this.numrows;
rownum++){field=this.getForm().findField("field"+rownum).getValue().trim();
operator=this.getForm().findField("operator"+rownum).getValue();
value=this.getForm().findField("value"+rownum).getValue().trim();
if(field===""||value===""){continue;
}if(value.indexOf(" ")!==-1){value='"'+value+'"';
}conditions.push(field+operator+value);
}if(conditions.length===0){Ext.MessageBox.alert("Alert","Please select a field and value for one or more conditions");
return;
}var query=conditions.join(" AND ");
this.getForm().findField("query").setValue(query);
this.getForm().getEl().dom.action=vardb.webapp+"/search/sequences.html";
this.getForm().getEl().dom.method="post";
this.getForm().submit();
return;
},addCondition:function(){this.addRow();
this.doLayout();
},addRow:function(){this.numrows++;
var fieldCombo=new Ext.ux.vardb.FieldCombo({name:"field"+this.numrows,fieldLabel:"Condition "+this.numrows});
var valueCombo=new Ext.ux.vardb.UniqueValuesCombo({name:"value"+this.numrows});
fieldCombo.on("select",function(field,record,index){valueCombo.setField(record.data.value);
});
var operatorField=new Ext.ux.vardb.SelectList({data:[["=","="],["!=","!="]],name:"operator"+this.numrows,hideLabel:true,value:"=",width:35});
var row={xtype:"panel",layout:"column",items:[{layout:"form",labelWidth:70,bodyStyle:"padding-right: "+this.padding+"px",items:fieldCombo},{bodyStyle:"padding-right: "+this.padding+"px",items:operatorField},{layout:"form",items:valueCombo}]};
this.fieldset.add(row);
}});
Ext.ux.vardb.search.BatchLookupForm=Ext.extend(Ext.form.FormPanel,{title:"Batch lookup",collapsible:true,labelWidth:80,autoWidth:true,border:true,frame:true,padding:5,initComponent:function(){var self=this;
var accessionsField={xtype:"textarea",fieldLabel:"Accessions",name:"accessions",width:400,height:200,allowBlank:false};
var submitButton={xtype:"button",text:"Submit",formBind:true,scope:this,handler:this.submitHandler};
var columnset={layout:"column",anchor:"100%",items:[{layout:"form",labelWidth:40,bodyStyle:"padding-right: "+this.padding+"px",items:[accessionsField]},{items:[submitButton]}]};
var descriptionField={xtype:"box",autoEl:{tag:"div",children:[{tag:"div",style:"margin:0 0 10px 0",html:"Search for a list of accessions. Enter one per line"}]}};
var config={labelAlign:"top",bodyStyle:"padding: 5px 5px 0",defaults:{labelWidth:70},initialConfig:{standardSubmit:true},items:[descriptionField,columnset]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.search.BatchLookupForm.superclass.initComponent.apply(this,arguments);
},submitHandler:function(){this.getForm().getEl().dom.action=vardb.webapp+"/search/batchlookup.html";
this.getForm().getEl().dom.method="post";
this.getForm().submit();
return;
}});
Ext.ux.vardb.search.QueryForm=Ext.extend(Ext.form.FormPanel,{collapsible:true,labelWidth:80,border:true,frame:true,padding:5,initComponent:function(){var self=this;
var submitButton={xtype:"button",text:"Submit",formBind:true,scope:this,handler:this.submitHandler};
var filterField={xtype:"textfield",fieldLabel:"Query",name:"query",value:this.query,width:650,listeners:{specialkey:function(field,e){if(e.getKey()===e.ENTER){self.submitHandler();
}}}};
var queryfieldset={layout:"column",items:[{layout:"form",labelWidth:40,bodyStyle:"padding-right: "+this.padding+"px",items:[filterField]},{layout:"form",items:[submitButton]}]};
var config={initialConfig:{standardSubmit:true},items:[queryfieldset]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.search.QueryForm.superclass.initComponent.apply(this,arguments);
},submitHandler:function(){this.getForm().getEl().dom.action=vardb.webapp+"/search/sequences.html";
this.getForm().getEl().dom.method="post";
this.getForm().submit();
}});
Ext.ux.vardb.search.Grid=Ext.extend(Ext.ux.vardb.LiveSequenceGrid,{region:"center",layout:"fit",stripeRows:true,bufferSize:90,nearLimit:30,initComponent:function(){this.toolbaritems=["<b>Search results</b>","-",this.createCartMenu(),"-",this.createTagMenu(),"-",this.createDownloadMenu(),"-",this.createSummaryMenu(),"-",this.createSortMenu(),"-"];
var config={};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.search.Grid.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.search.Toolbar=Ext.extend(Ext.Toolbar,{height:25,initComponent:function(){var controller=this.controller;
var config={items:['<a href="'+vardb.webapp+'/homepage.html" class="explorer-toolbar" target="_blank">varDB homepage</a>',"-",'<a href="#" onclick="Ext.ux.vardb.Cart.quickCart()" class="explorer-toolbar">QuickCart</a>',"-",'<a href="'+vardb.webapp+'/explorer.html" class="explorer-toolbar" target="_blank">Explorer</a>',"->",'<a href="'+vardb.webapp+'/user.html" class="explorer-toolbar" target="_blank">User home</a>']};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.search.Toolbar.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.search.Results=Ext.extend(Ext.Viewport,{title:"Results",frame:true,autoWidth:true,layout:"border",initComponent:function(){var queryform=new Ext.ux.vardb.search.QueryForm({query:this.query});
var header={xtype:"panel",region:"north",height:128,items:[{html:'<div id="explorer-header"><h1>varDB Search Results</h1></div>',height:30,border:false},new Ext.ux.vardb.search.Toolbar(),queryform]};
var grid=new Ext.ux.vardb.search.Grid({list_id:this.list_id,pagesize:this.pagesize,counts:this.counts,region:"center"});
var filterform=new Ext.ux.vardb.FilterForm({list_id:this.list_id,counts:this.counts,region:"west",collapsible:true,width:220,onFilter:function(filter){grid.store.baseParams.filter=filter;
grid.store.reload();
}});
var config={defaults:{split:true},items:[header,filterform,grid]};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.search.Results.superclass.initComponent.apply(this,arguments);
}});
Ext.ux.vardb.History=Ext.extend(Ext.ux.vardb.Grid,{frame:true,autoHeight:true,autoWidth:true,collapsible:false,stripeRows:true,title:"Search history",initComponent:function(){var self=this;
var reader=new Ext.data.JsonReader({root:"rows",idProperty:"id",fields:[{name:"id"},{name:"number",type:"int"},{name:"type"},{name:"name"},{name:"query"},{name:"results",type:"int"},{name:"date"},{name:"filter"}]});
var store=new Ext.data.Store({url:vardb.webapp+"/search/ajax/queries.json",reader:reader,sortInfo:{field:"number",direction:"asc"}});
function onCellClick(grid,rowIndex,columnIndex,e){if(columnIndex!==7){return;
}var record=grid.getStore().getAt(rowIndex);
self.deleteQuery(record.data.id);
}var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var config={viewConfig:{forceFit:true},store:store,columns:[sm,{header:"Num",width:20,sortable:true,dataIndex:"number",tooltip:"Query number"},{header:"Type",width:40,sortable:true,dataIndex:"type"},{header:"Name",sortable:true,dataIndex:"name"},{header:"Results",width:30,sortable:true,dataIndex:"results",align:"right"},{header:"Date",width:90,sortable:true,dataIndex:"date"},{header:"",width:20,sortable:false,menuDisabled:true,dataIndex:"id",renderer:this.renderView},{header:"",width:20,sortable:false,menuDisabled:true,dataIndex:"id",renderer:this.renderDelete}],listeners:{cellclick:onCellClick},tbar:this.createToolbar()};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.History.superclass.initComponent.apply(this,arguments);
this.viewConfig.emptyText='<div class="emptyText">No queries.</div>';
store.load();
},renderView:function(value,p,r){var url=vardb.webapp;
if(r.data.type==="TEXT"){url+="/search/load.html";
}else{if(r.data.type==="BLAST"){url+="/blast/load.html";
}else{if(r.data.type==="PHIBLAST"){url+="/blast/load.html";
}else{if(r.data.type==="PSIBLAST"){url+="/blast/load.html";
}else{if(r.data.type==="REGEX"){url+="/regex/load.html";
}else{alert("no handler for query type: "+r.data.type);
}}}}}return String.format('<a href="'+url+'?id={0}">View</a>',r.data.id);
},renderDelete:function(value,p,r){return String.format('<a href="#">Delete</a>');
},deleteQueriesHandler:function(){var self=this;
Ext.ux.vardb.Cart.deleteQueries(this.getSelectedIds(),function(){self.store.reload();
});
},deleteAllQueriesHandler:function(){var self=this;
Ext.ux.vardb.Cart.deleteQueries(this.store.getTotalCount(),function(){self.store.reload();
});
},createActionMenu:function(){var menu={text:"Action",menu:{items:[{text:"Delete search(es)",scope:this,handler:this.deleteQueriesHandler},{text:"Delete all searches",scope:this,handler:this.deleteAllQueriesHandler}]}};
return menu;
},createToolbar:function(){var toolbar=new Ext.Toolbar({items:[this.createSelectMenu(),"-",this.createActionMenu(),"-","->",this.createReloadButton()]});
return toolbar;
}});
(Ext.ux.vardb.viewer.Util=function(){return{chunkSequence:function(sequence){var chunksize=80;
var numlines=sequence.length/chunksize;
var remainder=sequence.length%chunksize;
var chunks=[];
var line,start,chunk;
for(line=0;
line<numlines;
line++){start=line*chunksize;
chunk=sequence.substring(start,start+chunksize);
chunks.push(chunk);
}if(remainder!==0){chunks.push(sequence.substring(numlines*chunksize));
}return chunks.join("\n");
},popupWindow:function(str){var strFeatures="hotkeys=no,titlebar=no,dependent=no";
strFeatures+=",resizable=yes,toolbar=no,scrollbars=yes,menubar=no";
var win=window.open("about:blank","_blank",strFeatures);
win.document.write(str);
win.document.close();
}};
}());
Ext.ux.vardb.viewer.Renderer=function(viewer){this.viewer=viewer;
this.sequences=viewer.data.sequences;
this.consensus=viewer.consensus;
};
Ext.ux.vardb.viewer.Renderer.prototype={render:function(){this.renderAccessions();
this.renderSequences();
this.makestatic();
},renderAccessions:function(){var buffer=[];
buffer.push("<pre>");
buffer.push('<span class="scale">Scale</span><br/>');
buffer.push('<span class="consensus">Consensus</span><br/>');
var index,sequence;
for(index=0;
index<this.sequences.length;
index++){sequence=this.sequences[index];
if(!this.sequenceVisible(sequence)){continue;
}buffer.push("<span onclick=\"vardb.sequencePopup('"+sequence.accession+"')\">");
buffer.push(sequence.accession);
buffer.push("</span>");
buffer.push("<br/>");
}buffer.push("</pre>");
var html=buffer.join("");
this.replaceHtml("accessionsdiv",html);
this.replaceHtml("accessionsdiv2",html);
},sequenceVisible:function(sequence){if(!this.viewer.showtruncated&&sequence.truncated===true){return false;
}if(!this.viewer.showpseudogenes&&sequence.pseudogene===true){return false;
}return true;
},chunk:function(str,chunksize){var numlines=str.length/chunksize;
var remainder=str.length%chunksize;
var chunks=[];
var line,start,chunk;
for(line=0;
line<numlines;
line++){start=line*chunksize;
chunk=str.substring(start,start+chunksize);
chunks.push(chunk);
}if(remainder!==0){chunks.push(str.substring(numlines*chunksize));
}return chunks;
},renderScale:function(length){var buffer=[];
var index,lbl,i;
for(index=0;
index<Math.floor(length/10);
index++){lbl=""+((index+1)*10);
for(i=0;
i<10-lbl.length;
i++){buffer.push("-");
}buffer.push(lbl);
}for(i=0;
i<length%10;
i++){buffer.push("-");
}var scale=buffer.join("");
buffer=[];
for(index=0;
index<scale.length;
index++){lbl=scale.substring(index,index+1);
buffer.push('<a href="javascript:viewer.analyzeColumn('+index+')" title="'+(index+1)+'">'+lbl+"</a>");
}return buffer.join("");
},renderSequences:function(){var buffer=[];
buffer.push("<pre>");
buffer.push('<span class="scale">'+this.renderScale(this.consensus.positions.length)+"</span><br/>");
buffer.push('<span class="consensus">');
this.renderSequence(this.consensus.sequence,buffer);
buffer.push("</span><br/>");
var index,seq;
for(index=0;
index<this.sequences.length;
index++){seq=this.sequences[index];
if(!this.sequenceVisible(seq)){continue;
}buffer.push("<span>");
this.renderSequence(this.unencodeSequence(seq),buffer);
buffer.push("</span><br/>");
}buffer.push("</pre>");
this.replaceHtml("sequencesdiv",buffer.join(""));
},replaceHtml:function(id,html){var oldEl=Ext.getDom(id);
if(Ext.isIE){oldEl.innerHTML=html;
return oldEl;
}var newEl=oldEl.cloneNode(false);
newEl.innerHTML=html;
oldEl.parentNode.replaceChild(newEl,oldEl);
return newEl;
},renderSequence:function(sequence,buf){var buffer=[];
var index,aa,classes,position,cls;
for(index=0;
index<sequence.length;
index++){aa=sequence[index];
if(aa!=="-"){classes=[];
classes.push(aa);
position=this.viewer.consensus.getPosition(index);
if(!position){continue;
}if(position.consensus===aa){cls=position.colorByIdentity();
if(cls!==null){classes.push(cls);
}}buffer.push('<span class="'+classes.join(" ")+'">');
buffer.push(aa);
buffer.push("</span>");
}else{buffer.push(aa);
}}var html=buffer.join("");
html=html.replace(/(-+)/g,'<span class="gap">$1</span>');
buf.push(html);
},unencodeSequence:function(seq){var sequence=seq.translation;
var parts=seq.aligned.split(",");
var buf=[];
var lastposition=0;
var index,part,position,numgaps;
for(index=0;
index<parts.length;
index++){part=parts[index];
position=parseInt(part.substring(0,part.indexOf("+")),10);
numgaps=parseInt(part.substring(part.indexOf("+")+1),10);
buf.push(sequence.substring(lastposition,position));
buf.push(this.repeatString("-",numgaps));
lastposition=position;
}if(lastposition<seq.translation.length){buf.push(sequence.substring(lastposition));
}return buf.join("");
},repeatString:function(str,numtimes){var buf=[];
var index;
for(index=0;
index<numtimes;
index++){buf.push(str);
}return buf.join("");
},makestatic:function(){var seqname=Ext.get("seqname");
var menu=Ext.get("menu");
if(seqname===null){return;
}var offsetleft=0;
var offsettop=0;
var offsetmenutop=0;
var ns4=document.layers?1:0;
var ie4=document.all?1:0;
var ns6=document.getElementById&&!document.all?1:0;
if(ie4){seqname.style.pixelLeft=document.body.scrollLeft+offsetleft;
menu.style.pixelLeft=document.body.scrollLeft+offsetleft;
menu.style.pixelTop=document.body.scrollTop+offsetmenutop;
}else{if(ns6){document.getElementById("seqname").style.left=window.pageXOffset+offsetleft;
document.getElementById("menu").style.left=window.pageXOffset+offsetleft;
document.getElementById("menu").style.top=window.pageYOffset+offsetmenutop;
}else{if(ns4){}}}setTimeout(viewer.renderer.makestatic,0);
}};
Ext.ux.vardb.viewer.ConsensusPosition=function(consensus,identity,variability){this.counts={};
this.consensus=(consensus===null)?"-":consensus;
this.identity=(identity===null)?0:identity;
this.variability=(variability===null)?0:variability;
if(this.consensus==="-"){this.gap=true;
}};
Ext.ux.vardb.viewer.ConsensusPosition.prototype={increment:function(aa){if(aa==="-"){return;
}if(this.counts[aa]===null){this.counts[aa]=1;
}else{this.counts[aa]++;
}},colorByIdentity:function(){if(this.identity>0.8){return"p80";
}else{if(this.identity>0.6){return"p60";
}else{if(this.identity>0.4){return"p40";
}else{return null;
}}}}};
Ext.ux.vardb.viewer.Consensus=function(str){this.positions=[];
this.sequence="";
this.parse(str);
};
Ext.ux.vardb.viewer.Consensus.prototype={parse:function(str){var buffer=[];
var data=[];
var arr=str.split("|");
var index,a;
for(index=0;
index<arr.length;
index++){if(arr[index]==="-"){buffer.push("-");
this.positions.push(new Ext.ux.vardb.viewer.ConsensusPosition("-"));
continue;
}a=arr[index].split(",");
buffer.push(a[0]);
this.positions.push(new Ext.ux.vardb.viewer.ConsensusPosition(a[0],a[1],a[2]));
}this.sequence=buffer.join("");
},getPosition:function(index){return this.positions[index];
},draw:function(buffer){this.sequence.draw(buffer);
},countFrequencies:function(sequence){var index,aa;
for(index=0;
index<sequence.length;
index++){aa=sequence.charAt(index);
if(this.positions[index]===null){this.positions[index]=new Ext.ux.vardb.viewer.ConsensusPosition();
}this.positions[index].increment(aa);
}},getIdentities:function(){var data=[];
var index,position,identity;
for(index=0;
index<this.positions.length;
index++){position=this.positions[index];
identity=isNaN(position.identity)?0:position.identity*100;
data.push(identity);
}return data;
},getVariabilities:function(){var data=[];
var index,position,variability;
for(index=0;
index<this.positions.length;
index++){position=this.positions[index];
variability=isNaN(position.variability)?0:position.variability;
data.push(Math.round(variability*100));
}return data;
}};
(Ext.ux.vardb.viewer.Charts=function(){return{simpleEncoding:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",width:500,height:300,plotIdentity:function(data){var title="Identity Chart";
var max=100;
var html=this.createImage(data,title,max);
this.createWindow(title,html);
},plotVariability:function(data){var title="Variability Chart";
var max=this.findMax(data);
var html=this.createImage(data,title,max);
this.createWindow(title,html);
},plotSelection:function(data){var title="Selection Chart";
var max=this.findMax(data);
var html=this.createImage(data,title,max);
this.createWindow(title,html);
},createWindow:function(title,html){var win=new Ext.Window({title:title,html:html,layout:"fit",width:this.width,autoHeight:true,plain:true,buttons:[{text:"Close",handler:function(){win.hide();
}}]});
win.show();
},createImage:function(data,title,max){var params=[];
params.push("chxt=x,y,r");
params.push("cht=lc");
params.push("chd="+this.encodeData(data,max));
params.push("chco=76A4FB");
params.push("chs="+this.width+"x"+this.height);
params.push("chtt="+title);
var qs=params.join("&");
var html='<img src="http://chart.apis.google.com/chart?'+qs+'"/>';
return html;
},encodeData:function(data,max){return this.simpleEncode(data,max);
},simpleEncode:function(valueArray,maxValue){var chartData=["s:"];
var i,currentValue;
for(i=0;
i<valueArray.length;
i++){currentValue=valueArray[i];
if(!isNaN(currentValue)&&currentValue>=0){chartData.push(this.simpleEncoding.charAt(Math.round((this.simpleEncoding.length-1)*currentValue/maxValue)));
}else{chartData.push("");
}}return chartData.join("");
},findMax:function(data){var max=0;
var index,value;
for(index=0;
index<data.length;
index++){value=data[index];
if(value>max){max=value;
}}if(max<1){max=1;
}else{if(max<10){max=10;
}else{if(max<100){max=10;
}else{if(max<1000){max=1000;
}}}}return max;
}};
}());
Ext.ux.vardb.viewer.Analysis=function(viewer){this.viewer=viewer;
};
Ext.ux.vardb.viewer.Analysis.prototype={findLowComplexityRegions:function(){var dialog=null;
var form=new Ext.FormPanel({labelWidth:100,url:"",bodyStyle:"padding:5px 5px 0",defaults:{width:230,allowBlank:false},defaultType:"textfield",items:[{fieldLabel:"Window length",name:"wndw",value:10},{fieldLabel:"K1",name:"k1",value:2.2},{fieldLabel:"K2",name:"k2",value:2.5}],buttons:[{text:"Submit",formBind:true,handler:function(){form.getForm().submit({method:"post",url:vardb.webapp+"/viewer/ajax/seg.html",waitTitle:"Connecting",waitMsg:"Working...",failure:Ext.ux.vardb.Vardb.onFormFailure,success:function(form,action){alert(action.response.responseText);
}});
}},{text:"Cancel",handler:function(){dialog.hide();
}}]});
dialog=new Ext.Window({title:"Low-complexity region tool",width:400,closable:true,resizable:true,items:[form]});
dialog.show();
},findGlycanBindingMotifs:function(){var dialog=null;
var form=new Ext.FormPanel({labelWidth:100,url:"",defaults:{width:230,allowBlank:false},defaultType:"textfield",items:[{fieldLabel:"Patterns",name:"patterns",value:"XBBXBX,XBBXXBX,XBBXXXBX,XBBBXXBX"},{fieldLabel:"B",name:"b",value:"HKR"},{fieldLabel:"X",name:"x",value:"GASTCVLIMPFYWDENQHKR"}],buttons:[{text:"Submit",formBind:true,handler:function(){form.getForm().submit({method:"post",url:vardb.webapp+"/viewer/ajax/gag.html",waitTitle:"Connecting",waitMsg:"Working...",failure:Ext.ux.vardb.Vardb.onFormFailure,success:function(form,action){alert(action.response.responseText);
}});
}},{text:"Cancel",handler:function(){dialog.hide();
}}]});
dialog=new Ext.Window({title:"GAG binding motif tool",width:400,closable:true,resizable:true,items:[form]});
dialog.show();
},findSecondaryStructureMotifs:function(){var dialog=null;
var form=new Ext.FormPanel({labelWidth:100,url:"",defaults:{width:230,allowBlank:false},defaultType:"textfield",items:[{fieldLabel:"Parameter",name:"parameter",value:""}],buttons:[{text:"Submit",formBind:true,handler:function(){form.getForm().submit({method:"post",url:vardb.webapp+"/viewer/ajax/2d.html",waitTitle:"Connecting",waitMsg:"Working...",failure:Ext.ux.vardb.Vardb.onFormFailure,success:function(form,action){alert(action.response.responseText);
}});
}},{text:"Cancel",handler:function(){dialog.hide();
}}]});
dialog=new Ext.Window({title:"Secondary structure prediction tool",width:400,closable:true,resizable:true,items:[form]});
dialog.show();
}};
Ext.ux.vardb.viewer.Viewer=function(data){this.data=data;
this.sequences=[];
var index,sequence;
for(index=0;
index<this.data.sequences.length;
index++){sequence=this.data.sequences[index];
this.sequences[sequence.accession]=sequence;
sequence.selected=false;
}this.consensus=new Ext.ux.vardb.viewer.Consensus(data.consensus);
this.util=Ext.ux.vardb.viewer.Util;
this.analysis=new Ext.ux.vardb.viewer.Analysis(this);
this.renderer=new Ext.ux.vardb.viewer.Renderer(this);
this.prevfontsize="";
this.prevcolor="";
this.showtranslated=true;
this.showpseodogenes=true;
this.showtruncated=true;
};
Ext.ux.vardb.viewer.Viewer.prototype={selectSequence:function(obj,accession){var sequence=this.sequences[accession];
sequence.selected=!sequence.selected;
var el=Ext.Element.fly(obj);
el.toggleClass("selected");
},selectSequences:function(type,value){var index,sequence;
for(index=0;
index<this.data.sequences.length;
index++){sequence=this.data.sequences[index];
sequence.selected=false;
if(type==="rating"&&sequence.rating===value){sequence.selected=true;
}else{if(type==="family"&&sequence.family_identifier===value){sequence.selected=true;
}else{if(type==="pathogen"&&sequence.pathogen_identifier===value){sequence.selected=true;
}}}}this.renderer.renderAccessions();
},getSelectedSequences:function(){var selected=[];
var index,sequence;
for(index=0;
index<this.data.sequences.length;
index++){sequence=this.data.sequences[index];
if(sequence.selected){selected.push(sequence.accession);
}}return selected;
},render:function(){this.renderer.render(this.data);
},plotIdentity:function(){var data=this.consensus.getIdentities();
Ext.ux.vardb.viewer.Charts.plotIdentity(data);
},plotVariability:function(){var data=this.consensus.getVariabilities();
Ext.ux.vardb.viewer.Charts.plotVariability(data);
},downloadNucleotideSequences:function(){var buffer=[];
buffer.push("<pre>");
var index,seq,sequence;
for(index=0;
index<this.data.sequences.length;
index++){seq=this.data.sequences[index];
sequence=seq.sequence;
buffer.push(">"+seq.accession+"\n"+this.util.chunkSequence(sequence));
}buffer.push("</pre>");
var str=buffer.join("");
var win=this.util.popupWindow(str);
return win;
},downloadProteinSequences:function(){var buffer=[];
buffer.push("<pre>");
var index,seq,sequence;
for(index=0;
index<this.data.sequences.length;
index++){seq=this.data.sequences[index];
sequence=seq.translation;
buffer.push(">"+seq.accession+"\n"+this.util.chunkSequence(sequence));
}buffer.push("</pre>");
var str=buffer.join("");
var win=this.util.popupWindow(str);
return win;
},downloadAccessions:function(){var buffer=[];
buffer.push("<pre>");
var index,seq;
for(index=0;
index<this.data.sequences.length;
index++){seq=this.data.sequences[index];
buffer.push(seq.accession+"\n");
}buffer.push("</pre>");
var str=buffer.join("");
var win=this.util.popupWindow(str);
return win;
},downloadConservationScores:function(){var identities=this.consensus.getIdentities();
var variabilities=this.consensus.getVariabilities();
var index,position;
var buffer=[];
buffer.push("<pre>");
buffer.push("column\tconsensus\tidentity\tvariability\n");
for(index=0;
index<this.consensus.positions.length;
index++){position=this.consensus.positions[index];
buffer.push((index+1)+"\t");
buffer.push(position.consensus+"\t");
buffer.push(identities[index]+"\t");
buffer.push(variabilities[index]+"\n");
}buffer.push("</pre>");
var str=buffer.join("");
var win=this.util.popupWindow(str);
return win;
},changeFontsize:function(fontsize){Ext.get("accessionsdiv").replaceClass("fontsize"+this.prevfontsize,"fontsize"+fontsize);
Ext.get("sequencesdiv").replaceClass("fontsize"+this.prevfontsize,"fontsize"+fontsize);
Ext.get("accessionsdiv2").replaceClass("fontsize"+this.prevfontsize,"fontsize"+fontsize);
this.prevfontsize=fontsize;
},changeColor:function(color){Ext.get("container").replaceClass(this.prevcolor,color);
this.prevcolor=color;
},showTranslated:function(state){this.showtranslated=state;
this.render();
},showPseudogenes:function(state){this.showpseudogoenes=state;
this.render();
},showTruncated:function(state){this.showtruncated=state;
this.render();
}};
Ext.ux.vardb.viewer.Toolbar=function(viewer,divname){this.viewer=viewer;
this.divname=divname;
this.tags=viewer.data.tags;
var downloadMenu={text:"Download",id:"downloadMenu",menu:{items:[{text:"Download proteins",handler:function(btn){viewer.downloadProteinSequences();
}},{text:"Download accessions",handler:function(btn){viewer.downloadAccessions();
}},{text:"Download conservation scores",handler:function(btn){viewer.downloadConservationScores();
}}]}};
var analyzeMenu={text:"Charts",menu:{items:[{text:"Conservation chart",handler:function(btn){viewer.plotIdentity();
}},{text:"Variability chart",handler:function(btn){viewer.plotVariability();
}}]}};
function getFontMenu(){var fontsizes=[];
var arr="100,90,80,70,60,50,40,30,20,10".split(",");
var index,fontsize;
for(index=0;
index<arr.length;
index++){fontsize=arr[index];
fontsizes.push(["fontsize"+fontsize,fontsize]);
}var combo=new Ext.form.ComboBox({store:new Ext.data.ArrayStore({fields:["label","value"],data:fontsizes}),displayField:"value",width:100,mode:"local",triggerAction:"all",value:"80",selectOnFocus:true,forceSelection:true,onSelect:function(record){viewer.changeFontsize(record.data.value);
}});
return combo;
}function getColorMenu(){var colors=[];
var arr="identity,zappo,hydrophobic,helix,buried,strand,turn".split(",");
var index,color;
for(index=0;
index<arr.length;
index++){color=arr[index];
colors.push([color,color]);
}var combo=new Ext.form.ComboBox({store:new Ext.data.ArrayStore({fields:["label","value"],data:colors}),displayField:"label",width:100,mode:"local",triggerAction:"all",value:"identity",selectOnFocus:true,forceSelection:true,onSelect:function(record){viewer.changeColor(record.data.value);
}});
return combo;
}var panel=new Ext.Panel({title:"Alignment Viewer: "+viewer.data.identifier,collapsible:false,width:"100%",height:50,renderTo:divname,items:[new Ext.Toolbar({items:[downloadMenu,"-",analyzeMenu,"-","Font size: ",getFontMenu(),"-","Color scheme: ",getColorMenu()]})]});
return panel;
};
Ext.ux.vardb.admin.Users=Ext.extend(Ext.ux.vardb.Grid,{frame:true,autoHeight:true,autoWidth:true,collapsible:false,stripeRows:true,title:"Users",initComponent:function(){var self=this;
var reader=new Ext.data.ArrayReader({idProperty:"user_id"},[{name:"user_id"},{name:"username"},{name:"name"},{name:"affiliation"},{name:"email"},{name:"created"},{name:"updated"}]);
var store=new Ext.data.Store({reader:reader,data:this.data,sortInfo:{field:"name",direction:"ASC"}});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
var config={viewConfig:{forceFit:true},sm:sm,store:store,columns:[sm,{header:"Login",sortable:true,dataIndex:"username",renderer:this.renderUsername},{header:"Name",sortable:true,dataIndex:"name"},{header:"Affiliation",sortable:true,dataIndex:"affiliation"},{header:"Email",sortable:true,dataIndex:"email",renderer:Ext.ux.vardb.Renderer.renderEmail},{header:"Created",width:70,sortable:true,dataIndex:"created"},{header:"Updated",width:70,sortable:true,dataIndex:"updated"}],tbar:new Ext.Toolbar({items:[self.createPrintButton(),"-",self.createSelectMenu(),"-",self.createExportMenu()]})};
Ext.apply(this,Ext.apply(this.initialConfig,config));
Ext.ux.vardb.admin.Users.superclass.initComponent.apply(this,arguments);
},createExportMenu:function(){var grid=this;
var menu={text:"Export",handler:function(btn){document.location.href=vardb.webapp+"/admin/export/users.html";
}};
return menu;
},renderUsername:function(value,p,record){return String.format('<a href="'+vardb.webapp+'/admin/user.html?user_id={1}">{0}</a>',value,record.data.user_id);
}});
Ext.ux.vardb.admin.LogReport=function(renderTo,params){var pagesize=20;
var fields=[{name:"id",type:"int"},{name:"date"},{name:"username"},{name:"ipaddress"},{name:"url"},{name:"browser"}];
var reader=new Ext.data.JsonReader({root:"items",totalProperty:"totalCount",idProperty:"id",fields:fields});
var store=new Ext.data.Store({url:vardb.webapp+"/reports/ajax/log.json",reader:reader,remoteSort:true,sortInfo:{field:"date",direction:"DESC"},baseParams:params});
var sm=new Ext.grid.CheckboxSelectionModel({sortable:true,width:20});
function renderUrl(value,p,r){return String.format('<a href="{0}" target="_blank">{1}</a>',value,value);
}var cm=new Ext.grid.ColumnModel([sm,{header:"Date",width:50,dataIndex:"date",tooltip:"Date"},{header:"Username",width:75,dataIndex:"username",tooltip:"Username"},{header:"IP address",width:75,dataIndex:"ipaddress",tooltip:"IP address"},{header:"URL",width:75,dataIndex:"url",renderer:renderUrl,tooltip:"url"},{header:"Browser",width:75,dataIndex:"browser",tooltip:"Browser"}]);
cm.defaultSortable=true;
var toolbar=new Ext.PagingToolbar({plugins:new Ext.ux.Andrie.pPageSize({variations:[5,10,20,30]}),pageSize:pagesize,store:store,displayInfo:true,displayMsg:"{0} - {1} of {2}",emptyMsg:"None",items:["-"]});
var grid=new Ext.ux.vardb.Grid({renderTo:renderTo,layout:"fit",frame:true,autoWidth:true,autoHeight:true,enableColumnMove:true,stripeRows:true,store:store,loadMask:true,collapsible:false,animCollapse:false,cm:cm,sm:sm,viewConfig:{forceFit:true},tbar:toolbar});
store.load({params:{start:0,limit:params.pagesize}});
};
