	
	// ----------------------------------------------- drawQuestionnaireGraph
	// This function is intended to support dynamic rendering of questionnaire counts diagrams
	//  - Preconditions: 'diagram' is a preconfigured diagram object 
	//    (setBorder, XScale, YSubGrids, SetText, SetGridColor, Font and Draw are done)
	//  - 'qdata' is a list (array) of datasets, each formed as an array with a 'counts' subarray 
	//     each array is set up like this: 
	//		  id => 1
	//		  title => Questions, #1
	//		  text => Will you vote for our Candidate for W...
	//		  goal => 1000  ### 0 means no goal
	//		  today => Sep 15, 2007
	//		  first_date => Aug 21, 2007
	//		  last_date => Sep 14, 2007
	//		  first_graph_date => Mar 28, 2007
	//		  last_graph_date => Sep 14, 2007
	//		  election_date => Nov 04, 2008
	//		  days => 25
	//		  total_count => 195
	//		  max_count => 29
	//		  total_value => 468 ### optional
	//		  max_value => 68    ### optional
	//		  counts => Array (11)
	//		    0 => Array (5)
	//		      date => Aug 21, 2007
	//		      count => 8
	//		      value => 20
	//		      accumulated_count => 8
	//		      accumulated_value => 20    ### optional
	//  - 'qid' is an index indicating which questionnaire we want to appear - the others will have their visibility turned off
	//	 - 'frame_width' is the width of the plotted graph in pixels
	//	 - 'frame_height' is the height of the plotted graph in pixels
	//	 - 'date_start' can be 'data', 'all', 'today' or a starting date in the form "MonthName DD, YYYY", e.g. "Sep 07, 2007" - VERY STRICT
	//		- default is 'all' which means starting at the earliest data point from all graphs
	//	 - 'date_end'  can be 'data', 'all', 'today', or an ending date in the form "Sep 08, 2008" 
	//		- default is 'all' which means ending today or election day, whichever is later)
	//   - 'chart_type' indicates which type of data will be plotted; 'accumulated' counts/values as a line graph or 'daily' counts/values as a bar chart, or 'both' superimposed
	//   - 'values' if "N" ((default is "Y"), indicates that values, when available, will not be plotted in favor of plotting counts; "B" means plot both superimposed; "Y" (default) means plot values when available, otherwise counts
	// -----------------------------------------------------------------------

	function drawQuestionnaireGraph(diagram, qdata, qid, frame_width, frame_height, date_start, date_end, chart_type, showscores )
	{
		{ if ((navigator.userAgent.search("Opera 5")>=0)||(navigator.userAgent.search("Opera 6")>=0))
		  { alert("Sorry, this doesn't work with this version of Opera.\nUse Opera 7.x, IE 5.x or Netscape 6.x instead.");
		    return;
		  }
		  if ((navigator.appName=="Netscape")&&(parseInt(navigator.appVersion)<5))
		  { if (!confirm("This is not a safe operation with Netscape 4.x."+
		                " It can cause a crash of the browser."+
		                " Do you want to continue anyway?"))
		      return;
		  }
		}
		
		var dc_color = "#000088";
		var dv_color = "#8888FF";
		var ac_color = "#000088";
		var av_color = "#8888FF";
		var goal_color = "#FF6666";
		
		if (typeof(chart_type)!="string") { chart_type = "accumulated" }
		if (typeof(showscores)!="string") { showscores = "Y" }
		
		// set up the frame
		diagram.SetFrame(50, -60, frame_width, frame_height);

		// set up the date range that we're going to show
		if ( ! date_start || date_start == 'all' )
			{ var left_date = qdata[qid].first_graph_date; }
		else if ( date_start == 'data' )
			{ var left_date = qdata[qid].first_date; }
		else if ( date_start == 'today' )
			{ var left_date = qdata[qid].today; }
		else 
			{ var left_date = date_start; }
		
		if ( ! date_end || date_end == 'all' )
		{ 	if ( qdata[qid].election_date )
			{	var election_x = Date.parse(qdata[qid].election_date);
				var last_x = Date.parse(qdata[qid].last_graph_date);
				if ( election_x < last_x ){	var right_date = qdata[qid].last_graph_date;}
				else {var right_date = qdata[qid].election_date;}
			}
			else { var right_date = qdata[qid].last_graph_date; }
		}
		else if ( date_end == 'data' )
			{ var right_date = qdata[qid].last_date; }
		else if ( date_end == 'today' )
			{ var right_date = qdata[qid].today; }
		else 
			{ var right_date = date_end; }
		var left_x = Date.parse(left_date);
		var right_x = Date.parse(right_date);
		if (left_x == right_x)
		{ 
			right_x = right_x+1;
		}
		var diagram_width = Math.max(Math.abs(left_x - right_x),1);
		var frame_width = Math.max(frame_width,1);
		var x_padding = parseInt((diagram_width/frame_width)*5);
		
		var maxy_candidates = new Array(0,0); //need at least two values in the array for Math.max.apply()
		var myindex = 0;
		// figure out top y (world coords)
		if (chart_type=="accumulated")
		{
			maxy_candidates[myindex++] = qdata[qid].goal;
			if (typeof(qdata[qid].total_score)!="undefined" && showscores == "Y" )
			{
				maxy_candidates[myindex++] = qdata[qid].total_score;
			}
			else if (typeof(qdata[qid].total_score)!="undefined" && showscores == "B" )
			{
				maxy_candidates[myindex++] = qdata[qid].total_score;
				maxy_candidates[myindex++] = qdata[qid].total_count;
			}
			else
			{
				maxy_candidates[myindex++] = qdata[qid].total_count;
			}
		}
		else if (chart_type=="both")
		{
			maxy_candidates[myindex++] = qdata[qid].goal;
			if (typeof(qdata[qid].total_score)!="undefined" && showscores == "Y" )
			{
				maxy_candidates[myindex++] = qdata[qid].total_score;
				maxy_candidates[myindex++] = qdata[qid].max_score;
			}
			else if  (typeof(qdata[qid].total_score)!="undefined" && showscores == "B" )
			{
				maxy_candidates[myindex++] = qdata[qid].total_count;
				maxy_candidates[myindex++] = qdata[qid].max_count;
				maxy_candidates[myindex++] = qdata[qid].total_score;
				maxy_candidates[myindex++] = qdata[qid].max_score;
			}
			else
			{
				maxy_candidates[myindex++] = qdata[qid].total_count;
				maxy_candidates[myindex++] = qdata[qid].max_count;
			}
		}
 		else
		{
			if (typeof(qdata[qid].max_score)!="undefined" && showscores == "Y" )
			{
				maxy_candidates[myindex++] = qdata[qid].max_score;
			}
			else if (typeof(qdata[qid].max_score)!="undefined" && showscores == "B" )
			{
				maxy_candidates[myindex++] = qdata[qid].max_count;
				maxy_candidates[myindex++] = qdata[qid].max_score;
			}
			else
			{
				maxy_candidates[myindex++] = qdata[qid].max_count;
			}
		}
		var top_y = Math.max.apply( Math, maxy_candidates ) * 1.05;
		
		var tooltiptext = qdata[qid].text;
		
		var bottom_y = 0;
		diagram.SetBorder(left_x-x_padding, right_x+x_padding, bottom_y, top_y );
		diagram.XScale=5; // use the abbreviated label
		diagram.YSubGrids=1;
		diagram.SetText("","", "");
		diagram.SetGridColor("#EEEEEE", "#EEEEEE");
		diagram.Font="font-family:Verdana;font-size:6pt;line-height:8pt;";
		adjustXGrid(diagram,frame_width);
		diagram.Draw("images/graph_background.png", "#000000", false, tooltiptext);
		
		// loop through each dataset
		for (var i = 0; i<qdata.length; i++)
		{
			// loop through the datasets and draw or resize the line segments
			// coordinate variable prefixes: dv = daily scores; dc = daily counts; av = accumulated scores; ac = accumulated counts
			// daily coords only need one point: x and y; accumulated coords need two points x1, y1, x2 and y2
			var x1 ="";
			var x2 ="";
			var dcy;
			var dvy;
			var acy1 ="";
			var acy2 ="";
			var avy1 ="";
			var avy2 ="";
			for (var k = 0; k<qdata[i].counts.length; k++ )
			{
				x2 = Date.parse( qdata[i].counts[k].date );
				
				if (typeof(qdata[i].counts[k].score)!="undefined")
				{
					dvy = parseInt(qdata[i].counts[k].score) ;
					if (typeof(qdata[i].counts[k].dvdiv)=="object")
					{
						qdata[i].counts[k].dvdiv.ResizeTo(diagram.ScreenX(x2), diagram.ScreenY(bottom_y), diagram.ScreenX(x2), diagram.ScreenY(dvy));
					}
					else
					{
						qdata[i].counts[k].dvdiv = new Line(diagram.ScreenX(x2), diagram.ScreenY(bottom_y), diagram.ScreenX(x2), diagram.ScreenY(dvy), dv_color, 4, qdata[i].counts[k].uniqid, "sum of response scores on "+qdata[i].counts[k].date+" is "+dvy);
					}
				}

				dcy = parseInt(qdata[i].counts[k].count) ;
				if (typeof(qdata[i].counts[k].dcdiv)=="object")
				{
					qdata[i].counts[k].dcdiv.ResizeTo(diagram.ScreenX(x2), diagram.ScreenY(bottom_y), diagram.ScreenX(x2), diagram.ScreenY(dcy));
				}
				else
				{
					qdata[i].counts[k].dcdiv = new Line(diagram.ScreenX(x2), diagram.ScreenY(bottom_y), diagram.ScreenX(x2), diagram.ScreenY(dcy), dc_color, 2, qdata[i].counts[k].uniqid, "response count on "+qdata[i].counts[k].date+" is "+dcy);
				}
				
				if (typeof(qdata[i].counts[k].accumulated_score)!="undefined")
				{
					avy2 = parseInt(qdata[i].counts[k].accumulated_score) ;
					if (typeof(x1) == "number" && (x1 != x2 || avy1 != avy2))
					{
						if (typeof(qdata[i].counts[k].avdiv)=="object")
						{
							qdata[i].counts[k].avdiv.ResizeTo(diagram.ScreenX(x1), diagram.ScreenY(avy1), diagram.ScreenX(x2), diagram.ScreenY(avy2));
						}
						else
						{
							qdata[i].counts[k].avdiv = new Line(diagram.ScreenX(x1), diagram.ScreenY(avy1), diagram.ScreenX(x2), diagram.ScreenY(avy2), av_color, 1, qdata[i].counts[k].uniqid, "accumulated score on "+qdata[i].counts[k].date+" is "+avy2);
						}
					}
				}
				
				acy2 = parseInt(qdata[i].counts[k].accumulated_count) ;
				if (typeof(x1) == "number" && (x1 != x2 || acy1 != acy2))
				{
					if (typeof(qdata[i].counts[k].acdiv)=="object")
					{
						qdata[i].counts[k].acdiv.ResizeTo(diagram.ScreenX(x1), diagram.ScreenY(acy1), diagram.ScreenX(x2), diagram.ScreenY(acy2));
					}
					else
					{
						qdata[i].counts[k].acdiv = new Line(diagram.ScreenX(x1), diagram.ScreenY(acy1), diagram.ScreenX(x2), diagram.ScreenY(acy2), ac_color, 1, qdata[i].counts[k].uniqid, "accumulated response count as of "+qdata[i].counts[k].date+" is "+acy2);
					}
				}
				
				
				
				if ( i==qid)
				{
					if (typeof(qdata[i].counts[k].dcdiv)=="object") { if ((chart_type=="daily"       || chart_type=="both") && (showscores=="N" || showscores=="B")) { qdata[i].counts[k].dcdiv.SetVisibility(true); } else { qdata[i].counts[k].dcdiv.SetVisibility(false); } }
					if (typeof(qdata[i].counts[k].acdiv)=="object") { if ((chart_type=="accumulated" || chart_type=="both") && (showscores=="N" || showscores=="B")) { qdata[i].counts[k].acdiv.SetVisibility(true); } else { qdata[i].counts[k].acdiv.SetVisibility(false); } }
					if (typeof(qdata[i].counts[k].dvdiv)=="object") { if ((chart_type=="daily"       || chart_type=="both") && (showscores=="Y" || showscores=="B")) { qdata[i].counts[k].dvdiv.SetVisibility(true); } else { qdata[i].counts[k].dvdiv.SetVisibility(false); } }
					if (typeof(qdata[i].counts[k].avdiv)=="object") { if ((chart_type=="accumulated" || chart_type=="both") && (showscores=="Y" || showscores=="B")) { qdata[i].counts[k].avdiv.SetVisibility(true); } else { if (typeof(qdata[i].counts[k].avdiv)=="object") { qdata[i].counts[k].avdiv.SetVisibility(false); } } } 
				}
				else
				{
					if (typeof(qdata[i].counts[k].dcdiv)=="object") { qdata[i].counts[k].dcdiv.SetVisibility(false) }
					if (typeof(qdata[i].counts[k].acdiv)=="object") { qdata[i].counts[k].acdiv.SetVisibility(false) }
					if (typeof(qdata[i].counts[k].dvdiv)=="object") { qdata[i].counts[k].dvdiv.SetVisibility(false) }
					if (typeof(qdata[i].counts[k].avdiv)=="object") { qdata[i].counts[k].avdiv.SetVisibility(false) }
				}
				x1=x2;
				acy1=acy2;
				avy1=avy2;
			}
		
			// if we have a separate goal count, render it as a horizontal line at the appropriate Y-value accross the graph
			if (qdata[i].goal > 0)
			{
				if ( typeof(qdata[i].goaldiv)=="object" )
				{
					qdata[i].goaldiv.ResizeTo(diagram.ScreenX(left_x), diagram.ScreenY(qdata[i].goal), diagram.ScreenX(right_x), diagram.ScreenY(qdata[i].goal));
				}
				else
				{
					qdata[i].goaldiv = new Line(diagram.ScreenX(left_x), diagram.ScreenY(qdata[i].goal), diagram.ScreenX(right_x), diagram.ScreenY(qdata[i].goal), goal_color, 2, qdata[i].uniqid, "Goal is "+qdata[i].goal);
				}
				if ( typeof(qdata[i].goaldiv)=="object" )
				{
					if ( i==qid && chart_type !="daily")
					{
						qdata[i].goaldiv.SetVisibility(true);
					}
					else
					{
						qdata[i].goaldiv.SetVisibility(false);
					}
				}
			}
		}
	}




	function drawTaskGraph(diagram, qdata, qid, frame_width, frame_height, date_start, date_end, chart_type )
	{
		var showscores = "B"
		{ if ((navigator.userAgent.search("Opera 5")>=0)||(navigator.userAgent.search("Opera 6")>=0))
		  { alert("Sorry, this doesn't work with this version of Opera.\nUse Opera 7.x, IE 5.x or Netscape 6.x instead.");
		    return;
		  }
		  if ((navigator.appName=="Netscape")&&(parseInt(navigator.appVersion)<5))
		  { if (!confirm("This is not a safe operation with Netscape 4.x."+
		                " It can cause a crash of the browser."+
		                " Do you want to continue anyway?"))
		      return;
		  }
		}
		
		var d1_color = "#ff0000";
		var d2_color = "#ffbb00";
		var d3_color = "#D0AEB5";
		var d4_color = "#8888FF";
		var outlinecolor = "#000000";
		var day = 24*60*60*1000; // number of miliseconds in a day
		var halfday = day/2;
		
		if (typeof(chart_type)!="string") { chart_type = "accumulated" }
		if (typeof(showscores)!="string") { showscores = "Y" }
		
		// set up the frame
		diagram.SetFrame(50, -60, frame_width, frame_height);

		// set up the date range that we're going to show
		if ( ! date_start || date_start == 'all' )
			{ var left_date = qdata[qid].first_graph_date; }
		else if ( date_start == 'data' )
			{ var left_date = qdata[qid].first_date; }
		else if ( date_start == 'today' )
			{ var left_date = qdata[qid].today; }
		else 
			{ var left_date = date_start; }
		
		if ( ! date_end || date_end == 'all' )
		{ 	if ( qdata[qid].election_date )
			{	var election_x = Date.parse(qdata[qid].election_date);
				var last_x = Date.parse(qdata[qid].last_graph_date);
				if ( election_x < last_x ){	var right_date = qdata[qid].last_graph_date;}
				else {var right_date = qdata[qid].election_date;}
			}
			else { var right_date = qdata[qid].last_graph_date; }
		}
		else if ( date_end == 'data' )
			{ var right_date = qdata[qid].last_date; }
		else if ( date_end == 'today' )
			{ var right_date = qdata[qid].today; }
		else 
			{ var right_date = date_end; }
		
		var left_x = Date.parse(left_date);
		var right_x = Date.parse(right_date);
		if (left_x == right_x)
		{ 
			right_x = right_x+1;
		}
		left_x  = left_x  - left_x  % day;
		right_x = right_x - right_x % day + day;

		var diagram_width = Math.max(Math.abs(left_x - right_x),1);
		var days = diagram_width/day; 
		var frame_width = Math.max(frame_width,1);
		var day_width = parseInt(frame_width/days); // alert("day_width: "+day_width);
		var x_padding = parseInt((diagram_width/frame_width)*5);
		
		var maxy_candidates = new Array(0,0); //need at least two values in the array for Math.max.apply()
		var myindex = 0;
		// figure out top y (world coords)
			if (typeof(qdata[qid].max_score)!="undefined" && showscores == "Y" )
			{
				maxy_candidates[myindex++] = qdata[qid].max_score;
			}
			else if (typeof(qdata[qid].max_score)!="undefined" && showscores == "B" )
			{
				maxy_candidates[myindex++] = qdata[qid].max_count;
				maxy_candidates[myindex++] = qdata[qid].max_score;
			}
			else
			{
				maxy_candidates[myindex++] = qdata[qid].max_count;
			}
		var top_y = Math.max.apply( Math, maxy_candidates ) * 1.05;
		
		var tooltiptext = qdata[qid].text;
		
		var bottom_y = 0;
		diagram.SetBorder(left_x-x_padding-halfday, right_x+x_padding, bottom_y, top_y );
		diagram.XScale=5; // use the abbreviated label
		diagram.YSubGrids=1;
		diagram.SetText("","", "");
		diagram.SetGridColor("#EEEEEE", "#EEEEEE");
		diagram.Font="font-family:Verdana;font-size:6pt;line-height:8pt;";
		adjustXGrid(diagram,frame_width);
		diagram.Draw("images/graph_background.png", "#000000", false, tooltiptext);
		
		// loop through each dataset
		for (var i = 0; i<qdata.length; i++)
		{
			// loop through the datasets and draw or resize the line segments
			var x1 ="";
			var x2 ="";
			var y = "";
			var ncount;
			var basey = "";
			for (var k = 0; k<qdata[i].counts.length; k++ )
			{
				x2 = Date.parse( qdata[i].counts[k].date )-halfday ;
				boxwidth = Math.max(parseInt(diagram.ScreenX(day)-diagram.ScreenX(0)-2),1);
				
				basey = bottom_y;

				ncount = parseInt(qdata[i].counts[k].overdue) ;
				y = ncount + basey;
				if (typeof(qdata[i].counts[k].dy1div)=="object")
				{
					qdata[i].counts[k].dy1div.ResizeTo(diagram.ScreenX(x2), diagram.ScreenY(y), boxwidth, parseInt(eval(diagram.ScreenY(basey)-diagram.ScreenY(y))));
				}
				else if ( y > basey)
				{
//					qdata[i].counts[k].dy1div = new Bar(diagram.ScreenX(x2), diagram.ScreenY(y), Math.max(diagram.ScreenX(x2+day)-2,1), diagram.ScreenY(basey), d1_color,     "", "#000000", "number of tasks created on "+qdata[i].counts[k].date+" that remain pending and are overdue is "+ncount);
					qdata[i].counts[k].dy1div = new Box(diagram.ScreenX(x2), diagram.ScreenY(y), Math.max(diagram.ScreenX(x2+day)-2,1), diagram.ScreenY(basey), d1_color,     "<div style='height:100%;width:100%;background-image:url(images/taskprogress_1.gif)'></div>", "#000000", 0, "#ffffff", "number of tasks created on "+qdata[i].counts[k].date+" that are currently overdue is "+ncount);
				}
				basey = y;

				ncount =  parseInt(qdata[i].counts[k].pending) ;
				y = ncount + basey;
				if (typeof(qdata[i].counts[k].dy2div)=="object")
				{
					qdata[i].counts[k].dy2div.ResizeTo(diagram.ScreenX(x2), diagram.ScreenY(y), boxwidth, Math.max(parseInt(eval(diagram.ScreenY(basey)-diagram.ScreenY(y))),1));
				}
				else if ( y > basey)
				{
					qdata[i].counts[k].dy2div = new Box(diagram.ScreenX(x2), diagram.ScreenY(y), Math.max(diagram.ScreenX(x2+day)-2,1), diagram.ScreenY(basey), d2_color,     "<div style='height:100%;width:100%;background-image:url(images/taskprogress_2.gif)'></div>", "#f000f0", 0, "#ffffff",        "number of tasks created on "+qdata[i].counts[k].date+" that are pending is "+ncount);
				}
				basey = y;

				ncount =  parseInt(qdata[i].counts[k].completed_late) ;
				y = ncount + basey;
				if (typeof(qdata[i].counts[k].dy3div)=="object")
				{
					qdata[i].counts[k].dy3div.ResizeTo(diagram.ScreenX(x2), diagram.ScreenY(y), boxwidth, Math.max(parseInt(eval(diagram.ScreenY(basey)-diagram.ScreenY(y))),1));
				}
				else if ( y > basey)
				{
					qdata[i].counts[k].dy3div = new Box(diagram.ScreenX(x2), diagram.ScreenY(y), Math.max(diagram.ScreenX(x2+day)-2,1), diagram.ScreenY(basey), d3_color,     "<div style='height:100%;width:100%;background-image:url(images/taskprogress_3.gif)'></div>", "#f000f0", 0, "#ffffff", "number of tasks created on "+qdata[i].counts[k].date+" that were completed late is "+ncount);
				}
				basey = y;
				
				ncount = parseInt(qdata[i].counts[k].completed_on_time) ;
				y = ncount + basey;
				if (typeof(qdata[i].counts[k].dy4div)=="object")
				{
					qdata[i].counts[k].dy4div.ResizeTo(diagram.ScreenX(x2), diagram.ScreenY(y), boxwidth, Math.max(parseInt(eval(diagram.ScreenY(basey)-diagram.ScreenY(y))),1));
				}
				else if ( y > basey)
				{
					qdata[i].counts[k].dy4div = new Box(diagram.ScreenX(x2), diagram.ScreenY(y), Math.max(diagram.ScreenX(x2+day)-2,1), diagram.ScreenY(basey), d4_color,     "<div style='height:100%;width:100%;background-image:url(images/taskprogress_4.gif)'></div>", "#f000f0", 0, "#ffffff", "number of tasks created on "+qdata[i].counts[k].date+" that were completed on time is "+ncount);
				}

				if (typeof(qdata[i].counts[k].line0)=="object")
				{
					qdata[i].counts[k].line0.ResizeTo(diagram.ScreenX(x2), diagram.ScreenY(bottom_y), diagram.ScreenX(x2), diagram.ScreenY(y));
					qdata[i].counts[k].line1.ResizeTo(diagram.ScreenX(x2), diagram.ScreenY(y), Math.max(diagram.ScreenX(x2+day)-2,1), diagram.ScreenY(y));
					qdata[i].counts[k].line2.ResizeTo(Math.max(diagram.ScreenX(x2+day)-2,1), diagram.ScreenY(bottom_y), Math.max(diagram.ScreenX(x2+day)-2,1), diagram.ScreenY(y));
				}
				else
				{
					qdata[i].counts[k].line0 = new Line(diagram.ScreenX(x2), diagram.ScreenY(bottom_y), diagram.ScreenX(x2), diagram.ScreenY(y), outlinecolor, 1, "");
					qdata[i].counts[k].line1 = new Line(diagram.ScreenX(x2), diagram.ScreenY(y), Math.max(diagram.ScreenX(x2+day)-2,1), diagram.ScreenY(y), outlinecolor, 1, "");
					qdata[i].counts[k].line2 = new Line(Math.max(diagram.ScreenX(x2+day)-2,1), diagram.ScreenY(bottom_y), Math.max(diagram.ScreenX(x2+day)-2,1), diagram.ScreenY(y), outlinecolor, 1, "");
				}
				


				if ( i==qid)
				{
					if (typeof(qdata[i].counts[k].dy1div)=="object") { qdata[i].counts[k].dy1div.SetVisibility(true); }
					if (typeof(qdata[i].counts[k].dy2div)=="object") { qdata[i].counts[k].dy2div.SetVisibility(true); }
					if (typeof(qdata[i].counts[k].dy3div)=="object") { qdata[i].counts[k].dy3div.SetVisibility(true); }
					if (typeof(qdata[i].counts[k].dy4div)=="object") { qdata[i].counts[k].dy4div.SetVisibility(true); }
					if (typeof(qdata[i].counts[k].line0)=="object") { if ( boxwidth > 3 ) {qdata[i].counts[k].line0.SetVisibility(true); } else {qdata[i].counts[k].line0.SetVisibility(false); } }
					if (typeof(qdata[i].counts[k].line1)=="object") { if ( boxwidth > 3 ) {qdata[i].counts[k].line1.SetVisibility(true); } else {qdata[i].counts[k].line1.SetVisibility(false); } }
					if (typeof(qdata[i].counts[k].line2)=="object") { if ( boxwidth > 3 ) {qdata[i].counts[k].line2.SetVisibility(true); } else {qdata[i].counts[k].line2.SetVisibility(false); } }
				} 
				else
				{
					if (typeof(qdata[i].counts[k].dy1div)=="object") { qdata[i].counts[k].dy1div.SetVisibility(false) }
					if (typeof(qdata[i].counts[k].dy2div)=="object") { qdata[i].counts[k].dy2div.SetVisibility(false) }
					if (typeof(qdata[i].counts[k].dy3div)=="object") { qdata[i].counts[k].dy3div.SetVisibility(false) }
					if (typeof(qdata[i].counts[k].dy4div)=="object") { qdata[i].counts[k].dy4div.SetVisibility(false) }
					if (typeof(qdata[i].counts[k].line0)=="object") { qdata[i].counts[k].line0.SetVisibility(false) }
					if (typeof(qdata[i].counts[k].line1)=="object") { qdata[i].counts[k].line1.SetVisibility(false) }
					if (typeof(qdata[i].counts[k].line2)=="object") { qdata[i].counts[k].line2.SetVisibility(false) }
				}
				x1=x2;
			}
		
		}

	}
	
	
	
	function adjustXGrid(diagram, diagram_width)
	{
		diagram.XGridDelta=0;
		var reference_width = 60;
		var xgrid = diagram.GetXGrid();
		var delta=xgrid[1];
		var range=Math.abs(xgrid[2]-xgrid[0]);
		var count=range/delta;
		var delta_pixels = diagram_width/count;
		if (delta_pixels <= reference_width) 
		{
			var multiplier = Math.round(reference_width/delta_pixels);
			if (multiplier%2) multiplier+=1;
		}
		else
		{
			var m = Math.round(delta_pixels/reference_width);
			if (m%2) m+=1;		
			var multiplier = 1/(m);		
		}
		var newdelta = diagram.DateInterval(range)*multiplier;
		diagram.XGridDelta = newdelta;
	}
	

