text: Rickshaw.namespace('Rickshaw.Graph.Renderer.Multi');
  
  
  
  
  
  Rickshaw.Graph.Renderer.Multi = Rickshaw.Class.create( Rickshaw.Graph.Renderer, {
  
  
  
  
  
  	name: 'multi',
  
  
  
  
  
  	initialize: function($super, args) {
  
  
  
  
  
  		$super(args);
  
  
  	},
  
  
  
  
  
  	defaults: function($super) {
  
  
  
  
  
  		return Rickshaw.extend( $super(), {
  
  
  			unstack: true,
  
  
  			fill: false,
  
  
  			stroke: true 
  
  
  		} );
  
  
  	},
  
  
  
  
  
  	domain: function($super) {
  
  
  
  
  
  		this.graph.stackData();
  
  
  
  
  
  		var domains = [];
  
  
  
  
  
  		var groups = this._groups();
  
  
  		this._stack(groups);
  
  
  
  
  
  		groups.forEach( function(group) {
  
  
  
  
  
  			var data = group.series
  
  
  				.filter( function(s) { return !s.disabled } )
  
  
  				.map( function(s) { return s.stack });
  
  
  
  
  
  			if (!data.length) return;
  
  
  
  
  
  			var domain = $super(data);
  
  
  			domains.push(domain);
  
  
  		});
  
  
  
  
  
  		var xMin = d3.min(domains.map( function(d) { return d.x[0] } ));
  
  
  		var xMax = d3.max(domains.map( function(d) { return d.x[1] } ));
  
  
  		var yMin = d3.min(domains.map( function(d) { return d.y[0] } ));
  
  
  		var yMax = d3.max(domains.map( function(d) { return d.y[1] } ));
  
  
  
  
  
  		return { x: [xMin, xMax], y: [yMin, yMax] };
  
  
  	},
  
  
  
  
  
  	_groups: function() {
  
  
  
  
  
  		var graph = this.graph;
  
  
  
  
  
  		var renderGroups = {};
  
  
  
  
  
  		graph.series.forEach( function(series) {
  
  
  
  
  
  			if (series.disabled) return;
  
  
  
  
  
  			if (!renderGroups[series.renderer]) {
  
  
  
  
  
  				var ns = "http://www.w3.org/2000/svg";
  
  
  				var vis = document.createElementNS(ns, 'g');
  
  
  
  
  
  				graph.vis[0][0].appendChild(vis);
  
  
  
  
  
  				var renderer = graph._renderers[series.renderer];
  
  
  
  
  
  				renderGroups[series.renderer] = {
  
  
  					renderer: renderer,
  
  
  					series: [],
  
  
  					vis: d3.select(vis)
  
  
  				};
  
  
  			}
  
  
  				
  
  
  			renderGroups[series.renderer].series.push(series);
  
  
  
  
  
  		}, this);
  
  
  
  
  
  		var groups = [];
  
  
  
  
  
  		Object.keys(renderGroups).forEach( function(key) {
  
  
  			var group = renderGroups[key];
  
  
  			groups.push(group);
  
  
  		});
  
  
  
  
  
  		return groups;
  
  
  	},
  
  
  
  
  
  	_stack: function(groups) {
  
  
  
  
  
  		groups.forEach( function(group) {
  
  
  
  
  
  			var series = group.series
  
  
  				.filter( function(series) { return !series.disabled } );
  
  
  
  
  
  			var data = series
  
  
  				.map( function(series) { return series.stack } );
  
  
  
  
  
  			if (!group.renderer.unstack) {
  
  
  
  
  
  				var layout = d3.layout.stack();
  
  
  				var stackedData = Rickshaw.clone(layout(data));
  
  
  
  
  
  				series.forEach( function(series, index) {
  
  
  					series._stack = Rickshaw.clone(stackedData[index]);
  
  
  				});
  
  
  			}
  
  
  
  
  
  		}, this );
  
  
  
  
  
  		return groups;
  
  
  
  
  
  	},
  
  
  
  
  
  	render: function() {
  
  
  
  
  
  		this.graph.series.forEach( function(series) {
  
  
  			if (!series.renderer) {
  
  
  				throw new Error("Each series needs a renderer for graph 'multi' renderer");
  
  
  			}
  
  
  		});
  
  
  
  
  
  		this.graph.vis.selectAll('*').remove();
  
  
  
  
  
  		var groups = this._groups();
  
  
  		groups = this._stack(groups);
  
  
  
  
  
  		groups.forEach( function(group) {
  
  
  
  
  
  			var series = group.series
  
  
  				.filter( function(series) { return !series.disabled } );
  
  
  
  
  
  			group.renderer.render({ series: series, vis: group.vis });
  
  
  			series.forEach(function(s) { s.stack = s._stack || s.stack || s.data; });
  
  
  		});
  
  
  	}
  
  
  
  
  
  } );
  
  
  