view jqBarGraph.2.1.js @ 60:7352fecc9860 draft default tip

Uploaded
author mzeidler
date Sun, 29 Sep 2013 14:31:15 -0400
parents cbd4d7e3f155
children
line wrap: on
line source

/**
 * jqBarGraph - jQuery plugin
 * @version: 1.1 (2011/04/03)
 * @requires jQuery v1.2.2 or later 
 * @author Ivan Lazarevic
 * Examples and documentation at: http://www.workshop.rs/jqbargraph/
 * 
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 * 
 * @param data: arrayOfData // array of data for your graph
 * @param title: false // title of your graph, accept HTML
 * @param barSpace: 10 // this is default space between bars in pixels
 * @param width: 400 // default width of your graph ghhjgjhg
 * @param height: 200 //default height of your graph
 * @param color: '#000000' // if you don't send colors for your data this will be default bars color
 * @param colors: false // array of colors that will be used for your bars and legends
 * @param lbl: '' // if there is no label in your array
 * @param sort: false // sort your data before displaying graph, you can sort as 'asc' or 'desc'
 * @param position: 'bottom' // position of your bars, can be 'bottom' or 'top'. 'top' doesn't work for multi type
 * @param prefix: '' // text that will be shown before every label
 * @param postfix: '' // text that will be shown after every label
 * @param animate: true // if you don't need animated appereance change to false
 * @param speed: 2 // speed of animation in seconds
 * @param legendWidth: 100 // width of your legend box
 * @param legend: false // if you want legend change to true
 * @param legends: false // array for legend. for simple graph type legend will be extracted from labels if you don't set this
 * @param type: false // for multi array data default graph type is stacked, you can change to 'multi' for multi bar type
 * @param showValues: true // you can use this for multi and stacked type and it will show values of every bar part
 * @param showValuesColor: '#fff' // color of font for values 

 * @example  $('#divForGraph').jqBarGraph({ data: arrayOfData });  
  
**/

(function($) {
	var opts = new Array;
	var level = new Array;
	
	$.fn.jqBarGraph = $.fn.jqbargraph = function(options){
	
	init = function(el){

		opts[el.id] = $.extend({}, $.fn.jqBarGraph.defaults, options);
		$(el).css({ 'width': opts[el.id].width, 'height': opts[el.id].height, 'position':'relative', 'text-align':'center' });
		

		doGraph(el);
		$("a").css({'color':'black'});

	};
	
	// sum of array elements
	sum = function(ar,index){
		total = 0;
		for(val in ar){
			total += ar[val][index];
		}
		return total.toFixed(2);
	};
	
	// count max value of array
	max = function(ar,index){
		maxvalue = 0;
		for(var val in ar){
			value = ar[val][0];
			if(value instanceof Array) value = sum(value,index);	
			if (parseFloat(value) > parseFloat(maxvalue)) maxvalue=value;
		}	
		return maxvalue;	
	};

	// max value of multi array
	maxMulti = function(ar,index){
		maxvalue = 0;
		maxvalue2 = 0;
		
		for(var val in ar){
			ar2 = ar[val][0];
			
			for(var val2 in ar2){
				if(ar2[val2][index]>maxvalue2) maxvalue2 = ar2[val2][index];
			}

			if (maxvalue2>maxvalue) maxvalue=maxvalue2;
		}
		console.log(maxvalue);	
		return maxvalue;		
	};
	
		
	doGraph = function(el){
		
		arr = opts[el.id];
		data = arr.data;
		if(arr.tab=='reads'){
		  val_index=0;
		}
		else{
		  val_index=1;
		}

		//check if array is bad or empty
		if(data == undefined) {
			$(el).html('There is not enought data for graph');
			return;
		}
		//sorting ascending or descending
		if(arr.tab == 'reads'){
		  if(arr.sort == 'asc'){
		      data.sort(sortReadsAsc);    
		  }
		  if(arr.sort == 'desc'){
		      data.sort(sortReadsDesc);        
		  }
		}
		if(arr.tab == 'basepairs'){
		  if(arr.sort == 'asc'){
		      data.sort(sortBasesAsc);
		   }
		   if(arr.sort == 'desc'){
		      data.sort(sortBasesDesc);
		   }
		}
		if(arr.sortBar == 'asc') sortBars(data, barAsc);
		if(arr.sortBar == 'desc')sortBars(data, barDesc);
    
		
		
		legend = '';
		prefix = arr.prefix;
		postfix = arr.postfix;
		space = arr.barSpace; //space between bars
		legendWidth = arr.legend ? arr.legendWidth : 0; //width of legend box
		fieldWidth = ($(el).width()-legendWidth)/data.length; //width of bar
		totalHeight =  $(el).height(); //total height of graph box
		var leg = new Array(); //legends array
		
		//max value in data, I use this to calculate height of bar
		max = max(data,val_index);
	
		color_map={};
		color_map["pathogen"]=arr.colors[0];
		color_map["ambiguous"]=arr.colors[1];
		color_map["human"]=arr.colors[2];
		
		if(arr.tab=='reads'){
		  val_index=0;
		}
		else{
		  val_index=1;

		}
		console.log(arr.tab,arr.sort,val_index);
 		for(var val in data){
 			
 			valueData = data[val][0];
 			if (valueData instanceof Array) 
 				value = sum(valueData,val_index);
 			else
 				value = valueData;
 			
 			lbl = data[val][1];
			unique = val+el.id; //unique identifier
			divid=""+el.id;
 			
 			if(arr.type == 'multi') color = 'none';
 				
 			if (lbl == undefined) lbl = arr.lbl;
 			
 			margin_top=14/(data.length);

 		
 			out  = "<div class='graphField"+el.id+"' id='graphField"+unique+"' style='position: absolute'>";
 			out += "<div class='graphValue"+el.id+"' id='graphValue"+unique+"'>"+parseInt(value)+"</div>";
 			
 			out += "<div class='graphBar"+el.id+"' id='graphFieldBar"+unique+"' style='background-color:#fff;position: relative; overflow: hidden;'></div>";
            //console.log(color)
			// if there is no legend or exist legends display lbl at the bottom
 			
 				out += "<a class='graphLabelLink' href=#files"+el.id+" onclick=fillDiv('"+el.id+"','"+valueData[0][3]+"_"+lbl+"')><div class='graphLabel"+el.id+"' id='graphLabel"+unique+"'style='margin-top:"+margin_top+"px;'>"+lbl+"</div></a>";
 			out += "</div>";
 			
 			
 			 			
			$(el).append(out);
			$(".graphLabel"+el.id).css({'-webkit-transform': 'rotate(30deg)', '-moz-transform': 'rotate(30deg)','-o-transform': 'rotate(30deg)', '-ms-transform': 'rotate(30deg)','transform': 'rotate(30deg)', 'height':'100'});
 			$('a.graphLabel').css({
 			    'text-decoration': 'none',
 			    'color':'black'    
 			});
 			
 			//$('#graphLabel'+el.id).rotateLeft();
 			
 			//size of bar
 			totalHeightBar = totalHeight - $('.graphLabel'+el.id).height() - $('.graphValue'+el.id).height()-margin_top; 
 			fieldHeight = (totalHeightBar*value)/max;	
 			$('#graphField'+unique).css({ 
 				'left': (fieldWidth)*val, 
 				'width': fieldWidth-space, 
 				'margin-left': space});
 	
 			// multi array
 			if(valueData instanceof Array){
 				
				if(arr.type=="multi"){
				    console.log("multi");
					maxe = maxMulti(data,val_index);
					totalHeightBar = fieldHeight = totalHeight - $('.graphLabel'+el.id).height()-margin_top;
					$('.graphValue'+el.id).remove();
				} else {
				    console.log(max);
					maxe = max;
				}
				
 				for (i in valueData){
 					heig = (totalHeightBar*valueData[i][val_index]/maxe);
                    if(navigator.userAgent.match('Safari') && !navigator.userAgent.match('Chrom')){
                        
                        heig = heig + (arr.borderSize/1.85);
                    } 
                    
 					wid = parseInt((fieldWidth-space)/valueData.length);

 					sv = ''; // show values
 					fs = 0; // font size
 					if (arr.showValues){
 						sv = arr.prefix+valueData[i][0]+arr.postfix;
 						fs = 12; // font-size is 0 if showValues = false
 					}
 					o = "<a class='subBarLink' href=#files"+el.id+" onclick=fillDiv('"+el.id+"','"+valueData[i][3]+"_"+lbl+"','"+valueData[i][5]+"')><div class='subBars"+el.id+"' style=' box-sizing:border-box; -moz-box-sizing:border-box; -ms-box-sizing:border-box; -webkit-box-sizing:border-box; height:"+heig+"px;  border-top:"+arr.borderSize+"px solid; border-color: "+arr.showValuesColor+"; background-color: "+color_map[valueData[i][2]]+"; left:"+wid*i+"px; color:"+arr.showValuesColor+"; font-size:"+fs+"px' >"+sv+"</div></a>";
 					$('#graphFieldBar'+unique).prepend(o);
 				}
 			}
 			
 			if(arr.type=='multi')
 				$('.subBars'+el.id).css({ 'width': wid, 'position': 'absolute', 'bottom': 0 });
 
 			//position of bars
 			if(arr.position == 'bottom') $('.graphField'+el.id).css('bottom',0);
            
            
			
 			
 			
 			// animated apearing
 			if(arr.animate){
 				$('#graphFieldBar'+unique).css({ 'height' : 0 });
 				$('#graphFieldBar'+unique).animate({'height': fieldHeight},arr.speed*1000);
 			} else {
 				$('#graphFieldBar'+unique).css({'height': fieldHeight});
 			}
 			
 		}
 			
 		
 		
 		createLegend(color_map,el.id); // create legend from array
 		createLinks(el.id);
 		//position of legend
 		
			$(el).append("<div id='legendHolder"+unique+"'></div>");
	 		$('#legendHolder'+unique).css({ 'width': legendWidth, 'float': 'right', 'margin-left':'100px','text-align' : 'left'});
	 		$('#legendHolder'+unique).append(legend);
	 		$('#legendHolder'+unique).append(links);
	 		$('.legendBar'+el.id).css({ 'float':'left', 'margin': 3, 'margin-left':'10','height': 12, 'width': 20, 'font-size': 0});
	 		$('.linkBar'+el.id).css({'margin-left':'10'});
	 		
	 		
	 		$("#sortAsc"+el.id).click(function(){
	           if(opts[el.id].sort!='asc'){
	               opts[el.id].sort='asc';
	               $('#graphHolder'+el.id).html('');
	               $('#graphHolder'+el.id).jqbargraph(opts[el.id]);
	           }
    
	        });
	        $("#sortDesc"+el.id).click(function(){
	           if(opts[el.id].sort!='desc'){
	               opts[el.id].sort='desc';
	               $('#graphHolder'+el.id).html('');
	               $('#graphHolder'+el.id).jqbargraph(opts[el.id]);
	           }
    
	        });
	        $("#sortBarAsc"+el.id).click(function(){
	           if(opts[el.id].sortBar!='asc'){
	               opts[el.id].sortBar='asc';
	               $('#graphHolder'+el.id).html('');
	               $('#graphHolder'+el.id).jqbargraph(opts[el.id]);
	           }
    
	        });
	 		$("#sortBarDesc"+el.id).click(function(){
	           if(opts[el.id].sortBar!='desc'){
	               opts[el.id].sortBar='desc';
	               $('#graphHolder'+el.id).html('');
	               $('#graphHolder'+el.id).jqbargraph(opts[el.id]);
	           }
    
	        });
	        
	        $("#showBasepairs"+el.id).click(function(){
	               opts[el.id].tab='basepairs';
	               $('#graphHolder'+el.id).html('');
	               $('#graphHolder'+el.id).jqbargraph(opts[el.id]);
	               
	      
    
	        });
	        $("#showReads"+el.id).click(function(){
	               opts[el.id].tab='reads';
	               $('#graphHolder'+el.id).html('');
	               $('#graphHolder'+el.id).jqbargraph(opts[el.id]);
	               
	           
    
	        });
 		    
 		    

 		//position of title
 		if(arr.title){
 			$(el).wrap("<div id='graphHolder"+el.id+"'></div>");
 			if(arr.tab=='reads'){
 			    $('#graphHolder'+el.id).prepend("<div id='label"+el.id+"'>Cumulative reads assigned to family</div>").css({ 'width' : arr.width+'px', 'text-align' : 'center' });
 			}else{
   			    $('#graphHolder'+el.id).prepend("<div id='label"+el.id+"'>Cumulative basepairs assigned to family</div>").css({ 'width' : arr.width+'px', 'text-align' : 'center' });
 			}
 			$('#graphHolder'+el.id).prepend("<a href=#files"+el.id+" onclick=fillDiv('"+el.id+"')>"+arr.title+"</a>").css({ 'width' : arr.width+'px', 'text-align' : 'center' });
 		    
  		}
 		    $("#graphHolder"+el.id).append("<div class='files"+el.id+"' id='files"+el.id+"' ></div><p/>");
 		    $('.files'+el.id).css({'width' : arr.width+'px','background-color':'silver', 'border':'2px solid gray', 'display':'none'})
 		    
 		     $("#graphHolder"+el.id).append("<div class='image"+el.id+"' id='image"+el.id+"' ></div>");
 		    $('.image'+el.id).css({'width' : arr.width+'px','background-color':'silver', 'border':'2px solid gray', 'display':'none'})
 		
	};


	//creating legend from array
	createLegend = function(color_map,id){
		legend = '';
		for(var val in color_map){
	 			legend += "<div id='legend"+val+"' style='overflow: hidden; zoom: 1;'>";
	 			legend += "<div class='legendBar"+id+"' id='legendColor"+val+"' style='background-color:"+color_map[val]+"'></div>";
	 			legend += "<div class='legendLabel"+id+"' id='graphLabel"+unique+"'>"+val+"</div>";
	 			legend += "</div>";			
		}
	};
	
	createLinks = function(id){
	   links="<div class='linkBar"+id+"'>";
	   links+="<div ><a href='javascript:void(0);' id='sortAsc"+id+"' >sort  asceding</a></div>"
	   links+="<div ><a href='javascript:void(0);' id='sortDesc"+id+"'>sort  desceding</a></div>"
	   links+="<div ><a href='javascript:void(0);' id='sortBarAsc"+id+"'>sort bars asceding</a></div>"
	   links+="<div ><a href='javascript:void(0);' id='sortBarDesc"+id+"'>sort bars desceding</a></div>"
	   if(opts[id].tab=='reads'){
	       links+="<div ><a href='javascript:void(0);' id='showBasepairs"+id+"'>show baispair chart </a></div>"    
	   }else{
	       links+="<div ><a href='javascript:void(0);' id='showReads"+id+"'>show read chart </a></div>"    
	   }
	   links+="</div>"
	   
	     
	};
	
	fillDiv = function (elid, dir, region) {
	   
	        
	   
	        arr=opts[elid];
	        
	        dict=arr.files;
	        
	        generateDownloadLink = function(family,region,filetype){
	           out=" no file ";
	           console.log(dict[family][region]);
	           if($.inArray("region_"+region+"_"+filetype,dict[family][region])!=-1){
	               out="<a href="+family+"/region_"+region+"_"+filetype+">download</a>";
	           }
	           return out;
	           
	        };
	        generateShowLink = function(family,region){
	           out=" no image ";
               console.log($.inArray("region_"+region+"_consensus.png",dict[family][region]));
	           if($.inArray("region_"+region+"_consensus.png",dict[family][region])!=-1){
	               out="<a href=#image"+elid+" onclick=showImage('"+elid+"','"+region+"','"+ family +"/"+dict[family][region][3]+"')>show</a>";
	           }
	           return out;
	           
	        };

	        
	        data = arr.data
	        for(var val in data){
	           for(var element in data[val][0]){     
	                   dict[data[val][0][0][3]+"_"+data[val][1]][data[val][0][element][5]].push([data[val][0][element][0],data[val][0][element][1],data[val][0][element][4]]);
	               
	           }      
	        }
	        
            var div = document.getElementById("files" + elid);
            div.innerHTML="";
            out = "<div><b>Files for Sample "+arr.sample+"</b></div><p/>";
            
            out += "<div class='" + elid + "_files' id='" + elid + "_files'><table id='"+elid+"table' class='"+elid+"table' border=1 cellpadding=3 cellspacing=0 style=' border: 1pt solid #000000; border-Collapse: collapse'>";
            out += "<tr><th>family</th><th>region</th><th>#reads</th><th>#basepairs</th><th>region length</th><th>unaligned fasta</th><th>bam alignment</th><th>consensus fasta</th><th>consensus diagram</th></tr>"
            if (!dir) {
                for (var directory in dict) {
                    //out += "<b>"+directory+"</b>";
                    //out += "<div class='dirlist' id='" + directory + "_files'";
                    for (var region in dict[directory]) {
                        
                        last = dict[directory][region][dict[directory][region].length-1];
                        console.log(last);
                        if(last instanceof Array && last[0]){
                            out += "<tr><td>"+directory+"</td><td>"+region+"</td><td>"+last[0]+"</td><td>"+last[1]+"</td><td>"+last[2]+"</td><td>"+generateDownloadLink(directory,region,"unaligned.fa.bzip2")+"</td><td>"+generateDownloadLink(directory,region,"alignment.bam")+"</td><td>"+generateDownloadLink(directory,region,"consensus.fa")+"</td><td>"+generateShowLink(directory,region)+" "+generateDownloadLink(directory,region,"consensus.png")+"</td></tr>";
                        }
                    }
                    out += "</div>";
                }
            } else {
                out += "<b>"+ dir+"</b>" ;
                
                if (!region) {
                    for (var region in dict[dir]) {
                        if(dict[dir][region][5]){
                            out += "<tr><td>"+dir+"</td><td>"+region+"</td><td>"+last[0]+"</td><td>"+last[1]+"</td><td>"+last[2]+"</td><td>"+generateDownloadLink(dir,region,"unaligned.fa.bzip2")+"</td><td>"+generateDownloadLink(dir,region,"alignment.bam")+"</td><td>"+generateDownloadLink(dir,region,"consensus.fa")+"</td><td>"+generateShowLink(dir,region)+" "+generateDownloadLink(dir,region,"consensus.png")+"</td></tr>";
                        }
                    }
                } else {

                    if(dict[dir][region][5]){
                        out += "<tr><td>"+dir+"</td><td>"+region+"</td><td>"+last[0]+"</td><td>"+last[1]+"</td><td>"+last[2]+"</td><td>"+generateDownloadLink(dir,region,"unaligned.fa.bzip2")+"</td><td>"+generateDownloadLink(dir,region,"alignment.bam")+"</td><td>"+generateDownloadLink(dir,region,"consensus.fa")+"</td><td>"+generateShowLink(dir,region)+"     "+generateDownloadLink(dir,region,"consensus.png")+"</td></tr>";
                    }
                }
            }
            out += "</div>";
            
            $(div).append(out);
            $("a").css({'color':'black'});
            $("table").css({'border':'collapse'});
            $(div).append("<div class='close_files"+elid+"'style='cursor:pointer;'>x</div>");
            $(".close_files"+elid).click(function(){
                $('.files'+elid).animate({'height':'0px'},1000,'',function(){
                    $('.files'+elid).css({'display':'none'});
                    $('.files'+elid).removeClass("selected");
                });
                
                
            });
            $("div.close_files"+elid).css({'color':'white','position':'absolute','top':5,'left':5,'background-color':arr.colors[1],'border':'1px solid white','border-radius':'20px','height':'20px','width':'20px','text-align': 'center'});
            $("a.close_files"+elid).css({'color':'white', 'text-decoration': 'none'});
            $('.files'+elid).css({'width': 'auto','display':'none'});
            wi=$('.files'+elid).width()+15;

           
            if(!$('.files'+elid).hasClass("selected")){
                $('.files'+elid).css({'height': 'auto','display':'none'});
                hei=$('.files'+elid).height();
                hei=parseInt(hei)+10;
                hei=hei>400? hei=400 : hei;
                $('.files'+elid).css({'width':wi+'px','position':'relative','height':'0px', 'overflow' : 'auto','background-color':'#D0D0D0', 'border':'2px solid silver','border-radius':'10px','display':'block' });
                $('.files'+elid).animate({'height':hei+'px'}, 1000,'',function(){
                   
                    $('.files'+elid).addClass("selected");
                });
            }
            else{
                
                curr_hei=$('.files'+elid).height();
                $('.files'+elid).css({'height': 'auto','display':'none'});
                hei=$('.files'+elid).height();
                hei=parseInt(hei)+10;
                hei=hei>400? hei=400 : hei;
                $('.files'+elid).css({'height': curr_hei+'px', 'width':'915px','position':'relative', 'overflow' : 'auto','background-color':'#D0D0D0', 'border':'2px solid silver','border-radius':'10px','display':'block' }).animate({'height':hei+'px'}, 1000);	           
            }
	};

	 
	 showImage = function (elid,region, consensus_image,wi) {
            var div = document.getElementById("image" + elid);
            div.innerHTML="";
            this.img = new Image();
            this.img.src = consensus_image;
            hei=this.img.height;
            out="<img src="+consensus_image+" alt="+consensus_image+">";
            $(div).append(out)
     
     
     
            $(div).append("<div class='close_image"+elid+"'style='cursor:pointer;'>x</div>");
            $(".close_image"+elid).click(function(){
                $('.image'+elid).animate({'height':'0px'},1000,'',function(){
                    $('.image'+elid).css({'display':'none'});
                    $('.image'+elid).removeClass("selected");
                });
                
                
            });
            $("div.close_image"+elid).css({'color':'white','position':'absolute','bottom':5,'left':5,'background-color':arr.colors[1],'border':'1px solid white','border-radius':'20px','height':'20px','width':'20px','text-align': 'center'});
            $("a.close_image"+elid).css({'color':'white', 'text-decoration': 'none'});
            
            wi=$('.files'+elid).width();
            
            
            if(!$('.image'+elid).hasClass("selected")){
                $('.image'+elid).css({'width':wi+'px','position':'relative','height':'0px', 'overflow' : 'auto','background-color':'#D0D0D0', 'border':'2px solid silver','border-radius':'10px','display':'block' });
                $('.image'+elid).animate({'height':hei}, 1000,'',function(){
                   
                    $('.image'+elid).addClass("selected");
                });
            }
       
	 };


	this.each (
		function()
		{ init(this); }
	)
	
};

	// default values
	$.fn.jqBarGraph.defaults = {	
		sample: 'no_sample_id',
		barSpace: 10,
		width: 400,
		height: 600,
		color: '#000000',
		colors: false,
		lbl: '',
		sort: false, // 'asc' or 'desc'
		sortBar: false,
		tab: 'reads',
		position: 'bottom', // or 'top' doesn't work for multi type
		prefix: '',
		postfix: '',
		animate: true,
		speed: 3.0,
		legendWidth: 150,
		legend: false,
		type: false, // or 'multi'
		showValues: false,
		borderSize: 1,
		showValuesColor: '#fff',
		title: false
	};
	
	
	//sorting functions
	function sortReadsAsc(a,b){
	    sum_a=0
	    for(var values in a){
	       if(a[values] instanceof Array){
	           for(var val in a[values]){
	               sum_a+=a[values][val][0];
	           }
	       }
	    }
	    sum_b=0
	    for(var values in b){
	       if(b[values] instanceof Array){
	           for(var val in b[values]){
	               sum_b+=b[values][val][0];
	           }
	       }
	    }
	    
		if (sum_a<sum_b) return -1;
		if (sum_a>sum_b) return 1;
		return 0;
	}
	function sortBasesAsc(a,b){
	    sum_a=0
	    for(var values in a){
	       if(a[values] instanceof Array){
	           for(var val in a[values]){
	               sum_a+=a[values][val][1];
	           }
	       }
	    }
	    sum_b=0
	    for(var values in b){
	       if(b[values] instanceof Array){
	           for(var val in b[values]){
	               sum_b+=b[values][val][1];
	           }
	       }
	    }
	    
		if (sum_a<sum_b) return -1;
		if (sum_a>sum_b) return 1;
		return 0;
	}
	
	function sortReadsDesc(a,b){
		sum_a=0
	    for(var values in a){
	       if(a[values] instanceof Array){
	           for(var val in a[values]){
	               sum_a+=a[values][val][0];
	           }
	       }
	    }
	    sum_b=0
	    for(var values in b){
	       if(b[values] instanceof Array){
	           for(var val in b[values]){
	               sum_b+=b[values][val][0];
	           }
	       }
	    }
	    
		if (sum_a<sum_b) return 1;
		if (sum_a>sum_b) return -1;
		return 0;
	}
	function sortBasesDesc(a,b){
		sum_a=0
	    for(var values in a){
	       if(a[values] instanceof Array){
	           for(var val in a[values]){
	               sum_a+=a[values][val][1];
	           }
	       }
	    }
	    sum_b=0
	    for(var values in b){
	       if(b[values] instanceof Array){
	           for(var val in b[values]){
	               sum_b+=b[values][val][1];
	           }
	       }
	    }
	    
		if (sum_a<sum_b) return 1;
		if (sum_a>sum_b) return -1;
		return 0;
	}
	
    function sortBars(data,fun){
        for(var values in data){
                last = data[values].pop();
                for(var val in data[values]){
                    data[values][val].sort(fun);
                }
                data[values].push(last);       
        }           
    }
	
    function sortBars(data,fun){
        for(var values in data){
                last = data[values].pop();
                for(var val in data[values]){
                    data[values][val].sort(fun);
                }
                data[values].push(last);       
        }           
    }


    
    function barAsc(a,b){
        if(a[0]<b[0]) return -1;
        if(a[0]>b[0]) return 1;
        return 0;   
    }
	
	function barDesc(a,b){
	    if(a[0]<b[0]) return 1;
        if(a[0]>b[0]) return -1;
	    return 0;  
	}

})(jQuery);