<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
	<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
	<TITLE>rrdFlotSupport module</TITLE>
	<META NAME="GENERATOR" CONTENT="OpenOffice.org 3.0  (Linux)">
	<META NAME="Info 1" CONTENT="">
	<META NAME="Info 2" CONTENT="">
	<META NAME="Info 3" CONTENT="">
	<META NAME="Info 4" CONTENT="">
	<STYLE TYPE="text/css">
	<!--
		@page { margin: 0.79in }
		TD P { margin-bottom: 0.08in }
		H1 { margin-bottom: 0.08in }
		H1.western { font-family: "Liberation Sans", sans-serif; font-size: 22pt }
		P { margin-bottom: 0.08in }
		H2.heading-2-western { font-family: "Liberation Serif", serif; font-size: 16pt }
		TH P { margin-bottom: 0.08in }
		A:link { so-language: zxx }
	-->
	</STYLE>
</HEAD>
<BODY LANG="en-US" DIR="LTR">
<H1 CLASS="western">rrdFlotSupport module</H1>
<TABLE WIDTH=50% CELLPADDING=2 CELLSPACING=2>
	<TR>
		<TD>
			<HR>
			<P>The <A HREF="../../src/lib/rrdFlotSupport.js">rrdFlotSupport Javascript module</A> 
                        implements a set of commonly used functions an classes that may be used while plotting 
                        <A HREF="http://oss.oetiker.ch/rrdtool/">RRD files</A> with 
                        <A HREF="http://www.flotcharts.org/">Flot</A>.</P>
			<HR>
		</TD>
	</TR>
</TABLE>
<H2 CLASS="heading-2-western">Overview</H2>
<P>This module provides two types of support:
<UL>
 <LI>Functions providing support in converting raw data into Flot-friendly format:
    <A HREF="#rrdDS2FlotSeries">rrdDS2FlotSeries</A>,
    <A HREF="#rrdRRA2FlotObj">rrdRRA2FlotObj</A>,
     <A HREF="#rrdRRAStackFlotObj">rrdRRAStackFlotObj</A> and
     <A HREF="#rrdRRAMultiStackFlotObj">rrdRRAMultiStackFlotObj</A>.
 <LI>A class providing support for handling the plotting:
     <A HREF="#rrdFlotSelection">rrdFlotSelection</A>.
</UL>
</P>
<H2 CLASS="heading-2-western"><A NAME="rrdDS2FlotSeries"></A>Function rrdDS2FlotSeries</H2>
<P>This function extracts a specific DS from a specific RRA and returns an object that 
contains the data in format flot expects.</P>
<P>
Input parameters:
</P>
<DIV ALIGN=RIGHT>
	<TABLE WIDTH=90% BORDER=1 CELLPADDING=2 CELLSPACING=3>
		<COL WIDTH=51*>
		<COL WIDTH=205*>
		<THEAD>
			<TR VALIGN=TOP>
				<TH WIDTH=20%>
					<P ALIGN=LEFT>Parameter</P>
				</TH>
				<TH WIDTH=80%>
					<P ALIGN=LEFT>Description</P>
				</TH>
			</TR>
		</THEAD>
		<TBODY>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>rrd_file</P>
				</TD>
				<TD WIDTH=80%>
					<P>An object of type <A HREF="rrdFile_js.html#RRDFile">RRDFile</A> or equivalent.</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>ds_id</P>
				</TD>
				<TD WIDTH=80%>
					<P>Identifier of the desired DS (as accepted by
                                            <A HREF="rrdFile_js.html#RRDFile">RRDFile.getDS()</A>).</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>rra_idx</P>
				</TD>
				<TD WIDTH=80%>
					<P>Index of the desired RRA.</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>want_rounding</P>
				</TD>
				<TD WIDTH=80%>
					<P>If not false, all timestamps will be truncated to the RRA step.</P>
				</TD>
			</TR>
		</TBODY>
	</TABLE>
</DIV>
<P>
The output is an object containing:
</P>
<DIV ALIGN=RIGHT>
	<TABLE WIDTH=90% BORDER=1 CELLPADDING=2 CELLSPACING=3>
		<COL WIDTH=51*>
		<COL WIDTH=205*>
		<THEAD>
			<TR VALIGN=TOP>
				<TH WIDTH=20%>
					<P ALIGN=LEFT>Attribute</P>
				</TH>
				<TH WIDTH=80%>
					<P ALIGN=LEFT>Description</P>
				</TH>
			</TR>
		</THEAD>
		<TBODY>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>data</P>
				</TD>
				<TD WIDTH=80%>
					<P>A list of datapoints suitable to be fed to <A HREF="http://www.flotcharts.org/">Flot</A>. Each element is a (Timestamp in ms, value) pair.<P>
                                        <P>An example of use with Flot:<BR>
<PRE>
var fd=rrdDS2FlotSeries(...);
var plot = $.plot("#myplot", [{data:fd.data}], options);
</PRE>
                                        </P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>label</P>
				</TD>
				<TD WIDTH=80%>
					<P>The DS name.</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>min</P>
				</TD>
				<TD WIDTH=80% ROWSPAN=2>
					<P>Min and max timestamp in ms.</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>max</P>
				</TD>
                        </TR>
		</TBODY>
	</TABLE>
</DIV>
<H2 CLASS="heading-2-western"><A NAME="rrdRRA2FlotObj"></A>Function rrdRRA2FlotObj</H2>
<P>This function extracts a list of DSs from a specific RRA and returns an object that 
contains the data in format flot expects.</P>
<P>
Input parameters:
</P>
<DIV ALIGN=RIGHT>
	<TABLE WIDTH=90% BORDER=1 CELLPADDING=2 CELLSPACING=3>
		<COL WIDTH=51*>
		<COL WIDTH=205*>
		<THEAD>
			<TR VALIGN=TOP>
				<TH WIDTH=20%>
					<P ALIGN=LEFT>Parameter</P>
				</TH>
				<TH WIDTH=80%>
					<P ALIGN=LEFT>Description</P>
				</TH>
			</TR>
		</THEAD>
		<TBODY>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>rrd_file</P>
				</TD>
				<TD WIDTH=80%>
					<P>An object of type <A HREF="rrdFile_js.html#RRDFile">RRDFile</A> or equivalent.</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>rra_idx</P>
				</TD>
				<TD WIDTH=80%>
					<P>Index of the desired RRA.</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>ds_list</P>
				</TD>
				<TD WIDTH=80%>
					<P>List of DS identifiers (as accepted by
                                            <A HREF="rrdFile_js.html#RRDFile">RRDFile.getDS()</A>).</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>want_ds_labels</P>
				</TD>
				<TD WIDTH=80%>
					<P>Should the DS names be included as labels in the output? 
                                           (If false, only the order distinguishes the requested DSs)</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>want_rounding</P>
				</TD>
				<TD WIDTH=80%>
					<P>If not false, all timestamps will be truncated to the RRA step.</P>
				</TD>
			</TR>
		</TBODY>
	</TABLE>
</DIV>
<P>
The output is an object containing:
</P>
<DIV ALIGN=RIGHT>
	<TABLE WIDTH=90% BORDER=1 CELLPADDING=2 CELLSPACING=3>
		<COL WIDTH=51*>
		<COL WIDTH=205*>
		<THEAD>
			<TR VALIGN=TOP>
				<TH WIDTH=20%>
					<P ALIGN=LEFT>Attribute</P>
				</TH>
				<TH WIDTH=80%>
					<P ALIGN=LEFT>Description</P>
				</TH>
			</TR>
		</THEAD>
		<TBODY>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>data</P>
				</TD>
				<TD WIDTH=80%>
					<P>A list of objects suitable to be fed to <A HREF="http://www.flotcharts.org/">Flot</A>. Each element is an object composed of two attributes:<UL>
                                         <LI>data - A list of (Timestamp in ms, value) pairs.</LI>
                                         <LI>label - The (optional) DS name.</LI></UL></P>
                                        <P>An example of use with Flot:<BR>
<PRE>
var fd=rrdDS2FlotObj(...);
var plot = $.plot("#myplot", fd.data, options);
</PRE>
                                        </P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>min</P>
				</TD>
				<TD WIDTH=80% ROWSPAN=2>
					<P>Min and max timestamp in ms.</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>max</P>
				</TD>
                        </TR>
		</TBODY>
	</TABLE>
</DIV>
<H2 CLASS="heading-2-western"><A NAME="rrdRRAStackFlotObj"></A>Function rrdRRAStackFlotObj</H2>
<P>This function extracts a list of DSs from a specific RRA, stacks them as requested and
returns an object that contains the data in format flot expects.</P>
<P>
Input parameters:
</P>
<DIV ALIGN=RIGHT>
	<TABLE WIDTH=90% BORDER=1 CELLPADDING=2 CELLSPACING=3>
		<COL WIDTH=51*>
		<COL WIDTH=205*>
		<THEAD>
			<TR VALIGN=TOP>
				<TH WIDTH=20%>
					<P ALIGN=LEFT>Parameter</P>
				</TH>
				<TH WIDTH=80%>
					<P ALIGN=LEFT>Description</P>
				</TH>
			</TR>
		</THEAD>
		<TBODY>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>rrd_file</P>
				</TD>
				<TD WIDTH=80%>
					<P>An object of type <A HREF="rrdFile_js.html#RRDFile">RRDFile</A> or equivalent.</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>rra_idx</P>
				</TD>
				<TD WIDTH=80%>
					<P>Index of the desired RRA.</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>ds_positive_stack_list</P>
				</TD>
				<TD WIDTH=80%>
					<P>List of DS identifiers (as accepted by
                                            <A HREF="rrdFile_js.html#RRDFile">RRDFile.getDS()</A>)
				           to be stacked. All values must be positive if
				           ds_negative_stack_list is not empty.</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>ds_negative_stack_list</P>
				</TD>
				<TD WIDTH=80%>
					<P>List of DS identifiers (as accepted by
                                            <A HREF="rrdFile_js.html#RRDFile">RRDFile.getDS()</A>)
				           to be stacked. All values must be negative if
				           ds_positive_stack_list is not empty.</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>ds_single_list</P>
				</TD>
				<TD WIDTH=80%>
					<P>List of DS identifiers (as accepted by
                                            <A HREF="rrdFile_js.html#RRDFile">RRDFile.getDS()</A>).
				           No stacking for these ones.</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>want_ds_labels</P>
				</TD>
				<TD WIDTH=80%>
					<P>Should the DS names be included as labels in the output? 
                                           (If false, only the order distinguishes the requested DSs)</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>want_rounding</P>
				</TD>
				<TD WIDTH=80%>
					<P>If not false, all timestamps will be truncated to the RRA step.</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>one_undefined_enough</P>
				</TD>
				<TD WIDTH=80%>
					<P>If true, a whole stack is invalidated if a
				           single element of the stack is invalid.</P>
				</TD>
			</TR>
		</TBODY>
	</TABLE>
</DIV>
<P>
The output is an object containing:
</P>
<DIV ALIGN=RIGHT>
	<TABLE WIDTH=90% BORDER=1 CELLPADDING=2 CELLSPACING=3>
		<COL WIDTH=51*>
		<COL WIDTH=205*>
		<THEAD>
			<TR VALIGN=TOP>
				<TH WIDTH=20%>
					<P ALIGN=LEFT>Attribute</P>
				</TH>
				<TH WIDTH=80%>
					<P ALIGN=LEFT>Description</P>
				</TH>
			</TR>
		</THEAD>
		<TBODY>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>data</P>
				</TD>
				<TD WIDTH=80%>
					<P>A list of objects suitable to be fed to <A HREF="http://www.flotcharts.org/">Flot</A>. Each element is an object composed of two attributes:<UL>
                                         <LI>data - A list of (Timestamp in ms, value) pairs.</LI>
                                         <LI>label - The (optional) DS name.</LI></UL></P>
                                        <P>An example of use with Flot:<BR>
<PRE>
var fd=rrdDS2FlotObj(...);
var plot = $.plot("#myplot", fd.data, options);
</PRE>
                                        </P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>min</P>
				</TD>
				<TD WIDTH=80% ROWSPAN=2>
					<P>Min and max timestamp in ms.</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>max</P>
				</TD>
                        </TR>
		</TBODY>
	</TABLE>
</DIV>
<H2 CLASS="heading-2-western"><A NAME="rrdRRAMultiStackFlotObj"></A>Function rrdRRAMultiStackFlotObj</H2>
<P>This function extracts a DS from a list of RRDs, using a specific RRA index, then stacks them and
returns an object that contains the data in format flot expects.</P>
<P>
Input parameters:
</P>
<DIV ALIGN=RIGHT>
	<TABLE WIDTH=90% BORDER=1 CELLPADDING=2 CELLSPACING=3>
		<COL WIDTH=51*>
		<COL WIDTH=205*>
		<THEAD>
			<TR VALIGN=TOP>
				<TH WIDTH=20%>
					<P ALIGN=LEFT>Parameter</P>
				</TH>
				<TH WIDTH=80%>
					<P ALIGN=LEFT>Description</P>
				</TH>
			</TR>
		</THEAD>
		<TBODY>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>rrd_files</P>
				</TD>
				<TD WIDTH=80%>
					<P>A list of RRDs. Each element of the list contains a [rrd_id,rrd_file] pair.
				           <ul>
					    <li>rrd_id - Logical name for the RRD.
				            <li>rrd_file -An object of type <A HREF="rrdFile_js.html#RRDFile">RRDFile</A> or equivalent.
					   </ul>
					</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>rra_idx</P>
				</TD>
				<TD WIDTH=80%>
					<P>Index of the desired RRA.</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>ds_id</P>
				</TD>
				<TD WIDTH=80%>
					<P>DS indentifier  (as accepted by
                                            <A HREF="rrdFile_js.html#RRDFile">RRDFile.getDS()</A>)</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>want_rrd_labels</P>
				</TD>
				<TD WIDTH=80%>
					<P>Should the RRD names be included as labels in the output? 
                                           (If false, only the order distinguishes the requested RRDs)</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>want_rounding</P>
				</TD>
				<TD WIDTH=80%>
					<P>If not false, all timestamps will be truncated to the RRA step.</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>one_undefined_enough</P>
				</TD>
				<TD WIDTH=80%>
					<P>If true, a whole stack is invalidated if a
				           single element of the stack is invalid.</P>
				</TD>
			</TR>
		</TBODY>
	</TABLE>
</DIV>
<P>
The output is an object containing:
</P>
<DIV ALIGN=RIGHT>
	<TABLE WIDTH=90% BORDER=1 CELLPADDING=2 CELLSPACING=3>
		<COL WIDTH=51*>
		<COL WIDTH=205*>
		<THEAD>
			<TR VALIGN=TOP>
				<TH WIDTH=20%>
					<P ALIGN=LEFT>Attribute</P>
				</TH>
				<TH WIDTH=80%>
					<P ALIGN=LEFT>Description</P>
				</TH>
			</TR>
		</THEAD>
		<TBODY>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>data</P>
				</TD>
				<TD WIDTH=80%>
					<P>A list of objects suitable to be fed to <A HREF="http://www.flotcharts.org/">Flot</A>. Each element is an object composed of two attributes:<UL>
                                         <LI>data - A list of (Timestamp in ms, value) pairs.</LI>
                                         <LI>label - The (optional) DS name.</LI></UL></P>
                                        <P>An example of use with Flot:<BR>
<PRE>
var fd=rrdDS2FlotObj(...);
var plot = $.plot("#myplot", fd.data, options);
</PRE>
                                        </P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>min</P>
				</TD>
				<TD WIDTH=80% ROWSPAN=2>
					<P>Min and max timestamp in ms.</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>max</P>
				</TD>
                        </TR>
		</TBODY>
	</TABLE>
</DIV>
<H2 CLASS="heading-2-western"><A NAME="rrdFlotSelection"></A>Class rrdFlotSelection</H2>
<P>Helper class to handle <A HREF="http://www.flotcharts.org/">Flot</A> selections.
</P>
<DIV ALIGN=RIGHT>
	<TABLE WIDTH=90% BORDER=1 CELLPADDING=2 CELLSPACING=3>
		<COL WIDTH=52*>
		<COL WIDTH=204*>
		<THEAD>
			<TR VALIGN=TOP>
				<TH WIDTH=20%>
					<P ALIGN=LEFT>Method</P>
				</TH>
				<TH WIDTH=80%>
					<P ALIGN=LEFT>Description</P>
				</TH>
			</TR>
		</THEAD>
		<TBODY>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>reset()</P>
				</TD>
				<TD WIDTH=80%>
					<P>Clear the selection. (isSet() will return False)</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>isSet()</P>
				</TD>
				<TD WIDTH=80%>
					<P>Was a selection set?</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>setFromFlotRanges(ranges)</P>
				</TD>
				<TD WIDTH=80%>
					<P>Set the selection to ranges.xaxis. See plotselected 
                                           <A HREF="http://www.flotcharts.org/">Flot</A>
                                           event for more info on ranges. (isSet() will return True, and getFlotRanges() can now be called.)</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>getFlotRanges()</P>
				</TD>
				<TD WIDTH=80%>
					<P>Return a ranges object. See plotselected 
                                           <A HREF="http://www.flotcharts.org/">Flot</A>
                                           event for more info on ranges.</P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>trim_flot_data(flot_data)</P>
				</TD>
				<TD WIDTH=80%>
					<P>Create a new Flot data object by selecting only the data points within the current selection.</P>
                                        <P>An example Flot data object is 
<PRE>
rrdDS2FlotObj(...).data
</PRE></P>
				</TD>
			</TR>
			<TR VALIGN=TOP>
				<TD WIDTH=20%>
					<P>trim_data(data_list)</P>
				</TD>
				<TD WIDTH=80%>
					<P>Create a new data list by selecting only the data points within the current selection.</P>
                                        <P>An example data list is 
<PRE>
rrdDS2FlotSeries(...).data
</PRE></P>
				</TD>
			</TR>
		</TBODY>
	</TABLE>
</DIV>
<P>Pseudo-example of use:
<PRE>
  myplotplot.bind("plotselected", function (event, ranges) {
      // do the zooming
      selection_range.setFromFlotRanges(ranges);
      graph_options.xaxis.min=ranges.xaxis.from;
      graph_options.xaxis.max=ranges.xaxis.to;
      mygraph = $.plot("#mygraph", selection_range.trim_flot_data(flot_data), graph_options);
  });
</PRE>
</P>
<TABLE WIDTH=50% CELLPADDING=2 CELLSPACING=2>
        <TR>
                <TD>
                        <HR>
                        <P>This module is part of the <A HREF="index.html">javascriptRRD
                        package</A> hosted at <A HREF="http://javascriptrrd.sourceforge.net/">http://javascriptrrd.sourceforge.net</A>.
                        <BR>It is licensed under the <A HREF="http://www.opensource.org/licenses/mit-license.php">MIT
                        license</A>.
                        </P>
                        <HR>
                </TD>
        </TR>
</TABLE>

</BODY>
</HTML>