diff --git a/html/billing-graph.php b/html/billing-graph.php
index 8bf2e45786..a1d10584b3 100644
--- a/html/billing-graph.php
+++ b/html/billing-graph.php
@@ -9,9 +9,9 @@ include("../config.php");
include("../includes/functions.php");
include("includes/authenticate.inc");
if(!$_SESSION['authenticated']) { echo("unauthenticated"); exit; }
-require("includes/jpgraph/jpgraph.php");
-include("includes/jpgraph/jpgraph_line.php");
-include("includes/jpgraph/jpgraph_utils.inc.php");
+require("includes/jpgraph/src/jpgraph.php");
+include("includes/jpgraph/src/jpgraph_line.php");
+include("includes/jpgraph/src/jpgraph_utils.inc.php");
if($_GET['bill_id']){
if(testPassword($_GET['bill_id'],$_GET['bill_code']) == "1") {
diff --git a/html/includes/billing.php b/html/includes/billing.php
index 47ee7e5314..accceee6c6 100644
--- a/html/includes/billing.php
+++ b/html/includes/billing.php
@@ -120,11 +120,11 @@ $lastmonth = mysql_result(mysql_query("SELECT UNIX_TIMESTAMP(DATE_SUB(NOW(), INT
$yesterday = mysql_result(mysql_query("SELECT UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY))"), 0);
$now = date(U);
-$di = " It is common to group activities. We have used this feature in the
+ examples of constrains. There is no special type for activity bars that
+ are used to illustrate grouping. The common way of illustrating this
+ (as have been used above) is to add "half" a triangle marker at both
+ ends of the bar. The special provision that JpGraph does is that if you
+ add a left or right marker of type MARK_LEFTTRIANGLE or
+ MARK_RIGHTTRIANGLE those triangles will be drawn under the bars to give
+ the effect as show in the examples above. In the example above we also
+ have made the grouping bars have slightly less heigh since the end
+ triangles will visually "grow" the bar. So to get the effect we want for a group bar we have to use the two
+ lines:";
-$mi = "
";
diff --git a/html/includes/jpgraph/QPL.txt b/html/includes/jpgraph/QPL.txt
new file mode 100644
index 0000000000..66986cb17c
--- /dev/null
+++ b/html/includes/jpgraph/QPL.txt
@@ -0,0 +1,119 @@
+THE Q PUBLIC LICENSE version 1.0
+
+Copyright (C) 1999 Trolltech AS, Norway.
+ Everyone is permitted to copy and
+ distribute this license document.
+
+The intent of this license is to establish freedom to share and change
+the software regulated by this license under the open source model.
+
+This license applies to any software containing a notice placed by the
+copyright holder saying that it may be distributed under the terms of
+the Q Public License version 1.0. Such software is herein referred to
+as the Software. This license covers modification and distribution of
+the Software, use of third-party application programs based on the
+Software, and development of free software which uses the Software.
+
+
+Granted Rights
+
+1. You are granted the non-exclusive rights set forth in this license
+ provided you agree to and comply with any and all conditions in
+ this license. Whole or partial distribution of the Software, or
+ software items that link with the Software, in any form signifies
+ acceptance of this license.
+
+
+2. You may copy and distribute the Software in unmodified form
+ provided that the entire package, including - but not restricted to
+ - copyright, trademark notices and disclaimers, as released by the
+ initial developer of the Software, is distributed.
+
+
+3. You may make modifications to the Software and distribute your
+ modifications, in a form that is separate from the Software, such
+ as patches. The following restrictions apply to modifications:
+
+ a. Modifications must not alter or remove any copyright notices in the
+ Software.
+
+ b. When modifications to the Software are released under this license,
+ a non-exclusive royalty-free right is granted to the initial developer
+ of the Software to distribute your modification in future versions of
+ the Software provided such versions remain available under these terms
+ in addition to any other license(s) of the initial developer.
+
+
+4. You may distribute machine-executable forms of the Software or
+ machine-executable forms of modified versions of the Software,
+ provided that you meet these restrictions:
+
+ a. You must include this license document in the distribution.
+
+ b. You must ensure that all recipients of the machine-executable forms
+ are also able to receive the complete machine-readable source code to
+ the distributed Software, including all modifications, without any
+ charge beyond the costs of data transfer, and place prominent notices
+ in the distribution explaining this.
+
+ c. You must ensure that all modifications included in the
+ machine-executable forms are available under the terms of this
+ license.
+
+
+5. You may use the original or modified versions of the Software to
+ compile, link and run application programs legally developed by you
+ or by others.
+
+
+6. You may develop application programs, reusable components and other
+ software items that link with the original or modified versions of
+ the Software. These items, when distributed, are subject to the
+ following requirements:
+
+
+
+ a. You must ensure that all recipients of machine-executable forms of
+ these items are also able to receive and use the complete
+ machine-readable source code to the items without any charge beyond
+ the costs of data transfer.
+
+
+ b. You must explicitly license all recipients of your items to use and
+ re-distribute original and modified versions of the items in both
+ machine-executable and source code forms. The recipients must be able
+ to do so without any charges whatsoever, and they must be able to
+ re-distribute to anyone they choose.
+
+
+ c. If the items are not available to the general public, and the
+ initial developer of the Software requests a copy of the items, then
+ you must supply one.
+
+
+Limitations of Liability
+
+In no event shall the initial developers or copyright holders be
+liable for any damages whatsoever, including - but not restricted to -
+lost revenue or profits or other direct, indirect, special, incidental
+or consequential damages, even if they have been advised of the
+possibility of such damages, except to the extent invariable law, if
+any, provides otherwise.
+
+
+No Warranty
+
+The Software and this license document are provided AS IS with NO
+WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN,
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+
+Choice of Law
+
+This license is governed by the Laws of Norway. Disputes shall be
+settled by Oslo City Court.
+
+
+
+
+
diff --git a/html/includes/jpgraph/README b/html/includes/jpgraph/README
new file mode 100644
index 0000000000..c17ed7c8bb
--- /dev/null
+++ b/html/includes/jpgraph/README
@@ -0,0 +1,162 @@
+README FOR JPGRAPH
+==================
+
+This package contains JpGraph, an Object Oriented PHP4 Graph Plotting library.
+
+The library is Copyright (C) 1999-2009 Aditus Consulting and
+released under dual license QPL 1.0 for open source and educational
+use and JpGraph Professional License for commercial use.
+
+Please see full license details at http://www.aditus.nu/jpgraph/
+
+* --------------------------------------------------------------------
+* PHP5 IS NOT SUPPORTED IN THE 1.x SERIES
+* Please use the 2.x serie if PHP5 support is required
+* --------------------------------------------------------------------
+
+
+Included files
+--------------
+README This file
+QPL.txt QPL 1.0 Licensee
+
+/src
+ jpg-config.inc.php Configuration setup for JpGraph
+ jpgraph.php Base library
+ jpgraph_errhandler.inc.php Base library. Error handler module.
+ gd_image.inc.php Base library. GD interface class
+ jpgraph_ttf.inc.php Base library. TTF font handling
+
+ jpgraph_led.php Extension: LED digits module
+ jpgraph_log.php Extension: logarithmic scales
+ jpgraph_date.php Extension: date/time scales
+ jpgraph_line.php Extension: line plots
+ jpgraph_bar.php Extension: bar plots
+ jpgraph_error.php Extension: error plots
+ jpgraph_scatter.php Extension: scatter/impulse plots
+ jpgraph_radar.php Extension: radar plots
+ jpgraph_pie.php Extension: pie plots
+ jpgraph_pie3d.php Extension: 3D pie plots
+ jpgraph_canvas.php Extension: drawing canvas
+ jpgraph_canvtools.php Extension: utility classes for working with canvas
+ jpgraph_gantt.php Extension: Gantt chart
+ jpgraph_regstat.php Extension: Statistics and cubic splines.
+ jpgraph_stock.php Extension: Stock and box plots.
+ jpgraph_gradient.php Extension: Color gradient class
+ jpgraph_gb2312.php Extension: Chinese GB2312 to Unicode translation
+ jpgraph_plotmark.php Extension: Handle plotmarks in plots
+ jpgraph_imgtrans.php Extension: Basic image transformation
+ jpgraph_flags.php Extension: Country flags
+ jpgraph_iconplot.php Extension: Use image icons in plots
+ jpgraph_plotband.php Extension: Plotbands in graphs
+ jpgraph_plotmark.inc.php Extension: Using plotmarks in graphs
+ jpgraph_antispam.php Extension: Antispam module
+ jpgraph_antispam-digits.php Extension: Antispam module
+ jpgraph_utils.inc.php Extension: Non mandatory Utility classes
+ jpgraph_mgraph.php Extension: Multi graph
+ imgdata_*.inc Extension: Encoded images for plot marks
+ flags*.dat Raw Image data: Pre-compiled data for country flags.
+
+/src/Examples A directory with example sripts.
+ Run testsuit.php to get a list of all
+ files and you can easily click on a file to
+ see the code and the resulting image.
+
+/docs Directory with all documentation
+/docs/index.html Documentation portal
+
+/lang
+ de.inc.php German translation of error messages
+ en.inc.php English version of error messages
+ prod.inc.php Production version of error messages (does not
+ give specific details in error message.)
+Requirements:
+-------------
+Miminum:
+* PHP 4.4.1 or higher
+ (earlier versions might work but is unsupported)
+* GD 2.0.30 or higher
+ (earlier versions might work but is unsupported)
+
+Recommended:
+* PHP 4.4.9
+* PHP Builtin GD 2.0.34 library
+
+Installation
+------------
+0. Make sure that the PHP version is compatible with the stated requirements
+ and that the PHP installation has support for the GD library.
+ Please run phpinfo() to check if GD library
+ is supported in the installation.
+ If the GD library doesn't seem to be installed
+ please consult the PHP manual under section "Image" for
+ instructions on where to find this library. Please refer to
+ the manual section "Verifying your PHP installation"
+
+1. Unzip and copy the files to a directory of your choice where Your
+ httpd sever can access them.
+ For a global site installation you should copy the files to
+ somewhere in the PHP search path.
+
+2. Check that the default directory paths in jpg-config.inc
+ for cache directory and TTF directory suits your installation.
+ Note1: The default directories are different depending on if
+ the library is running on Windows or UNIX.
+ Note2: Apache/PHP must have write permission to your cache
+ directory if you enable the cache feature. By default the cache
+ is disabled.
+
+3. Check that all rest of the DEFINE in jpg-config.inc
+ is setup to your preference. The default should be fine
+ for most users. (See also Note 3. below)
+
+4. If any problems are encounted please start by reading the FAQ on
+ http://www.aditus.nu/jpgraph/jpgraphfaq.php.
+
+
+Documentation
+-------------
+The installation includes HTML documentation and reference guide for the
+library. The portal page for all the documentation is
+
+10.10 Grouping activities
+
+ $groupbar->
+leftMark->
+SetType(
+"MARK_LEFTTRIANGLE");
+
$groupbar
+->rightMark->SetType(
+"MARK_RIGHTTRIANGLE")
+
As of the current version There is not yet any formatting support to + accomplish the effect of indentation for the titles so this is + accomplished by using a fixed width font and adding spaces in front of + the title.
+Precisely as before you can also have a title spanning all the + columns. This title is specified with the property tableTitle of + the scale. Specifying a table title will automatically adjust the + height of the column titles to fit the table title. The small code + snippet below shows how to add a title.
$graph
+->scale->tableTitle->
+Set('Phase 1');
+
$graph->scale->
+tableTitle->
+SetFont(
+FF_ARIAL,
+FS_NORMAL,12);
+
$graph->scale->
+SetTableTitleBackground(
+'darkgreen@0.6');
+
$graph->scale->
+tableTitle->
+Show(true);
A full example of this is shown below
+ +In exactly the same way as for a single title it is possible to + specify individual CSIM targets for each of the title columns. This is + accomplished by specifying an array for both the target and the alt + text instead of a single string as arguments for SetCSIMTarget() + The following code snippet shows how to specify that.
$bar
+->title->SetCSIMTarget(array('sometarget1.html','sometarget1.html'),
+
array('alttext1'
+,'alttext2'));
It is often of interest not only to show one title for a gantt bar + but often one wants to show, title, start date, end date, duration or + effort and so on. Up until now we have, to keep things simple only + shown a single title for each activity. We will now show you how you + can specify an arbitrary number of columns as titles for a Gantt chart + as well as adding icons in the graph columns.
+First out is an example to help visualize what we will achieve
+To use multiple columns there is two steps. First you need to set + the titles (name, color, fonts etc). Thereafter you need to add the + title columns for each individual bar.
+To set the columns you will have to work with the Activity + information property of the scale. The following code excerpt show + this
+ $graph->scale->actinfo
+->SetColTitles
+(
+
array('Note'
+,'Task','Duration',
+'Start',
+'Finish'),array(
+30,100));
You will notice two things. We fist specify the titles using an + array. We have also specified a second array with the numbers 30 and + 100. This is an optional array that specifies the minimum width of, in + this case, the first two columns. By default the columns will be wide + enough to hold the widest text string in the column. However for + esthetic reasons you might sometimes want to increase the minium width. + This is what we have done here for the first two columns.
+Furthermore you can also adjust the background colors and the style + and colors of the vertical dividing grid lines. In the previous image + we used the lines
$graph->
+scale->actinfo->SetBackgroundColor('green:0.5@0.5');
+
$graph->scale->
+actinfo->
+SetFont(
+FF_ARIAL,
+FS_NORMAL,10);
+
$graph->scale->
+actinfo->vgrid->SetStyle
+('solid');
+
$graph->scale->
+actinfo->vgrid->SetColor
+('gray');
The style for the grid lines can also be "dashed", "dotted" or + "longdashed" as in other line formatting contexts within the library. + You can also adjust if you would like the small "3D" effect in the + titles. By default this is enabled. You can easily turn this of with a + call to
+ $graph->scale->actinfo
+->SetStyle(ACTINFO_2D);
+
To adjust the colors of the vertical dividing lines in the title the + method SetColor() is used as in + "$graph->scale->actinfo->SetColor('navy');".
+The second thins is to actually populate the columns. This is done + (of course) as you add the activity bars to the graph. Previous we just + used a string as the title when we wasn't using columns. By simply + replacing this string with an array we specify the content of the + columns.
+For example to specify two column titles we just create a + hypothetical Gantt bar as In the full example above we put all this in + arrays to make for better coding practice since we create several bars.
+In addition to ordinary text you can also add an image or any of the + predefined icons available. In order to add that in a column you first + create an instance of IconImage() and then specify that instance + instead of the text. So in the previous code snippet if we wanted a + "open folder" image in the first column we would change the lines to
+ $iconopen = new
+IconImage(
+GICON_FOLDEROPEN,
+0.6);
+
$title2="";
+
$bar
+= new GanttBar
+(0,array($iconopen,
+$title2),
+"2003-11-23",
+"2003-12-05");
+
The available builtin icons are
+In addition you can also use any of you own images if you specify + the argument as a string, for example
+ $myicon = IconImage(
+'myicon.png');
+
If you wonder, the second argument in the IconImage() call is + an optional scaling factor which you can use to adjust the size of the + image.
+The (default) white area in the top left of the gantt table may have + a title. This is accessed by the 'tableTitle' property of the gantt + scale. Using this is straightforward as the following lines show.
$graph
+->scale->tableTitle->
+Set(
+"(Rev: 1.22)");
+
$graph->scale->
+tableTitle->
+SetFont(
+FF_FONT1,
+FS_BOLD);
+
$graph->scale->
+SetTableTitleBackground(
+"silver");
+
$graph->scale->
+tableTitle->
+Show();
+
The example lines above also changes the default white background to + silver. Adding these lines to the previous example gives the following + result:
+From the above example you might notice that the width of the left + column (which holds all the titles) have automatically adjusted itself + to make the table title fit.
+The vertical and horizontal lines between the titles and the bars + can be modified by accessing the 'divider' and 'dividerh' properties of + the scale. Again, this is straightforward as the following example + shows:
+ $graph->scale->divider
+->SetWeight(3);
+
$graph->scale->
+divider->
+SetColor(
+"navy");
+
$graph->scale->
+dividerh->
+SetWeight(3);
+
$graph->scale->
+dividerh->
+SetColor(
+"navy");
+
The effect of this is shown in Figure 163 below
+ +In a similar manner to the other plots in JpGraph you modify the Box + round the plot with the standard graph method 'SetBox()' as in
$graph
+->SetBox(true,
+"navy",3)
which will result in a thicker plot box around the area as shown + below
+In order to make large charts easier to read it is possible to + specify alternating an horizontal grid and optional alternating line + colors in the background for Gantt charts. The horizontal grid is + accessed through the Graph::hgrid property and the line (used in + the grid) is accessed through the Graph::hgrid::line + sub-property
+In order to specify the alternating line colors the + SetRowFillColor() method is used. For example, to use alternating + blue background with blue grid line the following lines would have to + be added to the graph script
+
+// Setup a horizontal grid
+
$graph->hgrid->
+Show();
+
$graph->hgrid->
+line->SetColor('lightblue'
+);
+
$graph->hgrid->
+SetRowFillColor(
+'darkblue@0.9');
+
Below is an example of a Gantt graph using this formatting
+ +
+ $icon = new IconPlot(
+'penguin.png',
+0.01,0.95,1
+,15);
+
$icon->SetAnchor(
+'left',
+'bottom');
+
$graph->Add(
+$icon);
+
$graph
+= new GanttGraph
+(500);
+
$graph->SetMargin(
+0,0,30
+,0);
In this section we will show a few more way by which you may + customize the gantt chart itself. This includes
+As we have shown in the previous examples constructing a Gantt chart + consists of a number of repetitive tasks; Create the individual + activity bars and add them to the graph.
+Now when you have a basic understanding of how this works you are + ready to appreciate a small helper method. +GanttGraph::CreateSimple(). This method takes a few arrays of data + which specifies you Gantt chart and then constructs this chart. By + using this method you sacrifices a few adjustment possibilities for + simplicity. This method is nothing magical it just takes the data for + the activities,(start and end date, titles, progress, any constrains + and so on) and constructs the activities and adds them to the graph.
+The activities are specified in data array which for each activity + have the following fields
+So for example to create a Gantt chart consisting of two activities + which are grouped and a milestone one would have to use something + similar to the following code
+
+ $data = array(
+
array(0,ACTYPE_GROUP, "Phase 1", "2001-10-26",
+"2001-11-23",
+""),
+
array(1,ACTYPE_NORMAL, " Label 2", "2001-10-26",
+"2001-11-13",
+"[KJ]"),
+
array(2,ACTYPE_NORMAL, " Label 3", "2001-11-20",
+"2001-11-22",
+"[EP]"),
+
array(3,ACTYPE_MILESTONE," Phase 1 Done", "2001-11-23",
+"M2") );
+
+
// Create the basic graph
+
$graph
+= new GanttGraph
+();
+
$graph->title->
+Set(
+"Gantt Graph using CreateSimple()");
+
+
// Setup scale
+
$graph->ShowHeaders(
+GANTT_HYEAR |
+GANTT_HMONTH |
+GANTT_HDAY |
+GANTT_HWEEK);
+
$graph->scale->
+week->SetStyle(WEEKSTYLE_FIRSTDAY);
+
+
// Add the specified activities
+
$graph->CreateSimple(
+$data);
+
+
// .. and stroke the graph
+
$graph->Stroke();
+
This will then show up as
+You may (slightly) modify the appearance of the simple Gantt charts + by means of the methods GanttGraph::SetSimpleFont() and GanttGraph::SetSimpleStyle() But not anything else, remember + that the purpose with this way of constructing graphs is to be simple. + If you need full advanced control you have to construct all the + activities in the "normal" way.
+You can also specify constrains and progress for each bar by + supplying additional data arrays to GanttGraph::CreateSimple().
+Gantt charts can have independent (different targets) hot spots in + both the activities and in the associated labels for each activity.
+You specify the target and the associated "Alt" text for an activity + bar by calling the + GanttBar::SetCSIMTarget() and + GanttBar::SetCSIMAlt()
+In a similar way you set the target and Alt texts for the activity + title as the following code extract shows.
$bar
+->SetCSIMTarget
+("http://localhost/abc/"
+);
+
$bar->SetCSIMAlt(
+"Alt Text for the bar");
+
$bar->title->
+SetCSIMTarget(
+"http://localhost/abc");
+
$bar->title->
+SetCSIMAlt(
+"Alt Text for the title");
+
The above code assumes that your activity is available in the + variable 'bar'. In the example directory there is a complete example of + how to use CSIM together with Gantt charts in the "ganttcsimex1.php" + file. (Please note that this example makes use of the simplified Gantt + chart specification using the CreateSimple() method.
+With Gantt charts there is often the need to illustrate constrains + between one or several activities. One of the most common constrain is + that on activity can't start before an other activity finish.
+JpGraph support visualizing the following types of constrains
+An example will clarify how to specify a constrain between two + activities.
+Assume that we start with the Gantt schema as illustrated below
+We would now like to add the constrains that the activity "Label 3" + cant start before activity "Label 2" has finished and that the + milestone "Phase 1 done" is depending on when activity "Label 3" is + done.
+The principle of adding constrains is that you for each activity you + want to have a constrain you have to tell to what other activity this + constrain should be to. That other activity is specified by telling on + what row that activity lies. Depending on what type of constrain, e.g. + Start-to-End, an arrow will now connect the two activities in correct + way.
+The way to do this is to call the + SetConstrain() method on the activity. In this method you specify + the type of constrain as well as to what other activity this constrain + should be to. If you read the class reference you can also see that you + can specify the type and size of arrow used. For now we will just use + the default sizes and type.
+So for example to add an End-To-Start constrain between "Label 2" + and "Label 3" you could write
+ $bar2->
+SetConstrain(2,CONSTRAIN_ENDSTART)
The first parameter in the call above "2" is the row of the target + activity (i.e. the row where "Label 3") activity is. In the example + below we have added the constrains we wanted.
+A note: The actual path followed by the arrow is controlled by some + heuristics to make it clear what the constrain is. It has been a design + decision that in order to keep the API simple the user has no further + detailed controlled on the actual path followed. However, in future + version the heuristics may be extended and provide some + user-controllable parameters.
+You can choose to only display a vertical slice of the overall Gantt + chart by explicitly specifying a date range with the method + GanttGraph::SetDateRange(). This will cap any bars to only be displayed + in between the start and end date given as parameters. For example + specifying
+ $graph->
+SetDateRange(
+"2001-12-20",
+"2002-01-20");
+
will show the part of the Gantt chart between the 20 Dec 2001 and 20 + of January 2002. Please note that the format depends on the locale + setting.
+You can set the week start day with a call to + GanttScale::SetWeekStart(). This method takes an integer [0,6] as input + which represents the start day of the week, 0 means Sunday, 1 Monday, 2 + Tuesday and so on. The default is to start the week on Monday.
+Depending on your installation of PHP you might have support for + several locales. By default the locale is set up to use the default + locale on the server.
+To specifically set a locale you specify the wanted locale with a + locale string (ala standard PHP), for example American English is + specified with the string 'EN_US', British English with 'EN_UK' 'nl_NL' + for Dutch and so on. If your current installation does not support the + specified locale an error message will be given.
+ $graph
+->scale->SetDateLocale(
+"se_SE");
+
The result is displayed below.
+ +Anti-aliased lines are enabled by calling the method + SetAntiAliasing() in the + Image class in the script where you want to use anti-aliasing.
+The anti-aliasing for lines works by "smoothing" out the edges on + the line by using a progressive scale of colors interpolated between + the background color and the line color.
+An example will show that this, quite simple algorithm, gives a + reasonable good result. The figures below shows a radar plot with and + without anti-aliasing.
+ + + + +One thing you need to keep in mind when deciding to use + anti-aliasing is that it could have potentially a dramatic effect on + the time it takes to generate the image. Line drawing with + anti-aliasing turned on is roughly 8 times slower than the normal line + drawing so treat this feature wisely.
+Furthermore there are a couple of "gotchas" you should be aware of + when using anti-aliasing.
+From version 1.2 JpGraph supports drawing of anti-aliased lines. + There are a few caveats in order to use this which is discussed in this + section.
+JpGraph provide the possibility for you to rotate the generated + graph an arbitrary angle. This will only affect the actual graph (axis, + axis titles, labels and so on) and not fixed elements on the graph like + title or footer.
+Rotation is probably most used to rotate a graph 90 degrees, for + example a bar graph to get the effect of horizontal bars.
+ +Performance note: Adding a rotation transformation + will make the graph generation slightly slower since each point of the + graph as to go through a transformation step before being stroked on to + the image. JpGraph optimizes this by using a pre-calculated + transformation matric and also optimizes the special case 90 degrees.
+ +By default the center of the rotation will be the center of the plot + area, which may or may not coincide with the center of the entire + image.
+To control the rotation you use the two methods
+For example
+ $graph->image->SetAngle
+(45);
There is actually a third method that you could use, adding a + translation to the graph after the rotation. Since + this probably a very little used method we don't discuss it further but + refer the reader to the class reference instead + Graph:image::SetTranslation()
+ When you rotate an image you should be aware of that the individual
+ labels on the axis are not rotated. The design decision behind this is
+
a) Bit mapped font can't be rotated
+
b) Maintain readability
Please remember that you may still rotate the labels by calling the Axis::SetLabelAngle() + method.
+Since the anchor point for labels is by default the optimum for + graph at 0 degree you might want to adjust the anchor point and + alignment for the labels on the axis to get a better visual appearance + on you rotated graph. This is accomplished by the method + Axis::SetLabelAlign() For a detailed discussion on how to do this + please see the section on horizontal bar graphs, ( +Working with bar plots )
+The table below shows some examples on different kinds of rotation + to give you an idea of how changing the angle and rotation center may + be used to generate different effects. The top left graph is the + original image. The point of rotation has been marked with a red-cross + in each of the images.
+ + + + + + + +As you can see from the images above if you rotate about any other + point than the center of the plot area the plot can be placed outside + the image after rotation.
+Since the rotation, by design, only affects the plot area it is + often most effective to use when the color of the margin is the same as + the background color.
+Canvas graph is really not a graph. It a blank sheet of paper which + you can use to draw arbitrary shapes and still have access to some of + the convenient features of JpGraph.
+You can work with a canvas in different levels of complexity. You + can for example work directly with the Image class which provides a + large number of primitives for drawing but requires that you use + absolute pixel coordinates.
+You can also make life a little bit easier by using a canvas scale. + This lets you define your own scale on the canvas which often makes it + easier by letting you work on a grid you have specified yourself. It + also makes it very easy to re-scale you image automatically by just + changing your scale. For example to half the size of you drawing you + just make the scale twice as large.
+To give you some help in working with different canvas you should + include the "jpgraph_canvtools.php" file when working on canvases. This + is not strictly necessary but it will give you some nice abstraction to + help you create your masterpieces.
+As another (concrete) example on the use of a canvas the figure + below is a listing of font styles available with JpGraph.
+ +The cynical view: To explain why your project is over-due and + over-budget.
+The pragmatic view: To keep management of our back and know what we + have forgotten
+The common view: As a tool to help identify project issues and + highlight problem areas.
+Basically, Gantt charts are used to show the state of a number of + activities (possible grouped) against time.
+The following section only applies to palette images. This + means it wont work on true-color images.
+It is often desirable to have a background image look a little bit + "washed" out so it doesn't take the concentration away from the actual + graph. There are basically two ways of accomplish this
+To adjust the background image call The levels for both brightness + and contrast are real numbers in the range [-1, 1] You can choose to + adjust for example just the background image or you might also choose + to adjust the whole image. To change the background image just use the + method + Graph::AdjBackgroundImage() to specify a suitable value. Let's show + some example on what we can do with this. The following example have + been generated by using the small utility "adjimg.php" which you can + find in the "utils/" directory.
+
+
Brightness=0, contrast=0, saturation = -1 (Original image)
+
Brightness=0, contrast=0, saturation = -1 (Black & White image)
+
Brightness=0.3, contrast=-0.3, saturation=0
+
Brightness=0.4, contrast=-0.7, saturation=0
+
Brightness=0.4, contrast=-0.7, saturation=-1
+
Brightness=0, contrast=0, saturation=1
During development and optimization it can be very handy to have the + actual time it took to generate the image as a footnote. The following + example shows the usage of this feature
+To enable this feature you can proceed in two ways.
+
+ $gJpgBrandTiming=true;
+
in the beginning of the script.
+If you like you might also change the way the timing is formatted by + setting the string defined by BRAND_TIMING_FORMAT (in jpgraph.php). + This string represents a standard printf() format string.
JpGraph has built-in support for over 200 country flags, i.e. they + are available to be used in graphs without any external image + definitions.
+Country flags can be used in primarily two settings
+In order to make it easy to find the appropriate country flags they + can be specified with either full or partial name or as an numeric + index. The routines in JpGraph are "smart" enough to figure out which + way you are trying to specify a particular flag.
+To specify a country flag as a marker you have to specify the + special mark type as one of MARK_FLAG1,MARK_FLAG2,MARK_FLAG3 or + MARK_FLAG4
+Flags are internally stored in 4 different sizes which is indicated + by the number in the mark types. Flags may also be arbitrary scaled + when displayed. Since this is partially overlapping functionality you + might very well ask why the flags are stored in four different basic + sizes. The reason is of course performance. It you only want a very + small flag it takes processing time to scale down a large image to, + say, a small icon size. At the same time for large flags to be used as + background a small original flag might not have enough details to be + scaled up to a large size. Hence the reason for storing the flags in 4 + different sizes.
+The example below shows how to use country flags as markers
+To use country flags as background one has to use the method + Graph::SetBackgroundCountryFlag(). With this method you can specify + both how much of the image should be filled as well as how much of the + flag should be mixed into the background.
+To see a list of all supported country flags you can run the script + "listallcountryflags.php" in the Example directory. This will show you + a table with all flags.
+In addition to the standard background image you can also add an + arbitrary number of icons onto the background of the graph. These icons + are created with a call to the special Plot class IconPlot.
+The image from icons are taken from a file or as one of the builtin + country flags.
+You may control how much of the icon should be blended into the + background by specifying a percentage (1-100). The example below shows + how to mix in the picture of "Tux" into the background of a filled line + graph. Note: This example uses alpha blending and will therefore + require GD2.
+To specify any of the roughly 200 country flags as an icon you first + create an empty Icon and then call the IconPlot::SetCountryFlag() with + the appropriate parameters. (See the class reference). This is + illustrated below by adding the Icelandic flag into the background as + an icon
+In order to create a canvas graph you need to include the file + "jpgraph_canvas.php" in addition to the standard "jpgraph.php" file. + You might also want to include the "jpgraph_canvtools.php" to get + access to some supporting classes that may (or not) come in handy.
+Creating a canvas gives you the opportunity draw arbitrary shapes on + a "white" piece of paper. Let's first show a simple example were we + just draw a text box. We first show you the code which we will walk + through
<?php
+
+// $Id: canvasex01.php,v 1.3 2002/10/23 08:17:23 aditus Exp $
+
include
+"../jpgraph.php";
+
include "../jpgraph_canvas.php";
+
+
// Setup a basic canvas we can work
+
$g = new CanvasGraph(
+400,300,'auto'
+);
+
$g->SetMargin(
+5,11,6
+,11);
+
$g->SetShadow();
+
$g->SetMarginColor(
+"teal");
+
+
+// We need to stroke the plotarea and margin before we add the
+
// text since we otherwise would overwrite the text.
+
$g->InitFrame();
+
+
// Draw a text box in the middle
+
$txt="This\nis\na TEXT!!!";
+
$t = new Text(
+$txt,200,10
+);
+
$t->SetFont(
+FF_ARIAL,
+FS_BOLD,40);
+
+
+// How should the text box interpret the coordinates?
+
$t->Align(
+'center','top');
+
+
// How should the paragraph be aligned?
+
$t->ParagraphAlign(
+'center');
+
+
+// Add a box around the text, white fill, black border and gray shadow
+
$t->SetBox(
+"white",
+"black","gray");
+
+
// Stroke the text
+
$t->Stroke(
+$g->img);
+
+
// Stroke the graph
+
$g->Stroke();
+
+
?>
+
+
The example above starts by creating a (400x200) sized image. We set + the margins to get a nice frame around the image. For canvases the + margins has no effect in the way you enter coordinates. Top left is + (0,0) and bottom right (including any potential margin and shadow) is + the maximum. In this case the coordinates are X:0-399, and Y:0-199
+We then call the + InitFrame() method which actually strokes the margin and plotarea + to the graph. Since everything is stroked in the order you issue the + commands you must make sure that the graphical objects you want on top + is stroked last. This is different from the way you normally work with + JpGraph since it queues up all you addition and then makes sure they + are stroked in the correct order.
+We then create a Text object, + setup it's properties, including the absolute screen position where we + want the text, and then stroke it. Her it might be a need for a closer + explanation of the, perhaps misnamed, method +Text::Align() This method states how the text coordinates + should be interpreted , i.e when we specify (200,10) as the + coordinates for the text paragraph should that be interpreted as the + top left corner, bottom-left corner or something else (of the bounding + box)? In the code above we have chosen to interpret the X-coordinate as + being the center of the bounding box and the Y-coordinate as the top. + Hence the text will be aligned so that the (200,100) point in the graph + is aligned with the middle of the top line of the paragraphs bounding + box.
+We also specify that the lines within the paragraph should be + centered with a call to + Text::ParagraphAlign() Since we also choose to have a box around + the text we have to make use of the method + Text::SetBox() which is used to specify the fill color, the border + color and the shadow color (if you leave out shadow color or set it to + '', no shadow will be used).
+Now we are ready to stroke the text onto the canvas. In order to do + so we must specify the basic Image drawing class we want to use. + Without discussing this further we just state that a suitable image + class can always be found as the img property of the + Graph class.
+Finally we are ready to stroke the entire graph, which in effect + sends the canvas back to the browser. Below you can see the effect of + all this code
+ + +A canvas also makes a good background for using standard graphic + primitives, for example circles and lines. What you first have to + remember is that you are (so far) working with absolute screen + coordinates and secondly all drawing primitives are found in the + Image Class accessible as a property of the Graph class. So for + example to draw a line between coordinate (0,0) and (100,100) you would + have to add the line
+ $graph->img->
+Line(0,0
+,100,100);
+
To your code. The following example shows some of the graphic + primitives you have access to in the Image class
<?php
+
+// $Id: canvasex02.php,v 1.1 2002/08/27 20:08:57 aditus Exp $
+
include
+"../jpgraph.php";
+
include "../jpgraph_canvas.php";
+
+
// Setup a basic canvas we can work
+
$g = new CanvasGraph(
+400,200,'auto'
+);
+
$g->SetMargin(
+5,11,6
+,11);
+
$g->SetShadow();
+
$g->SetMarginColor(
+"teal");
+
+
+// We need to stroke the plotarea and margin before we add the
+
// text since we otherwise would overwrite the text.
+
$g->InitFrame();
+
+
// Add a black line
+
$g->img->
+SetColor(
+'black');
+
$g->img->
+Line(0,0
+,100,100);
+
+
// .. and a circle (x,y,diameter)
+
$g->img->
+Circle(100,100
+,50);
+
+
+// .. and a filled circle (x,y,diameter)
+
$g->img->
+SetColor('red');
+
$g->img->
+FilledCircle(
+200,100,50
+);
+
+
// .. add a rectangle
+
$g->img->
+SetColor(
+'green');
+
$g->img->
+FilledRectangle(
+10,10,50
+,50);
+
+
// .. add a filled rounded rectangle
+
$g->img->
+SetColor(
+'green');
+
$g->img->
+FilledRoundedRectangle(
+300,30,350
+,80,10);
+
// .. with a darker border
+
$g->img->
+SetColor(
+'darkgreen');
+
$g->img->
+RoundedRectangle(
+300,30,350
+,80,10);
+
+
// Stroke the graph
+
$g->Stroke();
+
+
?>
+
+
Pleas note the way to access these routines through the img property + of the Graph class. Please also keep in mind that the coordinates are + absolute.
+ + + +A note on GD For those of you using GD 1.xx you + might notice that the large "filled circle" isn't completely filled. + This is because in GD 1.xx there are no low level primitives to fill an + ellipse or circle so JpGraph tries to make the best out of a bad + situation and manually fake a filled circle. For interest of speed + JpGraph does not contain a complete (for example) Bresenham-circle fill + but cheats by using some existing GD routines. This is not a perfect + solution and for large filled circles like this you get some + moire-patterns in the circle. If you upgrade to GD 2.x JpGraph will be + able to make full use of those new existing methods and the fill will + be perfect.
+ +We refer you to the class reference to find out what other graphic + primitives are available for use.
+Time to show you an example of a Gantt chart and how easy it is to + make one. Lets make it the simplest possible Gantt chart. One activity, + named "Project", which lasts from "2001-11-01" to "2002-02-20".
+All it takes to do this (using default values for everything) is the + following code.
<?php
+
include (
+"../jpgraph.php");
+
include ("../jpgraph_gantt.php");
+
+
// A new graph with automatic size
+
$graph
+= new GanttGraph
+(0,0,
+"auto");
+
+
// A new activity on row '0'
+
$activity
+= new GanttBar
+(0,"Project",
+"2001-12-21",
+"2002-01-20");
+
$graph->Add(
+$activity);
+
+
// Display the Gantt chart
+
$graph->Stroke();
+
?>
+
The resulting image is shown in Figure + + below.
Let's note a few things with the above image and code:
+So, lets start making this graph a little bit more interesting. + First we are going to add a title, then we will add a month scale and + finally we will change the color of the bar.
+All that is taken care of in the code below.
<?php
+
include (
+"../jpgraph.php");
+
include ("../jpgraph_gantt.php");
+
+
$graph
+= new GanttGraph
+(0,0,
+"auto");
+
$graph->SetShadow();
+
+
// Add title and subtitle
+
$graph->title->
+Set(
+"A nice main title");
+
$graph->title->
+SetFont(
+FF_ARIAL,
+FS_BOLD,12);
+
$graph->subtitle->
+Set(
+"(Draft version)");
+
+
// Show day, week and month scale
+
$graph->ShowHeaders(
+GANTT_HDAY |
+GANTT_HWEEK |
+GANTT_HMONTH);
+
+
+// Instead of week number show the date for the first day in the week
+
// on the week scale
+
$graph->scale->
+week->SetStyle(WEEKSTYLE_FIRSTDAY);
+
+
+// Make the week scale font smaller than the default
+
$graph->scale->
+week->SetFont(FF_FONT0
+);
+
+
+// Use the short name of the month together with a 2 digit year
+
// on the month scale
+
$graph->scale->
+month->
+SetStyle(
+MONTHSTYLE_SHORTNAMEYEAR2);
+
+
+// Format the bar for the first activity
+
// ($row,$title,$startdate,$enddate)
+
$activity
+= new GanttBar
+(0,"Project",
+"2001-12-21",
+"2002-01-20");
+
+
+// Yellow diagonal line pattern on a red background
+
$activity
+->SetPattern(BAND_RDIAG,
+"yellow");
+
$activity
+->SetFillColor
+("red");
+
+
// Finally add the bar to the graph
+
$graph->Add(
+$activity);
+
+
// ... and display it
+
$graph->Stroke();
+
?>
+
From the above example you might note a few things
+To show that this is really simple let's show the full year in the + month, and set the header style to be white text on a dark blue + background by adding the lines
+
+// Use the short name of the month together with a 4 digit year
+
// on the month scale
+
$graph->scale->
+month->
+SetStyle(
+MONTHSTYLE_SHORTNAMEYEAR4);
+
$graph->scale->
+month->
+SetTextColor(
+"white");
+
$graph->scale->
+month->
+SetBackgroundColor(
+"blue");
+
to the code above. The resulting image is shown in Figure 145
+ +A Gantt chart is made up of four distinct areas.
+Since a Gantt chart inherits all the usual properties of a JpGraph + Graph() you have the access to the same method to formatting the image + as before. For example to have a shadow around the image you call + Graph::SetShadow() and to set the margin color you can use + Graph::SetMarginColor(). Please refer to the reference documentation + for a full list of supported features.
+To create a Gantt chart you add objects to it. As + of this writing you may add the following object by the use of the + GanttChart::Add() method
+All these objects may be extensively modified in terms of + formatting. You can specify color (both fill- and frame color), size, + titles, style and patterns and so on. All these objects comes with (in + my mind) sensible default so you don't have to specify a lot of + parameters. But if you need a fine grain control or if you disagree + with my taste you can.
+The previous method using absolute coordinates works. But nothing + more. It doesn't give you any chance to easily scale the image (unless + you manually recalculate all used coordinates) , it gets tedious to + work with pixel level resolution. Especially if you just like to draw a + few basic shapes.
+To help with this you can use a scale for the canvas. This lets you + define a "work-space" of your choice. You can for example set the + coordinates to be between X:0-10, Y:0-10. This makes it easier to + position objects on the canvas. This also has two additional + advantages:
+To use this type of scaling you must make sure you include the file + "jpgraph_canvtools.php" . In addition to the scaling class their are + also a couple of other utility classes that may come in handy, + especially the Shape class.
+Using the scale is quite simple. You first instantiate a scale + object passing the graph as a parameter and then specify the scale you + want to use. This means you need to add the lines
$scale
+= new CanvasScale
+($g);
+
$scale->Set(
+0,$xmax,0
+,$ymax);
to your code. You can then use one of the translation methods (for + example +CanvasScale::Translate()) in the canvas scale class to translate + between your world coordinates and the absolute screen coordinates. + This means you could take the code in the example above and just add + the lines, for example,
+ list(
+$x1,$y1) = $this
+->scale->Translate(
+$x1,$y1);
+
list($x2,$y2) =
+$this->scale->Translate
+($x2,$y2);
+
$g->img->
+Line($x1,$y1
+,$x2,$y2);
+
Since this pattern has to be repeated for every object that has to + be drawn it makes good sense to encapsulate this in a separate class. + This is exactly why the canvas tools file also have a utility class + called Shape This class is + mainly a wrapper around the most commonly used methods in the basic + Image class (with one important exception) and does all these the + translation for you. Please see the class reference for a complete list + of the available methods To set up the Shape class you instantiate it + with the graphic context and the scale you want to use as argument as + in
+
+ $shape = new
+Shape($g,$scale
+);
You are then ready to use all the methods in the shape class. Using + a scale and imitating the previous example we would get the source + shown below.
<?php
+
+// $Id: canvasex03.php,v 1.1 2002/08/27 20:08:57 aditus Exp $
+
include
+"../jpgraph.php";
+
include "../jpgraph_canvas.php";
+
include "../jpgraph_canvtools.php";
+
+
// Define work space
+
$xmax=20;
+
$ymax=20;
+
+
// Setup a basic canvas we can work
+
$g = new CanvasGraph(
+400,200,'auto'
+);
+
$g->SetMargin(
+5,11,6
+,11);
+
$g->SetShadow();
+
$g->SetMarginColor(
+"teal");
+
+
+// We need to stroke the plotarea and margin before we add the
+
// text since we otherwise would overwrite the text.
+
$g->InitFrame();
+
+
// Create a new scale
+
$scale
+= new CanvasScale
+($g);
+
$scale->Set(
+0,$xmax,0
+,$ymax);
+
+
+// The shape class is wrapper around the Imgae class which translates
+
// the coordinates for us
+
$shape
+= new Shape($g,
+$scale);
+
$shape->SetColor(
+'black');
+
+
+
// Add a black line
+
$shape->SetColor(
+'black');
+
$shape->Line(
+0,0,20
+,20);
+
+
// .. and a circle (x,y,diameter)
+
$shape->Circle(
+5,14,2
+);
+
+
+// .. and a filled circle (x,y,diameter)
+
$shape->SetColor(
+'red');
+
$shape->FilledCircle(
+11,8,3
+);
+
+
// .. add a rectangle
+
$shape->SetColor(
+'green');
+
$shape->FilledRectangle(15,
+8,19,14
+);
+
+
// .. add a filled rounded rectangle
+
$shape->SetColor(
+'green');
+
$shape->FilledRoundedRectangle(2,
+3,8,6
+);
+
// .. with a darker border
+
$shape->SetColor(
+'darkgreen');
+
$shape->RoundedRectangle(2,
+3,8,6
+);
+
+
+
// Stroke the graph
+
$g->Stroke();
+
+
?>
+
+
If we like to make a smaller image we could just change the image + size and everything will be rescaled without any further code changes. + SO for example making the image half the size would give the result
If we instead wanted to keep the image size but shrink the shapes we + could just make the scale twice as large which would result in
+ +We previously mentioned that the Shape class was a wrapper around + the image class with one exception. So what is the exception? Well, + glad you asked. The exception is that it contain an additional method + which draws an "indented rectangle". An indented rectangle is a + rectangle where one of it's four corners have been moved into the + rectangle. You create an indented rectangle by calling either + Shape::IndentedRectangle() or A few examples illustrates what this + shape looks like.
+ +As a final note we mention the class + CanvasRectangleText Which can be used to add a text with a rounded + rectangle (possibly filled) onto the canvas. The previous example where + all the available fonts were drawn were using this class. We don't + describe it further but refer the interested reader to the class + reference and the 'listfontsex1.php' example file.
+You create a new Gantt Chart with a call to GanttChart(). The + signature for GanttGraph is the same as for ordinary JpGraph graphs, + i.e
+ function
+GanttGraph(
+$aWidth,
+$aHeight,
+$aCachedName,
+$aTimeOut,
+$aInline)
+
The only real difference is that for GanttCharts you can specify one + or both of the dimension parameters (width and height) as -1 in which + case that dimension will be automatically sized determined by scale and + fonts chosen. The following examples shows some possible ways of + creating a new graph
+Since GanttGraph() inherits all the methods (that make sense for + GanttGraph) from Graph you can specify shadow, color etc of the general + frame.
+As a final example we shortly discuss how the canvas type of graph + was used to generate the DB schema for the DDDA architecture.
+The library php file "utils/misc/imgdbschema.php" included in the + distribution contains some utility classes to make the drawing of table + schemes easier. It contains two basic classes, Class ImgDBTable and + Class ImgDBSchema. The first class understand how to draw an image + illustrating a single table. The second class is responsible for + automatically extract all the relevant information from a DB to draw a + complete DB Schema.
+Before going into this a little bit more we show what an example of + this might look like.
Before going on it should be noted that the ImgDBSchema assumes that + the DB can be accessed through a DB abstraction layer modeled after the + abstraction layer available in the 'jpdb.php' file in the DDDA + architecture. This abstraction layer assumes a MySQL database in the + bottom. This specific dependency of this particular abstraction layer + is the reason why these classes is not included in the generic canvas + tools file.
+The second thing to note is that this library does not contain a + complete automatic-layout engine but rather a very simple automatic + system which, if nothing else is specified, just puts the table in a + rectangular grid. A complete graph layout engine would simple be to + much to write in this context. This is also a very difficult + optimization problem and sofar not even any of the available research + programs that tries this can achieve a satisfactory layout without + manual intervention.
+The critical lines in the code to generate the above graph is
$tblposadj=array($tlo
+,0,$tblwidth+
+$tlo+2,0
+,2*$tblwidth+
+$tlo+4,0
+,-1,16,-
+1,16);
+
$dbschema
+= new ImgDBSchema
+("jpgraph_doc"
+,"FormatTblName"
+,"FormatFldName"
+);
+
$dbschema
+->SetMargin($leftm,
+$topm);
+
$dbschema
+->SetTableWidth
+($tblwidth);
+
$dbschema
+->Stroke($this->
+img,$this->iscale
+,$tblposadj);
The rest of the code in the file is just to setup the canvas, add an + indented rectangle to group some tables and generate a footer with the + date and time this image was generated.
+The first line instantiates a new ImgDBSCheme layout engine asking + it to draw an image for the database 'jpgraph_doc'. The following two + arguments specify two callback functions for formatting the text for + header and each field in a table.
+The next line specify the top left margin where the drawing of the + tables should be started.
+The third line specify the width of a single table. The final lines + starts the engine and draws all tables in the database to the canvas. + The final argument requires some further explanation. This is an offset + (x,y) from the top left corner how each individual table should be + positioned. If the value is -1 indicates that the default value should + be used. If this array is not specified then the tables will simple + arranged line by line.
+The full source code for drawing this DB schema example is shown + below.
+ <?php
+
+/*=======================================================================
+
// File: DBSCHEMAEX1.PHP
+
// Description: Draw a DB schema of the DDDA architecture
+
// Created: 2002-08-25
+
// Author: Johan Persson (johanp@aditus.nu)
+
+// Ver: $Id: dbschemaex1.php,v 1.1 2002/08/27 20:08:57 aditus Exp $
+
//
+
// License: This code is released under QPL
+
// Copyright (C) 2001,2002 Johan Persson
+
+// Note: The actual drawing of the tables are semi-automatically
+
+// but you can easily adjust the individual tables position
+
// with the 'tblposadj' array.
+
//
+
+//========================================================================
+
*/
+
include
+"../jpgraph.php";
+
include "../jpgraph_canvas.php";
+
include "../jpgraph_canvtools.php";
+
include "../utils/misc/imgdbschema.inc";
+
include "../utils/jpdocgen/jpdb.php";
+
+
+
+// Global callback to format the table header names
+
function
+FormatTblName(
+$aName) {
+
+// We want to replace any specifi references to the
+
// 'JpGraph' project with the generic '<project>'
+
return
+str_replace(
+'JpGraph',
+'<project>',
+$aName);
+
}
+
+
+// Global callback to format each field name in the table
+
function
+FormatFldName(
+$aName,$aTable) {
+
return $aName
+;
+
}
+
+
+
class Driver
+{
+
+
var $ig
+, $img, $iscale,
+$ishape;
+
var $iymax
+,$ixmax;
+
var $iwidth
+,$iheight;
+
+
function Driver
+() {
+
+
+// Define Image size and coordinate grid space to work within
+
$this
+->iwidth = 600;
+
$this
+->iheight= 750;
+
$this
+->iymax = 50;
+
$this
+->ixmax = 55;
+
+
// Setup a basic canvas
+
$this
+->ig = new CanvasGraph(
+$this->iwidth,$this
+->iheight,'auto');
+
$this
+->img = $this->
+ig->img;
+
+
// Define the scale to be used
+
$this
+->iscale
+= new CanvasScale
+($this->ig);
+
$this
+->iscale->Set(
+0,$this->ixmax
+,0,$this->
+iymax);
+
$this
+->ishape
+= new Shape($this->
+ig,$this->iscale
+);
+
+
// A small frame around the canvas
+
$this
+->ig->SetMargin(
+2,3,2
+,3);
+
$this
+->ig->SetMarginColor(
+"teal");
+
$this
+->ig->InitFrame();
+
+
}
+
+
function Run
+() {
+
+
$leftm
+=1.5; // Left margin (for table schemes)
+
$topm=5;
+// Top margin (for table schemes)
+
$tblwidth
+=15; // Individual table width
+
$tlo=1;
+// Offset for top line
+
+
// Add the background color for the project specific tables
+
$this
+->ishape->IndentedRectangle($leftm,
+$topm-1,3
+*$tblwidth+$tlo+
+6,45,
+
$tlo
++2*$tblwidth+
+2,30,CORNER_BOTTOMLEFT,
+
'lightblue');
+
+
+// Stroke the tables (series of x,y offsets, If =-1 then use the
+
// automtic positioning
+
$tblposadj
+=array($tlo,0,
+$tblwidth+$tlo+2
+,0,2*
+$tblwidth+$tlo+4
+,
+
0
+,-1,16,-
+1,16);
+
$dbschema
+= new ImgDBSchema
+('jpgraph_doc'
+,'FormatTblName'
+,'FormatFldName'
+);
+
$dbschema
+->SetMargin($leftm,
+$topm);
+
$dbschema
+->SetTableWidth
+($tblwidth);
+
$dbschema
+->Stroke($this->
+img,$this->iscale
+,$tblposadj);
+
+
$tt
+= new CanvasRectangleText
+();
+
$tt->SetFillColor(
+'');
+
$tt->SetColor(
+'');
+
$tt->SetFontColor(
+'navy');
+
+
// Add explanation
+
$tt->SetFont(
+FF_ARIAL,
+FS_NORMAL,12);
+
$tt->Set(
+'Project specific tables',
+$tblwidth+
+$leftm+3,16
+,15);
+
$tt->Stroke(
+$this->img,$this
+->iscale);
+
+
// Add title
+
$tt->SetColor(
+'');
+
$tt->SetFont(
+FF_VERDANA,
+FS_BOLD,26);
+
$tt->Set(
+'DDDA - DB Schema',
+9,0.5,30
+);
+
$tt->Stroke(
+$this->img,$this
+->iscale);
+
+
// Add a version and date
+
$tt->SetFillColor(
+'yellow');
+
$tt->SetFont(
+FF_FONT1,
+FS_NORMAL,10);
+
$tt->Set(
+"Generated: ".
+date("ymd H:i",time
+()),1,$this->
+iymax*0.96,15
+);
+
$tt->Stroke(
+$this->img,$this
+->iscale);
+
+
$this
+->ig->Stroke();
+
}
+
}
+
+
$driver
+= new Driver
+();
+
$driver->Run();
+
+
?>
+
+
Bars and Milestones need both a vertical position and a horizontal + position. The horizontal start position is specified as a date, e.g. + "2001-06-23", and the vertical positions are specified as a number + [0,1,2,3,...]. This vertical number indicates the position from the top + where the object should be placed. To understand this you might imagine + a number of "invisible" horizontal bands with a certain height. If you + specify 0 as the vertical position the bar will be placed in the first + band, specify 3 and the bar will be placed in the fourth band and so + on.
+It is perfectly legal, and perhaps even desirable to leave "gaps" + when laying out bands to group related activities. So, for example you + could have three activities/bars at positions 1,2,3 and then another 2 + bars at position 6,7 leaving band 0,4,5 empty.
+All these "invisible bands" have the same height (equ-spaced). The + height of each band is automatically determined and depends on both the + method of layout ( as specified by (GanttChart::SetLayout()) and the + individual heights of the individual bars and titles. The rules are + quite simple:
+As described above vertical positions are specified as a numeric + value [0..n] where 'n' is an arbitrary constant. (For practical + purposes n is most likely < 100)
+Using our previous example we will illustrate this parameter by + changing the position of our 'Project' activity to position 7. Therefor + we change the call to GanttBar() to
+ $activity = new GanttBar(
+7,"Project","2001-12-21"
+,"2002-02-20"
+);
and we then get the chart as shown below in Figure 146.
+ +Note that the height of each position (vertical position) will + depend on the actual height of the bar.
+Start of bars are given as a date string. The format depends on the + current locale. Examples of valid date strings are
+Even if several format are supported it is recommended to use all + numeric dates, i.e in the form "2001-10-22".
+Specifying the end position may be done in two different ways, + either by the end date in the same way as for the start date. The other + way is to specify the length of the activity in number of days + (and fractions thereof). Examples of valid end dates are:
+Please note that duration is specified as numerical values and + not strings.
+Milestones are similar to bars but have no end date since milestones + just apply to one single date. Milestones are created much the same way + as activities but using method MileStone() instead.
+The full signature for milestones are
+function MileStone
+($aVPos,$aTitle,
+$aDate,
+$aCaption)
+
+
+ $aVPos
+ | The vertical position for the + bar, [0..n] | |
+
+ $aTitle
+ | Title for the activity | |
+
+ $aDate
+ | Date for the milestone | |
+
+ $aCaption
+ | Text to the right of the + milestone |
Valid milestones are for example
+
+ $milestone = new
+MileStone(3,"Code complete","2001-12-01"
+);
+ $milestone = new
+MileStone(3,"Code complete","2001-12-01"
+,"(2001-12-01)"
+);
By default milestones are rendered as a filled "Diamond" shape. This + may be optionally modified. The actual shape is specified by the 'mark' + property of milestone which is an instance of the PlotMark() class + (same class responsible for the marks in line graphs).
+To change the shape of a milestone to, say a triangle, you use the + SetType() method as in
+ $milestone->mark->
+SetType(
+MARK_DTRIANGLE)
+
Let's put this into practice and add a milestone to our previous + example by adding the following two lines of code which result in + Figure 147 shown below.
+ +You may note that by default the title color is red for milestones. + If you like to change this to be instead, say bold black, you would + invoke the SetColor() and SetFont() methods on the title property of + milestones as in
$milestone->
+title->SetFont(FF_FONT1
+,FF_BOLD);
+
$milestone
+->title->SetColor(
+"black");
+
and thew result would now (not surprisingly be)
+To modify the caption you do exactly the same but act on property + 'caption' instead of 'title', i.e.
+ $milestone->caption->
+SetFont(
+FF_FONT1,
+FF_BOLD);
+
$milestone
+->caption->SetColor(
+"black");
+
It is worth noting that you modify the bar title and caption the + exact same way by acting on the 'title' and 'caption' property for the + bars.
+The final object you may add to a Gantt chart is simple, but quite + useful, a straight vertical line extending over the whole plot height. + This could for example be used to illustrate different phases in a + project. You create a line object by a call to GanttVLine()
+The full signature for GanttVLine() is
+function GanttVLine
+($aDate,$aTitle,
+$aColor,
+$aWeight,
+$aStyle)
+
+
+ $aDate
+ | Date for the milestone | |
+
+ $aTitle
+ | Title for the line. The title is + displayed at the bottom of the line | |
+
+ $aColor
+ | Color for the line | |
+
+ $aWeight
+ | Line width | |
+
+ $aStyle
+ | Line style,"dashed", "dotted" and + so on |
Valid creations of lines are for example
+
+ $vline = new
+GanttVLine(
+"2001-12-24");
+
+ $vline = new
+GanttVLine(
+"2001-12-24",
+"Phase 1");
+
+ $vline = new
+GanttVLine(
+"2001-12-24",
+"Phase 1",
+"darkred");
+
+ $vline = new
+GanttVLine(
+"2001-12-24",
+"Phase 1",
+"darkred",5);
+ $vline = new
+GanttVLine(
+"2001-12-24",
+"Phase 1",
+"darkred",5,"dotted"
+);
To add the line to the graph you just have to call GanttGraph::Add() + as with milestones and bars. Let's illustrate the use of vertical lines + by adding a line to the previous example.
$vline
+= new GanttVLine
+("2001-12-24","Phase 1");
+
$graph->Add(
+$vline);
+
and the example (See 149) now becomes
+From the above figure you can see that by default the line is drawn + at the beginning of the day of the specified date and in a 'dashed' + style. This can (of course!) be modified so that the line is + drawn/aligned anywhere in the specified day. You modify this by + invoking the method SetDayOffset() with an argument specifying the + fraction of the day where you want the line positioned.
+If you, for example, want to display the line in the middle of the + day just add the line
+ $vline->SetDayOffset(
+0.5);
+
to the previous code and the result will be
+ +As usual you may modify the font, size and color by invoking the + appropriate method (SetFont(), SetColor()) on the 'title' property of + lines.
+You can easily add a variety of markers both to the start and end of + the gantt bar. They could for example be used as an alternate way to + illustrate important milestones or anticipated deliveries.
+The left and right markers are accessed through the two properties + 'leftMark' and 'rightMark'. They are both instances of the general + 'PlotMark' class which is also used for the milestones (and in line + graphs). The 'PlotMark' class supports several different styles, for + example, diamond (the default for milestones), filled and unfilled + circles, squares, stares, and so on. Please refer to the reference + section for a complete listing.
+Let's illustrate this by adding a right marker to the previous + example. We will use a style of a filled (red) circle with a white + title, say, "M5". In order to accomplish this we must augment the + previous example with the following lines:
$activity
+->rightMark->Show();
+
$activity
+->rightMark->title->
+Set("M5");
+
$activity
+->rightMark->SetType(
+MARK_FILLEDCIRCLE);
+
$activity
+->rightMark->SetWidth(
+10);
+
$activity
+->rightMark->SetColor(
+"red");
+
$activity
+->rightMark->SetFillColor(
+"red");
+
$activity
+->rightMark->title->
+SetFont(
+FF_ARIAL,
+FS_BOLD,12);
+
$activity
+->rightMark->title->
+SetColor(
+"white");
+
This might seem like a lot of lines but this is as complicated as it + possible can get. As an illustration in the example belwo more or less + everything that is changeable has been changed, the default font, + font-color, fill-color, frame-color and width of marker. The two lines + only really necessary are the first two, showing the mark and setting a + title. One could still get a good result by using default values for + the rest of the properties.
+The resulting image can be seen in Figure 151 below.
+We have deliberately introduced a "strangeness" here. If the + previous two examples are compared it can bee seen that the last + example is larger than the previous one. Why?
+The explanation is trivial once we recall that the height of bars + are sized relative to the horizontal spacing. The horizontal spacing + are based on the highest single bar including title size and, here come + the explanation, marker size. The horizontal spacing has grown since + the minimum height is now based on 10 points(=the height of the mark). + The bar still occupy the same percentage of the height so it seems to + have grown.
+If this behavior is unwanted it is always possible to specify an + absolute size for the bar heigh, say 8 pixels, with a call
$activity->SetHeight
+(8);
and achieve the result in Figure 152 below.
+It is worth noting that the height reserved for each bar is still + the same since we haven't changed the height of the marker and the + reserved space is the maximum height used by any bar.
+Let's see what happens if we set the height of each bar to be 100% + of the reserved height by adding another activity/bar below the first + one and set the height of each bar to 100% by adding the lines (We omit + the added lines to add another bar since they are just a copy of the + first bar)
+ $activity->
+SetHeight(1.0);
+
$activity2
+->SetHeight(1.0);
+
to the previous example. (Note that a value in the range [0..1] is + interpretated as the fraction of the reserved height while a value > 1 + is interpretated as the absolute size in pixels.)
+Aha.. What we are trying to do doesn't really make sense. Since we + have specified that the bar will always occupy 100% of the available + reserved with there will be no distance between the bars. So what if we + specify the bar as 10 pixel absolute by changing the lines to
$activity->SetHeight
+(10);
+
$activity2
+->SetHeight(10);
+
we instead get
+So what can we actually do? Well if you remember the reserved height + for each bar is the maximum height of all bars including titles. This + guarantees that no two bars will ever overlap. To guarantee that titles + don't end up too close together there is a Vertical Label Margin + which basically specifies some extra "air" in between the titles. The + amount of air is specified in percent of the title height. To set the + margin you use
+ GanttGraph::
+SetLabelVMarginFactor(
+$aMargin)
+
As an example let's set that margin in the previous example to 0 and + see what happens.
+As you would perhaps expect the two bars just barely touches now + since there are no extra margin added. If the two bars hadn't had the + extra right marker it would have looked very compressed.
+By default the vertical margin is set to 40%.
+The most common of all object in a Gantt chart is of course the + activity bar (GanttBar()). In terms of formatting this object has a + very large flexibility. The full signature for the GanttBar constructor + is
+ function
+GanttBar(
+$aVPos,$aTitle,$aStart
+,$aEnd,$aCaption,
+$aHeight)
+
+
+ $aVPos
+ | The vertical position for the + bar, [0..n] | |
+
+ $aTitle
+ | Title for the activity | |
+
+ $aStart
+ | Start date for the activity given + as string, e.g "2001-09-22" | |
+
+ $aEnd
+ | End date for activity given as either + a date (a string) or as the duration (in days) of the activity, e.g + both "2001-10-15" and 20.5 are valid inputs | |
+
+ $aCaption
+ | Text string (caption) to appear + at the end (right side) of the bar | |
+
+ $aHeight
+ | Height of bar given as either + a value in range [0,1] in which case this is interpretated as what + fraction of the vertical position should the bar occupy. The height can + also be given in absolute pixels [1..200] |
Minute scale is the lowest resolution you can use. It is often + convenient to use Minute scale with "GanttScale::SetINtervall()" since + by default the increment will be 1 minute. The style of minute scale + can be further adjusted by the use style parameters which can be + one of
+Minute scale is enabled by adding the GANTT_HMIN in the + GanttGraph::ShowHeaders() call. For example as in
$graph
+->ShowHeaders(GANTT_HDAY |
+GANTT_HHOUR |
+GANTT_HMIN);
+
The code snippet below shows how to set up a minute scale with 30 + min interval and some custom colors.
+ $graph->scale->
+minute->
+SetIntervall(
+30);
+
$graph->scale->
+minute->
+SetBackgroundColor(
+'lightyellow:1.5');
+
$graph->scale->
+minute->
+SetFont(
+FF_FONT0);
+
$graph->scale->
+minute->
+SetStyle(
+MINUTESTYLE_MM);
+
$graph->scale->
+minute->grid->SetColor
+('lightgray');
The hour scale has more builtin formatting possibilities. The + following formatting options are available
+For hours it is possible to specify the interval in either of two + ways. With an integer, e.g. 6, or as time interval, e.g. "1:30" which + makes the interval one and a half hour. The only restriction is that + the interval must be even dividable for 24 hours since one day is the + smallest possible interval to show. This means that it is allowed to + use, for example 2,4,6,"1:30" or "0:45" as intervals but not 7, "2:45".
+The code snippet below shows hot to set up a hour scale to with 45 + minutes interval and some custom colors
$graph
+->scale->hour->
+SetBackgroundColor(
+'lightyellow:1.5');
+
$graph->scale->
+hour->SetFont(FF_FONT1
+);
+
$graph->scale->
+hour->SetStyle(HOURSTYLE_HMAMPM);
+
$graph->scale->
+hour->
+SetIntervall(
+"0:45");
+
The example below shows a gantt chart with the day and hour scale + enabled
+ +By default the day scale show the first letter of the week day but + it is also posible to format the day scale in a number of different + ways. Days can have one of the following scale formats.
+The formatting is specified by using the SetStyle() method as in
$graph
+->scale->day->
+SetStyle(
+DAYSTYLE_LONG);
+
The graphical formatting possibilities for days allow the + possibility to specify a different color for the weekend background and + also for the Sunday.
+
+ SetWeekendColor()
+
Set the background color for weekends. (Defaults to light gray)
+
+ SetSundayFontColor()
+
The Sunday font color. (Defaults to red)
+In addition to this there is also a possibility to choose whether or + not the weekend background should be extended vertically down over the + plot area. (the default). Since that is a property more of the whole + plot this behavior is modified with a call to the method
UseWeekendBackground()
of the scale, e.g.
+
+ $graph->scale->UseWeekendBackground(false
+);
Week scales, if enabled, by default shows the week number in range 1 + to 53 (as defined by ISO-8601, see the reference section).
+It might be worth pointing out here that the week number calculation + is carried out within JpGraph and does not rely on the underlying OS + date libraries. This makes the behavior consistent over several OS:s + (at least M$ Windows does not comply to ISO-8601 or supply any + way of doing this through the normal libraries, e.g. strftime())
+You may modify the week behavior in three ways. You can specify + (with SetStyle()) a different date format using the constants
+
+ WEEKSTYLE_WNBR
Show week number To further modify the formatting of the actual week + number you can optionally supply a format string with a call to
SetLabelFormatString()
The format of the string should be a standard sprintf() syntax + expecting an integer (the week number). By default a 'W' is prefixed to + the number.
+
+ WEEKSTYLE_FIRSTDAY
Show date of first day in week.
+
+ WEEKSTYLE_FIRSTDAY2
Show date of first day in week and short month
+
+ WEEKSTYLE_FIRSTDAYWNBR
Show weeknumber of first day in week.
+
+ WEEKSTYLE_FIRSTDAY2WNBR
Show weeknumber of first day in week and month
+For month scale you can use the SetStyle() method to choose between + a variety of formats.
+
+ MONTHSTYLE_SHORTNAME
Display the month name in its locale specific short form, i.e Jan, + Feb etc
+
+ MONTHSTYLE_SHORTNAMEYEAR2
Display the month name in its locale specific short form together + with a 2 digit year , i.e Jan '01, Feb '01 etc
+
+ MONTHSTYLE_SHORTNAMEYEAR4
Display the month name in its locale specific short form together + with a 4 digit year , i.e Jan 2001, Feb 2001 etc
+
+ MONTHSTYLE_LONGNAME
Display the month name in its locale specific long name, i.e. + January, February
+
+ MONTHSTYLE_LONGNAMEYEAR2
Display the month name in its locale specific long name together with + a 2 digit year , i.e January '01, February '01 etc
+
+ MONTHSTYLE_LONGNAMEYEAR4
Display the month name in its locale specific long name together with + a 4 digit year , i.e January 2001, February 2001 etc
+
+ MONTHSTYLE_FIRSTLETTER
The first letter of the month name
+Year scale has no extra formatting possibilities.
+The scale headers allow you to view up to four different scales at + the same time. The four basic scales are:
+You can choose what scale to include and exclude by using the + SetScale() method. For example, for a detailed gantt you might choose + to display days and weeks by specifying
$graph
+->ShowHeaders
+( GANTT_HWEEK
+| GANTT_DAY );
If you instead wanted "the big picture" it might be enough to show + year and months by specifying
+ $graph->ShowHeaders(
+GANTT_YEAR |
+GANTT_MONTH );
+
You can choose freely the combination of scales that you want, but a + chart must at least have one scale of course.
+Once you have decided what level of details you need you can then + fine tune the exact layout/formatting of each of the enabled scales as + described below.
+These scale header are all accessed through the graph instance + variables 'scale' as in
+ $graph->scale->
+week
or
+ $graph->scale->day
. All these headers share the following properties.
+
+ Show()
+
Determine if the scale should be shown or not
+
+ SetFont()
+
Font for text in header
+
+ SetFontColor()
+
Specify the color of the header text
+
+ SetStyle()
+
Specify what date format should be used, for example in the week + scale it is possible to show either week number, the start date of the + week and so on.
+
+ SetBackgroundColor()
+
As it says, the background color for the header
+
+ SetFrameWeight()
+
The line weight of the box around the scale
+
+ SetFrameColor()
+
The line color for the frame
+
+ SetTitleVertMargin()
+
The margin, in percent, below and above the title text
+In addition to these methods each scale also has the property 'grid' + which determines the appearance of grid lines for that specific scale. + You may modify the appearance of grid lines by the "normal" line + methods, i.e. SetColor(),SetWeight() SetStyle() and Show(). So for + example to set the week grid line red you would use
$graph
+->scale->week->
+grid->SetColor("red"
+);
Each of the scales also have some specific formatting possibilities + as described below.
+Caption for bars are placed at the far right side of the bars. They + can for example be used to indicate the resources assigned to a task, + the duration of the task or the progress of the activity.
+Caption text for a bar is specified either when creating a bar or + later by accessing the 'caption' property of bars. So the two lines
$activity = new GanttBar
+(0,"Activity 1",
+"2001-11-21",
+"2001-12-20",
+"[BS,ER]")
+
and
+ $activity->
+caption->Set("[BS,ER]"
+);
are both ways of specifying the caption "[BS,ER]" for the activity. + Since activity is a standard JpGraph text object you can easily modify + font, color and size with calls to SetFont() and SetColor(), (e.g.
$activity->caption
+->SetFont(FF_ARIAL,
+FF_BOLD,9);
The figure below illustrates the use of caption
+ +To indicate the progress of a specific activity it is also possible + to add a progress indicator to each bar. This progress indicator + consists of a smaller bar within the bar. By default this progress bar + is black and 70% of the height of the bar. These parameter can (of + course) all be changed.
+The properties for the progress indicator are accessed through the + 'progress' property and it's methods.
+To set the progress for a specific activity you only specify the + percent as a fraction. As in
+ $activity->progress->
+Set(0.4)
In Figure 158 the previous example is modified to indicate the + progress of each activity by the default progress indicator. A solid + bar. To make it clearer we have also modified the caption to reflect + the displayed progress. (At the same time we also modified the scale + headers just to illustrate some more formatting options).
+To specify a different format for the progress you use the + SetPattern() method as in
+ $activity->progress->
+SetPattern(
+BAND_RDIAG,
+"blue");
+
In the reference section you can see the exact parameters and all + available methods.
+ +This section shows some further modification you might do to + activity bars.
+Canvas graphing is an advanced feature that comes in handy where you + need to draw some more arbitrary graphics. To give you a flavor of what + you can do the following example shows an architecture overview of + JpGraph which was drawn using a canvas.
+Working with canvas requires more understanding of JpGraph as well + as more programming and fine tuning.
+There are two basic alternatives on how to generate the content of + the anti-spam image
+In order to write a script to generate a new challenge there are + four steps to be completed.
+First include the library file jpgraph_antispam.php. + Note that there is no need to include the "jpgraph.php" library since + all functionality is included in this library file.
+require_once "jpgraph_antispam.php";
Secondly a new instance of the class AntiSpam must be + created
+ $spam = new
+AntiSpam();
+
Thirdly the string to be used in the challenge must be + specified. To automatically generate a suitable string use
+// The argument determines the length of the generated string
+
$chars = $spam->
+Rand(5);
If instead the string to be used should be specified this string + should be specified in the initial creation of the AntiSpam() or by + calling the Set() method as in
+ $spam->
+Set("aui8k");
Please note that in order to minimize the risk for confusion the + letters 'O' and the number '0' (zero) is not allowed since they are too + alike and can be mistaken for each other.
+The final and fourth step is to output the image with a call + the method Stroke() on the created instance of the AntiSpam + class.
+ if( $spam->Stroke
+() === false
+) {
+
die("Illegal or no data to plot");
+
}
Note that we have put a guard around the output since in the case of + an error this method will result a boolean false value. As with the + other graph types it is possible to write the generated image to a file + by submitting a file name as an argument to Stroke().
+Canvas graph is really not a graph. It a blank sheet of paper which + you can use to draw arbitrary shapes and still have access to some of + the convenient features of JpGraph.
+You can work with a canvas in different levels of complexity. You + can for example work directly with the Image class which provides a + large number of primitives for drawing but requires that you use + absolute pixel coordinates.
+You can also make life a little bit easier by using a canvas scale. + This lets you define your own scale on the canvas which often makes it + easier by letting you work on a grid you have specified yourself. It + also makes it very easy to re-scale you image automatically by just + changing your scale. For example to half the size of you drawing you + just make the scale twice as large.
+To give you some help in working with different canvas you should + include the "jpgraph_canvtools.php" file when working on canvases. This + is not strictly necessary but it will give you some nice abstraction to + help you create your masterpieces.
+As another (concrete) example on the use of a canvas the figure + below is a listing of font styles available with JpGraph.
+ +In order to create a canvas graph you need to include the file + "jpgraph_canvas.php" in addition to the standard "jpgraph.php" file. + You might also want to include the "jpgraph_canvtools.php" to get + access to some supporting classes that may (or not) come in handy.
+Creating a canvas gives you the opportunity draw arbitrary shapes on + a "white" piece of paper. Let's first show a simple example were we + just draw a text box. We first show you the code which we will walk + through
<?php
+
+// $Id: canvasex01.php,v 1.3 2002/10/23 08:17:23 aditus Exp $
+
include
+"../jpgraph.php";
+
include "../jpgraph_canvas.php";
+
+
// Setup a basic canvas we can work
+
$g = new CanvasGraph(
+400,300,'auto'
+);
+
$g->SetMargin(
+5,11,6
+,11);
+
$g->SetShadow();
+
$g->SetMarginColor(
+"teal");
+
+
+// We need to stroke the plotarea and margin before we add the
+
// text since we otherwise would overwrite the text.
+
$g->InitFrame();
+
+
// Draw a text box in the middle
+
$txt="This\nis\na TEXT!!!";
+
$t = new Text(
+$txt,200,10
+);
+
$t->SetFont(
+FF_ARIAL,
+FS_BOLD,40);
+
+
+// How should the text box interpret the coordinates?
+
$t->Align(
+'center','top');
+
+
// How should the paragraph be aligned?
+
$t->ParagraphAlign(
+'center');
+
+
+// Add a box around the text, white fill, black border and gray shadow
+
$t->SetBox(
+"white",
+"black","gray");
+
+
// Stroke the text
+
$t->Stroke(
+$g->img);
+
+
// Stroke the graph
+
$g->Stroke();
+
+
?>
+
+
The example above starts by creating a (400x200) sized image. We set + the margins to get a nice frame around the image. For canvases the + margins has no effect in the way you enter coordinates. Top left is + (0,0) and bottom right (including any potential margin and shadow) is + the maximum. In this case the coordinates are X:0-399, and Y:0-199
+We then call the + InitFrame() method which actually strokes the margin and plotarea + to the graph. Since everything is stroked in the order you issue the + commands you must make sure that the graphical objects you want on top + is stroked last. This is different from the way you normally work with + JpGraph since it queues up all you addition and then makes sure they + are stroked in the correct order.
+We then create a Text object, + setup it's properties, including the absolute screen position where we + want the text, and then stroke it. Her it might be a need for a closer + explanation of the, perhaps misnamed, method +Text::Align() This method states how the text coordinates + should be interpreted , i.e when we specify (200,10) as the + coordinates for the text paragraph should that be interpreted as the + top left corner, bottom-left corner or something else (of the bounding + box)? In the code above we have chosen to interpret the X-coordinate as + being the center of the bounding box and the Y-coordinate as the top. + Hence the text will be aligned so that the (200,100) point in the graph + is aligned with the middle of the top line of the paragraphs bounding + box.
+We also specify that the lines within the paragraph should be + centered with a call to + Text::ParagraphAlign() Since we also choose to have a box around + the text we have to make use of the method + Text::SetBox() which is used to specify the fill color, the border + color and the shadow color (if you leave out shadow color or set it to + '', no shadow will be used).
+Now we are ready to stroke the text onto the canvas. In order to do + so we must specify the basic Image drawing class we want to use. + Without discussing this further we just state that a suitable image + class can always be found as the img property of the + Graph class.
+Finally we are ready to stroke the entire graph, which in effect + sends the canvas back to the browser. Below you can see the effect of + all this code
+ + +A canvas also makes a good background for using standard graphic + primitives, for example circles and lines. What you first have to + remember is that you are (so far) working with absolute screen + coordinates and secondly all drawing primitives are found in the + Image Class accessible as a property of the Graph class. So for + example to draw a line between coordinate (0,0) and (100,100) you would + have to add the line
+ $graph->img->
+Line(0,0
+,100,100);
+
To your code. The following example shows some of the graphic + primitives you have access to in the Image class
<?php
+
+// $Id: canvasex02.php,v 1.1 2002/08/27 20:08:57 aditus Exp $
+
include
+"../jpgraph.php";
+
include "../jpgraph_canvas.php";
+
+
// Setup a basic canvas we can work
+
$g = new CanvasGraph(
+400,200,'auto'
+);
+
$g->SetMargin(
+5,11,6
+,11);
+
$g->SetShadow();
+
$g->SetMarginColor(
+"teal");
+
+
+// We need to stroke the plotarea and margin before we add the
+
// text since we otherwise would overwrite the text.
+
$g->InitFrame();
+
+
// Add a black line
+
$g->img->
+SetColor(
+'black');
+
$g->img->
+Line(0,0
+,100,100);
+
+
// .. and a circle (x,y,diameter)
+
$g->img->
+Circle(100,100
+,50);
+
+
+// .. and a filled circle (x,y,diameter)
+
$g->img->
+SetColor('red');
+
$g->img->
+FilledCircle(
+200,100,50
+);
+
+
// .. add a rectangle
+
$g->img->
+SetColor(
+'green');
+
$g->img->
+FilledRectangle(
+10,10,50
+,50);
+
+
// .. add a filled rounded rectangle
+
$g->img->
+SetColor(
+'green');
+
$g->img->
+FilledRoundedRectangle(
+300,30,350
+,80,10);
+
// .. with a darker border
+
$g->img->
+SetColor(
+'darkgreen');
+
$g->img->
+RoundedRectangle(
+300,30,350
+,80,10);
+
+
// Stroke the graph
+
$g->Stroke();
+
+
?>
+
+
Pleas note the way to access these routines through the img property + of the Graph class. Please also keep in mind that the coordinates are + absolute.
+ + + +A note on GD For those of you using GD 1.xx you + might notice that the large "filled circle" isn't completely filled. + This is because in GD 1.xx there are no low level primitives to fill an + ellipse or circle so JpGraph tries to make the best out of a bad + situation and manually fake a filled circle. For interest of speed + JpGraph does not contain a complete (for example) Bresenham-circle fill + but cheats by using some existing GD routines. This is not a perfect + solution and for large filled circles like this you get some + moire-patterns in the circle. If you upgrade to GD 2.x JpGraph will be + able to make full use of those new existing methods and the fill will + be perfect.
+ +We refer you to the class reference to find out what other graphic + primitives are available for use.
+The previous method using absolute coordinates works. But nothing + more. It doesn't give you any chance to easily scale the image (unless + you manually recalculate all used coordinates) , it gets tedious to + work with pixel level resolution. Especially if you just like to draw a + few basic shapes.
+To help with this you can use a scale for the canvas. This lets you + define a "work-space" of your choice. You can for example set the + coordinates to be between X:0-10, Y:0-10. This makes it easier to + position objects on the canvas. This also has two additional + advantages:
+To use this type of scaling you must make sure you include the file + "jpgraph_canvtools.php" . In addition to the scaling class their are + also a couple of other utility classes that may come in handy, + especially the Shape class.
+Using the scale is quite simple. You first instantiate a scale + object passing the graph as a parameter and then specify the scale you + want to use. This means you need to add the lines
$scale
+= new CanvasScale
+($g);
+
$scale->Set(
+0,$xmax,0
+,$ymax);
to your code. You can then use one of the translation methods (for + example +CanvasScale::Translate()) in the canvas scale class to translate + between your world coordinates and the absolute screen coordinates. + This means you could take the code in the example above and just add + the lines, for example,
+ list(
+$x1,$y1) = $this
+->scale->Translate(
+$x1,$y1);
+
list($x2,$y2) =
+$this->scale->Translate
+($x2,$y2);
+
$g->img->
+Line($x1,$y1
+,$x2,$y2);
+
Since this pattern has to be repeated for every object that has to + be drawn it makes good sense to encapsulate this in a separate class. + This is exactly why the canvas tools file also have a utility class + called Shape This class is + mainly a wrapper around the most commonly used methods in the basic + Image class (with one important exception) and does all these the + translation for you. Please see the class reference for a complete list + of the available methods To set up the Shape class you instantiate it + with the graphic context and the scale you want to use as argument as + in
+
+ $shape = new
+Shape($g,$scale
+);
You are then ready to use all the methods in the shape class. Using + a scale and imitating the previous example we would get the source + shown below.
<?php
+
+// $Id: canvasex03.php,v 1.1 2002/08/27 20:08:57 aditus Exp $
+
include
+"../jpgraph.php";
+
include "../jpgraph_canvas.php";
+
include "../jpgraph_canvtools.php";
+
+
// Define work space
+
$xmax=20;
+
$ymax=20;
+
+
// Setup a basic canvas we can work
+
$g = new CanvasGraph(
+400,200,'auto'
+);
+
$g->SetMargin(
+5,11,6
+,11);
+
$g->SetShadow();
+
$g->SetMarginColor(
+"teal");
+
+
+// We need to stroke the plotarea and margin before we add the
+
// text since we otherwise would overwrite the text.
+
$g->InitFrame();
+
+
// Create a new scale
+
$scale
+= new CanvasScale
+($g);
+
$scale->Set(
+0,$xmax,0
+,$ymax);
+
+
+// The shape class is wrapper around the Imgae class which translates
+
// the coordinates for us
+
$shape
+= new Shape($g,
+$scale);
+
$shape->SetColor(
+'black');
+
+
+
// Add a black line
+
$shape->SetColor(
+'black');
+
$shape->Line(
+0,0,20
+,20);
+
+
// .. and a circle (x,y,diameter)
+
$shape->Circle(
+5,14,2
+);
+
+
+// .. and a filled circle (x,y,diameter)
+
$shape->SetColor(
+'red');
+
$shape->FilledCircle(
+11,8,3
+);
+
+
// .. add a rectangle
+
$shape->SetColor(
+'green');
+
$shape->FilledRectangle(15,
+8,19,14
+);
+
+
// .. add a filled rounded rectangle
+
$shape->SetColor(
+'green');
+
$shape->FilledRoundedRectangle(2,
+3,8,6
+);
+
// .. with a darker border
+
$shape->SetColor(
+'darkgreen');
+
$shape->RoundedRectangle(2,
+3,8,6
+);
+
+
+
// Stroke the graph
+
$g->Stroke();
+
+
?>
+
+
If we like to make a smaller image we could just change the image + size and everything will be rescaled without any further code changes. + SO for example making the image half the size would give the result
If we instead wanted to keep the image size but shrink the shapes we + could just make the scale twice as large which would result in
+ +We previously mentioned that the Shape class was a wrapper around + the image class with one exception. So what is the exception? Well, + glad you asked. The exception is that it contain an additional method + which draws an "indented rectangle". An indented rectangle is a + rectangle where one of it's four corners have been moved into the + rectangle. You create an indented rectangle by calling either + Shape::IndentedRectangle() or A few examples illustrates what this + shape looks like.
+ +As a final note we mention the class + CanvasRectangleText Which can be used to add a text with a rounded + rectangle (possibly filled) onto the canvas. The previous example where + all the available fonts were drawn were using this class. We don't + describe it further but refer the interested reader to the class + reference and the 'listfontsex1.php' example file.
+As a final example we shortly discuss how the canvas type of graph + was used to generate the DB schema for the DDDA architecture.
+The library php file "utils/misc/imgdbschema.php" included in the + distribution contains some utility classes to make the drawing of table + schemes easier. It contains two basic classes, Class ImgDBTable and + Class ImgDBSchema. The first class understand how to draw an image + illustrating a single table. The second class is responsible for + automatically extract all the relevant information from a DB to draw a + complete DB Schema.
+Before going into this a little bit more we show what an example of + this might look like.
Before going on it should be noted that the ImgDBSchema assumes that + the DB can be accessed through a DB abstraction layer modeled after the + abstraction layer available in the 'jpdb.php' file in the DDDA + architecture. This abstraction layer assumes a MySQL database in the + bottom. This specific dependency of this particular abstraction layer + is the reason why these classes is not included in the generic canvas + tools file.
+The second thing to note is that this library does not contain a + complete automatic-layout engine but rather a very simple automatic + system which, if nothing else is specified, just puts the table in a + rectangular grid. A complete graph layout engine would simple be to + much to write in this context. This is also a very difficult + optimization problem and sofar not even any of the available research + programs that tries this can achieve a satisfactory layout without + manual intervention.
+The critical lines in the code to generate the above graph is
$tblposadj=array($tlo
+,0,$tblwidth+
+$tlo+2,0
+,2*$tblwidth+
+$tlo+4,0
+,-1,16,-
+1,16);
+
$dbschema
+= new ImgDBSchema
+("jpgraph_doc"
+,"FormatTblName"
+,"FormatFldName"
+);
+
$dbschema
+->SetMargin($leftm,
+$topm);
+
$dbschema
+->SetTableWidth
+($tblwidth);
+
$dbschema
+->Stroke($this->
+img,$this->iscale
+,$tblposadj);
The rest of the code in the file is just to setup the canvas, add an + indented rectangle to group some tables and generate a footer with the + date and time this image was generated.
+The first line instantiates a new ImgDBSCheme layout engine asking + it to draw an image for the database 'jpgraph_doc'. The following two + arguments specify two callback functions for formatting the text for + header and each field in a table.
+The next line specify the top left margin where the drawing of the + tables should be started.
+The third line specify the width of a single table. The final lines + starts the engine and draws all tables in the database to the canvas. + The final argument requires some further explanation. This is an offset + (x,y) from the top left corner how each individual table should be + positioned. If the value is -1 indicates that the default value should + be used. If this array is not specified then the tables will simple + arranged line by line.
+The full source code for drawing this DB schema example is shown + below.
+ <?php
+
+/*=======================================================================
+
// File: DBSCHEMAEX1.PHP
+
// Description: Draw a DB schema of the DDDA architecture
+
// Created: 2002-08-25
+
+// Ver: $Id: dbschemaex1.php,v 1.1 2002/08/27 20:08:57 aditus Exp $
+
//
+
// License: This code is released under QPL
+
// Copyright (C) 2001,2002 Johan Persson
+
+// Note: The actual drawing of the tables are semi-automatically
+
+// but you can easily adjust the individual tables position
+
// with the 'tblposadj' array.
+
//
+
+//========================================================================
+
*/
+
include
+"../jpgraph.php";
+
include "../jpgraph_canvas.php";
+
include "../jpgraph_canvtools.php";
+
include "../imgdbschema.inc";
+
include "../jpdb.php"
+;
+
+
+
+// Global callback to format the table header names
+
function
+FormatTblName(
+$aName) {
+
+// We want to replace any specifi references to the
+
// 'JpGraph' project with the generic '<project>'
+
return
+str_replace(
+'JpGraph',
+'<project>',
+$aName);
+
}
+
+
+// Global callback to format each field name in the table
+
function
+FormatFldName(
+$aName,$aTable) {
+
return $aName
+;
+
}
+
+
+
class Driver
+{
+
+
var $ig
+, $img, $iscale,
+$ishape;
+
var $iymax
+,$ixmax;
+
var $iwidth
+,$iheight;
+
+
function Driver
+() {
+
+
+// Define Image size and coordinate grid space to work within
+
$this
+->iwidth = 600;
+
$this
+->iheight= 750;
+
$this
+->iymax = 50;
+
$this
+->ixmax = 55;
+
+
// Setup a basic canvas
+
$this
+->ig = new CanvasGraph(
+$this->iwidth,$this
+->iheight,'auto');
+
$this
+->img = $this->
+ig->img;
+
+
// Define the scale to be used
+
$this
+->iscale
+= new CanvasScale
+($this->ig);
+
$this
+->iscale->Set(
+0,$this->ixmax
+,0,$this->
+iymax);
+
$this
+->ishape
+= new Shape($this->
+ig,$this->iscale
+);
+
+
// A small frame around the canvas
+
$this
+->ig->SetMargin(
+2,3,2
+,3);
+
$this
+->ig->SetMarginColor(
+"teal");
+
$this
+->ig->InitFrame();
+
+
}
+
+
function Run
+() {
+
+
$leftm
+=1.5; // Left margin (for table schemes)
+
$topm=5;
+// Top margin (for table schemes)
+
$tblwidth
+=15; // Individual table width
+
$tlo=1;
+// Offset for top line
+
+
// Add the background color for the project specific tables
+
$this
+->ishape->IndentedRectangle($leftm,
+$topm-1,3
+*$tblwidth+$tlo+
+6,45,
+
$tlo
++2*$tblwidth+
+2,30,CORNER_BOTTOMLEFT,
+
'lightblue');
+
+
+// Stroke the tables (series of x,y offsets, If =-1 then use the
+
// automtic positioning
+
$tblposadj
+=array($tlo,0,
+$tblwidth+$tlo+2
+,0,2*
+$tblwidth+$tlo+4
+,
+
0
+,-1,16,-
+1,16);
+
$dbschema
+= new ImgDBSchema
+('jpgraph_doc'
+,'FormatTblName'
+,'FormatFldName'
+);
+
$dbschema
+->SetMargin($leftm,
+$topm);
+
$dbschema
+->SetTableWidth
+($tblwidth);
+
$dbschema
+->Stroke($this->
+img,$this->iscale
+,$tblposadj);
+
+
$tt
+= new CanvasRectangleText
+();
+
$tt->SetFillColor(
+'');
+
$tt->SetColor(
+'');
+
$tt->SetFontColor(
+'navy');
+
+
// Add explanation
+
$tt->SetFont(
+FF_ARIAL,
+FS_NORMAL,12);
+
$tt->Set(
+'Project specific tables',
+$tblwidth+
+$leftm+3,16
+,15);
+
$tt->Stroke(
+$this->img,$this
+->iscale);
+
+
// Add title
+
$tt->SetColor(
+'');
+
$tt->SetFont(
+FF_VERDANA,
+FS_BOLD,26);
+
$tt->Set(
+'DDDA - DB Schema',
+9,0.5,30
+);
+
$tt->Stroke(
+$this->img,$this
+->iscale);
+
+
// Add a version and date
+
$tt->SetFillColor(
+'yellow');
+
$tt->SetFont(
+FF_FONT1,
+FS_NORMAL,10);
+
$tt->Set(
+"Generated: ".
+date("ymd H:i",time
+()),1,$this->
+iymax*0.96,15
+);
+
$tt->Stroke(
+$this->img,$this
+->iscale);
+
+
$this
+->ig->Stroke();
+
}
+
}
+
+
$driver
+= new Driver
+();
+
$driver->Run();
+
+
?>
+
+
JpGraph includes a module to easily generate Anti-Spam challenges. + With this we mean an image consisting of numbers and letters which are + very hard to read for an OCR program. This is often used to secure sign + up for bulletin boards, on-line mail system or mailing lists since this + very effectively prevent automatic sign up by robots (spam-bots).
+The module in JpGraph responsible for this is + jpgraph_antispam.php and behaves as a simplified plot module.
+The example below illustrates how such an image can look like
+Anti spam images have less functionality then the usual images + generated with JpGraph in order to keep this utility reasonable small. + The primary limitation is that there are now additional formatting + options for the images and the image generated will always use the + JPEG image format. Hence it is not possible to change this to use, + for example, PNG.
+Version | Date | Status | Who | Comment | +
---|---|---|---|---|
R1.9 | 2007-03-18 | Released | Johan Persson | +Additional info for JpGraph 1.21 |
Canvas graphing is an advanced feature that comes in handy where you + need to draw some more arbitrary graphics. To give you a flavor of what + you can do the following example shows an architecture overview of + JpGraph which was drawn using a canvas.
+Working with canvas requires more understanding of JpGraph as well + as more programming and fine tuning.
+There are two basic alternatives on how to generate the content of + the anti-spam image
+In order to write a script to generate a new challenge there are + four steps to be completed.
+First include the library file jpgraph_antispam.php. + Note that there is no need to include the "jpgraph.php" library since + all functionality is included in this library file.
+require_once "jpgraph_antispam.php";
Secondly a new instance of the class AntiSpam must be + created
+ $spam = new
+AntiSpam();
+
Thirdly the string to be used in the challenge must be + specified. To automatically generate a suitable string use
+// The argument determines the length of the generated string
+
$chars = $spam->
+Rand(5);
If instead the string to be used should be specified this string + should be specified in the initial creation of the AntiSpam() or by + calling the Set() method as in
+ $spam->
+Set("aui8k");
Please note that in order to minimize the risk for confusion the + letters 'O' and the number '0' (zero) is not allowed since they are too + alike and can be mistaken for each other.
+The final and fourth step is to output the image with a call + the method Stroke() on the created instance of the AntiSpam + class.
+ if( $spam->Stroke
+() === false
+) {
+
die("Illegal or no data to plot");
+
}
Note that we have put a guard around the output since in the case of + an error this method will result a boolean false value. As with the + other graph types it is possible to write the generated image to a file + by submitting a file name as an argument to Stroke().
+The creation of LED digits and letters are extremely simple. The + following complete example demonstrates the creation of a LED display
+
+
include
+"../jpgraph.php";
+
include "../jpgraph_led.php";
+
+
+// By default each "LED" circle has a radius of 3 pixels
+
$led
+= new DigitalLED74
+();
+
$led->Stroke(
+'0123456789. ABCDEFGHIJKL',
+LEDC_GREEN);
+
The result of running this script can be seen by running the + "Examples/ledex1.php" Example in the example directory. As can be seen + from the above example the color to be used for the LED digits is + specified as the second argument to the DigitalLED74::Stroke() method. + Available color for LED digits is given by the table below
+Symbolic name | Color |
LEDC_RED | Red |
LEDC_GREEN | Green |
LEDC_BLUE | Blue |
LEDC_YELLOW | Yellow |
GREY | Grey |
All digits, 0-9 |
Capital Letters, A-L |
JpGraph includes a module to easily generate Anti-Spam challenges. + With this we mean an image consisting of numbers and letters which are + very hard to read for an OCR program. This is often used to secure sign + up for bulletin boards, on-line mail system or mailing lists since this + very effectively prevent automatic sign up by robots (spam-bots).
+The module in JpGraph responsible for this is + jpgraph_antispam.php and behaves as a simplified plot module.
+The example below illustrates how such an image can look like
+Anti spam images have less functionality then the usual images + generated with JpGraph in order to keep this utility reasonable small. + The primary limitation is that there are now additional formatting + options for the images and the image generated will always use the + JPEG image format. Hence it is not possible to change this to use, + for example, PNG.
+Various settings in JpGraph are controlled by overall DEFINEs in the + configuration file "jpg-config.inc". Most of these defines have default + values that should be valid for most usage.
+In the rest of this chapter all constants are described with default + value and usage.
+ +Define, default value | Comment |
---|---|
"CACHE_DIR", "/tmp/jpgraph_cache/" | The full + absolute name of directory to be used as a cache. This directory + must be readable and writable for PHP. Must end with '/' |
"TTF_DIR", "/usr/local/fonts/ttf/" | +Directory for JpGraph TTF fonts. Must end with '/' The fonts must follow + the naming conventions as used by the supplied TTF fonts in JpGraph. | +
"CSIMCACHE_DIR", "csimcache/" | Directory for + cache directory for CSIM graphs. Must end with '/' Cache directory + specification for use with CSIM graphs that are using the cache. The + directory must be the filesystem name as seen by PHP and the 'http' + version must be the same directory but as seen by the HTTP server + relative to the 'htdocs' directory. If a relative path is specified it + is taken to be relative from where the image script is executed. Note: + The default setting is to create a subdirectory in the directory from + where the image script is executed and store all files there. As usual + this directory must be writable by the PHP process. |
"CSIMCACHE_HTTP_DIR", "csimcache" | Directory + for JpGraph TTF fonts. Must end with '/' Cache directory specification + for use with CSIM graphs that are using the cache. The directory must + be the filesystem name as seen by PHP and the 'http' version must be + the same directory but as seen by the HTTP server relative to the + 'htdocs' directory. If a relative path is specified it is taken to be + relative from where the image script is executed. Note: The default + setting is to create a subdirectory in the directory from where the + image script is executed and store all files there. As usual this + directory must be writable by the PHP process. |
"CHINESE_TTF_FONT", "bkai00mp.ttf" | Actual + name of the TTF file used together with FF_CHINESE aka FF_BIG5 This is + the TTF file being used when the font family is specified as either + FF_CHINESE or FF_BIG5 |
"LANGUAGE_CYRILLIC", false | Special unicode + Cyrillic language support. |
"CYRILLIC_FROM_WINDOWS", false | If you are + setting this config to true the conversion will assume that the input + text is windows 1251, if false it will assume koi8-r |
'MINCHO_TTF_FONT', 'ipam.ttf' | Japanese + TrueType font used with FF_MINCHO |
'PMINCHO_TTF_FONT', 'ipamp.ttf' | Japanese + TrueType font used with FF_PMINCHO |
'GOTHIC_TTF_FONT', 'ipag.ttf' | Japanese + TrueType font used with FF_GOTHIC |
'PGOTHIC_TTF_FONT', 'ipagp.ttf' | Japanese + TrueType font used with FF_PGOTHIC |
"INSTALL_PHP_ERR_HANDLER", false | Determine + if the library should also setup the default PHP error handler to + generate a graphic error message. This is useful during development to + be able to see the error message as an image instead as a "red-cross" + in a page where an image is expected. |
"CATCH_PHPERRMSG", true | Should the library + examine the global php_errmsg string and convert any error in it to a + graphical representation. This is handy for the occasions when, for + example, header files cannot be found and this results in the graph not + being created and just a "red-cross" image would be seen. This should + be turned off for a production site. |
"USE_LIBRARY_GD2",false | Specify if we + should use GD 2.x or GD 1.x If you have GD 2.x installed it is + recommended that you use it since it will give a slightly, slightly + better visual appearance for arcs. If you don't have GD2 installed this + must be set to false! |
'USE_TRUECOLOR',true | Should the image be a + truecolor image? Note 1: Can only be used with GD 2.0.2 and above. Note + 2: GD 2.0.1 + PHP 4.0.6 on Win32 crashes when trying to use truecolor. + Truecolor support is to be considered alpha since GD 2.x is still not + considered stable (especially on Win32). Note 3: MUST be enabled to get + background images working with GD2 Note 4: If enabled then truetype + fonts will look very ugly => You can't have both background images and + truetype fonts in the same image until these bugs has been fixed in GD + 2.01 |
"USE_CACHE",false | Should the cache be used + at all? By setting this to false no files will be generated in the + cache directory. The difference from READ_CACHE being that setting + READ_CACHE to false will still create the image in the cache directory + just not use it. By setting USE_CACHE=false no files will even be + generated in the cache directory. |
"READ_CACHE",true | Should we try to find an + image in the cache before generating it? Set this define to false to + bypass the reading of the cache and always regenerate the image. Note + that even if reading the cache is disabled the cached will still be + updated with the newly generated image. Set also "USE_CACHE" below. | +
"DEFAULT_GFORMAT","auto" | Default graphic + format set to "auto" which will automatically choose the best available + format in the order png,gif,jpg (The supported format depends on what + your PHP installation supports) |
"USE_IMAGE_ERROR_HANDLER",true | Determine + if the error handler should be image based or purely text based. Image + based makes it easier since the script will always return an image even + in case of errors. |
"USE_APPROX_COLORS",true | If the color + palette is full should JpGraph try to allocate the closest match? If + you plan on using background image or gradient fills it might be a good + idea to enable this. If not you will otherwise get an error saying that + the color palette is exhausted. The drawback of using approximations is + that the colors might not be exactly what you specified. Note1: This + does only apply to a palette image, not true color images since they + don't have the limitations of maximum number of colors. |
"ERR_DEPRECATED",false | Should usage of + deprecated functions and parameters give a fatal error? (Useful to + check if code is future proof.) |
"BRAND_TIMING",false | Should the time taken + to generate each picture be branded to the lower left in corner in each + generated image? Useful for performance measurements generating graphs | +
"BRAND_TIME_FORMAT","Generated in: %01.3fs" | +What format should be used for the timing string? |
The following defines should very rarely need to be changed
+ +Define, default value | Comment |
---|---|
"CACHE_FILE_GROUP","wwwadmin" | What group + should the cached file belong to (Set to "" will give the default group + for the "PHP-user") Please note that the Apache user must be a member + of the specified group since otherwise it is impossible for Apache to + set the specified group. |
"CACHE_FILE_MOD",0664 | What permissions + should the cached file have (Set to "" will give the default + permissions for the "PHP-user") |
"USE_BRESENHAM",false | Decide if we should + use the Bresenham circle algorithm or the built in Arc(). Bresenham + gives better visual appearance of circles but is more CPU intensive and + slower then the built in Arc() function in GD. Turned off by default + for speed |
"_CSIM_SPECIALFILE","_csim_special_" | +Special file name to indicate that we only want to calc the image map in + the call to Graph::Stroke() used internally from the GetHTMLCSIM() + method. |
"_CSIM_DISPLAY","_jpg_csimd" | HTTP GET + argument that is used with image map to indicate to the script to just + generate the image and not the full CSIM HTML page. |
+
 
+The bulk of the text was written directly in Emacs on a GNU/Linux + system in a mixture of PHP and HTML. A number of PHP functions were + used to automate the handling of formatting example code and figures.
+To generate the images automatically in the img directory a custom + awk-script is used to extract all the used image script from the + manual. The script then uses the client version of PHP generate the + images from the scripts and stores them in the 'img' directory.
+The final set of HTML files was then processes by HTMLDOC to + construct table of contents and chapter links.
+For example setting the oversampling to "1" is the same thing as + disabling super-sampling. This will generate a fast image but a LED + appearance that looks quite "rugged".
+Increasing the level of oversampling above "4" gives almost no + visual improvement to the resulting image, it will only increase the + CPU time needed to create the final image. Hence it is recommended that + the super-sampling is only specified as an integer in the range one to + four.
+Various settings in JpGraph are controlled by overall DEFINEs in the + configuration file "jpg-config.inc.php". Most of these defines have + default values that should be valid for most usage.
+In the rest of this chapter all constants are described with default + value and usage.
+ +Define, default value | Comment |
---|---|
"CACHE_DIR", "/tmp/jpgraph_cache/" | The full + absolute name of directory to be used as a cache. This directory + must be readable and writable for PHP. Must end with '/' |
"TTF_DIR", "/usr/local/fonts/ttf/" | +Directory for JpGraph TTF fonts. Must end with '/' The fonts must follow + the naming conventions as used by the supplied TTF fonts in JpGraph. | +
"CSIMCACHE_DIR", "csimcache/" | Directory for + cache directory for CSIM graphs. Must end with '/' Cache directory + specification for use with CSIM graphs that are using the cache. The + directory must be the filesystem name as seen by PHP and the 'http' + version must be the same directory but as seen by the HTTP server + relative to the 'htdocs' directory. If a relative path is specified it + is taken to be relative from where the image script is executed. Note: + The default setting is to create a subdirectory in the directory from + where the image script is executed and store all files there. As usual + this directory must be writable by the PHP process. |
"CSIMCACHE_HTTP_DIR", "csimcache" | Directory + for JpGraph TTF fonts. Must end with '/' Cache directory specification + for use with CSIM graphs that are using the cache. The directory must + be the filesystem name as seen by PHP and the 'http' version must be + the same directory but as seen by the HTTP server relative to the + 'htdocs' directory. If a relative path is specified it is taken to be + relative from where the image script is executed. Note: The default + setting is to create a subdirectory in the directory from where the + image script is executed and store all files there. As usual this + directory must be writable by the PHP process. |
"CHINESE_TTF_FONT", "bkai00mp.ttf" | Actual + name of the TTF file used together with FF_CHINESE aka FF_BIG5 This is + the TTF file being used when the font family is specified as either + FF_CHINESE or FF_BIG5 |
"LANGUAGE_CYRILLIC", false | Special unicode + Cyrillic language support. |
"CYRILLIC_FROM_WINDOWS", false | If you are + setting this config to true the conversion will assume that the input + text is windows 1251, if false it will assume koi8-r |
'MINCHO_TTF_FONT', 'ipam.ttf' | Japanese + TrueType font used with FF_MINCHO |
'PMINCHO_TTF_FONT', 'ipamp.ttf' | Japanese + TrueType font used with FF_PMINCHO |
'GOTHIC_TTF_FONT', 'ipag.ttf' | Japanese + TrueType font used with FF_GOTHIC |
'PGOTHIC_TTF_FONT', 'ipagp.ttf' | Japanese + TrueType font used with FF_PGOTHIC |
"INSTALL_PHP_ERR_HANDLER", false | Determine + if the library should also setup the default PHP error handler to + generate a graphic error message. This is useful during development to + be able to see the error message as an image instead as a "red-cross" + in a page where an image is expected. |
"CATCH_PHPERRMSG", true | Should the library + examine the global php_errmsg string and convert any error in it to a + graphical representation. This is handy for the occasions when, for + example, header files cannot be found and this results in the graph not + being created and just a "red-cross" image would be seen. This should + be turned off for a production site. |
"USE_LIBRARY_GD2",false | Specify if we + should use GD 2.x or GD 1.x If you have GD 2.x installed it is + recommended that you use it since it will give a slightly, slightly + better visual appearance for arcs. If you don't have GD2 installed this + must be set to false! |
'USE_TRUECOLOR',true | Should the image be a + truecolor image? Note 1: Can only be used with GD 2.0.2 and above. Note + 2: GD 2.0.1 + PHP 4.0.6 on Win32 crashes when trying to use truecolor. + Truecolor support is to be considered alpha since GD 2.x is still not + considered stable (especially on Win32). Note 3: MUST be enabled to get + background images working with GD2 Note 4: If enabled then truetype + fonts will look very ugly => You can't have both background images and + truetype fonts in the same image until these bugs has been fixed in GD + 2.01 |
"USE_CACHE",false | Should the cache be used + at all? By setting this to false no files will be generated in the + cache directory. The difference from READ_CACHE being that setting + READ_CACHE to false will still create the image in the cache directory + just not use it. By setting USE_CACHE=false no files will even be + generated in the cache directory. |
"READ_CACHE",true | Should we try to find an + image in the cache before generating it? Set this define to false to + bypass the reading of the cache and always regenerate the image. Note + that even if reading the cache is disabled the cached will still be + updated with the newly generated image. Set also "USE_CACHE" below. | +
"DEFAULT_GFORMAT","auto" | Default graphic + format set to "auto" which will automatically choose the best available + format in the order png,gif,jpg (The supported format depends on what + your PHP installation supports) |
"USE_IMAGE_ERROR_HANDLER",true | Determine + if the error handler should be image based or purely text based. Image + based makes it easier since the script will always return an image even + in case of errors. |
"USE_APPROX_COLORS",true | If the color + palette is full should JpGraph try to allocate the closest match? If + you plan on using background image or gradient fills it might be a good + idea to enable this. If not you will otherwise get an error saying that + the color palette is exhausted. The drawback of using approximations is + that the colors might not be exactly what you specified. Note1: This + does only apply to a palette image, not true color images since they + don't have the limitations of maximum number of colors. |
"ERR_DEPRECATED",false | Should usage of + deprecated functions and parameters give a fatal error? (Useful to + check if code is future proof.) |
"BRAND_TIMING",false | Should the time taken + to generate each picture be branded to the lower left in corner in each + generated image? Useful for performance measurements generating graphs | +
"BRAND_TIME_FORMAT","Generated in: %01.3fs" | +What format should be used for the timing string? |
The following defines should very rarely need to be changed
+ +Define, default value | Comment |
---|---|
"CACHE_FILE_GROUP","wwwadmin" | What group + should the cached file belong to (Set to "" will give the default group + for the "PHP-user") Please note that the Apache user must be a member + of the specified group since otherwise it is impossible for Apache to + set the specified group. |
"CACHE_FILE_MOD",0664 | What permissions + should the cached file have (Set to "" will give the default + permissions for the "PHP-user") |
"USE_BRESENHAM",false | Decide if we should + use the Bresenham circle algorithm or the built in Arc(). Bresenham + gives better visual appearance of circles but is more CPU intensive and + slower then the built in Arc() function in GD. Turned off by default + for speed |
"_CSIM_SPECIALFILE","_csim_special_" | +Special file name to indicate that we only want to calc the image map in + the call to Graph::Stroke() used internally from the GetHTMLCSIM() + method. |
"_CSIM_DISPLAY","_jpg_csimd" | HTTP GET + argument that is used with image map to indicate to the script to just + generate the image and not the full CSIM HTML page. |
+
 
+The creation of LED digits and letters are extremely simple. The + following complete example demonstrates the creation of a LED display
+
+
include
+"../jpgraph.php";
+
include "../jpgraph_led.php";
+
+
+// By default each "LED" circle has a radius of 3 pixels
+
$led
+= new DigitalLED74
+();
+
$led->Stroke(
+'0123456789. ABCDEFGHIJKL',
+LEDC_GREEN);
+
The result of running this script can be seen by running the + "Examples/ledex1.php" Example in the example directory. As can be seen + from the above example the color to be used for the LED digits is + specified as the second argument to the DigitalLED74::Stroke() method. + Available color for LED digits is given by the table below
+Symbolic name | Color |
LEDC_RED | Red |
LEDC_GREEN | Green |
LEDC_BLUE | Blue |
LEDC_YELLOW | Yellow |
GREY | Grey |
Since the standard LED matrix of 7x4 dots does not lend itself to + accurately represent all normal ASCII characters only the following + numbers and letters can be displayed.
+All digits, 0-9 |
Capital Letters, A-L |
Various settings in JpGraph are controlled by overall DEFINEs in the + configuration file "jpg-config.inc.php". Most of these defines have + default values that should be valid for most usage.
+In the rest of this chapter all constants are described with default + value and usage.
+ +Define, default value | Comment |
---|---|
"CACHE_DIR", "/tmp/jpgraph_cache/" | The full + absolute name of directory to be used as a cache. This directory + must be readable and writable for PHP. Must end with '/' |
"TTF_DIR", "/usr/local/fonts/ttf/" | +Directory for JpGraph TTF fonts. Must end with '/' The fonts must follow + the naming conventions as used by the supplied TTF fonts in JpGraph. | +
"CSIMCACHE_DIR", "csimcache/" | Directory for + cache directory for CSIM graphs. Must end with '/' Cache directory + specification for use with CSIM graphs that are using the cache. The + directory must be the filesystem name as seen by PHP and the 'http' + version must be the same directory but as seen by the HTTP server + relative to the 'htdocs' directory. If a relative path is specified it + is taken to be relative from where the image script is executed. Note: + The default setting is to create a subdirectory in the directory from + where the image script is executed and store all files there. As usual + this directory must be writable by the PHP process. |
"CSIMCACHE_HTTP_DIR", "csimcache" | Directory + for JpGraph TTF fonts. Must end with '/' Cache directory specification + for use with CSIM graphs that are using the cache. The directory must + be the filesystem name as seen by PHP and the 'http' version must be + the same directory but as seen by the HTTP server relative to the + 'htdocs' directory. If a relative path is specified it is taken to be + relative from where the image script is executed. Note: The default + setting is to create a subdirectory in the directory from where the + image script is executed and store all files there. As usual this + directory must be writable by the PHP process. |
"CHINESE_TTF_FONT", "bkai00mp.ttf" | Actual + name of the TTF file used together with FF_CHINESE aka FF_BIG5 This is + the TTF file being used when the font family is specified as either + FF_CHINESE or FF_BIG5 |
"LANGUAGE_CYRILLIC", false | Special unicode + Cyrillic language support. |
"CYRILLIC_FROM_WINDOWS", false | If you are + setting this config to true the conversion will assume that the input + text is windows 1251, if false it will assume koi8-r |
'MINCHO_TTF_FONT', 'ipam.ttf' | Japanese + TrueType font used with FF_MINCHO |
'PMINCHO_TTF_FONT', 'ipamp.ttf' | Japanese + TrueType font used with FF_PMINCHO |
'GOTHIC_TTF_FONT', 'ipag.ttf' | Japanese + TrueType font used with FF_GOTHIC |
'PGOTHIC_TTF_FONT', 'ipagp.ttf' | Japanese + TrueType font used with FF_PGOTHIC |
"INSTALL_PHP_ERR_HANDLER", false | Determine + if the library should also setup the default PHP error handler to + generate a graphic error message. This is useful during development to + be able to see the error message as an image instead as a "red-cross" + in a page where an image is expected. |
"CATCH_PHPERRMSG", true | Should the library + examine the global php_errmsg string and convert any error in it to a + graphical representation. This is handy for the occasions when, for + example, header files cannot be found and this results in the graph not + being created and just a "red-cross" image would be seen. This should + be turned off for a production site. |
"USE_LIBRARY_GD2",false | Specify if we + should use GD 2.x or GD 1.x If you have GD 2.x installed it is + recommended that you use it since it will give a slightly, slightly + better visual appearance for arcs. If you don't have GD2 installed this + must be set to false! |
'USE_TRUECOLOR',true | Should the image be a + truecolor image? Note 1: Can only be used with GD 2.0.2 and above. Note + 2: GD 2.0.1 + PHP 4.0.6 on Win32 crashes when trying to use truecolor. + Truecolor support is to be considered alpha since GD 2.x is still not + considered stable (especially on Win32). Note 3: MUST be enabled to get + background images working with GD2 Note 4: If enabled then truetype + fonts will look very ugly => You can't have both background images and + truetype fonts in the same image until these bugs has been fixed in GD + 2.01 |
"USE_CACHE",false | Should the cache be used + at all? By setting this to false no files will be generated in the + cache directory. The difference from READ_CACHE being that setting + READ_CACHE to false will still create the image in the cache directory + just not use it. By setting USE_CACHE=false no files will even be + generated in the cache directory. |
"READ_CACHE",true | Should we try to find an + image in the cache before generating it? Set this define to false to + bypass the reading of the cache and always regenerate the image. Note + that even if reading the cache is disabled the cached will still be + updated with the newly generated image. Set also "USE_CACHE" below. | +
"DEFAULT_GFORMAT","auto" | Default graphic + format set to "auto" which will automatically choose the best available + format in the order png,gif,jpg (The supported format depends on what + your PHP installation supports) |
"USE_IMAGE_ERROR_HANDLER",true | Determine + if the error handler should be image based or purely text based. Image + based makes it easier since the script will always return an image even + in case of errors. |
"USE_APPROX_COLORS",true | If the color + palette is full should JpGraph try to allocate the closest match? If + you plan on using background image or gradient fills it might be a good + idea to enable this. If not you will otherwise get an error saying that + the color palette is exhausted. The drawback of using approximations is + that the colors might not be exactly what you specified. Note1: This + does only apply to a palette image, not true color images since they + don't have the limitations of maximum number of colors. |
"ERR_DEPRECATED",false | Should usage of + deprecated functions and parameters give a fatal error? (Useful to + check if code is future proof.) |
"BRAND_TIMING",false | Should the time taken + to generate each picture be branded to the lower left in corner in each + generated image? Useful for performance measurements generating graphs | +
"BRAND_TIME_FORMAT","Generated in: %01.3fs" | +What format should be used for the timing string? |
The following defines should very rarely need to be changed
+ +Define, default value | Comment |
---|---|
"CACHE_FILE_GROUP","wwwadmin" | What group + should the cached file belong to (Set to "" will give the default group + for the "PHP-user") Please note that the Apache user must be a member + of the specified group since otherwise it is impossible for Apache to + set the specified group. |
"CACHE_FILE_MOD",0664 | What permissions + should the cached file have (Set to "" will give the default + permissions for the "PHP-user") |
"USE_BRESENHAM",false | Decide if we should + use the Bresenham circle algorithm or the built in Arc(). Bresenham + gives better visual appearance of circles but is more CPU intensive and + slower then the built in Arc() function in GD. Turned off by default + for speed |
"_CSIM_SPECIALFILE","_csim_special_" | +Special file name to indicate that we only want to calc the image map in + the call to Graph::Stroke() used internally from the GetHTMLCSIM() + method. |
"_CSIM_DISPLAY","_jpg_csimd" | HTTP GET + argument that is used with image map to indicate to the script to just + generate the image and not the full CSIM HTML page. |
+
 
+This manual covers versions up to 1.21 of JpGraph. A 2D graph + plotting library for PHP4 and PHP5.
+The library exists in two main tracks, the 1.x track and the 2.x + track. From a functional perspective both branches are equivalent. The + difference is that 1.x is suitable for PHP4 and 2.x is suitable for + PHP5.
+Please make sure you use the correct version ! The 1.x version will + not in general wotk on PHP5 installation and vice versa.
+Even though the library is known to work with version of PHP prior + to 4.3 and 5.1 respectively the library is not tested nor is it + recommended to run with any older versions of PHP.
+JpGraph is released under a dual license. For non-comercial usage + the library is released uner QPL 1.0 (Qt-License) and under the JpGraph + Professional License for commercial use. Commercial use is defined as + either a) The library is included as an integral part of a product that + is sold with a cost that exceeds the cost of the distribution medium. + b) The library is offered as a WEB service for a fee c) The library is + used on an intranet in a company with more than 5 employees
+JpGraph library is an OO graph library which makes it easy to both + draw a "quick and dirty" graph with a minimum of code and quite complex + graphs which requires a very fine grain of control. The library tries + to assign sensible default values for most parameters hence making the + learning curve quite flat since for most of the time very few commands + is required to draw graphs with a pleasing esthetic look.
+Some highlights of available features are
+In addition to these high level features the library has been + designed to be orthogonal and consistent in its' naming convention. For + example, to specify color each object (i.e. axis, grids, texts, titles + etc) within the graph implements the method SetColor() with the same + signature.
+The latest version of jpgraph can always be found on +http://www.aditus.nu/jpgraph/
+Information on version numbering schema
+For the latest update on planned future version see the web-site for + JpGraph at http://www.aditus.nu/jpgraph/
+For an overview of current issues that have been reported and are + unders investigation please see our DMS (Defect Management System) + available at +http://wwww.aditus.nu/bugtraq/
+The idea for writing this library grew out of our own need for a + high quality graph drawing library for PHP. When evaluating potential + existing libraries we found (at that time around 2000) these three
+All these libraries implements some fine graphic features but + unfortunately none of those completely fulfilled our needs either for + available functionality (for example none of these supported both two + Y-scales, auto-scaling, and logarithmic scales), or general + flexibility. We especially needed the option of two Y-scales, which + none of the above packages supported. Our own preferences for design + was closest to "chart 0.3" so we started by fixing some bugs in that + package and adding some new features. However It was soon realized that + to add all the features and flexibility we needed to "chart 0.3" it + would require a complete rewrite since the original design wasn't + flexible enough, especially adding a second Y-scale would require a + more flexible OO architecture.
+Defects or suggestion for new features can be entered using the +JpGraph BugTracker available at +http://www.aditus.nu/bugtraq/
+Before reporting bugs or feature suggestions may we ask that the + following facts are considered.
+Customers who have acquired the pro-version of the library are + entitled to prioritized e-mail support for a specific time after the + purchase. Support tickets may be created by first logging in to +http://www.aditus.nu/jpgraph/pro_login.php and then create a support + ticket.
+For other users a public community forum is available at +http://jpgraph.intellit.nl/ where many common questions are answered + and discussed.
+A collection of FAQ is available at +http://www.aditus.nu/jpgraph/jpgraphfaq.php
+In addition there is a growing list of "HowTo" documents available + at +http://www.aditus.nu/jpgraph/jpgraphowto.php
+Finally, we regret that we are unable to provide general support + regarding PHP/GD/TTF/Apache installation outside the specific scope of + the JpGraph library. Please see the corresponding documentation and + relevant FAQ for those products.
+ +In order to make sure that the GD installed the following example + would be run. The example creates a very simple image using just pure + GD calls and outputs an image in PNG format. This could be considered a + smoke-test to see that the GD library is available from PHP. Please + note that this is an absolute pre-requisite in order for the + JpGraph library to work at all.
+Store the code snippet below somewhere in the document root and make + sure it runs correctly.
+ $im = @
+ImageCreate (
+150, 100)
+
or die (
+"Cannot create a new GD image.");
+
$background_color
+= ImageColorAllocate
+($im, 255,
+255, 255);
+
$text_color
+= ImageColorAllocate
+($im, 233,
+14, 91);
+
ImageString
+($im, 1,
+5, 5, "A Simple Text String", $text_color
+);
+
header ("Content-type: image/png");
+
ImagePng ($im);
+
If the above script does not work or some error or warnings are + printed on the screen then it is necessary to correct those problems + before proceeding with the installation.
+To access the more advanced features of JpGraph needs the GD 2.x + library. This will allow the use of features such as alpha-blending and + trucolor images.
+The GD 2.x library is included in all standard PHP versions from + 4.2.x and above. To make sure that the GD 2.x library is installed the + following script must be working.
+ $im =
+imagecreatetruecolor (
+300, 200);
+
$black = imagecolorallocate ($im,
+0, 0, 0
+);
+
$white = imagecolorallocate ($im,
+255, 255, 255
+);
+
+
imagefilledrectangle
+($im,0,
+0,399,99
+,$white);
+
imagerectangle
+($im,20,
+20,250,190
+,$black);
+
+
header ("Content-type: image/png"
+);
+
imagepng ($im);
+
After running this script you should now see a black rectangle in + your browser.
+JpGraph contains as default a standard set of bitmap fonts which + only supports the standard ASCII 7-bit character set. In order to use + accented characters, UTF-8, Chinese, Japanese, etc You need to download + TTF fonts. Due to various legal issues no TTF fonts are supplied in the + JpGraph package. To enable TTF fonts there are three alternatives:
+It is also necessary to make sure that the PHP installation supports + TTF fonts (either through FreeType 1 or FreeType 2 libraries). I n + addition some suitable TTF font files must also be available. To make + the font files available for the library the directory path to the + location of the font files must be specified in the configuration file, + jpg-config.inc.php
+JpGraph uses a standard naming convention for the TTF font files in + order to be able to find the correct font files. This naming convention + follows the standard naming of the available font files.
+If the installation of the library is made on a computer running MS + Windows then it is recommended to use the already available font files + in Windows (usually located in C:\WINDOWS\FONTS).
+If the installation is made on a UNIX derivate running X11 then the + font location can differ between versions and UNIX brands. One commonly + used path is "/usr/X11R6/lib/X11/fonts/truetype/".
+Finally we note that it is possible to install additional fonts not + natively supported by the library. Since this requires augmenting the + library files this is considered advanced use and not further discussed + in this introduction.
+In addition to European font it is also possible to use non-latin + based fonts such as Cyrillic, Japanese and Chinese.
+In all cases a suitable TTF font that supports the non-latin based + language must be available.
+For Cyrillic support the define LANGUAGE_CYRILLIC in jpg-config.php + must be set to true. It is then possible to use a suitable Cyrillic + font as replacement for the ordinary fonts.
+For Chinese character set JpGraph supports both BIG5 and GB2312 + encoding. For BIG5 encoding the PHP installation must have support for + the "iconv()" function. Furthermore the define CHINESE_TTF_FONT must be + set to the name of the Chinese BIG5 font that is to be used. By default + this is set to "bkai00mp.ttf". To use the Chinese BIG5 font in the + scripts one must then specify the font family as FF_CHINESE.
+To use the alternative font files "simsun.ttc" and "simhei.ttf" + (which uses the GB2312 encoding) the only step needed is to install + those fonts in the normal TTF font directory and then specify the font + family as FF_SIMSUN, the "simhei.ttf" is used when the font style is + specified as FS_BOLD.
+Some care must be taken due to the encoding that the library + expects. The library TTF handling expects the fonts to be encoded in + UTF8 encoding. Since the most commonly used Japanese encoding is EUC-JP + some conversion must be done. The best way to do this is by using the + mbstring extension to PHP to handle the encoding. By default this + module is not included and to compile PHP with support for mbstring the + option "--enable-mbstring" must be given when compiling PHP. Your + installation of PHP might also provide mbstring as a PHP module that is + loaded at runtime.
+To convert from EUC-JP the function mb_convert_encoding() is + used as the following example shows.
++$utf8-encoded-text = mb_convert_encoding($eucjp-encoded-txt, 'UTF-8','EUC-JP'); ++ By enabling the define "ASSUME_EUCJP_ENCODING" (in + jpg-config.inc.php.php) this encoding is done automatically in the + library when one of the Japanese fonts have been enabled. By default + this automatic conversion is disabled. +
If this define is false then it is up to the client to make sure + that the proper utf8 encoded text is passed on to all the methods that + are use to specify text in the library given that one of the Japanese + fonts have been selected.
+A different method also exists when it comes to Japanese font + support. By compiling PHP with the option "--enable-gd-jis-conv" this + will automatically convert Japanese characters to UTF8 when using the + FreeType libraries. However the method with the mbstring module is + preferred since the automatic conversion might on occasion fail to + detect the proper encoding.
+In order to make use of the library it is necessary to ensure that + the script files can correctly access the library include files (as + described below) and that the PHP installation supports at least one + graphic format, i.e. it supports the "image" extension in PHP.
+This is easiest verified by either checking the output of the + phpinfo() standard PHP function or by making sure the PHP + installation make the 'imagecreate()' function available.
+This means that the installation + + must have a working GD-library together with PHP before the library + JpGraph can be used. Please make sure you have version 4.3.x or above + of PHP since JpGraph is not actively tested with + versions prior to PHP 4.3.x Ideally you should use at least PHP 4.3.8
+Please note that the 1.x version of the library do not + support PHP 5.x
+In order for JpGraph to work it is necessary to adjust the cache and + TTF directory to suit the specific installation. By default the TTF + directory is "/usr/X11R6/lib/X11/fonts/truetype/" and for the cache + "/tmp/jpgraph_cache/". These are defined as PHP defines at the top of + jpg-config.inc.php
+Please make sure that PHP has write permissions to the cache + directory if the cache feature should be used. If this is not the case + a "Can't write file xxx.yyy" error will occur when a graph that uses + the cache feature are generate. More information regarding the cache + feature of JpGraph is available in the section Making sense of + caching system in JpGraph
+To add plots to the graph you will need one or more of the following + files plot extension files depending on what kind of graph you need to + create.
+In the pro-version the following additional files are available
+This is the base library files, which you must have
+Per default the standard GD image library supports PNG graphic + formats. You will need to have that installed together with your PHP + module for this library to work at all. Please refer to PHP + documentation on specifics. Note that the newer versions of GD does not + support the GIF format due to copyright problems. Hence by default only + PNG is supported.
+If you want JPEG support you will also need an additional library + for PHP, again please see PHP documentation for specifics. For most + practical purposes PNG is a better format since it normally achieves + better compression then GIF (typically by a factor of 2 for the types + of images generated by JpGraph). In comparison with JPEG format PNG is + also better for the type of images generated by this library. So, the + bottom line is, you should have a very good reason to choose any other + format then PNG.
+By default the image format is set to "auto". This means that + JpGraph automatically chooses the best available graphic using the + preferred order "PNG", "GIF", "JPG".
+ +If You are insatlling the 2.x branch then make sure the PHP version + used is at least 5.0.1 (preferable 5.0.5 or higher) and that the PHP + version have compiled support for GD 2.x library. Please note that the + 2.x branch will not work with PHP 4.x
+For 99% of the users this library will work directly with a recent + installation of PHP without any problem.
+Experience shows that most of the trouble are caused by either an + old buggy version of the free-type TTF library or using an old + antiquated version of the GD library. In order to narrow it down the + problem the following steps is helpful.
+This is not meant to be a complete discussion about configuring + or compiling PHP. It is meant as an example of a configuration of PHP + that is known to work well with JpGraph.
+Below is an example of a standard configuration that can be used to + configure and compile PHP for use with the JpGraph Library
+Please note that depending on the specific installation requirements + other options might have to be specified, specifically the paths to + external libraries might need to be adjusted.
++./configure --prefix=/usr/share \ +--datadir=/usr/share/php \ +--with-apxs=/usr/sbin/apxs \ +--libdir=/usr/share \ +--includedir=/usr/include \ +--bindir=/usr/bin \ +--with-config-file-path=/etc \ +--enable-mbstring --enable-mbregex \ +--with-pdflib=/usr \ +--with-mysql \ +--with-ttf-dir=/usr/lib \ +--with-freetype-dir=/usr/lib \ +--with-gd --enable-gd-imgstrttf --enable-gd-native-ttf \ +--with-zlib-dir=/usr/lib \ +--with-png-dir=/usr/lib --with-jpeg-dir=/usr/lib --with-xpm-dir=/usr/X11R6 \ +--with-tiff-dir=/usr/lib \ +--enable-ftp \ +--enable-memory-limit --enable-safe-mode \ +--bindir=/usr/bin \ +--enable-bcmath -enable-calendar \ +--enable-ctype --with-ftp \ +--enable-magic-quotes \ +--enable-inline-optimization \ +--with-bz2 \ +--with-iconv ++
To get access to the JpGraph library you will need to include at + least two files, the base library and one or more of the plot + extensions. So for example to create a basic line plot the top of your + PHP file must have the lines:
+
+
include (
+'jpgraph.php');
+
include ('jpgraph_line.php'
+);
+
...
+
// Code that uses the jpgraph library
+
...
+
As a general rule each PHP script which generates an image must be + specified in a separate file which is then called in an HTML <IMG> tag. + For example, the following HTML excerpt includes the image generated by + the PHP script in "fig1.php".
+
+ <img src="fig1.php"
+border=0 align=center width
+=300 height=200>
+
Strictly speaking the "align", "width" and "height" are not + necessary but helps the browser position the image correctly before the + image has been fully sent back to the browser.
+The library will automatically generate the necessary headers to be + sent back to the browser so that it correctly recognize the data stream + received as an image of either PNG/GIF/JPEG format. The browser can + then correctly decode the image
+Observe that you can't return anything else than an + image from the image script. By definition each HTML page (or more + correctly each HTTP stream) can only consist of one mime type which is + determined by the header for that particular stream.
+A common mistake is to have a space in the beginning of the image + script which the HTTP server will send back to the browser. The browser + now assumes that the data coming back from this script is text since it + hasn't received an explicit header. When then the image headers get + sent back to the browser to forewarn the browser of the forthcoming + image the browser will not like that as it has already assumed the data + stream was a text stream. The browser will then give the infamous + "Headers already sent error".
+To include several images together with text on a page you need to + have a parent page with several <IMG> tags which each refers to an + image script (or the same image script with GET/POST data).
+It is also possible to generate images directly using the command + line version of PHP. This works the same way as the normal "through the + browser" generation with the exception that no HTTP headers will be + generated. Only the binary image data.
+Please make sure that you run the command line version of PHP (cli). + Using the CGI SAPI version will not work since then the HTTP headers + will be generated. Note: If the CGI version is used the generation of + headers may be suppressed by the '-q' option.
+You can easily check the version installed by running
+php --version+
you should then get a response with something like
++PHP 4.3.8 (cli) (built: Aug 29 2004 22:48:10) +Copyright (c) 1997-2004 The PHP Group +Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies ++
The important thing here is the
+(cli)+
marker. The JpGraph library check from what SAPI API it is invoked + from and adjusts the header generation accordingly.
+If all the above requirements are met then images can be generated + directly on the command line and stored in a suitable file. For example + by
++$> php myimage.php > image.png ++
Please note that the file extension on the image file must match the + format in which the image is generated.
+The common pattern for creating graphs is
+Of course it is of perfectly possible to call the image script + directly in the browser to just display the generated image in the + browser.
+You should remember that it is also possible to pass arguments to + the image script via the normal HTTP GET/POST arguments. For example
<img src
+="showgraph.php?a=1&b=2"
+>
This could for example be used to control the appearance of the + image or perhaps send data to the image which will be displayed. Note + that this is probably not the best way to send large amount of data to + plot. Instead the only practical way, for large data sizes, is to get + all the data in the image script, perhaps from a DB. Another + alternative for large amount of data to be sent to the image script is + by creating a POST request to the image script.
+echo '<img src="myimagescript.php?dummy='.now().'">'; ++ It is also important to be aware of any internal caching the browser + might do. The general problem with dynamically generated images is that + the image generating script (file) remains the same. This makes the + browser believe that the data hasn't changed and if the browser already + has issues a previous GET request and has the data cached it will not + send a new GET if the timestamp on the file is the same since it then + believes it my use the old cached version.
When it comes to the structure of your imaging script they will + generally have the structure
+
+// ... Include necessary headers
+
+
$graph
+= new Graph($width,
+$height, ...);
+
+
+// ... code to construct the graph details
+
+
$graph->Stroke();
+
JpGraph is completely Object oriented so all calls will be action on + specific instances of classes. One of the fundamental classes is the + Graph() class which represents the entire graph.
+After the creation of the Graph() object all the code lines to + construct the details of the graph are added.
+The final method called in an image script will most likely be the + Graph::Stroke() method. This will send the constructed image back + to the browser. A variation of this is used if the graph are supposed + to have image maps. In that case the final method will be + Graph::StrokeCSIM()
+In addition to this standard usage pattern you can also choose to
+The cache system, which lessens the burden of the PHP server, works + by avoiding o run all the code that follows the initial Graph() call by + checking if the image has already been created and in that case + directly send back the previously created (and stored in a file) image + to the browser. When using the cache system a filename must be + specified in the initial Graph() call which is used to store the image + in the cache system and possibly also a timeout value to indicate how + long the image in the cache directory should be valid.
+In many of the examples in this manual the following pattern will be + used
+ $graph = new
+Graph(300,200
+,"auto");
The two first parameters specify the width and height of the graph + and the third parameter the name of the image file in the cache + directory. The special name 'auto' indicates that the image file + will be given the same name as the image script but with the extension + changed to indicate the graphic format used, i.e '.jpg', '.png' and so + on.
+Please note that the cache system by default is disabled and must be + enabled by setting the proper define in the file "jpg-config.inc.php"
+By default JpGraph automatically chooses the image format to use in + the order PNG, JPEG and GIF. The exact format depends on what is + available on your system. There are two ways you can influence the way + the graphic format is chosen.
+ DEFINE
+("DEFAULT_GFORMAT"
+,"auto");
$graph->
+img->
+SetImgFormat(
+"jpeg")
+
If you like to save the image directly to a file instead of + streaming it back to the browser then you just have to specify an + absolute filename in the final call to Graph::Stroke(), i.e.
+
+ $graph->
+Stroke(
+"/usr/home/peter/images/result2002.png");
Please note that the user running as Apache/PHP must have write + access to the specified directory.
+There are also two predefined filenames which have special meaning.
+ $handle =
+$graph->Stroke(__IMG_HANDLER
+);
Since Internally TrueType fonts are rendered by locating a font + specification file you must install the accompanying TrueType fonts in + directory of your choice. You must then tell JpGraph where these fonts + may be found by specifying the font-path in the FONT_PATH define (in + jpg-config.inc.php). Please note that this must be the absolute file + path and not relative to the htdocs directory. By default the path is + set to
+ DEFINE(
+"TTF_DIR",
+"/usr/local/fonts/ttf/");
+
Since JpGraph must be able to tell the difference between the italic + and bold versions of the same font family a standard naming convention + is used to name the files. The available fonts are also defined by + DEFINES and hence you can't just copy your own TTF files to the + directory and expect it to work. At the moment there is no "easy" way + to add new fonts but to make some (small) mods to the code. However + this is expected to change in future version of JpGraph.
+In order to get TTF fonts working with JpGraph you should first + check that the following pure GD scripts work correctly. Please adjust + the font path according to your installation.
+ DEFINE
+("TTF_DIR","/usr/X11R6/lib/X11/fonts/truetype/"
+);
+
+
$im = imagecreatetruecolor (400,
+100);
+
$black = imagecolorallocate ($im,
+0, 0, 0
+);
+
$white = imagecolorallocate ($im,
+255, 255, 255
+);
+
+
imagerectangle
+($im,0,
+0,399,99
+,$black);
+
imagefilledrectangle
+($im,0,
+0,399,99
+,$white);
+
+
imagettftext
+($im, 30,
+0, 10, 40
+, $black, TTF_DIR.
+"arial.ttf",
+"Hello World!");
+
+
header ("Content-type: image/png"
+);
+
imagepng ($im);
+
The above script assumes you have the GD2 library and will create an + image with the classical "Hello World!" text printed in black.
+All graph objects that uses text allows you to specify the font to + be used by calling the SetFont() method and specifying three parameters
+For the builtin fonts the third, size, parameter is ignored since + the size is fixed for the three builtin fonts. The available font + families and the corresponding name (in JpGraph 1.7) are listed in the + table below.
+ +Font family | Type | Note |
FF_FONT0 | Builtin font | A very small font, only + one style |
FF_FONT1 | Builtin font | A medium sized font |
FF_FONT2 | Builtin font | The largest bit mapped + font |
FF_ARIAL | TTF font | Arial font |
FF_VERDANA | TTF font | Verdana font |
FF_COURIER | TTF font | Fix pitched courier |
FF_BOOK | TTF font | Bookman |
FF_COMIC | TTF font | Comic sans |
FF_TIMES | TTF font | Times New Roman |
FF_GEORGIA | TTF font | Georgia |
FF_TREBUCHE | TTF font | Trebuche |
FF_VERA | TTF font | Gnome Vera font, Available from + http://www.gnome.org/fonts/ |
FF_VERAMONO | TTF font | Gnome Vera Mono font, + Available from http://www.gnome.org/fonts/ |
FF_VERASERIF | TTF font | Gnome Vera Serif font, + Available from http://www.gnome.org/fonts/ |
FF_CHINESE | TTF font | Installed chinese font |
FF_SIMSUN | TTF font | Installed chinese font |
FF_BIG5 | TTF font | Installed Chinese BIG5 font + (needs iconv()) |
Please note that not all font families support all styles. The + figure below illustrates each of the available font families and what + styles you may use.
+ +We finally show some example of valid font specifications
$graph
+->title->SetFont(
+FF_FONT2);
+
$graph->title->
+SetFont(
+FF_FONT2,
+FS_BOLD);
+
$graph->title->
+SetFont(
+FF_ARIAL);
+
$graph->title->
+SetFont(
+FF_ARIAL,
+FS_BOLD,24);
Note: This information is only given here for very + advanced users. No free support will be given in the case you run into + difficulties trying to add new fonts. At the moment adding new fonts + require code modifications as outlined below.
+In order to add you favorite fonts there are three steps you need to + follow :
+For everyday use of JpGraph understanding of the alignment of text + strings in not necessary. However, if you like to add arbitrary strings + to the graph (with Graph::AddText()) or when working directly on a + canvas it will help understand this.
+Text is added to a graph with the creation of a +Text() object. And the alignment is specified with +Text::Align() Text alignment might actually be a misguiding name. + What you specify is rather the anchor point for the text, i.e. when you + specify that a text should be positioned at position (x,y) how + is that coordinate to be interpretated.
+The image below shows a text string aligned in the 9 possible + combinations. In the image the red crosses indicate what coordinate + that text string was positioned at. The alignment used for each of the + cases is shown below.
+ + +JpGraph supports both a set of built in bit-mapped fonts as well as + True Type Fonts. For scale values on axis it is strongly recommended + that you just use the built in bitmap fonts for the simple reason that + they are, for most people, easier to read (they are also quicker to + render). Try to use TTF only for headlines and perhaps the title for a + graph and it's axis. By default the TTF will be drawn with + anti-aliasing turned on.
+In many of the example you can see examples of both TrueType and + Bitmap fonts.
+There are a number of subtle differences in the way builtin fonts + and TrueType fonts are rendered to the screen. However, JpGraph, + abstracts away 99.9% of the differences so it will be, for the user, + completely transparent to switch between the different fonts.
+From version 1.10 JpGraph also supports the use of Alpha Blending + together with GD2.x This lets you specify how much of the underlying + color should be visible. You specify the amount of transparency for a + color by adding an extra parameter to the color specification separated + by an '@' (at) character.
+For example to specify a red color which is 40% transparent you + write
+ SetColor(
+"red@0.4");
+
or to specify 90% transparancy you write
+ SetColor
+("red@0.9");
Below is an example of how a bar graph with a background image can + make use of transparency + +
+ The chart below shows all available named colors.
+
+
+
For more on how to use the different themes to set the colors of Pie + plots please refer to "Working with 2D & 3D pie plots"
+
+
Theme 1: Earth
+
Theme 2: Pastel
+
Theme 3: Water
+
Theme 4: Sand
Colors can be specified in three different ways
+ SetColor
+("khaki");
A named color can also be modified by adding a adjustment factor. An + adjustment factor, 0 < f < 1, a smaller value will give a darker + version and a value of 0 or 1 will return the original color. A value > + 1 will make the color brighter. A few examples
+ SetColor
+("khaki:0.5"
+); // A darker version of "khaki"
+
SetColor("yellow:1.2");
+// A slightly lighter version of "yellow"
+
+ SetColor(array(65,
+100,176));
SetColor
+("#A16BFF");
The purpose of this chapter is to put dynamic image generation in + perspective and illustrate how HTML tags is used to call image + generating scripts. Even if You are familiar with PHP it is strongly + recommended to quickly browse through this chapter to make sure all + concepts are known.
+If You fully understand and can explain the concept of MIME types, + HTTP streams and why the "Headers already sent error" error is very + common when generating dynamic images with PHP it is probably safe to + skip this chapter. Otherwise it might be wise to read through this + chapter once.
+The enabling disabling of the cache system is controlled by two + defines (in jpg-config.php)
+
+ DEFINE(
+"USE_CACHE",
+true);
+
DEFINE("READ_CACHE",
+true)
+
The first of these, USE_CACHE, is the master-switch which must be + set to true to enable the caching system. The second switch READ_CACHE + very seldom needs to be changed.
+This second switch basically tells whether or not JpGraph should + ever look in the cache. Setting this to false and the master-switch to + true would then always generate an new updated image file in the cache + and this new image would be send back to the browser. The main use for + this (admittedly) strange setting is if you like to have the side + effect of the script that a fresh image is always stored in the cache + directory.
+Once you have enabled the cache you must also make sure that a valid + cache directory is setup. The cache directory is specified with the + define
+
+ DEFINE(
+"CACHE_DIR",
+"/tmp/jpgraph_cache/");
+
You can of course change the default directory to whatever directory + you fancy. But, you must remember one important thing. The + cache directory must be writable for the user running Apache/PHP +.
+For this reason one of the resource files included is the special + language "prod" which is meant to be used in a production site where to + give a generic error message. The generic error message can be tailored + by changing a define in the prod locale resource file.
+To use caching in your script you must supply a suitable file name + which will be used to store the image in the cache. You can also supply + a timeout value indicating how many minutes the cached image should be + considered valid.
+These parameters are supplied in the initial Graph() method call + which should be among the first in your script. Instead of manually + specifying a file name to be used you could often use the special name + "auto". If the filename is specified as "auto" the cashed image will + then be named the same as the image script but with the correct + extension depending on what image format have been chosen.
+If you don't specify a file name no caching will be used no matter + the settings of USE_CACHE (without a file name it is impossible!)
+The following call to Graph() shows a typical use of the cache.
+
+ $graph = new
+Graph(300,200
+,"auto",60)
+
The above code will use the automatic filename and a make the cache + valid for 60 minutes.
+So, how does this all work now?
+The first time you call your script (no cached image) everything + will be as usual, the script will run and you will in the end send back + the image to the browser. However if you have the caching enabled + JpGraph will automatically have stored a copy of the generated image in + the cache directory.
+The next time you call the script the first thing that happens in + the initial Graph() is that it will go and check in the cache directory + if the named image exists there. If this is the case it will also + checks that the image isn't too old (as compared to the specified + timeout value). If the image is valid then the image will be streamed + straight back from the image file to the browser and the script will + end it's execution.
+Hence, if the image is found in the cache no code lines + after the initial Graph() call will be executed
+The design decision behind this is that your image script code never + has to include anything special to make full use of the cache. It will + just automatically work.
+The arguments are formatted in the error text in the same way as + parameters in the printf() family of functions.
+To create your own localized error resource file You should copy the + "en.inc.php" to a temporary file, rename it for localem and then + translate each error message to Your language of choice. Make sure the + file is stored under the lang/ catalogue and You are ready to use your + new locale.
+You can also use the cache system for CSIM as well. The cache system + interface is slightly different in this case since the cache needs to + store both the cached image and the cached image-map. + It also needs to change due to the way CSIM HTML paradigm work. The two + major differences from the "standard" cache is
+The performance benefits even for simple CSIM images is around 50% + if the cache can be used and can of course be several 1000% if + construction of the image requires DB calls and other complex + operations which can be avoided.
+Before reading further you should have an understanding on how the + CSIM works by reading the section "sing Client side image maps".
+Please remember that when using CSIM you must end your script with a + call to Graph::StrokeCSIM() method instead of the +Graph::Stroke() used for non-csim.
+To use the cache with CSIM you have to call the +Graph::CheckCSIMCache(). As with the caching for non-CSIM you have + to supply a name to be used for the cached version as well as an + optional timeout value. The default timeout value if nothing else is + specified is 60 minutes.
+The name argument requires some more explanations. You must specify + a relative name here. For example "myimage" or perhaps + "firstpage/image3". Depending on your installation of JpGraph this will + now end up in the directory specified in the CSIMCACHE_DIR define. This + must also be a directory accessible by the normal web server. By + default a directory called "csimcache" will be created in the same + directory as the image script itself.
+This has the drawback that the directory from where the script is + executed must be writable by the process running PHP. Best practice for + this is to keep the number of writable directory for PHP down to a + minimum and re-use the same directory as is used for the standard + cache. This however, require that your system administrator setup that + cache directory so that it also accessible by the HTTP server from the + htdocs root.
+The CheckCSIMCache() method checks the cache for an existing cached + version and if found it returns it and halts execution of the script. + So, this call should be the first call after the creation of the + Graph() and before any heavy work is done to create the image so that + you can minimize the execution of the script in the case a match is + found.
+So, the general structure of a script that uses CSIM and the cache + is
+ $graph = new
+Graph(400,300
+);
+
+
// Check cache, 10 min timeout
+
$graph->CheckCSIMCache(
+"image1",10);
+
+
+// !! If cached version exists, execution halts here !!
+
+
//
+
// ... Construct the image with heavy DB calls etc, etc
+
//
+
+
$graph->StrokeCSIM();
+
Please note that you do not need to pass any + argument to the final call to StrokeCSIM() as you do when not using the + cache.
By default all plots are clipped outside the plot area. This means + that if you manually specify a scale and then try to plot which has + values smaller/larger than the scale those values will not show.
+The clipping algorithm is "perfect" in the sense that for example + line plots where the plot area cuts the line between two data points + the line will be drawn up to the edge of the plot area. The algorithm + used is O(1) in number of data points.
+The disabling/enabling of clipping manually is controlled by +Graph::SetClipping()
+This is a summary of the available feature for all Graph based + charts, i.e. line plots, error plots, scatter plots, etc.
+The library has a quite extensive set of error messages to give + hints and catch erroneous input to many of the controlling methods and + also do sanity check on the data to be plotted.
+All error messages are collected in resource files which are + localized to a specific language. All resource files are located under + the "lang/" directory in the JpGraph installation directory. The + deafult locale to be used is defined in the configuration file with the + setting DEFAULT_ERR_LOCALE in the distribution this is set to English + locale.
+The chosen locale is specified in the beginning of the script with a + call to the static method JpGraphError::SetErrLocale(). The + argument to this method is the ISO naming of the country/language to be + selected. For example to enable the special production locale the + following line should be added in the beginning of the script
++JpGraphError::SetErrLocale('prod'); ++ If an unknown or unsupported locale is given the error message will + default to English.
To reduce load on the web server JpGraph implements an advanced + caching system which avoids the burden of always having to run the full + image script.
+Depending on the complexity of the image script (for example if it + is doing several DB lookups) this could significantly improve + performance.
+The rationale behind this is of course performance, and the + observation that very few graphs are really real-time, i.e. needs to be + updated absolutely every time the graphing script is called.
+ +The enabling disabling of the cache system is controlled by two + defines (in jpg-config.php)
+
+ DEFINE(
+"USE_CACHE",
+true);
+
DEFINE("READ_CACHE",
+true)
+
The first of these, USE_CACHE, is the master-switch which must be + set to true to enable the caching system. The second switch READ_CACHE + very seldom needs to be changed.
+This second switch basically tells whether or not JpGraph should + ever look in the cache. Setting this to false and the master-switch to + true would then always generate an new updated image file in the cache + and this new image would be send back to the browser. The main use for + this (admittedly) strange setting is if you like to have the side + effect of the script that a fresh image is always stored in the cache + directory.
+Once you have enabled the cache you must also make sure that a valid + cache directory is setup. The cache directory is specified with the + define
+
+ DEFINE(
+"CACHE_DIR",
+"/tmp/jpgraph_cache/");
+
You can of course change the default directory to whatever directory + you fancy. But, you must remember one important thing. The + cache directory must be writable for the user running Apache/PHP +.
+The standard structure for an HTML page using client side image maps + would be something along the lines of
+ ++// Image map specification with name "mapname" +<MAP NAME=...> +... specification ... +</MAP> + +// Image tag +<img src="..." ISMAP USEMAP="mapname"> ++
This poses an interesting question.
+Since we normally call the graphing script directly in the <img> tag + how do we get hold of the image map (which is available only in the + image script) in this "HTML wrapper" script?
+In JpGraph there is actually two ways of solving this.
+The first (and preferred) way modifies the stroke method so that + instead of returning an image (like the standard Stroke() method) + StrokeCSIM() actually returns an HTML page containing both the image + map specification and the correct <IMG> tag.
+This of course means that it is necessary to treat an image map + returning image script differently from a non-CSIM image script, for + example you can't use it directly as the target for the "src" attribute + of the <IMG> tag since it sends back an actual HTML page containing + both an image tag together with an image map.
+To turn a standard image script into a CSIM script the first thing + needed to do is to supply the appropriate URL targets for the hotspots + in the image.
+What the hotspots represent depends on the type of plot you are + doing. The following plot types and graph areas support image maps.
+To specify a link for each hotspot you have to use the + SetCSIMTargets() method for each plot (or specific area) in the + graph which should be a hotspot.
+There are two arguments to this method
+To use caching in your script you must supply a suitable file name + which will be used to store the image in the cache. You can also supply + a timeout value indicating how many minutes the cached image should be + considered valid.
+These parameters are supplied in the initial Graph() method call + which should be among the first in your script. Instead of manually + specifying a file name to be used you could often use the special name + "auto". If the filename is specified as "auto" the cashed image will + then be named the same as the image script but with the correct + extension depending on what image format have been chosen.
+If you don't specify a file name no caching will be used no matter + the settings of USE_CACHE (without a file name it is impossible!)
+The following call to Graph() shows a typical use of the cache.
+
+ $graph = new
+Graph(300,200
+,"auto",60)
+
The above code will use the automatic filename and a make the cache + valid for 60 minutes.
+So, how does this all work now?
+The first time you call your script (no cached image) everything + will be as usual, the script will run and you will in the end send back + the image to the browser. However if you have the caching enabled + JpGraph will automatically have stored a copy of the generated image in + the cache directory.
+The next time you call the script the first thing that happens in + the initial Graph() is that it will go and check in the cache directory + if the named image exists there. If this is the case it will also + checks that the image isn't too old (as compared to the specified + timeout value). If the image is valid then the image will be streamed + straight back from the image file to the browser and the script will + end it's execution.
+Hence, if the image is found in the cache no code lines + after the initial Graph() call will be executed
+The design decision behind this is that your image script code never + has to include anything special to make full use of the cache. It will + just automatically work.
+The simplest way of creating a creating a CSIM image is with the + StrokeCSIM() method. As mentioned before this method actually returns a + (small) HTML page containing both the image-tag as well as the image + map specification. Hence it is not possible to use a script that + ends with this method in a standard image-tags src property.
+There are two ways to create CSIM (or get hold of) the image maps
+
+
+<a href="mycsimscript.html">
+
+
This has the drawback that the image page will only contain the
+ image and nothing else.
+
+<h2> This is an CSIM image </h2>
+
+<?php
+include "mycsimscript.php"
+?>
+
+
The process to replace Stroke() with StrokeCSIM() is strait forward. + Replace all existing calls to Stroke() with the equivalent calls to + StrokeCSIM().
+ The only difference is that it is necessary ti supply a minimum of
+ one file name in the StrokeCSIM() method. The first argument must be
+ the name of the actual image script file including the extension. So
+ for example if the image script is called "mycsimscript.php" it is
+ necessary to write
+
+ $graph->
+StrokeCSIM(
+'mycsimscript.php')
+
+
However, it is possible to apply a small "trick" here. PHP maintain
+ a special variable called "__FILE__" which is always set to the current
+ file name. This means you could use the following construction:
+ $graph->
+StrokeCSIM(
+basename(
+__FILE__))
+
This is a better way since the script can now be renamed without + having to change any code in the file which otherwise would be needed.
The other arguments to StrokeCSIM() are optional. Please note that + if several CSIM images are used in the same HTML page it is also + necessary to specify the image map name as the second parameter since + all image maps must be unique to properly match each image map against + each image. Please consult the class reference + StrokeCSIM() for more details.
+You can also use the cache system for CSIM as well. The cache system + interface is slightly different in this case since the cache needs to + store both the cached image and the cached image-map. + It also needs to change due to the way CSIM HTML paradigm work. The two + major differences from the "standard" cache is
+The performance benefits even for simple CSIM images is around 50% + if the cache can be used and can of course be several 1000% if + construction of the image requires DB calls and other complex + operations which can be avoided.
+Before reading further you should have an understanding on how the + CSIM works by reading the section "sing Client side image maps".
+Please remember that when using CSIM you must end your script with a + call to Graph::StrokeCSIM() method instead of the +Graph::Stroke() used for non-csim.
+To use the cache with CSIM you have to call the +Graph::CheckCSIMCache(). As with the caching for non-CSIM you have + to supply a name to be used for the cached version as well as an + optional timeout value. The default timeout value if nothing else is + specified is 60 minutes.
+The name argument requires some more explanations. You must specify + a relative name here. For example "myimage" or perhaps + "firstpage/image3". Depending on your installation of JpGraph this will + now end up in the directory specified in the CSIMCACHE_DIR define. This + must also be a directory accessible by the normal web server. By + default a directory called "csimcache" will be created in the same + directory as the image script itself.
+This has the drawback that the directory from where the script is + executed must be writable by the process running PHP. Best practice for + this is to keep the number of writable directory for PHP down to a + minimum and re-use the same directory as is used for the standard + cache. This however, require that your system administrator setup that + cache directory so that it also accessible by the HTTP server from the + htdocs root.
+The CheckCSIMCache() method checks the cache for an existing cached + version and if found it returns it and halts execution of the script. + So, this call should be the first call after the creation of the + Graph() and before any heavy work is done to create the image so that + you can minimize the execution of the script in the case a match is + found.
+So, the general structure of a script that uses CSIM and the cache + is
+ $graph = new
+Graph(400,300
+);
+
+
// Check cache, 10 min timeout
+
$graph->CheckCSIMCache(
+"image1",10);
+
+
+// !! If cached version exists, execution halts here !!
+
+
//
+
// ... Construct the image with heavy DB calls etc, etc
+
//
+
+
$graph->StrokeCSIM();
+
Please note that you do not need to pass any + argument to the final call to StrokeCSIM() as you do when not using the + cache.
In the Example/ directory there are a number of examples of how to + setup the various types of image maps. The following examples are + currently available
+In order to easily access all of these examples it is possible to + call the testsuit.php example with an additional argument "t=2". + By following the link +testsuit.php?t=2 a separate window will open with all the possible + CSIM examples.
+By default plots are not clipped outside the plot area for + performance reasons.
+This means that if you have manually specified a scale range and + your data is outside that range the plot will be drawn outside the + scale and into the margin.
+The clipping algorithm is "perfect" in the sense that for example + line plots where the plot area cuts the line between two data points + the line will be drawn up to the edge of the plot area. The algorithm + used is O(1) in number of data points.
+The disabling/enabling of clipping manually is controlled by +Graph::SetClipping()
+This is a summary of the available feature for all Graph based + charts, i.e. line plots, error plots, scatter plots, etc.
+Knowledge of the exact technical details of the way StrokeCSIM() + works is probably not needed by many people but for completeness we + outline those details in this short section.
+The fundamental issue we have to solve is that we must be able to + call the image script in two modes. When the user includes the image + script the StrokeCSIM() method should return the HTML page but when the + image script is later called directly in the image tag it must not + return an HTML page but rather the actual image.
+The way this is solved is by using one HTTP argument which is passed + on automatically when we use the image script name in the image-tag.
+If you look at the generated HTML you will see that the argument to + the src-property of the image tag is not simply the script name but the + script name with a additional argument.
+In the JpGraph internal code this pre-defined argument is checked + for and if it exists the image is send back and not the HTML page.
+The name of this argument is defined by a DEFINE() statement in + JpGraph. The define is _CSIM_DISPLAY.
+In the case where you want to store the image on disk and later use + it in an img-tag you need to get hold of the image map. For this you + will have to use the function + Graph::GetHTMLImageMap()
+An example of the use of this is shown below. With these lines the + image will be written to a file. The script then returns a HTML page + which contains the Client side image map and an img-tag which will + retrieve the previously stored file.
+ $graph->Stroke(
+"/usr/local/httpd/htdocs/img/image001.png"
+);
+
echo $graph
+->GetHTMLImageMap
+("myimagemap001"
+);
+
echo
+"<img src=\"img/image001.png\" ISMAP USEMAP=\"#myimagemap001\" border=0>"
+;
+
For version 1.9 the cache system has been extended to include even + the CSIM maps. For each CSIM graph two files are stored in the cache, + the image file itself as well as the wrapper HTML with the actual image + map. For further information see the chapter on "Understanding the + Cache system"
+To reduce load on the web server JpGraph implements an advanced + caching system which avoids the burden of always having to run the full + image script.
+Depending on the complexity of the image script (for example if it + is doing several DB lookups) this could significantly improve + performance.
+The rationale behind this is of course performance, and the + observation that very few graphs are really real-time, i.e. needs to be + updated absolutely every time the graphing script is called.
+ +Image maps, or client side image (CSIM) as they are known is fully + supported in JpGraph. It gives you the opportunity to create hot-spots + in the graphs which allows you to build a set of "drill-down" graphs.
+In the following section is based on the assumption that the reader + is familiar with the basic concepts of client side image map in HTML.
+To shortly recapitulate. Client side image maps consists of two + parts. The first part is the actual image and the second part is a + mapping that gives the coordinates for areas in the image which should + be marked as hot spots (i.e. click-able by the user). The library can + automatically generate these coordinate maps from a given graph.
+Through out the manual areas of the graph that may be used as a + hotspot is given in conjuction with the general description of that + area.
+The easiest way to get a date time scale for the X-axis is to use + the pre-defined "dat" scale. To be able to use that it is first + necessary to include the module "jpgraph_date.php" and the + specify the scale, for example as "datlin" in the call to SetScale() + as the following code snippet shows.
+ require_once("../jpgraph.php");
+
require_once("../jpgraph_line.php");
+
require_once("../jpgraph_date.php");
+
...
+
$graph
+= new Graph(540,
+300);
+
$graph->SetScale(
+'datlin');
+
...
The above code snippet would create a date/linear scale for the + graph. We will first show a basic use of the date scale and then go on + to illustrate how it is possible to tailor the exact formatting of the + date axis.
+When using the fully automatic formatting the library will use the + shortest possible string that uniquely identifieas a date/time. For + example if the entire intervall falls within the same day only the time + values will be displayed, if the intervall falls over several days then + also the date will be added to the label.
+As usual it is also possible to manually force a certain label + formatting to be used this is illustrated below.
+The first basic example below creates a data set that emulates a + sample rate every S second and falls over a total period of two days. + It is important to note that the input data on the X-axis must be a in + the form of timestamp data, i.e. the number of seconds from the system + epoch. In PHP the current timestamp value is returned by the function + time().
+This means that it is always mandatory to specify two input vectors + for a plot. For example to specify a line plot
+ $line
+= new LinePlot
+($data,$xdata);
+
The example below show this in practice
+Please review the script (by following the [src] link) that creates + this graph before continuing since we will base all further examples on + the above example.
+As can be seen from the above example the scale starts slightly + before the first data point. Why? This is of course by purpose in order + to make the first time label to start on an "even" value, in this case + on an hour. Depending on the entire interval of the graph the start + value will always be chosen to be the largest "even" time value, this + could for example be on an even minute, even 30min, even hour, even + day, even week and so on.
+The alignment of the start (and end) vdate alignment can also be + adjusted manually by using the two methods
+These method allow the alignment to be made by specifying one of the + following constants.
+For the SetTimeAlign() the following symbolic constants can be used
+For the SetDateAlign() the following symbolic constants can + be used
+Some examples will calrify the use of these methods.
+Example 1. We want the time adjustment to start on an even + quarter of an hour, i.e. an even 15 minute period.
$graph
+->xaxis->scale->
+SetTimeAlign(
+MINADJ_15);
+
Example 2. We want the time to start on an even 2 hour
$graph
+->xaxis->scale->
+SetTimeAlign(
+HOURADJ_2);
+
Example 3. We want the start to be on an even day
$graph
+->xaxis->scale->
+SetDateAlign(
+DAYADJ_1);
+
The default label format always tries to use the shortest possible + unique string. To manually set a manual scale the method + SetDateFormat() is used for example as in
+ $graph
+->xaxis->scale->
+SetDateFormat(
+'H:i');
+
The above example will force the labels to be displayed as hour (24h) + and minutes.
As with the linear scale it is possible to indicate what density of + scale ticks is needed. This is specified as usual with a call to + Graph::SetTickDensity()
+ $graph->SetTickDensity(
+TICKD_DENSE);
+
In the following we will assume that all data points are specified + by a tuple where the date/time is specified as a timestamp in second in + the same format as is returned by the PHP function time().
+The trick here is to use a label formatting callback routine which + gets called to format each label on the scale.
+What we do is that we specify that the X-scale should be an ordinary + "int" scale (remember that the data values are timestamps which are + integers). We then install our custom label callback (with a call to + SetLabelFormatCallback()) which given a timestamp formats it to a + suitable human readable form. In our example we will use the PHP + function Date() for this purpose.
+The callback we use will be
+
+// The callback that converts timestamp to minutes and seconds
+
function
+TimeCallback(
+$aVal) {
+
return Date
+('H:i:s',$aVal);
+
}
Using some random data we can now generate the following graph
In the above example we have specified the X-scale manually to make + sure that the min/max values on the X-axis exactly matches the min/max + x-data values.
+SetLabelFormatCallback() will be called for each of the displayed + labels and the argument passed on to the supplied function is the + default label that the library is assigning that specific label.
+This means that if the data to be displayed is based on, for + example, timestamps which are given in seconds the displayed value + might not be aligned to how time/date values normally should be + displayed.
+Using integer scales this will not work very well since the library + determines label positions to be at even positions (e.g. every 2,5,10, + 20,50,100 etc) to suit the auto-scaling since the library will assume + that the data is integers and not timestamp values.
+The best way to solve this is to use an integer X-scale together + with a a callback function with a manually specified scale. In order to + setup the scale a bit of manually work is needed. Depending on the data + to be displayed one should ensure that the scale starts and ends at + suitable times and that the tick interval chosen fits with an even + multiple of minutes, hours, days or what is best suited for the time + range that is to be displayed.
+The following code example illustrates this. It creates some "fake" + data that is assumed to be sampled time based data and sets up some + suitable scales and tick interval. This script may be used as a basis + for more advanced handling of the time data.
<?php
+
+// Example on how to treat and format timestamp as human readable labels
+
require_once(
+"../jpgraph.php");
+
require_once("../jpgraph_line.php");
+
+
// Number of "fake" data points
+
DEFINE('NDATAPOINTS',
+500);
+
+
+// Assume data points are sample every 10th second
+
DEFINE('SAMPLERATE',
+10);
+
+
+// Callback formatting function for the X-scale to convert timestamps
+
// to hour and minutes.
+
function
+TimeCallback(
+$aVal) {
+
return Date
+('H:i', $aVal);
+
}
+
+
// Get start time
+
$start = time();
+
+// Set the start time to be on the closest minute just before the "start" timestamp
+
$adjstart
+= floor($start /
+60);
+
+
+// Create a data set in range (20,100) and X-positions
+
+// We also apply a simple low pass filter on the data to make it less
+
// random and a little smoother
+
$data
+= array();
+
$xdata
+= array();
+
$data[0] =
+rand(20,100
+);
+
$xdata[0] =
+$adjstart;
+
for( $i=1;
+$i <
+NDATAPOINTS; ++
+$i ) {
+
$data[$i] =
+rand(20,100
+)*0.2 + $data[
+$i-1]*0.8
+;
+
$xdata
+[$i] = $adjstart +
+$i *
+SAMPLERATE;
+
}
+
+
+// Assume that the data points represents data that is sampled every 10s
+
// when determing the end value on the scale. We also add some extra
+
// length to end on an even label tick.
+
$adjend = $adjstart + (
+NDATAPOINTS+10)*10
+;
+
+
$graph
+= new Graph(500,
+250);
+
$graph->SetMargin(
+40,20,30
+,50);
+
+
+// Now specify the X-scale explicit but let the Y-scale be auto-scaled
+
$graph->SetScale(
+"intlin",0,0
+,$adjstart,$adjend);
+
$graph->title->
+Set(
+"Example on TimeStamp Callback");
+
+
+// Setup the callback and adjust the angle of the labels
+
$graph->xaxis->
+SetLabelFormatCallback(
+'TimeCallback');
+
$graph->xaxis->
+SetLabelAngle(
+90);
+
+
+// Set the labels every 5min (i.e. 300seconds) and minor ticks every minute
+
$graph->xaxis->
+scale->ticks->Set
+(300,60);
+
+
$line
+= new LinePlot
+($data,$xdata);
+
$line->SetColor(
+'lightblue');
+
$graph->Add(
+$line);
+
+
$graph->Stroke();
+
?>
+
With date/time scale we refer to the plotting of data where the + independent variable (X-axis) de-nominates a time value. This could for + example be the temperature measured in intervals during a day.
+From version 1.18 and onwards there are two principal ways of + handling date/time scales. The manual way and fully automatic using the + special "dat" scale. For most cases the automatic "dat" scale is the + preferred choice but in rare circumstances it might be more appropriate + to use the manual way since it gives slightly more control (but not + that much) of the overall handling of scales.
+To be able to use a date/time scale at all we will assume that the + data points are represented by both an X coordinate (time-value) and a + Y-value (anything else wouldn't make sense).
+We first start by describing the use of the "dat" scale.
+By default only the Y-axis have grid lines and then only on major + ticks, i.e. ticks which have a label. It is of course possible to + change this. Both the X , Y and Y2 can have grid lines. It is also + possible to let the gridlines also be drawn on the minor tick marks, + i.e. ticks without a label. Lets see how we can apply this to the graph + above.
+The grid is modified by accessing the xgrid (or ygrid) component of + the graph. So to display minor grid lines for the Y graph we make the + call
+ $graph->ygrid->Show
+(true,true)
+
The first parameter determines if the grid should be displayed at + all and the second parameter determines whether or not the minor grid + lines should be displayed.
+If you also wanted the grid lines to be displayed for the Y2 axis + you would call
+ $graph->
+y2grid->Show(true
+,true)
Note. In general it is not a good idea to display + both the Y and Y2 grid lines since the resulting image becomes + difficult to read for a viewer.
+We can also enable the X-grid lines with the call
$graph
+->xgrid->Show(
+true)
+
In the above line we will of course only just enable the major grid + lines.
+To bring all this together we will display a graph with grid lines + for both Y and X axis enabled.
Another option for the grid lines is the possibility to have the + area between the grid lines filled with alternating two colors. The + example below illustrates this.
+In the example above we have also made use of alpha-blending + (requires GD 2.x or higher). By default the filled grid lines are + disabled. To enable this style you have to call the +Grid::SetFill() method.
+You might want to have specific labels you want to use for the + X-axis when this has been specified as a "text" scale. In the previous + example each Y-point might represent a specific measurement for each of + the first 10 month. We might then want to display the name of the + months as X-scale.
+To specify the labels on the scale you make use of the + SetTickLabels() method.
+To get a localized version of the name of the month you can use a + nice feature in JpGraph, the global '$gDateLocal' object which is an + instance of the + DateLocale
+This class has a number of methods to get localized versions of + relevant names for dates, (months and weekdays).
+So to specify the X-axis with the short form of the month names we + use the construction
+ $a =
+$gDateLocale->
+GetShortMonth();
+
$graph->xaxis->
+SetTickLabels(
+$a);
+
This will, now result in the image displayed below
+As can be seen in the previous example the X-axis is slightly + cluttered with the labels very close to each other. We might rectify + this by either enlarging the image or just displaying fewer tick label + on the x-axis.
+Specifying that we only want, for example, to print every second + label on the axis is done by a call to the method + SetTextLabelInterval() Which would result in the graph
+ +If the text labels are long (for example full dates) then another + way might be to adjust the angle of the text. We could for example + choose to rotate the labels on the X-axis by 90 degrees. With the help + of the SetLabelAngle() +
+Which would then result in the image below
+Using a filled line plot is not much different from using a normal + line plot, in fact the only difference is that you must call the method + SetFillColor() + on a normal line plot. This will then fill the area under the line + graph with the chosen color.
+In the example below we have also, as an example, specified plot + marks (see previous sections).
+Note 1. If you add multiple filled line plots to + one graph make sure you add the one with the highest Y-values first + since it will otherwise overwrite the other plots and they will not be + visible. Plots are stroked in the order they are added to the graph, so + the graph you want front-most must be added last.
+Note 2. When using legends with filled line plot + the legend will show the fill color and not the bounding line color.
+Note 3. Filled line plots is only supposed to be + used with positive values. Filling line plots which have negative data + values will probably not have the appearance you expect.
+As you can see from the graph above the grid lines are below the + filled line graph. If you want the grid lines in front of the graph you + can adjust the depth with call to + Graph::SetGridDepth() As the following example shows
+ +Accumulated line graphs are line graphs that are "stacked" on top of + each other. That is, the values in the supplied data for the Y-axis is + not the absolute value but rather the relative value from graph below. + For example if you have two line graphs with three points each, say + [3,7,5] and [6,9,7]. The first graph will be plotted on the absolute + Y-values [3,7,5] the second plot will be plotted at [3+6, 7+9, 5+7], + hence the values of the previous graphs will be used as offsets.
+You may add any number of ordinary line graphs together. If you want + to use three line plots in an accumulated line plot graph you write the + following code
+
+ // First create the individual plots
+
$p1 = new LinePlot(
+$datay_1);
+
$p2 = new LinePlot(
+$datay_2);
+
$p3 = new LinePlot(
+$datay_3);
+
+
+// Then add them together to form a accumulated plot
+
$ap = new AccLinePlot(array($p1,
+$p2,$p3));
+
+
+// Add the accumulated line plot to the graph
+
$graph->Add(
+$ap);
+
You might of course also fill each line plot by adding the lines
$p1
+->SetFillColor
+("red");
+
$p2->SetFillColor(
+"blue");
+
$p3->SetFillColor(
+"green");
+
Using some appropriate data this might then give a graph perhaps + like the one showed in the figure below
+ +If you only have access to a few data points but still want a smooth + curve between those data points JpGraph can help you achieving that by + letting you construct cubic splines. If you never have heard of cubic + splines before, don't worry. You only have to supply the data points + you know tell JpGraph how many interpolated points in total you want in + the graph. JpGraph will now take care of constructing a smooth curve + between all you data points. The new, smooth, curve will be made up of + exactly as many interpolated points as you have specified.
+To construct a spline you need both the X and Y coordinates for the + known data points.
+You start by constructing a new Spline instance. To + get access to the Spline class you must first remember to include the + file "jpgraph_regstat.php". You instantiate this class by calling it + with your two known data arrays (X and Y) as follows.
$spline
+= new Spline($xdata,
+$ydata);
+
This call initializes the spline with the data points you have. These + data points are also known as Control points for the spline. + This helper class doesn't draw any line itself. Instead it is merely + used to get a new (larger) data array which have all the interpolated + values. You then use these new value in your plot. This way give you + great flexibility in how you want to use this interpolated data.
+Continuing the above line we now use the Spline::Get() + method to get an interpolated array containing a specified number of + points. So for example the line
+ list(
+$sdatax,
+$sdatay) =
+$spline->Get(50
+);
Will construct the two new data arrays '$sdatax' and '$sdatay' which + contains 50 data points. These two arrays are constructed from the + control point we specified when we created the '$spline' object.
+You would then use these two new data array in exactly the same way + as you would form ordinary data vectors.
+The following example illustrates this
+In order to make the example more interesting we actually use two + plots. First a line plot to get the smooth curve and then a standard + scatter plot which is used to illustrate where the control points are.
+To emphasize the specific data points it is possible to add plot + marks at each data point. Plot marks can be either
+You access the plot mark through the "mark" instance variable in the + plot, as in
+ $lineplot->
+mark->SetColor("red"
+);
To choose between the different plot marks you call the +PlotMark::SetType() method with the correct define to choose the + plot type you want to use.
+The simple shape type of plot marks are
+To specify an arbitrary image you use the special define
+In this case you must also specify a image file name and an optional + scaling constant. For example as in
+ $lineplot->mark->
+SetTYPE(
+MARK_IMG,
+"myimage.jpg",
+1.5);
+
If you want to use one of the built-in images the following images + are available. Please note that not all images are available in all + possible colors. The available colors for each image is listed below.
+The following shape (the first class) plot marks are available
+For the second class (built-in images) the following table list the + different images as well as what color they are available in. For the + built-in images you specify the color with the second argument.
+Note that some of the images are available in different sizes. The + reason is that even though you can scale them by the third argument + there is a visual degradation to scale an image larger than it's + original size since some pixels needs to be interpolated. Reducing the + size with a scale < 1.0 gives much better visual apperance.
+The scaling works with both GD 1 and GD 2 but with GD 2 the quality + of the scaling is much better.
+Built-in images and available colors:
+Type | Description | Colors |
---|---|---|
MARK_IMG_PUSHPIN, MARK_IMG_SPUSHPIN | Push-pin image | +'red','blue','green','pink','orange' |
MARK_IMG_LPUSHPIN | A larger Push-pin image | +'red','blue','green','pink','orange' |
MARK_IMG_BALL, MARK_IMAGE_SBALL | A round 3D rendered ball | +'bluegreen','cyan','darkgray','greengray', + 'gray','graypurple','green','greenblue','lightblue', + 'lightred','navy','orange','purple','red','yellow' |
MARK_IMAGE_MBALL | A medium sized round 3D rendered ball | + 'blue','bluegreen','brown','cyan', + 'darkgray','greengray','gray','green', + 'greenblue','lightblue','lightred', 'purple','red','white','yellow' | +
MARK_IMAGE_LBALL | A large sized round 3D rendered ball | + 'blue','lightblue','brown','darkgreen', + 'green','purple','red','gray','yellow','silver','gray' |
MARK_IMAGE_SQUARE | A 3D rendered square | +'bluegreen','blue','green', 'lightblue','orange','purple','red','yellow' | +
MARK_IMG_STAR | A 3D rendered star image | +'bluegreen','lightblue','purple','blue','green','pink','red','yellow' | +
MARK_IMG_DIAMOND | A 3D rendered diamond | +'lightblue','darkblue','gray', 'blue','pink','purple','red','yellow' | +
MARK_IMG_BEVEL | A 3D rendered bevel style round ring | +'green','purple','orange','red','yellow' |
It might sometimes be desirable to highlight the data-points with + marks in the intersection between the given x and Y-coordinates. This + is accomplished by specifying the wanted plot mark type for the "mark" + property of the line graph. A full list of all available marks is given + in the class reference +PlotMarks
+For now let's just add a triangle shape marker to our previous graph + by adding the line
$lineplot->
+mark->SetType(MARK_UTRIANGLE
+);
This will give the graph as shown below
+ +If you like you can of course both change the size, fill-color and + frame color of the chosen plot mark.
+The colors of the marks will, if you don't specify them explicitly, + follow the line color. Please note that if you want different colors + for the marks and the line the call to SetColor() for the marks must be + done after the call to the line since the marks color will always be + reset to the lines color when you set the line.
+In the following section we will work through an number of examples + on how to manipulate labels on a text scale. Primarily we will + investigate how to best handle the case where you have a large number + of values.
+As a remainder; Text scale is meant to be used on the X-axis when + the X-axis doesn't have a numeric value, i.e you are only interested in + linear ordering of the data. If you don't specify the labels manually + they will be set automatically starting from 1 as the example below + shows.
+ + +To specify the labels on the X-axis as suitable text strings you + call the method + Axis::SetTickLabels() with an array containing the text-labels. If + there are more data points than labels the non-specified labels will be + given their ordinal number. If we augment the previous example with the + name of the month we get the following new example
+ + + +What happen now if we have a larger number of bars? Let's try with + 25 bars and see what result we get.
+ + +Not all to impressive. The labels are to close and they overlap. + Hence it is not a good idea to display every label. To adjust what + labels are to be displayed you use the + SetTextLabelInterval() method. The argument to this method is the + interval between text labels. So to display only every 3 month you + would add the line
+
+ $graph->xaxis->SetTextLabelIntervall(3
+)
Which would give the result shown below
+ +Much better, quite readable.
+If we have an even larger data set it might not longer be meaningful + to display all the tick marks since they would simple become to close. + In JpGraph there is a possibility to specify that you only would like + every n:th tick mark to be visible ( + SetTextTickIntervall() ). For bar graphs using text scale however, + that might not be such a good idea since the tick marks are between the + bars and the labels centered under the bars. If we only were to + display, say, every 3 tick mark it wouldn't look to good. Not that we + can't do it, as the example below shows, but it just doesn't look very + good.
+ +A better way to handle large data set is simply to hide the tick + marks all together. Tick marks may be hidden by calling the method + Axis::HideTicks(); If we hide all the ticks on the X-axis we will + get the result shown below
+ +To add clarification or other information text strings to the graph + you can add arbitrary lines of text anywhere you like onto the graph. + The text might have multiple lines and you can choose the paragraph + alignment.
+To add text you have to create one or more instances of the + Text() object and then add the text object to the graph with the + AddText() method.
+The position of these text boxes are given as fraction of the width + and height of the graph. When you are positioning these text boxes you + might also choose what part of the text box should be considered the + anchor point for the position you specify.
+By default the anchor point is the upper left corner of the bounding + box for the text.
+To show some ways of positioning the text we use a very simple bar + graph not to distract from the text. We first just add a single text + line with most of the settings their default value by adding the + following lines to the graph
+ $txt=new Text(
+"This is a text");
+
$txt->Pos(
+0,0);
+
$txt->SetColor(
+"red");
+
$graph->AddText(
+$txt);
+
The result is shown below.
+Not too exiting. Let's make it more interesting by having a + background color, using larger fonts and framing the text box and + adding a drop shadow to the text box by using the methods + SetBox() and SetBox()
+That's better. Now we get some attention. If you want to add a text + with several lines you just need to separate the lines with a newline + ('\n' character). The default paragraph alignment is left edge but you + can also use right and center alignment.
+As an illustration let's add a couple of more lines to the previous + text, center the text box in the middle of the graph and also use + centered paragraph alignment for the text. To adjust the paragraph + alignment of the text you have to use the + Text::ParagraphAlign()
+Of course there is no limit to the number of text string you can add + to the graph.
+From version 1.12 it is also possible to add text strings to a graph + using the scale coordinates instead. This is accomplished by using the Text::SetScalePos() Which + is completely analog to SetPos() with the only difference that the + positions given are interpretated as scale values instead of fractions + of the width and height.
+As a final easy modification we can enable the display of the data + value above each data point. The value is represented by the 'value' + property in the plot. (You can read more about the possibilities of the + display value + in the class reference.)
+To enable the display of the value you just need to call the Show() + method of the value as in
+ $lineplot->value->
+Show()
+
Adding that line to the previous line plot would give the result + shown below.
+We can of course change both color, font and format of the displayed + value. So for example if we wanted the display values to be dark red, + use a bold font and have a '$' in front we need to add the lines
$lineplot->value
+->SetColor("darkred");
+
$lineplot
+->value->SetFont(
+FF_FONT1,
+FS_BOLD);
+
$lineplot
+->value->SetFormat(
+"$ %0.1f");
+
This would then result in the following image
+What if we want to add a second plot to the graph we just produced? + Well, this is quite straightforward and just requires two simple step:
+To create the second plot we need some data (we could of course use + the same data as for the first plot but then we wouldn't be able to see + the new plot!)
+The following lines show how to create the new plot and add it to + the graph (we only show the new lines - not the full script)
$ydata2
+= array(1,19,
+15,7,22
+,14,5,
+9,21,13
+);
+
$lineplot2
+=new LinePlot($ydata2);
+
$lineplot2
+->SetColor("orange");
+
$lineplot2
+->SetWeight(2);
+
+
$graph->Add(
+$lineplot2);
+
Making these changes to the previous graph script would generate a + new graph as illustrated below.
+There is a few things worth noting here
+Each graph can have up to three different titles accessed by the + three properties
+All of these three properties is a standard text object which means + that you can have individual font, colors, margins and sizes of these + tree titles.
+The only thing you need to think of is that you probably want to add + some extra margin to make room for the titles (using + Graph::SetMargin() )
+The individual positioning of these titles are done automatically + and will adjust to the font size being used.
+If you for, esthetic reasons, would like increase the distance from + the top where the title is positioned (or the intra distance between + title and sub title) you can use the + Text::SetMargin() method. For example the line
+
+ $graph->title->SetMargin
+(20);
will set the distance between the top of the title string and the top + of the graph to 20 pixels. If you instead call the SetMargin() method + for the subtitle it will adjust the distance between the top of the + subtitle and the bottom of the title.
+The titles will be positioned at the top and be centered in the + graph. Each of these titles may have multiple lines each separated by a + "\n" (newline) character. By default the paragraph alignment for each + title is centered but may of course be changed (using the + ParagraphAlign()) method.
+Each graph can also have a footer. This footer is actually three + footers. Left, center and right. The 'left' footer is aligned to the + left, the 'center' at the bottom center and the right to the right.
+Each of these three positions is a standard Text object which means + you can change color, font and size as you please individually on each + of these footer positions.
+You access the footer through the Graph::footer property as the + following example shows
+
+ $graph->
+footer->left->Set
+("(C) 2002 KXY"
+);
+
$graph->footer->
+center->Set("CONFIDENTIAL"
+);
+
$graph->footer->
+center->
+SetColor("red");
+
$graph->footer->
+center->
+SetFont(
+FF_FONT2,
+FS_BOLD);
+
$graph->footer->
+right->Set("19 Aug 2002"
+);
As you saw in the preceding example you could add multiple plots to + the same graph and Y-axis. However what if the two plots you want to + display in the graph has very different ranges. One might for example + have Y-values like above but the other might have Y-values in the + 100:s. Even though it is perfectly possible to add them as above the + graph with the smallest values will have a very low dynamic range since + the scale must accomplish the bigger dynamic range of the second plot.
+The solution to this is to use a second Y-axis with a different + scale and add the second plot to this Y-axis instead. Let's take a look + at how that is accomplished.
+First we need to create a new data array with large values and + secondly we need to specify a scale for the Y2 axis. This is done by + the lines
+ $y2data = array(
+354,200,265
+,99,111,
+91,198,225
+,293,251);
+
$graph->SetY2Scale(
+"lin");
+
and finally we create a new line plot and add that to the second + Y-axis. Note that we here use a new method, AddY2(), since we want this + plot to be added to the second Y-axis. Note that JpGraph will only + support two different Y-axis. This is not considered a limitation since + using more than two scales in the same graph would make it very + difficult to interpret the meaning of the graph.
+To make the graph a little bit more esthetic pleasing we use + different colors for the different plots and let the two different + Y-axis get the same colors as the plots.
+The resulting graph is shown below. source)
+ +A variant of the titles is the tab title. This is just + another option you have of putting a name on the graph. The appearance + of this type is a tab on top of the plot area with text inside.
+You can access the tab using the 'tabtitle' property of the graph.
+The following figure shows an example of how this can look.
+As usual you have full freedom to specify font and colors for this + type of title. Please see the class reference regarding +GraphTabTitle() for more information.
+With more than one plot on the same graph it is necessary to somehow + indicate which plot is which. This is normally done by adding a legend + to the graph.
+You will see that each plot type has a 'SetLegend()' method which is + used to name that plot in the legend. SO to name the two plots in the + example we have been working with so far we need to add the lines
$lineplot->SetLegend
+("Plot 1");
+
$lineplot2
+->SetLegend("Plot 2");
+
to the previous code. The resulting graph is shown below
+As you can see the legend gets automatically sized depending on how + many plots there are that have legend texts to display. By default it + is placed with it's top right corner close to the upper right edge of + the image. Depending on the image you might want to adjust this or you + might want to add a larger margin which is big enough to accompany the + legend. Let's do both.
+First we increase the right margin and then we place the legend so + that it is roughly centered. We will also enlarge the overall image so + the plot area doesn't get too squeezed.
+To modify the legend you access the 'legend' property of the graph. + For a full reference on all the possibilities (changing colors, layout, + etc) see class legend in + the class reference
+For this we use the legends 'SetPos()' method as in
$graph
+->legend->Pos(
+0.05,0.5,"right"
+,"center");
Doing this small modification will give the result shown below
+The above method 'SetPos()' deserves some explanation since it might + not be obvious. You specify the position as a fraction of the overall + width and height of the entire image. This makes it possible for you to + resize the image within disturbing the relative position of the legend. + We will later see that the same method is just to place arbitrary text + in the image.
+To give added flexibility one must also specify to what edge of the + legend the position given should be relative to. In the example above + we have specified "right" edge on the legend for the for the horizontal + positioning and "center" for the vertical position.
+This means that the right edge of the legend should be position 5 % + of the image width from the right. If you had specified "left" the the + legends left edge would be positioned 5 % of the image width from the + image left side.
+By default the legends in the legend box gets stacked on top of each + other. The other possibility is to have them sideways. To adjust this + you use the SetLayout() + method. Using a horizontal layout with the previous example give the + following result.
+ +For more advanced fomatting of the legend it is possible to adjust
+In order to adjust the number of columns used in the legend the + method Legend::SetColumns is used. So for example to have the + legend lined up using three columns the follwing lines have to be added + to teh script
+ $graph->
+legend->
+SetColumns(3);
Instead of having a single color background you can easily have an + arbitrary image as the background. The image may be in either PNG, JPG + or GIF format depending on what your installation supports.
+ +A note on GD: If you are using GD 2.xx you must + make sure that the define USE_TRUECOLOR is set to true. This is also + the default. Failure to do so in combination with GD 2.xx will make the + background image just look like a solid black square.
+ +To use a specific image as the background you just have to use the + method + Graph::SetBackgroundImage() The arguments specify file-name, how + the image should be positioned in the graph and finally the format of + the image (if it is in JPG, PNG or GIF) format. If the format is + specified as "auto" (the default) then the appropriate image format + will be determined from the extension of the image file.
+The file name is of course obvious but the second argument might not + be. This arguments determine how the image should be copied onto the + graph image. You can specify three different variants here
+You might often find yourself wanting to use a background image as a + "waterstamp". This usually means taking the original image, import it + to some image editing program and then "bleaching" the color + saturation, reducing the contrast and so on. Finally you save the + modified image which you then use as a background image.
+This whole process can be automatically accomplished in JpGraph by + using the method + Graph::AdjBackgroundImage() which allow you to adjust color + saturation, brightness and contrast of the background image.
+
+ $graph->
+AdjBackgroundImage(...)
+
to achieve the "watercolor" effect to avoid the image being too + intrusive in the graph.
+JpGraph offers two ways of handling null values (or discontinuities) + in the data. You can either have a "whole" in the data or the line may + be extended between the previous and next data point in the graph.
+If the data value is null ("") or the special value "x" then the + data point will not be plotted and will leave a gap in the line.
+If the data value is "-" then the line will be drawn between the + previous and next point in the data ignoring the "-" point.
+The following example shows both these possibilities.
+ + +In addition to the background image you can also add a background + color gradient. This gradient can be covering the entire graph, just + the plot area or just the margins. This flexibility allows you to + combine a background image with a background color gradient. You can + for example use a background image in the plot area and a color + gradient out in the margins.
+You specify a color gradient background by calling the + Graph::SetBackgroundGradient() method. All details are available in + the class reference (follow the link above). We finally give a quick + example on what kind of effect you can achieve using this feature.
Finally we like to mention that in the "/utils/misc/" directory you + will find a small utility script called "mkgrad.php". Running this + script presents you with a UI that makes it a breeze to create a + gradient image on it's own.
+ The UI for the utility is so obvious that we won't discuss it
+ further, we just show it below. The UI for the mkgrad.php utility
In the example below this utility is used to get a more interesting + plot area.
+ + +An interesting enhancement when using Plotmarks is the possibility + to add a callback function to control the size and color of the + plotmarks.
+This callback function will get called with the current Y-value (for + the plotmark) as it's argument. As return value the callback function + must return an array containing three (possible null) values. The + values returned must be
+The exact meaning of the parameters will of course depend on the + type of plot marks being used.
+The callback must be a global function and is installed with a call + to + PlotMark::SetCallback()
+So for example to install a callback that changes the fill color for + all marks with a (Y) value higher than 90 you could add the lines
+
+ function
+MarkCallback(
+$aVal) {
+
if( $aVal
+> 90)
+
$fcolor
+="red"
+
else
+
$fcolor
+="";
+
return array(""
+,"",$fcolor);
+
}
+
...
+
$plot->mark->
+SetCallback(
+"MarkCallback");
+
...
As you can see in the above example we have left some of the return + values blank. Doing this will just ignore any change of these value and + use the global settings for the plotmarks.
+If you also let the (Y) value affect the size of the plot marks you + can get what is sometimes known as a "balloon plot". The example below + is basically a scatter plot that uses filled circles to mark the + points. A format callback is then used to change the color and size + depending on the Y-value for each plot.
+ + +Step style refers to an alternate way of rendering line plots by not + drawing a direct line between two adjacent points but rather draw two + segments. The first segment being a horizontal line to the next X-value + and then a vertical line from that point to the correct Y-value. This + is perhaps easier demonstrated by an example as seen below.
+You specify that you want the plot to be rendered with this style by + calling the method +SetStepStyle() on the lineplot.
+ +In section 10.2 you can read about + arbitrary rotation of the graphs. For most practical purposes rotation + of 90 degrees is most useful. This could for example be used to plot + horizontal bar graphs.
+The slight complication with general rotation is that the margins + also rotates, this means that if you rotate a graph 90 degrees the left + margin in the image was originally the bottom margin. In additional by + default the center of the rotation is the center of the plot area and + not the entire image (if all the margins are symmetrical then they will + of course coincide). This means that depending on your margin the + center of the rotation will move. You can read more about this and how + to manually set the center for rotation in the section about rotation, 10.2
+This is just a slight inconvenience which you have to take into + account when you need to set an explicit margin with a call to +Graph::SetMargin()
+However, in order to make a rotation of 90 degrees much easier you + can easily rotate a graph 90 degrees and set the correct margin with a + call to +Graph::Set90AndMargin() The parameter to this method lets you + specify the margins as you will see them in the image without having to + think of what becomes what after the rotation.
+So, the only thing you need to do is call this method and then the + graph will have been rotated 90 degrees.
+Using a logarithmic scale requires you to include the logarithmic + add on module in "jpgraph_log.php". So you must have the line
+include("jpgraph_log.php"
+);
on the top of your code. To Illustrate how to use a logarithmic scale + let's make the right Y scale in the previous example a logarithmic + scale. This is done by the line
+ $graph->SetY2Scale(
+"log");
+
This will then give the following result
+ +You can of course also use a logarithmic X-scale as well. The + following example shows this.
Even though we have so far only shown line graphs logarithmic scale + can also be used for bar, error, scatter plots as well. Even radar + plots supports the use of logarithmic plots. The following example + shows how to use a logarithmic scale for a bar graph.
+ + +Assuming we start with the traditional two axis graph, one X and one + Y axis. You may then change the position of each axis by calling + Axis::SetPos($aPosition) You have to remember that you need to + specify the position on the other axis. SO you need to specify the + world-coordinate for the position. By default the axis are each + positioned at the 0-point on the other axis, i.e. the axis will cross + at the 0,0 point in the graph.
+In addition to the standard positioning you may also use the two + special position markers "min" and "max". This will position the axis + at the minimum (or maximum) position of the other axis.
+For example, to make sure that the X-axis is always at the bottom of + the graph (at lowest possible Y-value) you would have to add the line
+
+ $graph->xaxis->SetPos
+("min");
To change the color and width of the axis you have to make use of + the Axis::SetColor() and + Axis::SetWeight() + methods.
+You might also want to add titles to the axis. This is done through + the Axis::SetTitle() + method. This is actually just a shortcut for accessing the title + property direct. Axis::title::Set() which also allow you to set the + alignment in one call.
+By default the position of the title is to the far right for the + X-axis and in the middle (and 90 degrees rotated) for the Y-axis.
+You can adjust the position of the title with the help of the second + argument to the + Axis::SetTitle() method.
+The possible positions are "high","middle" and "low" which refers to + the scale values on the axis.
+One common modification you might want to do to the title is to + increase the margin between the axis and the actual title. This is + often necessary to do for the Y-axis if the values displayed are large. + You may adjust the distance (in pixels) between the axis and the title + by using the method + Axis::SetTitleMargin()
+So for example to increase the margin on the Y-axis you might add + the line
+
+ $graph->yaxis->SetTitleMargin(40
+);
to your code.
+Finally we mention something about the positioning of tick marks and + labels on the axis. You have the possibility to choose what side of the + axis the tick marks and the labels should be at. For the X-axis this + can be specified as either on the the top (inside the plot area) or at + bottom (outside of the plotarea). In the same way you can specify for + the Y-axis if the labels ( or ticks) should be on the left or right + side.
+To adjust the label positioning you have to use the method + Axis::SetTitleSide() and to adjust the position of the tick mark + you have to use the method + SetTickSide()
For example, the following lines added to a script would change side + of the labels and tickmarks for the X-axis.
+
+ $graph->xaxis->SetLabelPos
+(SIDE_UP);
+
$graph->xaxis->
+SetTickSide(
+SIDE_DOWN);
+
This technique is for example used if you position the X-axis at the + top of the graph as the following example shows.
In scientific style plots it is often common to duplicate each axis + so that all sides of the graph have a labeled axis. This is of course + also fully supported by JpGraph.
+Before we continue we show a small example to illustrate this + feature
+ + +The example above shows the basic configuration. There are now + several modifications you may do to these axis like
+The style of axis is determined by the method + Graph::SetAxisStyle() The available type of axis are
+How to adjust the actual labels are discussed elsewhere in this + manual (see ???,???). However we like to mention here that you can + adjust the label margin (distance between the axis and the labels) with + the method + Axis::SetLabelMargin()
+to adjust the actual label format (like font, color, angle) you need + to access the Axis::SetFont() + and the Axis::SetColor() + methods. If you investigate the + Axis class you will discover more methods to adjust the many + aspects of the axis layout.
+As a final note we also mention the methods + Axis::SetLabelAlign() and + Axis::SetLabelAngle() This first method is really only mentioned + here for completeness since it is mostly used for internal purposes. + However on some occasion you might want to adjust the alignment of the + labels. By default they are centered in respect to the tick mark. By + using the method you might override this positioning should you choose + to do so.
+The second of these methods adjusts the angle of the label in + regards to the axis. This is very useful for X-axis that have long + labels.
+In order to have full control over the way that the labels are + displayed it is possible to define a callback function that will be + applied to all labels. The callback function will be called with the + label as the only argument and should return the value that will be + displayed in the graph. This could for example be used to turn seconds + (used to position data points) into hour and minutes on the scale. For + further reference see the two methods: + Graph::SetLabelFormatCallback(); and + Graph::SetLabelFormat();
+One good way of illustrate the usefulness of label callbacks in a + slightly different context is to show how we can achieve the effect of + an inverted Y-scale.
+An inverted Y-scale has the lowest number at the top and the scale + values increases downwards.
+Even though JpGraph doesn't directly support this feature it is + quite easy to achieve with just a few extra lines of code in your image + script.
+Before we continue we give an example of what we are referring to.
+ + +Two achieve this effect there are two simple steps to take:
+And that's it! We refer you to the code in the example above for the + details.
+To get the exact type of axis you want in your graph there are a + number of adjustments available for you. You may change, color, size, + position and general appearance.
+ +As you saw in the previous example it is possible to use different + types of scales. In JpGraph you can use the following scales
+Any combination of these may be used. Linear and logarithmic scales + are pretty straightforward. The text scale might deserve some + explanation. The easiest way to think of the text scale is as a linear + scale consisting of only natural numbers, i.e. 0,1,2,3,4,... . This + scale is used when you just have a number of Y-values you want to plot + in a consecutive order and don't care about the X-values. For the above + example it will also work fine to use a linear X-scale (try it!). + However, the scale is now treated as consisting or real numbers so the + auto scaling, depending on the size of the image an the number of data + points, might decide to display other labels then the natural numbers., + i.e. a label might be 2.5 say. This is not going to happen if you use a + text scale.
+The normal practice for text scale is to specify text strings as + labels instead as the default natural numbers. You can specify text + strings for the labels by calling the + SetTickLabels() method on the Axis.
+To specify the scale you use the + SetScale() method. A few examples might help clarify this.
+As you can see all your graphs will require at least one call to + SetScale() in the beginning of your script. Normally it will come right + after the creation of the Graph().
+To specify the scale for the Y2 axis you use the + SetY2Scale() Since you only specify one axis you only specify + "half" of the string in the previous examples. So to set a logarithmic + Y2 scale you will call
+ $graph->SetY2Scale(
+"log");
+
The first example draws a line graph consisting of 10 Y-values. In + this first example we show the full code. In the following examples we + will only show interesting piece of the code.
<?php
+
include (
+"../jpgraph.php");
+
include ("../jpgraph_line.php");
+
+
// Some data
+
$ydata
+= array(11,3,
+8,12,5
+,1,9,
+13,5,7
+);
+
+
+// Create the graph. These two calls are always required
+
$graph
+= new Graph(350,
+250,"auto");
+
$graph->SetScale(
+"textlin");
+
+
// Create the linear plot
+
$lineplot
+=new LinePlot($ydata);
+
$lineplot
+->SetColor("blue");
+
+
// Add the plot to the graph
+
$graph->Add(
+$lineplot);
+
+
// Display the graph
+
$graph->Stroke();
+
?>
+
You might note a few things
+This is a perfect fine graph but looks a little bit "sparse". To + make it more interesting we might want to add a few things like
+From looking at the previous example you can see that you access all + properties of JpGraph through the objects you create. Graph(), + LinePlot() and so on. In general all objects you can see in the graph + is accessed through a named instance.
+For example the title of the graph is accessed through the + 'Graph::title' property. So to specify a title string you make a call + to the 'Set()' method on the title property as in:
+
+ $graph->title->Set
+('Example 2');
So by adding just a few more lines to the previous code we get a + graph as shown below.
To achieve this we just needed to add a few more lines. (We only show + the part of example 1 we changed, to look at the full source just click + the [src] link in the caption. )
+
+// Setup margin and titles
+
$graph->img->
+SetMargin(40,20
+,20,40);
+
$graph->title->
+Set(
+"Example 2");
+
$graph->xaxis->
+title->Set("X-title"
+);
+
$graph->yaxis->
+title->Set("Y-title"
+);
+
Again there are a couple of things you should note here
+A nice change would now be to have all the titles in a bold font and + the line plot a little bit thicker and in blue color. Let's do that by + adding the lines
$graph->
+title->SetFont(FF_FONT1
+,FS_BOLD);
+
$graph->yaxis->
+title->SetFont(FF_FONT1
+,FS_BOLD);
+
$graph->xaxis->
+title->SetFont(FF_FONT1
+,FS_BOLD);
+
$lineplot
+->SetColor("blue");
+
$lineplot
+->SetWeight(2);
+// Two pixel wide
Again please note the consistent interface. To change font you just + have to invoke the SetFont() method on the appropriate object. This + principle is true for most methods you will learn. The methods may be + applied to a variety of objects in JpGraph. So for example it might not + come as a big surprise that to have the Y-axis in red you have to say:
+ $graph->yaxis->SetColor
+("red")
or perhaps we also want to make the Y-axis a bit wider by
$graph
+->yaxis->SetWidth(
+2)
+
As a final touch let's add a frame and a drop shadow around the + image since this is by default turned off. This is done with
$graph
+->SetShadow()
The result of all these modifications are shown below.
The standard structure for an HTML page using client side image maps + would be something along the lines of
+ ++// Image map specification with name "mapname" +<MAP NAME=...> +... specification ... +</MAP> + +// Image tag +<img src="..." ISMAP USEMAP="mapname"> ++
This poses an interesting question.
+Since we normally call the graphing script directly in the <img> tag + how do we get hold of the image map (which is available only in the + image script) in this "HTML wrapper" script?
+In JpGraph there is actually two ways of solving this.
+The first (and preferred) way modifies the stroke method so that + instead of returning an image (like the standard Stroke() method) + StrokeCSIM() actually returns an HTML page containing both the image + map specification and the correct <IMG> tag.
+This of course means that it is necessary to treat an image map + returning image script differently from a non-CSIM image script, for + example you can't use it directly as the target for the "src" attribute + of the <IMG> tag since it sends back an actual HTML page containing + both an image tag together with an image map.
+By default the auto-scaling algorithm tries to make best possible + use of screen estate by making the scale as large as possible, i.e. the + extreme values (min/max) will be on the top and bottom of the scale if + they happen to fall on a scale-tick. So for example doing a simple line + plot could look like the plot shown in the below.
+However you might sometime want to add some extra to the minimum and + maximum values so that there is some "air" in the graph between the end + of the scale values and the extreme points in the graphs. This can be + done by adding a "grace" percentage to the scale. So for example adding + 10% to the y-scale in the image above is done by calling the + SetGrace() method on the yscale as in
+
+ $graph->yaxis->scale
+->SetGrace(10,
+10);
+
These lines add a minimum of 10% to the top and bottom values of the + scale. Note that we say "minimum" since depending on the specific tick + values choose this might be a little bit more to make the end of the + scale fall on an even tick mark.
+Adding this line to the previous graph will result in the following + example
+ +Since we haven't adjusted the position of the X-axis it will remain + at Y=0 which might not necessary be what we would like so we therefor + also add the line
+
+ $graph->xaxis->SetPos
+("min");
So that the X-axis always will remain at the lowest possible + Y-value. Doing this will then result in the example below
+ + +Semi filled bar graphs are in principle the same as normal filled + bar graphs but with the additional feature that you can choose to only + fill a specified range (or ranges) of X-coordinates. The figure below + illustrates this
+ + +In this example we defined two areas along the X-axis to be filled. + You can add filled areas by using the method + AddArea() and specifying range and color for the filled area.
+All patterns can be customized by
+
+
+ $band
+->prect->SetHorizon(
+$aHorizon)
+
assuming that the band is a 3D plane.
+To finish this section we give one final, more creative, example on + how to use the bands.
+ +As an additional way of emphasizing certain areas of the graph it is + possible to add bands (either vertical or horizontal) to any one of the + standard X-Y coordinate system based graphs. A band is a rectangular + area that stretches one entire axis. This means that if you define a + band between X-coordinates 3 and 5 the band area will occupy an area + between the X-coordinates and the entire Y-range.
+In order to access this functionality you must first make sure that + you include the additional library file jpgraph_plotband.php
+At the time of this writing (current as of JpGraph 1.8) the table + below illustrates the 8 basic types of patterns available. We will + shortly show you how you can customize these patterns, To keep these + examples clear we have only used one pattern in each figure.
+ ++ + | + + |
+ + | + + |
+ + | + + |
+ + | + + |
To add a one of these patterns to your graph you need to call the + method + PlotBand::PlotBand() The arguments is fairly easy to understand. + The pattern you would like to use is specified by using the correct + constant. You can see the name of the correct constants in the figures + above. You also need to specify if the band should stretch along the + vertical or horizontal axis as well as the min and max coordinates for + the band. As coordinates you may also use the special values "min" and + "max" which automatically sets the value to the minimum/maximum value + of the scale. The specified numeric value will be automatically + truncated to fit within the plot area.
+We don't discuss the other arguments further here, instead we refer + you to the class reference.
+JpGraph allows you to easy customize the appearance of the bar + graph, for example to change the width of each bar. The width of each + bar can be specified either as a fraction of the width between each + major tick or as an absolute width (in pixels).
+To set the width in fraction you use the method + SetWidth() and to set the width in pixels you use the + SetAbsWidth()
+As an example let's take the previous example and set the width to + 100% of the distance between the ticks. The example will now become
+ + +In addition to the bands you can also add static lines to the graph. + An example of that is actually shown in figure 11 above. You create a + line as an instance of + class PlotLine . So for example the lines
+ $sline
+= new PlotLine
+(HORIZONTAL,0,
+"black",2);
+
$graph->Add(
+$sline);
+
will add a 2-pixel wide horizontal static line at Y-position zero.
+You can easily choose to display the value (and it's format) on top + of each bar by accessing the bar's 'value' property. So for example by + just adding the line
+ $barplot->value->
+Show();
+
Will enable the values in it's simplest form and will give the + result
+You cane see a small nuisance in this graph. The auto scaling + algorithm chooses quite tight limits for the scale so that the bars + just fit. Adding the value on top of the bar makes it collide with the + top of the graph. To remedy this we tell the auto scaling algorithm to + allow for more "grace" space at the top of the scale by using the + method + SetGrace() which is used to tell the scale to add a percentage (of + the total scale span) more space to either one end or both ends of the + scale. In this case we add 20% more space at the top to make more room + for the values with the line
+ $graph->yaxis->
+scale->
+SetGrace(20);
This will then give the graph as shown below
+ +You can also adjust the general position of the value in respect to + the bar by using the + BarPlot::SetValuePos() method. You can set the position to either + 'top' (the default) , 'center' or 'bottom'. The graph below shows the + value being positioned in the center. In this example we have also + adjusted the format to just display the value as an integer without any + decimals.
+It is also possible to specify a more fine grained control on how + you want the values presented. You can for example, rotate them, change + font, change color. It is also possible to adjust the actual value + displayed by either using a printf()-type format string or with the + more advanced technique of a format callback routine.
+To show what you can do we just give another example for you to + examine without much further explanations. Just remember that to have + text at an angle other than 0 or 90 degrees we have to use TTF fonts. + Even though we haven't explained the SetFont() method it should be + fairly obvious.
+ +One simple way of making the bar graph more attracting is to add a + drop shadow to each bar. This is done by calling the + SetShadow() method. An example will clarify this.
+ +As you have seen from the previous examples bar graphs are normally + centered between the trick marks on a text scale. However, you can + modify this behavior by calling the method + BarPlot::SetAlign()
+These types of bar graph is used to easy group two or more bars + together around each tick (X-value). The bars will be placed + immediately beside each other and as a group centered on each tick + mark. A grouped bar is created by aggregating two or more ordinary bar + graphs and creating a + GroupBarPlot() From two ordinary bar graphs along the lines of
+// Create the bar plots
+
$b1plot
+= new BarPlot($data1y);
+
$b1plot->SetFillColor(
+"orange");
+
+
$b2plot
+= new BarPlot($data2y);
+
$b2plot->SetFillColor(
+"blue");
+
+
// Create the grouped bar plot
+
$gbplot
+= new GroupBarPlot
+(array($b1plot
+,$b2plot));
+
+
// ...and add it to the graPH
+
$graph->Add(
+$gbplot);
+
The following example illustrates this type of graph
+There is no limit on the number of plots you may group together.
+If you use the SetWidth() method on the GroupBarPlot() this will + affect the total width used by all the added plots. Each individual bar + width will be the same for all added bars. The default width for + grouped bar is 70%.
+Setting the grouped with to 0.9 would result in the image below.
+ +The final variety of group bars you can have are accumulated bars. + They work in much the same way as accumulated line plots described + above. Each plot is stacked on top of each other.
+You create accumulated bar plots in the same way as grouped bar + plots by first creating a number of ordinary bar plots that are then + aggregated with a call to + AccBarPlot();
+An example makes this clear. Let's use the same data as in the two + examples above but instead of grouping the bars we accumulate (or + stack) them. The code would be very similar (actually only one line has + to change)
+ +It is perfectly possible to combine the previous bar types to have + grouped accumulated bar plots. This is done by just adding the + different accumulated plots to a group bar plot, for example the + following code would do that.
+
+// Create all the 4 bar plots
+
$b1plot
+= new BarPlot($data1y);
+
$b1plot->SetFillColor(
+"orange");
+
$b2plot
+= new BarPlot($data2y);
+
$b2plot->SetFillColor(
+"blue");
+
$b3plot
+= new BarPlot($data3y);
+
$b3plot->SetFillColor(
+"green");
+
$b4plot
+= new BarPlot($data4y);
+
$b4plot->SetFillColor(
+"brown");
+
+
// Create the accumulated bar plots
+
$ab1plot
+= new AccBarPlot
+(array($b1plot
+,$b2plot));
+
$ab2plot
+= new AccBarPlot
+(array($b3plot
+,$b4plot));
+
+
// Create the grouped bar plot
+
$gbplot
+= new GroupBarPlot
+(array($ab1plot
+,$ab2plot));
+
+
// ...and add it to the graph
+
$graph->Add(
+$gbplot);
+
Putting this together in an example would then produce the graph as + shown below
+ +It can often come in handy to have horizontal bar graphs especially + if you have a large number of values to display. Even though JpGraph + doesn't directly support horizontal bar graphs this is easy achieved by + constructing a normal vertical bar graph which is then rotated 90 + degrees.
+The example below shows a simple example of this
+ +In order to achieve this effect you should study the above example + carefully and you might notice two things
+We finally show three more examples of horizontal bar plots. In the + first plot we have hidden the Y-axis and in the second we have + positioned the Y - axis at top as opposed to the bottom as the first + example shows.
+ + + +In the final example which is almost similar to the two first we + illustrate the use of labels with more than one line.
It is possible to use color gradient fill for the individual bars in + the bar graph.
+Color gradient fill fills a rectangle with a smooth transition + between two colors. In what direction the transition goes (from left to + right, down and up, from the middle and out etc) is determined by the + style of the gradient fill. JpGraph currently supports 8 different + styles. All supported styles are displayed in the figure below.
+ + + + + + + + +To specify a gradient fill for the bar plots you make use of the + method + BarPlot::SetFillGradient() . See the class reference for details of + this function.
+When using gradient fills there are a couple of caveats you should + be aware of:
+Jpgraph also supports 2D vertical bar plots. Before you can use any + bar plots you must make sure that you included the file + "jpgraph_bar.php" in your script.
+Using bar plots is quite straightforward and works in much the same + way as line plots which you are already familiar with from the previous + examples. Assuming you have a data array consisting of the values + [12,8,19,3,10,5] and you want to display them as a bar plot. This is + the simplest way to do this:
+ $datay=array(12,
+8,19,3
+,10,5);
+
$bplot
+= new BarPlot($datay);
+
$graph->Add(
+$bplot);
+
If you compare this to the previous line examples you can see that + the only change necessary was that instead of creating a new line plot + (via the new LinePlot(...) call) we used the statement new + BarPplot().
+The other change we should do is to make sure the X-axis have an + text-scale (it is perfectly fine to use a linear X-scale but in most + cases this is not the effect you want when you use a bar graph, see + more below). With this two simple change we will now get a bar graph as + displayed in the following image
+You can of course modify the appearance of the bar graph. So for + example to change the fill color you would use the + BarPlot::SetFillColor() method. Making this small change to the + previous example would give the expected effect as can be seen in the + next example.
+To turn a standard image script into a CSIM script the first thing + needed to do is to supply the appropriate URL targets for the hotspots + in the image.
+What the hotspots represent depends on the type of plot you are + doing. The following plot types and graph areas support image maps.
+To specify a link for each hotspot you have to use the + SetCSIMTargets() method for each plot (or specific area) in the + graph which should be a hotspot.
+There are two arguments to this method
+A line error plot is an error plot with the addition that a line is + drawn between the average value of each error pair. You use this type + of plot the exact same way you would use an error plot. The only change + is that you must instantiated an + ErrorLinePlot() instead and make sure you have included the + "jpgraph_line.php" since the line error plot makes use of the line plot + class to stroke the line.
+To control the various properties of the line drawn the "line" + property of the error line plot may be accessed. So, for example, if + you want the line to be 2 pixels wide and blue you would have to add + the following two lines
+ $elplot->line->
+SetWeight(2);
+
$elplot->line->
+SetColor(
+"blue");
+
to generate the graph as shown below
+You may of course add legends to none, one or both of the line types + in the above graph. So for example if we wanted the legend "Min/Max" + for the red error bars and a legend "Average" for the blue line you + would have to add the lines
+ $errplot->SetLegend(
+"Min/Max");
+
$errplot->line->
+SetLegend(
+"Average");
+
The resulting graph will now look like (note that we are using the + default placement of the legend box)
+ +Error plots are used to visually indicate uncertainty in data + points. This is done by for each X value by giving both a minimum and a + maximum Y-value.
+Before you can use error plots you must remember to include the file + "jpgraph_error.php" in your script.
+The following example illustrates a simple error bar. We will have 5 + points, so we need 10 Y-values. We also would like the error bars to be + red and 2 pixels wide. All this is accomplished by creating an + ErrorPlot() in much the same way as, for example, a normal line + plot. Doing this would now give the example shown below.
+ +You might notice that there is one displeasing esthetic quality of + this graph. The X-scale is just wide enough to just accompany the + number of error bars and hence the first bar is drawn on the Y-axis and + the and last bar just at the edge of the plot area. To adjust this you + might call the SetCenter() + method which will adjust the X-scale so it does not use the full width + of the X-axis.
+The following example illustrates the use of this feature by + applying this technique to the previous example
+ +The simplest way of creating a creating a CSIM image is with the + StrokeCSIM() method. As mentioned before this method actually returns a + (small) HTML page containing both the image-tag as well as the image + map specification. Hence it is not possible to use a script that + ends with this method in a standard image-tags src property.
+There are two ways to create CSIM (or get hold of) the image maps
+
+
+<a href="mycsimscript.html">
+
+
This has the drawback that the image page will only contain the
+ image and nothing else.
+
+<h2> This is an CSIM image </h2>
+
+<?php
+include "mycsimscript.php"
+?>
+
+
The process to replace Stroke() with StrokeCSIM() is strait forward. + Replace all existing calls to Stroke() with the equivalent calls to + StrokeCSIM().
+ The only difference is that it is necessary ti supply a minimum of
+ one file name in the StrokeCSIM() method. The first argument must be
+ the name of the actual image script file including the extension. So
+ for example if the image script is called "mycsimscript.php" it is
+ necessary to write
+
+ $graph->
+StrokeCSIM(
+'mycsimscript.php')
+
+
However, it is possible to apply a small "trick" here. PHP maintain
+ a special variable called "__FILE__" which is always set to the current
+ file name. This means you could use the following construction:
+ $graph->
+StrokeCSIM(
+basename(
+__FILE__))
+
This is a better way since the script can now be renamed without + having to change any code in the file which otherwise would be needed.
The other arguments to StrokeCSIM() are optional. Please note that + if several CSIM images are used in the same HTML page it is also + necessary to specify the image map name as the second parameter since + all image maps must be unique to properly match each image map against + each image. Please consult the class reference + StrokeCSIM() for more details.
+In the Example/ directory there are a number of examples of how to + setup the various types of image maps. The following examples are + currently available
+In order to easily access all of these examples it is possible to + call the testsuit.php example with an additional argument "t=2". + By following the link +testsuit.php?t=2 a separate window will open with all the possible + CSIM examples.
+Scatter plots are very simple; they plot a number of points + specified by their X- and Y-coordinate. Each point is stroked on the + image with a mark as with line plots. The stroked marks can also be + connected with an optional line.
Even though you would normally supply X-coordinates it is still + perfectly possible to use a text-scale for X-coordinates to just + enumerate the points. This is especially useful when using the + "Impulse" type of scatter plot as is shown below.
+Scatter pots are created by including the jpgraph extension + "jpgraph_scatter.php" and then creating an instance of plot type of + ScatterPlot(). To specify the mark you want to use you access the mark + with the instance variable "mark" in the scatter plot. The default is + to use an unfilled small circle.
+To create a scatter plot you will create an instance
+A simple example using just default values will illustrate this
+ +We can easily adjust the size and colors for the markers to get + another effect as shown below
+Another possible variant of scatter plot is impulse-scatter plots. + This is a variant of normal scatter plot where each mark have a line + from the mark to the Y=0 base line. To change a scatter plot into an + impulse scatter plot you have to call the method + SetImpuls() on the scatter plot.
+This type of plots are often used to illustrate signals in + conjunction with digital signal processing. The following two examples + illustrates simple use of impulse plots.
+The next example shows how to modify the color and width of the + impulse plot
+As a final touch we show two more advanced impulse graphs . In these + graphs we have used more advanced formatting for the Y-axis labels as + well as adjusted the position of the axis position.
A variant of scatter plot is the so called Field Plots this + is basically a scatter plot where each scatter point is an arrow with a + direction between 0 to 359 degrees. This effectively allows the + visualization of 3 parameters at each point (x,y,angle). As an + additional bonus there is also possible to define a callback for each + scatter plot to also define the color for each point.
+To create a field plot you create an instance of +FieldPlot in the same way as you created a normal scatter plot. The + arguments to this method are Y-coordinate, X-coordinate and angle. To + specify a callback you use +FieldPlot::SetCallback()
+The following example (and code) illustrates the usage of the field + plot type.
+ +In addition to the parameters mentioned above you can also adjust + both the general size of the arrow and also the specific size of the + arrowhead. The arrow size is specified in pixels and the arrow head is + specified as an integers between 0 and 10. These sizes are specified + with a call to +FieldPlot::arrow::SetSize()
+Knowledge of the exact technical details of the way StrokeCSIM() + works is probably not needed by many people but for completeness we + outline those details in this short section.
+The fundamental issue we have to solve is that we must be able to + call the image script in two modes. When the user includes the image + script the StrokeCSIM() method should return the HTML page but when the + image script is later called directly in the image tag it must not + return an HTML page but rather the actual image.
+The way this is solved is by using one HTTP argument which is passed + on automatically when we use the image script name in the image-tag.
+If you look at the generated HTML you will see that the argument to + the src-property of the image tag is not simply the script name but the + script name with a additional argument.
+In the JpGraph internal code this pre-defined argument is checked + for and if it exists the image is send back and not the HTML page.
+The name of this argument is defined by a DEFINE() statement in + JpGraph. The define is _CSIM_DISPLAY.
+Stock charts is used to display data values where one is interested + in 4 different values for each data point. This could for example be + used to display a stocks open,close, min and max value during a + specific day. Hence the name Stock chart (or Stock plot).
+The figure below illustrates a sample Stock chart plot
+For this type of plot the Y-data array must be consist of a number + of quadruples of data where each quadruple consists of + (open,close,min,max). The open and close values determine the min max + for the middle bar and the min,max determine the end points of the + "error-lines" at the top and bottom of of each bar.
+Note that the data follows the following rules
+To separate the two cases where "open > close" or "open < close " + different colors are used. These colors are specified with the +SetColor() method. By default a positive bar (close > open) have a + fill color of white and for the negative case where (close < open) the + bars have a red color.
+You can specify the width of the bar by setting the width (in + pixels) with a call to the method +SetWidth()
+The final variation of stock plots you can have is to determine + whether or not the end point for the min,max lines should have the + horizontal line marking the end of the line or not. This can be + adjusted with a call to method +HideEndLine().
+A minor variation of stock charts is the "BoxPlot()" this is almost + the same as StockPlot() but with the very small difference that in + addition to the open,close,min, max values you also specify a median + value . The median lies between the open and close value and is + illustrated as a horizontal line within the bar.
+You may modify the median line color for positive and negative data + points / bars by using the +SetMedianColor() method.
+In the same way as for other plots you may associate an image map + with these plots. The "hot" area for each plot is the mid "bar" + section. In the same way as other plot types you use the + SetCSIMTargets() to set the URLs you want to use.
+These plot types, though normally used without explicit X-values, + can of course handle a supplied X-coordinate array without any problem.
+JpGraph offers two variation on what is usually known as stock + charts, candle-charts or box plot.
+In the case where you want to store the image on disk and later use + it in an img-tag you need to get hold of the image map. For this you + will have to use the function + Graph::GetHTMLImageMap()
+An example of the use of this is shown below. With these lines the + image will be written to a file. The script then returns a HTML page + which contains the Client side image map and an img-tag which will + retrieve the previously stored file.
+ $graph->Stroke(
+"/usr/local/httpd/htdocs/img/image001.png"
+);
+
echo $graph
+->GetHTMLImageMap
+("myimagemap001"
+);
+
echo
+"<img src=\"img/image001.png\" ISMAP USEMAP=\"#myimagemap001\" border=0>"
+;
+
It is perfectly legal to add several different plot types to the + same graph. It is therefore possible to mix line plots with (for + example) filled bar graphs. What you should keep in mind doing this is + the order in which these plots are stroked to the image since a later + stroke will overwrite a previous one. All plots are stroked in the + order you add them, i.e. the first plot added will be stroked first. + You can therefore control which plot is placed in the background and + which one is placed in the foreground by the order you add them to the + plot.
+To start simple we just mix a filled line plot with a non-filled + line plot as the following example shows.
+ + +Let's now go to something a little bit more complicated. How to mix + bar and line graphs. Let's just take one of our previous bar graphs and + add a line plot to it and see what happens.
+ +Not too bad. But we can't see the line so we change the order in + which we add the lines to the graph and sees what happens.
+ +If you want the line points to be aligned in the center of the bars + you can accomplish this is two ways.
+If you use a text scale then you need to call the + LinePlot::SetBarCenter()
You can also use an integer scale. This places both + the bar and the line points centered at the tick marks. As the + following example will show
+ +As a final example we show how you can combine a scatter plot and a + line plot which could be used to illustrate a regression line fitting.
+ +For version 1.9 the cache system has been extended to include even + the CSIM maps. For each CSIM graph two files are stored in the cache, + the image file itself as well as the wrapper HTML with the actual image + map. For further information see the chapter on "Understanding the + Cache system"
+Normally the automatic scaling should be doing an adequate job in + most circumstances but there might be cases where you like to manually + set the scale. For example if you have several graphs where you like to + be able to easily compare them and therefore want them all to have the + same scale.
+To specify a manual scale you have to add arguments to the standard Graph::SetScale() method. + So to specify that you want an Y-scale between 0 and 100 you need to + write
+ $graph->
+SetScale(
+"textlin",0,100
+);
When you specify a scale manually there is one additional thing you + need to decide. How the tick marks should be positioned. You have three + choices
+
+ $graph->SetScale(
+"textlin",0,100
+);
+
$graph->yscale->
+ticks->Set(10
+,5);
Will set the major tick marks every at 0,10,20,.. And every minor + tick mark in between (0,5,10,15,20,25,...).
+The three images below illustrates the difference between the + possibilities of ticks for a manual scale.
+ + + + + +You can adjust the automatic tick marks by telling JpGraph how dense + you want them to be. You use the + Graph::SetTickDensity() method. You can set the density setting in + four steps
+Taking the previous example with the manual scale but automatic + ticks and using a denser ticks setting gives the following result
+ +Image maps, or client side image (CSIM) as they are known is fully + supported in JpGraph. It gives you the opportunity to create hot-spots + in the graphs which allows you to build a set of "drill-down" graphs.
+In the following section is based on the assumption that the reader + is familiar with the basic concepts of client side image map in HTML.
+To shortly recapitulate. Client side image maps consists of two + parts. The first part is the actual image and the second part is a + mapping that gives the coordinates for areas in the image which should + be marked as hot spots (i.e. click-able by the user). The library can + automatically generate these coordinate maps from a given graph.
+Through out the manual areas of the graph that may be used as a + hotspot is given in conjuction with the general description of that + area.
+The purpose of this chapter is to introduce the basic concepts of + creating scripts with JpGraph that will generate various types of basic + plots. Throughout the text it is possible to view the exact source for + all the graphs by clicking on the "[src]" link in the caption of the + image shown. This will open the image together with the source in a + separate window. This way it is easy to compare the actual image with + the script that generated the image.
+The easiest way to get a date time scale for the X-axis is to use + the pre-defined "dat" scale. To be able to use that it is first + necessary to include the module "jpgraph_date.php" and the + specify the scale, for example as "datlin" in the call to SetScale() + as the following code snippet shows.
+ require_once("../jpgraph.php");
+
require_once("../jpgraph_line.php");
+
require_once("../jpgraph_date.php");
+
...
+
$graph
+= new Graph(540,
+300);
+
$graph->SetScale(
+'datlin');
+
...
The above code snippet would create a date/linear scale for the + graph. We will first show a basic use of the date scale and then go on + to illustrate how it is possible to tailor the exact formatting of the + date axis.
+When using the fully automatic formatting the library will use the + shortest possible string that uniquely identifieas a date/time. For + example if the entire intervall falls within the same day only the time + values will be displayed, if the intervall falls over several days then + also the date will be added to the label.
+As usual it is also possible to manually force a certain label + formatting to be used this is illustrated below.
+The first basic example below creates a data set that emulates a + sample rate every S second and falls over a total period of two days. + It is important to note that the input data on the X-axis must be a in + the form of timestamp data, i.e. the number of seconds from the system + epoch. In PHP the current timestamp value is returned by the function + time().
+This means that it is always mandatory to specify two input vectors + for a plot. For example to specify a line plot
+ $line
+= new LinePlot
+($data,$xdata);
+
The example below show this in practice
+Please review the script (by following the [src] link) that creates + this graph before continuing since we will base all further examples on + the above example.
+As can be seen from the above example the scale starts slightly + before the first data point. Why? This is of course by purpose in order + to make the first time label to start on an "even" value, in this case + on an hour. Depending on the entire interval of the graph the start + value will always be chosen to be the largest "even" time value, this + could for example be on an even minute, even 30min, even hour, even + day, even week and so on.
+The alignment of the start (and end) vdate alignment can also be + adjusted manually by using the two methods
+These method allow the alignment to be made by specifying one of the + following constants.
+For the SetTimeAlign() the following symbolic constants can be used
+For the SetDateAlign() the following symbolic constants can + be used
+Some examples will calrify the use of these methods.
+Example 1. We want the time adjustment to start on an even + quarter of an hour, i.e. an even 15 minute period.
$graph
+->xaxis->scale->
+SetTimeAlign(
+MINADJ_15);
+
Example 2. We want the time to start on an even 2 hour
$graph
+->xaxis->scale->
+SetTimeAlign(
+HOURADJ_2);
+
Example 3. We want the start to be on an even day
$graph
+->xaxis->scale->
+SetDateAlign(
+DAYADJ_1);
+
The default label format always tries to use the shortest possible + unique string. To manually set a manual scale the method + SetDateFormat() is used for example as in
+ $graph
+->xaxis->scale->
+SetDateFormat(
+'H:i');
+
The above example will force the labels to be displayed as hour (24h) + and minutes.
As with the linear scale it is possible to indicate what density of + scale ticks is needed. This is specified as usual with a call to + Graph::SetTickDensity()
+ $graph->SetTickDensity(
+TICKD_DENSE);
+
In the following we will assume that all data points are specified + by a tuple where the date/time is specified as a timestamp in second in + the same format as is returned by the PHP function time().
+The trick here is to use a label formatting callback routine which + gets called to format each label on the scale.
+What we do is that we specify that the X-scale should be an ordinary + "int" scale (remember that the data values are timestamps which are + integers). We then install our custom label callback (with a call to + SetLabelFormatCallback()) which given a timestamp formats it to a + suitable human readable form. In our example we will use the PHP + function Date() for this purpose.
+The callback we use will be
+
+// The callback that converts timestamp to minutes and seconds
+
function
+TimeCallback(
+$aVal) {
+
return Date
+('H:i:s',$aVal);
+
}
Using some random data we can now generate the following graph
In the above example we have specified the X-scale manually to make + sure that the min/max values on the X-axis exactly matches the min/max + x-data values.
+SetLabelFormatCallback() will be called for each of the displayed + labels and the argument passed on to the supplied function is the + default label that the library is assigning that specific label.
+This means that if the data to be displayed is based on, for + example, timestamps which are given in seconds the displayed value + might not be aligned to how time/date values normally should be + displayed.
+Using integer scales this will not work very well since the library + determines label positions to be at even positions (e.g. every 2,5,10, + 20,50,100 etc) to suit the auto-scaling since the library will assume + that the data is integers and not timestamp values.
+The best way to solve this is to use an integer X-scale together + with a a callback function with a manually specified scale. In order to + setup the scale a bit of manually work is needed. Depending on the data + to be displayed one should ensure that the scale starts and ends at + suitable times and that the tick interval chosen fits with an even + multiple of minutes, hours, days or what is best suited for the time + range that is to be displayed.
+The following code example illustrates this. It creates some "fake" + data that is assumed to be sampled time based data and sets up some + suitable scales and tick interval. This script may be used as a basis + for more advanced handling of the time data.
<?php
+
+// Example on how to treat and format timestamp as human readable labels
+
require_once(
+"../jpgraph.php");
+
require_once("../jpgraph_line.php");
+
+
// Number of "fake" data points
+
DEFINE('NDATAPOINTS',
+500);
+
+
+// Assume data points are sample every 10th second
+
DEFINE('SAMPLERATE',
+10);
+
+
+// Callback formatting function for the X-scale to convert timestamps
+
// to hour and minutes.
+
function
+TimeCallback(
+$aVal) {
+
return Date
+('H:i', $aVal);
+
}
+
+
// Get start time
+
$start = time();
+
+// Set the start time to be on the closest minute just before the "start" timestamp
+
$adjstart
+= floor($start /
+60);
+
+
+// Create a data set in range (20,100) and X-positions
+
+// We also apply a simple low pass filter on the data to make it less
+
// random and a little smoother
+
$data
+= array();
+
$xdata
+= array();
+
$data[0] =
+rand(20,100
+);
+
$xdata[0] =
+$adjstart;
+
for( $i=1;
+$i <
+NDATAPOINTS; ++
+$i ) {
+
$data[$i] =
+rand(20,100
+)*0.2 + $data[
+$i-1]*0.8
+;
+
$xdata
+[$i] = $adjstart +
+$i *
+SAMPLERATE;
+
}
+
+
+// Assume that the data points represents data that is sampled every 10s
+
// when determing the end value on the scale. We also add some extra
+
// length to end on an even label tick.
+
$adjend = $adjstart + (
+NDATAPOINTS+10)*10
+;
+
+
$graph
+= new Graph(500,
+250);
+
$graph->SetMargin(
+40,20,30
+,50);
+
+
+// Now specify the X-scale explicit but let the Y-scale be auto-scaled
+
$graph->SetScale(
+"intlin",0,0
+,$adjstart,$adjend);
+
$graph->title->
+Set(
+"Example on TimeStamp Callback");
+
+
+// Setup the callback and adjust the angle of the labels
+
$graph->xaxis->
+SetLabelFormatCallback(
+'TimeCallback');
+
$graph->xaxis->
+SetLabelAngle(
+90);
+
+
+// Set the labels every 5min (i.e. 300seconds) and minor ticks every minute
+
$graph->xaxis->
+scale->ticks->Set
+(300,60);
+
+
$line
+= new LinePlot
+($data,$xdata);
+
$line->SetColor(
+'lightblue');
+
$graph->Add(
+$line);
+
+
$graph->Stroke();
+
?>
+
With date/time scale we refer to the plotting of data where the + independent variable (X-axis) de-nominates a time value. This could for + example be the temperature measured in intervals during a day.
+From version 1.18 and onwards there are two principal ways of + handling date/time scales. The manual way and fully automatic using the + special "dat" scale. For most cases the automatic "dat" scale is the + preferred choice but in rare circumstances it might be more appropriate + to use the manual way since it gives slightly more control (but not + that much) of the overall handling of scales.
+To be able to use a date/time scale at all we will assume that the + data points are represented by both an X coordinate (time-value) and a + Y-value (anything else wouldn't make sense).
+We first start by describing the use of the "dat" scale.
+By default only the Y-axis have grid lines and then only on major + ticks, i.e. ticks which have a label. It is of course possible to + change this. Both the X , Y and Y2 can have grid lines. It is also + possible to let the gridlines also be drawn on the minor tick marks, + i.e. ticks without a label. Lets see how we can apply this to the graph + above.
+The grid is modified by accessing the xgrid (or ygrid) component of + the graph. So to display minor grid lines for the Y graph we make the + call
+ $graph->ygrid->Show
+(true,true)
+
The first parameter determines if the grid should be displayed at + all and the second parameter determines whether or not the minor grid + lines should be displayed.
+If you also wanted the grid lines to be displayed for the Y2 axis + you would call
+ $graph->
+y2grid->Show(true
+,true)
Note. In general it is not a good idea to display + both the Y and Y2 grid lines since the resulting image becomes + difficult to read for a viewer.
+We can also enable the X-grid lines with the call
$graph
+->xgrid->Show(
+true)
+
In the above line we will of course only just enable the major grid + lines.
+To bring all this together we will display a graph with grid lines + for both Y and X axis enabled.
Another option for the grid lines is the possibility to have the + area between the grid lines filled with alternating two colors. The + example below illustrates this.
+In the example above we have also made use of alpha-blending + (requires GD 2.x or higher). By default the filled grid lines are + disabled. To enable this style you have to call the +Grid::SetFill() method.
+You might want to have specific labels you want to use for the + X-axis when this has been specified as a "text" scale. In the previous + example each Y-point might represent a specific measurement for each of + the first 10 month. We might then want to display the name of the + months as X-scale.
+To specify the labels on the scale you make use of the + SetTickLabels() method.
+To get a localized version of the name of the month you can use a + nice feature in JpGraph, the global '$gDateLocal' object which is an + instance of the + DateLocale
+This class has a number of methods to get localized versions of + relevant names for dates, (months and weekdays).
+So to specify the X-axis with the short form of the month names we + use the construction
+ $a =
+$gDateLocale->
+GetShortMonth();
+
$graph->xaxis->
+SetTickLabels(
+$a);
+
This will, now result in the image displayed below
+As can be seen in the previous example the X-axis is slightly + cluttered with the labels very close to each other. We might rectify + this by either enlarging the image or just displaying fewer tick label + on the x-axis.
+Specifying that we only want, for example, to print every second + label on the axis is done by a call to the method + SetTextLabelInterval() Which would result in the graph
+ +If the text labels are long (for example full dates) then another + way might be to adjust the angle of the text. We could for example + choose to rotate the labels on the X-axis by 90 degrees. With the help + of the SetLabelAngle() +
+Which would then result in the image below
+Using a filled line plot is not much different from using a normal + line plot, in fact the only difference is that you must call the method + SetFillColor() + on a normal line plot. This will then fill the area under the line + graph with the chosen color.
+In the example below we have also, as an example, specified plot + marks (see previous sections).
+Note 1. If you add multiple filled line plots to + one graph make sure you add the one with the highest Y-values first + since it will otherwise overwrite the other plots and they will not be + visible. Plots are stroked in the order they are added to the graph, so + the graph you want front-most must be added last.
+Note 2. When using legends with filled line plot + the legend will show the fill color and not the bounding line color.
+Note 3. Filled line plots is only supposed to be + used with positive values. Filling line plots which have negative data + values will probably not have the appearance you expect.
+As you can see from the graph above the grid lines are below the + filled line graph. If you want the grid lines in front of the graph you + can adjust the depth with call to + Graph::SetGridDepth() As the following example shows
+ +Accumulated line graphs are line graphs that are "stacked" on top of + each other. That is, the values in the supplied data for the Y-axis is + not the absolute value but rather the relative value from graph below. + For example if you have two line graphs with three points each, say + [3,7,5] and [6,9,7]. The first graph will be plotted on the absolute + Y-values [3,7,5] the second plot will be plotted at [3+6, 7+9, 5+7], + hence the values of the previous graphs will be used as offsets.
+You may add any number of ordinary line graphs together. If you want + to use three line plots in an accumulated line plot graph you write the + following code
+
+ // First create the individual plots
+
$p1 = new LinePlot(
+$datay_1);
+
$p2 = new LinePlot(
+$datay_2);
+
$p3 = new LinePlot(
+$datay_3);
+
+
+// Then add them together to form a accumulated plot
+
$ap = new AccLinePlot(array($p1,
+$p2,$p3));
+
+
+// Add the accumulated line plot to the graph
+
$graph->Add(
+$ap);
+
You might of course also fill each line plot by adding the lines
$p1
+->SetFillColor
+("red");
+
$p2->SetFillColor(
+"blue");
+
$p3->SetFillColor(
+"green");
+
Using some appropriate data this might then give a graph perhaps + like the one showed in the figure below
+ +If you only have access to a few data points but still want a smooth + curve between those data points JpGraph can help you achieving that by + letting you construct cubic splines. If you never have heard of cubic + splines before, don't worry. You only have to supply the data points + you know tell JpGraph how many interpolated points in total you want in + the graph. JpGraph will now take care of constructing a smooth curve + between all you data points. The new, smooth, curve will be made up of + exactly as many interpolated points as you have specified.
+To construct a spline you need both the X and Y coordinates for the + known data points.
+You start by constructing a new Spline instance. To + get access to the Spline class you must first remember to include the + file "jpgraph_regstat.php". You instantiate this class by calling it + with your two known data arrays (X and Y) as follows.
$spline
+= new Spline($xdata,
+$ydata);
+
This call initializes the spline with the data points you have. These + data points are also known as Control points for the spline. + This helper class doesn't draw any line itself. Instead it is merely + used to get a new (larger) data array which have all the interpolated + values. You then use these new value in your plot. This way give you + great flexibility in how you want to use this interpolated data.
+Continuing the above line we now use the Spline::Get() + method to get an interpolated array containing a specified number of + points. So for example the line
+ list(
+$sdatax,
+$sdatay) =
+$spline->Get(50
+);
Will construct the two new data arrays '$sdatax' and '$sdatay' which + contains 50 data points. These two arrays are constructed from the + control point we specified when we created the '$spline' object.
+You would then use these two new data array in exactly the same way + as you would form ordinary data vectors.
+The following example illustrates this
+In order to make the example more interesting we actually use two + plots. First a line plot to get the smooth curve and then a standard + scatter plot which is used to illustrate where the control points are.
+To emphasize the specific data points it is possible to add plot + marks at each data point. Plot marks can be either
+You access the plot mark through the "mark" instance variable in the + plot, as in
+ $lineplot->
+mark->SetColor("red"
+);
To choose between the different plot marks you call the +PlotMark::SetType() method with the correct define to choose the + plot type you want to use.
+The simple shape type of plot marks are
+To specify an arbitrary image you use the special define
+In this case you must also specify a image file name and an optional + scaling constant. For example as in
+ $lineplot->mark->
+SetTYPE(
+MARK_IMG,
+"myimage.jpg",
+1.5);
+
If you want to use one of the built-in images the following images + are available. Please note that not all images are available in all + possible colors. The available colors for each image is listed below.
+The following shape (the first class) plot marks are available
+For the second class (built-in images) the following table list the + different images as well as what color they are available in. For the + built-in images you specify the color with the second argument.
+Note that some of the images are available in different sizes. The + reason is that even though you can scale them by the third argument + there is a visual degradation to scale an image larger than it's + original size since some pixels needs to be interpolated. Reducing the + size with a scale < 1.0 gives much better visual apperance.
+The scaling works with both GD 1 and GD 2 but with GD 2 the quality + of the scaling is much better.
+Built-in images and available colors:
+Type | Description | Colors |
---|---|---|
MARK_IMG_PUSHPIN, MARK_IMG_SPUSHPIN | Push-pin image | +'red','blue','green','pink','orange' |
MARK_IMG_LPUSHPIN | A larger Push-pin image | +'red','blue','green','pink','orange' |
MARK_IMG_BALL, MARK_IMAGE_SBALL | A round 3D rendered ball | +'bluegreen','cyan','darkgray','greengray', + 'gray','graypurple','green','greenblue','lightblue', + 'lightred','navy','orange','purple','red','yellow' |
MARK_IMAGE_MBALL | A medium sized round 3D rendered ball | + 'blue','bluegreen','brown','cyan', + 'darkgray','greengray','gray','green', + 'greenblue','lightblue','lightred', 'purple','red','white','yellow' | +
MARK_IMAGE_LBALL | A large sized round 3D rendered ball | + 'blue','lightblue','brown','darkgreen', + 'green','purple','red','gray','yellow','silver','gray' |
MARK_IMAGE_SQUARE | A 3D rendered square | +'bluegreen','blue','green', 'lightblue','orange','purple','red','yellow' | +
MARK_IMG_STAR | A 3D rendered star image | +'bluegreen','lightblue','purple','blue','green','pink','red','yellow' | +
MARK_IMG_DIAMOND | A 3D rendered diamond | +'lightblue','darkblue','gray', 'blue','pink','purple','red','yellow' | +
MARK_IMG_BEVEL | A 3D rendered bevel style round ring | +'green','purple','orange','red','yellow' |
It might sometimes be desirable to highlight the data-points with + marks in the intersection between the given x and Y-coordinates. This + is accomplished by specifying the wanted plot mark type for the "mark" + property of the line graph. A full list of all available marks is given + in the class reference +PlotMarks
+For now let's just add a triangle shape marker to our previous graph + by adding the line
$lineplot->
+mark->SetType(MARK_UTRIANGLE
+);
This will give the graph as shown below
+ +If you like you can of course both change the size, fill-color and + frame color of the chosen plot mark.
+The colors of the marks will, if you don't specify them explicitly, + follow the line color. Please note that if you want different colors + for the marks and the line the call to SetColor() for the marks must be + done after the call to the line since the marks color will always be + reset to the lines color when you set the line.
+In the following section we will work through an number of examples + on how to manipulate labels on a text scale. Primarily we will + investigate how to best handle the case where you have a large number + of values.
+As a remainder; Text scale is meant to be used on the X-axis when + the X-axis doesn't have a numeric value, i.e you are only interested in + linear ordering of the data. If you don't specify the labels manually + they will be set automatically starting from 1 as the example below + shows.
+ + +To specify the labels on the X-axis as suitable text strings you + call the method + Axis::SetTickLabels() with an array containing the text-labels. If + there are more data points than labels the non-specified labels will be + given their ordinal number. If we augment the previous example with the + name of the month we get the following new example
+ + + +What happen now if we have a larger number of bars? Let's try with + 25 bars and see what result we get.
+ + +Not all to impressive. The labels are to close and they overlap. + Hence it is not a good idea to display every label. To adjust what + labels are to be displayed you use the + SetTextLabelInterval() method. The argument to this method is the + interval between text labels. So to display only every 3 month you + would add the line
+
+ $graph->xaxis->SetTextLabelIntervall(3
+)
Which would give the result shown below
+ +Much better, quite readable.
+If we have an even larger data set it might not longer be meaningful + to display all the tick marks since they would simple become to close. + In JpGraph there is a possibility to specify that you only would like + every n:th tick mark to be visible ( + SetTextTickIntervall() ). For bar graphs using text scale however, + that might not be such a good idea since the tick marks are between the + bars and the labels centered under the bars. If we only were to + display, say, every 3 tick mark it wouldn't look to good. Not that we + can't do it, as the example below shows, but it just doesn't look very + good.
+ +A better way to handle large data set is simply to hide the tick + marks all together. Tick marks may be hidden by calling the method + Axis::HideTicks(); If we hide all the ticks on the X-axis we will + get the result shown below
+ +Let's start by creating a very simple radar plot based on 5 data + points using mostly default values.
+As the first thing you must remember to include the extension module + that contains the radar plot. "jpgraph_radar.php".
+A very simple radar plot is created by the code
<?php
+
include (
+"../jpgraph.php");
+
include ("../jpgraph_radar.php");
+
+
// Some data to plot
+
$data
+= array(55,80,
+46,71,95
+);
+
+
// Create the graph and the plot
+
$graph
+= new RadarGraph
+(250,200,
+"auto");
+
$plot
+= new RadarPlot
+($data);
+
+
// Add the plot and display the graph
+
$graph->Add(
+$plot);
+
$graph->Stroke();
+
?>
and would give the result
+To change the size and position of the radar graph is similar to the + pie plot and you do it by using the methods + SetSize() and + SetCenter()
+If you want a filled radar plot you need to specify the fill color + with the method + SetFillColor() The following example shows these methods in action
+ +To add clarification or other information text strings to the graph + you can add arbitrary lines of text anywhere you like onto the graph. + The text might have multiple lines and you can choose the paragraph + alignment.
+To add text you have to create one or more instances of the + Text() object and then add the text object to the graph with the + AddText() method.
+The position of these text boxes are given as fraction of the width + and height of the graph. When you are positioning these text boxes you + might also choose what part of the text box should be considered the + anchor point for the position you specify.
+By default the anchor point is the upper left corner of the bounding + box for the text.
+To show some ways of positioning the text we use a very simple bar + graph not to distract from the text. We first just add a single text + line with most of the settings their default value by adding the + following lines to the graph
+ $txt=new Text(
+"This is a text");
+
$txt->Pos(
+0,0);
+
$txt->SetColor(
+"red");
+
$graph->AddText(
+$txt);
+
The result is shown below.
+Not too exiting. Let's make it more interesting by having a + background color, using larger fonts and framing the text box and + adding a drop shadow to the text box by using the methods + SetBox() and SetBox()
+That's better. Now we get some attention. If you want to add a text + with several lines you just need to separate the lines with a newline + ('\n' character). The default paragraph alignment is left edge but you + can also use right and center alignment.
+As an illustration let's add a couple of more lines to the previous + text, center the text box in the middle of the graph and also use + centered paragraph alignment for the text. To adjust the paragraph + alignment of the text you have to use the + Text::ParagraphAlign()
+Of course there is no limit to the number of text string you can add + to the graph.
+From version 1.12 it is also possible to add text strings to a graph + using the scale coordinates instead. This is accomplished by using the Text::SetScalePos() Which + is completely analog to SetPos() with the only difference that the + positions given are interpretated as scale values instead of fractions + of the width and height.
+As a final easy modification we can enable the display of the data + value above each data point. The value is represented by the 'value' + property in the plot. (You can read more about the possibilities of the + display value + in the class reference.)
+To enable the display of the value you just need to call the Show() + method of the value as in
+ $lineplot->value->
+Show()
+
Adding that line to the previous line plot would give the result + shown below.
+We can of course change both color, font and format of the displayed + value. So for example if we wanted the display values to be dark red, + use a bold font and have a '$' in front we need to add the lines
$lineplot->value
+->SetColor("darkred");
+
$lineplot
+->value->SetFont(
+FF_FONT1,
+FS_BOLD);
+
$lineplot
+->value->SetFormat(
+"$ %0.1f");
+
This would then result in the following image
+We normally would like something more meaningful as description of + each axis than it's number. Specifying the titles are accomplished + through the use of the method SetTitles() of the graph. Let's say that + each axis corresponds to a month. We could then use the code
$titles
+= $gDateLocale
+->GetShortMonth
+();
+
$graph->SetTitles(
+$titles);
+
As you can see the way radar plot is constructed will assign the + titles (and plot points) in a counter-clockwise direction. If you want + them in clock-wise order you will have to inverse your input data array + as well as the title array.
+To specify a legend you (as with the other plot) make use of the + SetLegend(); method on each radar plot.
+Each major tick mark can also be connected together to create a + grid. The grid is accessed through the 'grid' property of the graph. To + enable the grid and set the line style to "dotted" you would have to + add the lines
+ $graph->grid->Show
+();
+
$graph->grid->
+SetLineStyle(
+"dotted");
+
and would result in the following graph
+By design the plot is above the grid line but beneath the axis in + image depth, hence some part of the grid lines are hidden.
+To have the grid lines more "visible" just change their color, say + to, dark red by invoking the SetColor() method on the grid lines which + would give the following result
+Another simple change we could do would be to just change the + background color of the radar graph. This is (not surprisingly) done by + a call to the method SetColor() invoked on the graph object.
+ +What if we want to add a second plot to the graph we just produced? + Well, this is quite straightforward and just requires two simple step:
+To create the second plot we need some data (we could of course use + the same data as for the first plot but then we wouldn't be able to see + the new plot!)
+The following lines show how to create the new plot and add it to + the graph (we only show the new lines - not the full script)
$ydata2
+= array(1,19,
+15,7,22
+,14,5,
+9,21,13
+);
+
$lineplot2
+=new LinePlot($ydata2);
+
$lineplot2
+->SetColor("orange");
+
$lineplot2
+->SetWeight(2);
+
+
$graph->Add(
+$lineplot2);
+
Making these changes to the previous graph script would generate a + new graph as illustrated below.
+There is a few things worth noting here
+Each graph can have up to three different titles accessed by the + three properties
+All of these three properties is a standard text object which means + that you can have individual font, colors, margins and sizes of these + tree titles.
+The only thing you need to think of is that you probably want to add + some extra margin to make room for the titles (using + Graph::SetMargin() )
+The individual positioning of these titles are done automatically + and will adjust to the font size being used.
+If you for, esthetic reasons, would like increase the distance from + the top where the title is positioned (or the intra distance between + title and sub title) you can use the + Text::SetMargin() method. For example the line
+
+ $graph->title->SetMargin
+(20);
will set the distance between the top of the title string and the top + of the graph to 20 pixels. If you instead call the SetMargin() method + for the subtitle it will adjust the distance between the top of the + subtitle and the bottom of the title.
+The titles will be positioned at the top and be centered in the + graph. Each of these titles may have multiple lines each separated by a + "\n" (newline) character. By default the paragraph alignment for each + title is centered but may of course be changed (using the + ParagraphAlign()) method.
+Each graph can also have a footer. This footer is actually three + footers. Left, center and right. The 'left' footer is aligned to the + left, the 'center' at the bottom center and the right to the right.
+Each of these three positions is a standard Text object which means + you can change color, font and size as you please individually on each + of these footer positions.
+You access the footer through the Graph::footer property as the + following example shows
+
+ $graph->
+footer->left->Set
+("(C) 2002 KXY"
+);
+
$graph->footer->
+center->Set("CONFIDENTIAL"
+);
+
$graph->footer->
+center->
+SetColor("red");
+
$graph->footer->
+center->
+SetFont(
+FF_FONT2,
+FS_BOLD);
+
$graph->footer->
+right->Set("19 Aug 2002"
+);
As you saw in the preceding example you could add multiple plots to + the same graph and Y-axis. However what if the two plots you want to + display in the graph has very different ranges. One might for example + have Y-values like above but the other might have Y-values in the + 100:s. Even though it is perfectly possible to add them as above the + graph with the smallest values will have a very low dynamic range since + the scale must accomplish the bigger dynamic range of the second plot.
+The solution to this is to use a second Y-axis with a different + scale and add the second plot to this Y-axis instead. Let's take a look + at how that is accomplished.
+First we need to create a new data array with large values and + secondly we need to specify a scale for the Y2 axis. This is done by + the lines
+ $y2data = array(
+354,200,265
+,99,111,
+91,198,225
+,293,251);
+
$graph->SetY2Scale(
+"lin");
+
and finally we create a new line plot and add that to the second + Y-axis. Note that we here use a new method, AddY2(), since we want this + plot to be added to the second Y-axis. Note that JpGraph will only + support two different Y-axis. This is not considered a limitation since + using more than two scales in the same graph would make it very + difficult to interpret the meaning of the graph.
+To make the graph a little bit more esthetic pleasing we use + different colors for the different plots and let the two different + Y-axis get the same colors as the plots.
+The resulting graph is shown below. source)
+ +A variant of the titles is the tab title. This is just + another option you have of putting a name on the graph. The appearance + of this type is a tab on top of the plot area with text inside.
+You can access the tab using the 'tabtitle' property of the graph.
+The following figure shows an example of how this can look.
+As usual you have full freedom to specify font and colors for this + type of title. Please see the class reference regarding +GraphTabTitle() for more information.
+You can easily create several radar plot which are added to the same + radar graph. The thing to remember is that if you use filled radar + plots and they overlap each other that the order which they are added + will be the order they are drawn.
+A simple example of this is shown below
+ +With more than one plot on the same graph it is necessary to somehow + indicate which plot is which. This is normally done by adding a legend + to the graph.
+You will see that each plot type has a 'SetLegend()' method which is + used to name that plot in the legend. SO to name the two plots in the + example we have been working with so far we need to add the lines
$lineplot->SetLegend
+("Plot 1");
+
$lineplot2
+->SetLegend("Plot 2");
+
to the previous code. The resulting graph is shown below + + As you can see the legend gets automatically sized depending on how + many plots there are that have legend texts to display. By default it + is placed with it's top right corner close to the upper right edge of + the image. Depending on the image you might want to adjust this or you + might want to add a larger margin which is big enough to accompany the + legend. Let's do both.
+First we increase the right margin and then we place the legend so + that it is roughly centered. We will also enlarge the overall image so + the plot area doesn't get too squeezed.
+To modify the legend you access the 'legend' property of the graph. + For a full reference on all the possibilities (changing colors, layout, + etc) see class legend in + the class reference
+For this we use the legends 'SetPos()' method as in
$graph
+->legend->Pos(
+0.05,0.5,"right"
+,"center");
Doing this small modification will give the result shown below
+The above method 'SetPos()' deserves some explanation since it might + not be obvious. You specify the position as a fraction of the overall + width and height of the entire image. This makes it possible for you to + resize the image within disturbing the relative position of the legend. + We will later see that the same method is just to place arbitrary text + in the image.
+To give added flexibility one must also specify to what edge of the + legend the position given should be relative to. In the example above + we have specified "right" edge on the legend for the for the horizontal + positioning and "center" for the vertical position.
+This means that the right edge of the legend should be position 5 % + of the image width from the right. If you had specified "left" the the + legends left edge would be positioned 5 % of the image width from the + image left side.
+By default the legends in the legend box gets stacked on top of each + other. The other possibility is to have them sideways. To adjust this + you use the SetLayout() + method. Using a horizontal layout with the previous example give the + following result.
+ +For more advanced fomatting of the legend it is possible to adjust
+In order to adjust the number of columns used in the legend the + method Legend::SetColumns is used. So for example to have the + legend lined up using three columns the follwing lines have to be added + to teh script
+ $graph->
+legend->
+SetColumns(3);
In exactly the same way as for line graphs it is possible to add + plot marks in radar plots. The mark property is accessed through the + RadarPlot::mark The example below adds a red ball as a marker.
+ +Instead of having a single color background you can easily have an + arbitrary image as the background. The image may be in either PNG, JPG + or GIF format depending on what your installation supports.
+ +A note on GD: If you are using GD 2.xx you must + make sure that the define USE_TRUECOLOR is set to true. This is also + the default. Failure to do so in combination with GD 2.xx will make the + background image just look like a solid black square.
+ +To use a specific image as the background you just have to use the + method + Graph::SetBackgroundImage() The arguments specify file-name, how + the image should be positioned in the graph and finally the format of + the image (if it is in JPG, PNG or GIF) format. If the format is + specified as "auto" (the default) then the appropriate image format + will be determined from the extension of the image file.
+The file name is of course obvious but the second argument might not + be. This arguments determine how the image should be copied onto the + graph image. You can specify three different variants here
+You might often find yourself wanting to use a background image as a + "waterstamp". This usually means taking the original image, import it + to some image editing program and then "bleaching" the color + saturation, reducing the contrast and so on. Finally you save the + modified image which you then use as a background image.
+This whole process can be automatically accomplished in JpGraph by + using the method + Graph::AdjBackgroundImage() which allow you to adjust color + saturation, brightness and contrast of the background image.
+
+ $graph->
+AdjBackgroundImage(...)
+
to achieve the "watercolor" effect to avoid the image being too + intrusive in the graph.
+JpGraph offers two ways of handling null values (or discontinuities) + in the data. You can either have a "whole" in the data or the line may + be extended between the previous and next data point in the graph.
+If the data value is null ("") or the special value "x" then the + data point will not be plotted and will leave a gap in the line.
+If the data value is "-" then the line will be drawn between the + previous and next point in the data ignoring the "-" point.
+The following example shows both these possibilities.
+ + +In addition to the background image you can also add a background + color gradient. This gradient can be covering the entire graph, just + the plot area or just the margins. This flexibility allows you to + combine a background image with a background color gradient. You can + for example use a background image in the plot area and a color + gradient out in the margins.
+You specify a color gradient background by calling the + Graph::SetBackgroundGradient() method. All details are available in + the class reference (follow the link above). We finally give a quick + example on what kind of effect you can achieve using this feature.
Finally we like to mention that in the "/utils/misc/" directory you + will find a small utility script called "mkgrad.php". Running this + script presents you with a UI that makes it a breeze to create a + gradient image on it's own.
+ The UI for the utility is so obvious that we won't discuss it
+ further, we just show it below. The UI for the mkgrad.php utility
In the example below this utility is used to get a more interesting + plot area.
+ + +An interesting enhancement when using Plotmarks is the possibility + to add a callback function to control the size and color of the + plotmarks.
+This callback function will get called with the current Y-value (for + the plotmark) as it's argument. As return value the callback function + must return an array containing three (possible null) values. The + values returned must be
+The exact meaning of the parameters will of course depend on the + type of plot marks being used.
+The callback must be a global function and is installed with a call + to + PlotMark::SetCallback()
+So for example to install a callback that changes the fill color for + all marks with a (Y) value higher than 90 you could add the lines
++ + 90) $fcolor="red" else $fcolor=""; return array("","",$fcolor); } ... + $plot->mark->SetCallback("MarkCallback"); ...'; ShowCodeSnippet($t); ?>
+As you can see in the above example we have left some of the return + values blank. Doing this will just ignore any change of these value and + use the global settings for the plotmarks.
+If you also let the (Y) value affect the size of the plot marks you + can get what is sometimes known as a "balloon plot". The example below + is basically a scatter plot that uses filled circles to mark the + points. A format callback is then used to change the color and size + depending on the Y-value for each plot.
+ + +Step style refers to an alternate way of rendering line plots by not + drawing a direct line between two adjacent points but rather draw two + segments. The first segment being a horizontal line to the next X-value + and then a vertical line from that point to the correct Y-value. This + is perhaps easier demonstrated by an example as seen below.
+You specify that you want the plot to be rendered with this style by + calling the method +SetStepStyle() on the lineplot.
+ +In section 10.2 you can read about + arbitrary rotation of the graphs. For most practical purposes rotation + of 90 degrees is most useful. This could for example be used to plot + horizontal bar graphs.
+The slight complication with general rotation is that the margins + also rotates, this means that if you rotate a graph 90 degrees the left + margin in the image was originally the bottom margin. In additional by + default the center of the rotation is the center of the plot area and + not the entire image (if all the margins are symmetrical then they will + of course coincide). This means that depending on your margin the + center of the rotation will move. You can read more about this and how + to manually set the center for rotation in the section about rotation, 10.2
+This is just a slight inconvenience which you have to take into + account when you need to set an explicit margin with a call to +Graph::SetMargin()
+However, in order to make a rotation of 90 degrees much easier you + can easily rotate a graph 90 degrees and set the correct margin with a + call to +Graph::Set90AndMargin() The parameter to this method lets you + specify the margins as you will see them in the image without having to + think of what becomes what after the rotation.
+So, the only thing you need to do is call this method and then the + graph will have been rotated 90 degrees.
+Using a logarithmic scale requires you to include the logarithmic + add on module in "jpgraph_log.php". So you must have the line
+include("jpgraph_log.php"
+);
on the top of your code. To Illustrate how to use a logarithmic scale + let's make the right Y scale in the previous example a logarithmic + scale. This is done by the line
+ $graph->SetY2Scale(
+"log");
+
This will then give the following result
+ +You can of course also use a logarithmic X-scale as well. The + following example shows this.
Even though we have so far only shown line graphs logarithmic scale + can also be used for bar, error, scatter plots as well. Even radar + plots supports the use of logarithmic plots. The following example + shows how to use a logarithmic scale for a bar graph.
+ + +Assuming we start with the traditional two axis graph, one X and one + Y axis. You may then change the position of each axis by calling + Axis::SetPos($aPosition) You have to remember that you need to + specify the position on the other axis. SO you need to specify the + world-coordinate for the position. By default the axis are each + positioned at the 0-point on the other axis, i.e. the axis will cross + at the 0,0 point in the graph.
+In addition to the standard positioning you may also use the two + special position markers "min" and "max". This will position the axis + at the minimum (or maximum) position of the other axis.
+For example, to make sure that the X-axis is always at the bottom of + the graph (at lowest possible Y-value) you would have to add the line
+
+ $graph->xaxis->SetPos
+("min");
To change the color and width of the axis you have to make use of + the Axis::SetColor() and + Axis::SetWeight() + methods.
+You might also want to add titles to the axis. This is done through + the Axis::SetTitle() + method. This is actually just a shortcut for accessing the title + property direct. Axis::title::Set() which also allow you to set the + alignment in one call.
+By default the position of the title is to the far right for the + X-axis and in the middle (and 90 degrees rotated) for the Y-axis.
+You can adjust the position of the title with the help of the second + argument to the + Axis::SetTitle() method.
+The possible positions are "high","middle" and "low" which refers to + the scale values on the axis.
+One common modification you might want to do to the title is to + increase the margin between the axis and the actual title. This is + often necessary to do for the Y-axis if the values displayed are large. + You may adjust the distance (in pixels) between the axis and the title + by using the method + Axis::SetTitleMargin()
+So for example to increase the margin on the Y-axis you might add + the line
+
+ $graph->yaxis->SetTitleMargin(40
+);
to your code.
+Finally we mention something about the positioning of tick marks and + labels on the axis. You have the possibility to choose what side of the + axis the tick marks and the labels should be at. For the X-axis this + can be specified as either on the the top (inside the plot area) or at + bottom (outside of the plotarea). In the same way you can specify for + the Y-axis if the labels ( or ticks) should be on the left or right + side.
+To adjust the label positioning you have to use the method + Axis::SetTitleSide() and to adjust the position of the tick mark + you have to use the method + SetTickSide()
For example, the following lines added to a script would change side + of the labels and tickmarks for the X-axis.
+
+ $graph->xaxis->SetLabelPos
+(SIDE_UP);
+
$graph->xaxis->
+SetTickSide(
+SIDE_DOWN);
+
This technique is for example used if you position the X-axis at the + top of the graph as the following example shows.
In scientific style plots it is often common to duplicate each axis + so that all sides of the graph have a labeled axis. This is of course + also fully supported by JpGraph.
+Before we continue we show a small example to illustrate this + feature
+ + +The example above shows the basic configuration. There are now + several modifications you may do to these axis like
+The style of axis is determined by the method + Graph::SetAxisStyle() The available type of axis are
+How to adjust the actual labels are discussed elsewhere in this + manual (see ???,???). However we like to mention here that you can + adjust the label margin (distance between the axis and the labels) with + the method + Axis::SetLabelMargin()
+to adjust the actual label format (like font, color, angle) you need + to access the Axis::SetFont() + and the Axis::SetColor() + methods. If you investigate the + Axis class you will discover more methods to adjust the many + aspects of the axis layout.
+As a final note we also mention the methods + Axis::SetLabelAlign() and + Axis::SetLabelAngle() This first method is really only mentioned + here for completeness since it is mostly used for internal purposes. + However on some occasion you might want to adjust the alignment of the + labels. By default they are centered in respect to the tick mark. By + using the method you might override this positioning should you choose + to do so.
+The second of these methods adjusts the angle of the label in + regards to the axis. This is very useful for X-axis that have long + labels.
+In order to have full control over the way that the labels are + displayed it is possible to define a callback function that will be + applied to all labels. The callback function will be called with the + label as the only argument and should return the value that will be + displayed in the graph. This could for example be used to turn seconds + (used to position data points) into hour and minutes on the scale. For + further reference see the two methods: + Graph::SetLabelFormatCallback(); and + Graph::SetLabelFormat();
+One good way of illustrate the usefulness of label callbacks in a + slightly different context is to show how we can achieve the effect of + an inverted Y-scale.
+An inverted Y-scale has the lowest number at the top and the scale + values increases downwards.
+Even though JpGraph doesn't directly support this feature it is + quite easy to achieve with just a few extra lines of code in your image + script.
+Before we continue we give an example of what we are referring to.
+ + +Two achieve this effect there are two simple steps to take:
+And that's it! We refer you to the code in the example above for the + details.
+To get the exact type of axis you want in your graph there are a + number of adjustments available for you. You may change, color, size, + position and general appearance.
+ +As you saw in the previous example it is possible to use different + types of scales. In JpGraph you can use the following scales
+Any combination of these may be used. Linear and logarithmic scales + are pretty straightforward. The text scale might deserve some + explanation. The easiest way to think of the text scale is as a linear + scale consisting of only natural numbers, i.e. 0,1,2,3,4,... . This + scale is used when you just have a number of Y-values you want to plot + in a consecutive order and don't care about the X-values. For the above + example it will also work fine to use a linear X-scale (try it!). + However, the scale is now treated as consisting or real numbers so the + auto scaling, depending on the size of the image an the number of data + points, might decide to display other labels then the natural numbers., + i.e. a label might be 2.5 say. This is not going to happen if you use a + text scale.
+The normal practice for text scale is to specify text strings as + labels instead as the default natural numbers. You can specify text + strings for the labels by calling the + SetTickLabels() method on the Axis.
+To specify the scale you use the + SetScale() method. A few examples might help clarify this.
+As you can see all your graphs will require at least one call to + SetScale() in the beginning of your script. Normally it will come right + after the creation of the Graph().
+To specify the scale for the Y2 axis you use the + SetY2Scale() Since you only specify one axis you only specify + "half" of the string in the previous examples. So to set a logarithmic + Y2 scale you will call + + SetY2Scale("log");'; ShowCodeSnippet($t); ?>
+The first example draws a line graph consisting of 10 Y-values. In + this first example we show the full code. In the following examples we + will only show interesting piece of the code.
<?php
+
include (
+"../jpgraph.php");
+
include ("../jpgraph_line.php");
+
+
// Some data
+
$ydata
+= array(11,3,
+8,12,5
+,1,9,
+13,5,7
+);
+
+
+// Create the graph. These two calls are always required
+
$graph
+= new Graph(350,
+250,"auto");
+
$graph->SetScale(
+"textlin");
+
+
// Create the linear plot
+
$lineplot
+=new LinePlot($ydata);
+
$lineplot
+->SetColor("blue");
+
+
// Add the plot to the graph
+
$graph->Add(
+$lineplot);
+
+
// Display the graph
+
$graph->Stroke();
+
?>
+
You might note a few things
+This is a perfect fine graph but looks a little bit "sparse". To + make it more interesting we might want to add a few things like
+From looking at the previous example you can see that you access all + properties of JpGraph through the objects you create. Graph(), + LinePlot() and so on. In general all objects you can see in the graph + is accessed through a named instance.
+For example the title of the graph is accessed through the + 'Graph::title' property. So to specify a title string you make a call + to the 'Set()' method on the title property as in:
+
+ $graph->title->Set
+('Example 2');
So by adding just a few more lines to the previous code we get a + graph as shown below.
To achieve this we just needed to add a few more lines. (We only show + the part of example 1 we changed, to look at the full source just click + the [src] link in the caption. )
+
+// Setup margin and titles
+
$graph->img->
+SetMargin(40,20
+,20,40);
+
$graph->title->
+Set(
+"Example 2");
+
$graph->xaxis->
+title->Set("X-title"
+);
+
$graph->yaxis->
+title->Set("Y-title"
+);
+
Again there are a couple of things you should note here
+A nice change would now be to have all the titles in a bold font and + the line plot a little bit thicker and in blue color. Let's do that by + adding the lines
$graph->
+title->SetFont(FF_FONT1
+,FS_BOLD);
+
$graph->yaxis->
+title->SetFont(FF_FONT1
+,FS_BOLD);
+
$graph->xaxis->
+title->SetFont(FF_FONT1
+,FS_BOLD);
+
$lineplot
+->SetColor("blue");
+
$lineplot
+->SetWeight(2);
+// Two pixel wide
Again please note the consistent interface. To change font you just + have to invoke the SetFont() method on the appropriate object. This + principle is true for most methods you will learn. The methods may be + applied to a variety of objects in JpGraph. So for example it might not + come as a big surprise that to have the Y-axis in red you have to say:
+ $graph->yaxis->SetColor
+("red")
or perhaps we also want to make the Y-axis a bit wider by
$graph
+->yaxis->SetWidth(
+2)
+
As a final touch let's add a frame and a drop shadow around the + image since this is by default turned off. This is done with
$graph
+->SetShadow()
The result of all these modifications are shown below.
Spider plots are most often used to display how a number of results + compare to some set targets. They make good use of the human ability to + spot symmetry (or rather un-symmetry) . the figure below show an + example of a spider (sometimes called a web-plot). Spiderplots are not + suitable if you want very accurate readings from the graph since, by + it's nature, it can be difficult to read out very detailed values.
+ +In the following section we show how to draw both simple and complex + radar graph. As we will show all the settings will follow the same + pattern as for the more standard linear graphs.
+By default the auto-scaling algorithm tries to make best possible + use of screen estate by making the scale as large as possible, i.e. the + extreme values (min/max) will be on the top and bottom of the scale if + they happen to fall on a scale-tick. So for example doing a simple line + plot could look like the plot shown in the below.
+However you might sometime want to add some extra to the minimum and + maximum values so that there is some "air" in the graph between the end + of the scale values and the extreme points in the graphs. This can be + done by adding a "grace" percentage to the scale. So for example adding + 10% to the y-scale in the image above is done by calling the + SetGrace() method on the yscale as in
+
+ $graph->yaxis->scale
+->SetGrace(10,
+10);
+
These lines add a minimum of 10% to the top and bottom values of the + scale. Note that we say "minimum" since depending on the specific tick + values choose this might be a little bit more to make the end of the + scale fall on an even tick mark.
+Adding this line to the previous graph will result in the following + example
+ +Since we haven't adjusted the position of the X-axis it will remain + at Y=0 which might not necessary be what we would like so we therefor + also add the line
+
+ $graph->xaxis->SetPos
+("min");
So that the X-axis always will remain at the lowest possible + Y-value. Doing this will then result in the example below
+ + +Semi filled bar graphs are in principle the same as normal filled + bar graphs but with the additional feature that you can choose to only + fill a specified range (or ranges) of X-coordinates. The figure below + illustrates this
+ + +In this example we defined two areas along the X-axis to be filled. + You can add filled areas by using the method + AddArea() and specifying range and color for the filled area.
+All patterns can be customized by
+
+
+ $band
+->prect->SetHorizon(
+$aHorizon)
+
assuming that the band is a 3D plane.
+To finish this section we give one final, more creative, example on + how to use the bands.
+ +As an additional way of emphasizing certain areas of the graph it is + possible to add bands (either vertical or horizontal) to any one of the + standard X-Y coordinate system based graphs. A band is a rectangular + area that stretches one entire axis. This means that if you define a + band between X-coordinates 3 and 5 the band area will occupy an area + between the X-coordinates and the entire Y-range.
+In order to access this functionality you must first make sure that + you include the additional library file jpgraph_plotband.php
+At the time of this writing (current as of JpGraph 1.8) the table + below illustrates the 8 basic types of patterns available. We will + shortly show you how you can customize these patterns, To keep these + examples clear we have only used one pattern in each figure.
+ ++ + | + + |
+ + | + + |
+ + | + + |
+ + | + + |
To add a one of these patterns to your graph you need to call the + method + PlotBand::PlotBand() The arguments is fairly easy to understand. + The pattern you would like to use is specified by using the correct + constant. You can see the name of the correct constants in the figures + above. You also need to specify if the band should stretch along the + vertical or horizontal axis as well as the min and max coordinates for + the band. As coordinates you may also use the special values "min" and + "max" which automatically sets the value to the minimum/maximum value + of the scale. The specified numeric value will be automatically + truncated to fit within the plot area.
+We don't discuss the other arguments further here, instead we refer + you to the class reference.
+For very busy Pie plots it can become too little space for the + labels to be printed just beside the pie slice. For this purpose it is + possible to use guide lines for the labels. The library will then draw + a line from the center edge of the slices to the label which will be + positioned further out from the Pie Plot.
+There is one method that is primarily used to handle this, + PiePlot::SetGuideLines() the simplest usage of this would be
$pieplot
+->SetGuideLines
+();
An example of this could then be
+The above example will give guide lines very similar as what is + produced by other programs, e.g. Excel. In addition to the above + variant it is also possible to instruct the library to line up the + labels vertically in a way that we think is easier to read. This is + achieved by specifying the second parameter to the SetGuideLines() to + 'false' as in
$pieplot->
+SetGuideLines(
+true,false);
The first parameter is to enable/disable the guide-lines. With the + same example as above this would then produce the image
+It is also possible to configure the vertical distance between the + labels. By default the distance between the labels is roughly 40% of + the labels font height. By using the method + PiePlot::SetGuideLinesAdjust() it is possible to specify a + fractional value which is interpretated as the distance between the + bottom of one label to the bottom of the next. This means that + specifying a value of '1.0' the labels will have no space between them + and the bottom of one label will touch the top of another label. By + default this value is 1.4.
+By increasing or decreasing this value it is possible to make the + labels become positioned more or less compact. Below we have taken the + above example and reduced the distance to '1.1' and as can be seen this + yields much more compact labeling.
+ +Note: Guide lines is only available in 2D Pie plots.
+JpGraph allows you to easy customize the appearance of the bar + graph, for example to change the width of each bar. The width of each + bar can be specified either as a fraction of the width between each + major tick or as an absolute width (in pixels).
+To set the width in fraction you use the method + SetWidth() and to set the width in pixels you use the + SetAbsWidth()
+As an example let's take the previous example and set the width to + 100% of the distance between the ticks. The example will now become
+ + +In addition to the bands you can also add static lines to the graph. + An example of that is actually shown in figure 11 above. You create a + line as an instance of + class PlotLine . So for example the lines
+ $sline
+= new PlotLine
+(HORIZONTAL,0,
+"black",2);
+
$graph->Add(
+$sline);
+
will add a 2-pixel wide horizontal static line at Y-position zero.
+So far we have only made use of 2D pie plots, creating 3D pie plots + is no more difficult. Instead of creating the plots with a call to + PiePlot() you create the plots with a call to + PiePlot3D() If we just take the first simple pie plot and replace + the call to PiePlot() with a call to PiePlot3D() we get the following + result.
+3D Pie plots have the same possibilities as the normal pie plots + with the added twist of a 3:rd dimension. You can adjust the + perspective angle with the method + SetAngle() So for example to make the pie more "flat" you just set + it to a smaller angle. Setting the perspective angle to 20 degrees in + the previous example will give the following result.
+ +You can easily choose to display the value (and it's format) on top + of each bar by accessing the bar's 'value' property. So for example by + just adding the line
+ $barplot->value->
+Show();
+
Will enable the values in it's simplest form and will give the + result
+You cane see a small nuisance in this graph. The auto scaling + algorithm chooses quite tight limits for the scale so that the bars + just fit. Adding the value on top of the bar makes it collide with the + top of the graph. To remedy this we tell the auto scaling algorithm to + allow for more "grace" space at the top of the scale by using the + method + SetGrace() which is used to tell the scale to add a percentage (of + the total scale span) more space to either one end or both ends of the + scale. In this case we add 20% more space at the top to make more room + for the values with the line
+ $graph->yaxis->
+scale->
+SetGrace(20);
This will then give the graph as shown below
+ +You can also adjust the general position of the value in respect to + the bar by using the + BarPlot::SetValuePos() method. You can set the position to either + 'top' (the default) , 'center' or 'bottom'. The graph below shows the + value being positioned in the center. In this example we have also + adjusted the format to just display the value as an integer without any + decimals.
+It is also possible to specify a more fine grained control on how + you want the values presented. You can for example, rotate them, change + font, change color. It is also possible to adjust the actual value + displayed by either using a printf()-type format string or with the + more advanced technique of a format callback routine.
+To show what you can do we just give another example for you to + examine without much further explanations. Just remember that to have + text at an angle other than 0 or 90 degrees we have to use TTF fonts. + Even though we haven't explained the SetFont() method it should be + fairly obvious.
+ +One simple way of making the bar graph more attracting is to add a + drop shadow to each bar. This is done by calling the + SetShadow() method. An example will clarify this.
+ +One way to attract attention to some specific piece of information + in a pie chart is to "explode" one or more slices. Both 2D and 3D pies + support exploding one or several slices.
+Exploding slices is accomplished by the methods + Explode() and + ExplodeSlice() The first method is used if you want to explode more + than one slices and the second is a shorthand to make it easy to just + explode one slice.
+For example to explode one slice the default "explode" radius you + would just have to say
+ $pieplot->ExplodeSlice(
+1)
+
The above line would explode the second slice (slices are numbered + from 0 and upwards) the default amount. Doing this to the two previous + example would result in
+ + + +To explode all slices at once you can use the + PiePlot::ExplodeAll() method. If you want to explode several slices + you can use the + PiePlot::Explode() method and supply a suitable array argument.
+As you have seen from the previous examples bar graphs are normally + centered between the trick marks on a text scale. However, you can + modify this behavior by calling the method + BarPlot::SetAlign()
+By default the values shown just outside the pie for each slice are + the percentage value for each slice. If you instead wanted the absolute + value you would just have to use the + SetLabelType() method. So to use the absolute value you would call
+
+ $pieplot->
+SetLabelType(
+"PIE_VALUE_ABS");
+
Furthermore you could enhance the formatting of the value by either + using a printf() style format string (using + SetFormat() ) or by providing a formatting function callback (using + + SetFormatCallback() ) for doing more advanced formatting.
+You can also adjust the position of the labels by means of the + PiePlot::SetLabelPos() method. The argument to this method is + either the fraction of the radius or the string 'auto'. In the latter + case JpGraph automatically determines the best position and the the + first case The following example illustrates this
+ +If this formatting is not enough you can also "manually" specify the + labels for each slice individually. You do this by using the + PiePLot::SetLabels() method. This will let you specify individual + text strings for each label. In each specification you can also add a + printf() formatting specification for a number. The number passed on + will be either the absolute value for the slice or the percentage value + depending on what was specified in the call to + SetLabelType()
+The SetLabels() method can also take a second parameter, the label + position parameter. This is just a shortcut to the SetLabelPos() as + described above. By default the position will be set to 'auto' if not + explicitely specified.
Another typical change would be to change the colors of the slices. + There are two fundamental ways of doing this. You either manually + specify the colors for the slices as an array using the method + SetSliceColors() If you specify fewer colors than the number of + slices they will just wrap around.
+Another way is to use one of the pre-defined color "themes". This is + just a predefined set of colors that will be used for the slices. You + choose what "theme" you like to use with the method ( + SetTheme() ) At the time of this writing the available themes are
+The following example shows the same pie using the different + "themes" in order.
+ + + + +A complete color chart of all available colors in the different + themes can be found here
+Another simple change is to remove the border ( or change it's + colors ) that separates each slice. This can be done by a call to + ShowBorder()
+These types of bar graph is used to easy group two or more bars + together around each tick (X-value). The bars will be placed + immediately beside each other and as a group centered on each tick + mark. A grouped bar is created by aggregating two or more ordinary bar + graphs and creating a + GroupBarPlot() From two ordinary bar graphs along the lines of
+// Create the bar plots
+
$b1plot
+= new BarPlot($data1y);
+
$b1plot->SetFillColor(
+"orange");
+
+
$b2plot
+= new BarPlot($data2y);
+
$b2plot->SetFillColor(
+"blue");
+
+
// Create the grouped bar plot
+
$gbplot
+= new GroupBarPlot
+(array($b1plot
+,$b2plot));
+
+
// ...and add it to the graPH
+
$graph->Add(
+$gbplot);
+
The following example illustrates this type of graph
+There is no limit on the number of plots you may group together.
+If you use the SetWidth() method on the GroupBarPlot() this will + affect the total width used by all the added plots. Each individual bar + width will be the same for all added bars. The default width for + grouped bar is 70%.
+Setting the grouped with to 0.9 would result in the image below.
+ +An additional visual enhancements can be made by adding a drop + shadow to the individual slices. This is accomplished by means of the PiePlot::SetShadow() + method. Adding a drop shadow is often more affective if the pie has one + or more slices exploded as the following example shows
+ +The final variety of group bars you can have are accumulated bars. + They work in much the same way as accumulated line plots described + above. Each plot is stacked on top of each other.
+You create accumulated bar plots in the same way as grouped bar + plots by first creating a number of ordinary bar plots that are then + aggregated with a call to + AccBarPlot();
+An example makes this clear. Let's use the same data as in the two + examples above but instead of grouping the bars we accumulate (or + stack) them. The code would be very similar (actually only one line has + to change)
+ +As mentioned in the beginning there are two versions of the 2D pie + plots. The normal pie plot created as an instance of + class PiePlot and a variant created as an instance of + class PiePlotC
+This variant is an extension of the standard PiePlot in the sense + that it also have a filled circle in the center. The following example + illustrates this
+ + +Since the PiePlotC is an extension to the basic pie plot all the + normal formatting you can do for pie plots you can also do for the + PiePlotC .
+The additional formatting only concerns the filled middle circle. + You have the option of adjusting size, fill color and all font + properties. You perform these operations with the methods
+ ++PiePlotC::SetMidColor() | Set fill color of mid circle |
+PiePlotC::SetMidSize() | Set size (fraction of radius) |
+PiePlotC::SetMidTitle() | Set title string (may be + multi-lined) |
+PiePlotC::SetMid() | Set all parameters in a single method + call |
In addition to the normal CSIM for PiePlot:s the center area is also + a CSIM hotspot. You specify the target CSIM with a call to + PiePlotC::SetMidCSIM()
+The next example shows an example with some more innovative + formatting. In this example we have :
+It is perfectly possible to combine the previous bar types to have + grouped accumulated bar plots. This is done by just adding the + different accumulated plots to a group bar plot, for example the + following code would do that.
+
+// Create all the 4 bar plots
+
$b1plot
+= new BarPlot($data1y);
+
$b1plot->SetFillColor(
+"orange");
+
$b2plot
+= new BarPlot($data2y);
+
$b2plot->SetFillColor(
+"blue");
+
$b3plot
+= new BarPlot($data3y);
+
$b3plot->SetFillColor(
+"green");
+
$b4plot
+= new BarPlot($data4y);
+
$b4plot->SetFillColor(
+"brown");
+
+
// Create the accumulated bar plots
+
$ab1plot
+= new AccBarPlot
+(array($b1plot
+,$b2plot));
+
$ab2plot
+= new AccBarPlot
+(array($b3plot
+,$b4plot));
+
+
// Create the grouped bar plot
+
$gbplot
+= new GroupBarPlot
+(array($ab1plot
+,$ab2plot));
+
+
// ...and add it to the graph
+
$graph->Add(
+$gbplot);
+
Putting this together in an example would then produce the graph as + shown below
+ +It can often come in handy to have horizontal bar graphs especially + if you have a large number of values to display. Even though JpGraph + doesn't directly support horizontal bar graphs this is easy achieved by + constructing a normal vertical bar graph which is then rotated 90 + degrees.
+The example below shows a simple example of this
+ +In order to achieve this effect you should study the above example + carefully and you might notice two things
+We finally show three more examples of horizontal bar plots. In the + first plot we have hidden the Y-axis and in the second we have + positioned the Y - axis at top as opposed to the bottom as the first + example shows.
+ + + +In the final example which is almost similar to the two first we + illustrate the use of labels with more than one line.
It is possible to use color gradient fill for the individual bars in + the bar graph.
+Color gradient fill fills a rectangle with a smooth transition + between two colors. In what direction the transition goes (from left to + right, down and up, from the middle and out etc) is determined by the + style of the gradient fill. JpGraph currently supports 8 different + styles. All supported styles are displayed in the figure below.
+ + + + + + + + +To specify a gradient fill for the bar plots you make use of the + method + BarPlot::SetFillGradient() . See the class reference for details of + this function.
+When using gradient fills there are a couple of caveats you should + be aware of:
+Jpgraph also supports 2D vertical bar plots. Before you can use any + bar plots you must make sure that you included the file + "jpgraph_bar.php" in your script.
+Using bar plots is quite straightforward and works in much the same + way as line plots which you are already familiar with from the previous + examples. Assuming you have a data array consisting of the values + [12,8,19,3,10,5] and you want to display them as a bar plot. This is + the simplest way to do this:
+ $datay=array(12,
+8,19,3
+,10,5);
+
$bplot
+= new BarPlot($datay);
+
$graph->Add(
+$bplot);
+
If you compare this to the previous line examples you can see that + the only change necessary was that instead of creating a new line plot + (via the new LinePlot(...) call) we used the statement new + BarPplot().
+The other change we should do is to make sure the X-axis have an + text-scale (it is perfectly fine to use a linear X-scale but in most + cases this is not the effect you want when you use a bar graph, see + more below). With this two simple change we will now get a bar graph as + displayed in the following image + + You can of course modify the appearance of the bar graph. So for + example to change the fill color you would use the + BarPlot::SetFillColor() method. Making this small change to the + previous example would give the expected effect as can be seen in the + next example. + +
So far we have just show plots based on an X-Y coordinate system. + This is not the only types of graphs you can create with JpGraph. + Another common type is Pie plots. JpGraph supports both 2D and 3D pie + plots. For 2D pie plots there are also 2 versions, but more on that + later.
+The main difference as compared to the X-Y plots is that to all pie + plots are added to the + PieGraph() instead of the Graph() object we used for the X-Y graphs + we have drawn so far. For this you must first include the + "jpgraph_pie.php" in your script (or "jpgraph_pie3d.php" if you want to + use 3-dimensional pies).
+Below you cane see the code needed to create the simplest possible + pie graph just using the default settings.
+
+ include (
+"../jpgraph.php");
+
include ("../jpgraph_pie.php");
+
+
$data
+= array(40,60,
+21,33);
+
+
$graph
+= new PieGraph
+(300,200);
+
$graph->SetShadow();
+
+
$graph->title->
+Set(
+"A simple Pie plot");
+
+
$p1 = new PiePlot(
+$data);
+
$graph->Add(
+$p1);
+
$graph->Stroke();
+
The above code would give the following pie graph
+There is a few things worth noting here
+You can change almost all aspects of appearance of the pie graphs. + For example you could change :
+The next simplest addition we can do is to add a legend to the pie + graph. We do this by using the + SetLegends(); method. By adding the legends to the previous example + we get the following image
+ +(In the figure above we also moved the center of the pie slightly to + the left to make more room for the legend box.)
+The text for the legends can also contain printf() style format + strings to format a number. This number passed on into this string is + either the absolute value of the slice or the percentage value. How to + switch between the is describe further down in this chapter.
+The next change you might want to change is the size and position of + the Pie plot. You can change the size with a call to + SetSize(); and the position of the center of the pie plot with a + call to SetCenter(); + The size can be specified as either an absolute size in pixels or as a + fraction of width/height (whatever is the smallest). The position of + the pie plot is specified as a fraction of the width and height.
+To put the size and positioning API to use we will show how to put + several pie plots on the same pie graph. In the following example we + have also adjusted the legends of the slice values to use a smaller + font.
+What we do in this example is quite simple, create 4 pie plots, make + them smaller and put them in the four corner of the graph. This will + give the result as shown in the following example.
+ +Each data point in a polar plot is represented by a tuple consisting + of a radius and an angle. The polar plot itself can be either outlined + or filled. In addition each point may have a standard marker (the same + as for line and scatter plots).
+The scale for the radius can be either linear or logarithmic.
+A polar graph is created by creating an instance of +PolarGraph::PolarGraph(). The polar graph type inherits all the + capabilities of ordinary X-Y graphs, i.e they can have background + images, background gradients, tabbed titles and so on.
+Polar graphs comes in two basic types, they can either show a full + 360 degree graph or a half 180 degree graph. The two examples below + show these two basic types of graphs.
+ + + +A line error plot is an error plot with the addition that a line is + drawn between the average value of each error pair. You use this type + of plot the exact same way you would use an error plot. The only change + is that you must instantiated an + ErrorLinePlot() instead and make sure you have included the + "jpgraph_line.php" since the line error plot makes use of the line plot + class to stroke the line.
+To control the various properties of the line drawn the "line" + property of the error line plot may be accessed. So, for example, if + you want the line to be 2 pixels wide and blue you would have to add + the following two lines
+ $elplot->line->
+SetWeight(2);
+
$elplot->line->
+SetColor(
+"blue");
+
to generate the graph as shown below
+You may of course add legends to none, one or both of the line types + in the above graph. So for example if we wanted the legend "Min/Max" + for the red error bars and a legend "Average" for the blue line you + would have to add the lines
+ $errplot->SetLegend(
+"Min/Max");
+
$errplot->line->
+SetLegend(
+"Average");
+
The resulting graph will now look like (note that we are using the + default placement of the legend box)
+ +The radius axis can be shown in either a linear or logarithmic + scale. This is controlled, as usual, by a call to +PolarGraph::SetScale() The two examples below show the same plot in + either linear or logarithmic scale
+ + + + +Please note that the maximum values of the scales are different.
+By default the scale will be auto scaled depending on the data. You + can also specify a manual scale by supplying an extra argument to the + SetScale() value. The only difference from the manual scaling with the + other X-Y-graphs is that for polar graph you only specify a manual + maximum. The minimum will always be 0 for the linear scale and a scaled + value of 10 (i.e 1, 0.1, 0.001 and so on) for the logarithmic scale.
+The plot is clipped to the plot area so if you specify a smaller + scale then the maximum value that part of the plot that are outside the + plot area will be clipped.
+As usual you have full freedom to select what grid lines you like to + show (and what colors they should have). There are three different + types of grid lines you may adjust. The radius minor and major grid + lines and the angle grid lines.
+You select what grid lines to show with a call to +PolarAxis::ShowGrid() The two example below shows a logarithmic plot + with either just major grid lines or both minor and major grid lines.
+ + + +The colors of the grid lines are specified with a call to + PolarAxis::SetGridColor()
+For the angle grid lines it is possible to specify the angle + division between each grid line with the method + PolarAxis::SetAngleStep() You specify the step distance in degrees. + By default the step size is 15 degrees.
+You can individually specify different fonts and colors for the + angle and the radius labels. The radius font is specified with + PolarAxis::SetFont() and the angle font is specified with a call to + PolarAxis::SetAngleFont()
+You can adjust the color with the method +PolarAxis::SetColor() ?>
+The following example specifies different color for the labels. it + also shows that you can add both a radial axis title as well as a + tabbed title. In this example we have also chosen not to show the frame + around the edge of the plot.
+As can be seen from the previous examples the angle labels have a + small superscripted "o" after each label. You can select if you like to + show this degree mark or not with a call to the + PolarAxis::SetANgleDegreeMark() method by which you can enable or + disable that mark after the angels.
+For the radius labels all standard formatting that can be done to + the X-Y axis such as format string or format callbacks are supported.
+A common modification for polar plots is probably to disable the + display the last label when using a 360 degree plot since the last + label will "collide" with the plot box around the plot area. It is + possible to disable the last label with a call to +Axis::HideLastTickLabel() As you can see this has been used in some + of the examples in this chapter.
+If you have specified markers for the polar plot (by setting the + mark property of the plot) each marker can be a hot spot in a client + side image map. The target URL are as usual specified with the + SetCSIMTargets() as the following short code excerpt shows
+// Start by specifying the proper URL targets
+
$targets
+= array("#1","#2", ....... );
+
$polarplot
+= new PoalrPlot
+($data);
+
$polarplot
+->mark->SetType(
+MARK_SQUARE);
+
$polarplot
+->SetCSIMTargets
+(targets);
+
$graph->Add(
+$polarplot);
+
$graph->StrokeCSIM();
+
As a final example we show a full 360 degree polar plot with square + markers as well as background color gradient and a legend for the plot.
+ +Error plots are used to visually indicate uncertainty in data + points. This is done by for each X value by giving both a minimum and a + maximum Y-value.
+Before you can use error plots you must remember to include the file + "jpgraph_error.php" in your script.
+The following example illustrates a simple error bar. We will have 5 + points, so we need 10 Y-values. We also would like the error bars to be + red and 2 pixels wide. All this is accomplished by creating an + ErrorPlot() in much the same way as, for example, a normal line + plot. Doing this would now give the example shown below.
+ +You might notice that there is one displeasing esthetic quality of + this graph. The X-scale is just wide enough to just accompany the + number of error bars and hence the first bar is drawn on the Y-axis and + the and last bar just at the edge of the plot area. To adjust this you + might call the SetCenter() + method which will adjust the X-scale so it does not use the full width + of the X-axis.
+The following example illustrates the use of this feature by + applying this technique to the previous example
+ +Scatter plots are very simple; they plot a number of points + specified by their X- and Y-coordinate. Each point is stroked on the + image with a mark as with line plots. The stroked marks can also be + connected with an optional line.
Even though you would normally supply X-coordinates it is still + perfectly possible to use a text-scale for X-coordinates to just + enumerate the points. This is especially useful when using the + "Impulse" type of scatter plot as is shown below.
+Scatter pots are created by including the jpgraph extension + "jpgraph_scatter.php" and then creating an instance of plot type of + ScatterPlot(). To specify the mark you want to use you access the mark + with the instance variable "mark" in the scatter plot. The default is + to use an unfilled small circle.
+To create a scatter plot you will create an instance
+A simple example using just default values will illustrate this
+ +We can easily adjust the size and colors for the markers to get + another effect as shown below
+Another possible variant of scatter plot is impulse-scatter plots. + This is a variant of normal scatter plot where each mark have a line + from the mark to the Y=0 base line. To change a scatter plot into an + impulse scatter plot you have to call the method + SetImpuls() on the scatter plot.
+This type of plots are often used to illustrate signals in + conjunction with digital signal processing. The following two examples + illustrates simple use of impulse plots.
+The next example shows how to modify the color and width of the + impulse plot
+As a final touch we show two more advanced impulse graphs . In these + graphs we have used more advanced formatting for the Y-axis labels as + well as adjusted the position of the axis position.
A variant of scatter plot is the so called Field Plots this + is basically a scatter plot where each scatter point is an arrow with a + direction between 0 to 359 degrees. This effectively allows the + visualization of 3 parameters at each point (x,y,angle). As an + additional bonus there is also possible to define a callback for each + scatter plot to also define the color for each point.
+To create a field plot you create an instance of +FieldPlot in the same way as you created a normal scatter plot. The + arguments to this method are Y-coordinate, X-coordinate and angle. To + specify a callback you use +FieldPlot::SetCallback()
+The following example (and code) illustrates the usage of the field + plot type.
+ +In addition to the parameters mentioned above you can also adjust + both the general size of the arrow and also the specific size of the + arrowhead. The arrow size is specified in pixels and the arrow head is + specified as an integers between 0 and 10. These sizes are specified + with a call to +FieldPlot::arrow::SetSize()
+Stock charts is used to display data values where one is interested + in 4 different values for each data point. This could for example be + used to display a stocks open,close, min and max value during a + specific day. Hence the name Stock chart (or Stock plot).
+The figure below illustrates a sample Stock chart plot
+For this type of plot the Y-data array must be consist of a number + of quadruples of data where each quadruple consists of + (open,close,min,max). The open and close values determine the min max + for the middle bar and the min,max determine the end points of the + "error-lines" at the top and bottom of of each bar.
+Note that the data follows the following rules
+To separate the two cases where "open > close" or "open < close " + different colors are used. These colors are specified with the +SetColor() method. By default a positive bar (close > open) have a + fill color of white and for the negative case where (close < open) the + bars have a red color.
+You can specify the width of the bar by setting the width (in + pixels) with a call to the method +SetWidth()
+The final variation of stock plots you can have is to determine + whether or not the end point for the min,max lines should have the + horizontal line marking the end of the line or not. This can be + adjusted with a call to method +HideEndLine().
+A minor variation of stock charts is the "BoxPlot()" this is almost + the same as StockPlot() but with the very small difference that in + addition to the open,close,min, max values you also specify a median + value . The median lies between the open and close value and is + illustrated as a horizontal line within the bar.
+You may modify the median line color for positive and negative data + points / bars by using the +SetMedianColor() method.
+In the same way as for other plots you may associate an image map + with these plots. The "hot" area for each plot is the mid "bar" + section. In the same way as other plot types you use the + SetCSIMTargets() to set the URLs you want to use.
+These plot types, though normally used without explicit X-values, + can of course handle a supplied X-coordinate array without any problem.
+JpGraph offers two variation on what is usually known as stock + charts, candle-charts or box plot.
+It is perfectly legal to add several different plot types to the + same graph. It is therefore possible to mix line plots with (for + example) filled bar graphs. What you should keep in mind doing this is + the order in which these plots are stroked to the image since a later + stroke will overwrite a previous one. All plots are stroked in the + order you add them, i.e. the first plot added will be stroked first. + You can therefore control which plot is placed in the background and + which one is placed in the foreground by the order you add them to the + plot.
+To start simple we just mix a filled line plot with a non-filled + line plot as the following example shows.
+ + +Let's now go to something a little bit more complicated. How to mix + bar and line graphs. Let's just take one of our previous bar graphs and + add a line plot to it and see what happens.
+ +Not too bad. But we can't see the line so we change the order in + which we add the lines to the graph and sees what happens.
+ +If you want the line points to be aligned in the center of the bars + you can accomplish this is two ways.
+If you use a text scale then you need to call the + LinePlot::SetBarCenter()
You can also use an integer scale. This places both + the bar and the line points centered at the tick marks. As the + following example will show
+ +As a final example we show how you can combine a scatter plot and a + line plot which could be used to illustrate a regression line fitting.
+ +Normally the automatic scaling should be doing an adequate job in + most circumstances but there might be cases where you like to manually + set the scale. For example if you have several graphs where you like to + be able to easily compare them and therefore want them all to have the + same scale.
+To specify a manual scale you have to add arguments to the standard Graph::SetScale() method. + So to specify that you want an Y-scale between 0 and 100 you need to + write
+ $graph->
+SetScale(
+"textlin",0,100
+);
When you specify a scale manually there is one additional thing you + need to decide. How the tick marks should be positioned. You have three + choices
+
+ $graph->SetScale(
+"textlin",0,100
+);
+
$graph->yscale->
+ticks->Set(10
+,5);
Will set the major tick marks every at 0,10,20,.. And every minor + tick mark in between (0,5,10,15,20,25,...).
+The three images below illustrates the difference between the + possibilities of ticks for a manual scale.
+ + + + + +You can adjust the automatic tick marks by telling JpGraph how dense + you want them to be. You use the + Graph::SetTickDensity() method. You can set the density setting in + four steps
+Taking the previous example with the manual scale but automatic + ticks and using a denser ticks setting gives the following result
+ +Non X,Y plots includes
+The fundamental difference is that these classes makes use of an + extended version of the basic Graph class. Therefor you can not mix X,Y + plots with non-X,Y plots. For example it is not possible to mix a line + graph with a Polar graph.
+The purpose of this chapter is to introduce the basic concepts of + creating scripts with JpGraph that will generate various types of basic + plots. Throughout the text it is possible to view the exact source for + all the graphs by clicking on the "[src]" link in the caption of the + image shown. This will open the image together with the source in a + separate window. This way it is easy to compare the actual image with + the script that generated the image.
+It is common to group activities. We have used this feature in the + examples of constrains. There is no special type for activity bars that + are used to illustrate grouping. The common way of illustrating this + (as have been used above) is to add "half" a triangle marker at both + ends of the bar. The special provision that JpGraph does is that if you + add a left or right marker of type MARK_LEFTTRIANGLE or + MARK_RIGHTTRIANGLE those triangles will be drawn under the bars to give + the effect as show in the examples above. In the example above we also + have made the grouping bars have slightly less heigh since the end + triangles will visually "grow" the bar.
+So to get the effect we want for a group bar we have to use the two + lines:
+ $groupbar->
+leftMark->
+SetType(
+"MARK_LEFTTRIANGLE");
+
$groupbar
+->rightMark->SetType(
+"MARK_RIGHTTRIANGLE")
+
As of the current version There is not yet any formatting support to + accomplish the effect of indentation for the titles so this is + accomplished by using a fixed width font and adding spaces in front of + the title.
+Precisely as before you can also have a title spanning all the + columns. This title is specified with the property tableTitle of + the scale. Specifying a table title will automatically adjust the + height of the column titles to fit the table title. The small code + snippet below shows how to add a title.
$graph
+->scale->tableTitle->
+Set('Phase 1');
+
$graph->scale->
+tableTitle->
+SetFont(
+FF_ARIAL,
+FS_NORMAL,12);
+
$graph->scale->
+SetTableTitleBackground(
+'darkgreen@0.6');
+
$graph->scale->
+tableTitle->
+Show(true);
A full example of this is shown below
+ +In exactly the same way as for a single title it is possible to + specify individual CSIM targets for each of the title columns. This is + accomplished by specifying an array for both the target and the alt + text instead of a single string as arguments for SetCSIMTarget() + The following code snippet shows how to specify that.
$bar
+->title->SetCSIMTarget(array('sometarget1.html','sometarget1.html'),
+
array('alttext1'
+,'alttext2'));
Let's start by creating a very simple radar plot based on 5 data + points using mostly default values.
+As the first thing you must remember to include the extension module + that contains the radar plot. "jpgraph_radar.php".
+A very simple radar plot is created by the code
<?php
+
include (
+"../jpgraph.php");
+
include ("../jpgraph_radar.php");
+
+
// Some data to plot
+
$data
+= array(55,80,
+46,71,95
+);
+
+
// Create the graph and the plot
+
$graph
+= new RadarGraph
+(250,200,
+"auto");
+
$plot
+= new RadarPlot
+($data);
+
+
// Add the plot and display the graph
+
$graph->Add(
+$plot);
+
$graph->Stroke();
+
?>
and would give the result
+To change the size and position of the radar graph is similar to the + pie plot and you do it by using the methods + SetSize() and + SetCenter()
+If you want a filled radar plot you need to specify the fill color + with the method + SetFillColor() The following example shows these methods in action
+ +It is often of interest not only to show one title for a gantt bar + but often one wants to show, title, start date, end date, duration or + effort and so on. Up until now we have, to keep things simple only + shown a single title for each activity. We will now show you how you + can specify an arbitrary number of columns as titles for a Gantt chart + as well as adding icons in the graph columns.
+First out is an example to help visualize what we will achieve
+To use multiple columns there is two steps. First you need to set + the titles (name, color, fonts etc). Thereafter you need to add the + title columns for each individual bar.
+To set the columns you will have to work with the Activity + information property of the scale. The following code excerpt show + this
+ $graph->scale->actinfo
+->SetColTitles
+(
+
array('Note'
+,'Task','Duration',
+'Start',
+'Finish'),array(
+30,100));
You will notice two things. We fist specify the titles using an + array. We have also specified a second array with the numbers 30 and + 100. This is an optional array that specifies the minimum width of, in + this case, the first two columns. By default the columns will be wide + enough to hold the widest text string in the column. However for + esthetic reasons you might sometimes want to increase the minium width. + This is what we have done here for the first two columns.
+Furthermore you can also adjust the background colors and the style + and colors of the vertical dividing grid lines. In the previous image + we used the lines
$graph->
+scale->actinfo->SetBackgroundColor('green:0.5@0.5');
+
$graph->scale->
+actinfo->
+SetFont(
+FF_ARIAL,
+FS_NORMAL,10);
+
$graph->scale->
+actinfo->vgrid->SetStyle
+('solid');
+
$graph->scale->
+actinfo->vgrid->SetColor
+('gray');
The style for the grid lines can also be "dashed", "dotted" or + "longdashed" as in other line formatting contexts within the library. + You can also adjust if you would like the small "3D" effect in the + titles. By default this is enabled. You can easily turn this of with a + call to
+ $graph->scale->actinfo
+->SetStyle(ACTINFO_2D);
+
To adjust the colors of the vertical dividing lines in the title the + method SetColor() is used as in + "$graph->scale->actinfo->SetColor('navy');".
+The second thins is to actually populate the columns. This is done + (of course) as you add the activity bars to the graph. Previous we just + used a string as the title when we wasn't using columns. By simply + replacing this string with an array we specify the content of the + columns.
+For example to specify two column titles we just create a + hypothetical Gantt bar as In the full example above we put all this in + arrays to make for better coding practice since we create several bars.
+In addition to ordinary text you can also add an image or any of the + predefined icons available. In order to add that in a column you first + create an instance of IconImage() and then specify that instance + instead of the text. So in the previous code snippet if we wanted a + "open folder" image in the first column we would change the lines to
+ $iconopen = new
+IconImage(
+GICON_FOLDEROPEN,
+0.6);
+
$title2="";
+
$bar
+= new GanttBar
+(0,array($iconopen,
+$title2),
+"2003-11-23",
+"2003-12-05");
+
The available builtin icons are
+In addition you can also use any of you own images if you specify + the argument as a string, for example
+ $myicon = IconImage(
+'myicon.png');
+
If you wonder, the second argument in the IconImage() call is + an optional scaling factor which you can use to adjust the size of the + image.
+The (default) white area in the top left of the gantt table may have + a title. This is accessed by the 'tableTitle' property of the gantt + scale. Using this is straightforward as the following lines show.
$graph
+->scale->tableTitle->
+Set(
+"(Rev: 1.22)");
+
$graph->scale->
+tableTitle->
+SetFont(
+FF_FONT1,
+FS_BOLD);
+
$graph->scale->
+SetTableTitleBackground(
+"silver");
+
$graph->scale->
+tableTitle->
+Show();
+
The example lines above also changes the default white background to + silver. Adding these lines to the previous example gives the following + result:
+From the above example you might notice that the width of the left + column (which holds all the titles) have automatically adjusted itself + to make the table title fit.
+The vertical and horizontal lines between the titles and the bars + can be modified by accessing the 'divider' and 'dividerh' properties of + the scale. Again, this is straightforward as the following example + shows:
+ $graph->scale->divider
+->SetWeight(3);
+
$graph->scale->
+divider->
+SetColor(
+"navy");
+
$graph->scale->
+dividerh->
+SetWeight(3);
+
$graph->scale->
+dividerh->
+SetColor(
+"navy");
+
The effect of this is shown in Figure 167 below
+ +In a similar manner to the other plots in JpGraph you modify the Box + round the plot with the standard graph method 'SetBox()' as in
$graph
+->SetBox(true,
+"navy",3)
which will result in a thicker plot box around the area as shown + below
+In order to make large charts easier to read it is possible to + specify alternating an horizontal grid and optional alternating line + colors in the background for Gantt charts. The horizontal grid is + accessed through the Graph::hgrid property and the line (used in + the grid) is accessed through the Graph::hgrid::line + sub-property
+In order to specify the alternating line colors the + SetRowFillColor() method is used. For example, to use alternating + blue background with blue grid line the following lines would have to + be added to the graph script
+
+// Setup a horizontal grid
+
$graph->hgrid->
+Show();
+
$graph->hgrid->
+line->SetColor('lightblue'
+);
+
$graph->hgrid->
+SetRowFillColor(
+'darkblue@0.9');
+
Below is an example of a Gantt graph using this formatting
+ +
+ $icon = new IconPlot(
+'penguin.png',
+0.01,0.95,1
+,15);
+
$icon->SetAnchor(
+'left',
+'bottom');
+
$graph->Add(
+$icon);
+
$graph
+= new GanttGraph
+(500);
+
$graph->SetMargin(
+0,0,30
+,0);
In this section we will show a few more way by which you may + customize the gantt chart itself. This includes
+We normally would like something more meaningful as description of + each axis than it's number. Specifying the titles are accomplished + through the use of the method SetTitles() of the graph. Let's say that + each axis corresponds to a month. We could then use the code
$titles
+= $gDateLocale
+->GetShortMonth
+();
+
$graph->SetTitles(
+$titles);
+
As you can see the way radar plot is constructed will assign the + titles (and plot points) in a counter-clockwise direction. If you want + them in clock-wise order you will have to inverse your input data array + as well as the title array.
+To specify a legend you (as with the other plot) make use of the + SetLegend(); method on each radar plot.
+Each major tick mark can also be connected together to create a + grid. The grid is accessed through the 'grid' property of the graph. To + enable the grid and set the line style to "dotted" you would have to + add the lines
+ $graph->grid->Show
+();
+
$graph->grid->
+SetLineStyle(
+"dotted");
+
and would result in the following graph
+By design the plot is above the grid line but beneath the axis in + image depth, hence some part of the grid lines are hidden.
+To have the grid lines more "visible" just change their color, say + to, dark red by invoking the SetColor() method on the grid lines which + would give the following result
+Another simple change we could do would be to just change the + background color of the radar graph. This is (not surprisingly) done by + a call to the method SetColor() invoked on the graph object.
+ +As we have shown in the previous examples constructing a Gantt chart + consists of a number of repetitive tasks; Create the individual + activity bars and add them to the graph.
+Now when you have a basic understanding of how this works you are + ready to appreciate a small helper method. +GanttGraph::CreateSimple(). This method takes a few arrays of data + which specifies you Gantt chart and then constructs this chart. By + using this method you sacrifices a few adjustment possibilities for + simplicity. This method is nothing magical it just takes the data for + the activities,(start and end date, titles, progress, any constrains + and so on) and constructs the activities and adds them to the graph.
+The activities are specified in data array which for each activity + have the following fields
+So for example to create a Gantt chart consisting of two activities + which are grouped and a milestone one would have to use something + similar to the following code
+
+ $data = array(
+
array(0,ACTYPE_GROUP, "Phase 1", "2001-10-26",
+"2001-11-23",
+""),
+
array(1,ACTYPE_NORMAL, " Label 2", "2001-10-26",
+"2001-11-13",
+"[KJ]"),
+
array(2,ACTYPE_NORMAL, " Label 3", "2001-11-20",
+"2001-11-22",
+"[EP]"),
+
array(3,ACTYPE_MILESTONE," Phase 1 Done", "2001-11-23",
+"M2") );
+
+
// Create the basic graph
+
$graph
+= new GanttGraph
+();
+
$graph->title->
+Set(
+"Gantt Graph using CreateSimple()");
+
+
// Setup scale
+
$graph->ShowHeaders(
+GANTT_HYEAR |
+GANTT_HMONTH |
+GANTT_HDAY |
+GANTT_HWEEK);
+
$graph->scale->
+week->SetStyle(WEEKSTYLE_FIRSTDAY);
+
+
// Add the specified activities
+
$graph->CreateSimple(
+$data);
+
+
// .. and stroke the graph
+
$graph->Stroke();
+
This will then show up as
+You may (slightly) modify the appearance of the simple Gantt charts + by means of the methods GanttGraph::SetSimpleFont() and GanttGraph::SetSimpleStyle() But not anything else, remember + that the purpose with this way of constructing graphs is to be simple. + If you need full advanced control you have to construct all the + activities in the "normal" way.
+You can also specify constrains and progress for each bar by + supplying additional data arrays to GanttGraph::CreateSimple().
+Gantt charts can have independent (different targets) hot spots in + both the activities and in the associated labels for each activity.
+You specify the target and the associated "Alt" text for an activity + bar by calling the + GanttBar::SetCSIMTarget() and + GanttBar::SetCSIMAlt()
+In a similar way you set the target and Alt texts for the activity + title as the following code extract shows.
$bar
+->SetCSIMTarget
+("http://localhost/abc/"
+);
+
$bar->SetCSIMAlt(
+"Alt Text for the bar");
+
$bar->title->
+SetCSIMTarget(
+"http://localhost/abc");
+
$bar->title->
+SetCSIMAlt(
+"Alt Text for the title");
+
The above code assumes that your activity is available in the + variable 'bar'. In the example directory there is a complete example of + how to use CSIM together with Gantt charts in the "ganttcsimex1.php" + file. (Please note that this example makes use of the simplified Gantt + chart specification using the CreateSimple() method.
+You can easily create several radar plot which are added to the same + radar graph. The thing to remember is that if you use filled radar + plots and they overlap each other that the order which they are added + will be the order they are drawn.
+A simple example of this is shown below
+ +With Gantt charts there is often the need to illustrate constrains + between one or several activities. One of the most common constrain is + that on activity can't start before an other activity finish.
+JpGraph support visualizing the following types of constrains
+An example will clarify how to specify a constrain between two + activities.
+Assume that we start with the Gantt schema as illustrated below
+We would now like to add the constrains that the activity "Label 3" + cant start before activity "Label 2" has finished and that the + milestone "Phase 1 done" is depending on when activity "Label 3" is + done.
+The principle of adding constrains is that you for each activity you + want to have a constrain you have to tell to what other activity this + constrain should be to. That other activity is specified by telling on + what row that activity lies. Depending on what type of constrain, e.g. + Start-to-End, an arrow will now connect the two activities in correct + way.
+The way to do this is to call the + SetConstrain() method on the activity. In this method you specify + the type of constrain as well as to what other activity this constrain + should be to. If you read the class reference you can also see that you + can specify the type and size of arrow used. For now we will just use + the default sizes and type.
+So for example to add an End-To-Start constrain between "Label 2" + and "Label 3" you could write
+ $bar2->
+SetConstrain(2,CONSTRAIN_ENDSTART)
The first parameter in the call above "2" is the row of the target + activity (i.e. the row where "Label 3") activity is. In the example + below we have added the constrains we wanted.
+A note: The actual path followed by the arrow is controlled by some + heuristics to make it clear what the constrain is. It has been a design + decision that in order to keep the API simple the user has no further + detailed controlled on the actual path followed. However, in future + version the heuristics may be extended and provide some + user-controllable parameters.
+In exactly the same way as for line graphs it is possible to add + plot marks in radar plots. The mark property is accessed through the + RadarPlot::mark The example below adds a red ball as a marker.
+ +You can choose to only display a vertical slice of the overall Gantt + chart by explicitly specifying a date range with the method + GanttGraph::SetDateRange(). This will cap any bars to only be displayed + in between the start and end date given as parameters. For example + specifying
+ $graph->
+SetDateRange(
+"2001-12-20",
+"2002-01-20");
+
will show the part of the Gantt chart between the 20 Dec 2001 and 20 + of January 2002. Please note that the format depends on the locale + setting.
+You can set the week start day with a call to + GanttScale::SetWeekStart(). This method takes an integer [0,6] as input + which represents the start day of the week, 0 means Sunday, 1 Monday, 2 + Tuesday and so on. The default is to start the week on Monday.
+Depending on your installation of PHP you might have support for + several locales. By default the locale is set up to use the default + locale on the server.
+To specifically set a locale you specify the wanted locale with a + locale string (ala standard PHP), for example American English is + specified with the string 'EN_US', British English with 'EN_UK' 'nl_NL' + for Dutch and so on. If your current installation does not support the + specified locale an error message will be given.
+ $graph
+->scale->SetDateLocale(
+"se_SE");
+
The result is displayed below.
+ +Anti-aliased lines are enabled by calling the method + SetAntiAliasing() in the + Image class in the script where you want to use anti-aliasing.
+The anti-aliasing for lines works by "smoothing" out the edges on + the line by using a progressive scale of colors interpolated between + the background color and the line color.
+An example will show that this, quite simple algorithm, gives a + reasonable good result. The figures below shows a radar plot with and + without anti-aliasing.
+ + + + +One thing you need to keep in mind when deciding to use + anti-aliasing is that it could have potentially a dramatic effect on + the time it takes to generate the image. Line drawing with + anti-aliasing turned on is roughly 8 times slower than the normal line + drawing so treat this feature wisely.
+Furthermore there are a couple of "gotchas" you should be aware of + when using anti-aliasing.
+From version 1.2 JpGraph supports drawing of anti-aliased lines. + There are a few caveats in order to use this which is discussed in this + section.
+JpGraph provide the possibility for you to rotate the generated + graph an arbitrary angle. This will only affect the actual graph (axis, + axis titles, labels and so on) and not fixed elements on the graph like + title or footer.
+Rotation is probably most used to rotate a graph 90 degrees, for + example a bar graph to get the effect of horizontal bars.
+ +Performance note: Adding a rotation transformation + will make the graph generation slightly slower since each point of the + graph as to go through a transformation step before being stroked on to + the image. JpGraph optimizes this by using a pre-calculated + transformation matric and also optimizes the special case 90 degrees.
+ +By default the center of the rotation will be the center of the plot + area, which may or may not coincide with the center of the entire + image.
+To control the rotation you use the two methods
+For example
+ $graph->image->SetAngle
+(45);
There is actually a third method that you could use, adding a + translation to the graph after the rotation. Since + this probably a very little used method we don't discuss it further but + refer the reader to the class reference instead + Graph:image::SetTranslation()
+ When you rotate an image you should be aware of that the individual
+ labels on the axis are not rotated. The design decision behind this is
+
a) Bit mapped font can't be rotated
+
b) Maintain readability
Please remember that you may still rotate the labels by calling the Axis::SetLabelAngle() + method.
+Since the anchor point for labels is by default the optimum for + graph at 0 degree you might want to adjust the anchor point and + alignment for the labels on the axis to get a better visual appearance + on you rotated graph. This is accomplished by the method + Axis::SetLabelAlign() For a detailed discussion on how to do this + please see the section on horizontal bar graphs, ( +Working with bar plots )
+The table below shows some examples on different kinds of rotation + to give you an idea of how changing the angle and rotation center may + be used to generate different effects. The top left graph is the + original image. The point of rotation has been marked with a red-cross + in each of the images.
+ + + + + + + +As you can see from the images above if you rotate about any other + point than the center of the plot area the plot can be placed outside + the image after rotation.
+Since the rotation, by design, only affects the plot area it is + often most effective to use when the color of the margin is the same as + the background color.
+Spider plots are most often used to display how a number of results + compare to some set targets. They make good use of the human ability to + spot symmetry (or rather un-symmetry) . the figure below show an + example of a spider (sometimes called a web-plot). Spiderplots are not + suitable if you want very accurate readings from the graph since, by + it's nature, it can be difficult to read out very detailed values.
+ +In the following section we show how to draw both simple and complex + radar graph. As we will show all the settings will follow the same + pattern as for the more standard linear graphs.
+The cynical view: To explain why your project is over-due and + over-budget.
+The pragmatic view: To keep management of our back and know what we + have forgotten
+The common view: As a tool to help identify project issues and + highlight problem areas.
+Basically, Gantt charts are used to show the state of a number of + activities (possible grouped) against time.
+The following section only applies to palette images. This + means it wont work on true-color images.
+It is often desirable to have a background image look a little bit + "washed" out so it doesn't take the concentration away from the actual + graph. There are basically two ways of accomplish this
+To adjust the background image call The levels for both brightness + and contrast are real numbers in the range [-1, 1] You can choose to + adjust for example just the background image or you might also choose + to adjust the whole image. To change the background image just use the + method + Graph::AdjBackgroundImage() to specify a suitable value. Let's show + some example on what we can do with this. The following example have + been generated by using the small utility "adjimg.php" which you can + find in the "utils/" directory.
+
+
Brightness=0, contrast=0, saturation = -1 (Original image)
+
Brightness=0, contrast=0, saturation = -1 (Black & White image)
+
Brightness=0.3, contrast=-0.3, saturation=0
+
Brightness=0.4, contrast=-0.7, saturation=0
+
Brightness=0.4, contrast=-0.7, saturation=-1
+
Brightness=0, contrast=0, saturation=1
For very busy Pie plots it can become too little space for the + labels to be printed just beside the pie slice. For this purpose it is + possible to use guide lines for the labels. The library will then draw + a line from the center edge of the slices to the label which will be + positioned further out from the Pie Plot.
+There is one method that is primarily used to handle this, + PiePlot::SetGuideLines() the simplest usage of this would be
$pieplot
+->SetGuideLines
+();
An example of this could then be
+The above example will give guide lines very similar as what is + produced by other programs, e.g. Excel. In addition to the above + variant it is also possible to instruct the library to line up the + labels vertically in a way that we think is easier to read. This is + achieved by specifying the second parameter to the SetGuideLines() to + 'false' as in
$pieplot->
+SetGuideLines(
+true,false);
The first parameter is to enable/disable the guide-lines. With the + same example as above this would then produce the image
+It is also possible to configure the vertical distance between the + labels. By default the distance between the labels is roughly 40% of + the labels font height. By using the method + PiePlot::SetGuideLinesAdjust() it is possible to specify a + fractional value which is interpretated as the distance between the + bottom of one label to the bottom of the next. This means that + specifying a value of '1.0' the labels will have no space between them + and the bottom of one label will touch the top of another label. By + default this value is 1.4.
+By increasing or decreasing this value it is possible to make the + labels become positioned more or less compact. Below we have taken the + above example and reduced the distance to '1.1' and as can be seen this + yields much more compact labeling.
+ +Note: Guide lines is only available in 2D Pie plots.
+During development and optimization it can be very handy to have the + actual time it took to generate the image as a footnote. The following + example shows the usage of this feature
+To enable this feature you can proceed in two ways.
+
+ $gJpgBrandTiming=true;
+
in the beginning of the script.
+If you like you might also change the way the timing is formatted by + setting the string defined by BRAND_TIMING_FORMAT (in jpgraph.php). + This string represents a standard printf() format string.
So far we have only made use of 2D pie plots, creating 3D pie plots + is no more difficult. Instead of creating the plots with a call to + PiePlot() you create the plots with a call to + PiePlot3D() If we just take the first simple pie plot and replace + the call to PiePlot() with a call to PiePlot3D() we get the following + result.
+3D Pie plots have the same possibilities as the normal pie plots + with the added twist of a 3:rd dimension. You can adjust the + perspective angle with the method + SetAngle() So for example to make the pie more "flat" you just set + it to a smaller angle. Setting the perspective angle to 20 degrees in + the previous example will give the following result.
+ +JpGraph has built-in support for over 200 country flags, i.e. they + are available to be used in graphs without any external image + definitions.
+Country flags can be used in primarily two settings
+In order to make it easy to find the appropriate country flags they + can be specified with either full or partial name or as an numeric + index. The routines in JpGraph are "smart" enough to figure out which + way you are trying to specify a particular flag.
+To specify a country flag as a marker you have to specify the + special mark type as one of MARK_FLAG1,MARK_FLAG2,MARK_FLAG3 or + MARK_FLAG4
+Flags are internally stored in 4 different sizes which is indicated + by the number in the mark types. Flags may also be arbitrary scaled + when displayed. Since this is partially overlapping functionality you + might very well ask why the flags are stored in four different basic + sizes. The reason is of course performance. It you only want a very + small flag it takes processing time to scale down a large image to, + say, a small icon size. At the same time for large flags to be used as + background a small original flag might not have enough details to be + scaled up to a large size. Hence the reason for storing the flags in 4 + different sizes.
+The example below shows how to use country flags as markers
+To use country flags as background one has to use the method + Graph::SetBackgroundCountryFlag(). With this method you can specify + both how much of the image should be filled as well as how much of the + flag should be mixed into the background.
+To see a list of all supported country flags you can run the script + "listallcountryflags.php" in the Example directory. This will show you + a table with all flags.
+In addition to the standard background image you can also add an + arbitrary number of icons onto the background of the graph. These icons + are created with a call to the special Plot class IconPlot.
+The image from icons are taken from a file or as one of the builtin + country flags.
+You may control how much of the icon should be blended into the + background by specifying a percentage (1-100). The example below shows + how to mix in the picture of "Tux" into the background of a filled line + graph. Note: This example uses alpha blending and will therefore + require GD2.
+To specify any of the roughly 200 country flags as an icon you first + create an empty Icon and then call the IconPlot::SetCountryFlag() with + the appropriate parameters. (See the class reference). This is + illustrated below by adding the Icelandic flag into the background as + an icon
+One way to attract attention to some specific piece of information + in a pie chart is to "explode" one or more slices. Both 2D and 3D pies + support exploding one or several slices.
+Exploding slices is accomplished by the methods + Explode() and + ExplodeSlice() The first method is used if you want to explode more + than one slices and the second is a shorthand to make it easy to just + explode one slice.
+For example to explode one slice the default "explode" radius you + would just have to say
+ $pieplot->ExplodeSlice(
+1)
+
The above line would explode the second slice (slices are numbered + from 0 and upwards) the default amount. Doing this to the two previous + example would result in
+ + + +To explode all slices at once you can use the + PiePlot::ExplodeAll() method. If you want to explode several slices + you can use the + PiePlot::Explode() method and supply a suitable array argument.
+By default the values shown just outside the pie for each slice are + the percentage value for each slice. If you instead wanted the absolute + value you would just have to use the + SetLabelType() method. So to use the absolute value you would call
+
+ $pieplot->
+SetLabelType(
+"PIE_VALUE_ABS");
+
Furthermore you could enhance the formatting of the value by either + using a printf() style format string (using + SetFormat() ) or by providing a formatting function callback (using + + SetFormatCallback() ) for doing more advanced formatting.
+You can also adjust the position of the labels by means of the + PiePlot::SetLabelPos() method. The argument to this method is + either the fraction of the radius or the string 'auto'. In the latter + case JpGraph automatically determines the best position and the the + first case The following example illustrates this
+ +If this formatting is not enough you can also "manually" specify the + labels for each slice individually. You do this by using the + PiePLot::SetLabels() method. This will let you specify individual + text strings for each label. In each specification you can also add a + printf() formatting specification for a number. The number passed on + will be either the absolute value for the slice or the percentage value + depending on what was specified in the call to + SetLabelType()
+The SetLabels() method can also take a second parameter, the label + position parameter. This is just a shortcut to the SetLabelPos() as + described above. By default the position will be set to 'auto' if not + explicitely specified.
Another typical change would be to change the colors of the slices. + There are two fundamental ways of doing this. You either manually + specify the colors for the slices as an array using the method + SetSliceColors() If you specify fewer colors than the number of + slices they will just wrap around.
+Another way is to use one of the pre-defined color "themes". This is + just a predefined set of colors that will be used for the slices. You + choose what "theme" you like to use with the method ( + SetTheme() ) At the time of this writing the available themes are
+The following example shows the same pie using the different + "themes" in order.
+ + + + +A complete color chart of all available colors in the different + themes can be found here
+Another simple change is to remove the border ( or change it's + colors ) that separates each slice. This can be done by a call to + ShowBorder()
+An additional visual enhancements can be made by adding a drop + shadow to the individual slices. This is accomplished by means of the PiePlot::SetShadow() + method. Adding a drop shadow is often more affective if the pie has one + or more slices exploded as the following example shows
+ +As mentioned in the beginning there are two versions of the 2D pie + plots. The normal pie plot created as an instance of + class PiePlot and a variant created as an instance of + class PiePlotC
+This variant is an extension of the standard PiePlot in the sense + that it also have a filled circle in the center. The following example + illustrates this
+ + +Since the PiePlotC is an extension to the basic pie plot all the + normal formatting you can do for pie plots you can also do for the + PiePlotC .
+The additional formatting only concerns the filled middle circle. + You have the option of adjusting size, fill color and all font + properties. You perform these operations with the methods
+ ++PiePlotC::SetMidColor() | Set fill color of mid circle |
+PiePlotC::SetMidSize() | Set size (fraction of radius) |
+PiePlotC::SetMidTitle() | Set title string (may be + multi-lined) |
+PiePlotC::SetMid() | Set all parameters in a single method + call |
In addition to the normal CSIM for PiePlot:s the center area is also + a CSIM hotspot. You specify the target CSIM with a call to + PiePlotC::SetMidCSIM()
+The next example shows an example with some more innovative + formatting. In this example we have :
+So far we have just show plots based on an X-Y coordinate system. + This is not the only types of graphs you can create with JpGraph. + Another common type is Pie plots. JpGraph supports both 2D and 3D pie + plots. For 2D pie plots there are also 2 versions, but more on that + later.
+The main difference as compared to the X-Y plots is that to all pie + plots are added to the + PieGraph() instead of the Graph() object we used for the X-Y graphs + we have drawn so far. For this you must first include the + "jpgraph_pie.php" in your script (or "jpgraph_pie3d.php" if you want to + use 3-dimensional pies).
+Below you cane see the code needed to create the simplest possible + pie graph just using the default settings.
+
+ include (
+"../jpgraph.php");
+
include ("../jpgraph_pie.php");
+
+
$data
+= array(40,60,
+21,33);
+
+
$graph
+= new PieGraph
+(300,200);
+
$graph->SetShadow();
+
+
$graph->title->
+Set(
+"A simple Pie plot");
+
+
$p1 = new PiePlot(
+$data);
+
$graph->Add(
+$p1);
+
$graph->Stroke();
+
The above code would give the following pie graph
+There is a few things worth noting here
+You can change almost all aspects of appearance of the pie graphs. + For example you could change :
+The next simplest addition we can do is to add a legend to the pie + graph. We do this by using the + SetLegends(); method. By adding the legends to the previous example + we get the following image
+ +(In the figure above we also moved the center of the pie slightly to + the left to make more room for the legend box.)
+The text for the legends can also contain printf() style format + strings to format a number. This number passed on into this string is + either the absolute value of the slice or the percentage value. How to + switch between the is describe further down in this chapter.
+The next change you might want to change is the size and position of + the Pie plot. You can change the size with a call to + SetSize(); and the position of the center of the pie plot with a + call to SetCenter(); + The size can be specified as either an absolute size in pixels or as a + fraction of width/height (whatever is the smallest). The position of + the pie plot is specified as a fraction of the width and height.
+To put the size and positioning API to use we will show how to put + several pie plots on the same pie graph. In the following example we + have also adjusted the legends of the slice values to use a smaller + font.
+What we do in this example is quite simple, create 4 pie plots, make + them smaller and put them in the four corner of the graph. This will + give the result as shown in the following example.
+ +Each data point in a polar plot is represented by a tuple consisting + of a radius and an angle. The polar plot itself can be either outlined + or filled. In addition each point may have a standard marker (the same + as for line and scatter plots).
+The scale for the radius can be either linear or logarithmic.
+A polar graph is created by creating an instance of +PolarGraph::PolarGraph(). The polar graph type inherits all the + capabilities of ordinary X-Y graphs, i.e they can have background + images, background gradients, tabbed titles and so on.
+Polar graphs comes in two basic types, they can either show a full + 360 degree graph or a half 180 degree graph. The two examples below + show these two basic types of graphs.
+ + + +The radius axis can be shown in either a linear or logarithmic + scale. This is controlled, as usual, by a call to +PolarGraph::SetScale() The two examples below show the same plot in + either linear or logarithmic scale
+ + + + +Please note that the maximum values of the scales are different.
+By default the scale will be auto scaled depending on the data. You + can also specify a manual scale by supplying an extra argument to the + SetScale() value. The only difference from the manual scaling with the + other X-Y-graphs is that for polar graph you only specify a manual + maximum. The minimum will always be 0 for the linear scale and a scaled + value of 10 (i.e 1, 0.1, 0.001 and so on) for the logarithmic scale.
+The plot is clipped to the plot area so if you specify a smaller + scale then the maximum value that part of the plot that are outside the + plot area will be clipped.
+As usual you have full freedom to select what grid lines you like to + show (and what colors they should have). There are three different + types of grid lines you may adjust. The radius minor and major grid + lines and the angle grid lines.
+You select what grid lines to show with a call to +PolarAxis::ShowGrid() The two example below shows a logarithmic plot + with either just major grid lines or both minor and major grid lines.
+ + + +The colors of the grid lines are specified with a call to + PolarAxis::SetGridColor()
+For the angle grid lines it is possible to specify the angle + division between each grid line with the method + PolarAxis::SetAngleStep() You specify the step distance in degrees. + By default the step size is 15 degrees.
+You can individually specify different fonts and colors for the + angle and the radius labels. The radius font is specified with + PolarAxis::SetFont() and the angle font is specified with a call to + PolarAxis::SetAngleFont()
+You can adjust the color with the method +PolarAxis::SetColor() ?>
+The following example specifies different color for the labels. it + also shows that you can add both a radial axis title as well as a + tabbed title. In this example we have also chosen not to show the frame + around the edge of the plot.
+As can be seen from the previous examples the angle labels have a + small superscripted "o" after each label. You can select if you like to + show this degree mark or not with a call to the + PolarAxis::SetANgleDegreeMark() method by which you can enable or + disable that mark after the angels.
+For the radius labels all standard formatting that can be done to + the X-Y axis such as format string or format callbacks are supported.
+A common modification for polar plots is probably to disable the + display the last label when using a 360 degree plot since the last + label will "collide" with the plot box around the plot area. It is + possible to disable the last label with a call to +Axis::HideLastTickLabel() As you can see this has been used in some + of the examples in this chapter.
+If you have specified markers for the polar plot (by setting the + mark property of the plot) each marker can be a hot spot in a client + side image map. The target URL are as usual specified with the + SetCSIMTargets() as the following short code excerpt shows
+// Start by specifying the proper URL targets
+
$targets
+= array("#1","#2", ....... );
+
$polarplot
+= new PoalrPlot
+($data);
+
$polarplot
+->mark->SetType(
+MARK_SQUARE);
+
$polarplot
+->SetCSIMTargets
+(targets);
+
$graph->Add(
+$polarplot);
+
$graph->StrokeCSIM();
+
As a final example we show a full 360 degree polar plot with square + markers as well as background color gradient and a legend for the plot.
+ +Time to show you an example of a Gantt chart and how easy it is to + make one. Lets make it the simplest possible Gantt chart. One activity, + named "Project", which lasts from "2001-11-01" to "2002-02-20".
+All it takes to do this (using default values for everything) is the + following code.
<?php
+
include (
+"../jpgraph.php");
+
include ("../jpgraph_gantt.php");
+
+
// A new graph with automatic size
+
$graph
+= new GanttGraph
+(0,0,
+"auto");
+
+
// A new activity on row '0'
+
$activity
+= new GanttBar
+(0,"Project",
+"2001-12-21",
+"2002-01-20");
+
$graph->Add(
+$activity);
+
+
// Display the Gantt chart
+
$graph->Stroke();
+
?>
+
The resulting image is shown in Figure 147 below.
Let's note a few things with the above image and code:
+So, lets start making this graph a little bit more interesting. + First we are going to add a title, then we will add a month scale and + finally we will change the color of the bar.
+All that is taken care of in the code below.
<?php
+
include (
+"../jpgraph.php");
+
include ("../jpgraph_gantt.php");
+
+
$graph
+= new GanttGraph
+(0,0,
+"auto");
+
$graph->SetShadow();
+
+
// Add title and subtitle
+
$graph->title->
+Set(
+"A nice main title");
+
$graph->title->
+SetFont(
+FF_ARIAL,
+FS_BOLD,12);
+
$graph->subtitle->
+Set(
+"(Draft version)");
+
+
// Show day, week and month scale
+
$graph->ShowHeaders(
+GANTT_HDAY |
+GANTT_HWEEK |
+GANTT_HMONTH);
+
+
+// Instead of week number show the date for the first day in the week
+
// on the week scale
+
$graph->scale->
+week->SetStyle(WEEKSTYLE_FIRSTDAY);
+
+
+// Make the week scale font smaller than the default
+
$graph->scale->
+week->SetFont(FF_FONT0
+);
+
+
+// Use the short name of the month together with a 2 digit year
+
// on the month scale
+
$graph->scale->
+month->
+SetStyle(
+MONTHSTYLE_SHORTNAMEYEAR2);
+
+
+// Format the bar for the first activity
+
// ($row,$title,$startdate,$enddate)
+
$activity
+= new GanttBar
+(0,"Project",
+"2001-12-21",
+"2002-01-20");
+
+
+// Yellow diagonal line pattern on a red background
+
$activity
+->SetPattern(BAND_RDIAG,
+"yellow");
+
$activity
+->SetFillColor
+("red");
+
+
// Finally add the bar to the graph
+
$graph->Add(
+$activity);
+
+
// ... and display it
+
$graph->Stroke();
+
?>
+
From the above example you might note a few things
+To show that this is really simple let's show the full year in the + month, and set the header style to be white text on a dark blue + background by adding the lines
+
+// Use the short name of the month together with a 4 digit year
+
// on the month scale
+
$graph->scale->
+month->
+SetStyle(
+MONTHSTYLE_SHORTNAMEYEAR4);
+
$graph->scale->
+month->
+SetTextColor(
+"white");
+
$graph->scale->
+month->
+SetBackgroundColor(
+"blue");
+
to the code above. The resulting image is shown in Figure 149
+ +A Gantt chart is made up of four distinct areas.
+Since a Gantt chart inherits all the usual properties of a JpGraph + Graph() you have the access to the same method to formatting the image + as before. For example to have a shadow around the image you call + Graph::SetShadow() and to set the margin color you can use + Graph::SetMarginColor(). Please refer to the reference documentation + for a full list of supported features.
+To create a Gantt chart you add objects to it. As + of this writing you may add the following object by the use of the + GanttChart::Add() method
+All these objects may be extensively modified in terms of + formatting. You can specify color (both fill- and frame color), size, + titles, style and patterns and so on. All these objects comes with (in + my mind) sensible default so you don't have to specify a lot of + parameters. But if you need a fine grain control or if you disagree + with my taste you can.
+You create a new Gantt Chart with a call to GanttChart(). The + signature for GanttGraph is the same as for ordinary JpGraph graphs, + i.e
+ function
+GanttGraph(
+$aWidth,
+$aHeight,
+$aCachedName,
+$aTimeOut,
+$aInline)
+
The only real difference is that for GanttCharts you can specify one + or both of the dimension parameters (width and height) as -1 in which + case that dimension will be automatically sized determined by scale and + fonts chosen. The following examples shows some possible ways of + creating a new graph
+Since GanttGraph() inherits all the methods (that make sense for + GanttGraph) from Graph you can specify shadow, color etc of the general + frame.
+Bars and Milestones need both a vertical position and a horizontal + position. The horizontal start position is specified as a date, e.g. + "2001-06-23", and the vertical positions are specified as a number + [0,1,2,3,...]. This vertical number indicates the position from the top + where the object should be placed. To understand this you might imagine + a number of "invisible" horizontal bands with a certain height. If you + specify 0 as the vertical position the bar will be placed in the first + band, specify 3 and the bar will be placed in the fourth band and so + on.
+It is perfectly legal, and perhaps even desirable to leave "gaps" + when laying out bands to group related activities. So, for example you + could have three activities/bars at positions 1,2,3 and then another 2 + bars at position 6,7 leaving band 0,4,5 empty.
+All these "invisible bands" have the same height (equ-spaced). The + height of each band is automatically determined and depends on both the + method of layout ( as specified by (GanttChart::SetLayout()) and the + individual heights of the individual bars and titles. The rules are + quite simple:
+As described above vertical positions are specified as a numeric + value [0..n] where 'n' is an arbitrary constant. (For practical + purposes n is most likely < 100)
+Using our previous example we will illustrate this parameter by + changing the position of our 'Project' activity to position 7. Therefor + we change the call to GanttBar() to
+ $activity = new GanttBar(
+7,"Project","2001-12-21"
+,"2002-02-20"
+);
and we then get the chart as shown below in Figure 150.
+ +Note that the height of each position (vertical position) will + depend on the actual height of the bar.
+Start of bars are given as a date string. The format depends on the + current locale. Examples of valid date strings are
+Even if several format are supported it is recommended to use all + numeric dates, i.e in the form "2001-10-22".
+Specifying the end position may be done in two different ways, + either by the end date in the same way as for the start date. The other + way is to specify the length of the activity in number of days + (and fractions thereof). Examples of valid end dates are:
+Please note that duration is specified as numerical values and + not strings.
+Milestones are similar to bars but have no end date since milestones + just apply to one single date. Milestones are created much the same way + as activities but using method MileStone() instead.
+The full signature for milestones are
+function MileStone
+($aVPos,$aTitle,
+$aDate,
+$aCaption)
+
+
+ $aVPos
+ | The vertical position for the + bar, [0..n] | |
+
+ $aTitle
+ | Title for the activity | |
+
+ $aDate
+ | Date for the milestone | |
+
+ $aCaption
+ | Text to the right of the + milestone |
Valid milestones are for example
+
+ $milestone = new
+MileStone(3,"Code complete","2001-12-01"
+);
+ $milestone = new
+MileStone(3,"Code complete","2001-12-01"
+,"(2001-12-01)"
+);
By default milestones are rendered as a filled "Diamond" shape. This + may be optionally modified. The actual shape is specified by the 'mark' + property of milestone which is an instance of the PlotMark() class + (same class responsible for the marks in line graphs).
+To change the shape of a milestone to, say a triangle, you use the + SetType() method as in
+ $milestone->mark->
+SetType(
+MARK_DTRIANGLE)
+
Let's put this into practice and add a milestone to our previous + example by adding the following two lines of code which result in + Figure 151 shown below.
+ +You may note that by default the title color is red for milestones. + If you like to change this to be instead, say bold black, you would + invoke the SetColor() and SetFont() methods on the title property of + milestones as in
$milestone->
+title->SetFont(FF_FONT1
+,FF_BOLD);
+
$milestone
+->title->SetColor(
+"black");
+
and thew result would now (not surprisingly be)
+To modify the caption you do exactly the same but act on property + 'caption' instead of 'title', i.e.
+ $milestone->caption->
+SetFont(
+FF_FONT1,
+FF_BOLD);
+
$milestone
+->caption->SetColor(
+"black");
+
It is worth noting that you modify the bar title and caption the + exact same way by acting on the 'title' and 'caption' property for the + bars.
+The final object you may add to a Gantt chart is simple, but quite + useful, a straight vertical line extending over the whole plot height. + This could for example be used to illustrate different phases in a + project. You create a line object by a call to GanttVLine()
+The full signature for GanttVLine() is
+function GanttVLine
+($aDate,$aTitle,
+$aColor,
+$aWeight,
+$aStyle)
+
+
+ $aDate
+ | Date for the milestone | |
+
+ $aTitle
+ | Title for the line. The title is + displayed at the bottom of the line | |
+
+ $aColor
+ | Color for the line | |
+
+ $aWeight
+ | Line width | |
+
+ $aStyle
+ | Line style,"dashed", "dotted" and + so on |
Valid creations of lines are for example
+
+ $vline = new
+GanttVLine(
+"2001-12-24");
+
+ $vline = new
+GanttVLine(
+"2001-12-24",
+"Phase 1");
+
+ $vline = new
+GanttVLine(
+"2001-12-24",
+"Phase 1",
+"darkred");
+
+ $vline = new
+GanttVLine(
+"2001-12-24",
+"Phase 1",
+"darkred",5);
+ $vline = new
+GanttVLine(
+"2001-12-24",
+"Phase 1",
+"darkred",5,"dotted"
+);
To add the line to the graph you just have to call GanttGraph::Add() + as with milestones and bars. Let's illustrate the use of vertical lines + by adding a line to the previous example.
$vline
+= new GanttVLine
+("2001-12-24","Phase 1");
+
$graph->Add(
+$vline);
+
and the example (See 153) now becomes
+From the above figure you can see that by default the line is drawn + at the beginning of the day of the specified date and in a 'dashed' + style. This can (of course!) be modified so that the line is + drawn/aligned anywhere in the specified day. You modify this by + invoking the method SetDayOffset() with an argument specifying the + fraction of the day where you want the line positioned.
+If you, for example, want to display the line in the middle of the + day just add the line
+ $vline->SetDayOffset(
+0.5);
+
to the previous code and the result will be
+ +As usual you may modify the font, size and color by invoking the + appropriate method (SetFont(), SetColor()) on the 'title' property of + lines.
+You can easily add a variety of markers both to the start and end of + the gantt bar. They could for example be used as an alternate way to + illustrate important milestones or anticipated deliveries.
+The left and right markers are accessed through the two properties + 'leftMark' and 'rightMark'. They are both instances of the general + 'PlotMark' class which is also used for the milestones (and in line + graphs). The 'PlotMark' class supports several different styles, for + example, diamond (the default for milestones), filled and unfilled + circles, squares, stares, and so on. Please refer to the reference + section for a complete listing.
+Let's illustrate this by adding a right marker to the previous + example. We will use a style of a filled (red) circle with a white + title, say, "M5". In order to accomplish this we must augment the + previous example with the following lines:
$activity
+->rightMark->Show();
+
$activity
+->rightMark->title->
+Set("M5");
+
$activity
+->rightMark->SetType(
+MARK_FILLEDCIRCLE);
+
$activity
+->rightMark->SetWidth(
+10);
+
$activity
+->rightMark->SetColor(
+"red");
+
$activity
+->rightMark->SetFillColor(
+"red");
+
$activity
+->rightMark->title->
+SetFont(
+FF_ARIAL,
+FS_BOLD,12);
+
$activity
+->rightMark->title->
+SetColor(
+"white");
+
This might seem like a lot of lines but this is as complicated as it + possible can get. As an illustration in the example belwo more or less + everything that is changeable has been changed, the default font, + font-color, fill-color, frame-color and width of marker. The two lines + only really necessary are the first two, showing the mark and setting a + title. One could still get a good result by using default values for + the rest of the properties.
+The resulting image can be seen in Figure 155 below.
+We have deliberately introduced a "strangeness" here. If the + previous two examples are compared it can bee seen that the last + example is larger than the previous one. Why?
+The explanation is trivial once we recall that the height of bars + are sized relative to the horizontal spacing. The horizontal spacing + are based on the highest single bar including title size and, here come + the explanation, marker size. The horizontal spacing has grown since + the minimum height is now based on 10 points(=the height of the mark). + The bar still occupy the same percentage of the height so it seems to + have grown.
+If this behavior is unwanted it is always possible to specify an + absolute size for the bar heigh, say 8 pixels, with a call
$activity->SetHeight
+(8);
and achieve the result in Figure 156 below.
+It is worth noting that the height reserved for each bar is still + the same since we haven't changed the height of the marker and the + reserved space is the maximum height used by any bar.
+Let's see what happens if we set the height of each bar to be 100% + of the reserved height by adding another activity/bar below the first + one and set the height of each bar to 100% by adding the lines (We omit + the added lines to add another bar since they are just a copy of the + first bar)
+ $activity->
+SetHeight(1.0);
+
$activity2
+->SetHeight(1.0);
+
to the previous example. (Note that a value in the range [0..1] is + interpretated as the fraction of the reserved height while a value > 1 + is interpretated as the absolute size in pixels.)
+Aha.. What we are trying to do doesn't really make sense. Since we + have specified that the bar will always occupy 100% of the available + reserved with there will be no distance between the bars. So what if we + specify the bar as 10 pixel absolute by changing the lines to
$activity->SetHeight
+(10);
+
$activity2
+->SetHeight(10);
+
we instead get
+So what can we actually do? Well if you remember the reserved height + for each bar is the maximum height of all bars including titles. This + guarantees that no two bars will ever overlap. To guarantee that titles + don't end up too close together there is a Vertical Label Margin + which basically specifies some extra "air" in between the titles. The + amount of air is specified in percent of the title height. To set the + margin you use
+ GanttGraph::
+SetLabelVMarginFactor(
+$aMargin)
+
As an example let's set that margin in the previous example to 0 and + see what happens.
+As you would perhaps expect the two bars just barely touches now + since there are no extra margin added. If the two bars hadn't had the + extra right marker it would have looked very compressed.
+By default the vertical margin is set to 40%.
+The most common of all object in a Gantt chart is of course the + activity bar (GanttBar()). In terms of formatting this object has a + very large flexibility. The full signature for the GanttBar constructor + is
+ function
+GanttBar(
+$aVPos,$aTitle,$aStart
+,$aEnd,$aCaption,
+$aHeight)
+
+
+ $aVPos
+ | The vertical position for the + bar, [0..n] | |
+
+ $aTitle
+ | Title for the activity | |
+
+ $aStart
+ | Start date for the activity given + as string, e.g "2001-09-22" | |
+
+ $aEnd
+ | End date for activity given as either + a date (a string) or as the duration (in days) of the activity, e.g + both "2001-10-15" and 20.5 are valid inputs | |
+
+ $aCaption
+ | Text string (caption) to appear + at the end (right side) of the bar | |
+
+ $aHeight
+ | Height of bar given as either + a value in range [0,1] in which case this is interpretated as what + fraction of the vertical position should the bar occupy. The height can + also be given in absolute pixels [1..200] |
Minute scale is the lowest resolution you can use. It is often + convenient to use Minute scale with "GanttScale::SetINtervall()" since + by default the increment will be 1 minute. The style of minute scale + can be further adjusted by the use style parameters which can be + one of
+Minute scale is enabled by adding the GANTT_HMIN in the + GanttGraph::ShowHeaders() call. For example as in
$graph
+->ShowHeaders(GANTT_HDAY |
+GANTT_HHOUR |
+GANTT_HMIN);
+
The code snippet below shows how to set up a minute scale with 30 + min interval and some custom colors.
+ $graph->scale->
+minute->
+SetIntervall(
+30);
+
$graph->scale->
+minute->
+SetBackgroundColor(
+'lightyellow:1.5');
+
$graph->scale->
+minute->
+SetFont(
+FF_FONT0);
+
$graph->scale->
+minute->
+SetStyle(
+MINUTESTYLE_MM);
+
$graph->scale->
+minute->grid->SetColor
+('lightgray');
The hour scale has more builtin formatting possibilities. The + following formatting options are available
+For hours it is possible to specify the interval in either of two + ways. With an integer, e.g. 6, or as time interval, e.g. "1:30" which + makes the interval one and a half hour. The only restriction is that + the interval must be even dividable for 24 hours since one day is the + smallest possible interval to show. This means that it is allowed to + use, for example 2,4,6,"1:30" or "0:45" as intervals but not 7, "2:45".
+The code snippet below shows hot to set up a hour scale to with 45 + minutes interval and some custom colors
$graph
+->scale->hour->
+SetBackgroundColor(
+'lightyellow:1.5');
+
$graph->scale->
+hour->SetFont(FF_FONT1
+);
+
$graph->scale->
+hour->SetStyle(HOURSTYLE_HMAMPM);
+
$graph->scale->
+hour->
+SetIntervall(
+"0:45");
+
The example below shows a gantt chart with the day and hour scale + enabled
+ +By default the day scale show the first letter of the week day but + it is also posible to format the day scale in a number of different + ways. Days can have one of the following scale formats.
+The formatting is specified by using the SetStyle() method as in
$graph
+->scale->day->
+SetStyle(
+DAYSTYLE_LONG);
+
The graphical formatting possibilities for days allow the + possibility to specify a different color for the weekend background and + also for the Sunday.
+
+ SetWeekendColor()
+
Set the background color for weekends. (Defaults to light gray)
+
+ SetSundayFontColor()
+
The Sunday font color. (Defaults to red)
+In addition to this there is also a possibility to choose whether or + not the weekend background should be extended vertically down over the + plot area. (the default). Since that is a property more of the whole + plot this behavior is modified with a call to the method
UseWeekendBackground()
of the scale, e.g.
+
+ $graph->scale->UseWeekendBackground(false
+);
Week scales, if enabled, by default shows the week number in range 1 + to 53 (as defined by ISO-8601, see the reference section).
+It might be worth pointing out here that the week number calculation + is carried out within JpGraph and does not rely on the underlying OS + date libraries. This makes the behavior consistent over several OS:s + (at least M$ Windows does not comply to ISO-8601 or supply any + way of doing this through the normal libraries, e.g. strftime())
+You may modify the week behavior in three ways. You can specify + (with SetStyle()) a different date format using the constants
+
+ WEEKSTYLE_WNBR
Show week number To further modify the formatting of the actual week + number you can optionally supply a format string with a call to
SetLabelFormatString()
The format of the string should be a standard sprintf() syntax + expecting an integer (the week number). By default a 'W' is prefixed to + the number.
+
+ WEEKSTYLE_FIRSTDAY
Show date of first day in week.
+
+ WEEKSTYLE_FIRSTDAY2
Show date of first day in week and short month
+
+ WEEKSTYLE_FIRSTDAYWNBR
Show weeknumber of first day in week.
+
+ WEEKSTYLE_FIRSTDAY2WNBR
Show weeknumber of first day in week and month
+For month scale you can use the SetStyle() method to choose between + a variety of formats.
+
+ MONTHSTYLE_SHORTNAME
Display the month name in its locale specific short form, i.e Jan, + Feb etc
+
+ MONTHSTYLE_SHORTNAMEYEAR2
Display the month name in its locale specific short form together + with a 2 digit year , i.e Jan '01, Feb '01 etc
+
+ MONTHSTYLE_SHORTNAMEYEAR4
Display the month name in its locale specific short form together + with a 4 digit year , i.e Jan 2001, Feb 2001 etc
+
+ MONTHSTYLE_LONGNAME
Display the month name in its locale specific long name, i.e. + January, February
+
+ MONTHSTYLE_LONGNAMEYEAR2
Display the month name in its locale specific long name together with + a 2 digit year , i.e January '01, February '01 etc
+
+ MONTHSTYLE_LONGNAMEYEAR4
Display the month name in its locale specific long name together with + a 4 digit year , i.e January 2001, February 2001 etc
+
+ MONTHSTYLE_FIRSTLETTER
The first letter of the month name
+Year scale has no extra formatting possibilities.
+The scale headers allow you to view up to four different scales at + the same time. The four basic scales are:
+You can choose what scale to include and exclude by using the + SetScale() method. For example, for a detailed gantt you might choose + to display days and weeks by specifying
$graph
+->ShowHeaders
+( GANTT_HWEEK
+| GANTT_DAY );
If you instead wanted "the big picture" it might be enough to show + year and months by specifying
+ $graph->ShowHeaders(
+GANTT_YEAR |
+GANTT_MONTH );
+
You can choose freely the combination of scales that you want, but a + chart must at least have one scale of course.
+Once you have decided what level of details you need you can then + fine tune the exact layout/formatting of each of the enabled scales as + described below.
+These scale header are all accessed through the graph instance + variables 'scale' as in
+ $graph->scale->
+week
or
+ $graph->scale->day
. All these headers share the following properties.
+
+ Show()
+
Determine if the scale should be shown or not
+
+ SetFont()
+
Font for text in header
+
+ SetFontColor()
+
Specify the color of the header text
+
+ SetStyle()
+
Specify what date format should be used, for example in the week + scale it is possible to show either week number, the start date of the + week and so on.
+
+ SetBackgroundColor()
+
As it says, the background color for the header
+
+ SetFrameWeight()
+
The line weight of the box around the scale
+
+ SetFrameColor()
+
The line color for the frame
+
+ SetTitleVertMargin()
+
The margin, in percent, below and above the title text
+In addition to these methods each scale also has the property 'grid' + which determines the appearance of grid lines for that specific scale. + You may modify the appearance of grid lines by the "normal" line + methods, i.e. SetColor(),SetWeight() SetStyle() and Show(). So for + example to set the week grid line red you would use
$graph
+->scale->week->
+grid->SetColor("red"
+);
Each of the scales also have some specific formatting possibilities + as described below.
+Caption for bars are placed at the far right side of the bars. They + can for example be used to indicate the resources assigned to a task, + the duration of the task or the progress of the activity.
+Caption text for a bar is specified either when creating a bar or + later by accessing the 'caption' property of bars. So the two lines
$activity = new GanttBar
+(0,"Activity 1",
+"2001-11-21",
+"2001-12-20",
+"[BS,ER]")
+
and
+ $activity->
+caption->Set("[BS,ER]"
+);
are both ways of specifying the caption "[BS,ER]" for the activity. + Since activity is a standard JpGraph text object you can easily modify + font, color and size with calls to SetFont() and SetColor(), (e.g.
$activity->caption
+->SetFont(FF_ARIAL,
+FF_BOLD,9);
The figure below illustrates the use of caption
+ +To indicate the progress of a specific activity it is also possible + to add a progress indicator to each bar. This progress indicator + consists of a smaller bar within the bar. By default this progress bar + is black and 70% of the height of the bar. These parameter can (of + course) all be changed.
+The properties for the progress indicator are accessed through the + 'progress' property and it's methods.
+To set the progress for a specific activity you only specify the + percent as a fraction. As in
+ $activity->progress->
+Set(0.4)
In Figure 162 the previous example is modified to indicate the + progress of each activity by the default progress indicator. A solid + bar. To make it clearer we have also modified the caption to reflect + the displayed progress. (At the same time we also modified the scale + headers just to illustrate some more formatting options).
+To specify a different format for the progress you use the + SetPattern() method as in
+ $activity->progress->
+SetPattern(
+BAND_RDIAG,
+"blue");
+
In the reference section you can see the exact parameters and all + available methods.
+ +This section shows some further modification you might do to + activity bars.
+Non X,Y plots includes
+The fundamental difference is that these classes makes use of an + extended version of the basic Graph class. Therefor you can not mix X,Y + plots with non-X,Y plots. For example it is not possible to mix a line + graph with a Polar graph.
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
// Some data
$datay1=array(140,110,50,60);
$datay2=array(35,90,190,190);
$datay3=array(20,60,70,140);
// Create the basic graph
$graph = new Graph(450,250,'auto');
$graph->SetScale("textlin");
$graph->img->SetMargin(40,80,30,40);
// Adjust the position of the legend box
$graph->legend->Pos(0.02,0.15);
// Adjust the color for theshadow of the legend
$graph->legend->SetShadow('darkgray@0.5');
$graph->legend->SetFillColor('lightblue@0.3');
// Get localised version of the month names
$graph->xaxis->SetTickLabels($gDateLocale->GetShortMonth());
// Set a nice summer (in Stockholm) image
$graph->SetBackgroundImage('stship.jpg',BGIMG_COPY);
// Set axis titles and fonts
$graph->xaxis->title->Set('Year 2002');
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetColor('white');
$graph->xaxis->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->SetColor('white');
$graph->yaxis->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->SetColor('white');
//$graph->ygrid->Show(false);
$graph->ygrid->SetColor('white@0.5');
// Setup graph title
$graph->title->Set('Using alpha blending with a background');
// Some extra margin (from the top)
$graph->title->SetMargin(3);
$graph->title->SetFont(FF_COMIC,FS_NORMAL,12);
// Create the three var series we will combine
$bplot1 = new BarPlot($datay1);
$bplot2 = new BarPlot($datay2);
$bplot3 = new BarPlot($datay3);
// Setup the colors with 40% transparency (alpha channel)
$bplot1->SetFillColor('orange@0.4');
$bplot2->SetFillColor('brown@0.4');
$bplot3->SetFillColor('darkgreen@0.4');
// Setup legends
$bplot1->SetLegend('Label 1');
$bplot2->SetLegend('Label 2');
$bplot3->SetLegend('Label 3');
// Setup each bar with a shadow of 50% transparency
$bplot1->SetShadow('black@0.4');
$bplot2->SetShadow('black@0.4');
$bplot3->SetShadow('black@0.4');
$gbarplot = new GroupBarPlot(array($bplot1,$bplot2,$bplot3));
$gbarplot->SetWidth(0.6);
$graph->Add($gbarplot);
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/antispamex01.html b/html/includes/jpgraph/docs/html/exframes/antispamex01.html
new file mode 100644
index 0000000000..6e9ad97b5d
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/antispamex01.html
@@ -0,0 +1,3 @@
+
+<?php
// Antispam example using a random string
require_once "../jpgraph_antispam.php";
// Create new anti-spam challenge creator
// Note: Neither '0' (digit) or 'O' (letter) can be used to avoid confusion
$spam = new AntiSpam();
// Create a random 5 char challenge and return the string generated
$chars = $spam->Rand(5);
// Stroke random cahllenge
if( $spam->Stroke() === false ) {
die('Illegal or no data to plot');
}
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/backgroundex03.html b/html/includes/jpgraph/docs/html/exframes/backgroundex03.html
new file mode 100644
index 0000000000..1c80d0bbc6
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/backgroundex03.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
// Some data
$datay = array(28,19,18,23,12,11);
$data2y = array(14,18,33,29,39,55);
// A nice graph with anti-aliasing
$graph = new Graph(400,200,"auto");
$graph->img->SetMargin(40,180,40,40);
$graph->SetBackgroundImage("tiger_bkg.png",BGIMG_COPY);
$graph->img->SetAntiAliasing("white");
$graph->SetScale("textlin");
$graph->SetShadow();
$graph->title->Set("Background image");
// Use built in font
$graph->title->SetFont(FF_FONT1,FS_BOLD);
// Slightly adjust the legend from it's default position in the
// top right corner.
$graph->legend->Pos(0.05,0.5,"right","center");
// Create the first line
$p1 = new LinePlot($datay);
$p1->mark->SetType(MARK_FILLEDCIRCLE);
$p1->mark->SetFillColor("red");
$p1->mark->SetWidth(4);
$p1->SetColor("blue");
$p1->SetCenter();
$p1->SetLegend("Triumph Tiger -98");
$graph->Add($p1);
// ... and the second
$p2 = new LinePlot($data2y);
$p2->mark->SetType(MARK_STAR);
$p2->mark->SetFillColor("red");
$p2->mark->SetWidth(4);
$p2->SetColor("red");
$p2->SetCenter();
$p2->SetLegend("New tiger -99");
$graph->Add($p2);
// Output line
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/balloonex1.html b/html/includes/jpgraph/docs/html/exframes/balloonex1.html
new file mode 100644
index 0000000000..5b8a01e8e3
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/balloonex1.html
@@ -0,0 +1,3 @@
+
+<?php
// $Id: balloonex1.php,v 1.5 2002/12/15 16:08:51 aditus Exp $
include ("../jpgraph.php");
include ("../jpgraph_scatter.php");
// Some data
$datax = array(1,2,3,4,5,6,7,8);
$datay = array(12,23,95,18,65,28,86,44);
// Callback for markers
// Must return array(width,color,fill_color)
// If any of the returned values are "" then the
// default value for that parameter will be used.
function FCallback($aVal) {
// This callback will adjust the fill color and size of
// the datapoint according to the data value according to
if( $aVal < 30 ) $c = "blue";
elseif( $aVal < 70 ) $c = "green";
else $c="red";
return array(floor($aVal/3),"",$c);
}
// Setup a basic graph
$graph = new Graph(400,300,'auto');
$graph->SetScale("linlin");
$graph->img->SetMargin(40,100,40,40);
$graph->SetShadow();
$graph->title->Set("Example of ballon scatter plot");
// Use a lot of grace to get large scales
$graph->yaxis->scale->SetGrace(50,10);
// Make sure X-axis as at the bottom of the graph
$graph->xaxis->SetPos('min');
// Create the scatter plot
$sp1 = new ScatterPlot($datay,$datax);
$sp1->mark->SetType(MARK_FILLEDCIRCLE);
// Uncomment the following two lines to display the values
$sp1->value->Show();
$sp1->value->SetFont(FF_FONT1,FS_BOLD);
// Specify the callback
$sp1->mark->SetCallback("FCallback");
// Setup the legend for plot
$sp1->SetLegend('Year 2002');
// Add the scatter plot to the graph
$graph->Add($sp1);
// ... and send to browser
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/bar_csimex1.html b/html/includes/jpgraph/docs/html/exframes/bar_csimex1.html
new file mode 100644
index 0000000000..5c18684927
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/bar_csimex1.html
@@ -0,0 +1,4 @@
+
+<?php
include_once ("../jpgraph.php");
include_once ("../jpgraph_bar.php");
$datay=array(12,26,9,17,31);
// Create the graph.
// One minute timeout for the cached image
// INLINE_NO means don't stream it back to the browser.
$graph = new Graph(310,250,'auto');
$graph->SetScale("textlin");
$graph->img->SetMargin(60,30,20,40);
$graph->yaxis->SetTitleMargin(45);
$graph->yaxis->scale->SetGrace(30);
$graph->SetShadow();
// Turn the tickmarks
$graph->xaxis->SetTickSide(SIDE_DOWN);
$graph->yaxis->SetTickSide(SIDE_LEFT);
// Create a bar pot
$bplot = new BarPlot($datay);
// Create targets for the image maps. One for each column
$targ=array("bar_clsmex1.php#1","bar_clsmex1.php#2","bar_clsmex1.php#3","bar_clsmex1.php#4","bar_clsmex1.php#5","bar_clsmex1.php#6");
$alts=array("val=%d","val=%d","val=%d","val=%d","val=%d","val=%d");
$bplot->SetCSIMTargets($targ,$alts);
$bplot->SetFillColor("orange");
// Use a shadow on the bar graphs (just use the default settings)
$bplot->SetShadow();
$bplot->value->SetFormat(" $ %2.1f",70);
$bplot->value->SetFont(FF_ARIAL,FS_NORMAL,9);
$bplot->value->SetColor("blue");
$bplot->value->Show();
$graph->Add($bplot);
$graph->title->Set("Image maps barex1");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Send back the HTML page which will call this script again
// to retrieve the image.
$graph->StrokeCSIM('bar_csimex1.php','bar_csimex1');
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/bar_csimex2.html b/html/includes/jpgraph/docs/html/exframes/bar_csimex2.html
new file mode 100644
index 0000000000..65ebf8302a
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/bar_csimex2.html
@@ -0,0 +1,4 @@
+
+<?php
include_once ("../jpgraph.php");
include_once ("../jpgraph_bar.php");
$data1y=array(12,8,19,3,10,5);
$data2y=array(8,2,12,7,14,4);
// Create the graph. These two calls are always required
$graph = new Graph(310,200,'auto');
$graph->SetScale("textlin");
$graph->img->SetMargin(40,30,20,40);
$graph->SetShadow();
// Create the bar plots
$b1plot = new BarPlot($data1y);
$b1plot->SetFillColor("orange");
$targ=array("bar_clsmex2.php#1","bar_clsmex2.php#2","bar_clsmex2.php#3",
"bar_clsmex2.php#4","bar_clsmex2.php#5","bar_clsmex2.php#6");
$alts=array("val=%d","val=%d","val=%d","val=%d","val=%d","val=%d");
$b1plot->SetCSIMTargets($targ,$alts);
$b2plot = new BarPlot($data2y);
$b2plot->SetFillColor("blue");
$targ=array("bar_clsmex2.php#7","bar_clsmex2.php#8","bar_clsmex2.php#9",
"bar_clsmex2.php#10","bar_clsmex2.php#11","bar_clsmex2.php#12");
$alts=array("val=%d","val=%d","val=%d","val=%d","val=%d","val=%d");
$b2plot->SetCSIMTargets($targ,$alts);
// Create the grouped bar plot
$abplot = new AccBarPlot(array($b1plot,$b2plot));
$abplot->SetShadow();
$abplot->value->Show();
// ...and add it to the graPH
$graph->Add($abplot);
$graph->title->Set("Image map barex2");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Send back the HTML page which will call this script again
// to retrieve the image.
$graph->StrokeCSIM('bar_csimex2.php');
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/bar_csimex3.html b/html/includes/jpgraph/docs/html/exframes/bar_csimex3.html
new file mode 100644
index 0000000000..126e26712f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/bar_csimex3.html
@@ -0,0 +1,4 @@
+
+<?php
// $Id: bar_csimex3.php,v 1.3 2002/08/31 20:03:46 aditus Exp $
// Horiontal bar graph with image maps
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$data1y=array(5,8,19,3,10,5);
$data2y=array(12,2,12,7,14,4);
// Setup the basic parameters for the graph
$graph = new Graph(400,700);
$graph->SetAngle(90);
$graph->SetScale("textlin");
// The negative margins are necessary since we
// have rotated the image 90 degress and shifted the
// meaning of width, and height. This means that the
// left and right margins now becomes top and bottom
// calculated with the image width and not the height.
$graph->img->SetMargin(-80,-80,210,210);
$graph->SetMarginColor('white');
// Setup title for graph
$graph->title->Set('Horizontal bar graph');
$graph->title->SetFont(FF_FONT2,FS_BOLD);
$graph->subtitle->Set("With image map\nNote: The URL just points back to this image");
// Setup X-axis.
$graph->xaxis->SetTitle("X-title",'center');
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetAngle(90);
$graph->xaxis->SetTitleMargin(30);
$graph->xaxis->SetLabelMargin(15);
$graph->xaxis->SetLabelAlign('right','center');
// Setup Y-axis
// First we want it at the bottom, i.e. the 'max' value of the
// x-axis
$graph->yaxis->SetPos('max');
// Arrange the title
$graph->yaxis->SetTitle("Turnaround (mkr)",'center');
$graph->yaxis->SetTitleSide(SIDE_RIGHT);
$graph->yaxis->title->SetFont(FF_FONT2,FS_BOLD);
$graph->yaxis->title->SetAngle(0);
$graph->yaxis->title->Align('center','top');
$graph->yaxis->SetTitleMargin(30);
// Arrange the labels
$graph->yaxis->SetLabelSide(SIDE_RIGHT);
$graph->yaxis->SetLabelAlign('center','top');
// Create the bar plots with image maps
$b1plot = new BarPlot($data1y);
$b1plot->SetFillColor("orange");
$targ=array("bar_clsmex2.php#1","bar_clsmex2.php#2","bar_clsmex2.php#3",
"bar_clsmex2.php#4","bar_clsmex2.php#5","bar_clsmex2.php#6");
$alts=array("val=%d","val=%d","val=%d","val=%d","val=%d","val=%d");
$b1plot->SetCSIMTargets($targ,$alts);
$b2plot = new BarPlot($data2y);
$b2plot->SetFillColor("blue");
$targ=array("bar_clsmex2.php#7","bar_clsmex2.php#8","bar_clsmex2.php#9",
"bar_clsmex2.php#10","bar_clsmex2.php#11","bar_clsmex2.php#12");
$alts=array("val=%d","val=%d","val=%d","val=%d","val=%d","val=%d");
$b2plot->SetCSIMTargets($targ,$alts);
// Create the accumulated bar plot
$abplot = new AccBarPlot(array($b1plot,$b2plot));
$abplot->SetShadow();
// We want to display the value of each bar at the top
$abplot->value->Show();
$abplot->value->SetFont(FF_FONT1,FS_NORMAL);
$abplot->value->SetAlign('left','center');
$abplot->value->SetColor("black","darkred");
$abplot->value->SetFormat('%.1f mkr');
// ...and add it to the graph
$graph->Add($abplot);
// Send back the HTML page which will call this script again
// to retrieve the image.
$graph->StrokeCSIM('bar_csimex3.php','bar_csimex3');
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/bargradsmallex1.html b/html/includes/jpgraph/docs/html/exframes/bargradsmallex1.html
new file mode 100644
index 0000000000..090658a724
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/bargradsmallex1.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
// We need some data
$datay=array(4,8,6);
// Setup the graph.
$graph = new Graph(200,150,"auto");
$graph->SetScale("textlin");
$graph->img->SetMargin(25,15,25,25);
$graph->title->Set('"GRAD_MIDVER"');
$graph->title->SetColor('darkred');
// Setup font for axis
$graph->xaxis->SetFont(FF_FONT1);
$graph->yaxis->SetFont(FF_FONT1);
// Create the bar pot
$bplot = new BarPlot($datay);
$bplot->SetWidth(0.6);
// Setup color for gradient fill style
$bplot->SetFillGradient("navy","lightsteelblue",GRAD_MIDVER);
// Set color for the frame of each bar
$bplot->SetColor("navy");
$graph->Add($bplot);
// Finally send the graph to the browser
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/bargradsmallex2.html b/html/includes/jpgraph/docs/html/exframes/bargradsmallex2.html
new file mode 100644
index 0000000000..b92655069a
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/bargradsmallex2.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
// We need some data
$datay=array(4,8,6);
// Setup the graph.
$graph = new Graph(200,150,"auto");
$graph->SetScale("textlin");
$graph->img->SetMargin(25,15,25,25);
$graph->title->Set('"GRAD_MIDHOR"');
$graph->title->SetColor('darkred');
// Setup font for axis
$graph->xaxis->SetFont(FF_FONT1);
$graph->yaxis->SetFont(FF_FONT1);
// Create the bar pot
$bplot = new BarPlot($datay);
$bplot->SetWidth(0.6);
// Setup color for gradient fill style
$bplot->SetFillGradient("navy","lightsteelblue",GRAD_MIDHOR);
// Set color for the frame of each bar
$bplot->SetColor("navy");
$graph->Add($bplot);
// Finally send the graph to the browser
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/bargradsmallex3.html b/html/includes/jpgraph/docs/html/exframes/bargradsmallex3.html
new file mode 100644
index 0000000000..ee439bb643
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/bargradsmallex3.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
// We need some data
$datay=array(4,8,6);
// Setup the graph.
$graph = new Graph(200,150,"auto");
$graph->SetScale("textlin");
$graph->img->SetMargin(25,15,25,25);
$graph->title->Set('"GRAD_HOR"');
$graph->title->SetColor('darkred');
// Setup font for axis
$graph->xaxis->SetFont(FF_FONT1);
$graph->yaxis->SetFont(FF_FONT1);
// Create the bar pot
$bplot = new BarPlot($datay);
$bplot->SetWidth(0.6);
// Setup color for gradient fill style
$bplot->SetFillGradient("navy","lightsteelblue",GRAD_HOR);
// Set color for the frame of each bar
$bplot->SetColor("navy");
$graph->Add($bplot);
// Finally send the graph to the browser
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/bargradsmallex4.html b/html/includes/jpgraph/docs/html/exframes/bargradsmallex4.html
new file mode 100644
index 0000000000..27a72a6a77
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/bargradsmallex4.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
// We need some data
$datay=array(4,8,6);
// Setup the graph.
$graph = new Graph(200,150,"auto");
$graph->SetScale("textlin");
$graph->img->SetMargin(25,15,25,25);
$graph->title->Set('"GRAD_VER"');
$graph->title->SetColor('darkred');
// Setup font for axis
$graph->xaxis->SetFont(FF_FONT1);
$graph->yaxis->SetFont(FF_FONT1);
// Create the bar pot
$bplot = new BarPlot($datay);
$bplot->SetWidth(0.6);
// Setup color for gradient fill style
$bplot->SetFillGradient("navy","lightsteelblue",GRAD_VER);
// Set color for the frame of each bar
$bplot->SetColor("navy");
$graph->Add($bplot);
// Finally send the graph to the browser
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/bargradsmallex5.html b/html/includes/jpgraph/docs/html/exframes/bargradsmallex5.html
new file mode 100644
index 0000000000..d4ed655bec
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/bargradsmallex5.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
// We need some data
$datay=array(4,8,6);
// Setup the graph.
$graph = new Graph(200,150,"auto");
$graph->SetScale("textlin");
$graph->img->SetMargin(25,15,25,25);
$graph->title->Set('"GRAD_WIDE_MIDVER"');
$graph->title->SetColor('darkred');
// Setup font for axis
$graph->xaxis->SetFont(FF_FONT1);
$graph->yaxis->SetFont(FF_FONT1);
// Create the bar pot
$bplot = new BarPlot($datay);
$bplot->SetWidth(0.6);
// Setup color for gradient fill style
$bplot->SetFillGradient("navy","lightsteelblue",GRAD_WIDE_MIDVER);
// Set color for the frame of each bar
$bplot->SetColor("navy");
$graph->Add($bplot);
// Finally send the graph to the browser
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/bargradsmallex6.html b/html/includes/jpgraph/docs/html/exframes/bargradsmallex6.html
new file mode 100644
index 0000000000..9f2609a610
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/bargradsmallex6.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
// We need some data
$datay=array(4,8,6);
// Setup the graph.
$graph = new Graph(200,150,"auto");
$graph->SetScale("textlin");
$graph->img->SetMargin(25,15,25,25);
$graph->title->Set('"GRAD_WIDE_MIDHOR"');
$graph->title->SetColor('darkred');
// Setup font for axis
$graph->xaxis->SetFont(FF_FONT1);
$graph->yaxis->SetFont(FF_FONT1);
// Create the bar pot
$bplot = new BarPlot($datay);
$bplot->SetWidth(0.6);
// Setup color for gradient fill style
$bplot->SetFillGradient("navy","lightsteelblue",GRAD_WIDE_MIDHOR);
// Set color for the frame of each bar
$bplot->SetColor("navy");
$graph->Add($bplot);
// Finally send the graph to the browser
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/bargradsmallex7.html b/html/includes/jpgraph/docs/html/exframes/bargradsmallex7.html
new file mode 100644
index 0000000000..74d354fcb9
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/bargradsmallex7.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
// We need some data
$datay=array(4,8,6);
// Setup the graph.
$graph = new Graph(200,150,"auto");
$graph->SetScale("textlin");
$graph->img->SetMargin(25,15,25,25);
$graph->title->Set('"GRAD_CENTER"');
$graph->title->SetColor('darkred');
// Setup font for axis
$graph->xaxis->SetFont(FF_FONT1);
$graph->yaxis->SetFont(FF_FONT1);
// Create the bar pot
$bplot = new BarPlot($datay);
$bplot->SetWidth(0.6);
// Setup color for gradient fill style
$bplot->SetFillGradient("navy","lightsteelblue",GRAD_CENTER);
// Set color for the frame of each bar
$bplot->SetColor("navy");
$graph->Add($bplot);
// Finally send the graph to the browser
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/bargradsmallex8.html b/html/includes/jpgraph/docs/html/exframes/bargradsmallex8.html
new file mode 100644
index 0000000000..99f2682f08
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/bargradsmallex8.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
// We need some data
$datay=array(4,8,6);
// Setup the graph.
$graph = new Graph(200,150,"auto");
$graph->SetScale("textlin");
$graph->img->SetMargin(25,15,25,25);
$graph->title->Set('"GRAD_RAISED_PANEL"');
$graph->title->SetColor('darkred');
// Setup font for axis
$graph->xaxis->SetFont(FF_FONT1);
$graph->yaxis->SetFont(FF_FONT1);
// Create the bar pot
$bplot = new BarPlot($datay);
$bplot->SetWidth(0.6);
// Setup color for gradient fill style
$bplot->SetFillGradient('navy','orange',GRAD_RAISED_PANEL);
// Set color for the frame of each bar
$bplot->SetColor("navy");
$graph->Add($bplot);
// Finally send the graph to the browser
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/barline_csimex1.html b/html/includes/jpgraph/docs/html/exframes/barline_csimex1.html
new file mode 100644
index 0000000000..2bdcf5456b
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/barline_csimex1.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
include ("../jpgraph_bar.php");
$ydata = array(2,3,4,5,6,7,8,9,10,11);
$ydata2 = array(1,2,3,4,5,6,7,8,9,10);
$targ = array("#1","#2","#3","#4","#5","#6","#7","#8","#9","#10");
$alt = array(1,2,3,4,5,6,7,8,9,10);
// Create the graph.
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
$graph->img->SetMargin(40,20,30,40);
$graph->title->Set("CSIM example with bar and line");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
// Setup axis titles
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
// Create the linear plot
$lineplot=new LinePlot($ydata);
$lineplot->mark->SetType(MARK_FILLEDCIRCLE);
$lineplot->mark->SetWidth(5);
$lineplot->mark->SetColor('black');
$lineplot->mark->SetFillColor('red');
$lineplot->SetCSIMTargets($targ,$alt);
// Create line plot
$barplot=new barPlot($ydata2);
$barplot->SetCSIMTargets($targ,$alt);
// Add the plots to the graph
$graph->Add($lineplot);
$graph->Add($barplot);
$graph->StrokeCSIM('barline_csimex1.php');
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/barlinefreq_csimex1.html b/html/includes/jpgraph/docs/html/exframes/barlinefreq_csimex1.html
new file mode 100644
index 0000000000..c216574593
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/barlinefreq_csimex1.html
@@ -0,0 +1,4 @@
+
+<?php
//
// Example of CSIM frequence bar that uses the cache
//
include_once ("../jpgraph.php");
include_once ("../jpgraph_bar.php");
include_once ("../jpgraph_line.php");
// Utility function to calculate the accumulated frequence
// for a set of values and ocurrences
function accfreq($data) {
rsort($data);
$s = array_sum($data);
$as = array($data[0]);
$asp = array(100*$as[0]/$s);
$n = count($data);
for( $i=1; $i < $n; ++$i ) {
$as[$i] = $as[$i-1]+$data[$i];
$asp[$i] = 100.0*$as[$i]/$s;
}
return $asp;
}
// some data
$data_freq = array(22,20,12,10,5,4,2);
$data_accfreq = accfreq($data_freq);
// Create the graph.
$graph = new Graph(350,250);
// We need to make this extra call for CSIM scripts
// that make use of the cache. If the cache contains this
// graph the HTML wrapper will be returned and then the
// method will call exit() and hence NO LINES AFTER THIS
// CALL WILL BE EXECUTED.
// $graph->CheckCSIMCache('auto');
// Setup some basic graph parameters
$graph->SetScale("textlin");
$graph->SetY2Scale('lin',0,100);
$graph->img->SetMargin(50,70,30,40);
$graph->yaxis->SetTitleMargin(30);
$graph->SetMarginColor('#EEEEEE');
// Setup titles and fonts
$graph->title->Set("Frequence plot");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Turn the tickmarks
$graph->xaxis->SetTickSide(SIDE_DOWN);
$graph->yaxis->SetTickSide(SIDE_LEFT);
$graph->y2axis->SetTickSide(SIDE_RIGHT);
$graph->y2axis->SetColor('black','blue');
$graph->y2axis->SetLabelFormat('%3d.0%%');
// Create a bar pot
$bplot = new BarPlot($data_freq);
// Create targets and alt texts for the image maps. One for each bar
// (In this example this is just "dummy" targets)
$targ=array("#1","#2","#3","#4","#5","#6","#7");
$alts=array("val=%d","val=%d","val=%d","val=%d","val=%d","val=%d","val=%d");
$bplot->SetCSIMTargets($targ,$alts);
// Create accumulative graph
$lplot = new LinePlot($data_accfreq);
// We want the line plot data point in the middle of the bars
$lplot->SetBarCenter();
// Use transperancy
$lplot->SetFillColor('lightblue@0.6');
$lplot->SetColor('blue@0.6');
//$lplot->SetColor('blue');
$graph->AddY2($lplot);
// Setup the bars
$bplot->SetFillColor("orange@0.2");
$bplot->SetValuePos('center');
$bplot->value->SetFormat("%d");
$bplot->value->SetFont(FF_ARIAL,FS_NORMAL,9);
$bplot->value->Show();
// Add it to the graph
$graph->Add($bplot);
// Send back the HTML page which will call this script again
// to retrieve the image.
$graph->StrokeCSIM('barlinefreq_csimex1.php');
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/bartutex1.html b/html/includes/jpgraph/docs/html/exframes/bartutex1.html
new file mode 100644
index 0000000000..773a6834f5
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/bartutex1.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
// Some data
$databary=array(12,7,16,5,7,14,9,3);
// New graph with a drop shadow
$graph = new Graph(300,200,'auto');
$graph->SetShadow();
// Use a "text" X-scale
$graph->SetScale("textlin");
// Set title and subtitle
$graph->title->Set("Elementary barplot with a text scale");
// Use built in font
$graph->title->SetFont(FF_FONT1,FS_BOLD);
// Create the bar plot
$b1 = new BarPlot($databary);
$b1->SetLegend("Temperature");
//$b1->SetAbsWidth(6);
//$b1->SetShadow();
// The order the plots are added determines who's ontop
$graph->Add($b1);
// Finally output the image
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/bartutex2.html b/html/includes/jpgraph/docs/html/exframes/bartutex2.html
new file mode 100644
index 0000000000..debde985d1
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/bartutex2.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
// Some data
$databary=array(12,7,16,6,7,14,9,3);
$months=$gDateLocale->GetShortMonth();
// New graph with a drop shadow
$graph = new Graph(300,200,'auto');
$graph->SetShadow();
// Use a "text" X-scale
$graph->SetScale("textlin");
// Specify X-labels
$graph->xaxis->SetTickLabels($months);
// Set title and subtitle
$graph->title->Set("Textscale with specified labels");
// Use built in font
$graph->title->SetFont(FF_FONT1,FS_BOLD);
// Create the bar plot
$b1 = new BarPlot($databary);
$b1->SetLegend("Temperature");
//$b1->SetAbsWidth(6);
//$b1->SetShadow();
// The order the plots are added determines who's ontop
$graph->Add($b1);
// Finally output the image
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/bartutex3.html b/html/includes/jpgraph/docs/html/exframes/bartutex3.html
new file mode 100644
index 0000000000..c48d1f0267
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/bartutex3.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
// Some data
$months=$gDateLocale->GetShortMonth();
srand ((double) microtime() * 1000000);
for( $i=0; $i<25; ++$i) {
$databary[]=rand(1,50);
$databarx[]=$months[$i%12];
}
// New graph with a drop shadow
$graph = new Graph(300,200,'auto');
$graph->SetShadow();
// Use a "text" X-scale
$graph->SetScale("textlin");
// Specify X-labels
$graph->xaxis->SetTickLabels($databarx);
// Set title and subtitle
$graph->title->Set("Bar tutorial example 3");
// Use built in font
$graph->title->SetFont(FF_FONT1,FS_BOLD);
// Create the bar plot
$b1 = new BarPlot($databary);
$b1->SetLegend("Temperature");
//$b1->SetAbsWidth(6);
//$b1->SetShadow();
// The order the plots are added determines who's ontop
$graph->Add($b1);
// Finally output the image
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/bartutex4.html b/html/includes/jpgraph/docs/html/exframes/bartutex4.html
new file mode 100644
index 0000000000..4f030cb6fe
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/bartutex4.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
// Some data
$months=$gDateLocale->GetShortMonth();
srand ((double) microtime() * 1000000);
for( $i=0; $i<25; ++$i) {
$databary[]=rand(1,50);
$databarx[]=$months[$i%12];
}
// New graph with a drop shadow
$graph = new Graph(300,200,'auto');
$graph->SetShadow();
// Use a "text" X-scale
$graph->SetScale("textlin");
// Specify X-labels
//$databarx = array('tXi','','','xxx','','','iXii','','','OOO','','','tOO');
$graph->xaxis->SetFont(FF_FONT1,FS_NORMAL);
$graph->xaxis->SetTickLabels($databarx);
$graph->xaxis->SetTextLabelInterval(3);
// Set title and subtitle
$graph->title->Set("Displaying only every third label");
// Use built in font
$graph->title->SetFont(FF_FONT1,FS_BOLD);
// Create the bar plot
$b1 = new BarPlot($databary);
$b1->SetLegend("Temperature");
//$b1->SetAbsWidth(6);
//$b1->SetShadow();
// The order the plots are added determines who's ontop
$graph->Add($b1);
// Finally output the image
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/bartutex5.html b/html/includes/jpgraph/docs/html/exframes/bartutex5.html
new file mode 100644
index 0000000000..91be3b7f20
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/bartutex5.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
// Some data
$months=$gDateLocale->GetShortMonth();
srand ((double) microtime() * 1000000);
for( $i=0; $i<25; ++$i) {
$databary[]=rand(1,50);
$databarx[]=$months[$i%12];
}
// New graph with a drop shadow
$graph = new Graph(300,200,'auto');
$graph->SetShadow();
// Use a "text" X-scale
$graph->SetScale("textlin");
// Specify X-labels
$graph->xaxis->SetTickLabels($databarx);
$graph->xaxis->SetTextLabelInterval(1);
$graph->xaxis->SetTextTickInterval(3);
// Set title and subtitle
$graph->title->Set("Bar tutorial example 5");
// Use built in font
$graph->title->SetFont(FF_FONT1,FS_BOLD);
// Create the bar plot
$b1 = new BarPlot($databary);
$b1->SetLegend("Temperature");
$b1->SetWidth(0.4);
// The order the plots are added determines who's ontop
$graph->Add($b1);
// Finally output the image
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/bartutex6.html b/html/includes/jpgraph/docs/html/exframes/bartutex6.html
new file mode 100644
index 0000000000..38be9517ff
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/bartutex6.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
// Some data
$months=$gDateLocale->GetShortMonth();
srand ((double) microtime() * 1000000);
for( $i=0; $i<25; ++$i) {
$databary[]=rand(1,50);
$databarx[]=$months[$i%12];
}
// New graph with a drop shadow
$graph = new Graph(300,200,'auto');
$graph->SetShadow();
// Use a "text" X-scale
$graph->SetScale("textlin");
// Specify X-labels
$graph->xaxis->SetTickLabels($databarx);
$graph->xaxis->SetTextLabelInterval(3);
// Hide the tick marks
$graph->xaxis->HideTicks();
// Set title and subtitle
$graph->title->Set("Bar tutorial example 6");
// Use built in font
$graph->title->SetFont(FF_FONT1,FS_BOLD);
// Create the bar plot
$b1 = new BarPlot($databary);
$b1->SetLegend("Temperature");
$b1->SetWidth(0.4);
// The order the plots are added determines who's ontop
$graph->Add($b1);
// Finally output the image
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/boxstockcsimex1.html b/html/includes/jpgraph/docs/html/exframes/boxstockcsimex1.html
new file mode 100644
index 0000000000..9290325acc
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/boxstockcsimex1.html
@@ -0,0 +1,4 @@
+
+<?php
// Example of a stock chart
include ("../jpgraph.php");
include ("../jpgraph_stock.php");
// Data must be in the format : open,close,min,max,median
$datay = array(
34,42,27,45,36,
55,25,14,59,40,
15,40,12,47,23,
62,38,25,65,57,
38,49,32,64,45);
// Setup a simple graph
$graph = new Graph(300,200);
$graph->SetScale("textlin");
$graph->SetMarginColor('lightblue');
$graph->title->Set('Box Stock chart example');
// Create a new stock plot
$p1 = new BoxPlot($datay);
// Setup URL target for image map
$p1->SetCSIMTargets(array('#1','#2','#3','#4','#5'));
// Width of the bars (in pixels)
$p1->SetWidth(9);
//$p1->SetCenter();
// Uncomment the following line to hide the horizontal end lines
//$p1->HideEndLines();
// Add the plot to the graph and send it back to the browser
$graph->Add($p1);
$graph->StrokeCSIM(basename(__FILE__));
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/boxstockex1.html b/html/includes/jpgraph/docs/html/exframes/boxstockex1.html
new file mode 100644
index 0000000000..5ed65bcea2
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/boxstockex1.html
@@ -0,0 +1,4 @@
+
+<?php
// Example of a stock chart
include ("../jpgraph.php");
include ("../jpgraph_stock.php");
// Data must be in the format : open,close,min,max,median
$datay = array(
34,42,27,45,36,
55,25,14,59,40,
15,40,12,47,23,
62,38,25,65,57,
38,49,32,64,45);
// Setup a simple graph
$graph = new Graph(300,200);
$graph->SetScale("textlin");
$graph->SetMarginColor('lightblue');
$graph->title->Set('Box Stock chart example');
// Create a new stock plot
$p1 = new BoxPlot($datay);
// Width of the bars (in pixels)
$p1->SetWidth(9);
// Uncomment the following line to hide the horizontal end lines
//$p1->HideEndLines();
// Add the plot to the graph and send it back to the browser
$graph->Add($p1);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/builtinplotmarksex1.html b/html/includes/jpgraph/docs/html/exframes/builtinplotmarksex1.html
new file mode 100644
index 0000000000..88ee9f49ab
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/builtinplotmarksex1.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$datay1 = array(2,6,7,12,13,18);
$datay2 = array(5,12,12,19,25,20);
// Setup the graph
$graph = new Graph(350,200);
$graph->SetMargin(30,20,60,20);
$graph->SetMarginColor('white');
$graph->SetScale("linlin");
// Hide the frame around the graph
$graph->SetFrame(false);
// Setup title
$graph->title->Set("Using Builtin PlotMarks");
$graph->title->SetFont(FF_VERDANA,FS_BOLD,14);
// Note: requires jpgraph 1.12p or higher
// $graph->SetBackgroundGradient('blue','navy:0.5',GRAD_HOR,BGRAD_PLOT);
$graph->tabtitle->Set('Region 1' );
$graph->tabtitle->SetWidth(TABTITLE_WIDTHFULL);
// Enable X and Y Grid
$graph->xgrid->Show();
$graph->xgrid->SetColor('gray@0.5');
$graph->ygrid->SetColor('gray@0.5');
// Format the legend box
$graph->legend->SetColor('navy');
$graph->legend->SetFillColor('lightgreen');
$graph->legend->SetLineWeight(1);
$graph->legend->SetFont(FF_ARIAL,FS_BOLD,8);
$graph->legend->SetShadow('gray@0.4',3);
$graph->legend->SetAbsPos(15,120,'right','bottom');
// Create the line plots
$p1 = new LinePlot($datay1);
$p1->SetColor("red");
$p1->SetFillColor("yellow@0.5");
$p1->SetWeight(2);
$p1->mark->SetType(MARK_IMG_DIAMOND,5,0.6);
$p1->SetLegend('2006');
$graph->Add($p1);
$p2 = new LinePlot($datay2);
$p2->SetColor("darkgreen");
$p2->SetWeight(2);
$p2->SetLegend('2001');
$p2->mark->SetType(MARK_IMG_MBALL,'red');
$graph->Add($p2);
// Add a vertical line at the end scale position '7'
$l1 = new PlotLine(VERTICAL,7);
$graph->Add($l1);
// Output the graph
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/canvas_jpgarchex.html b/html/includes/jpgraph/docs/html/exframes/canvas_jpgarchex.html
new file mode 100644
index 0000000000..5ff0a6aa43
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/canvas_jpgarchex.html
@@ -0,0 +1,3 @@
+
+<?php
// $Id: canvas_jpgarchex.php,v 1.3 2002/08/29 10:14:19 aditus Exp $
include "../jpgraph.php";
include "../jpgraph_canvas.php";
include "../jpgraph_canvtools.php";
// Scale we are using
$ymax=24;
$xmax=20;
// Setup the basic canvas
$g = new CanvasGraph(700,650,'auto');
$g->SetMargin(2,3,2,3);
$g->SetMarginColor("teal");
$g->InitFrame();
// ... and a scale
$scale = new CanvasScale($g);
$scale->Set(0,$xmax,0,$ymax);
// ... we need shape since we want the indented rectangle
$shape = new Shape($g,$scale);
$shape->SetColor('black');
// ... basic parameters for the overall image
$l = 2; // Left margin
$r = 18; // Row number to start the lowest line on
$width = 16; // Total width
// Setup the two basic rectangle text object we will use
$tt = new CanvasRectangleText();
$tt->SetFont(FF_ARIAL,FS_NORMAL,14);
$tt->SetFillColor('');
$tt->SetColor('');
$tt->SetFontColor('navy');
$t = new CanvasRectangleText();
$t->SetFont(FF_ARIAL,FS_NORMAL,14);
$t->SetFillColor('goldenrod1');
$t->SetFontColor('navy');
// Now start drawing the arch overview from the bottom and up
// This is all pretty manual and one day I will write a proper
// framework to make it easy to construct these types of architecture
// overviews. But for now, just plain old coordinates..
// Line: GD Library and image libraries
$h=3;
$s = 3; $d=$l + $width-9;
$t->SetFillColor('cadetblue3');
$t->Set("TTF",$d,$r+2,$s,1);
$t->Stroke($g->img,$scale);
$t->Set("PNG",$d+$s,$r+2,$s,1);
$t->Stroke($g->img,$scale);
$t->Set("JPEG",$d+2*$s,$r+2,$s,1);
$t->Stroke($g->img,$scale);
$shape->IndentedRectangle($l,$r,$width,$h,$s*3,1,2,'lightgreen');
$tt->Set("GD Basic library\n(1.8.x or 2.x)",$l,$r,$width,$h-1);
$tt->Stroke($g->img,$scale);
// Area: Basic internal JpGraph architecture
$t->SetFillColor('goldenrod1');
$h = 2;
$r -= $h; $d=8;
$t->Set("Image primitives\n(RGB, Anti-aliasing,\nGD Abstraction)",$l,$r-0.5,$width*0.5,$h+0.5);
$t->Stroke($g->img,$scale);
$t->Set("Image Cache &\nStreaming",$l+0.5*$width,$r,$width*0.4,$h);
$t->Stroke($g->img,$scale);
$r -= $h; $d=8;
$t->Set("2D Rot & Transformation",$l,$r,$width*0.5,$h-0.5); $t->Stroke($g->img,$scale);
$r -= 2; $h = 4;
$shape->IndentedRectangle($l,$r,$width*0.9,$h,$d,2,3,'goldenrod1');
$tt->Set("Axis, Labelling, (Auto)-Scaling",$l,$r,$width*0.9,$h-2); $tt->Stroke($g->img,$scale);
$r -= 1;
$shape->IndentedRectangle($l,$r,$width,7,$width*0.9,6,3,'goldenrod1');
$tt->Set("Error handling & Utility classes",$l,$r,$width,1); $tt->Stroke($g->img,$scale);
// Area: Top area with graph components
$t->SetFillColor('gold1');
$r -= 3;
$w = $width*0.55/4; $h = 2;
$t->Set("Gantt\nGraph",$l,$r,$w,$h);
$t->Stroke($g->img,$scale);
$t->Set("Pie\nGraph",$l+$w,$r,$w,$h);
$t->Stroke($g->img,$scale);
$t->Set("Radar\nGraph",$l+$w*2,$r,$w,$h);
$t->Stroke($g->img,$scale);
$shape->IndentedRectangle($l,$r,$width,3,4*$w,2,0,'gold1');
$tt->Set("Base Graph\n(Orthogonal\ncoordinate system)",$l+4*$w,$r,$width-$w*4,3);
$tt->Stroke($g->img,$scale);
$r -= 2;
$d = 0.7;
$shape->IndentedRectangle($l+3*$w,$r,$w,4, $w*$d,2,0,'gold1');
$t->Set("Canv\nUtil",$l+3*$w,$r,$w*$d,$h); $t->Stroke($g->img,$scale);
$tt->Set("Canvas\nGraph",$l+3*$w,$r+2,$w,2); $tt->Stroke($g->img,$scale);
// Top line of plotting plugins
$t->SetFillColor('cyan');
$t->Set("Gantt\nPlot",$l,$r,$w,$h); $t->Stroke($g->img,$scale);
$t->Set("2D\nPlot",$l+$w,$r,$w/2,$h); $t->Stroke($g->img,$scale);
$t->Set("3D\nPlot",$l+$w+$w/2,$r,$w/2,$h);$t->Stroke($g->img,$scale);
$t->Set("Radar\nPlot",$l+2*$w,$r,$w,$h); $t->Stroke($g->img,$scale);
$wp = ($width - 4*$w)/4;
$t->Set("Error\nPlot",$l+4*$w,$r,$wp,$h); $t->Stroke($g->img,$scale);
$t->Set("Line\nPlot",$l+4*$w+$wp,$r,$wp,$h); $t->Stroke($g->img,$scale);
$t->Set("Bar\nPlot",$l+4*$w+2*$wp,$r,$wp,$h); $t->Stroke($g->img,$scale);
$t->Set("Scatter\nPlot",$l+4*$w+3*$wp,$r,$wp,$h); $t->Stroke($g->img,$scale);
// Show application top
$r -= 2.5; $h=2;
$t->SetFillColor('blue');
$t->SetFontColor('white');
$t->SetFont(FF_ARIAL,FS_BOLD,20);
$t->Set("PHP Application",$l,$r,$width,$h); $t->Stroke($g->img,$scale);
// Stroke title
$r = 0.5;
$tt->SetFontColor('black');
$tt->SetFont(FF_TIMES,FS_BOLD,28);
$tt->Set("JpGraph Architecture Overview",$l,$r,$width,1);
$tt->Stroke($g->img,$scale);
// Stroke footer
$tt->SetFont(FF_VERDANA,FS_NORMAL,10);
$tt->Set("Generated: ".date("ymd H:m",time()),0.1,$ymax*0.95);
$tt->Stroke($g->img,$scale);
// .. and stream it all back
$g->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/canvasex01.html b/html/includes/jpgraph/docs/html/exframes/canvasex01.html
new file mode 100644
index 0000000000..8ae2722768
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/canvasex01.html
@@ -0,0 +1,3 @@
+
+<?php
// $Id: canvasex01.php,v 1.3 2002/10/23 08:17:23 aditus Exp $
include "../jpgraph.php";
include "../jpgraph_canvas.php";
// Setup a basic canvas we can work
$g = new CanvasGraph(400,300,'auto');
$g->SetMargin(5,11,6,11);
$g->SetShadow();
$g->SetMarginColor("teal");
// We need to stroke the plotarea and margin before we add the
// text since we otherwise would overwrite the text.
$g->InitFrame();
// Draw a text box in the middle
$txt="This\nis\na TEXT!!!";
$t = new Text($txt,200,10);
$t->SetFont(FF_ARIAL,FS_BOLD,40);
// How should the text box interpret the coordinates?
$t->Align('center','top');
// How should the paragraph be aligned?
$t->ParagraphAlign('center');
// Add a box around the text, white fill, black border and gray shadow
$t->SetBox("white","black","gray");
// Stroke the text
$t->Stroke($g->img);
// Stroke the graph
$g->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/canvasex02.html b/html/includes/jpgraph/docs/html/exframes/canvasex02.html
new file mode 100644
index 0000000000..a6efdc6a18
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/canvasex02.html
@@ -0,0 +1,3 @@
+
+<?php
// $Id: canvasex02.php,v 1.1 2002/08/27 20:08:57 aditus Exp $
include "../jpgraph.php";
include "../jpgraph_canvas.php";
// Setup a basic canvas we can work
$g = new CanvasGraph(400,200,'auto');
$g->SetMargin(5,11,6,11);
$g->SetShadow();
$g->SetMarginColor("teal");
// We need to stroke the plotarea and margin before we add the
// text since we otherwise would overwrite the text.
$g->InitFrame();
// Add a black line
$g->img->SetColor('black');
$g->img->Line(0,0,100,100);
// .. and a circle (x,y,diameter)
$g->img->Circle(100,100,50);
// .. and a filled circle (x,y,diameter)
$g->img->SetColor('red');
$g->img->FilledCircle(200,100,50);
// .. add a rectangle
$g->img->SetColor('green');
$g->img->FilledRectangle(10,10,50,50);
// .. add a filled rounded rectangle
$g->img->SetColor('green');
$g->img->FilledRoundedRectangle(300,30,350,80,10);
// .. with a darker border
$g->img->SetColor('darkgreen');
$g->img->RoundedRectangle(300,30,350,80,10);
// Stroke the graph
$g->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/canvasex03.html b/html/includes/jpgraph/docs/html/exframes/canvasex03.html
new file mode 100644
index 0000000000..ee9b211e3a
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/canvasex03.html
@@ -0,0 +1,3 @@
+
+<?php
// $Id: canvasex03.php,v 1.1 2002/08/27 20:08:57 aditus Exp $
include "../jpgraph.php";
include "../jpgraph_canvas.php";
include "../jpgraph_canvtools.php";
// Define work space
$xmax=20;
$ymax=20;
// Setup a basic canvas we can work
$g = new CanvasGraph(400,200,'auto');
$g->SetMargin(5,11,6,11);
$g->SetShadow();
$g->SetMarginColor("teal");
// We need to stroke the plotarea and margin before we add the
// text since we otherwise would overwrite the text.
$g->InitFrame();
// Create a new scale
$scale = new CanvasScale($g);
$scale->Set(0,$xmax,0,$ymax);
// The shape class is wrapper around the Imgae class which translates
// the coordinates for us
$shape = new Shape($g,$scale);
$shape->SetColor('black');
// Add a black line
$shape->SetColor('black');
$shape->Line(0,0,20,20);
// .. and a circle (x,y,diameter)
$shape->Circle(5,14,2);
// .. and a filled circle (x,y,diameter)
$shape->SetColor('red');
$shape->FilledCircle(11,8,3);
// .. add a rectangle
$shape->SetColor('green');
$shape->FilledRectangle(15,8,19,14);
// .. add a filled rounded rectangle
$shape->SetColor('green');
$shape->FilledRoundedRectangle(2,3,8,6);
// .. with a darker border
$shape->SetColor('darkgreen');
$shape->RoundedRectangle(2,3,8,6);
// Stroke the graph
$g->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/canvasex04.html b/html/includes/jpgraph/docs/html/exframes/canvasex04.html
new file mode 100644
index 0000000000..254419de12
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/canvasex04.html
@@ -0,0 +1,3 @@
+
+<?php
// $Id: canvasex04.php,v 1.1 2002/08/27 20:08:57 aditus Exp $
include "../jpgraph.php";
include "../jpgraph_canvas.php";
include "../jpgraph_canvtools.php";
// Define work space
$xmax=20;
$ymax=20;
// Setup a basic canvas we can work
$g = new CanvasGraph(200,100,'auto');
$g->SetMargin(5,11,6,11);
$g->SetShadow();
$g->SetMarginColor("teal");
// We need to stroke the plotarea and margin before we add the
// text since we otherwise would overwrite the text.
$g->InitFrame();
// Create a new scale
$scale = new CanvasScale($g);
$scale->Set(0,$xmax,0,$ymax);
// The shape class is wrapper around the Imgae class which translates
// the coordinates for us
$shape = new Shape($g,$scale);
$shape->SetColor('black');
// Add a black line
$shape->SetColor('black');
$shape->Line(0,0,20,20);
// .. and a circle (x,y,diameter)
$shape->Circle(5,14,2);
// .. and a filled circle (x,y,diameter)
$shape->SetColor('red');
$shape->FilledCircle(11,8,3);
// .. add a rectangle
$shape->SetColor('green');
$shape->FilledRectangle(15,8,19,14);
// .. add a filled rounded rectangle
$shape->SetColor('green');
$shape->FilledRoundedRectangle(2,3,8,6);
// .. with a darker border
$shape->SetColor('darkgreen');
$shape->RoundedRectangle(2,3,8,6);
// Stroke the graph
$g->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/canvasex05.html b/html/includes/jpgraph/docs/html/exframes/canvasex05.html
new file mode 100644
index 0000000000..c740c3889c
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/canvasex05.html
@@ -0,0 +1,3 @@
+
+<?php
// $Id: canvasex05.php,v 1.1 2002/08/27 20:08:57 aditus Exp $
include "../jpgraph.php";
include "../jpgraph_canvas.php";
include "../jpgraph_canvtools.php";
// Define work space
$xmax=40;
$ymax=40;
// Setup a basic canvas we can work
$g = new CanvasGraph(400,200,'auto');
$g->SetMargin(5,11,6,11);
$g->SetShadow();
$g->SetMarginColor("teal");
// We need to stroke the plotarea and margin before we add the
// text since we otherwise would overwrite the text.
$g->InitFrame();
// Create a new scale
$scale = new CanvasScale($g);
$scale->Set(0,$xmax,0,$ymax);
// The shape class is wrapper around the Imgae class which translates
// the coordinates for us
$shape = new Shape($g,$scale);
$shape->SetColor('black');
// Add a black line
$shape->SetColor('black');
$shape->Line(0,0,20,20);
// .. and a circle (x,y,diameter)
$shape->Circle(5,14,2);
// .. and a filled circle (x,y,diameter)
$shape->SetColor('red');
$shape->FilledCircle(11,8,3);
// .. add a rectangle
$shape->SetColor('green');
$shape->FilledRectangle(15,8,19,14);
// .. add a filled rounded rectangle
$shape->SetColor('green');
$shape->FilledRoundedRectangle(2,3,8,6);
// .. with a darker border
$shape->SetColor('darkgreen');
$shape->RoundedRectangle(2,3,8,6);
// Stroke the graph
$g->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/canvasex06.html b/html/includes/jpgraph/docs/html/exframes/canvasex06.html
new file mode 100644
index 0000000000..7faf171f7d
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/canvasex06.html
@@ -0,0 +1,3 @@
+
+<?php
// $Id: canvasex06.php,v 1.1 2002/08/27 20:08:57 aditus Exp $
include "../jpgraph.php";
include "../jpgraph_canvas.php";
include "../jpgraph_canvtools.php";
// Define work space
$xmax=40;
$ymax=40;
// Setup a basic canvas we can work
$g = new CanvasGraph(400,200,'auto');
$g->SetMargin(5,11,6,11);
$g->SetShadow();
$g->SetMarginColor("teal");
// We need to stroke the plotarea and margin before we add the
// text since we otherwise would overwrite the text.
$g->InitFrame();
// Create a new scale
$scale = new CanvasScale($g);
$scale->Set(0,$xmax,0,$ymax);
// The shape class is wrapper around the Imgae class which translates
// the coordinates for us
$shape = new Shape($g,$scale);
$shape->SetColor('black');
$shape->IndentedRectangle(1,2,15,15,8,8,CORNER_TOPLEFT,'khaki');
$shape->IndentedRectangle(1,20,15,15,8,8,CORNER_BOTTOMLEFT,'khaki');
$shape->IndentedRectangle(20,2,15,15,8,8,CORNER_TOPRIGHT,'khaki');
$shape->IndentedRectangle(20,20,15,15,8,8,CORNER_BOTTOMRIGHT,'khaki');
// Stroke the graph
$g->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/color_chart01.html b/html/includes/jpgraph/docs/html/exframes/color_chart01.html
new file mode 100644
index 0000000000..014d1242c6
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/color_chart01.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
// The callback that converts timestamp to minutes and seconds
function TimeCallback($aVal) {
return Date('H:i:s',$aVal);
}
// Fake some suitable random data
$now = time();
$datax = array($now);
for( $i=0; $i < 360; $i += 10 ) {
$datax[] = $now + $i;
}
$n = count($datax);
$datay=array();
for( $i=0; $i < $n; ++$i ) {
$datay[] = rand(30,150);
}
// Setup the basic graph
$graph = new Graph(324,250);
$graph->SetMargin(40,40,30,70);
$graph->title->Set('Date: '.date('Y-m-d',$now));
$graph->SetAlphaBlending();
// Setup a manual x-scale (We leave the sentinels for the
// Y-axis at 0 which will then autoscale the Y-axis.)
// We could also use autoscaling for the x-axis but then it
// probably will start a little bit earlier than the first value
// to make the first value an even number as it sees the timestamp
// as an normal integer value.
$graph->SetScale("intlin",0,200,$now,$datax[$n-1]);
// Setup the x-axis with a format callback to convert the timestamp
// to a user readable time
$graph->xaxis->SetLabelFormatCallback('TimeCallback');
$graph->xaxis->SetLabelAngle(90);
// Create the line
$p1 = new LinePlot($datay,$datax);
$p1->SetColor("blue");
// Set the fill color partly transparent
$p1->SetFillColor("blue@0.4");
// Add lineplot to the graph
$graph->Add($p1);
// Output line
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/dateaxisex2.html b/html/includes/jpgraph/docs/html/exframes/dateaxisex2.html
new file mode 100644
index 0000000000..78c12afae2
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/dateaxisex2.html
@@ -0,0 +1,4 @@
+
+<?php
require_once("../jpgraph.php");
require_once("../jpgraph_line.php");
require_once("../jpgraph_date.php");
// Create a data set in range (50,70) and X-positions
DEFINE('NDATAPOINTS',360);
DEFINE('SAMPLERATE',240);
$start = time();
$end = $start+NDATAPOINTS*SAMPLERATE;
$data = array();
$xdata = array();
for( $i=0; $i < NDATAPOINTS; ++$i ) {
$data[$i] = rand(50,70);
$xdata[$i] = $start + $i * SAMPLERATE;
}
// Create the new graph
$graph = new Graph(540,300);
// Slightly larger than normal margins at the bottom to have room for
// the x-axis labels
$graph->SetMargin(40,40,30,130);
// Fix the Y-scale to go between [0,100] and use date for the x-axis
$graph->SetScale('datlin',0,100);
$graph->title->Set("Example on Date scale");
// Set the angle for the labels to 90 degrees
$graph->xaxis->SetLabelAngle(90);
$line = new LinePlot($data,$xdata);
$line->SetLegend('Year 2005');
$line->SetFillColor('lightblue@0.5');
$graph->Add($line);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/dateaxisex4.html b/html/includes/jpgraph/docs/html/exframes/dateaxisex4.html
new file mode 100644
index 0000000000..6aef1c937b
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/dateaxisex4.html
@@ -0,0 +1,4 @@
+
+<?php
require_once("../jpgraph.php");
require_once("../jpgraph_line.php");
require_once("../jpgraph_date.php");
// Create a data set in range (50,70) and X-positions
DEFINE('NDATAPOINTS',360);
DEFINE('SAMPLERATE',240);
$start = time();
$end = $start+NDATAPOINTS*SAMPLERATE;
$data = array();
$xdata = array();
for( $i=0; $i < NDATAPOINTS; ++$i ) {
$data[$i] = rand(50,70);
$xdata[$i] = $start + $i * SAMPLERATE;
}
// Create the new graph
$graph = new Graph(540,300);
// Slightly larger than normal margins at the bottom to have room for
// the x-axis labels
$graph->SetMargin(40,40,30,130);
// Fix the Y-scale to go between [0,100] and use date for the x-axis
$graph->SetScale('datlin',0,100);
$graph->title->Set("Example on Date scale");
// Set the angle for the labels to 90 degrees
$graph->xaxis->SetLabelAngle(90);
// The automatic format string for dates can be overridden
$graph->xaxis->scale->SetDateFormat('H:i');
// Adjust the start/end to a specific alignment
$graph->xaxis->scale->SetTimeAlign(MINADJ_10);
$line = new LinePlot($data,$xdata);
$line->SetLegend('Year 2005');
$line->SetFillColor('lightblue@0.5');
$graph->Add($line);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/dbschemaex1.html b/html/includes/jpgraph/docs/html/exframes/dbschemaex1.html
new file mode 100644
index 0000000000..30feb4925e
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/dbschemaex1.html
@@ -0,0 +1,3 @@
+
+<?php
/*=======================================================================
// File: DBSCHEMAEX1.PHP
// Description: Draw a DB schema of the DDDA architecture
// Created: 2002-08-25
// Author: Johan Persson (johanp@aditus.nu)
// Ver: $Id: dbschemaex1.php,v 1.1 2002/08/27 20:08:57 aditus Exp $
//
// License: This code is released under QPL
// Copyright (C) 2001,2002 Johan Persson
// Note: The actual drawing of the tables are semi-automatically
// but you can easily adjust the individual tables position
// with the 'tblposadj' array.
//
//========================================================================
*/
include "../jpgraph.php";
include "../jpgraph_canvas.php";
include "../jpgraph_canvtools.php";
include "../utils/misc/imgdbschema.inc";
include "../utils/jpdocgen/jpdb.php";
// Global callback to format the table header names
function FormatTblName($aName) {
// We want to replace any specifi references to the
// 'JpGraph' project with the generic '<project>'
return str_replace('JpGraph','<project>', $aName);
}
// Global callback to format each field name in the table
function FormatFldName($aName,$aTable) {
return $aName;
}
class Driver {
var $ig, $img, $iscale, $ishape;
var $iymax,$ixmax;
var $iwidth,$iheight;
function Driver() {
// Define Image size and coordinate grid space to work within
$this->iwidth = 600;
$this->iheight= 750;
$this->iymax = 50;
$this->ixmax = 55;
// Setup a basic canvas
$this->ig = new CanvasGraph($this->iwidth,$this->iheight,'auto');
$this->img = $this->ig->img;
// Define the scale to be used
$this->iscale = new CanvasScale($this->ig);
$this->iscale->Set(0,$this->ixmax,0,$this->iymax);
$this->ishape = new Shape($this->ig,$this->iscale);
// A small frame around the canvas
$this->ig->SetMargin(2,3,2,3);
$this->ig->SetMarginColor("teal");
$this->ig->InitFrame();
}
function Run() {
$leftm=1.5; // Left margin (for table schemes)
$topm=5; // Top margin (for table schemes)
$tblwidth=15; // Individual table width
$tlo=1; // Offset for top line
// Add the background color for the project specific tables
$this->ishape->IndentedRectangle($leftm,$topm-1,3*$tblwidth+$tlo+6,45,
$tlo+2*$tblwidth+2,30,CORNER_BOTTOMLEFT,
'lightblue');
// Stroke the tables (series of x,y offsets, If =-1 then use the
// automtic positioning
$tblposadj=array($tlo,0,$tblwidth+$tlo+2,0,2*$tblwidth+$tlo+4,
0,-1,16,-1,16);
$dbschema = new ImgDBSchema('jpgraph_doc','FormatTblName','FormatFldName');
$dbschema->SetMargin($leftm,$topm);
$dbschema->SetTableWidth($tblwidth);
$dbschema->Stroke($this->img,$this->iscale,$tblposadj);
$tt = new CanvasRectangleText();
$tt->SetFillColor('');
$tt->SetColor('');
$tt->SetFontColor('navy');
// Add explanation
$tt->SetFont(FF_ARIAL,FS_NORMAL,12);
$tt->Set('Project specific tables',$tblwidth+$leftm+3,16,15);
$tt->Stroke($this->img,$this->iscale);
// Add title
$tt->SetColor('');
$tt->SetFont(FF_VERDANA,FS_BOLD,26);
$tt->Set('DDDA - DB Schema',9,0.5,30);
$tt->Stroke($this->img,$this->iscale);
// Add a version and date
$tt->SetFillColor('yellow');
$tt->SetFont(FF_FONT1,FS_NORMAL,10);
$tt->Set("Generated: ".date("ymd H:i",time()),1,$this->iymax*0.96,15);
$tt->Stroke($this->img,$this->iscale);
$this->ig->Stroke();
}
}
$driver = new Driver();
$driver->Run();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example0.html b/html/includes/jpgraph/docs/html/exframes/example0.html
new file mode 100644
index 0000000000..2c8e330116
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example0.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
// Some data
$ydata = array(11,3,8,12,5,1,9,13,5,7);
// Create the graph. These two calls are always required
$graph = new Graph(350,250,"auto");
$graph->SetScale("textlin");
// Create the linear plot
$lineplot=new LinePlot($ydata);
$lineplot->SetColor("blue");
// Add the plot to the graph
$graph->Add($lineplot);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example11.html b/html/includes/jpgraph/docs/html/exframes/example11.html
new file mode 100644
index 0000000000..d0bf65960d
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example11.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,12,5,1,9,13,5,7);
$ydata2 = array(1,19,15,7,22,14,5,9,21,13);
$gJpgBrandTiming=true;
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
// Create the linear plot
$lineplot=new LinePlot($ydata);
$lineplot2=new LinePlot($ydata2);
// Add the plot to the graph
$graph->Add($lineplot);
$graph->Add($lineplot2);
$graph->img->SetMargin(40,20,20,40);
$graph->title->Set("Timing a graph");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$lineplot->SetColor("blue");
$lineplot->SetWeight(2);
$lineplot2->SetColor("orange");
$lineplot2->SetWeight(2);
$graph->yaxis->SetColor("red");
$graph->yaxis->SetWeight(2);
$graph->SetShadow();
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example13.html b/html/includes/jpgraph/docs/html/exframes/example13.html
new file mode 100644
index 0000000000..e774c5e418
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example13.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_error.php");
$errdatay = array(11,9,2,4,19,26,13,19,7,12);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
$graph->img->SetMargin(40,30,20,40);
$graph->SetShadow();
// Create the error plot
$errplot=new ErrorPlot($errdatay);
$errplot->SetColor("red");
$errplot->SetWeight(2);
// Add the plot to the graph
$graph->Add($errplot);
$graph->title->Set("Simple error plot");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$datax = $gDateLocale->GetShortMonth();
$graph->xaxis->SetTickLabels($datax);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example14.html b/html/includes/jpgraph/docs/html/exframes/example14.html
new file mode 100644
index 0000000000..5e08e04b54
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example14.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_error.php");
$errdatay = array(11,9,2,4,19,26,13,19,7,12);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
$graph->img->SetMargin(40,30,20,40);
$graph->SetShadow();
// Create the error plot
$errplot=new ErrorPlot($errdatay);
$errplot->SetColor("red");
$errplot->SetWeight(2);
$errplot->SetCenter();
// Add the plot to the graph
$graph->Add($errplot);
$graph->title->Set("Simple error plot");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$datax = $gDateLocale->GetShortMonth();
$graph->xaxis->SetTickLabels($datax);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example15.html b/html/includes/jpgraph/docs/html/exframes/example15.html
new file mode 100644
index 0000000000..94a61376b6
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example15.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
include ("../jpgraph_error.php");
$errdatay = array(11,9,2,4,19,26,13,19,7,12);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
$graph->img->SetMargin(40,30,20,40);
$graph->SetShadow();
// Create the linear plot
$errplot=new ErrorLinePlot($errdatay);
$errplot->SetColor("red");
$errplot->SetWeight(2);
$errplot->SetCenter();
$errplot->line->SetWeight(2);
$errplot->line->SetColor("blue");
// Add the plot to the graph
$graph->Add($errplot);
$graph->title->Set("Linear error plot");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$datax = $gDateLocale->GetShortMonth();
$graph->xaxis->SetTickLabels($datax);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example16.1.html b/html/includes/jpgraph/docs/html/exframes/example16.1.html
new file mode 100644
index 0000000000..479cda61df
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example16.1.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
include ("../jpgraph_error.php");
include ("../jpgraph_bar.php");
$l1datay = array(11,9,2,4,3,13,17);
$l2datay = array(23,12,5,19,17,10,15);
$datax=array("Jan","Feb","Mar","Apr","May");
// Create the graph.
$graph = new Graph(400,200,"auto");
$graph->SetScale("textlin");
$graph->img->SetMargin(40,130,20,40);
$graph->SetShadow();
// Create the linear error plot
$l1plot=new LinePlot($l1datay);
$l1plot->SetColor("red");
$l1plot->SetWeight(2);
$l1plot->SetLegend("Prediction");
// Create the bar plot
$l2plot = new LinePlot($l2datay);
$l2plot->SetFillColor("orange");
$l2plot->SetLegend("Result");
// Add the plots to the graph
$graph->Add($l2plot);
$graph->Add($l1plot);
$graph->title->Set("Mixing line and filled line");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
//$graph->xaxis->SetTickLabels($datax);
//$graph->xaxis->SetTextTickInterval(2);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example16.2.html b/html/includes/jpgraph/docs/html/exframes/example16.2.html
new file mode 100644
index 0000000000..e27c3fccfb
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example16.2.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
include ("../jpgraph_bar.php");
$l1datay = array(11,9,2,4,3,13,17);
$l2datay = array(23,12,5,19,17,10,15);
$datax=array("Jan","Feb","Mar","Apr","May");
// Create the graph.
$graph = new Graph(400,200,"auto");
$graph->SetScale("textlin");
$graph->img->SetMargin(40,130,20,40);
$graph->SetShadow();
// Create the linear error plot
$l1plot=new LinePlot($l1datay);
$l1plot->SetColor("red");
$l1plot->SetWeight(2);
$l1plot->SetLegend("Prediction");
// Create the bar plot
$bplot = new BarPlot($l2datay);
$bplot->SetFillColor("orange");
$bplot->SetLegend("Result");
// Add the plots to t'he graph
$graph->Add($l1plot);
$graph->Add($bplot);
$graph->title->Set("Adding a line plot to a bar graph v1");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
//$graph->xaxis->SetTickLabels($datax);
//$graph->xaxis->SetTextTickInterval(2);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example16.3.html b/html/includes/jpgraph/docs/html/exframes/example16.3.html
new file mode 100644
index 0000000000..232541c454
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example16.3.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
include ("../jpgraph_bar.php");
$l1datay = array(11,9,2,4,3,13,17);
$l2datay = array(23,12,5,19,17,10,15);
$datax=array("Jan","Feb","Mar","Apr","May");
// Create the graph.
$graph = new Graph(400,200,"auto");
$graph->SetScale("textlin");
$graph->img->SetMargin(40,130,20,40);
$graph->SetShadow();
// Create the linear error plot
$l1plot=new LinePlot($l1datay);
$l1plot->SetColor("red");
$l1plot->SetWeight(2);
$l1plot->SetLegend("Prediction");
// Create the bar plot
$bplot = new BarPlot($l2datay);
$bplot->SetFillColor("orange");
$bplot->SetLegend("Result");
// Add the plots to t'he graph
$graph->Add($bplot);
$graph->Add($l1plot);
$graph->title->Set("Adding a line plot to a bar graph v1");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
//$graph->xaxis->SetTickLabels($datax);
//$graph->xaxis->SetTextTickInterval(2);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example16.4.html b/html/includes/jpgraph/docs/html/exframes/example16.4.html
new file mode 100644
index 0000000000..328f6824e8
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example16.4.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
include ("../jpgraph_bar.php");
$l1datay = array(11,9,2,4,3,13,17);
$l2datay = array(23,12,5,19,17,10,15);
// Create the graph.
$graph = new Graph(400,200,"auto");
$graph->SetScale("intlin");
$graph->img->SetMargin(40,130,20,40);
$graph->SetShadow();
// Create the linear error plot
$l1plot=new LinePlot($l1datay);
$l1plot->SetColor("red");
$l1plot->SetWeight(2);
$l1plot->SetLegend("Prediction");
// Create the bar plot
$bplot = new BarPlot($l2datay);
$bplot->SetFillColor("orange");
$bplot->SetLegend("Result");
// Add the plots to t'he graph
$graph->Add($bplot);
$graph->Add($l1plot);
$graph->title->Set("Adding a line plot to a bar graph v3");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$datax = $gDateLocale->GetShortMonth();
$graph->xaxis->SetTickLabels($datax);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example16.6.html b/html/includes/jpgraph/docs/html/exframes/example16.6.html
new file mode 100644
index 0000000000..46788dde83
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example16.6.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_scatter.php");
include ("../jpgraph_line.php");
// Create some "fake" regression data
$datay = array();
$datay2 = array();
$datax = array();
$a=rand(-3,3);
$b=rand(-5,5);
for($x=0; $x<20; ++$x) {
$datay[] = $a*$x + $b;
$datay2[] = $a*$x + $b + rand(-30,30);
$datax[] = $x;
}
// Create the graph
$graph = new Graph(300,200,'auto');
$graph->SetScale("linlin");
// Setup title
$graph->title->Set("Example of linear regression");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
// make sure that the X-axis is always at the
// bottom at the plot and not just at Y=0 which is
// the default position
$graph->xaxis->SetPos('min');
// Create the scatter plot with some nice colors
$sp1 = new ScatterPlot($datay2,$datax);
$sp1->mark->SetType(MARK_FILLEDCIRCLE);
$sp1->mark->SetFillColor("red");
$sp1->SetColor("blue");
$sp1->SetWeight(3);
$sp1->mark->SetWidth(4);
// Create the regression line
$lplot = new LinePlot($datay);
$lplot->SetWeight(2);
$lplot->SetColor('navy');
// Add the pltos to the line
$graph->Add($sp1);
$graph->Add($lplot);
// ... and stroke
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example16.html b/html/includes/jpgraph/docs/html/exframes/example16.html
new file mode 100644
index 0000000000..d40ff74f11
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example16.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
include ("../jpgraph_error.php");
$errdatay = array(11,9,2,4,19,26,13,19,7,12);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
$graph->img->SetMargin(40,30,20,40);
$graph->SetShadow();
// Create the linear plot
$errplot=new ErrorLinePlot($errdatay);
$errplot->SetColor("red");
$errplot->SetWeight(2);
$errplot->SetCenter();
$errplot->line->SetWeight(2);
$errplot->line->SetColor("blue");
// Setup the legends
$errplot->SetLegend("Min/Max");
$errplot->line->SetLegend("Average");
// Add the plot to the graph
$graph->Add($errplot);
$graph->title->Set("Linear error plot");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$datax = $gDateLocale->GetShortMonth();
$graph->xaxis->SetTickLabels($datax);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example17.html b/html/includes/jpgraph/docs/html/exframes/example17.html
new file mode 100644
index 0000000000..a51dac0ade
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example17.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$datay1 = array(11,7,5,8,3,5,5,4,8,6,5,5,3,2,5,1,2,0);
$datay2 = array( 4,5,4,5,6,5,7,4,7,4,4,3,2,4,1,2,2,1);
$datay3 = array(4,5,7,10,13,15,15,22,26,26,30,34,40,43,47,55,60,62);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
$graph->SetShadow();
$graph->img->SetMargin(40,30,20,40);
// Create the linear plots for each category
$dplot[] = new LinePLot($datay1);
$dplot[] = new LinePLot($datay2);
$dplot[] = new LinePLot($datay3);
$dplot[0]->SetFillColor("red");
$dplot[1]->SetFillColor("blue");
$dplot[2]->SetFillColor("green");
// Create the accumulated graph
$accplot = new AccLinePlot($dplot);
// Add the plot to the graph
$graph->Add($accplot);
$graph->xaxis->SetTextTickInterval(2);
$graph->title->Set("Example 17");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example18.html b/html/includes/jpgraph/docs/html/exframes/example18.html
new file mode 100644
index 0000000000..55bb253723
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example18.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(12,8,19,3,10,5);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
// Add a drop shadow
$graph->SetShadow();
// Adjust the margin a bit to make more room for titles
$graph->img->SetMargin(40,30,20,40);
// Create a bar pot
$bplot = new BarPlot($datay);
$graph->Add($bplot);
// Setup the titles
$graph->title->Set("A simple bar graph");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example19.1.html b/html/includes/jpgraph/docs/html/exframes/example19.1.html
new file mode 100644
index 0000000000..95e7e98160
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example19.1.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(12,8,19,3,10,5);
// Create the graph. These two calls are always required
$graph = new Graph(260,100,"auto");
$graph->SetScale("linlin");
// Add a drop shadow
$graph->SetShadow();
// Adjust the margin a bit to make more room for titles
$graph->img->SetMargin(40,30,20,40);
// Create a bar pot
$bplot = new BarPlot($datay);
// Adjust fill color
$bplot->SetFillColor('orange');
$graph->Add($bplot);
// Setup the titles
$graph->title->Set("Bar graph, linear scale");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example19.html b/html/includes/jpgraph/docs/html/exframes/example19.html
new file mode 100644
index 0000000000..92e9a12877
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example19.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(12,8,19,3,10,5);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
// Add a drop shadow
$graph->SetShadow();
// Adjust the margin a bit to make more room for titles
$graph->img->SetMargin(40,30,20,40);
// Create a bar pot
$bplot = new BarPlot($datay);
// Adjust fill color
$bplot->SetFillColor('orange');
$graph->Add($bplot);
// Setup the titles
$graph->title->Set("A simple bar graph");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example2.html b/html/includes/jpgraph/docs/html/exframes/example2.html
new file mode 100644
index 0000000000..1ad2af19fc
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example2.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,10,5,1,9,13,5,7);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
// Setup margin and titles
$graph->img->SetMargin(40,20,20,40);
$graph->title->Set("Example 2");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
// Create the linear plot
$lineplot=new LinePlot($ydata);
// Add the plot to the graph
$graph->Add($lineplot);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example20.1.html b/html/includes/jpgraph/docs/html/exframes/example20.1.html
new file mode 100644
index 0000000000..4327f7c912
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example20.1.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(12,8,19,3,10,5);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
// Add a drop shadow
$graph->SetShadow();
// Adjust the margin a bit to make more room for titles
$graph->img->SetMargin(40,30,20,40);
// Create a bar pot
$bplot = new BarPlot($datay);
// Adjust fill color
$bplot->SetFillColor('orange');
$bplot->value->Show();
$graph->Add($bplot);
// Setup the titles
$graph->title->Set("Bar graph");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example20.2.html b/html/includes/jpgraph/docs/html/exframes/example20.2.html
new file mode 100644
index 0000000000..ee5734d8ff
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example20.2.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(12,8,19,3,10,5);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
$graph->yaxis->scale->SetGrace(20);
// Add a drop shadow
$graph->SetShadow();
// Adjust the margin a bit to make more room for titles
$graph->img->SetMargin(40,30,20,40);
// Create a bar pot
$bplot = new BarPlot($datay);
// Adjust fill color
$bplot->SetFillColor('orange');
$bplot->value->Show();
$graph->Add($bplot);
// Setup the titles
$graph->title->Set("Bar graph with Y-scale grace");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example20.3.html b/html/includes/jpgraph/docs/html/exframes/example20.3.html
new file mode 100644
index 0000000000..0422805e7f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example20.3.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(12,8,19,3,10,5);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
$graph->yaxis->scale->SetGrace(20);
// Add a drop shadow
$graph->SetShadow();
// Adjust the margin a bit to make more room for titles
$graph->img->SetMargin(40,30,20,40);
// Create a bar pot
$bplot = new BarPlot($datay);
// Adjust fill color
$bplot->SetFillColor('orange');
$bplot->value->Show();
$bplot->value->SetFont(FF_ARIAL,FS_BOLD,10);
$bplot->value->SetAngle(45);
$bplot->value->SetFormat('%0.1f');
$graph->Add($bplot);
// Setup the titles
$graph->title->Set("Bar graph with Y-scale grace");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example20.4.html b/html/includes/jpgraph/docs/html/exframes/example20.4.html
new file mode 100644
index 0000000000..54fcdf30f8
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example20.4.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(12,8,19,3,10,5);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
$graph->yaxis->scale->SetGrace(20);
// Add a drop shadow
$graph->SetShadow();
// Adjust the margin a bit to make more room for titles
$graph->img->SetMargin(40,30,20,40);
// Create a bar pot
$bplot = new BarPlot($datay);
// Adjust fill color
$bplot->SetFillColor('orange');
$bplot->SetShadow();
$bplot->value->Show();
$bplot->value->SetFont(FF_ARIAL,FS_BOLD,10);
$bplot->value->SetAngle(45);
$bplot->value->SetFormat('%0.1f');
$graph->Add($bplot);
// Setup the titles
$graph->title->Set("Bar graph with drop shadow");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example20.5.html b/html/includes/jpgraph/docs/html/exframes/example20.5.html
new file mode 100644
index 0000000000..8b4d3e4f7f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example20.5.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(12,8,19,3,10,5);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
// Add a drop shadow
$graph->SetShadow();
// Adjust the margin a bit to make more room for titles
$graph->img->SetMargin(40,30,20,40);
// Create a bar pot
$bplot = new BarPlot($datay);
// Adjust fill color
$bplot->SetFillColor('orange');
// Setup values
$bplot->value->Show();
$bplot->value->SetFormat('%d');
$bplot->value->SetFont(FF_FONT1,FS_BOLD);
// Center the values in the bar
$bplot->SetValuePos('center');
// Make the bar a little bit wider
$bplot->SetWidth(0.7);
$graph->Add($bplot);
// Setup the titles
$graph->title->Set("Centered values for bars");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example20.html b/html/includes/jpgraph/docs/html/exframes/example20.html
new file mode 100644
index 0000000000..04ca2066d3
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example20.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(12,8,19,3,10,5);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
// Add a drop shadow
$graph->SetShadow();
// Adjust the margin a bit to make more room for titles
$graph->img->SetMargin(40,30,20,40);
// Create a bar pot
$bplot = new BarPlot($datay);
// Adjust fill color
$bplot->SetFillColor('orange');
$bplot->SetWidth(1.0);
$graph->Add($bplot);
// Setup the titles
$graph->title->Set("Bar graph");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example21.html b/html/includes/jpgraph/docs/html/exframes/example21.html
new file mode 100644
index 0000000000..ba7cb9d63a
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example21.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$data1y=array(12,8,19,3,10,5);
$data2y=array(8,2,11,7,14,4);
// Create the graph. These two calls are always required
$graph = new Graph(310,200,"auto");
$graph->SetScale("textlin");
$graph->SetShadow();
$graph->img->SetMargin(40,30,20,40);
// Create the bar plots
$b1plot = new BarPlot($data1y);
$b1plot->SetFillColor("orange");
$b2plot = new BarPlot($data2y);
$b2plot->SetFillColor("blue");
// Create the grouped bar plot
$gbplot = new GroupBarPlot(array($b1plot,$b2plot));
// ...and add it to the graPH
$graph->Add($gbplot);
$graph->title->Set("Example 21");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example22.html b/html/includes/jpgraph/docs/html/exframes/example22.html
new file mode 100644
index 0000000000..e4ea4c39da
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example22.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$data1y=array(12,8,19,3,10,5);
$data2y=array(8,2,11,7,14,4);
// Create the graph. These two calls are always required
$graph = new Graph(310,200,"auto");
$graph->SetScale("textlin");
$graph->SetShadow();
$graph->img->SetMargin(40,30,20,40);
// Create the bar plots
$b1plot = new BarPlot($data1y);
$b1plot->SetFillColor("orange");
$b2plot = new BarPlot($data2y);
$b2plot->SetFillColor("blue");
// Create the grouped bar plot
$gbplot = new GroupBarPlot(array($b1plot,$b2plot));
$gbplot->SetWidth(0.9);
// ...and add it to the graPH
$graph->Add($gbplot);
$graph->title->Set("Adjusting the width");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example23.html b/html/includes/jpgraph/docs/html/exframes/example23.html
new file mode 100644
index 0000000000..9d994bb25b
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example23.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
setlocale (LC_ALL, 'et_EE.ISO-8859-1');
$data1y=array(12,8,19,3,10,5);
$data2y=array(8,2,11,7,14,4);
// Create the graph. These two calls are always required
$graph = new Graph(310,200,"auto");
$graph->SetScale("textlin");
$graph->SetShadow();
$graph->img->SetMargin(40,30,20,40);
// Create the bar plots
$b1plot = new BarPlot($data1y);
$b1plot->SetFillColor("orange");
$b2plot = new BarPlot($data2y);
$b2plot->SetFillColor("blue");
// Create the grouped bar plot
$gbplot = new AccBarPlot(array($b1plot,$b2plot));
// ...and add it to the graPH
$graph->Add($gbplot);
$graph->title->Set("Accumulated bar plots");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example24.html b/html/includes/jpgraph/docs/html/exframes/example24.html
new file mode 100644
index 0000000000..3d38277aae
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example24.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$data1y=array(12,8,19,3,10,5);
$data2y=array(8,2,11,7,14,4);
$data3y=array(3,9,2,7,5,8);
$data4y=array(1,5,11,2,14,4);
// Create the graph. These two calls are always required
$graph = new Graph(310,200,"auto");
$graph->SetScale("textlin");
$graph->SetShadow();
$graph->img->SetMargin(40,30,20,40);
$b1plot = new BarPlot($data1y);
$b1plot->SetFillColor("orange");
$b2plot = new BarPlot($data2y);
$b2plot->SetFillColor("blue");
$b3plot = new BarPlot($data3y);
$b3plot->SetFillColor("green");
$b4plot = new BarPlot($data4y);
$b4plot->SetFillColor("brown");
// Create the accumulated bar plots
$ab1plot = new AccBarPlot(array($b1plot,$b2plot));
$ab2plot = new AccBarPlot(array($b3plot,$b4plot));
// Create the grouped bar plot
$gbplot = new GroupBarPlot(array($ab1plot,$ab2plot));
// ...and add it to the graph
$graph->Add($gbplot);
$graph->title->Set("Grouped Accumulated bar plots");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example25.1.html b/html/includes/jpgraph/docs/html/exframes/example25.1.html
new file mode 100644
index 0000000000..b0500568e9
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example25.1.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(12,8,19,3,10,5);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
// Add a drop shadow
$graph->SetShadow();
// Adjust the margin a bit to make more room for titles
$graph->img->SetMargin(40,30,20,40);
// Create a bar pot
$bplot = new BarPlot($datay);
$graph->Add($bplot);
// Create and add a new text
$txt=new Text("This is a text");
$txt->Pos(10,25);
$txt->SetFont(FF_FONT1,FS_BOLD);
$txt->SetBox('yellow','navy','gray');
$txt->SetColor("red");
$graph->AddText($txt);
// Setup the titles
$graph->title->Set("A simple bar graph");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example25.2.html b/html/includes/jpgraph/docs/html/exframes/example25.2.html
new file mode 100644
index 0000000000..dddba05744
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example25.2.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(12,8,19,3,10,5);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
// Add a drop shadow
$graph->SetShadow();
// Adjust the margin a bit to make more room for titles
$graph->img->SetMargin(40,30,20,40);
// Create a bar pot
$bplot = new BarPlot($datay);
$graph->Add($bplot);
// Create and add a new text
$txt=new Text("This is a text\nwith many\nand even\nmore\nlines of text");
$txt->Pos(0.5,0.5,"center","center");
$txt->SetFont(FF_FONT2,FS_BOLD);
$txt->ParagraphAlign('cenetered');
$txt->SetBox('yellow','navy','gray');
$txt->SetColor("red");
$graph->AddText($txt);
// Setup the titles
$graph->title->Set("A simple bar graph");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example25.html b/html/includes/jpgraph/docs/html/exframes/example25.html
new file mode 100644
index 0000000000..60c012a35c
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example25.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(12,8,19,3,10,5);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
// Add a drop shadow
$graph->SetShadow();
// Adjust the margin a bit to make more room for titles
$graph->img->SetMargin(40,30,20,40);
// Create a bar pot
$bplot = new BarPlot($datay);
$graph->Add($bplot);
// Create and add a new text
$txt=new Text("This is a text");
$txt->Pos(0,0);
$txt->SetColor("red");
$graph->AddText($txt);
// Setup the titles
$graph->title->Set("A simple bar graph");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example26.1.html b/html/includes/jpgraph/docs/html/exframes/example26.1.html
new file mode 100644
index 0000000000..75e175451b
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example26.1.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_pie.php");
$data = array(40,60,21,33);
$graph = new PieGraph(300,200,"auto");
$graph->SetShadow();
$graph->title->Set("A simple Pie plot");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$p1 = new PiePlot($data);
$p1->SetLegends($gDateLocale->GetShortMonth());
$p1->SetCenter(0.4);
$graph->Add($p1);
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example26.html b/html/includes/jpgraph/docs/html/exframes/example26.html
new file mode 100644
index 0000000000..970fe5d74c
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example26.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_pie.php");
$data = array(40,60,21,33);
$graph = new PieGraph(300,200,"auto");
$graph->SetShadow();
$graph->title->Set("A simple Pie plot");
$p1 = new PiePlot($data);
$graph->Add($p1);
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example27.1.html b/html/includes/jpgraph/docs/html/exframes/example27.1.html
new file mode 100644
index 0000000000..11b845944b
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example27.1.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_pie.php");
include ("../jpgraph_pie3d.php");
$data = array(40,60,21,33);
$graph = new PieGraph(300,200,"auto");
$graph->SetShadow();
$graph->title->Set("A simple Pie plot");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$p1 = new PiePlot3D($data);
$p1->SetAngle(20);
$p1->SetSize(0.5);
$p1->SetCenter(0.45);
$p1->SetLegends($gDateLocale->GetShortMonth());
$graph->Add($p1);
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example27.2.html b/html/includes/jpgraph/docs/html/exframes/example27.2.html
new file mode 100644
index 0000000000..af0b90a03d
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example27.2.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_pie.php");
include ("../jpgraph_pie3d.php");
$data = array(40,60,21,33);
$graph = new PieGraph(300,200,"auto");
$graph->SetShadow();
$graph->title->Set("A simple Pie plot");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$p1 = new PiePlot($data);
$p1->ExplodeSlice(1);
$p1->SetCenter(0.45);
$p1->SetLegends($gDateLocale->GetShortMonth());
$graph->Add($p1);
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example27.3.html b/html/includes/jpgraph/docs/html/exframes/example27.3.html
new file mode 100644
index 0000000000..640d8c838d
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example27.3.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_pie.php");
include ("../jpgraph_pie3d.php");
$data = array(40,60,21,33);
$graph = new PieGraph(330,200,"auto");
$graph->SetShadow();
$graph->title->Set("A simple 3D Pie plot");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$p1 = new PiePlot3D($data);
$p1->ExplodeSlice(1);
$p1->SetCenter(0.45);
$p1->SetLegends($gDateLocale->GetShortMonth());
$graph->Add($p1);
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example27.html b/html/includes/jpgraph/docs/html/exframes/example27.html
new file mode 100644
index 0000000000..1c104dd3a2
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example27.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_pie.php");
include ("../jpgraph_pie3d.php");
$data = array(40,60,21,33);
$graph = new PieGraph(300,200,"auto");
$graph->SetShadow();
$graph->title->Set("A simple Pie plot");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$p1 = new PiePlot3D($data);
$p1->SetSize(0.5);
$p1->SetCenter(0.45);
$p1->SetLegends($gDateLocale->GetShortMonth());
$graph->Add($p1);
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example28.1.html b/html/includes/jpgraph/docs/html/exframes/example28.1.html
new file mode 100644
index 0000000000..817468bd9c
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example28.1.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_pie.php");
$data = array(40,60,21,33,12,33);
$graph = new PieGraph(150,150,"auto");
$graph->SetShadow();
$graph->title->Set("'earth' Theme");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$p1 = new PiePlot($data);
$p1->SetTheme("earth");
$p1->SetCenter(0.5,0.55);
$p1->value->Show(false);
$graph->Add($p1);
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example28.2.html b/html/includes/jpgraph/docs/html/exframes/example28.2.html
new file mode 100644
index 0000000000..d9dfcd0796
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example28.2.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_pie.php");
$data = array(40,60,21,33,12,33);
$graph = new PieGraph(150,150,"auto");
$graph->SetShadow();
$graph->title->Set("'pastel' Theme");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$p1 = new PiePlot($data);
$p1->SetTheme("pastel");
$p1->SetCenter(0.5,0.55);
$p1->value->Show(false);
$graph->Add($p1);
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example28.3.html b/html/includes/jpgraph/docs/html/exframes/example28.3.html
new file mode 100644
index 0000000000..2336fdd0e3
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example28.3.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_pie.php");
$data = array(40,60,21,33,12,33);
$graph = new PieGraph(150,150,"auto");
$graph->SetShadow();
$graph->title->Set("'water' Theme");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$p1 = new PiePlot($data);
$p1->SetTheme("water");
$p1->SetCenter(0.5,0.55);
$p1->value->Show(false);
$graph->Add($p1);
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example28.html b/html/includes/jpgraph/docs/html/exframes/example28.html
new file mode 100644
index 0000000000..99a896b67a
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example28.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_pie.php");
$data = array(40,60,21,33,12,33);
$graph = new PieGraph(150,150,"auto");
$graph->SetShadow();
$graph->title->Set("'sand' Theme");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$p1 = new PiePlot($data);
$p1->SetTheme("sand");
$p1->SetCenter(0.5,0.55);
$p1->value->Show(false);
$graph->Add($p1);
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example3.1.html b/html/includes/jpgraph/docs/html/exframes/example3.1.html
new file mode 100644
index 0000000000..6ebe3f2f6f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example3.1.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,12,5,1,9,13,5,7);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
// Create the linear plot
$lineplot=new LinePlot($ydata);
$lineplot->mark->SetType(MARK_UTRIANGLE);
// Add the plot to the graph
$graph->Add($lineplot);
$graph->img->SetMargin(40,20,20,40);
$graph->title->Set("Example 3.1");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$lineplot->SetColor("blue");
$lineplot->SetWeight(2);
$graph->yaxis->SetColor("red");
$graph->yaxis->SetWeight(2);
$graph->SetShadow();
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example3.2.1.html b/html/includes/jpgraph/docs/html/exframes/example3.2.1.html
new file mode 100644
index 0000000000..f2470da26c
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example3.2.1.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,12,5,1,9,15,5,7);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
$graph->yaxis->scale->SetGrace(10,10);
// Create the linear plot
$lineplot=new LinePlot($ydata);
$lineplot->mark->SetType(MARK_CIRCLE);
// Add the plot to the graph
$graph->Add($lineplot);
$graph->img->SetMargin(40,20,20,40);
$graph->title->Set("Grace value, version 1");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$lineplot->SetColor("blue");
$lineplot->SetWeight(2);
$graph->yaxis->SetWeight(2);
$graph->SetShadow();
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example3.2.2.html b/html/includes/jpgraph/docs/html/exframes/example3.2.2.html
new file mode 100644
index 0000000000..27df44ffc5
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example3.2.2.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,12,5,1,9,15,5,7);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
$graph->yaxis->scale->SetGrace(10,10);
// Create the linear plot
$lineplot=new LinePlot($ydata);
$lineplot->mark->SetType(MARK_CIRCLE);
// Add the plot to the graph
$graph->Add($lineplot);
$graph->img->SetMargin(40,20,20,40);
$graph->title->Set("Grace value version 2");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->xaxis->SetPos('min');
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$lineplot->SetColor("blue");
$lineplot->SetWeight(2);
$graph->yaxis->SetWeight(2);
$graph->SetShadow();
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example3.2.html b/html/includes/jpgraph/docs/html/exframes/example3.2.html
new file mode 100644
index 0000000000..65135e3569
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example3.2.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,12,5,1,9,15,5,7);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
// Create the linear plot
$lineplot=new LinePlot($ydata);
$lineplot->mark->SetType(MARK_CIRCLE);
// Add the plot to the graph
$graph->Add($lineplot);
$graph->img->SetMargin(40,20,20,40);
$graph->title->Set("Example 3.2");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$lineplot->SetColor("blue");
$lineplot->SetWeight(2);
$graph->yaxis->SetWeight(2);
$graph->SetShadow();
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example3.3.html b/html/includes/jpgraph/docs/html/exframes/example3.3.html
new file mode 100644
index 0000000000..2ca495aea8
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example3.3.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,12,5,1,9,13,5,7);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
// Adjust the margin
$graph->img->SetMargin(40,20,20,40);
$graph->SetShadow();
// Create the linear plot
$lineplot=new LinePlot($ydata);
$lineplot->mark->SetType(MARK_UTRIANGLE);
$lineplot->value->show();
// Add the plot to the graph
$graph->Add($lineplot);
$graph->title->Set("Displaying the values");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$lineplot->SetColor("blue");
$lineplot->SetWeight(2);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example3.4.html b/html/includes/jpgraph/docs/html/exframes/example3.4.html
new file mode 100644
index 0000000000..201a25a15d
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example3.4.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,12,5,1,9,13,5,7);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
// Adjust the margin
$graph->img->SetMargin(40,20,20,40);
$graph->SetShadow();
// Create the linear plot
$lineplot=new LinePlot($ydata);
$lineplot->mark->SetType(MARK_UTRIANGLE);
$lineplot->value->show();
$lineplot->value->SetColor('darkred');
$lineplot->value->SetFont(FF_FONT1,FS_BOLD);
$lineplot->value->SetFormat('$%0.1f');
// Add the plot to the graph
$graph->Add($lineplot);
$graph->title->Set("Displaying the values");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$lineplot->SetColor("blue");
$lineplot->SetWeight(2);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example3.html b/html/includes/jpgraph/docs/html/exframes/example3.html
new file mode 100644
index 0000000000..7181c569b5
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example3.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,12,5,1,9,13,5,7);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
// Create the linear plot
$lineplot=new LinePlot($ydata);
// Add the plot to the graph
$graph->Add($lineplot);
$graph->img->SetMargin(40,20,20,40);
$graph->title->Set("Example 3");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$lineplot->SetColor("blue");
$lineplot->SetWeight(2);
$graph->yaxis->SetColor("red");
$graph->yaxis->SetWeight(2);
$graph->SetShadow();
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example4.html b/html/includes/jpgraph/docs/html/exframes/example4.html
new file mode 100644
index 0000000000..01f8132097
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example4.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,12,5,1,9,13,5,7);
$ydata2 = array(1,19,15,7,22,14,5,9,21,13);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
// Create the linear plot
$lineplot=new LinePlot($ydata);
$lineplot2=new LinePlot($ydata2);
// Add the plot to the graph
$graph->Add($lineplot);
$graph->Add($lineplot2);
$graph->img->SetMargin(40,20,20,40);
$graph->title->Set("Example 4");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$lineplot->SetColor("blue");
$lineplot->SetWeight(2);
$lineplot2->SetColor("orange");
$lineplot2->SetWeight(2);
$graph->yaxis->SetColor("red");
$graph->yaxis->SetWeight(2);
$graph->SetShadow();
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example5.1.html b/html/includes/jpgraph/docs/html/exframes/example5.1.html
new file mode 100644
index 0000000000..b7870a1106
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example5.1.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,12,5,1,9,13,5,7);
$y2data = array(354,200,265,99,111,91,198,225,293,251);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->img->SetMargin(40,40,20,40);
$graph->SetScale("textlin");
$graph->SetY2Scale("lin");
$graph->SetShadow();
// Create the linear plot
$lineplot=new LinePlot($ydata);
$lineplot2=new LinePlot($y2data);
// Add the plot to the graph
$graph->Add($lineplot);
$graph->AddY2($lineplot2);
$lineplot2->SetColor("orange");
$lineplot2->SetWeight(2);
$graph->y2axis->SetColor("orange");
$graph->title->Set("Example 5");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$lineplot->SetColor("blue");
$lineplot->SetWeight(2);
$lineplot2->SetColor("orange");
$lineplot2->SetWeight(2);
$graph->yaxis->SetColor("blue");
$lineplot->SetLegend("Plot 1");
$lineplot2->SetLegend("Plot 2");
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example5.html b/html/includes/jpgraph/docs/html/exframes/example5.html
new file mode 100644
index 0000000000..ba2c5b7716
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example5.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,12,5,1,9,13,5,7);
$y2data = array(354,200,265,99,111,91,198,225,293,251);
// Create the graph. These two calls are always required
$graph = new Graph(300,200,"auto");
$graph->img->SetMargin(40,40,20,40);
$graph->SetScale("textlin");
$graph->SetY2Scale("lin");
$graph->SetShadow();
// Create the linear plot
$lineplot=new LinePlot($ydata);
$lineplot2=new LinePlot($y2data);
// Add the plot to the graph
$graph->Add($lineplot);
$graph->AddY2($lineplot2);
$lineplot2->SetColor("orange");
$lineplot2->SetWeight(2);
$graph->y2axis->SetColor("orange");
$graph->title->Set("Example 5");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$lineplot->SetColor("blue");
$lineplot->SetWeight(2);
$lineplot2->SetColor("orange");
$lineplot2->SetWeight(2);
$graph->yaxis->SetColor("blue");
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example6.1.html b/html/includes/jpgraph/docs/html/exframes/example6.1.html
new file mode 100644
index 0000000000..d938f8bd5a
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example6.1.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,12,5,1,9,13,5,7);
$y2data = array(354,200,265,99,111,91,198,225,293,251);
// Create the graph and specify the scale for both Y-axis
$graph = new Graph(300,240,"auto");
$graph->SetScale("textlin");
$graph->SetY2Scale("lin");
$graph->SetShadow();
// Adjust the margin
$graph->img->SetMargin(40,40,20,70);
// Create the two linear plot
$lineplot=new LinePlot($ydata);
$lineplot2=new LinePlot($y2data);
// Add the plot to the graph
$graph->Add($lineplot);
$graph->AddY2($lineplot2);
$lineplot2->SetColor("orange");
$lineplot2->SetWeight(2);
// Adjust the axis color
$graph->y2axis->SetColor("orange");
$graph->yaxis->SetColor("blue");
$graph->title->Set("Example 6.1");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Set the colors for the plots
$lineplot->SetColor("blue");
$lineplot->SetWeight(2);
$lineplot2->SetColor("orange");
$lineplot2->SetWeight(2);
// Set the legends for the plots
$lineplot->SetLegend("Plot 1");
$lineplot2->SetLegend("Plot 2");
// Adjust the legend position
$graph->legend->SetLayout(LEGEND_HOR);
$graph->legend->Pos(0.4,0.95,"center","bottom");
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example6.2.html b/html/includes/jpgraph/docs/html/exframes/example6.2.html
new file mode 100644
index 0000000000..815201e2c4
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example6.2.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,12,5,1,9,13,5,7);
$y2data = array(354,200,265,99,111,91,198,225,293,251);
// Create the graph and specify the scale for both Y-axis
$graph = new Graph(300,240,"auto");
$graph->SetScale("textlin");
$graph->SetShadow();
// Adjust the margin
$graph->img->SetMargin(40,40,20,70);
// Create the two linear plot
$lineplot=new LinePlot($ydata);
$lineplot->SetStepStyle();
// Adjust the axis color
$graph->yaxis->SetColor("blue");
$graph->title->Set("Example 6.2");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Set the colors for the plots
$lineplot->SetColor("blue");
$lineplot->SetWeight(2);
// Set the legends for the plots
$lineplot->SetLegend("Plot 1");
// Add the plot to the graph
$graph->Add($lineplot);
// Adjust the legend position
$graph->legend->SetLayout(LEGEND_HOR);
$graph->legend->Pos(0.4,0.95,"center","bottom");
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example6.html b/html/includes/jpgraph/docs/html/exframes/example6.html
new file mode 100644
index 0000000000..dd70cd0cf8
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example6.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,12,5,1,9,13,5,7);
$y2data = array(354,200,265,99,111,91,198,225,293,251);
// Create the graph and specify the scale for both Y-axis
$graph = new Graph(400,200,"auto");
$graph->SetScale("textlin");
$graph->SetY2Scale("lin");
$graph->SetShadow();
// Adjust the margin
$graph->img->SetMargin(40,140,20,40);
// Create the two linear plot
$lineplot=new LinePlot($ydata);
$lineplot2=new LinePlot($y2data);
// Add the plot to the graph
$graph->Add($lineplot);
$graph->AddY2($lineplot2);
$lineplot2->SetColor("orange");
$lineplot2->SetWeight(2);
// Adjust the axis color
$graph->y2axis->SetColor("orange");
$graph->yaxis->SetColor("blue");
$graph->title->Set("Example 6");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Set the colors for the plots
$lineplot->SetColor("blue");
$lineplot->SetWeight(2);
$lineplot2->SetColor("orange");
$lineplot2->SetWeight(2);
// Set the legends for the plots
$lineplot->SetLegend("Plot 1");
$lineplot2->SetLegend("Plot 2");
// Adjust the legend position
$graph->legend->Pos(0.05,0.5,"right","center");
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example7.html b/html/includes/jpgraph/docs/html/exframes/example7.html
new file mode 100644
index 0000000000..37b03bfa23
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example7.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_log.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,12,5,1,9,13,5,7);
$y2data = array(354,70,265,29,111,91,198,225,593,251);
// Create the graph.
$graph = new Graph(350,200,"auto");
$graph->SetScale("textlin");
$graph->SetY2Scale("log");
$graph->SetShadow();
$graph->img->SetMargin(40,110,20,40);
// Create the linear plot
$lineplot=new LinePlot($ydata);
$lineplot2=new LinePlot($y2data);
// Add the plot to the graph
$graph->Add($lineplot);
$graph->AddY2($lineplot2);
$graph->yaxis->SetColor('blue');
$graph->title->Set("Example 7");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$lineplot->SetColor("blue");
$lineplot->SetWeight(2);
$lineplot2->SetWeight(2);
$lineplot->SetLegend("Plot 1");
$lineplot2->SetLegend("Plot 2");
$graph->legend->Pos(0.05,0.5,"right","center");
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example8.html b/html/includes/jpgraph/docs/html/exframes/example8.html
new file mode 100644
index 0000000000..8044f3f50d
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example8.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_log.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,12,5,1,9,13,5,7);
$y2data = array(354,200,265,99,111,91,198,225,293,251);
// Create the graph. These two calls are always required
$graph = new Graph(350,200,"auto");
$graph->SetScale("textlog");
$graph->SetShadow();
$graph->img->SetMargin(40,110,20,40);
// Show the gridlines
$graph->ygrid->Show(true,true);
$graph->xgrid->Show(true,false);
// Create the linear plot
$lineplot=new LinePlot($ydata);
$lineplot2=new LinePlot($y2data);
// Add the plot to the graph
$graph->Add($lineplot);
$graph->title->Set("Example 8");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$lineplot->SetColor("blue");
$lineplot->SetWeight(2);
// Adjust the color of the Y axis
$graph->yaxis->SetColor("blue");
// Specifya a legend
$lineplot->SetLegend("Plot 1");
// Adjust the position of the grid box
$graph->legend->Pos(0.05,0.5,"right","center");
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example9.1.html b/html/includes/jpgraph/docs/html/exframes/example9.1.html
new file mode 100644
index 0000000000..5b8b7ba61d
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example9.1.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_log.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,42,5,1,9,13,5,7);
$datax = array("Jan","Feb","Mar","Apr","Maj","Jun","Jul","aug","Sep","Oct");
// Create the graph. These two calls are always required
$graph = new Graph(350,200,"auto");
$graph->SetScale("textlog");
$graph->img->SetMargin(40,110,20,40);
$graph->SetShadow();
$graph->ygrid->Show(true,true);
$graph->xgrid->Show(true,false);
// Specify the tick labels
$a = $gDateLocale->GetShortMonth();
$graph->xaxis->SetTickLabels($a);
$graph->xaxis->SetTextLabelInterval(2);
// Create the linear plot
$lineplot=new LinePlot($ydata);
// Add the plot to the graph
$graph->Add($lineplot);
$graph->title->Set("Examples 9");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$lineplot->SetColor("blue");
$lineplot->SetWeight(2);
$graph->yaxis->SetColor("blue");
$lineplot->SetLegend("Plot 1");
$graph->legend->Pos(0.05,0.5,"right","center");
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example9.2.html b/html/includes/jpgraph/docs/html/exframes/example9.2.html
new file mode 100644
index 0000000000..93ba719992
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example9.2.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_log.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,42,5,1,9,13,5,7);
$datax = array("Jan","Feb","Mar","Apr","Maj","Jun","Jul","aug","Sep","Oct");
// Create the graph. These two calls are always required
$graph = new Graph(350,200,"auto");
$graph->SetScale("textlog");
$graph->img->SetMargin(40,110,20,50);
$graph->SetShadow();
$graph->ygrid->Show(true,true);
$graph->xgrid->Show(true,false);
// Specify the tick labels
$a = $gDateLocale->GetShortMonth();
$graph->xaxis->SetTickLabels($a);
//$graph->xaxis->SetTextLabelInterval(2);
$graph->xaxis->SetLabelAngle(90);
// Create the linear plot
$lineplot=new LinePlot($ydata);
// Add the plot to the graph
$graph->Add($lineplot);
$graph->title->Set("Examples 9");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$lineplot->SetColor("blue");
$lineplot->SetWeight(2);
$graph->yaxis->SetColor("blue");
$lineplot->SetLegend("Plot 1");
$graph->legend->Pos(0.05,0.5,"right","center");
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/example9.html b/html/includes/jpgraph/docs/html/exframes/example9.html
new file mode 100644
index 0000000000..2f37f1a344
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/example9.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_log.php");
include ("../jpgraph_line.php");
$ydata = array(11,3,8,42,5,1,9,13,5,7);
$datax = array("Jan","Feb","Mar","Apr","Maj","Jun","Jul","aug","Sep","Oct");
// Create the graph. These two calls are always required
$graph = new Graph(350,200,"auto");
$graph->SetScale("textlog");
$graph->img->SetMargin(40,110,20,40);
$graph->SetShadow();
$graph->ygrid->Show(true,true);
$graph->xgrid->Show(true,false);
// Specify the tick labels
$a = $gDateLocale->GetShortMonth();
$graph->xaxis->SetTickLabels($a);
// Create the linear plot
$lineplot=new LinePlot($ydata);
// Add the plot to the graph
$graph->Add($lineplot);
$graph->title->Set("Examples 9");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$lineplot->SetColor("blue");
$lineplot->SetWeight(2);
$graph->yaxis->SetColor("blue");
$lineplot->SetLegend("Plot 1");
$graph->legend->Pos(0.05,0.5,"right","center");
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/fieldscatterex1.html b/html/includes/jpgraph/docs/html/exframes/fieldscatterex1.html
new file mode 100644
index 0000000000..9423d73c19
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/fieldscatterex1.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_scatter.php");
$polex = 6;
$poley = 40;
function FldCallback($x,$y,$a) {
GLOBAL $polex, $poley;
$maxr = 3000;
// Size and arrow size is constant
$size="";
$arrowsize="";
// Since we have different scales we need the data points
// to be of the same magnitude to give it a distance
// interpretation.
$x *= 10;
// Colors gets colder the further out we go from the center
$r = ($x-$polex*10)*($x-$polex*10)+($y-$poley)*($y-$poley);
$f = $r/$maxr;
if( $f > 1 ) $f=1;
$red = floor((1-$f)*255);
$blue = floor($f*255);
$color = array($red,0,$blue);
//echo "x=$x, y=$y, blue=$blue, red=$red<br>";
return array($color,$size,$arrowsize);
}
// Create data for a simulated pseudo-magnetic radient field
$datax = array();
$datay = array();
$angle = array();
for($x=1; $x < 10; ++$x ) {
for($y=10; $y<100; $y += 10) {
$a = -1;
if( $x==$polex && $y==$poley ) continue;
if( $x==$polex ) {
if( $y > $poley ) $a=90;
else $a = 270;
}
if( $y==$poley ) {
if( $x > $polex ) $a=0;
else $a=180;
}
if( $a == -1 ) {
$d1 = $y-$poley;
$d2 = ($polex-$x)*20;
if( $y < $poley ) $d2 *= -1;
$h = sqrt($d1*$d1+$d2*$d2);
$t = -$d2/$h;
$ac = acos($t);
if( $y < $poley ) $ac += M_PI;
$a = $ac * 180/M_PI;
}
$datax[] = $x;
$datay[] = $y;
$angle[] = $a;
}
}
// Setup the graph
$graph = new Graph(300,200);
$graph->SetScale("intlin",0,100,0,10);
$graph->SetMarginColor('lightblue');
// ..and titles
$graph->title->Set("Field plot");
// Setup the field plot
$fp = new FieldPlot($datay,$datax,$angle);
// Setup formatting callback
$fp->SetCallback('FldCallback');
// First size argument is length (in pixels of arrow)
// Second size argument is roughly size of arrow. Arrow size is specified as
// an integer in the range [0,9]
$fp->arrow->SetSize(20,2);
$fp->arrow->SetColor('navy');
$graph->Add($fp);
// .. and output
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/filledgridex1.html b/html/includes/jpgraph/docs/html/exframes/filledgridex1.html
new file mode 100644
index 0000000000..7593aecfa3
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/filledgridex1.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$datay1 = array(20,15,23,15);
$datay2 = array(12,9,42,8);
$datay3 = array(5,17,32,24);
// Setup the graph
$graph = new Graph(300,200);
$graph->SetMarginColor('white');
$graph->SetScale("textlin");
$graph->SetFrame(false);
$graph->SetMargin(30,50,30,30);
$graph->title->Set('Filled Y-grid');
$graph->yaxis->HideZeroLabel();
$graph->ygrid->SetFill(true,'#EFEFEF@0.5','#BBCCFF@0.5');
$graph->xgrid->Show();
$graph->xaxis->SetTickLabels($gDateLocale->GetShortMonth());
// Create the first line
$p1 = new LinePlot($datay1);
$p1->SetColor("navy");
$p1->SetLegend('Line 1');
$graph->Add($p1);
// Create the second line
$p2 = new LinePlot($datay2);
$p2->SetColor("red");
$p2->SetLegend('Line 2');
$graph->Add($p2);
// Create the third line
$p3 = new LinePlot($datay3);
$p3->SetColor("orange");
$p3->SetLegend('Line 3');
$graph->Add($p3);
$graph->legend->SetShadow('gray@0.4',5);
$graph->legend->SetPos(0.1,0.1,'right','top');
// Output line
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/filledlineex01.1.html b/html/includes/jpgraph/docs/html/exframes/filledlineex01.1.html
new file mode 100644
index 0000000000..36e74c366a
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/filledlineex01.1.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$datay = array(1.23,1.9,1.6,3.1,3.4,2.8,2.1,1.9);
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
$graph->img->SetMargin(40,40,40,40);
$graph->SetShadow();
$graph->SetGridDepth(DEPTH_FRONT);
$graph->title->Set("Example of filled line plot");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$p1 = new LinePlot($datay);
$p1->SetFillColor("orange");
$p1->mark->SetType(MARK_FILLEDCIRCLE);
$p1->mark->SetFillColor("red");
$p1->mark->SetWidth(4);
$graph->Add($p1);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/filledlineex01.html b/html/includes/jpgraph/docs/html/exframes/filledlineex01.html
new file mode 100644
index 0000000000..8a34a141a4
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/filledlineex01.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$datay = array(1.23,1.9,1.6,3.1,3.4,2.8,2.1,1.9);
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
$graph->img->SetMargin(40,40,40,40);
$graph->SetShadow();
$graph->title->Set("Example of filled line plot");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$p1 = new LinePlot($datay);
$p1->SetFillColor("orange");
$p1->mark->SetType(MARK_FILLEDCIRCLE);
$p1->mark->SetFillColor("red");
$p1->mark->SetWidth(4);
$graph->Add($p1);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_JpGraph_Logo.html b/html/includes/jpgraph/docs/html/exframes/frame_JpGraph_Logo.html
new file mode 100644
index 0000000000..67fed7d83f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_JpGraph_Logo.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_alphabarex1.html b/html/includes/jpgraph/docs/html/exframes/frame_alphabarex1.html
new file mode 100644
index 0000000000..563c33b800
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_alphabarex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_antispamex01.html b/html/includes/jpgraph/docs/html/exframes/frame_antispamex01.html
new file mode 100644
index 0000000000..70fd15d12f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_antispamex01.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_backgroundex03.html b/html/includes/jpgraph/docs/html/exframes/frame_backgroundex03.html
new file mode 100644
index 0000000000..06dd7bf9d0
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_backgroundex03.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_balloonex1.html b/html/includes/jpgraph/docs/html/exframes/frame_balloonex1.html
new file mode 100644
index 0000000000..2fe4c2ba60
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_balloonex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_bar_csimex1.html b/html/includes/jpgraph/docs/html/exframes/frame_bar_csimex1.html
new file mode 100644
index 0000000000..7fcae39178
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_bar_csimex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_bar_csimex2.html b/html/includes/jpgraph/docs/html/exframes/frame_bar_csimex2.html
new file mode 100644
index 0000000000..2d0a0729e1
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_bar_csimex2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_bar_csimex3.html b/html/includes/jpgraph/docs/html/exframes/frame_bar_csimex3.html
new file mode 100644
index 0000000000..35ffcdc1c2
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_bar_csimex3.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex1.html b/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex1.html
new file mode 100644
index 0000000000..4c4e9d10bb
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex2.html b/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex2.html
new file mode 100644
index 0000000000..23249a0823
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex3.html b/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex3.html
new file mode 100644
index 0000000000..b95ce73dd3
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex3.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex4.html b/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex4.html
new file mode 100644
index 0000000000..9bea58376f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex4.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex5.html b/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex5.html
new file mode 100644
index 0000000000..20d6c4b1b9
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex5.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex6.html b/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex6.html
new file mode 100644
index 0000000000..ee84e6c67f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex6.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex7.html b/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex7.html
new file mode 100644
index 0000000000..e12702928f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex7.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex8.html b/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex8.html
new file mode 100644
index 0000000000..3e3ede43e4
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_bargradsmallex8.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_barline_csimex1.html b/html/includes/jpgraph/docs/html/exframes/frame_barline_csimex1.html
new file mode 100644
index 0000000000..74eea8fe27
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_barline_csimex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_barlinefreq_csimex1.html b/html/includes/jpgraph/docs/html/exframes/frame_barlinefreq_csimex1.html
new file mode 100644
index 0000000000..69ba2519c4
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_barlinefreq_csimex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_bartutex1.html b/html/includes/jpgraph/docs/html/exframes/frame_bartutex1.html
new file mode 100644
index 0000000000..56abe05bea
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_bartutex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_bartutex2.html b/html/includes/jpgraph/docs/html/exframes/frame_bartutex2.html
new file mode 100644
index 0000000000..571458ca60
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_bartutex2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_bartutex3.html b/html/includes/jpgraph/docs/html/exframes/frame_bartutex3.html
new file mode 100644
index 0000000000..98519035d1
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_bartutex3.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_bartutex4.html b/html/includes/jpgraph/docs/html/exframes/frame_bartutex4.html
new file mode 100644
index 0000000000..8ef111e28f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_bartutex4.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_bartutex5.html b/html/includes/jpgraph/docs/html/exframes/frame_bartutex5.html
new file mode 100644
index 0000000000..852456722c
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_bartutex5.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_bartutex6.html b/html/includes/jpgraph/docs/html/exframes/frame_bartutex6.html
new file mode 100644
index 0000000000..8e4043f883
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_bartutex6.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_boxstockcsimex1.html b/html/includes/jpgraph/docs/html/exframes/frame_boxstockcsimex1.html
new file mode 100644
index 0000000000..d694139b33
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_boxstockcsimex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_boxstockex1.html b/html/includes/jpgraph/docs/html/exframes/frame_boxstockex1.html
new file mode 100644
index 0000000000..462394a334
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_boxstockex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_builtinplotmarksex1.html b/html/includes/jpgraph/docs/html/exframes/frame_builtinplotmarksex1.html
new file mode 100644
index 0000000000..c7fb3bfbbf
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_builtinplotmarksex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_canvas_jpgarchex.html b/html/includes/jpgraph/docs/html/exframes/frame_canvas_jpgarchex.html
new file mode 100644
index 0000000000..38fec349f5
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_canvas_jpgarchex.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_canvasex01.html b/html/includes/jpgraph/docs/html/exframes/frame_canvasex01.html
new file mode 100644
index 0000000000..1dfdf91ee6
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_canvasex01.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_canvasex02.html b/html/includes/jpgraph/docs/html/exframes/frame_canvasex02.html
new file mode 100644
index 0000000000..6a3c352e74
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_canvasex02.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_canvasex03.html b/html/includes/jpgraph/docs/html/exframes/frame_canvasex03.html
new file mode 100644
index 0000000000..ef2a6eb37c
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_canvasex03.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_canvasex04.html b/html/includes/jpgraph/docs/html/exframes/frame_canvasex04.html
new file mode 100644
index 0000000000..1dace9dfcb
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_canvasex04.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_canvasex05.html b/html/includes/jpgraph/docs/html/exframes/frame_canvasex05.html
new file mode 100644
index 0000000000..8fe74d93f1
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_canvasex05.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_canvasex06.html b/html/includes/jpgraph/docs/html/exframes/frame_canvasex06.html
new file mode 100644
index 0000000000..9f6907f959
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_canvasex06.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_color_chart01.html b/html/includes/jpgraph/docs/html/exframes/frame_color_chart01.html
new file mode 100644
index 0000000000..a0f63aad8b
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_color_chart01.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_color_chart02.html b/html/includes/jpgraph/docs/html/exframes/frame_color_chart02.html
new file mode 100644
index 0000000000..fbd949eed3
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_color_chart02.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_color_chart03.html b/html/includes/jpgraph/docs/html/exframes/frame_color_chart03.html
new file mode 100644
index 0000000000..9e96fa1fee
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_color_chart03.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_color_chart04.html b/html/includes/jpgraph/docs/html/exframes/frame_color_chart04.html
new file mode 100644
index 0000000000..a5d213ce4b
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_color_chart04.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_dateaxisex1.html b/html/includes/jpgraph/docs/html/exframes/frame_dateaxisex1.html
new file mode 100644
index 0000000000..a37fef38ee
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_dateaxisex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_dateaxisex2.html b/html/includes/jpgraph/docs/html/exframes/frame_dateaxisex2.html
new file mode 100644
index 0000000000..bb62ee68ce
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_dateaxisex2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_dateaxisex4.html b/html/includes/jpgraph/docs/html/exframes/frame_dateaxisex4.html
new file mode 100644
index 0000000000..6979d9a293
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_dateaxisex4.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_dbschemaex1.html b/html/includes/jpgraph/docs/html/exframes/frame_dbschemaex1.html
new file mode 100644
index 0000000000..e80b159989
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_dbschemaex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example0.html b/html/includes/jpgraph/docs/html/exframes/frame_example0.html
new file mode 100644
index 0000000000..0d3f85a15d
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example0.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example11.html b/html/includes/jpgraph/docs/html/exframes/frame_example11.html
new file mode 100644
index 0000000000..30ec8df07b
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example11.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example13.html b/html/includes/jpgraph/docs/html/exframes/frame_example13.html
new file mode 100644
index 0000000000..1220360d4a
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example13.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example14.html b/html/includes/jpgraph/docs/html/exframes/frame_example14.html
new file mode 100644
index 0000000000..963ce05ed8
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example14.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example15.html b/html/includes/jpgraph/docs/html/exframes/frame_example15.html
new file mode 100644
index 0000000000..e28993f768
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example15.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example16.1.html b/html/includes/jpgraph/docs/html/exframes/frame_example16.1.html
new file mode 100644
index 0000000000..09803aac8f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example16.1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example16.2.html b/html/includes/jpgraph/docs/html/exframes/frame_example16.2.html
new file mode 100644
index 0000000000..16cfa4eeab
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example16.2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example16.3.html b/html/includes/jpgraph/docs/html/exframes/frame_example16.3.html
new file mode 100644
index 0000000000..617e279ca8
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example16.3.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example16.4.html b/html/includes/jpgraph/docs/html/exframes/frame_example16.4.html
new file mode 100644
index 0000000000..3439ece37c
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example16.4.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example16.6.html b/html/includes/jpgraph/docs/html/exframes/frame_example16.6.html
new file mode 100644
index 0000000000..88e5b7e0b8
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example16.6.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example16.html b/html/includes/jpgraph/docs/html/exframes/frame_example16.html
new file mode 100644
index 0000000000..8a14f18e7f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example16.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example17.html b/html/includes/jpgraph/docs/html/exframes/frame_example17.html
new file mode 100644
index 0000000000..6fd3e53fcd
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example17.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example18.html b/html/includes/jpgraph/docs/html/exframes/frame_example18.html
new file mode 100644
index 0000000000..4b403a8021
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example18.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example19.1.html b/html/includes/jpgraph/docs/html/exframes/frame_example19.1.html
new file mode 100644
index 0000000000..f48c308ddd
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example19.1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example19.html b/html/includes/jpgraph/docs/html/exframes/frame_example19.html
new file mode 100644
index 0000000000..f557dacbb5
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example19.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example2.html b/html/includes/jpgraph/docs/html/exframes/frame_example2.html
new file mode 100644
index 0000000000..0458bf7418
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example20.1.html b/html/includes/jpgraph/docs/html/exframes/frame_example20.1.html
new file mode 100644
index 0000000000..e329ba9925
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example20.1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example20.2.html b/html/includes/jpgraph/docs/html/exframes/frame_example20.2.html
new file mode 100644
index 0000000000..ec4aace674
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example20.2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example20.3.html b/html/includes/jpgraph/docs/html/exframes/frame_example20.3.html
new file mode 100644
index 0000000000..549112ee4d
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example20.3.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example20.4.html b/html/includes/jpgraph/docs/html/exframes/frame_example20.4.html
new file mode 100644
index 0000000000..62ab1d0995
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example20.4.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example20.5.html b/html/includes/jpgraph/docs/html/exframes/frame_example20.5.html
new file mode 100644
index 0000000000..d3b4b4c5d3
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example20.5.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example20.html b/html/includes/jpgraph/docs/html/exframes/frame_example20.html
new file mode 100644
index 0000000000..876d2d3acb
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example20.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example21.html b/html/includes/jpgraph/docs/html/exframes/frame_example21.html
new file mode 100644
index 0000000000..2565318178
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example21.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example22.html b/html/includes/jpgraph/docs/html/exframes/frame_example22.html
new file mode 100644
index 0000000000..dfd3543a54
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example22.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example23.html b/html/includes/jpgraph/docs/html/exframes/frame_example23.html
new file mode 100644
index 0000000000..ad09befe93
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example23.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example24.html b/html/includes/jpgraph/docs/html/exframes/frame_example24.html
new file mode 100644
index 0000000000..416c01e5f3
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example24.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example25.1.html b/html/includes/jpgraph/docs/html/exframes/frame_example25.1.html
new file mode 100644
index 0000000000..5daeabba78
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example25.1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example25.2.html b/html/includes/jpgraph/docs/html/exframes/frame_example25.2.html
new file mode 100644
index 0000000000..f33e1fd35f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example25.2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example25.html b/html/includes/jpgraph/docs/html/exframes/frame_example25.html
new file mode 100644
index 0000000000..2b0a6fad6e
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example25.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example26.1.html b/html/includes/jpgraph/docs/html/exframes/frame_example26.1.html
new file mode 100644
index 0000000000..00e90f1bdc
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example26.1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example26.html b/html/includes/jpgraph/docs/html/exframes/frame_example26.html
new file mode 100644
index 0000000000..fe3768bd7b
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example26.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example27.1.html b/html/includes/jpgraph/docs/html/exframes/frame_example27.1.html
new file mode 100644
index 0000000000..618c4dc796
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example27.1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example27.2.html b/html/includes/jpgraph/docs/html/exframes/frame_example27.2.html
new file mode 100644
index 0000000000..b5afc73d2a
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example27.2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example27.3.html b/html/includes/jpgraph/docs/html/exframes/frame_example27.3.html
new file mode 100644
index 0000000000..ca939bbc60
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example27.3.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example27.html b/html/includes/jpgraph/docs/html/exframes/frame_example27.html
new file mode 100644
index 0000000000..ff1c0425d3
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example27.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example28.1.html b/html/includes/jpgraph/docs/html/exframes/frame_example28.1.html
new file mode 100644
index 0000000000..84ccf0e4ce
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example28.1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example28.2.html b/html/includes/jpgraph/docs/html/exframes/frame_example28.2.html
new file mode 100644
index 0000000000..11a09cf43a
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example28.2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example28.3.html b/html/includes/jpgraph/docs/html/exframes/frame_example28.3.html
new file mode 100644
index 0000000000..2261445d7b
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example28.3.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example28.html b/html/includes/jpgraph/docs/html/exframes/frame_example28.html
new file mode 100644
index 0000000000..ae7a9b6419
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example28.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example3.1.html b/html/includes/jpgraph/docs/html/exframes/frame_example3.1.html
new file mode 100644
index 0000000000..5147abf643
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example3.1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example3.2.1.html b/html/includes/jpgraph/docs/html/exframes/frame_example3.2.1.html
new file mode 100644
index 0000000000..631e195533
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example3.2.1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example3.2.2.html b/html/includes/jpgraph/docs/html/exframes/frame_example3.2.2.html
new file mode 100644
index 0000000000..cc8e12ab7d
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example3.2.2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example3.2.html b/html/includes/jpgraph/docs/html/exframes/frame_example3.2.html
new file mode 100644
index 0000000000..d9e43085c7
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example3.2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example3.3.html b/html/includes/jpgraph/docs/html/exframes/frame_example3.3.html
new file mode 100644
index 0000000000..e82bb3e594
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example3.3.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example3.4.html b/html/includes/jpgraph/docs/html/exframes/frame_example3.4.html
new file mode 100644
index 0000000000..c5f4f94f83
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example3.4.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example3.html b/html/includes/jpgraph/docs/html/exframes/frame_example3.html
new file mode 100644
index 0000000000..db8e0aad75
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example3.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example4.html b/html/includes/jpgraph/docs/html/exframes/frame_example4.html
new file mode 100644
index 0000000000..957b2f93ab
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example4.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example5.1.html b/html/includes/jpgraph/docs/html/exframes/frame_example5.1.html
new file mode 100644
index 0000000000..f8f84c7218
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example5.1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example5.html b/html/includes/jpgraph/docs/html/exframes/frame_example5.html
new file mode 100644
index 0000000000..005a3dcaff
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example5.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example6.1.html b/html/includes/jpgraph/docs/html/exframes/frame_example6.1.html
new file mode 100644
index 0000000000..869dfd8526
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example6.1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example6.2.html b/html/includes/jpgraph/docs/html/exframes/frame_example6.2.html
new file mode 100644
index 0000000000..b7dc04cc7b
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example6.2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example6.html b/html/includes/jpgraph/docs/html/exframes/frame_example6.html
new file mode 100644
index 0000000000..3b3e81e7a3
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example6.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example7.html b/html/includes/jpgraph/docs/html/exframes/frame_example7.html
new file mode 100644
index 0000000000..8c9386a374
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example7.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example8.html b/html/includes/jpgraph/docs/html/exframes/frame_example8.html
new file mode 100644
index 0000000000..24e2c4b1e9
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example8.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example9.1.html b/html/includes/jpgraph/docs/html/exframes/frame_example9.1.html
new file mode 100644
index 0000000000..a53e429681
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example9.1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example9.2.html b/html/includes/jpgraph/docs/html/exframes/frame_example9.2.html
new file mode 100644
index 0000000000..af370353f5
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example9.2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_example9.html b/html/includes/jpgraph/docs/html/exframes/frame_example9.html
new file mode 100644
index 0000000000..a7d1f1d345
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_example9.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_fieldscatterex1.html b/html/includes/jpgraph/docs/html/exframes/frame_fieldscatterex1.html
new file mode 100644
index 0000000000..79deb202a8
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_fieldscatterex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_filledgridex1.html b/html/includes/jpgraph/docs/html/exframes/frame_filledgridex1.html
new file mode 100644
index 0000000000..d30041d291
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_filledgridex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_filledlineex01.1.html b/html/includes/jpgraph/docs/html/exframes/frame_filledlineex01.1.html
new file mode 100644
index 0000000000..d73bac129a
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_filledlineex01.1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_filledlineex01.html b/html/includes/jpgraph/docs/html/exframes/frame_filledlineex01.html
new file mode 100644
index 0000000000..341beca9e2
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_filledlineex01.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_funcex1.html b/html/includes/jpgraph/docs/html/exframes/frame_funcex1.html
new file mode 100644
index 0000000000..664937fc1e
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_funcex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttconstrainex0.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttconstrainex0.html
new file mode 100644
index 0000000000..04c8fa503b
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttconstrainex0.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttconstrainex1.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttconstrainex1.html
new file mode 100644
index 0000000000..41b2d03a84
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttconstrainex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttcsimex01.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttcsimex01.html
new file mode 100644
index 0000000000..909ec9c685
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttcsimex01.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttcsimex02.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttcsimex02.html
new file mode 100644
index 0000000000..ebcb1fab7c
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttcsimex02.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttex00.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttex00.html
new file mode 100644
index 0000000000..1ca1d229b6
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttex00.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttex01.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttex01.html
new file mode 100644
index 0000000000..64c08f449f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttex01.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttex02.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttex02.html
new file mode 100644
index 0000000000..dcab4b9483
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttex02.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttex03.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttex03.html
new file mode 100644
index 0000000000..83f3678b47
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttex03.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttex04.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttex04.html
new file mode 100644
index 0000000000..99095ab5e5
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttex04.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttex05.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttex05.html
new file mode 100644
index 0000000000..75d410d9f6
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttex05.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttex06.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttex06.html
new file mode 100644
index 0000000000..b79cf846ef
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttex06.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttex07.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttex07.html
new file mode 100644
index 0000000000..cc6c9cbc27
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttex07.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttex08.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttex08.html
new file mode 100644
index 0000000000..e436f258dd
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttex08.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttex09.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttex09.html
new file mode 100644
index 0000000000..9822733d95
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttex09.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttex10.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttex10.html
new file mode 100644
index 0000000000..ef42a6bc69
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttex10.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttex11.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttex11.html
new file mode 100644
index 0000000000..a664ac1500
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttex11.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttex12.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttex12.html
new file mode 100644
index 0000000000..eca0254bba
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttex12.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttex13.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttex13.html
new file mode 100644
index 0000000000..6dbe44e93f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttex13.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttex14.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttex14.html
new file mode 100644
index 0000000000..cb7a13eb51
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttex14.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttex15.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttex15.html
new file mode 100644
index 0000000000..397458f30a
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttex15.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttex16.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttex16.html
new file mode 100644
index 0000000000..4323183401
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttex16.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttex17.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttex17.html
new file mode 100644
index 0000000000..721c3cffe0
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttex17.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttex18.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttex18.html
new file mode 100644
index 0000000000..836e9a7009
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttex18.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttex19.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttex19.html
new file mode 100644
index 0000000000..30d4c9c5dd
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttex19.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_gantthgridex1.html b/html/includes/jpgraph/docs/html/exframes/frame_gantthgridex1.html
new file mode 100644
index 0000000000..2c018f2410
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_gantthgridex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_gantthourex1.html b/html/includes/jpgraph/docs/html/exframes/frame_gantthourex1.html
new file mode 100644
index 0000000000..ef3e629471
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_gantthourex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_gantthourminex1.html b/html/includes/jpgraph/docs/html/exframes/frame_gantthourminex1.html
new file mode 100644
index 0000000000..0056101962
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_gantthourminex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_gantticonex1.html b/html/includes/jpgraph/docs/html/exframes/frame_gantticonex1.html
new file mode 100644
index 0000000000..6a3cd53878
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_gantticonex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_ganttsimpleex1.html b/html/includes/jpgraph/docs/html/exframes/frame_ganttsimpleex1.html
new file mode 100644
index 0000000000..806eb1764f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_ganttsimpleex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_gradbkgex1.html b/html/includes/jpgraph/docs/html/exframes/frame_gradbkgex1.html
new file mode 100644
index 0000000000..090086a2f3
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_gradbkgex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_horizbarex1.html b/html/includes/jpgraph/docs/html/exframes/frame_horizbarex1.html
new file mode 100644
index 0000000000..bb5f1d5c8f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_horizbarex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_horizbarex2.html b/html/includes/jpgraph/docs/html/exframes/frame_horizbarex2.html
new file mode 100644
index 0000000000..86ffc10621
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_horizbarex2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_horizbarex3.html b/html/includes/jpgraph/docs/html/exframes/frame_horizbarex3.html
new file mode 100644
index 0000000000..b4b863285d
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_horizbarex3.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_horizbarex4.html b/html/includes/jpgraph/docs/html/exframes/frame_horizbarex4.html
new file mode 100644
index 0000000000..378ffcda7f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_horizbarex4.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_imgmarkercsimex1.html b/html/includes/jpgraph/docs/html/exframes/frame_imgmarkercsimex1.html
new file mode 100644
index 0000000000..90c6aa866d
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_imgmarkercsimex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_imgmarkerex1.html b/html/includes/jpgraph/docs/html/exframes/frame_imgmarkerex1.html
new file mode 100644
index 0000000000..e40c12410c
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_imgmarkerex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_impulsex1.html b/html/includes/jpgraph/docs/html/exframes/frame_impulsex1.html
new file mode 100644
index 0000000000..33c1f61b48
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_impulsex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_impulsex2.html b/html/includes/jpgraph/docs/html/exframes/frame_impulsex2.html
new file mode 100644
index 0000000000..b793c401d3
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_impulsex2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_impulsex3.html b/html/includes/jpgraph/docs/html/exframes/frame_impulsex3.html
new file mode 100644
index 0000000000..42f2e07470
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_impulsex3.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_impulsex4.html b/html/includes/jpgraph/docs/html/exframes/frame_impulsex4.html
new file mode 100644
index 0000000000..7cd309960f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_impulsex4.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_inyaxisex2.html b/html/includes/jpgraph/docs/html/exframes/frame_inyaxisex2.html
new file mode 100644
index 0000000000..8c97db8169
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_inyaxisex2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_linebarcentex1.html b/html/includes/jpgraph/docs/html/exframes/frame_linebarcentex1.html
new file mode 100644
index 0000000000..89d2c6d34a
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_linebarcentex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_lineiconex1.html b/html/includes/jpgraph/docs/html/exframes/frame_lineiconex1.html
new file mode 100644
index 0000000000..d85bbfcafd
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_lineiconex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_lineiconex2.html b/html/includes/jpgraph/docs/html/exframes/frame_lineiconex2.html
new file mode 100644
index 0000000000..fb43638751
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_lineiconex2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_listfontsex1.html b/html/includes/jpgraph/docs/html/exframes/frame_listfontsex1.html
new file mode 100644
index 0000000000..7f3e433db6
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_listfontsex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_logbarex1.html b/html/includes/jpgraph/docs/html/exframes/frame_logbarex1.html
new file mode 100644
index 0000000000..6ac15fa474
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_logbarex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_loglogex1.html b/html/includes/jpgraph/docs/html/exframes/frame_loglogex1.html
new file mode 100644
index 0000000000..bb11d8faf7
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_loglogex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_manscaleex1.html b/html/includes/jpgraph/docs/html/exframes/frame_manscaleex1.html
new file mode 100644
index 0000000000..e81452cf25
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_manscaleex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_manscaleex2.html b/html/includes/jpgraph/docs/html/exframes/frame_manscaleex2.html
new file mode 100644
index 0000000000..6599470afd
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_manscaleex2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_manscaleex3.html b/html/includes/jpgraph/docs/html/exframes/frame_manscaleex3.html
new file mode 100644
index 0000000000..7d9201f6b3
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_manscaleex3.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_manscaleex4.html b/html/includes/jpgraph/docs/html/exframes/frame_manscaleex4.html
new file mode 100644
index 0000000000..1d1f172a3d
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_manscaleex4.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_markflagex1.html b/html/includes/jpgraph/docs/html/exframes/frame_markflagex1.html
new file mode 100644
index 0000000000..b4d3f9b039
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_markflagex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_nullvalueex01.html b/html/includes/jpgraph/docs/html/exframes/frame_nullvalueex01.html
new file mode 100644
index 0000000000..86f2799d8f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_nullvalueex01.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_partiallyfilledlineex1.html b/html/includes/jpgraph/docs/html/exframes/frame_partiallyfilledlineex1.html
new file mode 100644
index 0000000000..0bc03485e3
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_partiallyfilledlineex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_penguin.html b/html/includes/jpgraph/docs/html/exframes/frame_penguin.html
new file mode 100644
index 0000000000..37b4a2e8d0
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_penguin.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_pie3d_csimex1.html b/html/includes/jpgraph/docs/html/exframes/frame_pie3d_csimex1.html
new file mode 100644
index 0000000000..3fd827bf31
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_pie3d_csimex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_pie_csimex1.html b/html/includes/jpgraph/docs/html/exframes/frame_pie_csimex1.html
new file mode 100644
index 0000000000..c99e507493
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_pie_csimex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_piec_csimex1.html b/html/includes/jpgraph/docs/html/exframes/frame_piec_csimex1.html
new file mode 100644
index 0000000000..e0146d0e21
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_piec_csimex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_piecex1.html b/html/includes/jpgraph/docs/html/exframes/frame_piecex1.html
new file mode 100644
index 0000000000..20455c5894
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_piecex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_piecex2.html b/html/includes/jpgraph/docs/html/exframes/frame_piecex2.html
new file mode 100644
index 0000000000..552e805962
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_piecex2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_pieex3.html b/html/includes/jpgraph/docs/html/exframes/frame_pieex3.html
new file mode 100644
index 0000000000..210f1978eb
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_pieex3.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_pieex8.html b/html/includes/jpgraph/docs/html/exframes/frame_pieex8.html
new file mode 100644
index 0000000000..cb498764f2
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_pieex8.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_pieex9.html b/html/includes/jpgraph/docs/html/exframes/frame_pieex9.html
new file mode 100644
index 0000000000..4f36ec2fb2
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_pieex9.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_pielabelsex1.html b/html/includes/jpgraph/docs/html/exframes/frame_pielabelsex1.html
new file mode 100644
index 0000000000..c53fa0d638
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_pielabelsex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_pielabelsex2.html b/html/includes/jpgraph/docs/html/exframes/frame_pielabelsex2.html
new file mode 100644
index 0000000000..85e4798d30
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_pielabelsex2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_pielabelsex4.html b/html/includes/jpgraph/docs/html/exframes/frame_pielabelsex4.html
new file mode 100644
index 0000000000..1a333bec57
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_pielabelsex4.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_polarex0-180.html b/html/includes/jpgraph/docs/html/exframes/frame_polarex0-180.html
new file mode 100644
index 0000000000..22873387b8
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_polarex0-180.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_polarex0.html b/html/includes/jpgraph/docs/html/exframes/frame_polarex0.html
new file mode 100644
index 0000000000..fbad3b63ae
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_polarex0.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_polarex3-lin.html b/html/includes/jpgraph/docs/html/exframes/frame_polarex3-lin.html
new file mode 100644
index 0000000000..90a96c2133
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_polarex3-lin.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_polarex3.html b/html/includes/jpgraph/docs/html/exframes/frame_polarex3.html
new file mode 100644
index 0000000000..e1f2b58f4a
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_polarex3.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_polarex4.html b/html/includes/jpgraph/docs/html/exframes/frame_polarex4.html
new file mode 100644
index 0000000000..330de97c7e
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_polarex4.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_polarex5.html b/html/includes/jpgraph/docs/html/exframes/frame_polarex5.html
new file mode 100644
index 0000000000..8a9ced1d3d
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_polarex5.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_polarex7-2.html b/html/includes/jpgraph/docs/html/exframes/frame_polarex7-2.html
new file mode 100644
index 0000000000..5b28aa8ca7
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_polarex7-2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_polarex9.html b/html/includes/jpgraph/docs/html/exframes/frame_polarex9.html
new file mode 100644
index 0000000000..19a7806637
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_polarex9.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_radarex1.html b/html/includes/jpgraph/docs/html/exframes/frame_radarex1.html
new file mode 100644
index 0000000000..1f2f0036a3
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_radarex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_radarex2.html b/html/includes/jpgraph/docs/html/exframes/frame_radarex2.html
new file mode 100644
index 0000000000..45677514ea
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_radarex2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_radarex4.html b/html/includes/jpgraph/docs/html/exframes/frame_radarex4.html
new file mode 100644
index 0000000000..5173d860d0
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_radarex4.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_radarex6.1.html b/html/includes/jpgraph/docs/html/exframes/frame_radarex6.1.html
new file mode 100644
index 0000000000..eb02e8cdbf
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_radarex6.1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_radarex6.html b/html/includes/jpgraph/docs/html/exframes/frame_radarex6.html
new file mode 100644
index 0000000000..4ed273f732
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_radarex6.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_radarex7.html b/html/includes/jpgraph/docs/html/exframes/frame_radarex7.html
new file mode 100644
index 0000000000..614a75a631
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_radarex7.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_radarex8.1.html b/html/includes/jpgraph/docs/html/exframes/frame_radarex8.1.html
new file mode 100644
index 0000000000..460c64bc1a
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_radarex8.1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_radarex8.html b/html/includes/jpgraph/docs/html/exframes/frame_radarex8.html
new file mode 100644
index 0000000000..20fcb20b31
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_radarex8.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_radarmarkex1.html b/html/includes/jpgraph/docs/html/exframes/frame_radarmarkex1.html
new file mode 100644
index 0000000000..0aa3379b44
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_radarmarkex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_rotex0.html b/html/includes/jpgraph/docs/html/exframes/frame_rotex0.html
new file mode 100644
index 0000000000..1940cf6817
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_rotex0.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_rotex1.html b/html/includes/jpgraph/docs/html/exframes/frame_rotex1.html
new file mode 100644
index 0000000000..8d41a95a16
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_rotex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_rotex2.html b/html/includes/jpgraph/docs/html/exframes/frame_rotex2.html
new file mode 100644
index 0000000000..5dec757628
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_rotex2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_rotex3.html b/html/includes/jpgraph/docs/html/exframes/frame_rotex3.html
new file mode 100644
index 0000000000..fc52b81652
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_rotex3.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_rotex4.html b/html/includes/jpgraph/docs/html/exframes/frame_rotex4.html
new file mode 100644
index 0000000000..a1d9c9bc35
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_rotex4.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_rotex5.html b/html/includes/jpgraph/docs/html/exframes/frame_rotex5.html
new file mode 100644
index 0000000000..28f00df83c
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_rotex5.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_scatter_csimex1.html b/html/includes/jpgraph/docs/html/exframes/frame_scatter_csimex1.html
new file mode 100644
index 0000000000..fc3b9cf344
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_scatter_csimex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_scatterex1.html b/html/includes/jpgraph/docs/html/exframes/frame_scatterex1.html
new file mode 100644
index 0000000000..cf61e111ff
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_scatterex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_scatterex2.html b/html/includes/jpgraph/docs/html/exframes/frame_scatterex2.html
new file mode 100644
index 0000000000..876987065f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_scatterex2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex1.html b/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex1.html
new file mode 100644
index 0000000000..c5eb5f8a8c
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex10.html b/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex10.html
new file mode 100644
index 0000000000..03f55151c2
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex10.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex2.html b/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex2.html
new file mode 100644
index 0000000000..ae83bfc14d
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex2.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex3.html b/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex3.html
new file mode 100644
index 0000000000..d5b9a80a30
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex3.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex4.html b/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex4.html
new file mode 100644
index 0000000000..819691b363
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex4.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex5.html b/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex5.html
new file mode 100644
index 0000000000..bbf050c04b
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex5.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex6.html b/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex6.html
new file mode 100644
index 0000000000..da1728e2d4
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex6.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex7.html b/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex7.html
new file mode 100644
index 0000000000..a6f4616a88
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex7.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex8.html b/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex8.html
new file mode 100644
index 0000000000..be945eae7e
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex8.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex9.html b/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex9.html
new file mode 100644
index 0000000000..dbc7bf4a49
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_smallstaticbandsex9.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_splineex1.html b/html/includes/jpgraph/docs/html/exframes/frame_splineex1.html
new file mode 100644
index 0000000000..2510bf83d4
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_splineex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_staticbandbarex7.html b/html/includes/jpgraph/docs/html/exframes/frame_staticbandbarex7.html
new file mode 100644
index 0000000000..3a225eda53
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_staticbandbarex7.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_stockex1.html b/html/includes/jpgraph/docs/html/exframes/frame_stockex1.html
new file mode 100644
index 0000000000..6968ae69ac
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_stockex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_tabtitleex1.html b/html/includes/jpgraph/docs/html/exframes/frame_tabtitleex1.html
new file mode 100644
index 0000000000..6dc032294c
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_tabtitleex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_textalignex1.html b/html/includes/jpgraph/docs/html/exframes/frame_textalignex1.html
new file mode 100644
index 0000000000..eced480c19
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_textalignex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_titlecsimex01.html b/html/includes/jpgraph/docs/html/exframes/frame_titlecsimex01.html
new file mode 100644
index 0000000000..45389bbc45
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_titlecsimex01.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/frame_topxaxisex1.html b/html/includes/jpgraph/docs/html/exframes/frame_topxaxisex1.html
new file mode 100644
index 0000000000..c9ac06d2a6
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/frame_topxaxisex1.html
@@ -0,0 +1 @@
+
diff --git a/html/includes/jpgraph/docs/html/exframes/funcex1.html b/html/includes/jpgraph/docs/html/exframes/funcex1.html
new file mode 100644
index 0000000000..02f7e94d68
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/funcex1.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
include ("../jpgraph_utils.inc");
$f = new FuncGenerator('cos($x)*$x');
list($xdata,$ydata) = $f->E(-1.2*M_PI,1.2*M_PI);
$f = new FuncGenerator('$x*$x');
list($x2data,$y2data) = $f->E(-2,2);
// Setup the basic graph
$graph = new Graph(450,350,"auto");
$graph->SetScale("linlin");
$graph->SetShadow();
$graph->img->SetMargin(50,50,60,40);
$graph->SetBox(true,'black',2);
$graph->SetMarginColor('white');
$graph->SetColor('lightyellow');
// ... and titles
$graph->title->Set('Example of Function plot');
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->subtitle->Set("(With some more advanced axis formatting\nHiding first and last label)");
$graph->subtitle->SetFont(FF_FONT1,FS_NORMAL);
$graph->xgrid->Show();
$graph->yaxis->SetPos(0);
$graph->yaxis->SetWeight(2);
$graph->yaxis->HideZeroLabel();
$graph->yaxis->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->SetColor('black','darkblue');
$graph->yaxis->HideTicks(true,false);
$graph->yaxis->HideFirstLastLabel();
$graph->xaxis->SetWeight(2);
$graph->xaxis->HideZeroLabel();
$graph->xaxis->HideFirstLastLabel();
$graph->xaxis->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->SetColor('black','darkblue');
$lp1 = new LinePlot($ydata,$xdata);
$lp1->SetColor('blue');
$lp1->SetWeight(2);
$lp2 = new LinePlot($y2data,$x2data);
list($xm,$ym)=$lp2->Max();
$lp2->SetColor('red');
$lp2->SetWeight(2);
$graph->Add($lp1);
$graph->Add($lp2);
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttconstrainex0.html b/html/includes/jpgraph/docs/html/exframes/ganttconstrainex0.html
new file mode 100644
index 0000000000..ae5cba7d5b
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttconstrainex0.html
@@ -0,0 +1,3 @@
+
+<?php
// Gantt example
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
//
// The data for the graphs
//
$data = array(
array(0,ACTYPE_GROUP, "Phase 1", "2001-10-26","2001-11-23",''),
array(1,ACTYPE_NORMAL, " Label 2", "2001-10-26","2001-11-16",''),
array(2,ACTYPE_NORMAL, " Label 3", "2001-11-20","2001-11-22",''),
array(3,ACTYPE_MILESTONE," Phase 1 Done", "2001-11-23",'M2') );
// The constrains between the activities
//$constrains = array(array(1,2,CONSTRAIN_ENDSTART),
// array(2,3,CONSTRAIN_STARTSTART));
$constrains = array();
$progress = array(array(1,0.4));
// Create the basic graph
$graph = new GanttGraph();
$graph->title->Set("Example with grouping and constrains");
// Setup scale
$graph->ShowHeaders(GANTT_HYEAR | GANTT_HMONTH | GANTT_HDAY | GANTT_HWEEK);
$graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAYWNBR);
// Add the specified activities
$graph->CreateSimple($data,$constrains,$progress);
// .. and stroke the graph
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttconstrainex1.html b/html/includes/jpgraph/docs/html/exframes/ganttconstrainex1.html
new file mode 100644
index 0000000000..c72b01e24c
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttconstrainex1.html
@@ -0,0 +1,3 @@
+
+<?php
// Gantt example
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
//
// The data for the graphs
//
$data = array(
array(0,ACTYPE_GROUP, "Phase 1", "2001-10-26","2001-11-23",''),
array(1,ACTYPE_NORMAL, " Label 1", "2001-10-26","2001-11-18",''),
array(2,ACTYPE_NORMAL, " Label 2", "2001-10-26","2001-11-16",''),
array(3,ACTYPE_NORMAL, " Label 3", "2001-11-20","2001-11-22",''),
array(4,ACTYPE_MILESTONE," Phase 1 Done", "2001-11-23",'M2') );
// The constrains between the activities
$constrains = array(array(1,2,CONSTRAIN_ENDSTART),
array(1,3,CONSTRAIN_STARTSTART),
array(3,4,CONSTRAIN_STARTSTART));
$progress = array(array(1,0.4));
// Create the basic graph
$graph = new GanttGraph();
$graph->title->Set("Example with grouping and constrains");
// Setup scale
$graph->ShowHeaders(GANTT_HYEAR | GANTT_HMONTH | GANTT_HDAY | GANTT_HWEEK);
$graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAYWNBR);
// Add the specified activities
$graph->CreateSimple($data,$constrains,$progress);
// .. and stroke the graph
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttcsimex01.html b/html/includes/jpgraph/docs/html/exframes/ganttcsimex01.html
new file mode 100644
index 0000000000..93452688a9
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttcsimex01.html
@@ -0,0 +1,3 @@
+
+<?php
// Gantt example to create CSIM
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$bar1 = new GanttBar(0,"Activity 1","2001-12-21","2002-01-20");
$bar1->SetCSIMTarget('#','Go back 1');
$bar1->title->SetCSIMTarget('#','Go back 1 (title)');
$bar2 = new GanttBar(1,"Activity 2","2002-01-03","2002-01-25");
$bar2->SetCSIMTarget('#','Go back 2');
$bar2->title->SetCSIMTarget('#','Go back 2 (title)');
$graph = new GanttGraph(500);
$graph->title->Set("Example with image map");
$graph->ShowHeaders(GANTT_HYEAR | GANTT_HMONTH | GANTT_HDAY | GANTT_HWEEK);
$graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY);
$graph->scale->week->SetFont(FF_FONT1);
$graph->Add(array($bar1,$bar2));
// And stroke
$graph->StrokeCSIM('ganttcsimex01.php');
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttcsimex02.html b/html/includes/jpgraph/docs/html/exframes/ganttcsimex02.html
new file mode 100644
index 0000000000..8661169fb7
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttcsimex02.html
@@ -0,0 +1,3 @@
+
+<?php
// Gantt example to create CSIM using CreateSimple()
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$data = array(
array(0,ACTYPE_GROUP, "Phase 1", "2001-10-26","2001-11-23",'',
'#1','Go home'),
array(1,ACTYPE_NORMAL, " Label 2", "2001-10-26","2001-11-16",'ab,cd',
'#2','Go home'),
array(2,ACTYPE_NORMAL, " Label 3", "2001-11-20","2001-11-22",'ek',
'#3','Go home'),
array(3,ACTYPE_MILESTONE," Phase 1 Done", "2001-11-23",'M2',
'#4','Go home') );
// The constrains between the activities
$constrains = array(array(1,2,CONSTRAIN_ENDSTART),
array(2,3,CONSTRAIN_STARTSTART));
$progress = array(array(1,0.4));
$graph = new GanttGraph(500);
$graph->title->Set("Example with image map");
$graph->ShowHeaders(GANTT_HYEAR | GANTT_HMONTH | GANTT_HDAY | GANTT_HWEEK);
$graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY);
$graph->scale->week->SetFont(FF_FONT1);
$graph->CreateSimple($data,$constrains,$progress);
// Add the specified activities
//SetupSimpleGantt($graph,$data,$constrains,$progress);
// And stroke
$graph->StrokeCSIM('ganttcsimex02.php');
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttex00.html b/html/includes/jpgraph/docs/html/exframes/ganttex00.html
new file mode 100644
index 0000000000..970edb2e95
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttex00.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
// A new graph with automatic size
$graph = new GanttGraph(0,0,"auto");
// A new activity on row '0'
$activity = new GanttBar(0,"Project","2001-12-21","2002-01-20");
$graph->Add($activity);
// Display the Gantt chart
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttex01.html b/html/includes/jpgraph/docs/html/exframes/ganttex01.html
new file mode 100644
index 0000000000..331d90afa9
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttex01.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$graph = new GanttGraph(0,0,"auto");
$graph->SetShadow();
// Add title and subtitle
$graph->title->Set("A nice main title");
$graph->title->SetFont(FF_ARIAL,FS_BOLD,12);
$graph->subtitle->Set("(Draft version)");
// Show day, week and month scale
$graph->ShowHeaders(GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH);
// Instead of week number show the date for the first day in the week
// on the week scale
$graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY);
// Make the week scale font smaller than the default
$graph->scale->week->SetFont(FF_FONT0);
// Use the short name of the month together with a 2 digit year
// on the month scale
$graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR2);
// Format the bar for the first activity
// ($row,$title,$startdate,$enddate)
$activity = new GanttBar(0,"Project","2001-12-21","2002-01-20");
// Yellow diagonal line pattern on a red background
$activity->SetPattern(BAND_RDIAG,"yellow");
$activity->SetFillColor("red");
// Finally add the bar to the graph
$graph->Add($activity);
// ... and display it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttex02.html b/html/includes/jpgraph/docs/html/exframes/ganttex02.html
new file mode 100644
index 0000000000..7f09eaef65
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttex02.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$graph = new GanttGraph(0,0,"auto");
$graph->SetShadow();
// Add title and subtitle
$graph->title->Set("Main title");
$graph->title->SetFont(FF_ARIAL,FS_BOLD,12);
// Show day, week and month scale
//$graph->ShowHeaders(GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH);
$graph->ShowHeaders(GANTT_HWEEK );
// Instead of week number show the date for the first day in the week
// on the week scale
$graph->scale->week->SetStyle(WEEKSTYLE_WNBR);
// Make the week scale font smaller than the default
$graph->scale->week->SetFont(FF_FONT0);
// Use the short name of the month together with a 2 digit year
// on the month scale
$graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR4);
$graph->scale->month->SetFontColor("white");
$graph->scale->month->SetBackgroundColor("blue");
// Format the bar for the first activity
// ($row,$title,$startdate,$enddate)
$activity = new GanttBar(0,"Project","2001-12-21","2002-02-20");
// Yellow diagonal line pattern on a red background
$activity->SetPattern(BAND_RDIAG,"yellow");
$activity->SetFillColor("red");
// Finally add the bar to the graph
$graph->Add($activity);
// ... and display it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttex03.html b/html/includes/jpgraph/docs/html/exframes/ganttex03.html
new file mode 100644
index 0000000000..73b1093b3e
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttex03.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$graph = new GanttGraph(0,0,"auto");
$graph->SetShadow();
// Add title and subtitle
$graph->title->Set("A nice main title");
$graph->title->SetFont(FF_ARIAL,FS_BOLD,12);
$graph->subtitle->Set("(Draft version)");
// Show day, week and month scale
$graph->ShowHeaders(GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH);
// Instead of week number show the date for the first day in the week
// on the week scale
$graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY);
// Make the week scale font smaller than the default
$graph->scale->week->SetFont(FF_FONT0);
// Use the short name of the month together with a 2 digit year
// on the month scale
$graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR4);
$graph->scale->month->SetFontColor("white");
$graph->scale->month->SetBackgroundColor("blue");
// Format the bar for the first activity
// ($row,$title,$startdate,$enddate)
$activity = new GanttBar(7,"Project","2001-12-21","2002-01-20");
// Yellow diagonal line pattern on a red background
$activity->SetPattern(BAND_RDIAG,"yellow");
$activity->SetFillColor("red");
// Finally add the bar to the graph
$graph->Add($activity);
// ... and display it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttex04.html b/html/includes/jpgraph/docs/html/exframes/ganttex04.html
new file mode 100644
index 0000000000..a2f998edc6
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttex04.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$graph = new GanttGraph(0,0,"auto");
$graph->SetShadow();
// Add title and subtitle
$graph->title->Set("A nice main title");
$graph->title->SetFont(FF_ARIAL,FS_BOLD,12);
$graph->subtitle->Set("(Draft version)");
// Show day, week and month scale
$graph->ShowHeaders(GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH);
// Instead of week number show the date for the first day in the week
// on the week scale
$graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY);
// Make the week scale font smaller than the default
$graph->scale->week->SetFont(FF_FONT0);
// Use the short name of the month together with a 2 digit year
// on the month scale
$graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR4);
$graph->scale->month->SetFontColor("white");
$graph->scale->month->SetBackgroundColor("blue");
// Format the bar for the first activity
// ($row,$title,$startdate,$enddate)
$activity = new GanttBar(0,"Project","2001-12-21","2002-01-20");
// Yellow diagonal line pattern on a red background
$activity->SetPattern(BAND_RDIAG,"yellow");
$activity->SetFillColor("red");
// Finally add the bar to the graph
$graph->Add($activity);
// Create a miletone
$milestone = new MileStone(2,"Milestone","2002-01-15","2002-01-15");
$graph->Add($milestone);
// ... and display it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttex05.html b/html/includes/jpgraph/docs/html/exframes/ganttex05.html
new file mode 100644
index 0000000000..3226e4f0e5
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttex05.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$graph = new GanttGraph(0,0,"auto");
$graph->SetShadow();
// Add title and subtitle
$graph->title->Set("A nice main title");
$graph->title->SetFont(FF_ARIAL,FS_BOLD,12);
$graph->subtitle->Set("(Draft version)");
// Show day, week and month scale
$graph->ShowHeaders(GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH);
// Instead of week number show the date for the first day in the week
// on the week scale
$graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY);
// Make the week scale font smaller than the default
$graph->scale->week->SetFont(FF_FONT0);
// Use the short name of the month together with a 2 digit year
// on the month scale
$graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR4);
$graph->scale->month->SetFontColor("white");
$graph->scale->month->SetBackgroundColor("blue");
// Format the bar for the first activity
// ($row,$title,$startdate,$enddate)
$activity = new GanttBar(0,"Project","2001-12-21","2002-01-20");
// Yellow diagonal line pattern on a red background
$activity->SetPattern(BAND_RDIAG,"yellow");
$activity->SetFillColor("red");
// Finally add the bar to the graph
$graph->Add($activity);
// Create a miletone
$milestone = new MileStone(2,"Milestone","2002-01-15","2002-01-15");
$milestone->title->SetColor("black");
$milestone->title->SetFont(FF_FONT1,FS_BOLD);
$graph->Add($milestone);
// ... and display it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttex06.html b/html/includes/jpgraph/docs/html/exframes/ganttex06.html
new file mode 100644
index 0000000000..7e651fdcb1
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttex06.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$graph = new GanttGraph(0,0,"auto");
$graph->SetShadow();
// Add title and subtitle
$graph->title->Set("A nice main title");
$graph->title->SetFont(FF_ARIAL,FS_BOLD,12);
$graph->subtitle->Set("(Draft version)");
// Show day, week and month scale
$graph->ShowHeaders(GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH);
// Instead of week number show the date for the first day in the week
// on the week scale
$graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY);
// Make the week scale font smaller than the default
$graph->scale->week->SetFont(FF_FONT0);
// Use the short name of the month together with a 2 digit year
// on the month scale
$graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR4);
$graph->scale->month->SetFontColor("white");
$graph->scale->month->SetBackgroundColor("blue");
// Format the bar for the first activity
// ($row,$title,$startdate,$enddate)
$activity = new GanttBar(0,"Project","2001-12-21","2002-01-20");
// Yellow diagonal line pattern on a red background
$activity->SetPattern(BAND_RDIAG,"yellow");
$activity->SetFillColor("red");
// Finally add the bar to the graph
$graph->Add($activity);
// Create a miletone
$milestone = new MileStone(2,"Milestone","2002-01-15","2002-01-15");
$milestone->title->SetColor("black");
$milestone->title->SetFont(FF_FONT1,FS_BOLD);
$graph->Add($milestone);
// Add a vertical line
$vline = new GanttVLine("2001-12-24","Phase 1");
$graph->Add($vline);
// ... and display it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttex07.html b/html/includes/jpgraph/docs/html/exframes/ganttex07.html
new file mode 100644
index 0000000000..aa0b7e1770
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttex07.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$graph = new GanttGraph(0,0,"auto");
$graph->SetShadow();
// Add title and subtitle
$graph->title->Set("A nice main title");
$graph->title->SetFont(FF_ARIAL,FS_BOLD,12);
$graph->subtitle->Set("(Draft version)");
// Show day, week and month scale
$graph->ShowHeaders(GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH);
// Instead of week number show the date for the first day in the week
// on the week scale
$graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY);
// Make the week scale font smaller than the default
$graph->scale->week->SetFont(FF_FONT0);
// Use the short name of the month together with a 2 digit year
// on the month scale
$graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR4);
$graph->scale->month->SetFontColor("white");
$graph->scale->month->SetBackgroundColor("blue");
// Format the bar for the first activity
// ($row,$title,$startdate,$enddate)
$activity = new GanttBar(0,"Project","2001-12-21","2002-01-20");
// Yellow diagonal line pattern on a red background
$activity->SetPattern(BAND_RDIAG,"yellow");
$activity->SetFillColor("red");
// Finally add the bar to the graph
$graph->Add($activity);
// Create a miletone
$milestone = new MileStone(2,"Milestone","2002-01-15","2002-01-15");
$milestone->title->SetColor("black");
$milestone->title->SetFont(FF_FONT1,FS_BOLD);
$graph->Add($milestone);
// Add a vertical line
$vline = new GanttVLine("2001-12-24","Phase 1");
$vline->SetDayOffset(0.5);
$graph->Add($vline);
// ... and display it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttex08.html b/html/includes/jpgraph/docs/html/exframes/ganttex08.html
new file mode 100644
index 0000000000..14103256dd
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttex08.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$graph = new GanttGraph(0,0,"auto");
$graph->SetShadow();
// Add title and subtitle
$graph->title->Set("A nice main title");
$graph->title->SetFont(FF_ARIAL,FS_BOLD,12);
$graph->subtitle->Set("(Draft version)");
// Show day, week and month scale
$graph->ShowHeaders(GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH);
// Instead of week number show the date for the first day in the week
// on the week scale
$graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY);
// Make the week scale font smaller than the default
$graph->scale->week->SetFont(FF_FONT0);
// Use the short name of the month together with a 2 digit year
// on the month scale
$graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR4);
$graph->scale->month->SetFontColor("white");
$graph->scale->month->SetBackgroundColor("blue");
// Format the bar for the first activity
// ($row,$title,$startdate,$enddate)
$activity = new GanttBar(0,"Project","2001-12-21","2002-01-20");
// Yellow diagonal line pattern on a red background
$activity->SetPattern(BAND_RDIAG,"yellow");
$activity->SetFillColor("red");
// Add a right marker
$activity->rightMark->Show();
$activity->rightMark->SetType(MARK_FILLEDCIRCLE);
$activity->rightMark->SetWidth(13);
$activity->rightMark->SetColor("red");
$activity->rightMark->SetFillColor("red");
$activity->rightMark->title->Set("M5");
$activity->rightMark->title->SetFont(FF_ARIAL,FS_BOLD,12);
$activity->rightMark->title->SetColor("white");
// Finally add the bar to the graph
$graph->Add($activity);
// Create a miletone
$milestone = new MileStone(2,"Milestone","2002-01-15","2002-01-15");
$milestone->title->SetColor("black");
$milestone->title->SetFont(FF_FONT1,FS_BOLD);
$graph->Add($milestone);
// Add a vertical line
$vline = new GanttVLine("2001-12-24","Phase 1");
$vline->SetDayOffset(0.5);
$graph->Add($vline);
// ... and display it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttex09.html b/html/includes/jpgraph/docs/html/exframes/ganttex09.html
new file mode 100644
index 0000000000..6522a7017d
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttex09.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$graph = new GanttGraph(0,0,"auto");
$graph->SetShadow();
// Add title and subtitle
$graph->title->Set("A nice main title");
$graph->title->SetFont(FF_ARIAL,FS_BOLD,12);
$graph->subtitle->Set("(Draft version)");
// Show day, week and month scale
$graph->ShowHeaders(GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH);
// Instead of week number show the date for the first day in the week
// on the week scale
$graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY);
// Make the week scale font smaller than the default
$graph->scale->week->SetFont(FF_FONT0);
// Use the short name of the month together with a 2 digit year
// on the month scale
$graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR4);
$graph->scale->month->SetFontColor("white");
$graph->scale->month->SetBackgroundColor("blue");
// Format the bar for the first activity
// ($row,$title,$startdate,$enddate)
$activity = new GanttBar(0,"Project","2001-12-21","2002-01-20");
// Yellow diagonal line pattern on a red background
$activity->SetPattern(BAND_RDIAG,"yellow");
$activity->SetFillColor("red");
// Add a right marker
$activity->rightMark->Show();
$activity->rightMark->SetType(MARK_FILLEDCIRCLE);
$activity->rightMark->SetWidth(13);
$activity->rightMark->SetColor("red");
$activity->rightMark->SetFillColor("red");
$activity->rightMark->title->Set("M5");
$activity->rightMark->title->SetFont(FF_ARIAL,FS_BOLD,12);
$activity->rightMark->title->SetColor("white");
// Set absolute height
$activity->SetHeight(8);
// Finally add the bar to the graph
$graph->Add($activity);
// Create a miletone
$milestone = new MileStone(2,"Milestone","2002-01-15","2002-01-15");
$milestone->title->SetColor("black");
$milestone->title->SetFont(FF_FONT1,FS_BOLD);
$graph->Add($milestone);
// Add a vertical line
$vline = new GanttVLine("2001-12-24","Phase 1");
$vline->SetDayOffset(0.5);
$graph->Add($vline);
// ... and display it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttex10.html b/html/includes/jpgraph/docs/html/exframes/ganttex10.html
new file mode 100644
index 0000000000..8fb725ee20
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttex10.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$graph = new GanttGraph(0,0,"auto");
$graph->SetShadow();
// Add title and subtitle
$graph->title->Set("A nice main title");
$graph->title->SetFont(FF_ARIAL,FS_BOLD,12);
$graph->subtitle->Set("(Draft version)");
// Show day, week and month scale
$graph->ShowHeaders(GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH);
// Instead of week number show the date for the first day in the week
// on the week scale
$graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY);
// Make the week scale font smaller than the default
$graph->scale->week->SetFont(FF_FONT0);
// Use the short name of the month together with a 2 digit year
// on the month scale
$graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR4);
$graph->scale->month->SetFontColor("white");
$graph->scale->month->SetBackgroundColor("blue");
// Format the bar for the first activity
// ($row,$title,$startdate,$enddate)
$activity = new GanttBar(0,"Project","2001-12-21","2002-01-20");
// Yellow diagonal line pattern on a red background
$activity->SetPattern(BAND_RDIAG,"yellow");
$activity->SetFillColor("red");
// Add a right marker
$activity->rightMark->Show();
$activity->rightMark->SetType(MARK_FILLEDCIRCLE);
$activity->rightMark->SetWidth(13);
$activity->rightMark->SetColor("red");
$activity->rightMark->SetFillColor("red");
$activity->rightMark->title->Set("M5");
$activity->rightMark->title->SetFont(FF_ARIAL,FS_BOLD,12);
$activity->rightMark->title->SetColor("white");
// Set absolute height
$activity->SetHeight(1);
// Format the bar for the second activity
// ($row,$title,$startdate,$enddate)
$activity2 = new GanttBar(1,"Project","2001-12-21","2002-01-20");
// Yellow diagonal line pattern on a red background
$activity2->SetPattern(BAND_RDIAG,"yellow");
$activity2->SetFillColor("red");
// Add a right marker
$activity2->rightMark->Show();
$activity2->rightMark->SetType(MARK_FILLEDCIRCLE);
$activity2->rightMark->SetWidth(13);
$activity2->rightMark->SetColor("red");
$activity2->rightMark->SetFillColor("red");
$activity2->rightMark->title->Set("M5");
$activity2->rightMark->title->SetFont(FF_ARIAL,FS_BOLD,12);
$activity2->rightMark->title->SetColor("white");
// Set absolute height
$activity2->SetHeight(1);
// Finally add the bar to the graph
$graph->Add($activity);
$graph->Add($activity2);
// Create a miletone
$milestone = new MileStone(2,"Milestone","2002-01-15","2002-01-15");
$milestone->title->SetColor("black");
$milestone->title->SetFont(FF_FONT1,FS_BOLD);
$graph->Add($milestone);
// Add a vertical line
$vline = new GanttVLine("2001-12-24","Phase 1");
$vline->SetDayOffset(0.5);
//$graph->Add($vline);
// ... and display it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttex11.html b/html/includes/jpgraph/docs/html/exframes/ganttex11.html
new file mode 100644
index 0000000000..1908528834
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttex11.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$graph = new GanttGraph(0,0,"auto");
$graph->SetShadow();
// Add title and subtitle
$graph->title->Set("A nice main title");
$graph->title->SetFont(FF_ARIAL,FS_BOLD,12);
$graph->subtitle->Set("(Draft version)");
// Show day, week and month scale
$graph->ShowHeaders(GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH);
// Instead of week number show the date for the first day in the week
// on the week scale
$graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY);
// Make the week scale font smaller than the default
$graph->scale->week->SetFont(FF_FONT0);
// Use the short name of the month together with a 2 digit year
// on the month scale
$graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR4);
$graph->scale->month->SetFontColor("white");
$graph->scale->month->SetBackgroundColor("blue");
// Format the bar for the first activity
// ($row,$title,$startdate,$enddate)
$activity = new GanttBar(0,"Project","2001-12-21","2002-01-20");
// Yellow diagonal line pattern on a red background
$activity->SetPattern(BAND_RDIAG,"yellow");
$activity->SetFillColor("red");
// Add a right marker
$activity->rightMark->Show();
$activity->rightMark->SetType(MARK_FILLEDCIRCLE);
$activity->rightMark->SetWidth(13);
$activity->rightMark->SetColor("red");
$activity->rightMark->SetFillColor("red");
$activity->rightMark->title->Set("M5");
$activity->rightMark->title->SetFont(FF_ARIAL,FS_BOLD,12);
$activity->rightMark->title->SetColor("white");
// Set absolute height
$activity->SetHeight(10);
// Format the bar for the second activity
// ($row,$title,$startdate,$enddate)
$activity2 = new GanttBar(1,"Project","2001-12-21","2002-01-20");
// Yellow diagonal line pattern on a red background
$activity2->SetPattern(BAND_RDIAG,"yellow");
$activity2->SetFillColor("red");
// Add a right marker
$activity2->rightMark->Show();
$activity2->rightMark->SetType(MARK_FILLEDCIRCLE);
$activity2->rightMark->SetWidth(13);
$activity2->rightMark->SetColor("red");
$activity2->rightMark->SetFillColor("red");
$activity2->rightMark->title->Set("M5");
$activity2->rightMark->title->SetFont(FF_ARIAL,FS_BOLD,12);
$activity2->rightMark->title->SetColor("white");
// Set absolute height
$activity2->SetHeight(10);
// Finally add the bar to the graph
$graph->Add($activity);
$graph->Add($activity2);
// Create a miletone
$milestone = new MileStone(2,"Milestone","2002-01-15","2002-01-15");
$milestone->title->SetColor("black");
$milestone->title->SetFont(FF_FONT1,FS_BOLD);
$graph->Add($milestone);
// Add a vertical line
$vline = new GanttVLine("2001-12-24","Phase 1");
$vline->SetDayOffset(0.5);
//$graph->Add($vline);
// ... and display it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttex12.html b/html/includes/jpgraph/docs/html/exframes/ganttex12.html
new file mode 100644
index 0000000000..5f8110fb87
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttex12.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$graph = new GanttGraph(0,0,"auto");
$graph->SetBox();
$graph->SetShadow();
// Add title and subtitle
$graph->title->Set("A nice main title");
$graph->title->SetFont(FF_ARIAL,FS_BOLD,12);
$graph->subtitle->Set("(Draft version)");
// Show day, week and month scale
$graph->ShowHeaders(GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH);
// Instead of week number show the date for the first day in the week
// on the week scale
$graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY);
// Make the week scale font smaller than the default
$graph->scale->week->SetFont(FF_FONT0);
// Use the short name of the month together with a 2 digit year
// on the month scale
$graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR4);
$graph->scale->month->SetFontColor("white");
$graph->scale->month->SetBackgroundColor("blue");
// 0 % vertical label margin
$graph->SetLabelVMarginFactor(0);
// Format the bar for the first activity
// ($row,$title,$startdate,$enddate)
$activity = new GanttBar(0,"Project","2001-12-21","2002-01-20");
// Yellow diagonal line pattern on a red background
$activity->SetPattern(BAND_RDIAG,"yellow");
$activity->SetFillColor("red");
// Add a right marker
$activity->rightMark->Show();
$activity->rightMark->SetType(MARK_FILLEDCIRCLE);
$activity->rightMark->SetWidth(13);
$activity->rightMark->SetColor("red");
$activity->rightMark->SetFillColor("red");
$activity->rightMark->title->Set("M5");
$activity->rightMark->title->SetFont(FF_ARIAL,FS_BOLD,12);
$activity->rightMark->title->SetColor("white");
// Set absolute height
$activity->SetHeight(10);
// Format the bar for the second activity
// ($row,$title,$startdate,$enddate)
$activity2 = new GanttBar(1,"Project","2001-12-21","2002-01-20");
// Yellow diagonal line pattern on a red background
$activity2->SetPattern(BAND_RDIAG,"yellow");
$activity2->SetFillColor("red");
// Add a right marker
$activity2->rightMark->Show();
$activity2->rightMark->SetType(MARK_FILLEDCIRCLE);
$activity2->rightMark->SetWidth(13);
$activity2->rightMark->SetColor("red");
$activity2->rightMark->SetFillColor("red");
$activity2->rightMark->title->Set("M5");
$activity2->rightMark->title->SetFont(FF_ARIAL,FS_BOLD,12);
$activity2->rightMark->title->SetColor("white");
// Set absolute height
$activity2->SetHeight(10);
// Finally add the bar to the graph
$graph->Add($activity);
$graph->Add($activity2);
// Create a miletone
$milestone = new MileStone(2,"Milestone","2002-01-15","2002-01-15");
$milestone->title->SetColor("black");
$milestone->title->SetFont(FF_FONT1,FS_BOLD);
$graph->Add($milestone);
// Add a vertical line
$vline = new GanttVLine("2001-12-24","Phase 1");
$vline->SetDayOffset(0.5);
//$graph->Add($vline);
// ... and display it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttex13.html b/html/includes/jpgraph/docs/html/exframes/ganttex13.html
new file mode 100644
index 0000000000..060421b853
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttex13.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$graph = new GanttGraph(0,0,"auto");
$graph->SetBox();
$graph->SetShadow();
// Add title and subtitle
$graph->title->Set("Example of captions");
$graph->title->SetFont(FF_ARIAL,FS_BOLD,12);
$graph->subtitle->Set("(ganttex13.php)");
// Show day, week and month scale
$graph->ShowHeaders(GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH);
// Instead of week number show the date for the first day in the week
// on the week scale
$graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY);
// Make the week scale font smaller than the default
$graph->scale->week->SetFont(FF_FONT0);
// Use the short name of the month together with a 2 digit year
// on the month scale
$graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR4);
$graph->scale->month->SetFontColor("white");
$graph->scale->month->SetBackgroundColor("blue");
// 0 % vertical label margin
$graph->SetLabelVMarginFactor(1);
// Format the bar for the first activity
// ($row,$title,$startdate,$enddate)
$activity = new GanttBar(0,"Project","2001-12-21","2002-01-07","[ER,TR]");
// Yellow diagonal line pattern on a red background
$activity->SetPattern(BAND_RDIAG,"yellow");
$activity->SetFillColor("red");
// Set absolute height
$activity->SetHeight(10);
// Format the bar for the second activity
// ($row,$title,$startdate,$enddate)
$activity2 = new GanttBar(1,"Project","2001-12-21","2002-01-02","[BO,SW,JC]");
// ADjust font for caption
$activity2->caption->SetFont(FF_ARIAL,FS_BOLD);
$activity2->caption->SetColor("darkred");
// Yellow diagonal line pattern on a red background
$activity2->SetPattern(BAND_RDIAG,"yellow");
$activity2->SetFillColor("red");
// Set absolute height
$activity2->SetHeight(10);
// Finally add the bar to the graph
$graph->Add($activity);
$graph->Add($activity2);
// Add a vertical line
$vline = new GanttVLine("2001-12-24","Phase 1");
$vline->SetDayOffset(0.5);
//$graph->Add($vline);
// ... and display it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttex14.html b/html/includes/jpgraph/docs/html/exframes/ganttex14.html
new file mode 100644
index 0000000000..718f805ad0
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttex14.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$graph = new GanttGraph(0,0,"auto");
$graph->SetBox();
$graph->SetShadow();
// Add title and subtitle
$graph->title->Set("Example of captions");
$graph->title->SetFont(FF_ARIAL,FS_BOLD,12);
$graph->subtitle->Set("(ganttex14.php)");
// Show day, week and month scale
$graph->ShowHeaders(GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH);
// Use the short name of the month together with a 2 digit year
// on the month scale
$graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR2);
$graph->scale->month->SetFontColor("white");
$graph->scale->month->SetBackgroundColor("blue");
// 0 % vertical label margin
$graph->SetLabelVMarginFactor(1);
// Format the bar for the first activity
// ($row,$title,$startdate,$enddate)
$activity = new GanttBar(0,"Project","2001-12-21","2002-01-07","[50%]");
// Yellow diagonal line pattern on a red background
$activity->SetPattern(BAND_RDIAG,"yellow");
$activity->SetFillColor("red");
// Set absolute height
$activity->SetHeight(10);
// Specify progress to 60%
$activity->progress->Set(0.6);
// Format the bar for the second activity
// ($row,$title,$startdate,$enddate)
$activity2 = new GanttBar(1,"Project","2001-12-21","2002-01-02","[30%]");
// Yellow diagonal line pattern on a red background
$activity2->SetPattern(BAND_RDIAG,"yellow");
$activity2->SetFillColor("red");
// Set absolute height
$activity2->SetHeight(10);
// Specify progress to 30%
$activity2->progress->Set(0.3);
// Finally add the bar to the graph
$graph->Add($activity);
$graph->Add($activity2);
// Add a vertical line
$vline = new GanttVLine("2001-12-24","Phase 1");
$vline->SetDayOffset(0.5);
//$graph->Add($vline);
// ... and display it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttex15.html b/html/includes/jpgraph/docs/html/exframes/ganttex15.html
new file mode 100644
index 0000000000..4f890add12
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttex15.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$graph = new GanttGraph(0,0,"auto");
$graph->SetBox();
$graph->SetShadow();
// Add title and subtitle
$graph->title->Set("Example of captions");
$graph->title->SetFont(FF_ARIAL,FS_BOLD,12);
$graph->subtitle->Set("(ganttex15.php)");
// Show day, week and month scale
$graph->ShowHeaders(GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH);
// Use the short name of the month together with a 2 digit year
// on the month scale
$graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR2);
$graph->scale->month->SetFontColor("white");
$graph->scale->month->SetBackgroundColor("blue");
// 0 % vertical label margin
$graph->SetLabelVMarginFactor(1);
// Format the bar for the first activity
// ($row,$title,$startdate,$enddate)
$activity = new GanttBar(0,"Project","2001-12-21","2002-01-07","[50%]");
// Yellow diagonal line pattern on a red background
$activity->SetPattern(BAND_RDIAG,"yellow");
$activity->SetFillColor("red");
// Set absolute height
$activity->SetHeight(10);
// Specify progress to 60%
$activity->progress->Set(0.6);
$activity->progress->SetPattern(BAND_HVCROSS,"blue");
// Format the bar for the second activity
// ($row,$title,$startdate,$enddate)
$activity2 = new GanttBar(1,"Project","2001-12-21","2002-01-02","[30%]");
// Yellow diagonal line pattern on a red background
$activity2->SetPattern(BAND_RDIAG,"yellow");
$activity2->SetFillColor("red");
// Set absolute height
$activity2->SetHeight(10);
// Specify progress to 30%
$activity2->progress->Set(0.3);
$activity2->progress->SetPattern(BAND_HVCROSS,"blue");
// Finally add the bar to the graph
$graph->Add($activity);
$graph->Add($activity2);
// Add a vertical line
$vline = new GanttVLine("2001-12-24","Phase 1");
$vline->SetDayOffset(0.5);
//$graph->Add($vline);
// ... and display it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttex16.html b/html/includes/jpgraph/docs/html/exframes/ganttex16.html
new file mode 100644
index 0000000000..53a013f0c6
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttex16.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$graph = new GanttGraph(0,0,"auto");
$graph->SetBox();
$graph->SetShadow();
// Add title and subtitle
$graph->title->Set("Example of captions");
$graph->title->SetFont(FF_ARIAL,FS_BOLD,12);
$graph->subtitle->Set("(ganttex16.php)");
// Show day, week and month scale
$graph->ShowHeaders(GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH);
// Set table title
$graph->scale->tableTitle->Set("(Rev: 1.22)");
$graph->scale->tableTitle->SetFont(FF_FONT1,FS_BOLD);
$graph->scale->SetTableTitleBackground("silver");
$graph->scale->tableTitle->Show();
// Use the short name of the month together with a 2 digit year
// on the month scale
$graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR2);
$graph->scale->month->SetFontColor("white");
$graph->scale->month->SetBackgroundColor("blue");
// 0 % vertical label margin
$graph->SetLabelVMarginFactor(1);
// Format the bar for the first activity
// ($row,$title,$startdate,$enddate)
$activity = new GanttBar(0,"Project","2001-12-21","2002-01-07","[50%]");
// Yellow diagonal line pattern on a red background
$activity->SetPattern(BAND_RDIAG,"yellow");
$activity->SetFillColor("red");
// Set absolute height
$activity->SetHeight(10);
// Specify progress to 60%
$activity->progress->Set(0.6);
$activity->progress->SetPattern(BAND_HVCROSS,"blue");
// Format the bar for the second activity
// ($row,$title,$startdate,$enddate)
$activity2 = new GanttBar(1,"Project","2001-12-21","2002-01-02","[30%]");
// Yellow diagonal line pattern on a red background
$activity2->SetPattern(BAND_RDIAG,"yellow");
$activity2->SetFillColor("red");
// Set absolute height
$activity2->SetHeight(10);
// Specify progress to 30%
$activity2->progress->Set(0.3);
$activity2->progress->SetPattern(BAND_HVCROSS,"blue");
// Finally add the bar to the graph
$graph->Add($activity);
$graph->Add($activity2);
// Add a vertical line
$vline = new GanttVLine("2001-12-24","Phase 1");
$vline->SetDayOffset(0.5);
//$graph->Add($vline);
// ... and display it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttex17.html b/html/includes/jpgraph/docs/html/exframes/ganttex17.html
new file mode 100644
index 0000000000..bbca8cfdbb
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttex17.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$graph = new GanttGraph(0,0,"auto");
$graph->SetBox();
$graph->SetShadow();
// Add title and subtitle
$graph->title->Set("Example of captions");
$graph->title->SetFont(FF_ARIAL,FS_BOLD,12);
$graph->subtitle->Set("(ganttex17.php)");
// Show day, week and month scale
$graph->ShowHeaders(GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH);
// Set table title
$graph->scale->tableTitle->Set("(Rev: 1.22)");
$graph->scale->tableTitle->SetFont(FF_FONT1,FS_BOLD);
$graph->scale->SetTableTitleBackground("silver");
// Modify the appearance of the dividing lines
$graph->scale->divider->SetWeight(3);
$graph->scale->divider->SetColor("navy");
$graph->scale->dividerh->SetWeight(3);
$graph->scale->dividerh->SetColor("navy");
// Use the short name of the month together with a 2 digit year
// on the month scale
$graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR2);
$graph->scale->month->SetFontColor("white");
$graph->scale->month->SetBackgroundColor("blue");
// 0 % vertical label margin
$graph->SetLabelVMarginFactor(1);
// Format the bar for the first activity
// ($row,$title,$startdate,$enddate)
$activity = new GanttBar(0,"Project","2001-12-21","2002-01-07","[50%]");
// Yellow diagonal line pattern on a red background
$activity->SetPattern(BAND_RDIAG,"yellow");
$activity->SetFillColor("red");
// Set absolute height
$activity->SetHeight(10);
// Specify progress to 60%
$activity->progress->Set(0.6);
$activity->progress->SetPattern(BAND_HVCROSS,"blue");
// Format the bar for the second activity
// ($row,$title,$startdate,$enddate)
$activity2 = new GanttBar(1,"Project","2001-12-21","2002-01-02","[30%]");
// Yellow diagonal line pattern on a red background
$activity2->SetPattern(BAND_RDIAG,"yellow");
$activity2->SetFillColor("red");
// Set absolute height
$activity2->SetHeight(10);
// Specify progress to 30%
$activity2->progress->Set(0.3);
$activity2->progress->SetPattern(BAND_HVCROSS,"blue");
// Finally add the bar to the graph
$graph->Add($activity);
$graph->Add($activity2);
// Add a vertical line
$vline = new GanttVLine("2001-12-24","Phase 1");
$vline->SetDayOffset(0.5);
//$graph->Add($vline);
// ... and display it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttex18.html b/html/includes/jpgraph/docs/html/exframes/ganttex18.html
new file mode 100644
index 0000000000..e0b2e0d74b
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttex18.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$graph = new GanttGraph(0,0,"auto");
$graph->SetBox();
$graph->SetShadow();
// Add title and subtitle
$graph->title->Set("Example of captions");
$graph->title->SetFont(FF_ARIAL,FS_BOLD,12);
$graph->subtitle->Set("(ganttex18.php)");
// Show day, week and month scale
$graph->ShowHeaders(GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH);
// Set table title
$graph->scale->tableTitle->Set("(Rev: 1.22)");
$graph->scale->tableTitle->SetFont(FF_FONT1,FS_BOLD);
$graph->scale->SetTableTitleBackground("silver");
// Modify the appearance of the dividing lines
$graph->scale->divider->SetWeight(3);
$graph->scale->divider->SetColor("navy");
$graph->scale->dividerh->SetWeight(3);
$graph->scale->dividerh->SetColor("navy");
$graph->SetBox(true,"navy",3);
// Use the short name of the month together with a 2 digit year
// on the month scale
$graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR2);
$graph->scale->month->SetFontColor("white");
$graph->scale->month->SetBackgroundColor("blue");
// 0 % vertical label margin
$graph->SetLabelVMarginFactor(1);
// Format the bar for the first activity
// ($row,$title,$startdate,$enddate)
$activity = new GanttBar(0,"Project","2001-12-21","2002-01-07","[50%]");
// Yellow diagonal line pattern on a red background
$activity->SetPattern(BAND_RDIAG,"yellow");
$activity->SetFillColor("red");
// Set absolute height
$activity->SetHeight(10);
// Specify progress to 60%
$activity->progress->Set(0.6);
$activity->progress->SetPattern(BAND_HVCROSS,"blue");
// Format the bar for the second activity
// ($row,$title,$startdate,$enddate)
$activity2 = new GanttBar(1,"Project","2001-12-21","2002-01-02","[30%]");
// Yellow diagonal line pattern on a red background
$activity2->SetPattern(BAND_RDIAG,"yellow");
$activity2->SetFillColor("red");
// Set absolute height
$activity2->SetHeight(10);
// Specify progress to 30%
$activity2->progress->Set(0.3);
$activity2->progress->SetPattern(BAND_HVCROSS,"blue");
// Finally add the bar to the graph
$graph->Add($activity);
$graph->Add($activity2);
// Add a vertical line
$vline = new GanttVLine("2001-12-24","Phase 1");
$vline->SetDayOffset(0.5);
//$graph->Add($vline);
// ... and display it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttex19.html b/html/includes/jpgraph/docs/html/exframes/ganttex19.html
new file mode 100644
index 0000000000..64054009fb
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttex19.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$graph = new GanttGraph(0,0,"auto");
$graph->SetBox();
$graph->SetShadow();
// Use swedish locale
$graph->scale->SetDateLocale("sv_SE");
// Add title and subtitle
$graph->title->Set("Example of captions");
$graph->title->SetFont(FF_ARIAL,FS_BOLD,12);
$graph->subtitle->Set("(ganttex19.php)");
// Show day, week and month scale
$graph->ShowHeaders(GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH);
// Set table title
$graph->scale->tableTitle->Set("(Rev: 1.22)");
$graph->scale->tableTitle->SetFont(FF_FONT1,FS_BOLD);
$graph->scale->SetTableTitleBackground("silver");
$graph->scale->tableTitle->Show();
$graph->scale->divider->SetStyle('solid');
$graph->scale->divider->SetWeight(2);
$graph->scale->divider->SetColor('black');
$graph->SetBox(true,"navy",2);
// Use the short name of the month together with a 2 digit year
// on the month scale
$graph->scale->month->SetStyle(MONTHSTYLE_SHORTNAMEYEAR2);
$graph->scale->month->SetFontColor("white");
$graph->scale->month->SetBackgroundColor("blue");
// 0 % vertical label margin
$graph->SetLabelVMarginFactor(1);
// Format the bar for the first activity
// ($row,$title,$startdate,$enddate)
$activity = new GanttBar(0,"Project","2001-12-21","2002-01-07","[50%]");
// Yellow diagonal line pattern on a red background
$activity->SetPattern(BAND_RDIAG,"yellow");
$activity->SetFillColor("red");
// Set absolute height
$activity->SetHeight(10);
// Specify progress to 60%
$activity->progress->Set(0.6);
$activity->progress->SetPattern(BAND_HVCROSS,"blue");
// Format the bar for the second activity
// ($row,$title,$startdate,$enddate)
$activity2 = new GanttBar(1,"Project","2001-12-21","2002-01-02","[30%]");
// Yellow diagonal line pattern on a red background
$activity2->SetPattern(BAND_RDIAG,"yellow");
$activity2->SetFillColor("red");
// Set absolute height
$activity2->SetHeight(10);
// Specify progress to 30%
$activity2->progress->Set(0.3);
$activity2->progress->SetPattern(BAND_HVCROSS,"blue");
// Finally add the bar to the graph
$graph->Add($activity);
$graph->Add($activity2);
// Add a vertical line
$vline = new GanttVLine("2001-12-24","Phase 1");
$vline->SetDayOffset(0.5);
//$graph->Add($vline);
// ... and display it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/gantthgridex1.html b/html/includes/jpgraph/docs/html/exframes/gantthgridex1.html
new file mode 100644
index 0000000000..c2cda1db18
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/gantthgridex1.html
@@ -0,0 +1,3 @@
+
+<?php
// Gantt horizontal grid example
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
// Some dummy data for some activities
$data = array(
array(0,"Group 1 Johan", "2001-10-23","2001-11-06",FF_FONT1,FS_BOLD,8),
array(1," Label 2", "2001-10-26","2001-11-04"),
array(3,"Group 2", "2001-11-20","2001-11-28",FF_FONT1,FS_BOLD,8),
array(4," Label 1", "2001-11-20","2001-12-1"));
// New Gantt Graph
$graph = new GanttGraph(500);
// Setup a title
$graph->title->Set("Grid example");
$graph->subtitle->Set("(Horizontal grid)");
$graph->title->SetFont(FF_VERDANA,FS_NORMAL,14);
// Specify what headers to show
$graph->ShowHeaders(GANTT_HMONTH|GANTT_HDAY );
$graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY);
$graph->scale->week->SetFont(FF_FONT0);
// Setup a horizontal grid
$graph->hgrid->Show();
$graph->hgrid->SetRowFillColor('darkblue@0.9');
for($i=0; $i<count($data); ++$i) {
$bar = new GanttBar($data[$i][0],$data[$i][1],$data[$i][2],$data[$i][3],"[5%]",10);
if( count($data[$i]) > 4 )
$bar->title->SetFont($data[$i][4],$data[$i][5],$data[$i][6]);
$bar->SetPattern(BAND_RDIAG,"yellow");
$bar->SetFillColor("red");
$graph->Add($bar);
}
// Setup a vertical marker line
$vline = new GanttVLine("2001-11-01");
$vline->SetDayOffset(0.5);
$vline->title->Set("2001-11-01");
$vline->title->SetFont(FF_FONT1,FS_BOLD,10);
$graph->Add($vline);
// Setup a milestone
$ms = new MileStone(6,"M5","2001-11-28","28/12");
$ms->title->SetFont(FF_FONT1,FS_BOLD);
$graph->Add($ms);
// And to show that you can also add an icon we add "Tux"
$icon = new IconPlot('penguin.png',0.01,0.95,1,15);
$icon->SetAnchor('left','bottom');
$graph->Add($icon);
// .. and finally send it back to the browser
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/gantthourex1.html b/html/includes/jpgraph/docs/html/exframes/gantthourex1.html
new file mode 100644
index 0000000000..6e1fa8d3f7
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/gantthourex1.html
@@ -0,0 +1,3 @@
+
+<?php
// Gantt hour example
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
$graph = new GanttGraph();
$graph->SetMarginColor('blue:1.7');
$graph->SetColor('white');
$graph->SetBackgroundGradient('navy','white',GRAD_HOR,BGRAD_MARGIN);
$graph->scale->hour->SetBackgroundColor('lightyellow:1.5');
$graph->scale->hour->SetFont(FF_FONT1);
$graph->scale->day->SetBackgroundColor('lightyellow:1.5');
$graph->scale->day->SetFont(FF_FONT1,FS_BOLD);
$graph->title->Set("Example of hours in scale");
$graph->title->SetColor('white');
$graph->title->SetFont(FF_VERDANA,FS_BOLD,14);
$graph->ShowHeaders(GANTT_HDAY | GANTT_HHOUR);
$graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY);
$graph->scale->week->SetFont(FF_FONT1);
$graph->scale->hour->SetIntervall(4);
$graph->scale->hour->SetStyle(HOURSTYLE_HM24);
$graph->scale->day->SetStyle(DAYSTYLE_SHORTDAYDATE3);
$data = array(
array(0," Label 1", "2001-01-26 04:00","2001-01-26 14:00"),
array(1," Label 2", "2001-01-26 10:00","2001-01-26 18:00"),
array(2," Label 3", "2001-01-26","2001-01-27 10:00")
);
for($i=0; $i<count($data); ++$i) {
$bar = new GanttBar($data[$i][0],$data[$i][1],$data[$i][2],$data[$i][3],"[5%]",10);
if( count($data[$i])>4 )
$bar->title->SetFont($data[$i][4],$data[$i][5],$data[$i][6]);
$bar->SetPattern(BAND_RDIAG,"yellow");
$bar->SetFillColor("red");
$graph->Add($bar);
}
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/gantthourminex1.html b/html/includes/jpgraph/docs/html/exframes/gantthourminex1.html
new file mode 100644
index 0000000000..08c24d241c
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/gantthourminex1.html
@@ -0,0 +1,3 @@
+
+<?php
// Gantt hour + minute example
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
// Some sample Gantt data
$data = array(
array(0,array("Group 1","345 days","2004-03-01","2004-05-05"), "2001-11-27 10:00","2001-11-27 14:00",FF_FONT2,FS_NORMAL,0),
array(1,array(" Label one",' 122,5 days',' 2004-03-01',' 2003-05-05','MJ'), "2001-11-27 16:00","2001-11-27 18:00"),
array(2," Label two", "2001-11-27","2001-11-27 10:00"),
array(3," Label three", "2001-11-27","2001-11-27 08:00")
);
// Basic graph parameters
$graph = new GanttGraph();
$graph->SetMarginColor('darkgreen@0.8');
$graph->SetColor('white');
// We want to display day, hour and minute scales
$graph->ShowHeaders(GANTT_HDAY | GANTT_HHOUR | GANTT_HMIN);
// We want to have the following titles in our columns
// describing each activity
$graph->scale->actinfo->SetColTitles(
array('Act','Duration','Start','Finish','Resp'));//,array(100,70,70,70));
// Uncomment the following line if you don't want the 3D look
// in the columns headers
//$graph->scale->actinfo->SetStyle(ACTINFO_2D);
$graph->scale->actinfo->SetFont(FF_ARIAL,FS_NORMAL,10);
//These are the default values for use in the columns
//$graph->scale->actinfo->SetFontColor('black');
//$graph->scale->actinfo->SetBackgroundColor('lightgray');
//$graph->scale->actinfo->vgrid->SetStyle('solid');
$graph->scale->actinfo->vgrid->SetColor('gray');
$graph->scale->actinfo->SetColor('darkgray');
// Setup day format
$graph->scale->day->SetBackgroundColor('lightyellow:1.5');
$graph->scale->day->SetFont(FF_ARIAL);
$graph->scale->day->SetStyle(DAYSTYLE_SHORTDAYDATE1);
// Setup hour format
$graph->scale->hour->SetIntervall(1);
$graph->scale->hour->SetBackgroundColor('lightyellow:1.5');
$graph->scale->hour->SetFont(FF_FONT0);
$graph->scale->hour->SetStyle(HOURSTYLE_H24);
$graph->scale->hour->grid->SetColor('gray:0.8');
// Setup minute format
$graph->scale->minute->SetIntervall(30);
$graph->scale->minute->SetBackgroundColor('lightyellow:1.5');
$graph->scale->minute->SetFont(FF_FONT0);
$graph->scale->minute->SetStyle(MINUTESTYLE_MM);
$graph->scale->minute->grid->SetColor('lightgray');
$graph->scale->tableTitle->Set('Phase 1');
$graph->scale->tableTitle->SetFont(FF_ARIAL,FS_NORMAL,12);
$graph->scale->SetTableTitleBackground('darkgreen@0.6');
$graph->scale->tableTitle->Show(true);
$graph->title->Set("Example of hours & mins scale");
$graph->title->SetColor('darkgray');
$graph->title->SetFont(FF_VERDANA,FS_BOLD,14);
for($i=0; $i<count($data); ++$i) {
$bar = new GanttBar($data[$i][0],$data[$i][1],$data[$i][2],$data[$i][3]);
if( count($data[$i])>4 )
$bar->title->SetFont($data[$i][4],$data[$i][5],$data[$i][6]);
$bar->SetPattern(BAND_RDIAG,"yellow");
$bar->SetFillColor("gray");
$graph->Add($bar);
}
$vline = new GanttVLine("2001-11-27 13:00");
$vline->title->Set("27/11 13:00");
$vline->title->SetFont(FF_FONT1,FS_BOLD,10);
$graph->Add($vline);
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/gantticonex1.html b/html/includes/jpgraph/docs/html/exframes/gantticonex1.html
new file mode 100644
index 0000000000..4f9a08832c
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/gantticonex1.html
@@ -0,0 +1,3 @@
+
+<?php
// Gantt example
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
// Basic Gantt graph
$graph = new GanttGraph();
$graph->title->Set("Using the builtin icons");
// Explicitely set the date range
// (Autoscaling will of course also work)
$graph->SetDateRange('2001-10-06','2002-4-10');
// 1.5 line spacing to make more room
$graph->SetVMarginFactor(1.5);
// Setup some nonstandard colors
$graph->SetMarginColor('lightgreen@0.8');
$graph->SetBox(true,'yellow:0.6',2);
$graph->SetFrame(true,'darkgreen',4);
$graph->scale->divider->SetColor('yellow:0.6');
$graph->scale->dividerh->SetColor('yellow:0.6');
// Display month and year scale with the gridlines
$graph->ShowHeaders(GANTT_HMONTH | GANTT_HYEAR);
$graph->scale->month->grid->SetColor('gray');
$graph->scale->month->grid->Show(true);
$graph->scale->year->grid->SetColor('gray');
$graph->scale->year->grid->Show(true);
// For the titles we also add a minimum width of 100 pixels for the Task name column
$graph->scale->actinfo->SetColTitles(
array('Note','Task','Duration','Start','Finish'),array(30,100));
$graph->scale->actinfo->SetBackgroundColor('green:0.5@0.5');
$graph->scale->actinfo->SetFont(FF_ARIAL,FS_NORMAL,10);
$graph->scale->actinfo->vgrid->SetStyle('solid');
$graph->scale->actinfo->vgrid->SetColor('gray');
// Uncomment this to keep the columns but show no headers
//$graph->scale->actinfo->Show(false);
// Setup the icons we want to use
$erricon = new IconImage(GICON_FOLDER,0.6);
$startconicon = new IconImage(GICON_FOLDEROPEN,0.6);
$endconicon = new IconImage(GICON_TEXTIMPORTANT,0.5);
// Store the icons in the first column and use plain text in the others
$data = array(
array(0,array($erricon,"Pre-study","102 days","23 Nov '01","1 Mar '02")
, "2001-11-23","2002-03-1",FF_ARIAL,FS_NORMAL,8),
array(1,array($startconicon,"Prototype","21 days","26 Oct '01","16 Nov '01"),
"2001-10-26","2001-11-16",FF_ARIAL,FS_NORMAL,8),
array(2,array($endconicon,"Report","12 days","1 Mar '02","13 Mar '02"),
"2002-03-01","2002-03-13",FF_ARIAL,FS_NORMAL,8)
);
// Create the bars and add them to the gantt chart
for($i=0; $i<count($data); ++$i) {
$bar = new GanttBar($data[$i][0],$data[$i][1],$data[$i][2],$data[$i][3],"[50%]",10);
if( count($data[$i])>4 )
$bar->title->SetFont($data[$i][4],$data[$i][5],$data[$i][6]);
$bar->SetPattern(BAND_RDIAG,"yellow");
$bar->SetFillColor("gray");
$bar->progress->Set(0.5);
$bar->progress->SetPattern(GANTT_SOLID,"darkgreen");
$bar->title->SetCSIMTarget(array('#1'.$i,'#2'.$i,'#3'.$i,'#4'.$i,'#5'.$i),array('11'.$i,'22'.$i,'33'.$i));
$graph->Add($bar);
}
// Output the chart
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/ganttsimpleex1.html b/html/includes/jpgraph/docs/html/exframes/ganttsimpleex1.html
new file mode 100644
index 0000000000..8702c10a73
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/ganttsimpleex1.html
@@ -0,0 +1,3 @@
+
+<?php
// Gantt example
include ("../jpgraph.php");
include ("../jpgraph_gantt.php");
//
// The data for the graphs
//
$data = array(
array(0,ACTYPE_GROUP, "Phase 1", "2001-10-26","2001-11-23",''),
array(1,ACTYPE_NORMAL, " Label 2", "2001-10-26","2001-11-13",'[KJ]'),
array(2,ACTYPE_NORMAL, " Label 3", "2001-11-20","2001-11-22",'[EP]'),
array(3,ACTYPE_MILESTONE," Phase 1 Done", "2001-11-23",'M2') );
// Create the basic graph
$graph = new GanttGraph();
$graph->title->Set("Gantt Graph using CreateSimple()");
// Setup scale
$graph->ShowHeaders(GANTT_HYEAR | GANTT_HMONTH | GANTT_HDAY | GANTT_HWEEK);
$graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY);
// Add the specified activities
$graph->CreateSimple($data);
// .. and stroke the graph
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/gradbkgex1.html b/html/includes/jpgraph/docs/html/exframes/gradbkgex1.html
new file mode 100644
index 0000000000..e03fbb55cb
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/gradbkgex1.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$datay1 = array(4,26,12,18,8,22);
$datay2 = array(12,9,42,8,20,19);
// Setup the graph
$graph = new Graph(300,200);
$graph->SetMarginColor('white');
$graph->SetScale("textlin",0,50);
$graph->SetMargin(30,50,30,30);
// We must have the frame enabled to get the gradient
// However, we don't want the frame line so we set it to
// white color which makes it invisible.
$graph->SetFrame(true,'white');
// Setup a background gradient image
$graph->SetBackgroundGradient('blue','navy:0.5',GRAD_HOR,BGRAD_PLOT);
// Setup the tab title
$graph->tabtitle->Set(' 3rd Division ' );
$graph->tabtitle->SetFont(FF_ARIAL,FS_BOLD,13);
// Setup x,Y grid
$graph->xgrid->Show();
$graph->xgrid->SetColor('gray@0.5');
$graph->xaxis->SetTickLabels($gDateLocale->GetShortMonth());
$graph->ygrid->SetColor('gray@0.5');
// Setup color for axis and labels on axis
$graph->xaxis->SetColor('orange','black');
$graph->yaxis->SetColor('orange','black');
// Ticks on the outsid
$graph->xaxis->SetTickSide(SIDE_DOWN);
$graph->yaxis->SetTickSide(SIDE_LEFT);
// Setup the legend box colors and font
$graph->legend->SetColor('white','navy');
$graph->legend->SetFillColor('navy@0.25');
$graph->legend->SetFont(FF_ARIAL,FS_BOLD,8);
$graph->legend->SetShadow('darkgray@0.4',3);
$graph->legend->SetPos(0.05,0.05,'right','top');
// Create the first line
$p1 = new LinePlot($datay1);
$p1->SetColor("red");
$p1->SetWeight(2);
$p1->SetLegend('2002');
$graph->Add($p1);
// Create the second line
$p2 = new LinePlot($datay2);
$p2->SetColor("lightyellow");
$p2->SetLegend('2001');
$p2->SetWeight(2);
$graph->Add($p2);
// Output line
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/horizbarex1.html b/html/includes/jpgraph/docs/html/exframes/horizbarex1.html
new file mode 100644
index 0000000000..78e5502c17
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/horizbarex1.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(2,3,5,8,12,6,3);
$datax=array("Jan","Feb","Mar","Apr","May","Jun","Jul");
// Size of graph
$width=400;
$height=500;
// Set the basic parameters of the graph
$graph = new Graph($width,$height,'auto');
$graph->SetScale("textlin");
// Rotate graph 90 degrees and set margin
$graph->Set90AndMargin(50,20,50,30);
// Nice shadow
$graph->SetShadow();
// Setup title
$graph->title->Set("Horizontal bar graph ex 1");
$graph->title->SetFont(FF_VERDANA,FS_BOLD,14);
$graph->subtitle->Set("(No Y-axis)");
// Setup X-axis
$graph->xaxis->SetTickLabels($datax);
$graph->xaxis->SetFont(FF_VERDANA,FS_NORMAL,12);
// Some extra margin looks nicer
$graph->xaxis->SetLabelMargin(10);
// Label align for X-axis
$graph->xaxis->SetLabelAlign('right','center');
// Add some grace to y-axis so the bars doesn't go
// all the way to the end of the plot area
$graph->yaxis->scale->SetGrace(20);
// We don't want to display Y-axis
$graph->yaxis->Hide();
// Now create a bar pot
$bplot = new BarPlot($datay);
$bplot->SetFillColor("orange");
$bplot->SetShadow();
//You can change the width of the bars if you like
//$bplot->SetWidth(0.5);
// We want to display the value of each bar at the top
$bplot->value->Show();
$bplot->value->SetFont(FF_ARIAL,FS_BOLD,12);
$bplot->value->SetAlign('left','center');
$bplot->value->SetColor("black","darkred");
$bplot->value->SetFormat('%.1f mkr');
// Add the bar to the graph
$graph->Add($bplot);
// .. and stroke the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/horizbarex2.html b/html/includes/jpgraph/docs/html/exframes/horizbarex2.html
new file mode 100644
index 0000000000..c0c14953e0
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/horizbarex2.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(2,3,5,8,12,6,3);
$datax=array("Jan","Feb","Mar","Apr","May","Jun","Jul");
$width=400;
$height=500;
// Set the basic parameters of the graph
$graph = new Graph($width,$height,'auto');
$graph->SetScale("textlin");
$top = 80;
$bottom = 30;
$left = 50;
$right = 30;
$graph->Set90AndMargin($left,$right,$top,$bottom);
// Nice shadow
$graph->SetShadow();
// Setup title
$graph->title->Set("Horizontal bar graph ex 2");
$graph->title->SetFont(FF_VERDANA,FS_BOLD,14);
$graph->subtitle->Set("(Axis at top)");
// Setup X-axis
$graph->xaxis->SetTickLabels($datax);
$graph->xaxis->SetFont(FF_VERDANA,FS_NORMAL,12);
// Some extra margin looks nicer
$graph->xaxis->SetLabelMargin(5);
// Label align for X-axis
$graph->xaxis->SetLabelAlign('right','center');
// Add some grace to y-axis so the bars doesn't go
// all the way to the end of the plot area
$graph->yaxis->scale->SetGrace(20);
$graph->yaxis->SetLabelAlign('center','bottom');
$graph->yaxis->SetLabelAngle(45);
$graph->yaxis->SetLabelFormat('%d');
$graph->yaxis->SetFont(FF_VERDANA,FS_NORMAL,12);
// We don't want to display Y-axis
//$graph->yaxis->Hide();
// Now create a bar pot
$bplot = new BarPlot($datay);
$bplot->SetFillColor("orange");
$bplot->SetShadow();
//You can change the width of the bars if you like
//$bplot->SetWidth(0.5);
// We want to display the value of each bar at the top
$bplot->value->Show();
$bplot->value->SetFont(FF_ARIAL,FS_BOLD,12);
$bplot->value->SetAlign('left','center');
$bplot->value->SetColor("black","darkred");
$bplot->value->SetFormat('%.1f mkr');
// Add the bar to the graph
$graph->Add($bplot);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/horizbarex3.html b/html/includes/jpgraph/docs/html/exframes/horizbarex3.html
new file mode 100644
index 0000000000..3e9126454e
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/horizbarex3.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(2,3,-5,8,12,6,3);
$datax=array("Jan","Feb","Mar","Apr","May","Jun","Jul");
// Size of graph
$width=400;
$height=500;
// Set the basic parameters of the graph
$graph = new Graph($width,$height,'auto');
$graph->SetScale("textlin");
$top = 50;
$bottom = 80;
$left = 50;
$right = 20;
$graph->Set90AndMargin($left,$right,$top,$bottom);
$graph->xaxis->SetPos('min');
// Nice shadow
$graph->SetShadow();
// Setup title
$graph->title->Set("Horizontal bar graph ex 3");
$graph->title->SetFont(FF_VERDANA,FS_BOLD,14);
$graph->subtitle->Set("(Axis at bottom)");
// Setup X-axis
$graph->xaxis->SetTickLabels($datax);
$graph->xaxis->SetFont(FF_FONT2,FS_BOLD,12);
// Some extra margin looks nicer
$graph->xaxis->SetLabelMargin(5);
// Label align for X-axis
$graph->xaxis->SetLabelAlign('right','center');
// Add some grace to y-axis so the bars doesn't go
// all the way to the end of the plot area
$graph->yaxis->scale->SetGrace(20);
// Setup the Y-axis to be displayed in the bottom of the
// graph. We also finetune the exact layout of the title,
// ticks and labels to make them look nice.
$graph->yaxis->SetPos('max');
// First make the labels look right
$graph->yaxis->SetLabelAlign('center','top');
$graph->yaxis->SetLabelFormat('%d');
$graph->yaxis->SetLabelSide(SIDE_RIGHT);
// The fix the tick marks
$graph->yaxis->SetTickSide(SIDE_LEFT);
// Finally setup the title
$graph->yaxis->SetTitleSide(SIDE_RIGHT);
$graph->yaxis->SetTitleMargin(35);
// To align the title to the right use :
$graph->yaxis->SetTitle('Turnaround 2002','high');
$graph->yaxis->title->Align('right');
// To center the title use :
//$graph->yaxis->SetTitle('Turnaround 2002','center');
//$graph->yaxis->title->Align('center');
$graph->yaxis->title->SetFont(FF_ARIAL,FS_BOLD,12);
$graph->yaxis->title->SetAngle(0);
$graph->yaxis->SetFont(FF_FONT2,FS_NORMAL);
// If you want the labels at an angle other than 0 or 90
// you need to use TTF fonts
//$graph->yaxis->SetLabelAngle(0);
// Now create a bar pot
$bplot = new BarPlot($datay);
$bplot->SetFillColor("orange");
$bplot->SetShadow();
//You can change the width of the bars if you like
//$bplot->SetWidth(0.5);
// We want to display the value of each bar at the top
$bplot->value->Show();
$bplot->value->SetFont(FF_ARIAL,FS_BOLD,12);
$bplot->value->SetAlign('left','center');
$bplot->value->SetColor("black","darkred");
$bplot->value->SetFormat('%.1f mkr');
// Add the bar to the graph
$graph->Add($bplot);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/horizbarex4.html b/html/includes/jpgraph/docs/html/exframes/horizbarex4.html
new file mode 100644
index 0000000000..2e003278a4
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/horizbarex4.html
@@ -0,0 +1,4 @@
+
+<?php
// $Id: horizbarex4.php,v 1.4 2002/11/17 23:59:27 aditus Exp $
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(1992,1993,1995,1996,1997,1998,2001);
// Size of graph
$width=400;
$height=500;
// Set the basic parameters of the graph
$graph = new Graph($width,$height,'auto');
$graph->SetScale("textlin");
$top = 60;
$bottom = 30;
$left = 80;
$right = 30;
$graph->Set90AndMargin($left,$right,$top,$bottom);
// Nice shadow
$graph->SetShadow();
// Setup labels
$lbl = array("Andrew\nTait","Thomas\nAnderssen","Kevin\nSpacey","Nick\nDavidsson",
"David\nLindquist","Jason\nTait","Lorin\nPersson");
$graph->xaxis->SetTickLabels($lbl);
// Label align for X-axis
$graph->xaxis->SetLabelAlign('right','center','right');
// Label align for Y-axis
$graph->yaxis->SetLabelAlign('center','bottom');
// Titles
$graph->title->Set('Year Married');
// Create a bar pot
$bplot = new BarPlot($datay);
$bplot->SetFillColor("orange");
$bplot->SetWidth(0.5);
$bplot->SetYMin(1990);
$graph->Add($bplot);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/image_JpGraph_Logo.html b/html/includes/jpgraph/docs/html/exframes/image_JpGraph_Logo.html
new file mode 100644
index 0000000000..3058d7e112
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/image_JpGraph_Logo.html
@@ -0,0 +1 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
include ("../jpgraph_scatter.php");
$datay1 = array(4,26,15,44);
// Setup the graph
$graph = new Graph(300,200);
$graph->SetMarginColor('white');
$graph->SetScale("textlin");
$graph->SetFrame(false);
$graph->SetMargin(30,5,25,20);
// Setup the tab
$graph->tabtitle->Set(' Year 2003 ' );
$graph->tabtitle->SetFont(FF_ARIAL,FS_BOLD,13);
$graph->tabtitle->SetColor('darkred','#E1E1FF');
// Enable X-grid as well
$graph->xgrid->Show();
// Use months as X-labels
$graph->xaxis->SetTickLabels($gDateLocale->GetShortMonth());
// Create the plot
$p1 = new LinePlot($datay1);
$p1->SetColor("navy");
$p1->SetCSIMTargets(array('#1','#2','#3','#4','#5'));
// Use an image of favourite car as
$p1->mark->SetType(MARK_IMG,'saab_95.jpg',0.5);
//$p1->mark->SetType(MARK_SQUARE);
// Displayes value on top of marker image
$p1->value->SetFormat('%d mil');
$p1->value->Show();
$p1->value->SetColor('darkred');
$p1->value->SetFont(FF_ARIAL,FS_BOLD,10);
// Increase the margin so that the value is printed avove tje
// img marker
$p1->value->SetMargin(14);
// Incent the X-scale so the first and last point doesn't
// fall on the edges
$p1->SetCenter();
$graph->Add($p1);
$graph->StrokeCSIM('imgmarkercsimex1.php');
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/imgmarkerex1.html b/html/includes/jpgraph/docs/html/exframes/imgmarkerex1.html
new file mode 100644
index 0000000000..bd070a7182
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/imgmarkerex1.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
include ("../jpgraph_scatter.php");
$datay1 = array(4,26,15,44);
// Setup the graph
$graph = new Graph(300,200);
$graph->SetMarginColor('white');
$graph->SetScale("textlin");
$graph->SetFrame(false);
$graph->SetMargin(30,5,25,20);
// Setup the tab
$graph->tabtitle->Set(' Year 2003 ' );
$graph->tabtitle->SetFont(FF_ARIAL,FS_BOLD,13);
$graph->tabtitle->SetColor('darkred','#E1E1FF');
// Enable X-grid as well
$graph->xgrid->Show();
// Use months as X-labels
$graph->xaxis->SetTickLabels($gDateLocale->GetShortMonth());
// Create the plot
$p1 = new LinePlot($datay1);
$p1->SetColor("navy");
// Use an image of favourite car as marker
$p1->mark->SetType(MARK_IMG,'saab_95.jpg',0.5);
// Displayes value on top of marker image
$p1->value->SetFormat('%d mil');
$p1->value->Show();
$p1->value->SetColor('darkred');
$p1->value->SetFont(FF_ARIAL,FS_BOLD,10);
// Increase the margin so that the value is printed avove tje
// img marker
$p1->value->SetMargin(14);
// Incent the X-scale so the first and last point doesn't
// fall on the edges
$p1->SetCenter();
$graph->Add($p1);
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/impulsex1.html b/html/includes/jpgraph/docs/html/exframes/impulsex1.html
new file mode 100644
index 0000000000..075c0e9ff2
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/impulsex1.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_scatter.php");
$datay = array(20,22,12,13,17,20,16,19,30,31,40,43);
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
$graph->SetShadow();
$graph->img->SetMargin(40,40,40,40);
$graph->title->Set("Simple mpuls plot");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$sp1 = new ScatterPlot($datay);
$sp1->mark->SetType(MARK_SQUARE);
$sp1->SetImpuls();
$graph->Add($sp1);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/impulsex2.html b/html/includes/jpgraph/docs/html/exframes/impulsex2.html
new file mode 100644
index 0000000000..3fe23929d8
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/impulsex2.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_scatter.php");
$datay = array(20,22,12,13,17,20,16,19,30,31,40,43);
$graph = new Graph(300,200,"auto");
$graph->SetScale("textlin");
$graph->SetShadow();
$graph->img->SetMargin(40,40,40,40);
$graph->title->Set("Impuls plot, variant 2");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->Set("Impuls respons");
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$sp1 = new ScatterPlot($datay);//,$datax);
$sp1->mark->SetType(MARK_FILLEDCIRCLE);
$sp1->mark->SetFillColor("red");
$sp1->mark->SetWidth(4);
$sp1->SetImpuls();
$sp1->SetColor("blue");
$sp1->SetWeight(3);
$graph->Add($sp1);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/impulsex3.html b/html/includes/jpgraph/docs/html/exframes/impulsex3.html
new file mode 100644
index 0000000000..b478d6da94
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/impulsex3.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_scatter.php");
$numpoints=50;
$k=0.05;
// Create some data points
for($i=0; $i<$numpoints; ++$i) {
$datay[$i]=exp(-$k*$i)*cos(2*M_PI/10*$i);
}
// A format callbakc function
function mycallback($l) {
return sprintf("%02.2f",$l);
}
// Setup the basic parameters for the graph
$graph = new Graph(400,200,"auto");
$graph->SetScale("intlin");
$graph->SetShadow();
$graph->SetBox();
$graph->title->Set("Impuls Example 3");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
// Set format callback for labels
$graph->yaxis->SetLabelFormatCallback("mycallback");
// Set X-axis at the minimum value of Y-axis (default will be at 0)
$graph->xaxis->SetPos("min"); // "min" will position the x-axis at the minimum value of the Y-axis
// Extend the margin for the labels on the Y-axis and reverse the direction
// of the ticks on the Y-axis
$graph->yaxis->SetLabelMargin(12);
$graph->xaxis->SetLabelMargin(6);
$graph->yaxis->SetTickSide(SIDE_LEFT);
$graph->xaxis->SetTickSide(SIDE_DOWN);
// Create a new impuls type scatter plot
$sp1 = new ScatterPlot($datay);
$sp1->mark->SetType(MARK_SQUARE);
$sp1->mark->SetFillColor("red");
$sp1->SetImpuls();
$sp1->SetColor("blue");
$sp1->SetWeight(1);
$sp1->mark->SetWidth(3);
$graph->Add($sp1);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/impulsex4.html b/html/includes/jpgraph/docs/html/exframes/impulsex4.html
new file mode 100644
index 0000000000..57f8e4e331
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/impulsex4.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_scatter.php");
include ("../jpgraph_line.php");
$numpoints=50;
$k=0.05;
// Create some data points
for($i=-$numpoints+1; $i<0; ++$i) {
$datay[$i+$numpoints-1]=exp($k*$i)*cos(2*M_PI/10*$i)*14;
$datayenv[$i+$numpoints-1]=exp($k*$i)*14;
$datax[$i+$numpoints-1]=$i;
}
for($i=0; $i<$numpoints; ++$i) {
$datay[$i+$numpoints-1]=exp(-$k*$i)*cos(2*M_PI/10*$i)*14;
$datayenv[$i+$numpoints-1]=exp(-$k*$i)*14;
$datax[$i+$numpoints-1]=$i;
}
// Setup the basic parameters for the graph
$graph = new Graph(500,250,"auto");
$graph->SetScale("intlin");
$graph->SetShadow();
$graph->SetBox();
$graph->title->Set("Impuls Example 4");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
// Set some other color then the boring default
$graph->SetColor("lightyellow");
$graph->SetMarginColor("khaki");
// Set legend box specification
$graph->legend->SetFillColor("white");
$graph->legend->SetLineWeight(2);
// Set X-axis at the minimum value of Y-axis (default will be at 0)
$graph->xaxis->SetPos("min"); // "min" will position the x-axis at the minimum value of the Y-axis
// Extend the margin for the labels on the Y-axis and reverse the direction
// of the ticks on the Y-axis
$graph->yaxis->SetLabelMargin(12);
$graph->xaxis->SetLabelMargin(6);
$graph->yaxis->SetTickSide(SIDE_LEFT);
$graph->xaxis->SetTickSide(SIDE_DOWN);
// Add mark graph with static lines
$line = new PlotLine(HORIZONTAL,0,"black",2);
$graph->AddLine($line);
// Create a new impuls type scatter plot
$sp1 = new ScatterPlot($datay,$datax);
$sp1->mark->SetType(MARK_SQUARE);
$sp1->mark->SetFillColor("red");
$sp1->mark->SetWidth(3);
$sp1->SetImpuls();
$sp1->SetColor("blue");
$sp1->SetWeight(1);
$sp1->SetLegend("Non-causal signal");
$graph->Add($sp1);
// Create the envelope plot
$ep1 = new LinePlot($datayenv,$datax);
$ep1->SetStyle("dotted");
$ep1->SetLegend("Positive envelope");
$graph->Add($ep1);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/inyaxisex2.html b/html/includes/jpgraph/docs/html/exframes/inyaxisex2.html
new file mode 100644
index 0000000000..d2ac099318
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/inyaxisex2.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
// Callback to negate the argument
function _cb_negate($aVal) {
return round(-$aVal);
}
// A fake depth curve
$ydata = array(0,1,4,5,8,9,10,14,16,16,16,18,20,20,20,22,22.5,22,19,19,15,15,15,15,10,10,10,6,5,5,5,4,4,2,1,0);
// Negate all data
$n = count($ydata);
for($i=0; $i<$n; ++$i) {
$ydata[$i] = round(-$ydata[$i]);
}
// Basic graph setup
$graph = new Graph(400,300,"auto");
$graph->SetScale("linlin");
$graph->img->SetMargin(50,50,60,40);
$graph->SetMarginColor('darkblue');
$graph->SetColor('darkblue');
$graph->SetAxisStyle(AXSTYLE_BOXOUT);
$graph->SetBackgroundImage("blueblack400x300grad.png",1);
//$graph->SetBackgroundImage("lightbluedarkblue400x300grad.png",1);
$graph->title->Set("Depth curve. Dive #2");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->title->SetColor("white");
$graph->subtitle->Set("(Negated Y-axis)");
$graph->subtitle->SetFont(FF_FONT1,FS_NORMAL);
$graph->subtitle->SetColor("white");
// Setup axis
$graph->yaxis->SetLabelFormatCallback("_cb_negate");
$graph->xaxis->SetColor("lightblue","white");
$graph->yaxis->SetColor("lightblue","white");
$graph->ygrid->SetColor("blue");
$lp1 = new LinePlot($ydata);
$lp1->SetColor("yellow");
$lp1->SetWeight(2);
$graph->Add($lp1);
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/linebarcentex1.html b/html/includes/jpgraph/docs/html/exframes/linebarcentex1.html
new file mode 100644
index 0000000000..35eb4d3433
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/linebarcentex1.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
include ("../jpgraph_bar.php");
$l1datay = array(11,9,2,4,3,13,17);
$l2datay = array(23,12,5,19,17,10,15);
$datax=$gDateLocale->GetShortMonth();
// Create the graph.
$graph = new Graph(400,200,"auto");
$graph->SetScale("textlin");
$graph->SetMargin(40,130,20,40);
$graph->SetShadow();
$graph->xaxis->SetTickLabels($datax);
// Create the linear error plot
$l1plot=new LinePlot($l1datay);
$l1plot->SetColor("red");
$l1plot->SetWeight(2);
$l1plot->SetLegend("Prediction");
//Center the line plot in the center of the bars
$l1plot->SetBarCenter();
// Create the bar plot
$bplot = new BarPlot($l2datay);
$bplot->SetFillColor("orange");
$bplot->SetLegend("Result");
// Add the plots to t'he graph
$graph->Add($bplot);
$graph->Add($l1plot);
$graph->title->Set("Adding a line plot to a bar graph v1");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/lineiconex1.html b/html/includes/jpgraph/docs/html/exframes/lineiconex1.html
new file mode 100644
index 0000000000..0b24addcd5
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/lineiconex1.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
include ("../jpgraph_iconplot.php");
//$datay = array(20,15,23,15,17,35,22);
$datay = array(30,25,33,25,27,45,32);
$datay2 = array(3,25,10,15,50,5,18);
$datay3 = array(10,5,10,15,5,2,1);
// Setup the graph
$graph = new Graph(400,250);
$graph->SetMargin(40,40,20,30);
$graph->SetScale("textlin");
$graph->title->Set('Adding an icon ("tux") in the background');
$graph->title->SetFont(FF_ARIAL,FS_NORMAL,12);
//$graph->SetBackgroundGradient('red','blue');
$graph->xaxis->SetPos('min');
$p1 = new LinePlot($datay);
$p1->SetColor("blue");
$p1->SetFillGradient('yellow@0.4','red@0.4');
$p2 = new LinePlot($datay2);
$p2->SetColor("black");
$p2->SetFillGradient('green@0.4','white');
$p3 = new LinePlot($datay3);
$p3->SetColor("blue");
$p3->SetFillGradient('navy@0.4','white@0.4');
$graph->Add($p1);
$graph->Add($p2);
$graph->Add($p3);
$icon = new IconPlot('penguin.png',0.2,0.3,1,30);
$icon->SetAnchor('center','center');
$graph->Add($icon);
// Output line
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/lineiconex2.html b/html/includes/jpgraph/docs/html/exframes/lineiconex2.html
new file mode 100644
index 0000000000..dae7ad608b
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/lineiconex2.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
include ("../jpgraph_flags.php");
include ("../jpgraph_iconplot.php");
$datay = array(30,25,33,25,27,45,32);
// Setup the graph
$graph = new Graph(400,250);
$graph->SetMargin(40,40,20,30);
$graph->SetScale("textlin");
$graph->title->Set('Adding a country flag as a an icon');
$p1 = new LinePlot($datay);
$p1->SetColor("blue");
$p1->SetFillGradient('yellow@0.4','red@0.4');
$graph->Add($p1);
$icon = new IconPlot();
$icon->SetCountryFlag('iceland',50,30,1.5,40,3);
$icon->SetAnchor('left','top');
$graph->Add($icon);
// Output line
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/listfontsex1.html b/html/includes/jpgraph/docs/html/exframes/listfontsex1.html
new file mode 100644
index 0000000000..0760a3b546
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/listfontsex1.html
@@ -0,0 +1,3 @@
+
+<?php
// $Id: listfontsex1.php,v 1.3 2002/10/25 22:44:15 aditus Exp $
include "../jpgraph.php";
include "../jpgraph_canvas.php";
include "../jpgraph_canvtools.php";
$g = new CanvasGraph(550,450,'auto');
$scale = new CanvasScale($g);
$scale->Set(0,27,0,53);
$g->SetMargin(5,6,5,6);
$g->SetColor('white');
$g->SetMarginColor("teal");
$g->InitFrame();
$t = new CanvasRectangleText();
$t->SetFillColor('lightgreen');
$t->SetFontColor('navy');
$t->SetFont(FF_ARIAL,FS_NORMAL,16);
$t->Set("\n\n\n\n\n\n\n\n\n\n\nTTF Fonts",0.5,19,26,32);
$t->Stroke($g->img,$scale);
$t = new CanvasRectangleText();
$t->SetFillColor('');
$t->SetFontColor('black');
$t->SetColor('');
$t->SetShadow('');
$t->SetFont(FF_ARIAL,FS_BOLD,18);
$t->Set('Family',1,1,8);
$t->Stroke($g->img,$scale);
$t->Set('Italic style',9,1,8);
$t->Stroke($g->img,$scale);
$t->Set('Bold style',17.5,1,8);
$t->Stroke($g->img,$scale);
$t->SetFillColor('yellow');
$t->SetFontColor('black');
$t->SetColor('black');
$t->SetShadow('gray');
$r=6;$c=1;$w=7.5;$h=3.5;
$fonts=array(
array("Font 0",FF_FONT0,FS_NORMAL),
array("",FF_FONT0,FS_ITALIC),
array("",FF_FONT0,FS_BOLD),
array("Font 1",FF_FONT1,FS_NORMAL),
array("",FF_FONT1,FS_ITALIC),
array("Font 1 bold",FF_FONT1,FS_BOLD),
array("Font 2",FF_FONT2,FS_NORMAL),
array("",FF_FONT2,FS_ITALIC),
array("Font 2 bold",FF_FONT2,FS_BOLD),
array("Arial",FF_ARIAL,FS_NORMAL),
array("Arial italic",FF_ARIAL,FS_ITALIC),
array("Arial bold",FF_ARIAL,FS_BOLD),
array("Verdana",FF_VERDANA,FS_NORMAL),
array("Verdana italic",FF_VERDANA,FS_ITALIC),
array("Verdana bold",FF_VERDANA,FS_BOLD),
array("Trebuche",FF_TREBUCHE,FS_NORMAL),
array("Trebuche italic",FF_TREBUCHE,FS_ITALIC),
array("Trebuche bold",FF_TREBUCHE,FS_BOLD),
array("Georgia",FF_GEORGIA,FS_NORMAL),
array("Georgia italic",FF_GEORGIA,FS_ITALIC),
array("Georgia bold",FF_GEORGIA,FS_BOLD),
array("Comic",FF_COMIC,FS_NORMAL),
array("",FF_COMIC,FS_ITALIC),
array("Comic bold",FF_COMIC,FS_BOLD),
array("Courier",FF_COURIER,FS_NORMAL),
array("Courier italic",FF_COURIER,FS_ITALIC),
array("Courier bold",FF_COURIER,FS_BOLD),
array("Times normal",FF_TIMES,FS_NORMAL),
array("Times italic",FF_TIMES,FS_ITALIC),
array("Times bold italic",FF_TIMES,FS_BOLDITALIC),
);
$n=count($fonts);
for( $i=0; $i < $n; ++$i ) {
if( $i==9 ) $r += 3;
if( $fonts[$i][0] ) {
$t->SetTxt($fonts[$i][0]);
$t->SetPos($c,$r,$w,$h);
$t->SetFont($fonts[$i][1],$fonts[$i][2],13);
$t->Stroke($g->img,$scale);
}
$c += $w+1;
if( $c > 30-$w-2 ) {
$c = 1;
$r += 4;
}
}
$g->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/logbarex1.html b/html/includes/jpgraph/docs/html/exframes/logbarex1.html
new file mode 100644
index 0000000000..42688c61bb
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/logbarex1.html
@@ -0,0 +1,4 @@
+
+<?php
// $Id: logbarex1.php,v 1.4 2003/05/30 20:12:43 aditus Exp $
include ("../jpgraph.php");
include ("../jpgraph_log.php");
include ("../jpgraph_bar.php");
$datay=array(4,13,30,28,12,45,30,12,55,3,0.5);
$datax=array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov");
// Create the graph.
$graph = new Graph(400,220,'auto');
//$graph->img->SetMargin(50,30,50,50);
$graph->SetScale("textlog");
//$graph->SetShadow();
// Setup titles for graph and axis
$graph->title->Set("Bar with logarithmic Y-scale");
$graph->title->SetFont(FF_VERDANA,FS_NORMAL,18);
$graph->xaxis->SetTitle("2002");
$graph->xaxis->title->SetFont(FF_ARIAL,FS_NORMAL,16);
$graph->yaxis->title->SetFont(FF_ARIAL,FS_NORMAL,16);
$graph->yaxis->SetTitle("Y-title",'center');
$graph->yaxis->SetTitleMargin(30);
// Setup month on X-scale
//$graph->xaxis->SetTickLabels($datax);
// Create a bar pot
$bplot = new BarPlot($datay);
$bplot->SetFillColor("orange");
//You can also set a manual base of the bars
//$bplot->SetYBase(0.001);
/*
$bplot->SetShadow();
$bplot->value->Show();
$bplot->value->SetFont(FF_ARIAL,FS_BOLD);
$bplot->value->SetAngle(45);
$bplot->value->SetColor("black","darkred");
*/
$graph->Add($bplot);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/loglogex1.html b/html/includes/jpgraph/docs/html/exframes/loglogex1.html
new file mode 100644
index 0000000000..c3dd01982b
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/loglogex1.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_log.php");
include ("../jpgraph_line.php");
include ("../jpgraph_scatter.php");
$ab2 = array( 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.0, 8.0, 10.0,
12.0, 15.0, 20.0, 25.0, 30.0, 40.0, 50.0, 60.0 ,75.0,
100., 125., 150.);
$mn2 = array( 0.5, 0.5, 0.5, 0.5, 0.8, 0.8, 0.8, 0.8, 1.0,
1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 2.0,
5.0, 5.0, 5.0);
$rhos = array(30.0, 31.0, 32.0, 34.0, 35.5, 37.5, 38.0, 39.5, 41.5,
43.0, 41.0, 42.0, 42.5, 45.0, 49.0, 53.5, 58.0, 66.5,
75.0, 81.0, 89.0);
// Create the graph.
$graph = new Graph(500,300,"auto");
$graph->SetScale("loglog");
$graph->SetY2Scale("lin");
$graph->y2axis->SetColor("blue","blue");
$graph->img->SetMargin(50,70,40,50);
$graph->title->Set("Geoelektrik");
$graph->xaxis->title->Set("Auslage ab/2 [m]");
$graph->yaxis->title->Set("rho_s [Ohm m]");
$graph->y2axis->title->Set("mn/2 [m]");
$graph->y2axis->title->SetColor("blue");
$graph->y2axis->SetTitleMargin(35);
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xgrid->Show(true,true);
$graph->ygrid->Show(true,true);
// Create the linear plot
$lineplot=new LinePlot($rhos,$ab2);
$lineplot->SetWeight(1);
$lineplot->mark->SetType(MARK_FILLEDCIRCLE);
$lineplot->mark->SetWidth(2);
// Create scatter plot
$scplot=new ScatterPlot($mn2,$ab2);
$scplot->mark->SetType(MARK_FILLEDCIRCLE);
$scplot->mark->SetColor("blue");
$scplot->mark->SetWidth(2);
// Add plots to the graph
$graph->AddY2($scplot);
$graph->Add($lineplot);
// Display the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/manscaleex1.html b/html/includes/jpgraph/docs/html/exframes/manscaleex1.html
new file mode 100644
index 0000000000..4e3571a0d8
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/manscaleex1.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(12,17,22,19,5,15);
$graph = new Graph(220,200);
$graph->SetScale("textlin",3,35);
$graph->yscale->ticks->Set(7,2);
$graph->title->Set('Manual scale, manual ticks');
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$line = new LinePlot($ydata);
$graph->Add($line);
// Output graph
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/manscaleex2.html b/html/includes/jpgraph/docs/html/exframes/manscaleex2.html
new file mode 100644
index 0000000000..7a5a2c082f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/manscaleex2.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(12,17,22,19,5,15);
$graph = new Graph(220,200);
$graph->SetScale("textlin",3,35);
$graph->title->Set('Manual scale, exact limits');
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$line = new LinePlot($ydata);
$graph->Add($line);
// Output graph
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/manscaleex3.html b/html/includes/jpgraph/docs/html/exframes/manscaleex3.html
new file mode 100644
index 0000000000..b7f6720b00
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/manscaleex3.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(12,17,22,19,5,15);
$graph = new Graph(250,200);
$graph->SetScale("textlin",3,35);
$graph->SetTickDensity(TICKD_DENSE);
$graph->yscale->SetAutoTicks();
$graph->title->Set('Manual scale, auto ticks');
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$line = new LinePlot($ydata);
$graph->Add($line);
// Output graph
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/manscaleex4.html b/html/includes/jpgraph/docs/html/exframes/manscaleex4.html
new file mode 100644
index 0000000000..dc4b4f3110
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/manscaleex4.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(12,17,22,19,5,15);
$graph = new Graph(220,200);
$graph->SetScale("textlin",3,35);
$graph->yscale->SetAutoTicks();
$graph->title->Set('Manual scale, allow adjustment');
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$line = new LinePlot($ydata);
$graph->Add($line);
// Output graph
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/markflagex1.html b/html/includes/jpgraph/docs/html/exframes/markflagex1.html
new file mode 100644
index 0000000000..2bfd3883e6
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/markflagex1.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
include ("../jpgraph_scatter.php");
$datay = array(
array(4,26,15,44),
array(20,51,32,20));
// Setup the graph
$graph = new Graph(300,200);
$graph->SetMarginColor('white');
$graph->SetScale("textlin");
$graph->SetFrame(false);
$graph->SetMargin(30,5,25,20);
// Enable X-grid as well
$graph->xgrid->Show();
// Use months as X-labels
$graph->xaxis->SetTickLabels($gDateLocale->GetShortMonth());
//------------------------
// Create the plots
//------------------------
$p1 = new LinePlot($datay[0]);
$p1->SetColor("navy");
// Use a flag
$p1->mark->SetType(MARK_FLAG1,'chin');
// Displayes value on top of marker image
$p1->value->SetFormat('%d mil');
$p1->value->Show();
$p1->value->SetColor('darkred');
$p1->value->SetFont(FF_ARIAL,FS_BOLD,10);
// Increase the margin so that the value is printed avove tje
// img marker
$p1->value->SetMargin(14);
// Incent the X-scale so the first and last point doesn't
// fall on the edges
$p1->SetCenter();
$graph->Add($p1);
//------------
// 2:nd plot
//------------
$p2 = new LinePlot($datay[1]);
$p2->SetColor("navy");
// Use a flag
$p2->mark->SetType(MARK_FLAG1,'united states');
// Displayes value on top of marker image
$p2->value->SetFormat('%d mil');
$p2->value->Show();
$p2->value->SetColor('darkred');
$p2->value->SetFont(FF_ARIAL,FS_BOLD,10);
// Increase the margin so that the value is printed avove tje
// img marker
$p2->value->SetMargin(14);
// Incent the X-scale so the first and last point doesn't
// fall on the edges
$p2->SetCenter();
$graph->Add($p2);
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/nullvalueex01.html b/html/includes/jpgraph/docs/html/exframes/nullvalueex01.html
new file mode 100644
index 0000000000..314069f8f9
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/nullvalueex01.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
// Some data
$datax = array("2001-04-01","2001-04-02","2001-04-03","2001-04-04","2001-04-05","2001-04-06");
$datay = array(28,13,24,"",90,11);
$data2y = array(11,41,"-",33,"-",63);
// Setup graph
$graph = new Graph(400,250,"auto");
$graph->img->SetMargin(40,150,40,80);
$graph->SetScale("textlin");
$graph->SetShadow();
//Setup title
$graph->title->Set("Line plot with null values");
// Use built in font
$graph->title->SetFont(FF_COMIC,FS_NORMAL,14);
// Slightly adjust the legend from it's default position
$graph->legend->Pos(0.03,0.5,"right","center");
$graph->legend->SetFont(FF_FONT1,FS_BOLD);
// Setup X-scale
$graph->xaxis->SetTickLabels($datax);
$graph->xaxis->SetFont(FF_ARIAL,FS_NORMAL,8);
$graph->xaxis->SetLabelAngle(45);
// Create the first line
$p1 = new LinePlot($datay);
$p1->mark->SetType(MARK_FILLEDCIRCLE);
$p1->mark->SetFillColor("red");
$p1->mark->SetWidth(4);
$p1->SetColor("blue");
$p1->SetCenter();
$p1->SetLegend("Undefined\nvariant 1");
$graph->Add($p1);
// ... and the second
$p2 = new LinePlot($data2y);
$p2->mark->SetType(MARK_STAR);
$p2->mark->SetFillColor("red");
$p2->mark->SetWidth(4);
$p2->SetColor("red");
$p2->SetCenter();
$p2->SetLegend("Undefined\nvariant 2");
$graph->Add($p2);
// Output line
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/partiallyfilledlineex1.html b/html/includes/jpgraph/docs/html/exframes/partiallyfilledlineex1.html
new file mode 100644
index 0000000000..9e96b28411
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/partiallyfilledlineex1.html
@@ -0,0 +1,4 @@
+
+<?php
include("../jpgraph.php");
include("../jpgraph_line.php");
// Some data
$ydata = array(5,10,15,20,15,10,8,7,4,10,5);
// Create the graph
$graph= new Graph(400,300,"auto");
$graph->SetScale("textlin");
$graph->SetShadow(true);
$graph->SetMarginColor("lightblue");
// Setup format for legend
$graph->legend->SetFillColor("antiquewhite");
$graph->legend->SetShadow(true);
// Setup title
$graph->title->Set("Filled Area Example");
$graph->title->SetFont(FF_FONT2,FS_BOLD);
// Setup semi-filled line plot
$lineplot = new LinePlot($ydata);
$lineplot->SetLegend("Semi-filled\nLineplot");
// Set line color
$lineplot->SetColor("black");
// Setup the two areas to be filled
$lineplot->AddArea(2,5,LP_AREA_FILLED,"red");
$lineplot->AddArea(6,8,LP_AREA_FILLED,"green");
// Display the marks on the lines
$lineplot->mark->SetType(MARK_DIAMOND);
$lineplot->mark->SetSize(8);
$lineplot->mark->Show();
// add plot to the graph
$graph->Add($lineplot);
// display graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/penguin.html b/html/includes/jpgraph/docs/html/exframes/penguin.html
new file mode 100644
index 0000000000..9af41a39ad
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/penguin.html
@@ -0,0 +1,4 @@
+
+<?php
include_once ("../jpgraph.php");
include_once ("../jpgraph_pie.php");
include_once ("../jpgraph_pie3d.php");
//$gJpgBrandTiming=true;
// Some data
$data = array(40,21,17,27,23);
// Create the Pie Graph.
$graph = new PieGraph(400,200,'auto');
$graph->SetShadow();
// Set A title for the plot
$graph->title->Set("3D Pie Client side image map");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
// Create
$p1 = new PiePlot3D($data);
$p1->SetLegends(array("Jan (%d)","Feb","Mar","Apr","May","Jun","Jul"));
$targ=array("pie3d_csimex1.php?v=1","pie3d_csimex1.php?v=2","pie3d_csimex1.php?v=3",
"pie3d_csimex1.php?v=4","pie3d_csimex1.php?v=5","pie3d_csimex1.php?v=6");
$alts=array("val=%d","val=%d","val=%d","val=%d","val=%d","val=%d");
$p1->SetCSIMTargets($targ,$alts);
// Use absolute labels
$p1->SetLabelType(1);
$p1->value->SetFormat("%d kr");
// Move the pie slightly to the left
$p1->SetCenter(0.4,0.5);
$graph->Add($p1);
// Send back the HTML page which will call this script again
// to retrieve the image.
$graph->StrokeCSIM('pie3d_csimex1.php');
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/pie_csimex1.html b/html/includes/jpgraph/docs/html/exframes/pie_csimex1.html
new file mode 100644
index 0000000000..8b0a2e8ddc
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/pie_csimex1.html
@@ -0,0 +1,3 @@
+
+<?php
include_once ("../jpgraph.php");
include_once ("../jpgraph_pie.php");
// Some data
$data = array(40,21,17,14,23);
// Create the Pie Graph.
$graph = new PieGraph(300,200,'auto');
$graph->SetShadow();
// Set A title for the plot
$graph->title->Set("Client side image map");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
// Create
$p1 = new PiePlot($data);
$p1->SetCenter(0.4,0.5);
$p1->SetLegends(array("Jan","Feb","Mar","Apr","May","Jun","Jul"));
$targ=array("pie_csimex1.php#1","pie_csimex1.php#2","pie_csimex1.php#3",
"pie_csimex1.php#4","pie_csimex1.php#5","pie_csimex1.php#6");
$alts=array("val=%d","val=%d","val=%d","val=%d","val=%d","val=%d");
$p1->SetCSIMTargets($targ,$alts);
$graph->Add($p1);
// Send back the HTML page which will call this script again
// to retrieve the image.
$graph->StrokeCSIM('pie_csimex1.php');
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/piec_csimex1.html b/html/includes/jpgraph/docs/html/exframes/piec_csimex1.html
new file mode 100644
index 0000000000..a270935bcd
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/piec_csimex1.html
@@ -0,0 +1,3 @@
+
+<?php
// $Id: piec_csimex1.php,v 1.1.2.1 2003/10/09 21:05:39 aditus Exp $
// Example of pie with center circle
include ("../jpgraph.php");
include ("../jpgraph_pie.php");
// Some data
$data = array(50,28,25,27,31,20);
// A new pie graph
$graph = new PieGraph(400,400);
// If you don't want any border just uncomment this line
// $graph->SetFrame(false);
// Uncomment this line to add a drop shadow to the border
// $graph->SetShadow();
// Setup title
$graph->title->Set("CSIM Center Pie plot ex 1");
$graph->title->SetFont(FF_COMIC,FS_BOLD,18);
$graph->title->SetMargin(8); // Add a little bit more margin from the top
// Create the pie plot
$p1 = new PiePlotC($data);
// Set the radius of pie (as fraction of image size)
$p1->SetSize(0.32);
// Move the center of the pie slightly to the top of the image
$p1->SetCenter(0.5,0.45);
// Label font and color setup
$p1->value->SetFont(FF_ARIAL,FS_BOLD,12);
$p1->value->SetColor('white');
// Setup the title on the center circle
$p1->midtitle->Set("Test mid\nRow 1\nRow 2");
$p1->midtitle->SetFont(FF_ARIAL,FS_NORMAL,14);
// Set color for mid circle
$p1->SetMidColor('yellow');
// Use percentage values in the legends values (This is also the default)
$p1->SetLabelType(PIE_VALUE_PER);
// The label array values may have printf() formatting in them. The argument to the
// form,at string will be the value of the slice (either the percetage or absolute
// depending on what was specified in the SetLabelType() above.
$lbl = array("adam\n%.1f%%","bertil\n%.1f%%","johan\n%.1f%%",
"peter\n%.1f%%","daniel\n%.1f%%","erik\n%.1f%%");
$p1->SetLabels($lbl);
// Uncomment this line to remove the borders around the slices
// $p1->ShowBorder(false);
// Add drop shadow to slices
$p1->SetShadow();
// Explode all slices 15 pixels
$p1->ExplodeAll(15);
// Setup the CSIM targets
$targ=array("piec_csimex1.php#1","piec_csimex1.php#2","piec_csimex1.php#3",
"piec_csimex1.php#4","piec_csimex1.php#5","piec_csimex1.php#6");
$alts=array("val=%d","val=%d","val=%d","val=%d","val=%d","val=%d");
$p1->SetCSIMTargets($targ,$alts);
$p1->SetMidCSIM("piec_csimex1.php#7","Center");
// Setup a small help text in the image
$txt = new Text("Note: This is an example of image map. Hold\nyour mouse over the slices to see the values.\nThe URL just points back to this page");
$txt->SetFont(FF_FONT1,FS_BOLD);
$txt->Pos(0.5,0.97,'center','bottom');
$txt->SetBox('yellow','black');
$txt->SetShadow();
$graph->AddText($txt);
// Add plot to pie graph
$graph->Add($p1);
// .. and send the image on it's marry way to the browser
$graph->StrokeCSIM('piec_csimex1.php');
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/piecex1.html b/html/includes/jpgraph/docs/html/exframes/piecex1.html
new file mode 100644
index 0000000000..4a3da724a2
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/piecex1.html
@@ -0,0 +1,3 @@
+
+<?php
// $Id
// Example of pie with center circle
include ("../jpgraph.php");
include ("../jpgraph_pie.php");
// Some data
$data = array(50,28,25,27,31,20);
// A new pie graph
$graph = new PieGraph(300,300,'auto');
// Setup title
$graph->title->Set("Pie plot with center circle");
$graph->title->SetFont(FF_COMIC,FS_BOLD,14);
$graph->title->SetMargin(8); // Add a little bit more margin from the top
// Create the pie plot
$p1 = new PiePlotC($data);
// Set size of pie
$p1->SetSize(0.32);
// Label font and color setup
$p1->value->SetFont(FF_ARIAL,FS_BOLD,10);
$p1->value->SetColor('black');
// Setup the title on the center circle
$p1->midtitle->Set("Test mid\nRow 1\nRow 2");
$p1->midtitle->SetFont(FF_COMIC,FS_NORMAL,10);
// Set color for mid circle
$p1->SetMidColor('yellow');
// Use percentage values in the legends values (This is also the default)
$p1->SetLabelType(PIE_VALUE_PER);
// Add plot to pie graph
$graph->Add($p1);
// .. and send the image on it's marry way to the browser
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/piecex2.html b/html/includes/jpgraph/docs/html/exframes/piecex2.html
new file mode 100644
index 0000000000..a1cd605263
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/piecex2.html
@@ -0,0 +1,3 @@
+
+<?php
// $Id: piecex2.php,v 1.3.2.1 2003/08/19 20:40:12 aditus Exp $
// Example of pie with center circle
include ("../jpgraph.php");
include ("../jpgraph_pie.php");
// Some data
$data = array(50,28,25,27,31,20);
// A new pie graph
$graph = new PieGraph(400,400,'auto');
// Don't display the border
$graph->SetFrame(false);
// Uncomment this line to add a drop shadow to the border
// $graph->SetShadow();
// Setup title
$graph->title->Set("PiePlotC");
$graph->title->SetFont(FF_COMIC,FS_BOLD,18);
$graph->title->SetMargin(8); // Add a little bit more margin from the top
// Create the pie plot
$p1 = new PiePlotC($data);
// Set size of pie
$p1->SetSize(0.35);
// Label font and color setup
$p1->value->SetFont(FF_ARIAL,FS_BOLD,12);
$p1->value->SetColor('white');
$p1->value->Show();
// Setup the title on the center circle
$p1->midtitle->Set("Test mid\nRow 1\nRow 2");
$p1->midtitle->SetFont(FF_COMIC,FS_NORMAL,14);
// Set color for mid circle
$p1->SetMidColor('yellow');
// Use percentage values in the legends values (This is also the default)
$p1->SetLabelType(PIE_VALUE_PER);
// The label array values may have printf() formatting in them. The argument to the
// form,at string will be the value of the slice (either the percetage or absolute
// depending on what was specified in the SetLabelType() above.
$lbl = array("adam\n%.1f%%","bertil\n%.1f%%","johan\n%.1f%%",
"peter\n%.1f%%","daniel\n%.1f%%","erik\n%.1f%%");
$p1->SetLabels($lbl);
// Uncomment this line to remove the borders around the slices
// $p1->ShowBorder(false);
// Add drop shadow to slices
$p1->SetShadow();
// Explode all slices 15 pixels
$p1->ExplodeAll(15);
// Add plot to pie graph
$graph->Add($p1);
// .. and send the image on it's marry way to the browser
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/pieex3.html b/html/includes/jpgraph/docs/html/exframes/pieex3.html
new file mode 100644
index 0000000000..044ebcd98c
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/pieex3.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_pie.php");
// Some data
$data = array(40,21,17,14,23);
// Create the Pie Graph.
$graph = new PieGraph(350,300,"auto");
$graph->SetShadow();
// Set A title for the plot
$graph->title->Set("Multiple - Pie plot");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
// Create plots
$size=0.13;
$p1 = new PiePlot($data);
$p1->SetLegends(array("Jan","Feb","Mar","Apr","May"));
$p1->SetSize($size);
$p1->SetCenter(0.25,0.32);
$p1->value->SetFont(FF_FONT0);
$p1->title->Set("2001");
$p2 = new PiePlot($data);
$p2->SetSize($size);
$p2->SetCenter(0.65,0.32);
$p2->value->SetFont(FF_FONT0);
$p2->title->Set("2002");
$p3 = new PiePlot($data);
$p3->SetSize($size);
$p3->SetCenter(0.25,0.75);
$p3->value->SetFont(FF_FONT0);
$p3->title->Set("2003");
$p4 = new PiePlot($data);
$p4->SetSize($size);
$p4->SetCenter(0.65,0.75);
$p4->value->SetFont(FF_FONT0);
$p4->title->Set("2004");
$graph->Add($p1);
$graph->Add($p2);
$graph->Add($p3);
$graph->Add($p4);
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/pieex8.html b/html/includes/jpgraph/docs/html/exframes/pieex8.html
new file mode 100644
index 0000000000..5580a0bb29
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/pieex8.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_pie.php");
$data = array(40,60,31,35);
// A new pie graph
$graph = new PieGraph(250,200,"auto");
$graph->SetShadow();
// Title setup
$graph->title->Set("Adjusting the label pos");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
// Setup the pie plot
$p1 = new PiePlot($data);
// Adjust size and position of plot
$p1->SetSize(0.4);
$p1->SetCenter(0.5,0.52);
// Setup slice labels and move them into the plot
$p1->value->SetFont(FF_FONT1,FS_BOLD);
$p1->value->SetColor("darkred");
$p1->SetLabelPos(0.6);
// Finally add the plot
$graph->Add($p1);
// ... and stroke it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/pieex9.html b/html/includes/jpgraph/docs/html/exframes/pieex9.html
new file mode 100644
index 0000000000..74ad19c443
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/pieex9.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_pie.php");
$data = array(40,60,31,35);
// A new pie graph
$graph = new PieGraph(250,200,"auto");
$graph->SetShadow();
// Title setup
$graph->title->Set("Exploding all slices");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
// Setup the pie plot
$p1 = new PiePlot($data);
// Adjust size and position of plot
$p1->SetSize(0.35);
$p1->SetCenter(0.5,0.52);
// Setup slice labels and move them into the plot
$p1->value->SetFont(FF_FONT1,FS_BOLD);
$p1->value->SetColor("darkred");
$p1->SetLabelPos(0.65);
// Explode all slices
$p1->ExplodeAll(10);
// Add drop shadow
$p1->SetShadow();
// Finally add the plot
$graph->Add($p1);
// ... and stroke it
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/pielabelsex1.html b/html/includes/jpgraph/docs/html/exframes/pielabelsex1.html
new file mode 100644
index 0000000000..42ac0cac88
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/pielabelsex1.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_pie.php");
$data = array(19,12,4,3,3,12,3,3,5,6,7,8,8,1,7,2,2,4,6,8,21,23,2,2,12);
// Create the Pie Graph.
$graph = new PieGraph(300,350);
// Set A title for the plot
$graph->title->Set("Label guide lines");
$graph->title->SetFont(FF_VERDANA,FS_BOLD,12);
$graph->title->SetColor("darkblue");
$graph->legend->Pos(0.1,0.2);
// Create pie plot
$p1 = new PiePlot($data);
$p1->SetCenter(0.5,0.55);
$p1->SetSize(0.3);
// Enable and set policy for guide-lines
$p1->SetGuideLines();
$p1->SetGuideLinesAdjust(1.4);
// Setup the labels
$p1->SetLabelType(PIE_VALUE_PER);
$p1->value->Show();
$p1->value->SetFont(FF_ARIAL,FS_NORMAL,9);
$p1->value->SetFormat('%2.1f%%');
// Add and stroke
$graph->Add($p1);
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/pielabelsex2.html b/html/includes/jpgraph/docs/html/exframes/pielabelsex2.html
new file mode 100644
index 0000000000..f1a5f82daf
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/pielabelsex2.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_pie.php");
$data = array(19,12,4,3,3,12,3,3,5,6,7,8,8,1,7,2,2,4,6,8,21,23,2,2,12);
// Create the Pie Graph.
$graph = new PieGraph(300,350);
// Set A title for the plot
$graph->title->Set("Label guide lines");
$graph->title->SetFont(FF_VERDANA,FS_BOLD,12);
$graph->title->SetColor("darkblue");
$graph->legend->Pos(0.1,0.2);
// Create pie plot
$p1 = new PiePlot($data);
$p1->SetCenter(0.5,0.55);
$p1->SetSize(0.3);
// Enable and set policy for guide-lines. Make labels line up vertically
$p1->SetGuideLines(true,false);
$p1->SetGuideLinesAdjust(1.5);
// Setup the labels
$p1->SetLabelType(PIE_VALUE_PER);
$p1->value->Show();
$p1->value->SetFont(FF_ARIAL,FS_NORMAL,9);
$p1->value->SetFormat('%2.1f%%');
// Add and stroke
$graph->Add($p1);
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/pielabelsex4.html b/html/includes/jpgraph/docs/html/exframes/pielabelsex4.html
new file mode 100644
index 0000000000..849e21637f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/pielabelsex4.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_pie.php");
$data = array(19,12,4,3,3,12,3,3,5,6,7,8,8,1,7,2,2,4,6,8,21,23,2,2,12);
// Create the Pie Graph.
$graph = new PieGraph(300,350);
// Set A title for the plot
$graph->title->Set("Label guide lines");
$graph->title->SetFont(FF_VERDANA,FS_BOLD,12);
$graph->title->SetColor("darkblue");
$graph->legend->Pos(0.1,0.2);
// Create pie plot
$p1 = new PiePlot($data);
$p1->SetCenter(0.5,0.55);
$p1->SetSize(0.3);
// Enable and set policy for guide-lines. Make labels line up vertically
$p1->SetGuideLines(true,false);
$p1->SetGuideLinesAdjust(1.1);
// Setup the labels
$p1->SetLabelType(PIE_VALUE_PER);
$p1->value->Show();
$p1->value->SetFont(FF_ARIAL,FS_NORMAL,9);
$p1->value->SetFormat('%2.1f%%');
// Add and stroke
$graph->Add($p1);
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/polarex0-180.html b/html/includes/jpgraph/docs/html/exframes/polarex0-180.html
new file mode 100644
index 0000000000..346819f281
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/polarex0-180.html
@@ -0,0 +1,4 @@
+
+<?php
// A simple Polar graph, example 0
include "../jpgraph.php";
include "../jpgraph_polar.php";
$data = array(0,1,10,2,30,25,40,60,
50,110,60,160,70,210,75,230,80,260,
85,270,90,280,
95,270,100,260,105,230,
110,210,120,160,130,110,140,60,
150,25,170,2,180,1);
$graph = new PolarGraph(250,250);
$graph->SetScale('lin');
$graph->SetMargin(35,35,25,25);
$graph->SetType(POLAR_180);
$p = new PolarPlot($data);
$p->SetFillColor('lightblue@0.5');
$graph->Add($p);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/polarex0.html b/html/includes/jpgraph/docs/html/exframes/polarex0.html
new file mode 100644
index 0000000000..708956e72f
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/polarex0.html
@@ -0,0 +1,4 @@
+
+<?php
// A simple Polar graph, example 0
include "../jpgraph.php";
include "../jpgraph_polar.php";
$data = array(0,1,10,2,30,25,40,60,
50,110,60,160,70,210,75,230,80,260,
85,270,90,280,
95,270,100,260,105,230,
110,210,120,160,130,110,140,60,
150,25,170,2,180,1);
$graph = new PolarGraph(250,250);
$graph->SetScale('lin');
$graph->SetMargin(35,35,25,25);
$p = new PolarPlot($data);
$p->SetFillColor('lightblue@0.5');
$graph->Add($p);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/polarex3-lin.html b/html/includes/jpgraph/docs/html/exframes/polarex3-lin.html
new file mode 100644
index 0000000000..160ade6cb7
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/polarex3-lin.html
@@ -0,0 +1,4 @@
+
+<?php
// A simple Polar graph, example 2
include "../jpgraph.php";
include "../jpgraph_polar.php";
$data = array(0,1,10,2,30,25,40,60,
50,110,60,160,70,210,75,230,80,260,
85,270,90,280,
95,270,100,260,105,230,
110,210,120,160,130,110,140,60,
150,25,170,2,180,1);
$graph = new PolarGraph(300,300);
$graph->SetScale('lin',200);
$graph->SetType(POLAR_180);
$graph->title->Set('Polar plot #3');
$graph->title->SetFont(FF_FONT2,FS_BOLD);
$graph->title->SetColor('navy');
$graph->axis->ShowGrid(true,false);
$p = new PolarPlot($data);
$p->SetFillColor('lightred@0.5');
$graph->Add($p);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/polarex3.html b/html/includes/jpgraph/docs/html/exframes/polarex3.html
new file mode 100644
index 0000000000..9965d49155
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/polarex3.html
@@ -0,0 +1,4 @@
+
+<?php
// A simple Polar graph, example 2
include "../jpgraph.php";
include "../jpgraph_polar.php";
$data = array(0,1,10,2,30,25,40,60,
50,110,60,160,70,210,75,230,80,260,
85,270,90,280,
95,270,100,260,105,230,
110,210,120,160,130,110,140,60,
150,25,170,2,180,1);
$graph = new PolarGraph(300,300);
$graph->SetScale('log',100);
$graph->SetType(POLAR_180);
$graph->title->Set('Polar plot #3');
$graph->title->SetFont(FF_FONT2,FS_BOLD);
$graph->title->SetColor('navy');
$graph->axis->ShowGrid(true,false);
$p = new PolarPlot($data);
$p->SetFillColor('lightred@0.5');
$graph->Add($p);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/polarex4.html b/html/includes/jpgraph/docs/html/exframes/polarex4.html
new file mode 100644
index 0000000000..563bb0953a
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/polarex4.html
@@ -0,0 +1,4 @@
+
+<?php
// A simple Polar graph, example 2
include "../jpgraph.php";
include "../jpgraph_polar.php";
$data = array(0,1,10,2,30,25,40,60,
50,110,60,160,70,210,75,230,80,260,
85,270,90,280,
95,270,100,260,105,230,
110,210,120,160,130,110,140,60,
150,25,170,2,180,1);
$graph = new PolarGraph(300,350);
$graph->SetScale('log');
$graph->title->Set('Polar plot #4');
$graph->title->SetFont(FF_FONT2,FS_BOLD);
$graph->title->SetColor('navy');
// Hide last labels on the Radius axis
// They intersect with the box otherwise
$graph->axis->HideLastTickLabel();
$p = new PolarPlot($data);
$p->SetFillColor('lightred@0.5');
$graph->Add($p);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/polarex5.html b/html/includes/jpgraph/docs/html/exframes/polarex5.html
new file mode 100644
index 0000000000..5a95b260fd
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/polarex5.html
@@ -0,0 +1,4 @@
+
+<?php
// A simple Polar graph, example 2
include "../jpgraph.php";
include "../jpgraph_polar.php";
$data = array(0,1,10,2,30,25,40,60,
50,110,60,160,70,210,75,230,80,260,
85,270,90,280,
95,270,100,260,105,230,
110,210,120,160,130,110,140,60,
150,25,170,2,180,1);
$graph = new PolarGraph(300,350);
$graph->SetScale('log');
// Show both major and minor grid lines
$graph->axis->ShowGrid(true,true);
$graph->title->Set('Polar plot #5');
$graph->title->SetFont(FF_FONT2,FS_BOLD);
$graph->title->SetColor('navy');
// Hide last labels on the Radius axis
// They intersect with the box otherwise
$graph->axis->HideLastTickLabel();
$p = new PolarPlot($data);
$p->SetFillColor('lightred@0.5');
$graph->Add($p);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/polarex7-2.html b/html/includes/jpgraph/docs/html/exframes/polarex7-2.html
new file mode 100644
index 0000000000..9abc98c389
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/polarex7-2.html
@@ -0,0 +1,4 @@
+
+<?php
// A simple Polar graph,
include "../jpgraph.php";
include "../jpgraph_polar.php";
$data = array(0,1,30,2,30,25,40,60,
50,110,60,160,70,210,75,230,80,260,85,370,
90,480,
95,370,100,260,105,230,
110,210,120,160,130,110,140,60,
150,25,150,2,180,1);
$n = count($data);
for($i=0; $i < $n; $i+=2 ) {
$data[$n+$i] = 360-$data[$i];
$data[$n+$i+1] = $data[$i+1];
}
$graph = new PolarGraph(300,400);
$graph->SetScale('log',100);
$graph->SetType(POLAR_360);
$graph->SetPlotSize(220,300);
// Hide frame around graph (by setting width=0)
$graph->SetFrame(true,'white',1);
$graph->SetBackgroundGradient('blue:1.3','brown:1.4',GRAD_MIDHOR,BGRAD_PLOT);
// Set color for gradient lines
$graph->axis->SetGridColor('gray','gray','gray');
$graph->title->Set('Polar plot #7-2');
$graph->title->SetFont(FF_ARIAL,FS_BOLD,16);
$graph->title->SetColor('navy');
// Adjust legen box position and color
$graph->legend->SetColor('navy','darkgray');
$graph->legend->SetFillColor('white');
$graph->legend->SetShadow('darkgray@0.5',5);
$p = new PolarPlot($data);
$p->SetFillColor('yellow@0.6');
$p->mark->SetType(MARK_SQUARE);
$p->SetLegend("Mirophone #1\n(No amps)");
$graph->Add($p);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/polarex9.html b/html/includes/jpgraph/docs/html/exframes/polarex9.html
new file mode 100644
index 0000000000..c52b1af3e9
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/polarex9.html
@@ -0,0 +1,4 @@
+
+<?php
// A simple Polar graph,
include "../jpgraph.php";
include "../jpgraph_polar.php";
$data = array(0,1,10,2,30,25,40,60,
50,110,60,160,70,210,75,230,80,260,85,370,
90,480,
95,370,100,260,105,230,
110,210,120,160,130,110,140,60,
150,25,170,2,180,1);
$graph = new PolarGraph(350,320);
$graph->SetScale('log',100);
$graph->SetType(POLAR_180);
// Hide frame around graph (by setting width=0)
$graph->SetFrame(true,'white',1);
// Show both major and minor grid lines
$graph->axis->ShowGrid(true,true);
// Set color for gradient lines
$graph->axis->SetGridColor('lightblue:0.9','lightblue:0.9','lightblue:0.9');
// Set label and axis colors
$graph->axis->SetColor('black','navy','darkred');
// Draw the ticks on the bottom side of the radius axis
$graph->axis->SetTickSide(SIDE_DOWN);
// Increase the margin for the labels since we changed the
// side of the ticks.
$graph->axis->SetLabelMargin(6);
// Change fonts
$graph->axis->SetFont(FF_ARIAL,FS_NORMAL,8);
$graph->axis->SetAngleFont(FF_ARIAL,FS_NORMAL,8);
// Setup axis title
$graph->axis->SetTitle('Coverage (in meter)','middle');
$graph->axis->title->SetFont(FF_FONT1,FS_BOLD);
// Setup graph title
$graph->title->Set('Polar plot #9');
$graph->title->SetFont(FF_ARIAL,FS_BOLD,16);
$graph->title->SetColor('navy');
// Setup tab title
$graph->tabtitle->Set('Microphone #1');
$graph->tabtitle->SetColor('brown:0.5','lightyellow');
$p = new PolarPlot($data);
$p->SetFillColor('lightblue@0.5');
$p->mark->SetType(MARK_SQUARE);
$graph->Add($p);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/radarex1.html b/html/includes/jpgraph/docs/html/exframes/radarex1.html
new file mode 100644
index 0000000000..89fe24e53d
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/radarex1.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_radar.php");
// Some data to plot
$data = array(55,80,46,71,95);
// Create the graph and the plot
$graph = new RadarGraph(250,200,"auto");
$plot = new RadarPlot($data);
// Add the plot and display the graph
$graph->Add($plot);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/radarex2.html b/html/includes/jpgraph/docs/html/exframes/radarex2.html
new file mode 100644
index 0000000000..edd100936b
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/radarex2.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_radar.php");
// Some data to plot
$data = array(55,80,46,71,95);
// Create the graph and the plot
$graph = new RadarGraph(300,200,"auto");
$graph->title->Set('Weekly goals');
$graph->subtitle->Set('Year 2003');
$plot = new RadarPlot($data);
$plot->SetFillColor('lightred');
$graph->SetSize(0.6);
$graph->SetPos(0.5,0.6);
// Add the plot and display the graph
$graph->Add($plot);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/radarex4.html b/html/includes/jpgraph/docs/html/exframes/radarex4.html
new file mode 100644
index 0000000000..ae150cb6b3
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/radarex4.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_radar.php");
// Some data to plot
$data = array(55,80,26,31,95);
// Create the graph and the plot
$graph = new RadarGraph(250,200,"auto");
// Create the titles for the axis
$titles = $gDateLocale->GetShortMonth();
$graph->SetTitles($titles);
// Add grid lines
$graph->grid->Show();
$graph->grid->SetLineStyle('dotted');
$plot = new RadarPlot($data);
$plot->SetFillColor('lightblue');
// Add the plot and display the graph
$graph->Add($plot);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/radarex6.1.html b/html/includes/jpgraph/docs/html/exframes/radarex6.1.html
new file mode 100644
index 0000000000..b83e9f29e5
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/radarex6.1.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_radar.php");
// Some data to plot
$data = array(55,80,26,31,95);
$data2 = array(15,50,46,39,25);
// Create the graph and the plot
$graph = new RadarGraph(250,200,"auto");
// Add a drop shadow to the graph
$graph->SetShadow();
// Create the titles for the axis
$titles = $gDateLocale->GetShortMonth();
$graph->SetTitles($titles);
$graph->SetColor('lightyellow');
// ADjust the position to make more room
// for the legend
$graph->SetCenter(0.4,0.55);
$graph->SetSize(0.6);
// Add grid lines
$graph->grid->Show();
$graph->grid->SetColor('darkred');
$graph->grid->SetLineStyle('dotted');
$plot = new RadarPlot($data);
$plot->SetFillColor('lightblue');
$plot->SetLegend("QA results");
$plot2 = new RadarPlot($data2);
$plot2->SetLegend("Target");
$plot2->SetColor('red');
$plot2->SetFill(false);
$plot2->SetLineWeight(2);
// Add the plot and display the graph
$graph->Add($plot);
$graph->Add($plot2);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/radarex6.html b/html/includes/jpgraph/docs/html/exframes/radarex6.html
new file mode 100644
index 0000000000..900b20a5a9
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/radarex6.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_radar.php");
// Some data to plot
$data = array(55,80,26,31,95);
// Create the graph and the plot
$graph = new RadarGraph(250,200,"auto");
// Add a drop shadow to the graph
$graph->SetShadow();
// Create the titles for the axis
$titles = $gDateLocale->GetShortMonth();
$graph->SetTitles($titles);
$graph->SetColor('lightyellow');
// ADjust the position to make more room
// for the legend
$graph->SetCenter(0.4,0.5);
// Add grid lines
$graph->grid->Show();
$graph->grid->SetColor('darkred');
$graph->grid->SetLineStyle('dotted');
$plot = new RadarPlot($data);
$plot->SetFillColor('lightblue');
$plot->SetLegend("QA results");
// Add the plot and display the graph
$graph->Add($plot);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/radarex7.html b/html/includes/jpgraph/docs/html/exframes/radarex7.html
new file mode 100644
index 0000000000..f7adfab836
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/radarex7.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_radar.php");
// Create the basic rtadar graph
$graph = new RadarGraph(300,200,"auto");
// Set background color and shadow
$graph->SetColor("white");
$graph->SetShadow();
// Position the graph
$graph->SetCenter(0.4,0.55);
// Setup the axis formatting
$graph->axis->SetFont(FF_FONT1,FS_BOLD);
$graph->axis->SetWeight(2);
// Setup the grid lines
$graph->grid->SetLineStyle("longdashed");
$graph->grid->SetColor("navy");
$graph->grid->Show();
$graph->HideTickMarks();
// Setup graph titles
$graph->title->Set("Quality result");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->SetTitles(array("One","Two","Three","Four","Five","Sex","Seven","Eight","Nine","Ten"));
// Create the first radar plot
$plot = new RadarPlot(array(30,80,60,40,71,81,47));
$plot->SetLegend("Goal");
$plot->SetColor("red","lightred");
$plot->SetFill(false);
$plot->SetLineWeight(2);
// Create the second radar plot
$plot2 = new RadarPlot(array(70,40,30,80,31,51,14));
$plot2->SetLegend("Actual");
$plot2->SetColor("blue","lightred");
// Add the plots to the graph
$graph->Add($plot2);
$graph->Add($plot);
// And output the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/radarex8.1.html b/html/includes/jpgraph/docs/html/exframes/radarex8.1.html
new file mode 100644
index 0000000000..42c4bddba2
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/radarex8.1.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_radar.php");
// Create the basic radar graph
$graph = new RadarGraph(300,200,"auto");
$graph->img->SetAntiAliasing();
// Set background color and shadow
$graph->SetColor("white");
$graph->SetShadow();
// Position the graph
$graph->SetCenter(0.4,0.55);
// Setup the axis formatting
$graph->axis->SetFont(FF_FONT1,FS_BOLD);
// Setup the grid lines
$graph->grid->SetLineStyle("solid");
$graph->grid->SetColor("navy");
$graph->grid->Show();
$graph->HideTickMarks();
// Setup graph titles
$graph->title->Set("Quality result");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->SetTitles($gDateLocale->GetShortMonth());
// Create the first radar plot
$plot = new RadarPlot(array(70,80,60,90,71,81,47));
$plot->SetLegend("Goal");
$plot->SetColor("red","lightred");
$plot->SetFill(false);
$plot->SetLineWeight(2);
// Create the second radar plot
$plot2 = new RadarPlot(array(70,40,30,80,31,51,14));
$plot2->SetLegend("Actual");
$plot2->SetLineWeight(2);
$plot2->SetColor("blue");
$plot2->SetFill(false);
// Add the plots to the graph
$graph->Add($plot2);
$graph->Add($plot);
// And output the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/radarex8.html b/html/includes/jpgraph/docs/html/exframes/radarex8.html
new file mode 100644
index 0000000000..daf7edce38
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/radarex8.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_radar.php");
// Create the basic radar graph
$graph = new RadarGraph(300,200,"auto");
//$graph->img->SetAntiAliasing();
// Set background color and shadow
$graph->SetColor("white");
$graph->SetShadow();
// Position the graph
$graph->SetCenter(0.4,0.55);
// Setup the axis formatting
$graph->axis->SetFont(FF_FONT1,FS_BOLD);
// Setup the grid lines
$graph->grid->SetLineStyle("solid");
$graph->grid->SetColor("navy");
$graph->grid->Show();
$graph->HideTickMarks();
// Setup graph titles
$graph->title->Set("Quality result");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->SetTitles($gDateLocale->GetShortMonth());
// Create the first radar plot
$plot = new RadarPlot(array(70,80,60,90,71,81,47));
$plot->SetLegend("Goal");
$plot->SetColor("red","lightred");
$plot->SetFill(false);
$plot->SetLineWeight(2);
// Create the second radar plot
$plot2 = new RadarPlot(array(70,40,30,80,31,51,14));
$plot2->SetLegend("Actual");
$plot2->SetLineWeight(2);
$plot2->SetColor("blue");
$plot2->SetFill(false);
// Add the plots to the graph
$graph->Add($plot2);
$graph->Add($plot);
// And output the graph
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/radarmarkex1.html b/html/includes/jpgraph/docs/html/exframes/radarmarkex1.html
new file mode 100644
index 0000000000..1870fed573
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/radarmarkex1.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_radar.php");
$titles=array('Planning','Quality','Time','RR','CR','DR');
$data=array(18, 40, 70, 90, 42,66);
$graph = new RadarGraph (300,280,"auto");
$graph->title->Set("Radar with marks");
$graph->title->SetFont(FF_VERDANA,FS_NORMAL,12);
$graph->SetTitles($titles);
$graph->SetCenter(0.5,0.55);
$graph->HideTickMarks();
$graph->SetColor('lightgreen@0.7');
$graph->axis->SetColor('darkgray');
$graph->grid->SetColor('darkgray');
$graph->grid->Show();
$graph->axis->title->SetFont(FF_ARIAL,FS_NORMAL,12);
$graph->axis->title->SetMargin(5);
$graph->SetGridDepth(DEPTH_BACK);
$graph->SetSize(0.6);
$plot = new RadarPlot($data);
$plot->SetColor('red@0.2');
$plot->SetLineWeight(1);
$plot->SetFillColor('red@0.7');
$plot->mark->SetType(MARK_IMG_SBALL,'red');
$graph->Add($plot);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/rotex0.html b/html/includes/jpgraph/docs/html/exframes/rotex0.html
new file mode 100644
index 0000000000..646ddb156c
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/rotex0.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(12,17,22,19,5,15);
$graph = new Graph(270,170);
$graph->SetMargin(30,90,30,30);
$graph->SetScale("textlin");
$line = new LinePlot($ydata);
$line->SetLegend('2002');
$line->SetColor('darkred');
$line->SetWeight(2);
$graph->Add($line);
// Output graph
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/rotex1.html b/html/includes/jpgraph/docs/html/exframes/rotex1.html
new file mode 100644
index 0000000000..f07a5c4a02
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/rotex1.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(12,17,22,19,5,15);
$graph = new Graph(270,170);
$graph->SetMargin(30,90,30,30);
$graph->SetScale("textlin");
$graph->img->SetAngle(45);
$line = new LinePlot($ydata);
$line->SetLegend('2002');
$line->SetColor('darkred');
$line->SetWeight(2);
$graph->Add($line);
// Output graph
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/rotex2.html b/html/includes/jpgraph/docs/html/exframes/rotex2.html
new file mode 100644
index 0000000000..1d2c75375c
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/rotex2.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(12,17,22,19,5,15);
$graph = new Graph(270,170);
$graph->SetMargin(30,90,30,30);
$graph->SetScale("textlin");
$graph->img->SetAngle(90);
$line = new LinePlot($ydata);
$line->SetLegend('2002');
$line->SetColor('darkred');
$line->SetWeight(2);
$graph->Add($line);
// Output graph
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/rotex3.html b/html/includes/jpgraph/docs/html/exframes/rotex3.html
new file mode 100644
index 0000000000..ba0e9388ed
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/rotex3.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(12,17,22,19,5,15);
$graph = new Graph(270,170);
$graph->SetMargin(30,90,30,30);
$graph->SetScale("textlin");
$graph->img->SetAngle(45);
$graph->img->SetCenter(floor(270/2),floor(170/2));
$line = new LinePlot($ydata);
$line->SetLegend('2002');
$line->SetColor('darkred');
$line->SetWeight(2);
$graph->Add($line);
// Output graph
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/rotex4.html b/html/includes/jpgraph/docs/html/exframes/rotex4.html
new file mode 100644
index 0000000000..98b11d2314
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/rotex4.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(12,17,22,19,5,15);
$graph = new Graph(270,170);
$graph->SetMargin(30,90,30,30);
$graph->SetScale("textlin");
$graph->img->SetAngle(90);
$graph->img->SetCenter(floor(270/2),floor(170/2));
$line = new LinePlot($ydata);
$line->SetLegend('2002');
$line->SetColor('darkred');
$line->SetWeight(2);
$graph->Add($line);
// Output graph
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/rotex5.html b/html/includes/jpgraph/docs/html/exframes/rotex5.html
new file mode 100644
index 0000000000..e5cd0ebaed
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/rotex5.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$ydata = array(12,17,22,19,5,15);
$graph = new Graph(270,170);
$graph->SetMargin(30,90,30,30);
$graph->SetScale("textlin");
$graph->img->SetAngle(-30);
$graph->img->SetCenter(30,170-30);
$line = new LinePlot($ydata);
$line->SetLegend('2002');
$line->SetColor('darkred');
$line->SetWeight(2);
$graph->Add($line);
// Output graph
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/scatter_csimex1.html b/html/includes/jpgraph/docs/html/exframes/scatter_csimex1.html
new file mode 100644
index 0000000000..05404d2981
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/scatter_csimex1.html
@@ -0,0 +1,4 @@
+
+<?php
include_once ("../jpgraph.php");
include_once ("../jpgraph_scatter.php");
// Some data for the points
$datax = array(3.5,13.7,3,4,6.2,6,3.5,8,14,8,11.1,13.7);
$datay = array(10,22,12,13,17,20,16,19,30,31,40,43);
// A new scatter graph
$graph = new Graph(300,200,'auto');
$graph->SetShadow();
$graph->SetScale("linlin");
//$graph->img->SetMargin(40,40,40,40);
$graph->title->Set("Scatter plot with Image Map");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
// Client side image map targets
$targ=array("pie_csimex1.php#1","pie_csimex1.php#2","pie_csimex1.php#3",
"pie_csimex1.php#4","pie_csimex1.php#5","pie_csimex1.php#6",
"pie_csimex1.php#7","pie_csimex1.php#8","pie_csimex1.php#9" );
// Strings to put as "alts" (and "title" value)
$alts=array("val=%d","val=%d","val=%d","val=%d","val=%d","val=%d","val=%d","val=%d","val=%d");
// Create a new scatter plot
$sp1 = new ScatterPlot($datay,$datax);
// Use diamonds as markerss
$sp1->mark->SetType(MARK_DIAMOND);
$sp1->mark->SetWidth(10);
// Set the scatter plot image map targets
$sp1->SetCSIMTargets($targ,$alts);
// Add the plot
$graph->Add($sp1);
// Send back the HTML page which will call this script again
// to retrieve the image.
$graph->StrokeCSIM('scatter_csimex1.php');
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/scatterex1.html b/html/includes/jpgraph/docs/html/exframes/scatterex1.html
new file mode 100644
index 0000000000..7127694d4a
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/scatterex1.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_scatter.php");
$datax = array(3.5,3.7,3,4,6.2,6,3.5,8,14,8,11.1,13.7);
$datay = array(20,22,12,13,17,20,16,19,30,31,40,43);
$graph = new Graph(300,200,"auto");
$graph->SetScale("linlin");
$graph->img->SetMargin(40,40,40,40);
$graph->SetShadow();
$graph->title->Set("A simple scatter plot");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$sp1 = new ScatterPlot($datay,$datax);
$graph->Add($sp1);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/scatterex2.html b/html/includes/jpgraph/docs/html/exframes/scatterex2.html
new file mode 100644
index 0000000000..aa3054259b
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/scatterex2.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_scatter.php");
$datax = array(3.5,3.7,3,4,6.2,6,3.5,8,14,8,11.1,13.7);
$datay = array(20,22,12,13,17,20,16,19,30,31,40,43);
$graph = new Graph(300,200,"auto");
$graph->SetScale("linlin");
$graph->img->SetMargin(40,40,40,40);
$graph->SetShadow();
$graph->title->Set("A simple scatter plot");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$sp1 = new ScatterPlot($datay,$datax);
$sp1->mark->SetType(MARK_FILLEDCIRCLE);
$sp1->mark->SetFillColor("red");
$sp1->mark->SetWidth(8);
$graph->Add($sp1);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex1.html b/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex1.html
new file mode 100644
index 0000000000..de03393dce
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex1.html
@@ -0,0 +1,4 @@
+
+<?php
// Illustration of the different patterns for bands
// $Id: smallstaticbandsex1.php,v 1.1 2002/09/01 21:51:08 aditus Exp $
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(10,29,3,6);
// Create the graph.
$graph = new Graph(200,150,"auto");
$graph->SetScale("textlin");
$graph->SetMargin(25,10,20,20);
// Add 10% grace ("space") at top and botton of Y-scale.
$graph->yscale->SetGrace(10);
// Create a bar pot
$bplot = new BarPlot($datay);
$bplot->SetFillColor("lightblue");
// Position the X-axis at the bottom of the plotare
$graph->xaxis->SetPos("min");
$graph->ygrid->Show(false);
// .. and add the plot to the graph
$graph->Add($bplot);
// Add band
$band = new PlotBand(HORIZONTAL,BAND_RDIAG,15,35,'khaki4');
$band->ShowFrame(false);
$graph->AddBand($band);
// Set title
$graph->title->SetFont(FF_ARIAL,FS_BOLD,10);
$graph->title->SetColor('darkred');
$graph->title->Set('BAND_RDIAG');
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex10.html b/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex10.html
new file mode 100644
index 0000000000..d7efb2f640
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex10.html
@@ -0,0 +1,4 @@
+
+<?php
// Illustration of the different patterns for bands
// $Id: smallstaticbandsex10.php,v 1.1 2002/09/01 21:51:08 aditus Exp $
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(10,29,3,6);
// Create the graph.
$graph = new Graph(200,150,"auto");
$graph->SetScale("textlin");
$graph->SetMargin(25,10,20,20);
// Add 10% grace ("space") at top and botton of Y-scale.
$graph->yscale->SetGrace(10);
// Create a bar pot
$bplot = new BarPlot($datay);
$bplot->SetFillColor("lightblue");
// Position the X-axis at the bottom of the plotare
$graph->xaxis->SetPos("min");
$graph->ygrid->Show(false);
// .. and add the plot to the graph
$graph->Add($bplot);
// Add band
$band = new PlotBand(HORIZONTAL,BAND_DIAGCROSS,15,35,'khaki4');
$band->ShowFrame(false);
$graph->AddBand($band);
// Set title
$graph->title->SetFont(FF_ARIAL,FS_BOLD,10);
$graph->title->SetColor('darkred');
$graph->title->Set('BAND_DIAGCROSS');
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex2.html b/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex2.html
new file mode 100644
index 0000000000..569742fa3a
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex2.html
@@ -0,0 +1,4 @@
+
+<?php
// Illustration of the different patterns for bands
// $Id: smallstaticbandsex2.php,v 1.1 2002/09/01 21:51:08 aditus Exp $
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(10,29,3,6);
// Create the graph.
$graph = new Graph(200,150,"auto");
$graph->SetScale("textlin");
$graph->SetMargin(25,10,20,20);
// Add 10% grace ("space") at top and botton of Y-scale.
$graph->yscale->SetGrace(10);
// Create a bar pot
$bplot = new BarPlot($datay);
$bplot->SetFillColor("lightblue");
// Position the X-axis at the bottom of the plotare
$graph->xaxis->SetPos("min");
$graph->ygrid->Show(false);
// .. and add the plot to the graph
$graph->Add($bplot);
// Add band
$band = new PlotBand(HORIZONTAL,BAND_LDIAG,15,35,'khaki4');
$band->ShowFrame(false);
$graph->AddBand($band);
// Set title
$graph->title->SetFont(FF_ARIAL,FS_BOLD,10);
$graph->title->SetColor('darkred');
$graph->title->Set('BAND_LDIAG');
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex3.html b/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex3.html
new file mode 100644
index 0000000000..ab90b86d60
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex3.html
@@ -0,0 +1,4 @@
+
+<?php
// Illustration of the different patterns for bands
// $Id: smallstaticbandsex3.php,v 1.1 2002/09/01 21:51:08 aditus Exp $
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(10,29,3,6);
// Create the graph.
$graph = new Graph(200,150,"auto");
$graph->SetScale("textlin");
$graph->SetMargin(25,10,20,20);
// Add 10% grace ("space") at top and botton of Y-scale.
$graph->yscale->SetGrace(10);
// Create a bar pot
$bplot = new BarPlot($datay);
$bplot->SetFillColor("lightblue");
// Position the X-axis at the bottom of the plotare
$graph->xaxis->SetPos("min");
$graph->ygrid->Show(false);
// .. and add the plot to the graph
$graph->Add($bplot);
// Add band
$band = new PlotBand(HORIZONTAL,BAND_SOLID,15,35,'khaki4');
$band->ShowFrame(false);
$graph->AddBand($band);
// Set title
$graph->title->SetFont(FF_ARIAL,FS_BOLD,10);
$graph->title->SetColor('darkred');
$graph->title->Set('BAND_SOLID');
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex4.html b/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex4.html
new file mode 100644
index 0000000000..a0a1bdca68
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex4.html
@@ -0,0 +1,4 @@
+
+<?php
// Illustration of the different patterns for bands
// $Id: smallstaticbandsex4.php,v 1.1 2002/09/01 21:51:08 aditus Exp $
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(10,29,3,6);
// Create the graph.
$graph = new Graph(200,150,"auto");
$graph->SetScale("textlin");
$graph->SetMargin(25,10,20,20);
// Add 10% grace ("space") at top and botton of Y-scale.
$graph->yscale->SetGrace(10);
// Create a bar pot
$bplot = new BarPlot($datay);
$bplot->SetFillColor("lightblue");
// Position the X-axis at the bottom of the plotare
$graph->xaxis->SetPos("min");
$graph->ygrid->Show(false);
// .. and add the plot to the graph
$graph->Add($bplot);
// Add band
$band = new PlotBand(HORIZONTAL,BAND_3DPLANE,15,35,'khaki4');
$band->SetDensity(60);
$band->ShowFrame(true);
$graph->AddBand($band);
// Set title
$graph->title->SetFont(FF_ARIAL,FS_BOLD,10);
$graph->title->SetColor('darkred');
$graph->title->Set('BAND_3DPLANE, Density=60');
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex5.html b/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex5.html
new file mode 100644
index 0000000000..7cd7cc0098
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex5.html
@@ -0,0 +1,4 @@
+
+<?php
// Illustration of the different patterns for bands
// $Id: smallstaticbandsex5.php,v 1.1 2002/09/01 21:51:08 aditus Exp $
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(10,29,3,6);
// Create the graph.
$graph = new Graph(200,150,"auto");
$graph->SetScale("textlin");
$graph->SetMargin(25,10,20,20);
// Add 10% grace ("space") at top and botton of Y-scale.
$graph->yscale->SetGrace(10);
// Create a bar pot
$bplot = new BarPlot($datay);
$bplot->SetFillColor("lightblue");
// Position the X-axis at the bottom of the plotare
$graph->xaxis->SetPos("min");
$graph->ygrid->Show(false);
// .. and add the plot to the graph
$graph->Add($bplot);
// Add band
$band = new PlotBand(HORIZONTAL,BAND_HVCROSS,15,35,'khaki4');
$band->ShowFrame(true);
$band->SetOrder(DEPTH_FRONT);
$graph->AddBand($band);
// Set title
$graph->title->SetFont(FF_ARIAL,FS_BOLD,10);
$graph->title->SetColor('darkred');
$graph->title->Set('BAND_HVCROSS, In front');
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex6.html b/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex6.html
new file mode 100644
index 0000000000..9d73ef3908
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex6.html
@@ -0,0 +1,4 @@
+
+<?php
// Illustration of the different patterns for bands
// $Id: smallstaticbandsex6.php,v 1.1 2002/09/01 21:51:08 aditus Exp $
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(10,29,3,6);
// Create the graph.
$graph = new Graph(200,150,"auto");
$graph->SetScale("textlin");
$graph->SetMargin(25,10,20,20);
// Add 10% grace ("space") at top and botton of Y-scale.
$graph->yscale->SetGrace(10);
// Create a bar pot
$bplot = new BarPlot($datay);
$bplot->SetFillColor("lightblue");
// Position the X-axis at the bottom of the plotare
$graph->xaxis->SetPos("min");
$graph->ygrid->Show(false);
// .. and add the plot to the graph
$graph->Add($bplot);
// Add band
$band = new PlotBand(HORIZONTAL,BAND_VLINE,15,35,'khaki4');
$band->ShowFrame(false);
$graph->AddBand($band);
// Set title
$graph->title->SetFont(FF_ARIAL,FS_BOLD,10);
$graph->title->SetColor('darkred');
$graph->title->Set('BAND_VLINE');
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex7.html b/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex7.html
new file mode 100644
index 0000000000..f07a0c11b2
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex7.html
@@ -0,0 +1,4 @@
+
+<?php
// Illustration of the different patterns for bands
// $Id: smallstaticbandsex7.php,v 1.1 2002/09/01 21:51:08 aditus Exp $
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(10,29,3,6);
// Create the graph.
$graph = new Graph(200,150,"auto");
$graph->SetScale("textlin");
$graph->SetMargin(25,10,20,20);
// Add 10% grace ("space") at top and botton of Y-scale.
$graph->yscale->SetGrace(10);
// Create a bar pot
$bplot = new BarPlot($datay);
$bplot->SetFillColor("lightblue");
// Position the X-axis at the bottom of the plotare
$graph->xaxis->SetPos("min");
$graph->ygrid->Show(false);
// .. and add the plot to the graph
$graph->Add($bplot);
// Add band
$band = new PlotBand(HORIZONTAL,BAND_HLINE,15,35,'khaki4');
$band->ShowFrame(false);
$graph->AddBand($band);
// Set title
$graph->title->SetFont(FF_ARIAL,FS_BOLD,10);
$graph->title->SetColor('darkred');
$graph->title->Set('BAND_HLINE');
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex8.html b/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex8.html
new file mode 100644
index 0000000000..3d73197d39
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex8.html
@@ -0,0 +1,4 @@
+
+<?php
// Illustration of the different patterns for bands
// $Id: smallstaticbandsex8.php,v 1.1 2002/09/01 21:51:08 aditus Exp $
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(10,29,3,6);
// Create the graph.
$graph = new Graph(200,150,"auto");
$graph->SetScale("textlin");
$graph->SetMargin(25,10,20,20);
// Add 10% grace ("space") at top and botton of Y-scale.
$graph->yscale->SetGrace(10);
// Create a bar pot
$bplot = new BarPlot($datay);
$bplot->SetFillColor("lightblue");
// Position the X-axis at the bottom of the plotare
$graph->xaxis->SetPos("min");
$graph->ygrid->Show(false);
// .. and add the plot to the graph
$graph->Add($bplot);
// Add band
$band = new PlotBand(HORIZONTAL,BAND_3DPLANE,15,35,'khaki4');
$band->ShowFrame(false);
$graph->AddBand($band);
// Set title
$graph->title->SetFont(FF_ARIAL,FS_BOLD,10);
$graph->title->SetColor('darkred');
$graph->title->Set('BAND_3DPLANE');
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex9.html b/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex9.html
new file mode 100644
index 0000000000..5272812a03
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/smallstaticbandsex9.html
@@ -0,0 +1,4 @@
+
+<?php
// Illustration of the different patterns for bands
// $Id: smallstaticbandsex9.php,v 1.1 2002/09/01 21:51:08 aditus Exp $
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(10,29,3,6);
// Create the graph.
$graph = new Graph(200,150,"auto");
$graph->SetScale("textlin");
$graph->SetMargin(25,10,20,20);
// Add 10% grace ("space") at top and botton of Y-scale.
$graph->yscale->SetGrace(10);
// Create a bar pot
$bplot = new BarPlot($datay);
$bplot->SetFillColor("lightblue");
// Position the X-axis at the bottom of the plotare
$graph->xaxis->SetPos("min");
$graph->ygrid->Show(false);
// .. and add the plot to the graph
$graph->Add($bplot);
// Add band
$band = new PlotBand(HORIZONTAL,BAND_HVCROSS,15,35,'khaki4');
$band->ShowFrame(false);
$graph->AddBand($band);
// Set title
$graph->title->SetFont(FF_ARIAL,FS_BOLD,10);
$graph->title->SetColor('darkred');
$graph->title->Set('BAND_HVCROSS');
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/splineex1.html b/html/includes/jpgraph/docs/html/exframes/splineex1.html
new file mode 100644
index 0000000000..cc30324f15
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/splineex1.html
@@ -0,0 +1,3 @@
+
+<?php
include "../jpgraph.php";
include "../jpgraph_line.php";
include "../jpgraph_scatter.php";
include "../jpgraph_regstat.php";
// Original data points
$xdata = array(1,3,5,7,9,12,15,17.1);
$ydata = array(5,1,9,6,4,3,19,12);
// Get the interpolated values by creating
// a new Spline object.
$spline = new Spline($xdata,$ydata);
// For the new data set we want 40 points to
// get a smooth curve.
list($newx,$newy) = $spline->Get(50);
// Create the graph
$g = new Graph(300,200);
$g->SetMargin(30,20,40,30);
$g->title->Set("Natural cubic splines");
$g->title->SetFont(FF_ARIAL,FS_NORMAL,12);
$g->subtitle->Set('(Control points shown in red)');
$g->subtitle->SetColor('darkred');
$g->SetMarginColor('lightblue');
//$g->img->SetAntiAliasing();
// We need a linlin scale since we provide both
// x and y coordinates for the data points.
$g->SetScale('linlin');
// We want 1 decimal for the X-label
$g->xaxis->SetLabelFormat('%1.1f');
// We use a scatterplot to illustrate the original
// contro points.
$splot = new ScatterPlot($ydata,$xdata);
//
$splot->mark->SetFillColor('red@0.3');
$splot->mark->SetColor('red@0.5');
// And a line plot to stroke the smooth curve we got
// from the original control points
$lplot = new LinePlot($newy,$newx);
$lplot->SetColor('navy');
// Add the plots to the graph and stroke
$g->Add($lplot);
$g->Add($splot);
$g->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/staticbandbarex7.html b/html/includes/jpgraph/docs/html/exframes/staticbandbarex7.html
new file mode 100644
index 0000000000..89d23b6906
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/staticbandbarex7.html
@@ -0,0 +1,4 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_bar.php");
$datay=array(12,5,19,22,17,6);
// Create the graph.
$graph = new Graph(400,300,"auto");
$graph->img->SetMargin(60,30,50,40);
$graph->SetScale("textlin");
$graph->SetShadow();
$graph->title->SetFont(FF_ARIAL,FS_BOLD,15);
$graph->title->Set("Cash flow ");
$graph->subtitle->Set("Use of static line, 3D and solid band");
// Turn off Y-grid (it's on by default)
$graph->ygrid->Show(false);
// Add 10% grace ("space") at top of Y-scale.
$graph->yscale->SetGrace(10);
$graph->yscale->SetAutoMin(-20);
// Turn the tick mark out from the plot area
$graph->xaxis->SetTickSide(SIDE_DOWN);
$graph->yaxis->SetTickSide(SIDE_LEFT);
// Create a bar pot
$bplot = new BarPlot($datay);
$bplot->SetFillColor("orange");
$bplot->SetShadow("darkblue");
// Show the actual value for each bar on top/bottom
$bplot->value->Show(true);
$bplot->value->SetFormat("%02d kr");
// Position the X-axis at the bottom of the plotare
$graph->xaxis->SetPos("min");
// .. and add the plot to the graph
$graph->Add($bplot);
// Add upper and lower band and use no frames
$band[0]=new PlotBand(HORIZONTAL,BAND_3DPLANE,"min",0,"blue");
$band[0]->ShowFrame(false);
$band[0]->SetDensity(20);
$band[1]=new PlotBand(HORIZONTAL,BAND_SOLID,0,"max","steelblue");
$band[1]->ShowFrame(false);
$graph->Add($band);
$graph->Add(new PlotLine(HORIZONTAL,0,"black",2));
//$graph->title->Set("Test of bar gradient fill");
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
$graph->yaxis->title->SetFont(FF_ARIAL,FS_BOLD,11);
$graph->xaxis->title->SetFont(FF_ARIAL,FS_BOLD,11);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/stockex1.html b/html/includes/jpgraph/docs/html/exframes/stockex1.html
new file mode 100644
index 0000000000..ecd05853a0
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/stockex1.html
@@ -0,0 +1,4 @@
+
+<?php
// Example of a stock chart
include ("../jpgraph.php");
include ("../jpgraph_stock.php");
// Data must be in the format : open,close,min,max
$datay = array(
34,42,27,45,
55,25,14,59,
15,40,12,47,
62,38,25,65,
38,49,32,64);
// Setup a simple graph
$graph = new Graph(300,200);
$graph->SetScale("textlin");
$graph->SetMarginColor('lightblue');
$graph->title->Set('Stockchart example');
// Create a new stock plot
$p1 = new StockPlot($datay);
// Width of the bars (in pixels)
$p1->SetWidth(9);
// Uncomment the following line to hide the horizontal end lines
//$p1->HideEndLines();
// Add the plot to the graph and send it back to the browser
$graph->Add($p1);
$graph->Stroke();
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/tabtitleex1.html b/html/includes/jpgraph/docs/html/exframes/tabtitleex1.html
new file mode 100644
index 0000000000..b01374acbc
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/tabtitleex1.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
$datay1 = array(20,15,23,15);
$datay2 = array(12,9,42,8);
$datay3 = array(5,17,32,24);
// Setup the graph
$graph = new Graph(300,200);
$graph->SetMarginColor('white');
$graph->SetScale("textlin");
$graph->SetFrame(false);
$graph->SetMargin(30,50,30,30);
$graph->tabtitle->Set(' Year 2003 ' );
$graph->tabtitle->SetFont(FF_ARIAL,FS_BOLD,13);
$graph->yaxis->HideZeroLabel();
$graph->ygrid->SetFill(true,'#EFEFEF@0.5','#BBCCFF@0.5');
$graph->xgrid->Show();
$graph->xaxis->SetTickLabels($gDateLocale->GetShortMonth());
// Create the first line
$p1 = new LinePlot($datay1);
$p1->SetColor("navy");
$p1->SetLegend('Line 1');
$graph->Add($p1);
// Create the second line
$p2 = new LinePlot($datay2);
$p2->SetColor("red");
$p2->SetLegend('Line 2');
$graph->Add($p2);
// Create the third line
$p3 = new LinePlot($datay3);
$p3->SetColor("orange");
$p3->SetLegend('Line 3');
$graph->Add($p3);
$graph->legend->SetShadow('gray@0.4',5);
$graph->legend->SetPos(0.1,0.1,'right','top');
// Output line
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/textalignex1.html b/html/includes/jpgraph/docs/html/exframes/textalignex1.html
new file mode 100644
index 0000000000..2056242066
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/textalignex1.html
@@ -0,0 +1,3 @@
+
+<?php
// $Id: textalignex1.php,v 1.1 2002/10/19 17:42:53 aditus Exp $
require_once "../jpgraph.php";
require_once "../jpgraph_canvas.php";
if( empty($_GET['a']) ) {
$angle=40;
}
else {
$angle=$_GET['a'];
}
$caption = "Demonstration of different anchor points for texts as specified with\nTextAlign(). The red cross marks the coordinate that was given to\nstroke each instance of the string.\n(The green box is the bounding rectangle for the text.)";
$txt="TextAlign()";
// Initial width and height since we need a "dummy" canvas to
// calculate the height of the text strings
$w=480;$h=50;
$xm=90;$ym=80;
$g = new CanvasGraph($w,$h);
$aImg = $g->img;
$aImg->SetFont(FF_ARIAL,FS_NORMAL,16);
$tw=$aImg->GetBBoxWidth($txt,$angle);
$th=$aImg->GetBBoxHeight($txt,$angle);
$aImg->SetFont(FF_ARIAL,FS_NORMAL,11);
$ch=$aImg->GetBBoxHeight($caption);
// Calculate needed height for the image
$h = 3*$th+2*$ym + $ch;
$g = new CanvasGraph($w,$h);
$aImg = $g->img;
$prof = array('left','top',
'center','top',
'right','top',
'left','center',
'center','center',
'right','center',
'left','bottom',
'center','bottom',
'right','bottom');
$n = count($prof)/2;
for( $i=0,$r=0,$c=0; $i < $n; ++$i ) {
$x = $c*($tw+$xm)+$xm/2;
$y = $r*($th+$ym)+$ym/2-10;
$aImg->SetColor('blue');
$aImg->SetTextAlign($prof[$i*2],$prof[$i*2+1]);
$aImg->SetFont(FF_ARIAL,FS_NORMAL,16);
$aImg->StrokeText($x,$y,$txt,$angle,"left",true);
$aImg->SetColor('black');
$aImg->SetFont(FF_FONT1,FS_BOLD);
$aImg->SetTextAlign('center','top');
$align = sprintf('("%s","%s")',$prof[$i*2],$prof[$i*2+1]);
$aImg->StrokeText($c*($tw/2+$xm)+$xm/2+$tw/2,$r*($th/2+$ym)+$th+$ym/2-4,$align);
$c++;
if( $c==3 ) {
$c=0;$r++;
}
}
$aImg->SetTextAlign('center','bottom');
$aImg->SetFont(FF_ARIAL,FS_ITALIC,11);
$aImg->StrokeText($w/2,$h-10,$caption,0,'left');
$aImg->SetColor('navy');
$aImg->Rectangle(0,0,$w-1,$h-1);
$g->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/titlecsimex01.html b/html/includes/jpgraph/docs/html/exframes/titlecsimex01.html
new file mode 100644
index 0000000000..ce84f9049b
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/titlecsimex01.html
@@ -0,0 +1,4 @@
+
+<?php
include_once ("../jpgraph.php");
include_once ("../jpgraph_bar.php");
$datay=array(12,26,9,17,31);
// Create the graph.
$graph = new Graph(400,250);
$graph->SetScale("textlin");
$graph->SetMargin(50,80,20,40);
$graph->yaxis->SetTitleMargin(30);
$graph->yaxis->scale->SetGrace(30);
$graph->SetShadow();
// Create a bar pot
$bplot = new BarPlot($datay);
// Create targets for the bars image maps. One for each column
$targ=array("bar_clsmex1.php#1","bar_clsmex1.php#2","bar_clsmex1.php#3","bar_clsmex1.php#4","bar_clsmex1.php#5","bar_clsmex1.php#6");
$alts=array("val=%d","val=%d","val=%d","val=%d","val=%d","val=%d");
$bplot->SetCSIMTargets($targ,$alts);
$bplot->SetFillColor("orange");
$bplot->SetLegend('Year 2001 %%','#kalle ','%s');
// Display the values on top of each bar
$bplot->SetShadow();
$bplot->value->SetFormat(" $ %2.1f",70);
$bplot->value->SetFont(FF_ARIAL,FS_NORMAL,9);
$bplot->value->SetColor("blue");
$bplot->value->Show();
$graph->Add($bplot);
// Create a big "button" that has an image map action
$txt1 = new Text("A simple text with\ntwo rows");
$txt1->SetFont(FF_ARIAL);
$txt1->SetBox('lightblue','black','white@1',5);
$txt1->SetParagraphAlign('center');
$txt1->SetPos(40,50);
$txt1->SetCSIMTarget('#88','Text element');
$graph->Add($txt1);
// Add image map to the graph title as well (you can do this to the
// sub- and subsub-title as well)
$graph->title->Set("Image maps barex1");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->title->SetCSIMTarget('#45','Title for Bar');
$graph->xaxis->title->Set("X-title");
$graph->yaxis->title->Set("Y-title");
// Setup the axis title image map and font style
$graph->yaxis->title->SetFont(FF_FONT2,FS_BOLD);
$graph->yaxis->title->SetCSIMTarget('#55','Y-axis title');
$graph->xaxis->title->SetFont(FF_FONT2,FS_BOLD);
$graph->xaxis->title->SetCSIMTarget('#55','X-axis title');
// Send back the HTML page which will call this script again
// to retrieve the image.
$graph->StrokeCSIM('titlecsimex01.php');
?>
+
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/exframes/topxaxisex1.html b/html/includes/jpgraph/docs/html/exframes/topxaxisex1.html
new file mode 100644
index 0000000000..26c2778ce7
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/exframes/topxaxisex1.html
@@ -0,0 +1,3 @@
+
+<?php
include ("../jpgraph.php");
include ("../jpgraph_line.php");
// Some data
$datay = array(25,29,29,39,55);
$graph = new Graph(400,200,'auto');
$graph->img->SetMargin(40,40,40,20);
$graph->SetScale("linlin");
$graph->SetShadow();
$graph->title->Set("Top X-axis");
// Start at 0
$graph->yscale->SetAutoMin(0);
// Add some air around the Y-scale
$graph->yscale->SetGrace(100);
// Use built in font
$graph->title->SetFont(FF_FONT1,FS_BOLD);
// Adjust the X-axis
$graph->xaxis->SetPos("max");
$graph->xaxis->SetLabelSide(SIDE_UP);
$graph->xaxis->SetTickSide(SIDE_DOWN);
// Create the line plot
$p1 = new LinePlot($datay);
$p1->SetColor("blue");
// Specify marks for the line plots
$p1->mark->SetType(MARK_FILLEDCIRCLE);
$p1->mark->SetFillColor("red");
$p1->mark->SetWidth(4);
// Show values
$p1->value->Show();
// Add lineplot to graph
$graph->Add($p1);
// Output line
$graph->Stroke();
?>
+
\ No newline at end of file
diff --git a/html/includes/jpgraph/docs/html/img/alphabarex1.png b/html/includes/jpgraph/docs/html/img/alphabarex1.png
new file mode 100644
index 0000000000..39f4552d8a
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/alphabarex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/antispamex01.png b/html/includes/jpgraph/docs/html/img/antispamex01.png
new file mode 100644
index 0000000000..e42568b5e4
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/antispamex01.png differ
diff --git a/html/includes/jpgraph/docs/html/img/backgroundex03.png b/html/includes/jpgraph/docs/html/img/backgroundex03.png
new file mode 100644
index 0000000000..50f70f5e9a
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/backgroundex03.png differ
diff --git a/html/includes/jpgraph/docs/html/img/balloonex1.png b/html/includes/jpgraph/docs/html/img/balloonex1.png
new file mode 100644
index 0000000000..13b0fbea28
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/balloonex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/bargradsmallex1.png b/html/includes/jpgraph/docs/html/img/bargradsmallex1.png
new file mode 100644
index 0000000000..dca5ebd3ce
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/bargradsmallex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/bargradsmallex2.png b/html/includes/jpgraph/docs/html/img/bargradsmallex2.png
new file mode 100644
index 0000000000..3dc796d77e
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/bargradsmallex2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/bargradsmallex3.png b/html/includes/jpgraph/docs/html/img/bargradsmallex3.png
new file mode 100644
index 0000000000..34dcfa3d49
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/bargradsmallex3.png differ
diff --git a/html/includes/jpgraph/docs/html/img/bargradsmallex4.png b/html/includes/jpgraph/docs/html/img/bargradsmallex4.png
new file mode 100644
index 0000000000..af12eee3b6
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/bargradsmallex4.png differ
diff --git a/html/includes/jpgraph/docs/html/img/bargradsmallex5.png b/html/includes/jpgraph/docs/html/img/bargradsmallex5.png
new file mode 100644
index 0000000000..fdea0ccfa0
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/bargradsmallex5.png differ
diff --git a/html/includes/jpgraph/docs/html/img/bargradsmallex6.png b/html/includes/jpgraph/docs/html/img/bargradsmallex6.png
new file mode 100644
index 0000000000..7fbf619ece
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/bargradsmallex6.png differ
diff --git a/html/includes/jpgraph/docs/html/img/bargradsmallex7.png b/html/includes/jpgraph/docs/html/img/bargradsmallex7.png
new file mode 100644
index 0000000000..b2c4908706
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/bargradsmallex7.png differ
diff --git a/html/includes/jpgraph/docs/html/img/bargradsmallex8.png b/html/includes/jpgraph/docs/html/img/bargradsmallex8.png
new file mode 100644
index 0000000000..92f1b7ff83
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/bargradsmallex8.png differ
diff --git a/html/includes/jpgraph/docs/html/img/bartutex1.png b/html/includes/jpgraph/docs/html/img/bartutex1.png
new file mode 100644
index 0000000000..cd01dc735e
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/bartutex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/bartutex2.png b/html/includes/jpgraph/docs/html/img/bartutex2.png
new file mode 100644
index 0000000000..8f621e60e8
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/bartutex2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/bartutex3.png b/html/includes/jpgraph/docs/html/img/bartutex3.png
new file mode 100644
index 0000000000..e9238904d4
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/bartutex3.png differ
diff --git a/html/includes/jpgraph/docs/html/img/bartutex4.png b/html/includes/jpgraph/docs/html/img/bartutex4.png
new file mode 100644
index 0000000000..05bd7cc486
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/bartutex4.png differ
diff --git a/html/includes/jpgraph/docs/html/img/bartutex5.png b/html/includes/jpgraph/docs/html/img/bartutex5.png
new file mode 100644
index 0000000000..8581b5f185
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/bartutex5.png differ
diff --git a/html/includes/jpgraph/docs/html/img/bartutex6.png b/html/includes/jpgraph/docs/html/img/bartutex6.png
new file mode 100644
index 0000000000..470b6589c0
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/bartutex6.png differ
diff --git a/html/includes/jpgraph/docs/html/img/boxstockex1.png b/html/includes/jpgraph/docs/html/img/boxstockex1.png
new file mode 100644
index 0000000000..a10eb363fb
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/boxstockex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/builtinplotmarksex1.png b/html/includes/jpgraph/docs/html/img/builtinplotmarksex1.png
new file mode 100644
index 0000000000..f2f02c06f7
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/builtinplotmarksex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/canvas_jpgarchex.png b/html/includes/jpgraph/docs/html/img/canvas_jpgarchex.png
new file mode 100644
index 0000000000..0b38633892
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/canvas_jpgarchex.png differ
diff --git a/html/includes/jpgraph/docs/html/img/canvasex01.png b/html/includes/jpgraph/docs/html/img/canvasex01.png
new file mode 100644
index 0000000000..f8eb438729
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/canvasex01.png differ
diff --git a/html/includes/jpgraph/docs/html/img/canvasex02.png b/html/includes/jpgraph/docs/html/img/canvasex02.png
new file mode 100644
index 0000000000..369b11f554
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/canvasex02.png differ
diff --git a/html/includes/jpgraph/docs/html/img/canvasex03.png b/html/includes/jpgraph/docs/html/img/canvasex03.png
new file mode 100644
index 0000000000..01e786e9b8
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/canvasex03.png differ
diff --git a/html/includes/jpgraph/docs/html/img/canvasex04.png b/html/includes/jpgraph/docs/html/img/canvasex04.png
new file mode 100644
index 0000000000..0f7a30c55d
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/canvasex04.png differ
diff --git a/html/includes/jpgraph/docs/html/img/canvasex05.png b/html/includes/jpgraph/docs/html/img/canvasex05.png
new file mode 100644
index 0000000000..1d5590303f
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/canvasex05.png differ
diff --git a/html/includes/jpgraph/docs/html/img/canvasex06.png b/html/includes/jpgraph/docs/html/img/canvasex06.png
new file mode 100644
index 0000000000..ed11c48313
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/canvasex06.png differ
diff --git a/html/includes/jpgraph/docs/html/img/color_chart01.png b/html/includes/jpgraph/docs/html/img/color_chart01.png
new file mode 100644
index 0000000000..62aa5aa998
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/color_chart01.png differ
diff --git a/html/includes/jpgraph/docs/html/img/color_chart02.png b/html/includes/jpgraph/docs/html/img/color_chart02.png
new file mode 100644
index 0000000000..1524911a50
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/color_chart02.png differ
diff --git a/html/includes/jpgraph/docs/html/img/color_chart03.png b/html/includes/jpgraph/docs/html/img/color_chart03.png
new file mode 100644
index 0000000000..e5c71d3686
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/color_chart03.png differ
diff --git a/html/includes/jpgraph/docs/html/img/color_chart04.png b/html/includes/jpgraph/docs/html/img/color_chart04.png
new file mode 100644
index 0000000000..b47a610cd9
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/color_chart04.png differ
diff --git a/html/includes/jpgraph/docs/html/img/dateaxisex1.png b/html/includes/jpgraph/docs/html/img/dateaxisex1.png
new file mode 100644
index 0000000000..76996b0a9b
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/dateaxisex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/dateaxisex2.png b/html/includes/jpgraph/docs/html/img/dateaxisex2.png
new file mode 100644
index 0000000000..e5a691fa8e
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/dateaxisex2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/dateaxisex4.png b/html/includes/jpgraph/docs/html/img/dateaxisex4.png
new file mode 100644
index 0000000000..48eb2881af
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/dateaxisex4.png differ
diff --git a/html/includes/jpgraph/docs/html/img/dbschemaex1.png b/html/includes/jpgraph/docs/html/img/dbschemaex1.png
new file mode 100644
index 0000000000..185539aef3
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/dbschemaex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example0.png b/html/includes/jpgraph/docs/html/img/example0.png
new file mode 100644
index 0000000000..6e08b33e7d
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example0.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example11.png b/html/includes/jpgraph/docs/html/img/example11.png
new file mode 100644
index 0000000000..e281b30c4f
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example11.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example13.png b/html/includes/jpgraph/docs/html/img/example13.png
new file mode 100644
index 0000000000..ff795689f4
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example13.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example14.png b/html/includes/jpgraph/docs/html/img/example14.png
new file mode 100644
index 0000000000..bc7793e843
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example14.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example15.png b/html/includes/jpgraph/docs/html/img/example15.png
new file mode 100644
index 0000000000..5d6d8f27d3
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example15.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example16.1.png b/html/includes/jpgraph/docs/html/img/example16.1.png
new file mode 100644
index 0000000000..a112af8e82
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example16.1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example16.2.png b/html/includes/jpgraph/docs/html/img/example16.2.png
new file mode 100644
index 0000000000..0bd30ef368
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example16.2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example16.3.png b/html/includes/jpgraph/docs/html/img/example16.3.png
new file mode 100644
index 0000000000..65615c4d25
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example16.3.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example16.4.png b/html/includes/jpgraph/docs/html/img/example16.4.png
new file mode 100644
index 0000000000..947cb518a4
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example16.4.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example16.6.png b/html/includes/jpgraph/docs/html/img/example16.6.png
new file mode 100644
index 0000000000..12ef14c55d
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example16.6.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example16.png b/html/includes/jpgraph/docs/html/img/example16.png
new file mode 100644
index 0000000000..b03ccbaca7
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example16.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example17.png b/html/includes/jpgraph/docs/html/img/example17.png
new file mode 100644
index 0000000000..0af9f470f3
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example17.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example18.png b/html/includes/jpgraph/docs/html/img/example18.png
new file mode 100644
index 0000000000..6aa531bbb5
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example18.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example19.1.png b/html/includes/jpgraph/docs/html/img/example19.1.png
new file mode 100644
index 0000000000..aee9ccbd1a
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example19.1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example19.png b/html/includes/jpgraph/docs/html/img/example19.png
new file mode 100644
index 0000000000..3ad813b04f
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example19.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example2.png b/html/includes/jpgraph/docs/html/img/example2.png
new file mode 100644
index 0000000000..b7abf36fb0
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example20.1.png b/html/includes/jpgraph/docs/html/img/example20.1.png
new file mode 100644
index 0000000000..699b08a90d
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example20.1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example20.2.png b/html/includes/jpgraph/docs/html/img/example20.2.png
new file mode 100644
index 0000000000..1c50b89c2e
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example20.2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example20.3.png b/html/includes/jpgraph/docs/html/img/example20.3.png
new file mode 100644
index 0000000000..5fa5556ab3
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example20.3.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example20.4.png b/html/includes/jpgraph/docs/html/img/example20.4.png
new file mode 100644
index 0000000000..250de655e5
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example20.4.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example20.5.png b/html/includes/jpgraph/docs/html/img/example20.5.png
new file mode 100644
index 0000000000..00a457229b
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example20.5.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example20.png b/html/includes/jpgraph/docs/html/img/example20.png
new file mode 100644
index 0000000000..515a5f6fcb
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example20.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example21.png b/html/includes/jpgraph/docs/html/img/example21.png
new file mode 100644
index 0000000000..0ecf226011
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example21.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example22.png b/html/includes/jpgraph/docs/html/img/example22.png
new file mode 100644
index 0000000000..1388325329
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example22.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example23.png b/html/includes/jpgraph/docs/html/img/example23.png
new file mode 100644
index 0000000000..17b059df0c
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example23.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example24.png b/html/includes/jpgraph/docs/html/img/example24.png
new file mode 100644
index 0000000000..07154b022c
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example24.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example25.1.png b/html/includes/jpgraph/docs/html/img/example25.1.png
new file mode 100644
index 0000000000..9f82a96965
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example25.1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example25.2.png b/html/includes/jpgraph/docs/html/img/example25.2.png
new file mode 100644
index 0000000000..1ad79f8303
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example25.2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example25.png b/html/includes/jpgraph/docs/html/img/example25.png
new file mode 100644
index 0000000000..5cefe700a5
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example25.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example26.1.png b/html/includes/jpgraph/docs/html/img/example26.1.png
new file mode 100644
index 0000000000..9b0a691b28
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example26.1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example26.png b/html/includes/jpgraph/docs/html/img/example26.png
new file mode 100644
index 0000000000..2ed5391b57
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example26.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example27.1.png b/html/includes/jpgraph/docs/html/img/example27.1.png
new file mode 100644
index 0000000000..7c445c1284
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example27.1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example27.2.png b/html/includes/jpgraph/docs/html/img/example27.2.png
new file mode 100644
index 0000000000..9e86e3616a
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example27.2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example27.3.png b/html/includes/jpgraph/docs/html/img/example27.3.png
new file mode 100644
index 0000000000..b3ea981c2f
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example27.3.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example27.png b/html/includes/jpgraph/docs/html/img/example27.png
new file mode 100644
index 0000000000..92efaea278
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example27.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example28.1.png b/html/includes/jpgraph/docs/html/img/example28.1.png
new file mode 100644
index 0000000000..80dac44161
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example28.1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example28.2.png b/html/includes/jpgraph/docs/html/img/example28.2.png
new file mode 100644
index 0000000000..5b9589cd14
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example28.2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example28.3.png b/html/includes/jpgraph/docs/html/img/example28.3.png
new file mode 100644
index 0000000000..92434d0b67
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example28.3.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example28.png b/html/includes/jpgraph/docs/html/img/example28.png
new file mode 100644
index 0000000000..1fc9b92f62
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example28.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example3.1.png b/html/includes/jpgraph/docs/html/img/example3.1.png
new file mode 100644
index 0000000000..4c1ccee9a6
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example3.1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example3.2.1.png b/html/includes/jpgraph/docs/html/img/example3.2.1.png
new file mode 100644
index 0000000000..476cf85fb5
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example3.2.1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example3.2.2.png b/html/includes/jpgraph/docs/html/img/example3.2.2.png
new file mode 100644
index 0000000000..354a653bff
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example3.2.2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example3.2.png b/html/includes/jpgraph/docs/html/img/example3.2.png
new file mode 100644
index 0000000000..1812323bb5
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example3.2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example3.3.png b/html/includes/jpgraph/docs/html/img/example3.3.png
new file mode 100644
index 0000000000..8aa7ce1247
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example3.3.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example3.4.png b/html/includes/jpgraph/docs/html/img/example3.4.png
new file mode 100644
index 0000000000..41650af0fc
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example3.4.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example3.png b/html/includes/jpgraph/docs/html/img/example3.png
new file mode 100644
index 0000000000..94d0122aa0
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example3.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example4.png b/html/includes/jpgraph/docs/html/img/example4.png
new file mode 100644
index 0000000000..4c1c175ced
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example4.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example5.1.png b/html/includes/jpgraph/docs/html/img/example5.1.png
new file mode 100644
index 0000000000..d3b4a6bce5
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example5.1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example5.png b/html/includes/jpgraph/docs/html/img/example5.png
new file mode 100644
index 0000000000..ce8dbebb7a
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example5.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example6.1.png b/html/includes/jpgraph/docs/html/img/example6.1.png
new file mode 100644
index 0000000000..04d9a9e515
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example6.1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example6.2.png b/html/includes/jpgraph/docs/html/img/example6.2.png
new file mode 100644
index 0000000000..d512867dfa
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example6.2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example6.png b/html/includes/jpgraph/docs/html/img/example6.png
new file mode 100644
index 0000000000..4ce0e3ed5c
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example6.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example7.png b/html/includes/jpgraph/docs/html/img/example7.png
new file mode 100644
index 0000000000..e657320835
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example7.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example8.png b/html/includes/jpgraph/docs/html/img/example8.png
new file mode 100644
index 0000000000..09cb26ab8b
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example8.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example9.1.png b/html/includes/jpgraph/docs/html/img/example9.1.png
new file mode 100644
index 0000000000..e5808cd149
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example9.1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example9.2.png b/html/includes/jpgraph/docs/html/img/example9.2.png
new file mode 100644
index 0000000000..659e6ddf42
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example9.2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/example9.png b/html/includes/jpgraph/docs/html/img/example9.png
new file mode 100644
index 0000000000..9e659154a0
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/example9.png differ
diff --git a/html/includes/jpgraph/docs/html/img/fieldscatterex1.png b/html/includes/jpgraph/docs/html/img/fieldscatterex1.png
new file mode 100644
index 0000000000..41c495a6ee
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/fieldscatterex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/filledgridex1.png b/html/includes/jpgraph/docs/html/img/filledgridex1.png
new file mode 100644
index 0000000000..5dc79f44c6
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/filledgridex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/filledlineex01.1.png b/html/includes/jpgraph/docs/html/img/filledlineex01.1.png
new file mode 100644
index 0000000000..6eb5c67075
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/filledlineex01.1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/filledlineex01.png b/html/includes/jpgraph/docs/html/img/filledlineex01.png
new file mode 100644
index 0000000000..cc4ac2653d
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/filledlineex01.png differ
diff --git a/html/includes/jpgraph/docs/html/img/funcex1.png b/html/includes/jpgraph/docs/html/img/funcex1.png
new file mode 100644
index 0000000000..86b99caab5
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/funcex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttconstrainex0.png b/html/includes/jpgraph/docs/html/img/ganttconstrainex0.png
new file mode 100644
index 0000000000..edbeccb8e3
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttconstrainex0.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttconstrainex1.png b/html/includes/jpgraph/docs/html/img/ganttconstrainex1.png
new file mode 100644
index 0000000000..6edaa0fa60
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttconstrainex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttex00.png b/html/includes/jpgraph/docs/html/img/ganttex00.png
new file mode 100644
index 0000000000..88f899125f
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttex00.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttex01.png b/html/includes/jpgraph/docs/html/img/ganttex01.png
new file mode 100644
index 0000000000..6f55a1ef88
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttex01.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttex02.png b/html/includes/jpgraph/docs/html/img/ganttex02.png
new file mode 100644
index 0000000000..e6c36524dc
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttex02.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttex03.png b/html/includes/jpgraph/docs/html/img/ganttex03.png
new file mode 100644
index 0000000000..98aa2400b4
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttex03.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttex04.png b/html/includes/jpgraph/docs/html/img/ganttex04.png
new file mode 100644
index 0000000000..fbcf21c968
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttex04.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttex05.png b/html/includes/jpgraph/docs/html/img/ganttex05.png
new file mode 100644
index 0000000000..7b1cf6d7d0
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttex05.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttex06.png b/html/includes/jpgraph/docs/html/img/ganttex06.png
new file mode 100644
index 0000000000..517815bf4c
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttex06.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttex07.png b/html/includes/jpgraph/docs/html/img/ganttex07.png
new file mode 100644
index 0000000000..63ec02ad05
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttex07.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttex08.png b/html/includes/jpgraph/docs/html/img/ganttex08.png
new file mode 100644
index 0000000000..4fef391d6e
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttex08.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttex09.png b/html/includes/jpgraph/docs/html/img/ganttex09.png
new file mode 100644
index 0000000000..233299cf37
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttex09.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttex10.png b/html/includes/jpgraph/docs/html/img/ganttex10.png
new file mode 100644
index 0000000000..ddaf2c48c3
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttex10.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttex11.png b/html/includes/jpgraph/docs/html/img/ganttex11.png
new file mode 100644
index 0000000000..839c730b37
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttex11.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttex12.png b/html/includes/jpgraph/docs/html/img/ganttex12.png
new file mode 100644
index 0000000000..91f1d4b516
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttex12.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttex13.png b/html/includes/jpgraph/docs/html/img/ganttex13.png
new file mode 100644
index 0000000000..4c473f363a
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttex13.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttex14.png b/html/includes/jpgraph/docs/html/img/ganttex14.png
new file mode 100644
index 0000000000..b3ce84c6ab
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttex14.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttex15.png b/html/includes/jpgraph/docs/html/img/ganttex15.png
new file mode 100644
index 0000000000..1d05b3a6d6
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttex15.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttex16.png b/html/includes/jpgraph/docs/html/img/ganttex16.png
new file mode 100644
index 0000000000..d40b88ea45
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttex16.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttex17.png b/html/includes/jpgraph/docs/html/img/ganttex17.png
new file mode 100644
index 0000000000..d108816eb6
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttex17.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttex18.png b/html/includes/jpgraph/docs/html/img/ganttex18.png
new file mode 100644
index 0000000000..06bc561ed4
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttex18.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttex19.png b/html/includes/jpgraph/docs/html/img/ganttex19.png
new file mode 100644
index 0000000000..772f1fe723
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttex19.png differ
diff --git a/html/includes/jpgraph/docs/html/img/gantthgridex1.png b/html/includes/jpgraph/docs/html/img/gantthgridex1.png
new file mode 100644
index 0000000000..5a97839c0c
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/gantthgridex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/gantthourex1.png b/html/includes/jpgraph/docs/html/img/gantthourex1.png
new file mode 100644
index 0000000000..b5b3931e78
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/gantthourex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/gantthourminex1.png b/html/includes/jpgraph/docs/html/img/gantthourminex1.png
new file mode 100644
index 0000000000..7b524952a9
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/gantthourminex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/gantticonex1.png b/html/includes/jpgraph/docs/html/img/gantticonex1.png
new file mode 100644
index 0000000000..e311fe64da
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/gantticonex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/ganttsimpleex1.png b/html/includes/jpgraph/docs/html/img/ganttsimpleex1.png
new file mode 100644
index 0000000000..f995c20456
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/ganttsimpleex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/gradbkgex1.png b/html/includes/jpgraph/docs/html/img/gradbkgex1.png
new file mode 100644
index 0000000000..cc4fccce7d
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/gradbkgex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/horizbarex1.png b/html/includes/jpgraph/docs/html/img/horizbarex1.png
new file mode 100644
index 0000000000..cfe93a05a1
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/horizbarex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/horizbarex2.png b/html/includes/jpgraph/docs/html/img/horizbarex2.png
new file mode 100644
index 0000000000..fef62c94bf
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/horizbarex2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/horizbarex3.png b/html/includes/jpgraph/docs/html/img/horizbarex3.png
new file mode 100644
index 0000000000..19434a8647
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/horizbarex3.png differ
diff --git a/html/includes/jpgraph/docs/html/img/horizbarex4.png b/html/includes/jpgraph/docs/html/img/horizbarex4.png
new file mode 100644
index 0000000000..601dd2b9fb
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/horizbarex4.png differ
diff --git a/html/includes/jpgraph/docs/html/img/imgadj_b00c00sat-1.jpg b/html/includes/jpgraph/docs/html/img/imgadj_b00c00sat-1.jpg
new file mode 100644
index 0000000000..6071541106
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/imgadj_b00c00sat-1.jpg differ
diff --git a/html/includes/jpgraph/docs/html/img/imgadj_b03c-03sat0.jpg b/html/includes/jpgraph/docs/html/img/imgadj_b03c-03sat0.jpg
new file mode 100644
index 0000000000..a24ca50ff0
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/imgadj_b03c-03sat0.jpg differ
diff --git a/html/includes/jpgraph/docs/html/img/imgadj_b04c-07sat-1.jpg b/html/includes/jpgraph/docs/html/img/imgadj_b04c-07sat-1.jpg
new file mode 100644
index 0000000000..2fc8ebb6a6
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/imgadj_b04c-07sat-1.jpg differ
diff --git a/html/includes/jpgraph/docs/html/img/imgadj_b04c-07sat0.jpg b/html/includes/jpgraph/docs/html/img/imgadj_b04c-07sat0.jpg
new file mode 100644
index 0000000000..6f7e5d40e3
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/imgadj_b04c-07sat0.jpg differ
diff --git a/html/includes/jpgraph/docs/html/img/imgadj_b0c0sat1.jpg b/html/includes/jpgraph/docs/html/img/imgadj_b0c0sat1.jpg
new file mode 100644
index 0000000000..114cef7137
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/imgadj_b0c0sat1.jpg differ
diff --git a/html/includes/jpgraph/docs/html/img/imgadj_orig.jpg b/html/includes/jpgraph/docs/html/img/imgadj_orig.jpg
new file mode 100644
index 0000000000..02651a74fe
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/imgadj_orig.jpg differ
diff --git a/html/includes/jpgraph/docs/html/img/imgmarkerex1.png b/html/includes/jpgraph/docs/html/img/imgmarkerex1.png
new file mode 100644
index 0000000000..18df525c07
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/imgmarkerex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/impulsex1.png b/html/includes/jpgraph/docs/html/img/impulsex1.png
new file mode 100644
index 0000000000..e56a0cd1dd
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/impulsex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/impulsex2.png b/html/includes/jpgraph/docs/html/img/impulsex2.png
new file mode 100644
index 0000000000..efb611fb92
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/impulsex2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/impulsex3.png b/html/includes/jpgraph/docs/html/img/impulsex3.png
new file mode 100644
index 0000000000..e2f129feaf
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/impulsex3.png differ
diff --git a/html/includes/jpgraph/docs/html/img/impulsex4.png b/html/includes/jpgraph/docs/html/img/impulsex4.png
new file mode 100644
index 0000000000..752f1658c5
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/impulsex4.png differ
diff --git a/html/includes/jpgraph/docs/html/img/inyaxisex2.png b/html/includes/jpgraph/docs/html/img/inyaxisex2.png
new file mode 100644
index 0000000000..cf8d09dc9d
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/inyaxisex2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/linebarcentex1.png b/html/includes/jpgraph/docs/html/img/linebarcentex1.png
new file mode 100644
index 0000000000..2862f9f5ec
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/linebarcentex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/lineiconex1.png b/html/includes/jpgraph/docs/html/img/lineiconex1.png
new file mode 100644
index 0000000000..89c5518de0
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/lineiconex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/lineiconex2.png b/html/includes/jpgraph/docs/html/img/lineiconex2.png
new file mode 100644
index 0000000000..5675c4554b
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/lineiconex2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/listfontsex1.png b/html/includes/jpgraph/docs/html/img/listfontsex1.png
new file mode 100644
index 0000000000..1fd5dbc08a
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/listfontsex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/logbarex1.png b/html/includes/jpgraph/docs/html/img/logbarex1.png
new file mode 100644
index 0000000000..b9939e86ce
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/logbarex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/loglogex1.png b/html/includes/jpgraph/docs/html/img/loglogex1.png
new file mode 100644
index 0000000000..041827de90
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/loglogex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/manscaleex1.png b/html/includes/jpgraph/docs/html/img/manscaleex1.png
new file mode 100644
index 0000000000..68cd5eb9bb
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/manscaleex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/manscaleex2.png b/html/includes/jpgraph/docs/html/img/manscaleex2.png
new file mode 100644
index 0000000000..644183774d
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/manscaleex2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/manscaleex3.png b/html/includes/jpgraph/docs/html/img/manscaleex3.png
new file mode 100644
index 0000000000..f8a9783cc8
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/manscaleex3.png differ
diff --git a/html/includes/jpgraph/docs/html/img/manscaleex4.png b/html/includes/jpgraph/docs/html/img/manscaleex4.png
new file mode 100644
index 0000000000..2ad8d2c6f4
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/manscaleex4.png differ
diff --git a/html/includes/jpgraph/docs/html/img/markflagex1.png b/html/includes/jpgraph/docs/html/img/markflagex1.png
new file mode 100644
index 0000000000..de13832be8
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/markflagex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/nullvalueex01.png b/html/includes/jpgraph/docs/html/img/nullvalueex01.png
new file mode 100644
index 0000000000..a50583825c
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/nullvalueex01.png differ
diff --git a/html/includes/jpgraph/docs/html/img/partiallyfilledlineex1.png b/html/includes/jpgraph/docs/html/img/partiallyfilledlineex1.png
new file mode 100644
index 0000000000..868f0e7729
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/partiallyfilledlineex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/piecex1.png b/html/includes/jpgraph/docs/html/img/piecex1.png
new file mode 100644
index 0000000000..3e151d810c
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/piecex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/piecex2.png b/html/includes/jpgraph/docs/html/img/piecex2.png
new file mode 100644
index 0000000000..2423350b00
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/piecex2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/pieex3.png b/html/includes/jpgraph/docs/html/img/pieex3.png
new file mode 100644
index 0000000000..509f15751c
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/pieex3.png differ
diff --git a/html/includes/jpgraph/docs/html/img/pieex8.png b/html/includes/jpgraph/docs/html/img/pieex8.png
new file mode 100644
index 0000000000..de2d9f4af4
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/pieex8.png differ
diff --git a/html/includes/jpgraph/docs/html/img/pieex9.png b/html/includes/jpgraph/docs/html/img/pieex9.png
new file mode 100644
index 0000000000..92b101a2bc
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/pieex9.png differ
diff --git a/html/includes/jpgraph/docs/html/img/pielabelsex1.png b/html/includes/jpgraph/docs/html/img/pielabelsex1.png
new file mode 100644
index 0000000000..fcf4c7905d
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/pielabelsex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/pielabelsex2.png b/html/includes/jpgraph/docs/html/img/pielabelsex2.png
new file mode 100644
index 0000000000..cc1d2193cb
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/pielabelsex2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/pielabelsex4.png b/html/includes/jpgraph/docs/html/img/pielabelsex4.png
new file mode 100644
index 0000000000..a6b89e4142
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/pielabelsex4.png differ
diff --git a/html/includes/jpgraph/docs/html/img/polarex0-180.png b/html/includes/jpgraph/docs/html/img/polarex0-180.png
new file mode 100644
index 0000000000..fc102f165f
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/polarex0-180.png differ
diff --git a/html/includes/jpgraph/docs/html/img/polarex0.png b/html/includes/jpgraph/docs/html/img/polarex0.png
new file mode 100644
index 0000000000..ac7f8bf161
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/polarex0.png differ
diff --git a/html/includes/jpgraph/docs/html/img/polarex3-lin.png b/html/includes/jpgraph/docs/html/img/polarex3-lin.png
new file mode 100644
index 0000000000..29cea29fbb
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/polarex3-lin.png differ
diff --git a/html/includes/jpgraph/docs/html/img/polarex3.png b/html/includes/jpgraph/docs/html/img/polarex3.png
new file mode 100644
index 0000000000..bf2fe0652f
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/polarex3.png differ
diff --git a/html/includes/jpgraph/docs/html/img/polarex4.png b/html/includes/jpgraph/docs/html/img/polarex4.png
new file mode 100644
index 0000000000..62ae5a4e03
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/polarex4.png differ
diff --git a/html/includes/jpgraph/docs/html/img/polarex5.png b/html/includes/jpgraph/docs/html/img/polarex5.png
new file mode 100644
index 0000000000..9a46816638
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/polarex5.png differ
diff --git a/html/includes/jpgraph/docs/html/img/polarex7-2.png b/html/includes/jpgraph/docs/html/img/polarex7-2.png
new file mode 100644
index 0000000000..b7bd0648af
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/polarex7-2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/polarex9.png b/html/includes/jpgraph/docs/html/img/polarex9.png
new file mode 100644
index 0000000000..aeffaa89f6
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/polarex9.png differ
diff --git a/html/includes/jpgraph/docs/html/img/radarex1.png b/html/includes/jpgraph/docs/html/img/radarex1.png
new file mode 100644
index 0000000000..c9a7aa1325
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/radarex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/radarex2.png b/html/includes/jpgraph/docs/html/img/radarex2.png
new file mode 100644
index 0000000000..8118cdbf38
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/radarex2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/radarex4.png b/html/includes/jpgraph/docs/html/img/radarex4.png
new file mode 100644
index 0000000000..ac4acaf0fc
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/radarex4.png differ
diff --git a/html/includes/jpgraph/docs/html/img/radarex6.1.png b/html/includes/jpgraph/docs/html/img/radarex6.1.png
new file mode 100644
index 0000000000..1e093188b5
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/radarex6.1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/radarex6.png b/html/includes/jpgraph/docs/html/img/radarex6.png
new file mode 100644
index 0000000000..ffece19f77
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/radarex6.png differ
diff --git a/html/includes/jpgraph/docs/html/img/radarex7.png b/html/includes/jpgraph/docs/html/img/radarex7.png
new file mode 100644
index 0000000000..fc76f93a39
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/radarex7.png differ
diff --git a/html/includes/jpgraph/docs/html/img/radarex8.1.png b/html/includes/jpgraph/docs/html/img/radarex8.1.png
new file mode 100644
index 0000000000..0d704c861b
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/radarex8.1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/radarex8.png b/html/includes/jpgraph/docs/html/img/radarex8.png
new file mode 100644
index 0000000000..46b5dd2f9b
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/radarex8.png differ
diff --git a/html/includes/jpgraph/docs/html/img/radarmarkex1.png b/html/includes/jpgraph/docs/html/img/radarmarkex1.png
new file mode 100644
index 0000000000..de79ed6312
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/radarmarkex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/rotex0.png b/html/includes/jpgraph/docs/html/img/rotex0.png
new file mode 100644
index 0000000000..6d6246ce36
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/rotex0.png differ
diff --git a/html/includes/jpgraph/docs/html/img/rotex1.png b/html/includes/jpgraph/docs/html/img/rotex1.png
new file mode 100644
index 0000000000..981d7889f4
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/rotex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/rotex2.png b/html/includes/jpgraph/docs/html/img/rotex2.png
new file mode 100644
index 0000000000..cbe7c4cba9
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/rotex2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/rotex3.png b/html/includes/jpgraph/docs/html/img/rotex3.png
new file mode 100644
index 0000000000..2e24171eb1
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/rotex3.png differ
diff --git a/html/includes/jpgraph/docs/html/img/rotex4.png b/html/includes/jpgraph/docs/html/img/rotex4.png
new file mode 100644
index 0000000000..e4619c445a
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/rotex4.png differ
diff --git a/html/includes/jpgraph/docs/html/img/rotex5.png b/html/includes/jpgraph/docs/html/img/rotex5.png
new file mode 100644
index 0000000000..052eb315cd
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/rotex5.png differ
diff --git a/html/includes/jpgraph/docs/html/img/scatterex1.png b/html/includes/jpgraph/docs/html/img/scatterex1.png
new file mode 100644
index 0000000000..6b1efdf2ac
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/scatterex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/scatterex2.png b/html/includes/jpgraph/docs/html/img/scatterex2.png
new file mode 100644
index 0000000000..c51579bafa
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/scatterex2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/smallstaticbandsex1.png b/html/includes/jpgraph/docs/html/img/smallstaticbandsex1.png
new file mode 100644
index 0000000000..d2f80cb500
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/smallstaticbandsex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/smallstaticbandsex10.png b/html/includes/jpgraph/docs/html/img/smallstaticbandsex10.png
new file mode 100644
index 0000000000..abd1cfabba
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/smallstaticbandsex10.png differ
diff --git a/html/includes/jpgraph/docs/html/img/smallstaticbandsex2.png b/html/includes/jpgraph/docs/html/img/smallstaticbandsex2.png
new file mode 100644
index 0000000000..160ba68bca
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/smallstaticbandsex2.png differ
diff --git a/html/includes/jpgraph/docs/html/img/smallstaticbandsex3.png b/html/includes/jpgraph/docs/html/img/smallstaticbandsex3.png
new file mode 100644
index 0000000000..6e015e5276
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/smallstaticbandsex3.png differ
diff --git a/html/includes/jpgraph/docs/html/img/smallstaticbandsex4.png b/html/includes/jpgraph/docs/html/img/smallstaticbandsex4.png
new file mode 100644
index 0000000000..941070aefe
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/smallstaticbandsex4.png differ
diff --git a/html/includes/jpgraph/docs/html/img/smallstaticbandsex5.png b/html/includes/jpgraph/docs/html/img/smallstaticbandsex5.png
new file mode 100644
index 0000000000..cf67640d5e
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/smallstaticbandsex5.png differ
diff --git a/html/includes/jpgraph/docs/html/img/smallstaticbandsex6.png b/html/includes/jpgraph/docs/html/img/smallstaticbandsex6.png
new file mode 100644
index 0000000000..00ce901994
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/smallstaticbandsex6.png differ
diff --git a/html/includes/jpgraph/docs/html/img/smallstaticbandsex7.png b/html/includes/jpgraph/docs/html/img/smallstaticbandsex7.png
new file mode 100644
index 0000000000..a5bab99005
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/smallstaticbandsex7.png differ
diff --git a/html/includes/jpgraph/docs/html/img/smallstaticbandsex8.png b/html/includes/jpgraph/docs/html/img/smallstaticbandsex8.png
new file mode 100644
index 0000000000..31f8b23204
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/smallstaticbandsex8.png differ
diff --git a/html/includes/jpgraph/docs/html/img/smallstaticbandsex9.png b/html/includes/jpgraph/docs/html/img/smallstaticbandsex9.png
new file mode 100644
index 0000000000..80ca770fc7
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/smallstaticbandsex9.png differ
diff --git a/html/includes/jpgraph/docs/html/img/splineex1.png b/html/includes/jpgraph/docs/html/img/splineex1.png
new file mode 100644
index 0000000000..435f8223a0
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/splineex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/staticbandbarex7.png b/html/includes/jpgraph/docs/html/img/staticbandbarex7.png
new file mode 100644
index 0000000000..7aa524f88a
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/staticbandbarex7.png differ
diff --git a/html/includes/jpgraph/docs/html/img/stockex1.png b/html/includes/jpgraph/docs/html/img/stockex1.png
new file mode 100644
index 0000000000..8d154e1395
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/stockex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/tabtitleex1.png b/html/includes/jpgraph/docs/html/img/tabtitleex1.png
new file mode 100644
index 0000000000..c3930a6375
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/tabtitleex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/textalignex1.png b/html/includes/jpgraph/docs/html/img/textalignex1.png
new file mode 100644
index 0000000000..68a65da107
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/textalignex1.png differ
diff --git a/html/includes/jpgraph/docs/html/img/theme01.png b/html/includes/jpgraph/docs/html/img/theme01.png
new file mode 100644
index 0000000000..18f8ea04a3
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/theme01.png differ
diff --git a/html/includes/jpgraph/docs/html/img/theme02.png b/html/includes/jpgraph/docs/html/img/theme02.png
new file mode 100644
index 0000000000..18f3919cff
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/theme02.png differ
diff --git a/html/includes/jpgraph/docs/html/img/theme03.png b/html/includes/jpgraph/docs/html/img/theme03.png
new file mode 100644
index 0000000000..aaad2758c4
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/theme03.png differ
diff --git a/html/includes/jpgraph/docs/html/img/theme04.png b/html/includes/jpgraph/docs/html/img/theme04.png
new file mode 100644
index 0000000000..24e4c91b62
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/theme04.png differ
diff --git a/html/includes/jpgraph/docs/html/img/topxaxisex1.png b/html/includes/jpgraph/docs/html/img/topxaxisex1.png
new file mode 100644
index 0000000000..32d1198bc4
Binary files /dev/null and b/html/includes/jpgraph/docs/html/img/topxaxisex1.png differ
diff --git a/html/includes/jpgraph/docs/html/imgadj_b00c00sat-1.jpg b/html/includes/jpgraph/docs/html/imgadj_b00c00sat-1.jpg
new file mode 100644
index 0000000000..6071541106
Binary files /dev/null and b/html/includes/jpgraph/docs/html/imgadj_b00c00sat-1.jpg differ
diff --git a/html/includes/jpgraph/docs/html/imgadj_b03c-03sat0.jpg b/html/includes/jpgraph/docs/html/imgadj_b03c-03sat0.jpg
new file mode 100644
index 0000000000..a24ca50ff0
Binary files /dev/null and b/html/includes/jpgraph/docs/html/imgadj_b03c-03sat0.jpg differ
diff --git a/html/includes/jpgraph/docs/html/imgadj_b04c-07sat-1.jpg b/html/includes/jpgraph/docs/html/imgadj_b04c-07sat-1.jpg
new file mode 100644
index 0000000000..2fc8ebb6a6
Binary files /dev/null and b/html/includes/jpgraph/docs/html/imgadj_b04c-07sat-1.jpg differ
diff --git a/html/includes/jpgraph/docs/html/imgadj_b04c-07sat0.jpg b/html/includes/jpgraph/docs/html/imgadj_b04c-07sat0.jpg
new file mode 100644
index 0000000000..6f7e5d40e3
Binary files /dev/null and b/html/includes/jpgraph/docs/html/imgadj_b04c-07sat0.jpg differ
diff --git a/html/includes/jpgraph/docs/html/imgadj_b0c0sat1.jpg b/html/includes/jpgraph/docs/html/imgadj_b0c0sat1.jpg
new file mode 100644
index 0000000000..114cef7137
Binary files /dev/null and b/html/includes/jpgraph/docs/html/imgadj_b0c0sat1.jpg differ
diff --git a/html/includes/jpgraph/docs/html/imgadj_orig.jpg b/html/includes/jpgraph/docs/html/imgadj_orig.jpg
new file mode 100644
index 0000000000..02651a74fe
Binary files /dev/null and b/html/includes/jpgraph/docs/html/imgadj_orig.jpg differ
diff --git a/html/includes/jpgraph/docs/html/index.html b/html/includes/jpgraph/docs/html/index.html
new file mode 100644
index 0000000000..4fb4c1400a
--- /dev/null
+++ b/html/includes/jpgraph/docs/html/index.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+Version | Date | Status | Who | Comment | +
---|---|---|---|---|
R1.8 | 2005-12-28 | Released | Johan Persson | +Additional info for JpGraph 1.20.1 |
The bulk of the text was written directly in Emacs on a GNU/Linux + system in a mixture of PHP and HTML. A number of PHP functions were + used to automate the handling of formatting example code and figures.
+To generate the images automatically in the img directory a custom + awk-script is used to extract all the used image script from the + manual. The script then uses the client version of PHP generate the + images from the scripts and stores them in the 'img' directory.
+The final set of HTML files was then processes by HTMLDOC to + construct table of contents and chapter links.
+This manual covers versions up to 1.20 of JpGraph. A 2D graph + plotting library for PHP.
+Even though the library is known to work with version of PHP prior + to 4.3 the library is not tested nor is it recommended to run with any + older versions of PHP.
+JpGraph is released under a dual license QPL 1.0 (Qt-License) for + non-commercial (including educational) use of the library and the + JpGraph Professional License for commercial use.
+JpGraph library is an OO graph library which makes it easy to both + draw a "quick and dirty" graph with a minimum of code and quite complex + graphs which requires a very fine grain of control. The library tries + to assign sensible default values for most parameters hence making the + learning curve quite flat since for most of the time very few commands + is required to draw graphs with a pleasing esthetic look.
+Some highlights of available features are
+In addition to these high level features the library has been + designed to be orthogonal and consistent in its' naming convention. For + example, to specify color each object (i.e. axis, grids, texts, titles + etc) within the graph implements the method SetColor() with the same + signature.
+The latest version of jpgraph can always be found on +http://www.aditus.nu/jpgraph/
+Information on version numbering schema
+For the latest update on planned future version see the web-site for + JpGraph at http://www.aditus.nu/jpgraph/
+The idea for writing this library grew out of our own need for a + high quality graph drawing library for PHP. When evaluating potential + existing libraries we found (at that time circa 2001) these three
+All these libraries implements some fine graphic features but + unfortunately none of those completely fulfilled our needs either for + available functionality (for example none of these supported both two + Y-scales, auto-scaling, and logarithmic scales), or general + flexibility. We especially needed the option of two Y-scales, which + none of the above packages supported. Our own preferences for design + was closest to "chart 0.3" so we started by fixing some bugs in that + package and adding some new features. However It was soon realized that + to add all the features and flexibility we needed to "chart 0.3" it + would require a complete rewrite since the original design wasn't + flexible enough, especially adding a second Y-scale would require a + more flexible OO architecture.
+Defects or suggestion for new features can be entered using the +JpGraph BugTracker available at +http://www.aditus.nu/bugtraq/
+Before reporting bugs or feature suggestions may we ask that the + following facts are considered.
+Customers who have acquired the pro-version of the library are + entitled to prioritized e-mail support for a specific time after the + purchase. Support tickets may be created by first logging in to +http://www.aditus.nu/jpgraph/pro_login.php and then create a support + ticket.
+For other users a public community forum is available at +http://jpgraph.intellit.nl/ where many common questions are answered + and discussed.
+A collection of FAQ is available at +http://www.aditus.nu/jpgraph/jpgraphfaq.php
+In addition there is a growing list of "HowTo" documents available + at +http://www.aditus.nu/jpgraph/jpgraphowto.php
+Finally, we regret that we are unable to provide general support + regarding PHP/GD/TTF/Apache installation outside the specific scope of + the JpGraph library. Please see the corresponding documentation and + relevant FAQ for those products.
+ +In order to make use of the library it is necessary to ensure that + the script files can correctly access the library include files (as + described below) and that the PHP installation supports at least one + graphic format, i.e. it supports the "image" extension in PHP.
+This is easiest verified by either checking the output of the + phpinfo() standard PHP function or by making sure the PHP + installation make the 'imagecreate()' function available.
+This means that the installation + + must have a working GD-library together with PHP before the library + JpGraph can be used. Please make sure you have version 4.3.x or above + of PHP since JpGraph is not actively tested with + versions prior to PHP 4.3.x Ideally you should use at least PHP 4.3.8
+Please note that the 1.x version of the library do not + support PHP 5.x
+In order to make sure that the GD installed the following example + would be run. The example creates a very simple image using just pure + GD calls and outputs an image in PNG format. This could be considered a + smoke-test to see that the GD library is available from PHP. Please + note that this is an absolute pre-requisite in order for the + JpGraph library to work at all.
+Store the code snippet below somewhere in the document root and make + sure it runs correctly.
+ $im = @
+ImageCreate (
+150, 100)
+
or die (
+"Cannot create a new GD image.");
+
$background_color
+= ImageColorAllocate
+($im, 255,
+255, 255);
+
$text_color
+= ImageColorAllocate
+($im, 233,
+14, 91);
+
ImageString
+($im, 1,
+5, 5, "A Simple Text String", $text_color
+);
+
header ("Content-type: image/png");
+
ImagePng ($im);
+
If the above script does not work or some error or warnings are + printed on the screen then it is necessary to correct those problems + before proceeding with the installation.
+To access the more advanced features of JpGraph needs the GD 2.x + library. This will allow the use of features such as alpha-blending and + trucolor images.
+The GD 2.x library is included in all standard PHP versions from + 4.2.x and above. To make sure that the GD 2.x library is installed the + following script must be working.
+ $im =
+imagecreatetruecolor (
+300, 200);
+
$black = imagecolorallocate ($im,
+0, 0, 0
+);
+
$white = imagecolorallocate ($im,
+255, 255, 255
+);
+
+
imagefilledrectangle
+($im,0,
+0,399,99
+,$white);
+
imagerectangle
+($im,20,
+20,250,190
+,$black);
+
+
header ("Content-type: image/png"
+);
+
imagepng ($im);
+
After running this script you should now see a black rectangle in + your browser.
+JpGraph contains as default a standard set of bitmap fonts which + only supports the standard ASCII 7-bit character set. In order to use + accented characters, UTF-8, Chinese, Japanese, etc You need to download + TTF fonts. Due to various legal issues no TTF fonts are supplied in the + JpGraph package. To enable TTF fonts there are three alternatives:
+It is also necessary to make sure that the PHP installation supports + TTF fonts (either through FreeType 1 or FreeType 2 libraries). I n + addition some suitable TTF font files must also be available. To make + the font files available for the library the directory path to the + location of the font files must be specified in the configuration file, + jpg-config.inc
+JpGraph uses a standard naming convention for the TTF font files in + order to be able to find the correct font files. This naming convention + follows the standard naming of the available font files.
+If the installation of the library is made on a computer running MS + Windows then it is recommended to use the already available font files + in Windows (usually located in C:\WINDOWS\FONTS).
+If the installation is made on a UNIX derivate running X11 then the + font location can differ between versions and UNIX brands. One commonly + used path is "/usr/X11R6/lib/X11/fonts/truetype/".
+Finally we note that it is possible to install additional fonts not + natively supported by the library. Since this requires augmenting the + library files this is considered advanced use and not further discussed + in this introduction.
+In addition to European font it is also possible to use non-latin + based fonts such as Cyrillic, Japanese and Chinese.
+In all cases a suitable TTF font that supports the non-latin based + language must be available.
+For Cyrillic support the define LANGUAGE_CYRILLIC in jpg-config.php + must be set to true. It is then possible to use a suitable Cyrillic + font as replacement for the ordinary fonts.
+For Chinese character set JpGraph supports both BIG5 and GB2312 + encoding. For BIG5 encoding the PHP installation must have support for + the "iconv()" function. Furthermore the define CHINESE_TTF_FONT must be + set to the name of the Chinese BIG5 font that is to be used. By default + this is set to "bkai00mp.ttf". To use the Chinese BIG5 font in the + scripts one must then specify the font family as FF_CHINESE.
+To use the alternative font files "simsun.ttc" and "simhei.ttf" + (which uses the GB2312 encoding) the only step needed is to install + those fonts in the normal TTF font directory and then specify the font + family as FF_SIMSUN, the "simhei.ttf" is used when the font style is + specified as FS_BOLD.
+In order for JpGraph to work it is necessary to adjust the cache and + TTF directory to suit the specific installation. By default the TTF + directory is "/usr/X11R6/lib/X11/fonts/truetype/" and for the cache + "/tmp/jpgraph_cache/". These are defined as PHP defines at the top of + jpg-config.inc
+Please make sure that PHP has write permissions to the cache + directory if the cache feature should be used. If this is not the case + a "Can't write file xxx.yyy" error will occur when a graph that uses + the cache feature are generate. More information regarding the cache + feature of JpGraph is available in the section Making sense of + caching system in JpGraph
+This is the base library files, which you must have
+To add plots to the graph you will need one or more of the following + files plot extension files depending on what kind of graph you need to + create.
+In the pro-version the following additional files are available
+Per default the standard GD image library supports PNG graphic + formats. You will need to have that installed together with your PHP + module for this library to work at all. Please refer to PHP + documentation on specifics. Note that the newer versions of GD does not + support the GIF format due to copyright problems. Hence by default only + PNG is supported.
+If you want JPEG support you will also need an additional library + for PHP, again please see PHP documentation for specifics. For most + practical purposes PNG is a better format since it normally achieves + better compression then GIF (typically by a factor of 2 for the types + of images generated by JpGraph). In comparison with JPEG format PNG is + also better for the type of images generated by this library. So, the + bottom line is, you should have a very good reason to choose any other + format then PNG.
+By default the image format is set to "auto". This means that + JpGraph automatically chooses the best available graphic using the + preferred order "PNG", "GIF", "JPG".
+ +If You are insatlling the 2.x branch then make sure the PHP version + used is at least 5.0.1 (preferable 5.0.5 or higher) and that the PHP + version have compiled support for GD 2.x library. Please note that the + 2.x branch will not work with PHP 4.x
+For 99% of the users this library will work directly with a recent + installation of PHP without any problem.
+Experience shows that most of the trouble are caused by either an + old buggy version of the free-type TTF library or using an old + antiquated version of the GD library. In order to narrow it down the + problem the following steps is helpful.
+This is not meant to be a complete discussion about configuring + or compiling PHP. It is meant as an example of a configuration of PHP + that is known to work well with JpGraph.
+Below is an example of a standard configuration that can be used to + configure and compile PHP for use with the JpGraph Library
+Please note that depending on the specific installation requirements + other options might have to be specified, specifically the paths to + external libraries might need to be adjusted.
++./configure --prefix=/usr/share \ +--datadir=/usr/share/php \ +--with-apxs=/usr/sbin/apxs \ +--libdir=/usr/share \ +--includedir=/usr/include \ +--bindir=/usr/bin \ +--with-config-file-path=/etc \ +--enable-mbstring --enable-mbregex \ +--with-pdflib=/usr \ +--with-mysql \ +--with-ttf-dir=/usr/lib \ +--with-freetype-dir=/usr/lib \ +--with-gd --enable-gd-imgstrttf --enable-gd-native-ttf \ +--with-zlib-dir=/usr/lib \ +--with-png-dir=/usr/lib --with-jpeg-dir=/usr/lib --with-xpm-dir=/usr/X11R6 \ +--with-tiff-dir=/usr/lib \ +--enable-ftp \ +--enable-memory-limit --enable-safe-mode \ +--bindir=/usr/bin \ +--enable-bcmath -enable-calendar \ +--enable-ctype --with-ftp \ +--enable-magic-quotes \ +--enable-inline-optimization \ +--with-bz2 \ +--with-iconv ++
The purpose of this chapter is to put dynamic image generation in + perspective and illustrate how HTML tags is used to call image + generating scripts. Even if You are familiar with PHP it is strongly + recommended to quickly browse through this chapter to make sure all + concepts are known.
+If You fully understand and can explain the concept of MIME types, + HTTP streams and why the "Headers already sent error" error is very + common when generating dynamic images with PHP it is probably safe to + skip this chapter. Otherwise it might be wise to read through this + chapter once.
+As a general rule each PHP script which generates an image must be + specified in a separate file which is then called in an HTML <IMG> tag. + For example, the following HTML excerpt includes the image generated by + the PHP script in "fig1.php".
+
+ <img src="fig1.php"
+border=0 align=center width
+=300 height=200>
+
Strictly speaking the "align", "width" and "height" are not + necessary but helps the browser position the image correctly before the + image has been fully sent back to the browser.
+The library will automatically generate the necessary headers to be + sent back to the browser so that it correctly recognize the data stream + received as an image of either PNG/GIF/JPEG format. The browser can + then correctly decode the image
+Observe that you can't return anything else than an + image from the image script. By definition each HTML page (or more + correctly each HTTP stream) can only consist of one mime type which is + determined by the header for that particular stream.
+A common mistake is to have a space in the beginning of the image + script which the HTTP server will send back to the browser. The browser + now assumes that the data coming back from this script is text since it + hasn't received an explicit header. When then the image headers get + sent back to the browser to forewarn the browser of the forthcoming + image the browser will not like that as it has already assumed the data + stream was a text stream. The browser will then give the infamous + "Headers already sent error".
+To include several images together with text on a page you need to + have a parent page with several <IMG> tags which each refers to an + image script (or the same image script with GET/POST data).
+To get access to the JpGraph library you will need to include at + least two files, the base library and one or more of the plot + extensions. So for example to create a basic line plot the top of your + PHP file must have the lines:
+
+
include (
+'jpgraph.php');
+
include ('jpgraph_line.php'
+);
+
...
+
// Code that uses the jpgraph library
+
...
+
It is also possible to generate images directly using the command + line version of PHP. This works the same way as the normal "through the + browser" generation with the exception that no HTTP headers will be + generated. Only the binary image data.
+Please make sure that you run the command line version of PHP (cli). + Using the CGI SAPI version will not work since then the HTTP headers + will be generated. Note: If the CGI version is used the generation of + headers may be suppressed by the '-q' option.
+You can easily check the version installed by running
+php --version+
you should then get a response with something like
++PHP 4.3.8 (cli) (built: Aug 29 2004 22:48:10) +Copyright (c) 1997-2004 The PHP Group +Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies ++
The important thing here is the
+(cli)+
marker. The JpGraph library check from what SAPI API it is invoked + from and adjusts the header generation accordingly.
+If all the above requirements are met then images can be generated + directly on the command line and stored in a suitable file. For example + by
++$> php myimage.php > image.png ++
Please note that the file extension on the image file must match the + format in which the image is generated.
+The common pattern for creating graphs is
+Of course it is of perfectly possible to call the image script + directly in the browser to just display the generated image in the + browser.
+You should remember that it is also possible to pass arguments to + the image script via the normal HTTP GET/POST arguments. For example
<img src
+="showgraph.php?a=1&b=2"
+>
This could for example be used to control the appearance of the + image or perhaps send data to the image which will be displayed. Note + that this is probably not the best way to send large amount of data to + plot. Instead the only practical way, for large data sizes, is to get + all the data in the image script, perhaps from a DB. Another + alternative for large amount of data to be sent to the image script is + by creating a POST request to the image script.
+echo '<img src="myimagescript.php?dummy='.now().'">'; ++ It is also important to be aware of any internal caching the browser + might do. The general problem with dynamically generated images is that + the image generating script (file) remains the same. This makes the + browser believe that the data hasn't changed and if the browser already + has issues a previous GET request and has the data cached it will not + send a new GET if the timestamp on the file is the same since it then + believes it my use the old cached version.
When it comes to the structure of your imaging script they will + generally have the structure
+
+// ... Include necessary headers
+
+
$graph
+= new Graph($width,
+$height, ...);
+
+
+// ... code to construct the graph details
+
+
$graph->Stroke();
+
JpGraph is completely Object oriented so all calls will be action on + specific instances of classes. One of the fundamental classes is the + Graph() class which represents the entire graph.
+After the creation of the Graph() object all the code lines to + construct the details of the graph are added.
+The final method called in an image script will most likely be the + Graph::Stroke() method. This will send the constructed image back + to the browser. A variation of this is used if the graph are supposed + to have image maps. In that case the final method will be + Graph::StrokeCSIM()
+In addition to this standard usage pattern you can also choose to
+The cache system, which lessens the burden of the PHP server, works + by avoiding o run all the code that follows the initial Graph() call by + checking if the image has already been created and in that case + directly send back the previously created (and stored in a file) image + to the browser. When using the cache system a filename must be + specified in the initial Graph() call which is used to store the image + in the cache system and possibly also a timeout value to indicate how + long the image in the cache directory should be valid.
+In many of the examples in this manual the following pattern will be + used
+ $graph = new
+Graph(300,200
+,"auto");
The two first parameters specify the width and height of the graph + and the third parameter the name of the image file in the cache + directory. The special name 'auto' indicates that the image file + will be given the same name as the image script but with the extension + changed to indicate the graphic format used, i.e '.jpg', '.png' and so + on.
+Please note that the cache system by default is disabled and must be + enabled by setting the proper define in the file "jpg-config.inc"
+By default JpGraph automatically chooses the image format to use in + the order PNG, JPEG and GIF. The exact format depends on what is + available on your system. There are two ways you can influence the way + the graphic format is chosen.
+ DEFINE
+("DEFAULT_GFORMAT"
+,"auto");
$graph->
+img->
+SetImgFormat(
+"jpeg")
+
If you like to save the image directly to a file instead of + streaming it back to the browser then you just have to specify an + absolute filename in the final call to Graph::Stroke(), i.e.
+
+ $graph->
+Stroke(
+"/usr/home/peter/images/result2002.png");
Please note that the user running as Apache/PHP must have write + access to the specified directory.
+There are also two predefined filenames which have special meaning.
+ $handle =
+$graph->Stroke(_IMG_HANDLER
+);
JpGraph supports both a set of built in bit-mapped fonts as well as + True Type Fonts. For scale values on axis it is strongly recommended + that you just use the built in bitmap fonts for the simple reason that + they are, for most people, easier to read (they are also quicker to + render). Try to use TTF only for headlines and perhaps the title for a + graph and it's axis. By default the TTF will be drawn with + anti-aliasing turned on.
+In many of the example you can see examples of both TrueType and + Bitmap fonts.
+There are a number of subtle differences in the way builtin fonts + and TrueType fonts are rendered to the screen. However, JpGraph, + abstracts away 99.9% of the differences so it will be, for the user, + completely transparent to switch between the different fonts.
+Since Internally TrueType fonts are rendered by locating a font + specification file you must install the accompanying TrueType fonts in + directory of your choice. You must then tell JpGraph where these fonts + may be found by specifying the font-path in the FONT_PATH define (in + jpg-config.inc). Please note that this must be the absolute file path + and not relative to the htdocs directory. By default the path is set to
+ DEFINE(
+"TTF_DIR",
+"/usr/local/fonts/ttf/");
+
Since JpGraph must be able to tell the difference between the italic + and bold versions of the same font family a standard naming convention + is used to name the files. The available fonts are also defined by + DEFINES and hence you can't just copy your own TTF files to the + directory and expect it to work. At the moment there is no "easy" way + to add new fonts but to make some (small) mods to the code. However + this is expected to change in future version of JpGraph.
+In order to get TTF fonts working with JpGraph you should first + check that the following pure GD scripts work correctly. Please adjust + the font path according to your installation.
+ DEFINE
+("TTF_DIR","/usr/X11R6/lib/X11/fonts/truetype/"
+);
+
+
$im = imagecreatetruecolor (400,
+100);
+
$black = imagecolorallocate ($im,
+0, 0, 0
+);
+
$white = imagecolorallocate ($im,
+255, 255, 255
+);
+
+
imagerectangle
+($im,0,
+0,399,99
+,$black);
+
imagefilledrectangle
+($im,0,
+0,399,99
+,$white);
+
+
imagettftext
+($im, 30,
+0, 10, 40
+, $black, TTF_DIR.
+"arial.ttf",
+"Hello World!");
+
+
header ("Content-type: image/png"
+);
+
imagepng ($im);
+
The above script assumes you have the GD2 library and will create an + image with the classical "Hello World!" text printed in black.
+All graph objects that uses text allows you to specify the font to + be used by calling the SetFont() method and specifying three parameters
+For the builtin fonts the third, size, parameter is ignored since + the size is fixed for the three builtin fonts. The available font + families and the corresponding name (in JpGraph 1.7) are listed in the + table below.
+ +Font family | Type | Note |
FF_FONT0 | Builtin font | A very small font, only + one style |
FF_FONT1 | Builtin font | A medium sized font |
FF_FONT2 | Builtin font | The largest bit mapped + font |
FF_ARIAL | TTF font | Arial font |
FF_VERDANA | TTF font | Verdana font |
FF_COURIER | TTF font | Fix pitched courier |
FF_BOOK | TTF font | Bookman |
FF_COMIC | TTF font | Comic sans |
FF_TIMES | TTF font | Times New Roman |
FF_GEORGIA | TTF font | Georgia |
FF_TREBUCHE | TTF font | Trebuche |
FF_VERA | TTF font | Gnome Vera font, Available from + http://www.gnome.org/fonts/ |
FF_VERAMONO | TTF font | Gnome Vera Mono font, + Available from http://www.gnome.org/fonts/ | FF_VERASERIF | TTF font | Gnome Vera Serif font, + Available from http://www.gnome.org/fonts/ | +
FF_CHINESE | TTF font | Installed chinese font |
FF_SIMSUN | TTF font | Installed chinese font |
FF_BIG5 | TTF font | Installed Chinese BIG5 font + (needs iconv()) |
Please note that not all font families support all styles. The + figure below illustrates each of the available font families and what + styles you may use.
+ +We finally show some example of valid font specifications
$graph
+->title->SetFont(
+FF_FONT2);
+
$graph->title->
+SetFont(
+FF_FONT2,
+FS_BOLD);
+
$graph->title->
+SetFont(
+FF_ARIAL);
+
$graph->title->
+SetFont(
+FF_ARIAL,
+FS_BOLD,24);
Note: This information is only given here for very + advanced users. No free support will be given in the case you run into + difficulties trying to add new fonts. At the moment adding new fonts + require code modifications as outlined below.
+In order to add you favorite fonts there are three steps you need to + follow :
+For everyday use of JpGraph understanding of the alignment of text + strings in not necessary. However, if you like to add arbitrary strings + to the graph (with Graph::AddText()) or when working directly on a + canvas it will help understand this.
+Text is added to a graph with the creation of a +Text() object. And the alignment is specified with +Text::Align() Text alignment might actually be a misguiding name. + What you specify is rather the anchor point for the text, i.e. when you + specify that a text should be positioned at position (x,y) how + is that coordinate to be interpretated.
+The image below shows a text string aligned in the 9 possible + combinations. In the image the red crosses indicate what coordinate + that text string was positioned at. The alignment used for each of the + cases is shown below.
+ + +Colors can be specified in three different ways
+ SetColor
+("khaki");
A named color can also be modified by adding a adjustment factor. An + adjustment factor, 0 < f < 1, a smaller value will give a darker + version and a value of 0 or 1 will return the original color. A value > + 1 will make the color brighter. A few examples
+ SetColor
+("khaki:0.5"
+); // A darker version of "khaki"
+
SetColor("yellow:1.2");
+// A slightly lighter version of "yellow"
+
+ SetColor(array(65,
+100,176));
SetColor
+("#A16BFF");
From version 1.10 JpGraph also supports the use of Alpha Blending + together with GD2.x This lets you specify how much of the underlying + color should be visible. You specify the amount of transparency for a + color by adding an extra parameter to the color specification separated + by an '@' (at) character.
+For example to specify a red color which is 40% transparent you + write
+ SetColor(
+"red@0.4");
+
or to specify 90% transparancy you write
+ SetColor
+("red@0.9");
Below is an example of how a bar graph with a background image can + make use of transparency
+ + The chart below shows all available named colors.
+
+
+
For more on how to use the different themes to set the colors of Pie + plots please refer to "Working with 2D & 3D pie plots"
+
+
Theme 1: Earth
+
Theme 2: Pastel
+
Theme 3: Water
+
Theme 4: Sand
To reduce load on the web server JpGraph implements an advanced + caching system which avoids the burden of always having to run the full + image script.
+Depending on the complexity of the image script (for example if it + is doing several DB lookups) this could significantly improve + performance.
+The rationale behind this is of course performance, and the + observation that very few graphs are really real-time, i.e. needs to be + updated absolutely every time the graphing script is called.
+ +The enabling disabling of the cache system is controlled by two + defines (in jpg-config.php)
+
+ DEFINE(
+"USE_CACHE",
+true);
+
DEFINE("READ_CACHE",
+true)
+
The first of these, USE_CACHE, is the master-switch which must be + set to true to enable the caching system. The second switch READ_CACHE + very seldom needs to be changed.
+This second switch basically tells whether or not JpGraph should + ever look in the cache. Setting this to false and the master-switch to + true would then always generate an new updated image file in the cache + and this new image would be send back to the browser. The main use for + this (admittedly) strange setting is if you like to have the side + effect of the script that a fresh image is always stored in the cache + directory.
+Once you have enabled the cache you must also make sure that a valid + cache directory is setup. The cache directory is specified with the + define
+
+ DEFINE(
+"CACHE_DIR",
+"/tmp/jpgraph_cache/");
+
You can of course change the default directory to whatever directory + you fancy. But, you must remember one important thing. The + cache directory must be writable for the user running Apache/PHP +.
+To use caching in your script you must supply a suitable file name + which will be used to store the image in the cache. You can also supply + a timeout value indicating how many minutes the cached image should be + considered valid.
+These parameters are supplied in the initial Graph() method call + which should be among the first in your script. Instead of manually + specifying a file name to be used you could often use the special name + "auto". If the filename is specified as "auto" the cashed image will + then be named the same as the image script but with the correct + extension depending on what image format have been chosen.
+If you don't specify a file name no caching will be used no matter + the settings of USE_CACHE (without a file name it is impossible!)
+The following call to Graph() shows a typical use of the cache.
+
+ $graph = new
+Graph(300,200
+,"auto",60)
+
The above code will use the automatic filename and a make the cache + valid for 60 minutes.
+So, how does this all work now?
+The first time you call your script (no cached image) everything + will be as usual, the script will run and you will in the end send back + the image to the browser. However if you have the caching enabled + JpGraph will automatically have stored a copy of the generated image in + the cache directory.
+The next time you call the script the first thing that happens in + the initial Graph() is that it will go and check in the cache directory + if the named image exists there. If this is the case it will also + checks that the image isn't too old (as compared to the specified + timeout value). If the image is valid then the image will be streamed + straight back from the image file to the browser and the script will + end it's execution.
+Hence, if the image is found in the cache no code lines + after the initial Graph() call will be executed
+The design decision behind this is that your image script code never + has to include anything special to make full use of the cache. It will + just automatically work.
+You can also use the cache system for CSIM as well. The cache system + interface is slightly different in this case since the cache needs to + store both the cached image and the cached image-map. + It also needs to change due to the way CSIM HTML paradigm work. The two + major differences from the "standard" cache is
+The performance benefits even for simple CSIM images is around 50% + if the cache can be used and can of course be several 1000% if + construction of the image requires DB calls and other complex + operations which can be avoided.
+Before reading further you should have an understanding on how the + CSIM works by reading the section "sing Client side image maps".
+Please remember that when using CSIM you must end your script with a + call to Graph::StrokeCSIM() method instead of the +Graph::Stroke() used for non-csim.
+To use the cache with CSIM you have to call the +Graph::CheckCSIMCache(). As with the caching for non-CSIM you have + to supply a name to be used for the cached version as well as an + optional timeout value. The default timeout value if nothing else is + specified is 60 minutes.
+The name argument requires some more explanations. You must specify + a relative name here. For example "myimage" or perhaps + "firstpage/image3". Depending on your installation of JpGraph this will + now end up in the directory specified in the CSIMCACHE_DIR define. This + must also be a directory accessible by the normal web server. By + default a directory called "csimcache" will be created in the same + directory as the image script itself.
+This has the drawback that the directory from where the script is + executed must be writable by the process running PHP. Best practice for + this is to keep the number of writable directory for PHP down to a + minimum and re-use the same directory as is used for the standard + cache. This however, require that your system administrator setup that + cache directory so that it also accessible by the HTTP server from the + htdocs root.
+The CheckCSIMCache() method checks the cache for an existing cached + version and if found it returns it and halts execution of the script. + So, this call should be the first call after the creation of the + Graph() and before any heavy work is done to create the image so that + you can minimize the execution of the script in the case a match is + found.
+So, the general structure of a script that uses CSIM and the cache + is
+ $graph = new
+Graph(400,300
+);
+
+
// Check cache, 10 min timeout
+
$graph->CheckCSIMCache(
+"image1",10);
+
+
+// !! If cached version exists, execution halts here !!
+
+
//
+
// ... Construct the image with heavy DB calls etc, etc
+
//
+
+
$graph->StrokeCSIM();
+
Please note that you do not need to pass any + argument to the final call to StrokeCSIM() as you do when not using the + cache.
This is a summary of the available feature for all Graph based + charts, i.e. line plots, error plots, scatter plots, etc.
+By default all plots are clipped outside the plot area. This means + that if you manually specify a scale and then try to plot which has + values smaller/larger than the scale those values will not show.
+The clipping algorithm is "perfect" in the sense that for example + line plots where the plot area cuts the line between two data points + the line will be drawn up to the edge of the plot area. The algorithm + used is O(1) in number of data points.
+The disabling/enabling of clipping manually is controlled by +Graph::SetClipping()
+Image maps, or client side image (CSIM) as they are known is fully + supported in JpGraph. It gives you the opportunity to create hot-spots + in the graphs which allows you to build a set of "drill-down" graphs.
+In the following section is based on the assumption that the reader + is familiar with the basic concepts of client side image map in HTML.
+To shortly recapitulate. Client side image maps consists of two + parts. The first part is the actual image and the second part is a + mapping that gives the coordinates for areas in the image which should + be marked as hot spots (i.e. click-able by the user). The library can + automatically generate these coordinate maps from a given graph.
+Through out the manual areas of the graph that may be used as a + hotspot is given in conjuction with the general description of that + area.
+The standard structure for an HTML page using client side image maps + would be something along the lines of
+ ++// Image map specification with name "mapname" +<MAP NAME=...> +... specification ... +</MAP> + +// Image tag +<img src="..." ISMAP USEMAP="mapname"> ++
This poses an interesting question.
+Since we normally call the graphing script directly in the <img> tag + how do we get hold of the image map (which is available only in the + image script) in this "HTML wrapper" script?
+In JpGraph there is actually two ways of solving this.
+The first (and preferred) way modifies the stroke method so that + instead of returning an image (like the standard Stroke() method) + StrokeCSIM() actually returns an HTML page containing both the image + map specification and the correct <IMG> tag.
+This of course means that it is necessary to treat an image map + returning image script differently from a non-CSIM image script, for + example you can't use it directly as the target for the "src" attribute + of the <IMG> tag since it sends back an actual HTML page containing + both an image tag together with an image map.
+To turn a standard image script into a CSIM script the first thing + needed to do is to supply the appropriate URL targets for the hotspots + in the image.
+What the hotspots represent depends on the type of plot you are + doing. The following plot types and graph areas support image maps.
+To specify a link for each hotspot you have to use the + SetCSIMTargets() method for each plot (or specific area) in the + graph which should be a hotspot.
+There are two arguments to this method
+The simplest way of creating a creating a CSIM image is with the + StrokeCSIM() method. As mentioned before this method actually returns a + (small) HTML page containing both the image-tag as well as the image + map specification. Hence it is not possible to use a script that + ends with this method in a standard image-tags src property.
+There are two ways to create CSIM (or get hold of) the image maps
+
+
+<a href="mycsimscript.html">
+
+
This has the drawback that the image page will only contain the
+ image and nothing else.
+
+<h2> This is an CSIM image </h2>
+
+<?php
+include "mycsimscript.php"
+?>
+
+
The process to replace Stroke() with StrokeCSIM() is strait forward. + Replace all existing calls to Stroke() with the equivalent calls to + StrokeCSIM().
+ The only difference is that it is necessary ti supply a minimum of
+ one file name in the StrokeCSIM() method. The first argument must be
+ the name of the actual image script file including the extension. So
+ for example if the image script is called "mycsimscript.php" it is
+ necessary to write
+
+ $graph->
+StrokeCSIM(
+'mycsimscript.php')
+
+
However, it is possible to apply a small "trick" here. PHP maintain
+ a special variable called "__FILE__" which is always set to the current
+ file name. This means you could use the following construction:
+ $graph->
+StrokeCSIM(
+basename(
+__FILE__))
+
This is a better way since the script can now be renamed without + having to change any code in the file which otherwise would be needed.
The other arguments to StrokeCSIM() are optional. Please note that + if several CSIM images are used in the same HTML page it is also + necessary to specify the image map name as the second parameter since + all image maps must be unique to properly match each image map against + each image. Please consult the class reference + StrokeCSIM() for more details.
+In the Example/ directory there are a number of examples of how to + setup the various types of image maps. The following examples are + currently available
+In order to easily access all of these examples it is possible to + call the testsuit.php example with an additional argument "t=2". + By following the link +testsuit.php?t=2 a separate window will open with all the possible + CSIM examples.
+Knowledge of the exact technical details of the way StrokeCSIM() + works is probably not needed by many people but for completeness we + outline those details in this short section.
+The fundamental issue we have to solve is that we must be able to + call the image script in two modes. When the user includes the image + script the StrokeCSIM() method should return the HTML page but when the + image script is later called directly in the image tag it must not + return an HTML page but rather the actual image.
+The way this is solved is by using one HTTP argument which is passed + on automatically when we use the image script name in the image-tag.
+If you look at the generated HTML you will see that the argument to + the src-property of the image tag is not simply the script name but the + script name with a additional argument.
+In the JpGraph internal code this pre-defined argument is checked + for and if it exists the image is send back and not the HTML page.
+The name of this argument is defined by a DEFINE() statement in + JpGraph. The define is _CSIM_DISPLAY.
+In the case where you want to store the image on disk and later use + it in an img-tag you need to get hold of the image map. For this you + will have to use the function + Graph::GetHTMLImageMap()
+An example of the use of this is shown below. With these lines the + image will be written to a file. The script then returns a HTML page + which contains the Client side image map and an img-tag which will + retrieve the previously stored file.
+ $graph->Stroke(
+"/usr/local/httpd/htdocs/img/image001.png"
+);
+
echo $graph
+->GetHTMLImageMap
+("myimagemap001"
+);
+
echo
+"<img src=\"img/image001.png\" ISMAP USEMAP=\"#myimagemap001\" border=0>"
+;
+
For version 1.9 the cache system has been extended to include even + the CSIM maps. For each CSIM graph two files are stored in the cache, + the image file itself as well as the wrapper HTML with the actual image + map. For further information see the chapter on "Understanding the + Cache system"
+The purpose of this chapter is to introduce the basic concepts of + creating scripts with JpGraph that will generate various types of basic + plots. Throughout the text it is possible to view the exact source for + all the graphs by clicking on the "[src]" link in the caption of the + image shown. This will open the image together with the source in a + separate window. This way it is easy to compare the actual image with + the script that generated the image.
+The first example draws a line graph consisting of 10 Y-values. In + this first example we show the full code. In the following examples we + will only show interesting piece of the code.
<?php
+
include (
+"../jpgraph.php");
+
include ("../jpgraph_line.php");
+
+
// Some data
+
$ydata
+= array(11,3,
+8,12,5
+,1,9,
+13,5,7
+);
+
+
+// Create the graph. These two calls are always required
+
$graph
+= new Graph(350,
+250,"auto");
+
$graph->SetScale(
+"textlin");
+
+
// Create the linear plot
+
$lineplot
+=new LinePlot($ydata);
+
$lineplot
+->SetColor("blue");
+
+
// Add the plot to the graph
+
$graph->Add(
+$lineplot);
+
+
// Display the graph
+
$graph->Stroke();
+
?>
+
You might note a few things
+This is a perfect fine graph but looks a little bit "sparse". To + make it more interesting we might want to add a few things like
+From looking at the previous example you can see that you access all + properties of JpGraph through the objects you create. Graph(), + LinePlot() and so on. In general all objects you can see in the graph + is accessed through a named instance.
+For example the title of the graph is accessed through the + 'Graph::title' property. So to specify a title string you make a call + to the 'Set()' method on the title property as in:
+
+ $graph->title->Set
+('Example 2');
So by adding just a few more lines to the previous code we get a + graph as shown below.
To achieve this we just needed to add a few more lines. (We only show + the part of example 1 we changed, to look at the full source just click + the [src] link in the caption. )
+
+// Setup margin and titles
+
$graph->img->
+SetMargin(40,20
+,20,40);
+
$graph->title->
+Set(
+"Example 2");
+
$graph->xaxis->
+title->Set("X-title"
+);
+
$graph->yaxis->
+title->Set("Y-title"
+);
+
Again there are a couple of things you should note here
+A nice change would now be to have all the titles in a bold font and + the line plot a little bit thicker and in blue color. Let's do that by + adding the lines
$graph->
+title->SetFont(FF_FONT1
+,FS_BOLD);
+
$graph->yaxis->
+title->SetFont(FF_FONT1
+,FS_BOLD);
+
$graph->xaxis->
+title->SetFont(FF_FONT1
+,FS_BOLD);
+
$lineplot
+->SetColor("blue");
+
$lineplot
+->SetWeight(2);
+// Two pixel wide
Again please note the consistent interface. To change font you just + have to invoke the SetFont() method on the appropriate object. This + principle is true for most methods you will learn. The methods may be + applied to a variety of objects in JpGraph. So for example it might not + come as a big surprise that to have the Y-axis in red you have to say:
+ $graph->yaxis->SetColor
+("red")
or perhaps we also want to make the Y-axis a bit wider by
$graph
+->yaxis->SetWidth(
+2)
+
As a final touch let's add a frame and a drop shadow around the + image since this is by default turned off. This is done with
$graph
+->SetShadow()
The result of all these modifications are shown below.
It might sometimes be desirable to highlight the data-points with + marks in the intersection between the given x and Y-coordinates. This + is accomplished by specifying the wanted plot mark type for the "mark" + property of the line graph. A full list of all available marks is given + in the class reference +PlotMarks
+For now let's just add a triangle shape marker to our previous graph + by adding the line
$lineplot->
+mark->SetType(MARK_UTRIANGLE
+);
This will give the graph as shown below
+ +If you like you can of course both change the size, fill-color and + frame color of the chosen plot mark.
+The colors of the marks will, if you don't specify them explicitly, + follow the line color. Please note that if you want different colors + for the marks and the line the call to SetColor() for the marks must be + done after the call to the line since the marks color will always be + reset to the lines color when you set the line.
+As a final easy modification we can enable the display of the data + value above each data point. The value is represented by the 'value' + property in the plot. (You can read more about the possibilities of the + display value + in the class reference.)
+To enable the display of the value you just need to call the Show() + method of the value as in
+ $lineplot->value->
+Show()
+
Adding that line to the previous line plot would give the result + shown below.
+We can of course change both color, font and format of the displayed + value. So for example if we wanted the display values to be dark red, + use a bold font and have a '$' in front we need to add the lines
$lineplot->value
+->SetColor("darkred");
+
$lineplot
+->value->SetFont(
+FF_FONT1,
+FS_BOLD);
+
$lineplot
+->value->SetFormat(
+"$ %0.1f");
+
This would then result in the following image
+What if we want to add a second plot to the graph we just produced? + Well, this is quite straightforward and just requires two simple step:
+To create the second plot we need some data (we could of course use + the same data as for the first plot but then we wouldn't be able to see + the new plot!)
+The following lines show how to create the new plot and add it to + the graph (we only show the new lines - not the full script)
$ydata2
+= array(1,19,
+15,7,22
+,14,5,
+9,21,13
+);
+
$lineplot2
+=new LinePlot($ydata2);
+
$lineplot2
+->SetColor("orange");
+
$lineplot2
+->SetWeight(2);
+
+
$graph->Add(
+$lineplot2);
+
Making these changes to the previous graph script would generate a + new graph as illustrated below.
+There is a few things worth noting here
+As you saw in the preceding example you could add multiple plots to + the same graph and Y-axis. However what if the two plots you want to + display in the graph has very different ranges. One might for example + have Y-values like above but the other might have Y-values in the + 100:s. Even though it is perfectly possible to add them as above the + graph with the smallest values will have a very low dynamic range since + the scale must accomplish the bigger dynamic range of the second plot.
+The solution to this is to use a second Y-axis with a different + scale and add the second plot to this Y-axis instead. Let's take a look + at how that is accomplished.
+First we need to create a new data array with large values and + secondly we need to specify a scale for the Y2 axis. This is done by + the lines
+ $y2data = array(
+354,200,265
+,99,111,
+91,198,225
+,293,251);
+
$graph->SetY2Scale(
+"lin");
+
and finally we create a new line plot and add that to the second + Y-axis. Note that we here use a new method, AddY2(), since we want this + plot to be added to the second Y-axis. Note that JpGraph will only + support two different Y-axis. This is not considered a limitation since + using more than two scales in the same graph would make it very + difficult to interpret the meaning of the graph.
+To make the graph a little bit more esthetic pleasing we use + different colors for the different plots and let the two different + Y-axis get the same colors as the plots.
+The resulting graph is shown below. source)
+ +With more than one plot on the same graph it is necessary to somehow + indicate which plot is which. This is normally done by adding a legend + to the graph.
+You will see that each plot type has a 'SetLegend()' method which is + used to name that plot in the legend. SO to name the two plots in the + example we have been working with so far we need to add the lines
$lineplot->SetLegend
+("Plot 1");
+
$lineplot2
+->SetLegend("Plot 2");
+
to the previous code. The resulting graph is shown below
+As you can see the legend gets automatically sized depending on how + many plots there are that have legend texts to display. By default it + is placed with it's top right corner close to the upper right edge of + the image. Depending on the image you might want to adjust this or you + might want to add a larger margin which is big enough to accompany the + legend. Let's do both.
+First we increase the right margin and then we place the legend so + that it is roughly centered. We will also enlarge the overall image so + the plot area doesn't get too squeezed.
+To modify the legend you access the 'legend' property of the graph. + For a full reference on all the possibilities (changing colors, layout, + etc) see class legend in + the class reference
+For this we use the legends 'SetPos()' method as in
$graph
+->legend->Pos(
+0.05,0.5,"right"
+,"center");
Doing this small modification will give the result shown below
+The above method 'SetPos()' deserves some explanation since it might + not be obvious. You specify the position as a fraction of the overall + width and height of the entire image. This makes it possible for you to + resize the image within disturbing the relative position of the legend. + We will later see that the same method is just to place arbitrary text + in the image.
+To give added flexibility one must also specify to what edge of the + legend the position given should be relative to. In the example above + we have specified "right" edge on the legend for the for the horizontal + positioning and "center" for the vertical position.
+This means that the right edge of the legend should be position 5 % + of the image width from the right. If you had specified "left" the the + legends left edge would be positioned 5 % of the image width from the + image left side.
+By default the legends in the legend box gets stacked on top of each + other. The other possibility is to have them sideways. To adjust this + you use the SetLayout() + method. Using a horizontal layout with the previous example give the + following result.
+ +For more advanced fomatting of the legend it is possible to adjust
+In order to adjust the number of columns used in the legend the + method Legend::SetColumns is used. So for example to have the + legend lined up using three columns the follwing lines have to be added + to teh script
+ $graph->
+legend->
+SetColumns(3);
JpGraph offers two ways of handling null values (or discontinuities) + in the data. You can either have a "whole" in the data or the line may + be extended between the previous and next data point in the graph.
+If the data value is null ("") or the special value "x" then the + data point will not be plotted and will leave a gap in the line.
+If the data value is "-" then the line will be drawn between the + previous and next point in the data ignoring the "-" point.
+The following example shows both these possibilities.
+ + +Step style refers to an alternate way of rendering line plots by not + drawing a direct line between two adjacent points but rather draw two + segments. The first segment being a horizontal line to the next X-value + and then a vertical line from that point to the correct Y-value. This + is perhaps easier demonstrated by an example as seen below.
+You specify that you want the plot to be rendered with this style by + calling the method +SetStepStyle() on the lineplot.
+ +Using a logarithmic scale requires you to include the logarithmic + add on module in "jpgraph_log.php". So you must have the line
+include("jpgraph_log.php"
+);
on the top of your code. To Illustrate how to use a logarithmic scale + let's make the right Y scale in the previous example a logarithmic + scale. This is done by the line
+ $graph->SetY2Scale(
+"log");
+
This will then give the following result
+ +You can of course also use a logarithmic X-scale as well. The + following example shows this.
Even though we have so far only shown line graphs logarithmic scale + can also be used for bar, error, scatter plots as well. Even radar + plots supports the use of logarithmic plots. The following example + shows how to use a logarithmic scale for a bar graph.
+ + +As you saw in the previous example it is possible to use different + types of scales. In JpGraph you can use the following scales
+Any combination of these may be used. Linear and logarithmic scales + are pretty straightforward. The text scale might deserve some + explanation. The easiest way to think of the text scale is as a linear + scale consisting of only natural numbers, i.e. 0,1,2,3,4,... . This + scale is used when you just have a number of Y-values you want to plot + in a consecutive order and don't care about the X-values. For the above + example it will also work fine to use a linear X-scale (try it!). + However, the scale is now treated as consisting or real numbers so the + auto scaling, depending on the size of the image an the number of data + points, might decide to display other labels then the natural numbers., + i.e. a label might be 2.5 say. This is not going to happen if you use a + text scale.
+The normal practice for text scale is to specify text strings as + labels instead as the default natural numbers. You can specify text + strings for the labels by calling the + SetTickLabels() method on the Axis.
+To specify the scale you use the + SetScale() method. A few examples might help clarify this.
+As you can see all your graphs will require at least one call to + SetScale() in the beginning of your script. Normally it will come right + after the creation of the Graph().
+To specify the scale for the Y2 axis you use the + SetY2Scale() Since you only specify one axis you only specify + "half" of the string in the previous examples. So to set a logarithmic + Y2 scale you will call
+ $graph->SetY2Scale(
+"log");
+
By default only the Y-axis have grid lines and then only on major + ticks, i.e. ticks which have a label. It is of course possible to + change this. Both the X , Y and Y2 can have grid lines. It is also + possible to let the gridlines also be drawn on the minor tick marks, + i.e. ticks without a label. Lets see how we can apply this to the graph + above.
+The grid is modified by accessing the xgrid (or ygrid) component of + the graph. So to display minor grid lines for the Y graph we make the + call
+ $graph->ygrid->Show
+(true,true)
+
The first parameter determines if the grid should be displayed at + all and the second parameter determines whether or not the minor grid + lines should be displayed.
+If you also wanted the grid lines to be displayed for the Y2 axis + you would call
+ $graph->
+y2grid->Show(true
+,true)
Note. In general it is not a good idea to display + both the Y and Y2 grid lines since the resulting image becomes + difficult to read for a viewer.
+We can also enable the X-grid lines with the call
$graph
+->xgrid->Show(
+true)
+
In the above line we will of course only just enable the major grid + lines.
+To bring all this together we will display a graph with grid lines + for both Y and X axis enabled.
Another option for the grid lines is the possibility to have the + area between the grid lines filled with alternating two colors. The + example below illustrates this.
+In the example above we have also made use of alpha-blending + (requires GD 2.x or higher). By default the filled grid lines are + disabled. To enable this style you have to call the +Grid::SetFill() method.
+You might want to have specific labels you want to use for the + X-axis when this has been specified as a "text" scale. In the previous + example each Y-point might represent a specific measurement for each of + the first 10 month. We might then want to display the name of the + months as X-scale.
+To specify the labels on the scale you make use of the + SetTickLabels() method.
+To get a localized version of the name of the month you can use a + nice feature in JpGraph, the global '$gDateLocal' object which is an + instance of the + DateLocale
+This class has a number of methods to get localized versions of + relevant names for dates, (months and weekdays).
+So to specify the X-axis with the short form of the month names we + use the construction
+ $a =
+$gDateLocale->
+GetShortMonth();
+
$graph->xaxis->
+SetTickLabels(
+$a);
+
This will, now result in the image displayed below
+As can be seen in the previous example the X-axis is slightly + cluttered with the labels very close to each other. We might rectify + this by either enlarging the image or just displaying fewer tick label + on the x-axis.
+Specifying that we only want, for example, to print every second + label on the axis is done by a call to the method + SetTextLabelInterval() Which would result in the graph
+ +If the text labels are long (for example full dates) then another + way might be to adjust the angle of the text. We could for example + choose to rotate the labels on the X-axis by 90 degrees. With the help + of the SetLabelAngle() +
+Which would then result in the image below
+Using a filled line plot is not much different from using a normal + line plot, in fact the only difference is that you must call the method + SetFillColor() + on a normal line plot. This will then fill the area under the line + graph with the chosen color.
+In the example below we have also, as an example, specified plot + marks (see previous sections).
+Note 1. If you add multiple filled line plots to + one graph make sure you add the one with the highest Y-values first + since it will otherwise overwrite the other plots and they will not be + visible. Plots are stroked in the order they are added to the graph, so + the graph you want front-most must be added last.
+Note 2. When using legends with filled line plot + the legend will show the fill color and not the bounding line color.
+Note 3. Filled line plots is only supposed to be + used with positive values. Filling line plots which have negative data + values will probably not have the appearance you expect.
+As you can see from the graph above the grid lines are below the + filled line graph. If you want the grid lines in front of the graph you + can adjust the depth with call to + Graph::SetGridDepth() As the following example shows
+ +Accumulated line graphs are line graphs that are "stacked" on top of + each other. That is, the values in the supplied data for the Y-axis is + not the absolute value but rather the relative value from graph below. + For example if you have two line graphs with three points each, say + [3,7,5] and [6,9,7]. The first graph will be plotted on the absolute + Y-values [3,7,5] the second plot will be plotted at [3+6, 7+9, 5+7], + hence the values of the previous graphs will be used as offsets.
+You may add any number of ordinary line graphs together. If you want + to use three line plots in an accumulated line plot graph you write the + following code
+
+ // First create the individual plots
+
$p1 = new LinePlot(
+$datay_1);
+
$p2 = new LinePlot(
+$datay_2);
+
$p3 = new LinePlot(
+$datay_3);
+
+
+// Then add them together to form a accumulated plot
+
$ap = new AccLinePlot(array($p1,
+$p2,$p3));
+
+
+// Add the accumulated line plot to the graph
+
$graph->Add(
+$ap);
+
You might of course also fill each line plot by adding the lines
$p1
+->SetFillColor
+("red");
+
$p2->SetFillColor(
+"blue");
+
$p3->SetFillColor(
+"green");
+
Using some appropriate data this might then give a graph perhaps + like the one showed in the figure below
+ +If you only have access to a few data points but still want a smooth + curve between those data points JpGraph can help you achieving that by + letting you construct cubic splines. If you never have heard of cubic + splines before, don't worry. You only have to supply the data points + you know tell JpGraph how many interpolated points in total you want in + the graph. JpGraph will now take care of constructing a smooth curve + between all you data points. The new, smooth, curve will be made up of + exactly as many interpolated points as you have specified.
+To construct a spline you need both the X and Y coordinates for the + known data points.
+You start by constructing a new Spline instance. To + get access to the Spline class you must first remember to include the + file "jpgraph_regstat.php". You instantiate this class by calling it + with your two known data arrays (X and Y) as follows.
$spline
+= new Spline($xdata,
+$ydata);
+
This call initializes the spline with the data points you have. These + data points are also known as Control points for the spline. + This helper class doesn't draw any line itself. Instead it is merely + used to get a new (larger) data array which have all the interpolated + values. You then use these new value in your plot. This way give you + great flexibility in how you want to use this interpolated data.
+Continuing the above line we now use the Spline::Get() + method to get an interpolated array containing a specified number of + points. So for example the line
+ list(
+$sdatax,
+$sdatay) =
+$spline->Get(50
+);
Will construct the two new data arrays '$sdatax' and '$sdatay' which + contains 50 data points. These two arrays are constructed from the + control point we specified when we created the '$spline' object.
+You would then use these two new data array in exactly the same way + as you would form ordinary data vectors.
+The following example illustrates this
+In order to make the example more interesting we actually use two + plots. First a line plot to get the smooth curve and then a standard + scatter plot which is used to illustrate where the control points are.
+To emphasize the specific data points it is possible to add plot + marks at each data point. Plot marks can be either
+You access the plot mark through the "mark" instance variable in the + plot, as in
+ $lineplot->
+mark->SetColor("red"
+);
To choose between the different plot marks you call the +PlotMark::SetType() method with the correct define to choose the + plot type you want to use.
+The simple shape type of plot marks are
+To specify an arbitrary image you use the special define
+In this case you must also specify a image file name and an optional + scaling constant. For example as in
+ $lineplot->mark->
+SetTYPE(
+MARK_IMG,
+"myimage.jpg",
+1.5);
+
If you want to use one of the built-in images the following images + are available. Please note that not all images are available in all + possible colors. The available colors for each image is listed below.
+The following shape (the first class) plot marks are available
+For the second class (built-in images) the following table list the + different images as well as what color they are available in. For the + built-in images you specify the color with the second argument.
+Note that some of the images are available in different sizes. The + reason is that even though you can scale them by the third argument + there is a visual degradation to scale an image larger than it's + original size since some pixels needs to be interpolated. Reducing the + size with a scale < 1.0 gives much better visual apperance.
+The scaling works with both GD 1 and GD 2 but with GD 2 the quality + of the scaling is much better.
+Built-in images and available colors:
+Type | Description | Colors |
---|---|---|
MARK_IMG_PUSHPIN, MARK_IMG_SPUSHPIN | Push-pin image | +'red','blue','green','pink','orange' |
MARK_IMG_LPUSHPIN | A larger Push-pin image | +'red','blue','green','pink','orange' |
MARK_IMG_BALL, MARK_IMAGE_SBALL | A round 3D rendered ball | +'bluegreen','cyan','darkgray','greengray', + 'gray','graypurple','green','greenblue','lightblue', + 'lightred','navy','orange','purple','red','yellow' |
MARK_IMAGE_MBALL | A medium sized round 3D rendered ball | + 'blue','bluegreen','brown','cyan', + 'darkgray','greengray','gray','green', + 'greenblue','lightblue','lightred', 'purple','red','white','yellow' | +
MARK_IMAGE_LBALL | A large sized round 3D rendered ball | + 'blue','lightblue','brown','darkgreen', + 'green','purple','red','gray','yellow','silver','gray' |
MARK_IMAGE_SQUARE | A 3D rendered square | +'bluegreen','blue','green', 'lightblue','orange','purple','red','yellow' | +
MARK_IMG_STAR | A 3D rendered star image | +'bluegreen','lightblue','purple','blue','green','pink','red','yellow' | +
MARK_IMG_DIAMOND | A 3D rendered diamond | +'lightblue','darkblue','gray', 'blue','pink','purple','red','yellow' | +
MARK_IMG_BEVEL | A 3D rendered bevel style round ring | +'green','purple','orange','red','yellow' |
Jpgraph also supports 2D vertical bar plots. Before you can use any + bar plots you must make sure that you included the file + "jpgraph_bar.php" in your script.
+Using bar plots is quite straightforward and works in much the same + way as line plots which you are already familiar with from the previous + examples. Assuming you have a data array consisting of the values + [12,8,19,3,10,5] and you want to display them as a bar plot. This is + the simplest way to do this:
+ $datay=array(12,
+8,19,3
+,10,5);
+
$bplot
+= new BarPlot($datay);
+
$graph->Add(
+$bplot);
+
If you compare this to the previous line examples you can see that + the only change necessary was that instead of creating a new line plot + (via the new LinePlot(...) call) we used the statement new + BarPplot().
+The other change we should do is to make sure the X-axis have an + text-scale (it is perfectly fine to use a linear X-scale but in most + cases this is not the effect you want when you use a bar graph, see + more below). With this two simple change we will now get a bar graph as + displayed in the following image
+You can of course modify the appearance of the bar graph. So for + example to change the fill color you would use the + BarPlot::SetFillColor() method. Making this small change to the + previous example would give the expected effect as can be seen in the + next example.
+JpGraph allows you to easy customize the appearance of the bar + graph, for example to change the width of each bar. The width of each + bar can be specified either as a fraction of the width between each + major tick or as an absolute width (in pixels).
+To set the width in fraction you use the method + SetWidth() and to set the width in pixels you use the + SetAbsWidth()
+As an example let's take the previous example and set the width to + 100% of the distance between the ticks. The example will now become
+ + +You can easily choose to display the value (and it's format) on top + of each bar by accessing the bar's 'value' property. So for example by + just adding the line
+ $barplot->value->
+Show();
+
Will enable the values in it's simplest form and will give the + result
+You cane see a small nuisance in this graph. The auto scaling + algorithm chooses quite tight limits for the scale so that the bars + just fit. Adding the value on top of the bar makes it collide with the + top of the graph. To remedy this we tell the auto scaling algorithm to + allow for more "grace" space at the top of the scale by using the + method + SetGrace() which is used to tell the scale to add a percentage (of + the total scale span) more space to either one end or both ends of the + scale. In this case we add 20% more space at the top to make more room + for the values with the line
+ $graph->yaxis->
+scale->
+SetGrace(20);
This will then give the graph as shown below
+ +You can also adjust the general position of the value in respect to + the bar by using the + BarPlot::SetValuePos() method. You can set the position to either + 'top' (the default) , 'center' or 'bottom'. The graph below shows the + value being positioned in the center. In this example we have also + adjusted the format to just display the value as an integer without any + decimals.
+It is also possible to specify a more fine grained control on how + you want the values presented. You can for example, rotate them, change + font, change color. It is also possible to adjust the actual value + displayed by either using a printf()-type format string or with the + more advanced technique of a format callback routine.
+To show what you can do we just give another example for you to + examine without much further explanations. Just remember that to have + text at an angle other than 0 or 90 degrees we have to use TTF fonts. + Even though we haven't explained the SetFont() method it should be + fairly obvious.
+ +One simple way of making the bar graph more attracting is to add a + drop shadow to each bar. This is done by calling the + SetShadow() method. An example will clarify this.
+ +As you have seen from the previous examples bar graphs are normally + centered between the trick marks on a text scale. However, you can + modify this behavior by calling the method + BarPlot::SetAlign()
+These types of bar graph is used to easy group two or more bars + together around each tick (X-value). The bars will be placed + immediately beside each other and as a group centered on each tick + mark. A grouped bar is created by aggregating two or more ordinary bar + graphs and creating a + GroupBarPlot() From two ordinary bar graphs along the lines of
+// Create the bar plots
+
$b1plot
+= new BarPlot($data1y);
+
$b1plot->SetFillColor(
+"orange");
+
+
$b2plot
+= new BarPlot($data2y);
+
$b2plot->SetFillColor(
+"blue");
+
+
// Create the grouped bar plot
+
$gbplot
+= new GroupBarPlot
+(array($b1plot
+,$b2plot));
+
+
// ...and add it to the graPH
+
$graph->Add(
+$gbplot);
+
The following example illustrates this type of graph
+There is no limit on the number of plots you may group together.
+If you use the SetWidth() method on the GroupBarPlot() this will + affect the total width used by all the added plots. Each individual bar + width will be the same for all added bars. The default width for + grouped bar is 70%.
+Setting the grouped with to 0.9 would result in the image below.
+ +The final variety of group bars you can have are accumulated bars. + They work in much the same way as accumulated line plots described + above. Each plot is stacked on top of each other.
+You create accumulated bar plots in the same way as grouped bar + plots by first creating a number of ordinary bar plots that are then + aggregated with a call to + AccBarPlot();
+An example makes this clear. Let's use the same data as in the two + examples above but instead of grouping the bars we accumulate (or + stack) them. The code would be very similar (actually only one line has + to change)
+ +It is perfectly possible to combine the previous bar types to have + grouped accumulated bar plots. This is done by just adding the + different accumulated plots to a group bar plot, for example the + following code would do that.
+
+// Create all the 4 bar plots
+
$b1plot
+= new BarPlot($data1y);
+
$b1plot->SetFillColor(
+"orange");
+
$b2plot
+= new BarPlot($data2y);
+
$b2plot->SetFillColor(
+"blue");
+
$b3plot
+= new BarPlot($data3y);
+
$b3plot->SetFillColor(
+"green");
+
$b4plot
+= new BarPlot($data4y);
+
$b4plot->SetFillColor(
+"brown");
+
+
// Create the accumulated bar plots
+
$ab1plot
+= new AccBarPlot
+(array($b1plot
+,$b2plot));
+
$ab2plot
+= new AccBarPlot
+(array($b3plot
+,$b4plot));
+
+
// Create the grouped bar plot
+
$gbplot
+= new GroupBarPlot
+(array($ab1plot
+,$ab2plot));
+
+
// ...and add it to the graph
+
$graph->Add(
+$gbplot);
+
Putting this together in an example would then produce the graph as + shown below
+ +It can often come in handy to have horizontal bar graphs especially + if you have a large number of values to display. Even though JpGraph + doesn't directly support horizontal bar graphs this is easy achieved by + constructing a normal vertical bar graph which is then rotated 90 + degrees.
+The example below shows a simple example of this
+ +In order to achieve this effect you should study the above example + carefully and you might notice two things
+We finally show three more examples of horizontal bar plots. In the + first plot we have hidden the Y-axis and in the second we have + positioned the Y - axis at top as opposed to the bottom as the first + example shows.
+ + + +In the final example which is almost similar to the two first we + illustrate the use of labels with more than one line.
It is possible to use color gradient fill for the individual bars in + the bar graph.
+Color gradient fill fills a rectangle with a smooth transition + between two colors. In what direction the transition goes (from left to + right, down and up, from the middle and out etc) is determined by the + style of the gradient fill. JpGraph currently supports 8 different + styles. All supported styles are displayed in the figure below.
+ + + + + + + + +To specify a gradient fill for the bar plots you make use of the + method + BarPlot::SetFillGradient() . See the class reference for details of + this function.
+When using gradient fills there are a couple of caveats you should + be aware of:
+Semi filled bar graphs are in principle the same as normal filled + bar graphs but with the additional feature that you can choose to only + fill a specified range (or ranges) of X-coordinates. The figure below + illustrates this
+ + +In this example we defined two areas along the X-axis to be filled. + You can add filled areas by using the method + AddArea() and specifying range and color for the filled area.
+Error plots are used to visually indicate uncertainty in data + points. This is done by for each X value by giving both a minimum and a + maximum Y-value.
+Before you can use error plots you must remember to include the file + "jpgraph_error.php" in your script.
+The following example illustrates a simple error bar. We will have 5 + points, so we need 10 Y-values. We also would like the error bars to be + red and 2 pixels wide. All this is accomplished by creating an + ErrorPlot() in much the same way as, for example, a normal line + plot. Doing this would now give the example shown below.
+ +You might notice that there is one displeasing esthetic quality of + this graph. The X-scale is just wide enough to just accompany the + number of error bars and hence the first bar is drawn on the Y-axis and + the and last bar just at the edge of the plot area. To adjust this you + might call the SetCenter() + method which will adjust the X-scale so it does not use the full width + of the X-axis.
+The following example illustrates the use of this feature by + applying this technique to the previous example
+ +A line error plot is an error plot with the addition that a line is + drawn between the average value of each error pair. You use this type + of plot the exact same way you would use an error plot. The only change + is that you must instantiated an + ErrorLinePlot() instead and make sure you have included the + "jpgraph_line.php" since the line error plot makes use of the line plot + class to stroke the line.
+To control the various properties of the line drawn the "line" + property of the error line plot may be accessed. So, for example, if + you want the line to be 2 pixels wide and blue you would have to add + the following two lines
+ $elplot->line->
+SetWeight(2);
+
$elplot->line->
+SetColor(
+"blue");
+
to generate the graph as shown below
+You may of course add legends to none, one or both of the line types + in the above graph. So for example if we wanted the legend "Min/Max" + for the red error bars and a legend "Average" for the blue line you + would have to add the lines
+ $errplot->SetLegend(
+"Min/Max");
+
$errplot->line->
+SetLegend(
+"Average");
+
The resulting graph will now look like (note that we are using the + default placement of the legend box)
+ +Scatter plots are very simple; they plot a number of points + specified by their X- and Y-coordinate. Each point is stroked on the + image with a mark as with line plots. The stroked marks can also be + connected with an optional line.
Even though you would normally supply X-coordinates it is still + perfectly possible to use a text-scale for X-coordinates to just + enumerate the points. This is especially useful when using the + "Impulse" type of scatter plot as is shown below.
+Scatter pots are created by including the jpgraph extension + "jpgraph_scatter.php" and then creating an instance of plot type of + ScatterPlot(). To specify the mark you want to use you access the mark + with the instance variable "mark" in the scatter plot. The default is + to use an unfilled small circle.
+To create a scatter plot you will create an instance
+A simple example using just default values will illustrate this
+ +We can easily adjust the size and colors for the markers to get + another effect as shown below
+Another possible variant of scatter plot is impulse-scatter plots. + This is a variant of normal scatter plot where each mark have a line + from the mark to the Y=0 base line. To change a scatter plot into an + impulse scatter plot you have to call the method + SetImpuls() on the scatter plot.
+This type of plots are often used to illustrate signals in + conjunction with digital signal processing. The following two examples + illustrates simple use of impulse plots.
+The next example shows how to modify the color and width of the + impulse plot
+As a final touch we show two more advanced impulse graphs . In these + graphs we have used more advanced formatting for the Y-axis labels as + well as adjusted the position of the axis position.
A variant of scatter plot is the so called Field Plots this + is basically a scatter plot where each scatter point is an arrow with a + direction between 0 to 359 degrees. This effectively allows the + visualization of 3 parameters at each point (x,y,angle). As an + additional bonus there is also possible to define a callback for each + scatter plot to also define the color for each point.
+To create a field plot you create an instance of +FieldPlot in the same way as you created a normal scatter plot. The + arguments to this method are Y-coordinate, X-coordinate and angle. To + specify a callback you use +FieldPlot::SetCallback()
+The following example (and code) illustrates the usage of the field + plot type.
+ +In addition to the parameters mentioned above you can also adjust + both the general size of the arrow and also the specific size of the + arrowhead. The arrow size is specified in pixels and the arrow head is + specified as an integers between 0 and 10. These sizes are specified + with a call to +FieldPlot::arrow::SetSize()
+JpGraph offers two variation on what is usually known as stock + charts, candle-charts or box plot.
+Stock charts is used to display data values where one is interested + in 4 different values for each data point. This could for example be + used to display a stocks open,close, min and max value during a + specific day. Hence the name Stock chart (or Stock plot).
+The figure below illustrates a sample Stock chart plot
+For this type of plot the Y-data array must be consist of a number + of quadruples of data where each quadruple consists of + (open,close,min,max). The open and close values determine the min max + for the middle bar and the min,max determine the end points of the + "error-lines" at the top and bottom of of each bar.
+Note that the data follows the following rules
+To separate the two cases where "open > close" or "open < close " + different colors are used. These colors are specified with the +SetColor() method. By default a positive bar (close > open) have a + fill color of white and for the negative case where (close < open) the + bars have a red color.
+You can specify the width of the bar by setting the width (in + pixels) with a call to the method +SetWidth()
+The final variation of stock plots you can have is to determine + whether or not the end point for the min,max lines should have the + horizontal line marking the end of the line or not. This can be + adjusted with a call to method +HideEndLine().
+A minor variation of stock charts is the "BoxPlot()" this is almost + the same as StockPlot() but with the very small difference that in + addition to the open,close,min, max values you also specify a median + value . The median lies between the open and close value and is + illustrated as a horizontal line within the bar.
+You may modify the median line color for positive and negative data + points / bars by using the +SetMedianColor() method.
+In the same way as for other plots you may associate an image map + with these plots. The "hot" area for each plot is the mid "bar" + section. In the same way as other plot types you use the + SetCSIMTargets() to set the URLs you want to use.
+These plot types, though normally used without explicit X-values, + can of course handle a supplied X-coordinate array without any problem.
+It is perfectly legal to add several different plot types to the + same graph. It is therefore possible to mix line plots with (for + example) filled bar graphs. What you should keep in mind doing this is + the order in which these plots are stroked to the image since a later + stroke will overwrite a previous one. All plots are stroked in the + order you add them, i.e. the first plot added will be stroked first. + You can therefore control which plot is placed in the background and + which one is placed in the foreground by the order you add them to the + plot.
+To start simple we just mix a filled line plot with a non-filled + line plot as the following example shows.
+ + +Let's now go to something a little bit more complicated. How to mix + bar and line graphs. Let's just take one of our previous bar graphs and + add a line plot to it and see what happens.
+ +Not too bad. But we can't see the line so we change the order in + which we add the lines to the graph and sees what happens.
+ +If you want the line points to be aligned in the center of the bars + you can accomplish this is two ways.
+If you use a text scale then you need to call the + LinePlot::SetBarCenter()
You can also use an integer scale. This places both + the bar and the line points centered at the tick marks. As the + following example will show
+ +As a final example we show how you can combine a scatter plot and a + line plot which could be used to illustrate a regression line fitting.
+ +Normally the automatic scaling should be doing an adequate job in + most circumstances but there might be cases where you like to manually + set the scale. For example if you have several graphs where you like to + be able to easily compare them and therefore want them all to have the + same scale.
+To specify a manual scale you have to add arguments to the standard Graph::SetScale() method. + So to specify that you want an Y-scale between 0 and 100 you need to + write
+ $graph->
+SetScale(
+"textlin",0,100
+);
When you specify a scale manually there is one additional thing you + need to decide. How the tick marks should be positioned. You have three + choices
+
+ $graph->SetScale(
+"textlin",0,100
+);
+
$graph->yscale->
+ticks->Set(10
+,5);
Will set the major tick marks every at 0,10,20,.. And every minor + tick mark in between (0,5,10,15,20,25,...).
+The three images below illustrates the difference between the + possibilities of ticks for a manual scale.
+ + + + + +You can adjust the automatic tick marks by telling JpGraph how dense + you want them to be. You use the + Graph::SetTickDensity() method. You can set the density setting in + four steps
+Taking the previous example with the manual scale but automatic + ticks and using a denser ticks setting gives the following result
+ +With date/time scale we refer to the plotting of data where the + independent variable (X-axis) de-nominates a time value. This could for + example be the temperature measured in intervals during a day.
+From version 1.18 and onwards there are two principal ways of + handling date/time scales. The manual way and fully automatic using the + special "dat" scale. For most cases the automatic "dat" scale is the + preferred choice but in rare circumstances it might be more appropriate + to use the manual way since it gives slightly more control (but not + that much) of the overall handling of scales.
+To be able to use a date/time scale at all we will assume that the + data points are represented by both an X coordinate (time-value) and a + Y-value (anything else wouldn't make sense).
+We first start by describing the use of the "dat" scale.
+The easiest way to get a date time scale for the X-axis is to use + the pre-defined "dat" scale. To be able to use that it is first + necessary to include the module "jpgraph_date.php" and the + specify the scale, for example as "datlin" in the call to SetScale() + as the following code snippet shows.
+ require_once("../jpgraph.php");
+
require_once("../jpgraph_line.php");
+
require_once("../jpgraph_date.php");
+
...
+
$graph
+= new Graph(540,
+300);
+
$graph->SetScale(
+'datlin');
+
...
The above code snippet would create a date/linear scale for the + graph. We will first show a basic use of the date scale and then go on + to illustrate how it is possible to tailor the exact formatting of the + date axis.
+When using the fully automatic formatting the library will use the + shortest possible string that uniquely identifieas a date/time. For + example if the entire intervall falls within the same day only the time + values will be displayed, if the intervall falls over several days then + also the date will be added to the label.
+As usual it is also possible to manually force a certain label + formatting to be used this is illustrated below.
+The first basic example below creates a data set that emulates a + sample rate every S second and falls over a total period of two days. + It is important to note that the input data on the X-axis must be a in + the form of timestamp data, i.e. the number of seconds from the system + epoch. In PHP the current timestamp value is returned by the function + time().
+This means that it is always mandatory to specify two input vectors + for a plot. For example to specify a line plot
+ $line
+= new LinePlot
+($data,$xdata);
+
The example below show this in practice
+Please review the script (by following the [src] link) that creates + this graph before continuing since we will base all further examples on + the above example.
+As can be seen from the above example the scale starts slightly + before the first data point. Why? This is of course by purpose in order + to make the first time label to start on an "even" value, in this case + on an hour. Depending on the entire interval of the graph the start + value will always be chosen to be the largest "even" time value, this + could for example be on an even minute, even 30min, even hour, even + day, even week and so on.
+The alignment of the start (and end) vdate alignment can also be + adjusted manually by using the two methods
+These method allow the alignment to be made by specifying one of the + following constants.
+For the SetTimeAlign() the following symbolic constants can be used
+For the SetDateAlign() the following symbolic constants can + be used
+Some examples will calrify the use of these methods.
+Example 1. We want the time adjustment to start on an even + quarter of an hour, i.e. an even 15 minute period.
$graph
+->xaxis->scale->
+SetTimeAlign(
+MINADJ_15);
+
Example 2. We want the time to start on an even 2 hour
$graph
+->xaxis->scale->
+SetTimeAlign(
+HOURADJ_2);
+
Example 3. We want the start to be on an even day
$graph
+->xaxis->scale->
+SetDateAlign(
+DAYADJ_1);
+
The default label format always tries to use the shortest possible + unique string. To manually set a manual scale the method + SetDateFormat() is used for example as in
+ $graph
+->xaxis->scale->
+SetDateFormat(
+'H:i');
+
The above example will force the labels to be displayed as hour (24h) + and minutes.
As with the linear scale it is possible to indicate what density of + scale ticks is needed. This is specified as usual with a call to + Graph::SetTickDensity()
+ $graph->SetTickDensity(
+TICKD_DENSE);
+
In the following we will assume that all data points are specified + by a tuple where the date/time is specified as a timestamp in second in + the same format as is returned by the PHP function time().
+The trick here is to use a label formatting callback routine which + gets called to format each label on the scale.
+What we do is that we specify that the X-scale should be an ordinary + "int" scale (remember that the data values are timestamps which are + integers). We then install our custom label callback (with a call to + SetLabelFormatCallback()) which given a timestamp formats it to a + suitable human readable form. In our example we will use the PHP + function Date() for this purpose.
+The callback we use will be
+
+// The callback that converts timestamp to minutes and seconds
+
function
+TimeCallback(
+$aVal) {
+
return Date
+('H:i:s',$aVal);
+
}
Using some random data we can now generate the following graph
In the above example we have specified the X-scale manually to make + sure that the min/max values on the X-axis exactly matches the min/max + x-data values.
+SetLabelFormatCallback() will be called for each of the displayed + labels and the argument passed on to the supplied function is the + default label that the library is assigning that specific label.
+This means that if the data to be displayed is based on, for + example, timestamps which are given in seconds the displayed value + might not be aligned to how time/date values normally should be + displayed.
+Using integer scales this will not work very well since the library + determines label positions to be at even positions (e.g. every 2,5,10, + 20,50,100 etc) to suit the auto-scaling since the library will assume + that the data is integers and not timestamp values.
+The best way to solve this is to use an integer X-scale together + with a a callback function with a manually specified scale. In order to + setup the scale a bit of manually work is needed. Depending on the data + to be displayed one should ensure that the scale starts and ends at + suitable times and that the tick interval chosen fits with an even + multiple of minutes, hours, days or what is best suited for the time + range that is to be displayed.
+The following code example illustrates this. It creates some "fake" + data that is assumed to be sampled time based data and sets up some + suitable scales and tick interval. This script may be used as a basis + for more advanced handling of the time data.
<?php
+
+// Example on how to treat and format timestamp as human readable labels
+
require_once(
+"../jpgraph.php");
+
require_once("../jpgraph_line.php");
+
+
// Number of "fake" data points
+
DEFINE('NDATAPOINTS',
+500);
+
+
+// Assume data points are sample every 10th second
+
DEFINE('SAMPLERATE',
+10);
+
+
+// Callback formatting function for the X-scale to convert timestamps
+
// to hour and minutes.
+
function
+TimeCallback(
+$aVal) {
+
return Date
+('H:i', $aVal);
+
}
+
+
// Get start time
+
$start = time();
+
+// Set the start time to be on the closest minute just before the "start" timestamp
+
$adjstart
+= floor($start /
+60);
+
+
+// Create a data set in range (20,100) and X-positions
+
+// We also apply a simple low pass filter on the data to make it less
+
// random and a little smoother
+
$data
+= array();
+
$xdata
+= array();
+
$data[0] =
+rand(20,100
+);
+
$xdata[0] =
+$adjstart;
+
for( $i=1;
+$i <
+NDATAPOINTS; ++
+$i ) {
+
$data[$i] =
+rand(20,100
+)*0.2 + $data[
+$i-1]*0.8
+;
+
$xdata
+[$i] = $adjstart +
+$i *
+SAMPLERATE;
+
}
+
+
+// Assume that the data points represents data that is sampled every 10s
+
// when determing the end value on the scale. We also add some extra
+
// length to end on an even label tick.
+
$adjend = $adjstart + (
+NDATAPOINTS+10)*10
+;
+
+
$graph
+= new Graph(500,
+250);
+
$graph->SetMargin(
+40,20,30
+,50);
+
+
+// Now specify the X-scale explicit but let the Y-scale be auto-scaled
+
$graph->SetScale(
+"intlin",0,0
+,$adjstart,$adjend);
+
$graph->title->
+Set(
+"Example on TimeStamp Callback");
+
+
+// Setup the callback and adjust the angle of the labels
+
$graph->xaxis->
+SetLabelFormatCallback(
+'TimeCallback');
+
$graph->xaxis->
+SetLabelAngle(
+90);
+
+
+// Set the labels every 5min (i.e. 300seconds) and minor ticks every minute
+
$graph->xaxis->
+scale->ticks->Set
+(300,60);
+
+
$line
+= new LinePlot
+($data,$xdata);
+
$line->SetColor(
+'lightblue');
+
$graph->Add(
+$line);
+
+
$graph->Stroke();
+
?>
+
In the following section we will work through an number of examples + on how to manipulate labels on a text scale. Primarily we will + investigate how to best handle the case where you have a large number + of values.
+As a remainder; Text scale is meant to be used on the X-axis when + the X-axis doesn't have a numeric value, i.e you are only interested in + linear ordering of the data. If you don't specify the labels manually + they will be set automatically starting from 1 as the example below + shows.
+ + +To specify the labels on the X-axis as suitable text strings you + call the method + Axis::SetTickLabels() with an array containing the text-labels. If + there are more data points than labels the non-specified labels will be + given their ordinal number. If we augment the previous example with the + name of the month we get the following new example
+ + + +What happen now if we have a larger number of bars? Let's try with + 25 bars and see what result we get.
+ + +Not all to impressive. The labels are to close and they overlap. + Hence it is not a good idea to display every label. To adjust what + labels are to be displayed you use the + SetTextLabelInterval() method. The argument to this method is the + interval between text labels. So to display only every 3 month you + would add the line
+
+ $graph->xaxis->SetTextLabelIntervall(3
+)
Which would give the result shown below
+ +Much better, quite readable.
+If we have an even larger data set it might not longer be meaningful + to display all the tick marks since they would simple become to close. + In JpGraph there is a possibility to specify that you only would like + every n:th tick mark to be visible ( + SetTextTickIntervall() ). For bar graphs using text scale however, + that might not be such a good idea since the tick marks are between the + bars and the labels centered under the bars. If we only were to + display, say, every 3 tick mark it wouldn't look to good. Not that we + can't do it, as the example below shows, but it just doesn't look very + good.
+ +A better way to handle large data set is simply to hide the tick + marks all together. Tick marks may be hidden by calling the method + Axis::HideTicks(); If we hide all the ticks on the X-axis we will + get the result shown below
+ +To add clarification or other information text strings to the graph + you can add arbitrary lines of text anywhere you like onto the graph. + The text might have multiple lines and you can choose the paragraph + alignment.
+To add text you have to create one or more instances of the + Text() object and then add the text object to the graph with the + AddText() method.
+The position of these text boxes are given as fraction of the width + and height of the graph. When you are positioning these text boxes you + might also choose what part of the text box should be considered the + anchor point for the position you specify.
+By default the anchor point is the upper left corner of the bounding + box for the text.
+To show some ways of positioning the text we use a very simple bar + graph not to distract from the text. We first just add a single text + line with most of the settings their default value by adding the + following lines to the graph
+ $txt=new Text(
+"This is a text");
+
$txt->Pos(
+0,0);
+
$txt->SetColor(
+"red");
+
$graph->AddText(
+$txt);
+
The result is shown below.
+Not too exiting. Let's make it more interesting by having a + background color, using larger fonts and framing the text box and + adding a drop shadow to the text box by using the methods + SetBox() and SetBox()
+That's better. Now we get some attention. If you want to add a text + with several lines you just need to separate the lines with a newline + ('\n' character). The default paragraph alignment is left edge but you + can also use right and center alignment.
+As an illustration let's add a couple of more lines to the previous + text, center the text box in the middle of the graph and also use + centered paragraph alignment for the text. To adjust the paragraph + alignment of the text you have to use the + Text::ParagraphAlign()
+Of course there is no limit to the number of text string you can add + to the graph.
+From version 1.12 it is also possible to add text strings to a graph + using the scale coordinates instead. This is accomplished by using the Text::SetScalePos() Which + is completely analog to SetPos() with the only difference that the + positions given are interpretated as scale values instead of fractions + of the width and height.
+Each graph can have up to three different titles accessed by the + three properties
+All of these three properties is a standard text object which means + that you can have individual font, colors, margins and sizes of these + tree titles.
+The only thing you need to think of is that you probably want to add + some extra margin to make room for the titles (using + Graph::SetMargin() )
+The individual positioning of these titles are done automatically + and will adjust to the font size being used.
+If you for, esthetic reasons, would like increase the distance from + the top where the title is positioned (or the intra distance between + title and sub title) you can use the + Text::SetMargin() method. For example the line
+
+ $graph->title->SetMargin
+(20);
will set the distance between the top of the title string and the top + of the graph to 20 pixels. If you instead call the SetMargin() method + for the subtitle it will adjust the distance between the top of the + subtitle and the bottom of the title.
+The titles will be positioned at the top and be centered in the + graph. Each of these titles may have multiple lines each separated by a + "\n" (newline) character. By default the paragraph alignment for each + title is centered but may of course be changed (using the + ParagraphAlign()) method.
+Each graph can also have a footer. This footer is actually three + footers. Left, center and right. The 'left' footer is aligned to the + left, the 'center' at the bottom center and the right to the right.
+Each of these three positions is a standard Text object which means + you can change color, font and size as you please individually on each + of these footer positions.
+You access the footer through the Graph::footer property as the + following example shows
+
+ $graph->
+footer->left->Set
+("(C) 2002 KXY"
+);
+
$graph->footer->
+center->Set("CONFIDENTIAL"
+);
+
$graph->footer->
+center->
+SetColor("red");
+
$graph->footer->
+center->
+SetFont(
+FF_FONT2,
+FS_BOLD);
+
$graph->footer->
+right->Set("19 Aug 2002"
+);
A variant of the titles is the tab title. This is just + another option you have of putting a name on the graph. The appearance + of this type is a tab on top of the plot area with text inside.
+You can access the tab using the 'tabtitle' property of the graph.
+The following figure shows an example of how this can look.
+As usual you have full freedom to specify font and colors for this + type of title. Please see the class reference regarding +GraphTabTitle() for more information.
+Instead of having a single color background you can easily have an + arbitrary image as the background. The image may be in either PNG, JPG + or GIF format depending on what your installation supports.
+ +A note on GD: If you are using GD 2.xx you must + make sure that the define USE_TRUECOLOR is set to true. This is also + the default. Failure to do so in combination with GD 2.xx will make the + background image just look like a solid black square.
+ +To use a specific image as the background you just have to use the + method + Graph::SetBackgroundImage() The arguments specify file-name, how + the image should be positioned in the graph and finally the format of + the image (if it is in JPG, PNG or GIF) format. If the format is + specified as "auto" (the default) then the appropriate image format + will be determined from the extension of the image file.
+The file name is of course obvious but the second argument might not + be. This arguments determine how the image should be copied onto the + graph image. You can specify three different variants here
+You might often find yourself wanting to use a background image as a + "waterstamp". This usually means taking the original image, import it + to some image editing program and then "bleaching" the color + saturation, reducing the contrast and so on. Finally you save the + modified image which you then use as a background image.
+This whole process can be automatically accomplished in JpGraph by + using the method + Graph::AdjBackgroundImage() which allow you to adjust color + saturation, brightness and contrast of the background image.
+
+ $graph->
+AdjBackgroundImage(...)
+
to achieve the "watercolor" effect to avoid the image being too + intrusive in the graph.
+In addition to the background image you can also add a background + color gradient. This gradient can be covering the entire graph, just + the plot area or just the margins. This flexibility allows you to + combine a background image with a background color gradient. You can + for example use a background image in the plot area and a color + gradient out in the margins.
+You specify a color gradient background by calling the + Graph::SetBackgroundGradient() method. All details are available in + the class reference (follow the link above). We finally give a quick + example on what kind of effect you can achieve using this feature.
Finally we like to mention that in the "/utils/misc/" directory you + will find a small utility script called "mkgrad.php". Running this + script presents you with a UI that makes it a breeze to create a + gradient image on it's own.
+ The UI for the utility is so obvious that we won't discuss it
+ further, we just show it below. The UI for the mkgrad.php utility
In the example below this utility is used to get a more interesting + plot area.
+ + +An interesting enhancement when using Plotmarks is the possibility + to add a callback function to control the size and color of the + plotmarks.
+This callback function will get called with the current Y-value (for + the plotmark) as it's argument. As return value the callback function + must return an array containing three (possible null) values. The + values returned must be
+The exact meaning of the parameters will of course depend on the + type of plot marks being used.
+The callback must be a global function and is installed with a call + to + PlotMark::SetCallback()
+So for example to install a callback that changes the fill color for + all marks with a (Y) value higher than 90 you could add the lines
+
+ function
+MarkCallback(
+$aVal) {
+
if( $aVal
+> 90)
+
$fcolor
+="red"
+
else
+
$fcolor
+="";
+
return array(""
+,"",$fcolor);
+
}
+
...
+
$plot->mark->
+SetCallback(
+"MarkCallback");
+
...
As you can see in the above example we have left some of the return + values blank. Doing this will just ignore any change of these value and + use the global settings for the plotmarks.
+If you also let the (Y) value affect the size of the plot marks you + can get what is sometimes known as a "balloon plot". The example below + is basically a scatter plot that uses filled circles to mark the + points. A format callback is then used to change the color and size + depending on the Y-value for each plot.
+ + +In section 10.2 you can read about + arbitrary rotation of the graphs. For most practical purposes rotation + of 90 degrees is most useful. This could for example be used to plot + horizontal bar graphs.
+The slight complication with general rotation is that the margins + also rotates, this means that if you rotate a graph 90 degrees the left + margin in the image was originally the bottom margin. In additional by + default the center of the rotation is the center of the plot area and + not the entire image (if all the margins are symmetrical then they will + of course coincide). This means that depending on your margin the + center of the rotation will move. You can read more about this and how + to manually set the center for rotation in the section about rotation, 10.2
+This is just a slight inconvenience which you have to take into + account when you need to set an explicit margin with a call to +Graph::SetMargin()
+However, in order to make a rotation of 90 degrees much easier you + can easily rotate a graph 90 degrees and set the correct margin with a + call to +Graph::Set90AndMargin() The parameter to this method lets you + specify the margins as you will see them in the image without having to + think of what becomes what after the rotation.
+So, the only thing you need to do is call this method and then the + graph will have been rotated 90 degrees.
+To get the exact type of axis you want in your graph there are a + number of adjustments available for you. You may change, color, size, + position and general appearance.
+ +Assuming we start with the traditional two axis graph, one X and one + Y axis. You may then change the position of each axis by calling + Axis::SetPos($aPosition) You have to remember that you need to + specify the position on the other axis. SO you need to specify the + world-coordinate for the position. By default the axis are each + positioned at the 0-point on the other axis, i.e. the axis will cross + at the 0,0 point in the graph.
+In addition to the standard positioning you may also use the two + special position markers "min" and "max". This will position the axis + at the minimum (or maximum) position of the other axis.
+For example, to make sure that the X-axis is always at the bottom of + the graph (at lowest possible Y-value) you would have to add the line
+
+ $graph->xaxis->SetPos
+("min");
To change the color and width of the axis you have to make use of + the Axis::SetColor() and + Axis::SetWeight() + methods.
+You might also want to add titles to the axis. This is done through + the Axis::SetTitle() + method. This is actually just a shortcut for accessing the title + property direct. Axis::title::Set() which also allow you to set the + alignment in one call.
+By default the position of the title is to the far right for the + X-axis and in the middle (and 90 degrees rotated) for the Y-axis.
+You can adjust the position of the title with the help of the second + argument to the + Axis::SetTitle() method.
+The possible positions are "high","middle" and "low" which refers to + the scale values on the axis.
+One common modification you might want to do to the title is to + increase the margin between the axis and the actual title. This is + often necessary to do for the Y-axis if the values displayed are large. + You may adjust the distance (in pixels) between the axis and the title + by using the method + Axis::SetTitleMargin()
+So for example to increase the margin on the Y-axis you might add + the line
+
+ $graph->yaxis->SetTitleMargin(40
+);
to your code.
+Finally we mention something about the positioning of tick marks and + labels on the axis. You have the possibility to choose what side of the + axis the tick marks and the labels should be at. For the X-axis this + can be specified as either on the the top (inside the plot area) or at + bottom (outside of the plotarea). In the same way you can specify for + the Y-axis if the labels ( or ticks) should be on the left or right + side.
+To adjust the label positioning you have to use the method + Axis::SetTitleSide() and to adjust the position of the tick mark + you have to use the method + SetTickSide()
For example, the following lines added to a script would change side + of the labels and tickmarks for the X-axis.
+
+ $graph->xaxis->SetLabelPos
+(SIDE_UP);
+
$graph->xaxis->
+SetTickSide(
+SIDE_DOWN);
+
This technique is for example used if you position the X-axis at the + top of the graph as the following example shows.
In scientific style plots it is often common to duplicate each axis + so that all sides of the graph have a labeled axis. This is of course + also fully supported by JpGraph.
+Before we continue we show a small example to illustrate this + feature
+ + +The example above shows the basic configuration. There are now + several modifications you may do to these axis like
+The style of axis is determined by the method + Graph::SetAxisStyle() The available type of axis are
+How to adjust the actual labels are discussed elsewhere in this + manual (see ???,???). However we like to mention here that you can + adjust the label margin (distance between the axis and the labels) with + the method + Axis::SetLabelMargin()
+to adjust the actual label format (like font, color, angle) you need + to access the Axis::SetFont() + and the Axis::SetColor() + methods. If you investigate the + Axis class you will discover more methods to adjust the many + aspects of the axis layout.
+As a final note we also mention the methods + Axis::SetLabelAlign() and + Axis::SetLabelAngle() This first method is really only mentioned + here for completeness since it is mostly used for internal purposes. + However on some occasion you might want to adjust the alignment of the + labels. By default they are centered in respect to the tick mark. By + using the method you might override this positioning should you choose + to do so.
+The second of these methods adjusts the angle of the label in + regards to the axis. This is very useful for X-axis that have long + labels.
+In order to have full control over the way that the labels are + displayed it is possible to define a callback function that will be + applied to all labels. The callback function will be called with the + label as the only argument and should return the value that will be + displayed in the graph. This could for example be used to turn seconds + (used to position data points) into hour and minutes on the scale. For + further reference see the two methods: + Graph::SetLabelFormatCallback(); and + Graph::SetLabelFormat();
+One good way of illustrate the usefulness of label callbacks in a + slightly different context is to show how we can achieve the effect of + an inverted Y-scale.
+An inverted Y-scale has the lowest number at the top and the scale + values increases downwards.
+Even though JpGraph doesn't directly support this feature it is + quite easy to achieve with just a few extra lines of code in your image + script.
+Before we continue we give an example of what we are referring to.
+ + +Two achieve this effect there are two simple steps to take:
+And that's it! We refer you to the code in the example above for the + details.
+By default the auto-scaling algorithm tries to make best possible + use of screen estate by making the scale as large as possible, i.e. the + extreme values (min/max) will be on the top and bottom of the scale if + they happen to fall on a scale-tick. So for example doing a simple line + plot could look like the plot shown in the below.
+However you might sometime want to add some extra to the minimum and + maximum values so that there is some "air" in the graph between the end + of the scale values and the extreme points in the graphs. This can be + done by adding a "grace" percentage to the scale. So for example adding + 10% to the y-scale in the image above is done by calling the + SetGrace() method on the yscale as in
+
+ $graph->yaxis->scale
+->SetGrace(10,
+10);
+
These lines add a minimum of 10% to the top and bottom values of the + scale. Note that we say "minimum" since depending on the specific tick + values choose this might be a little bit more to make the end of the + scale fall on an even tick mark.
+Adding this line to the previous graph will result in the following + example
+ +Since we haven't adjusted the position of the X-axis it will remain + at Y=0 which might not necessary be what we would like so we therefor + also add the line
+
+ $graph->xaxis->SetPos
+("min");
So that the X-axis always will remain at the lowest possible + Y-value. Doing this will then result in the example below
+ + +As an additional way of emphasizing certain areas of the graph it is + possible to add bands (either vertical or horizontal) to any one of the + standard X-Y coordinate system based graphs. A band is a rectangular + area that stretches one entire axis. This means that if you define a + band between X-coordinates 3 and 5 the band area will occupy an area + between the X-coordinates and the entire Y-range.
+In order to access this functionality you must first make sure that + you include the additional library file jpgraph_plotband.php
+At the time of this writing (current as of JpGraph 1.8) the table + below illustrates the 8 basic types of patterns available. We will + shortly show you how you can customize these patterns, To keep these + examples clear we have only used one pattern in each figure.
+ ++ + | + + |
+ + | + + |
+ + | + + |
+ + | + + |
To add a one of these patterns to your graph you need to call the + method + PlotBand::PlotBand() The arguments is fairly easy to understand. + The pattern you would like to use is specified by using the correct + constant. You can see the name of the correct constants in the figures + above. You also need to specify if the band should stretch along the + vertical or horizontal axis as well as the min and max coordinates for + the band. As coordinates you may also use the special values "min" and + "max" which automatically sets the value to the minimum/maximum value + of the scale. The specified numeric value will be automatically + truncated to fit within the plot area.
+We don't discuss the other arguments further here, instead we refer + you to the class reference.
+All patterns can be customized by
+
+
+ $band
+->prect->SetHorizon(
+$aHorizon)
+
assuming that the band is a 3D plane.
+To finish this section we give one final, more creative, example on + how to use the bands.
+ +In addition to the bands you can also add static lines to the graph. + An example of that is actually shown in figure 11 above. You create a + line as an instance of + class PlotLine . So for example the lines
+ $sline
+= new PlotLine
+(HORIZONTAL,0,
+"black",2);
+
$graph->Add(
+$sline);
+
will add a 2-pixel wide horizontal static line at Y-position zero.
+Non X,Y plots includes
+The fundamental difference is that these classes makes use of an + extended version of the basic Graph class. Therefor you can not mix X,Y + plots with non-X,Y plots. For example it is not possible to mix a line + graph with a Polar graph.
+Spider plots are most often used to display how a number of results + compare to some set targets. They make good use of the human ability to + spot symmetry (or rather un-symmetry) . the figure below show an + example of a spider (sometimes called a web-plot). Spiderplots are not + suitable if you want very accurate readings from the graph since, by + it's nature, it can be difficult to read out very detailed values.
+ +In the following section we show how to draw both simple and complex + radar graph. As we will show all the settings will follow the same + pattern as for the more standard linear graphs.
+Let's start by creating a very simple radar plot based on 5 data + points using mostly default values.
+As the first thing you must remember to include the extension module + that contains the radar plot. "jpgraph_radar.php".
+A very simple radar plot is created by the code
<?php
+
include (
+"../jpgraph.php");
+
include ("../jpgraph_radar.php");
+
+
// Some data to plot
+
$data
+= array(55,80,
+46,71,95
+);
+
+
// Create the graph and the plot
+
$graph
+= new RadarGraph
+(250,200,
+"auto");
+
$plot
+= new RadarPlot
+($data);
+
+
// Add the plot and display the graph
+
$graph->Add(
+$plot);
+
$graph->Stroke();
+
?>
and would give the result
+To change the size and position of the radar graph is similar to the + pie plot and you do it by using the methods + SetSize() and + SetCenter()
+If you want a filled radar plot you need to specify the fill color + with the method + SetFillColor() The following example shows these methods in action
+ +We normally would like something more meaningful as description of + each axis than it's number. Specifying the titles are accomplished + through the use of the method SetTitles() of the graph. Let's say that + each axis corresponds to a month. We could then use the code
$titles
+= $gDateLocale
+->GetShortMonth
+();
+
$graph->SetTitles(
+$titles);
+
As you can see the way radar plot is constructed will assign the + titles (and plot points) in a counter-clockwise direction. If you want + them in clock-wise order you will have to inverse your input data array + as well as the title array.
+To specify a legend you (as with the other plot) make use of the + SetLegend(); method on each radar plot.
+Each major tick mark can also be connected together to create a + grid. The grid is accessed through the 'grid' property of the graph. To + enable the grid and set the line style to "dotted" you would have to + add the lines
+ $graph->grid->Show
+();
+
$graph->grid->
+SetLineStyle(
+"dotted");
+
and would result in the following graph
+By design the plot is above the grid line but beneath the axis in + image depth, hence some part of the grid lines are hidden.
+To have the grid lines more "visible" just change their color, say + to, dark red by invoking the SetColor() method on the grid lines which + would give the following result
+Another simple change we could do would be to just change the + background color of the radar graph. This is (not surprisingly) done by + a call to the method SetColor() invoked on the graph object.
+ +You can easily create several radar plot which are added to the same + radar graph. The thing to remember is that if you use filled radar + plots and they overlap each other that the order which they are added + will be the order they are drawn.
+A simple example of this is shown below
+ +In exactly the same way as for line graphs it is possible to add + plot marks in radar plots. The mark property is accessed through the + RadarPlot::mark The example below adds a red ball as a marker.
+ +So far we have just show plots based on an X-Y coordinate system. + This is not the only types of graphs you can create with JpGraph. + Another common type is Pie plots. JpGraph supports both 2D and 3D pie + plots. For 2D pie plots there are also 2 versions, but more on that + later.
+The main difference as compared to the X-Y plots is that to all pie + plots are added to the + PieGraph() instead of the Graph() object we used for the X-Y graphs + we have drawn so far. For this you must first include the + "jpgraph_pie.php" in your script (or "jpgraph_pie3d.php" if you want to + use 3-dimensional pies).
+Below you cane see the code needed to create the simplest possible + pie graph just using the default settings.
+
+ include (
+"../jpgraph.php");
+
include ("../jpgraph_pie.php");
+
+
$data
+= array(40,60,
+21,33);
+
+
$graph
+= new PieGraph
+(300,200);
+
$graph->SetShadow();
+
+
$graph->title->
+Set(
+"A simple Pie plot");
+
+
$p1 = new PiePlot(
+$data);
+
$graph->Add(
+$p1);
+
$graph->Stroke();
+
The above code would give the following pie graph
+There is a few things worth noting here
+You can change almost all aspects of appearance of the pie graphs. + For example you could change :
+The next simplest addition we can do is to add a legend to the pie + graph. We do this by using the + SetLegends(); method. By adding the legends to the previous example + we get the following image
+ +(In the figure above we also moved the center of the pie slightly to + the left to make more room for the legend box.)
+The text for the legends can also contain printf() style format + strings to format a number. This number passed on into this string is + either the absolute value of the slice or the percentage value. How to + switch between the is describe further down in this chapter.
+The next change you might want to change is the size and position of + the Pie plot. You can change the size with a call to + SetSize(); and the position of the center of the pie plot with a + call to SetCenter(); + The size can be specified as either an absolute size in pixels or as a + fraction of width/height (whatever is the smallest). The position of + the pie plot is specified as a fraction of the width and height.
+To put the size and positioning API to use we will show how to put + several pie plots on the same pie graph. In the following example we + have also adjusted the legends of the slice values to use a smaller + font.
+What we do in this example is quite simple, create 4 pie plots, make + them smaller and put them in the four corner of the graph. This will + give the result as shown in the following example.
+ +For very busy Pie plots it can become too little space for the + labels to be printed just beside the pie slice. For this purpose it is + possible to use guide lines for the labels. The library will then draw + a line from the center edge of the slices to the label which will be + positioned further out from the Pie Plot.
+There is one method that is primarily used to handle this, + PiePlot::SetGuideLines() the simplest usage of this would be
$pieplot
+->SetGuideLines
+();
An example of this could then be
+The above example will give guide lines very similar as what is + produced by other programs, e.g. Excel. In addition to the above + variant it is also possible to instruct the library to line up the + labels vertically in a way that we think is easier to read. This is + achieved by specifying the second parameter to the SetGuideLines() to + 'false' as in
$pieplot->
+SetGuideLines(
+true,false);
The first parameter is to enable/disable the guide-lines. With the + same example as above this would then produce the image
+It is also possible to configure the vertical distance between the + labels. By default the distance between the labels is roughly 40% of + the labels font height. By using the method + PiePlot::SetGuideLinesAdjust() it is possible to specify a + fractional value which is interpretated as the distance between the + bottom of one label to the bottom of the next. This means that + specifying a value of '1.0' the labels will have no space between them + and the bottom of one label will touch the top of another label. By + default this value is 1.4.
+By increasing or decreasing this value it is possible to make the + labels become positioned more or less compact. Below we have taken the + above example and reduced the distance to '1.1' and as can be seen this + yields much more compact labeling.
+ +Note: Guide lines is only available in 2D Pie plots.
+So far we have only made use of 2D pie plots, creating 3D pie plots + is no more difficult. Instead of creating the plots with a call to + PiePlot() you create the plots with a call to + PiePlot3D() If we just take the first simple pie plot and replace + the call to PiePlot() with a call to PiePlot3D() we get the following + result.
+3D Pie plots have the same possibilities as the normal pie plots + with the added twist of a 3:rd dimension. You can adjust the + perspective angle with the method + SetAngle() So for example to make the pie more "flat" you just set + it to a smaller angle. Setting the perspective angle to 20 degrees in + the previous example will give the following result.
+ +One way to attract attention to some specific piece of information + in a pie chart is to "explode" one or more slices. Both 2D and 3D pies + support exploding one or several slices.
+Exploding slices is accomplished by the methods + Explode() and + ExplodeSlice() The first method is used if you want to explode more + than one slices and the second is a shorthand to make it easy to just + explode one slice.
+For example to explode one slice the default "explode" radius you + would just have to say
+ $pieplot->ExplodeSlice(
+1)
+
The above line would explode the second slice (slices are numbered + from 0 and upwards) the default amount. Doing this to the two previous + example would result in
+ + + +To explode all slices at once you can use the + PiePlot::ExplodeAll() method. If you want to explode several slices + you can use the + PiePlot::Explode() method and supply a suitable array argument.
+By default the values shown just outside the pie for each slice are + the percentage value for each slice. If you instead wanted the absolute + value you would just have to use the + SetLabelType() method. So to use the absolute value you would call
+
+ $pieplot->
+SetLabelType(
+"PIE_VALUE_ABS");
+
Furthermore you could enhance the formatting of the value by either + using a printf() style format string (using + SetFormat() ) or by providing a formatting function callback (using + + SetFormatCallback() ) for doing more advanced formatting.
+You can also adjust the position of the labels by means of the + PiePlot::SetLabelPos() method. The argument to this method is + either the fraction of the radius or the string 'auto'. In the latter + case JpGraph automatically determines the best position and the the + first case The following example illustrates this
+ +If this formatting is not enough you can also "manually" specify the + labels for each slice individually. You do this by using the + PiePLot::SetLabels() method. This will let you specify individual + text strings for each label. In each specification you can also add a + printf() formatting specification for a number. The number passed on + will be either the absolute value for the slice or the percentage value + depending on what was specified in the call to + SetLabelType()
+The SetLabels() method can also take a second parameter, the label + position parameter. This is just a shortcut to the SetLabelPos() as + described above. By default the position will be set to 'auto' if not + explicitely specified.
Another typical change would be to change the colors of the slices. + There are two fundamental ways of doing this. You either manually + specify the colors for the slices as an array using the method + SetSliceColors() If you specify fewer colors than the number of + slices they will just wrap around.
+Another way is to use one of the pre-defined color "themes". This is + just a predefined set of colors that will be used for the slices. You + choose what "theme" you like to use with the method ( + SetTheme() ) At the time of this writing the available themes are
+The following example shows the same pie using the different + "themes" in order.
+ + + + +A complete color chart of all available colors in the different + themes can be found here
+Another simple change is to remove the border ( or change it's + colors ) that separates each slice. This can be done by a call to + ShowBorder()
+An additional visual enhancements can be made by adding a drop + shadow to the individual slices. This is accomplished by means of the PiePlot::SetShadow() + method. Adding a drop shadow is often more affective if the pie has one + or more slices exploded as the following example shows
+ +As mentioned in the beginning there are two versions of the 2D pie + plots. The normal pie plot created as an instance of + class PiePlot and a variant created as an instance of + class PiePlotC
+This variant is an extension of the standard PiePlot in the sense + that it also have a filled circle in the center. The following example + illustrates this
+ + +Since the PiePlotC is an extension to the basic pie plot all the + normal formatting you can do for pie plots you can also do for the + PiePlotC .
+The additional formatting only concerns the filled middle circle. + You have the option of adjusting size, fill color and all font + properties. You perform these operations with the methods
+ ++PiePlotC::SetMidColor() | Set fill color of mid circle |
+PiePlotC::SetMidSize() | Set size (fraction of radius) |
+PiePlotC::SetMidTitle() | Set title string (may be + multi-lined) |
+PiePlotC::SetMid() | Set all parameters in a single method + call |
In addition to the normal CSIM for PiePlot:s the center area is also + a CSIM hotspot. You specify the target CSIM with a call to + PiePlotC::SetMidCSIM()
+The next example shows an example with some more innovative + formatting. In this example we have :
+Each data point in a polar plot is represented by a tuple consisting + of a radius and an angle. The polar plot itself can be either outlined + or filled. In addition each point may have a standard marker (the same + as for line and scatter plots).
+The scale for the radius can be either linear or logarithmic.
+A polar graph is created by creating an instance of +PolarGraph::PolarGraph(). The polar graph type inherits all the + capabilities of ordinary X-Y graphs, i.e they can have background + images, background gradients, tabbed titles and so on.
+Polar graphs comes in two basic types, they can either show a full + 360 degree graph or a half 180 degree graph. The two examples below + show these two basic types of graphs.
+ + + +The radius axis can be shown in either a linear or logarithmic + scale. This is controlled, as usual, by a call to +PolarGraph::SetScale() The two examples below show the same plot in + either linear or logarithmic scale
+ + + + +Please note that the maximum values of the scales are different.
+By default the scale will be auto scaled depending on the data. You + can also specify a manual scale by supplying an extra argument to the + SetScale() value. The only difference from the manual scaling with the + other X-Y-graphs is that for polar graph you only specify a manual + maximum. The minimum will always be 0 for the linear scale and a scaled + value of 10 (i.e 1, 0.1, 0.001 and so on) for the logarithmic scale.
+The plot is clipped to the plot area so if you specify a smaller + scale then the maximum value that part of the plot that are outside the + plot area will be clipped.
+As usual you have full freedom to select what grid lines you like to + show (and what colors they should have). There are three different + types of grid lines you may adjust. The radius minor and major grid + lines and the angle grid lines.
+You select what grid lines to show with a call to +PolarAxis::ShowGrid() The two example below shows a logarithmic plot + with either just major grid lines or both minor and major grid lines.
+ + + +The colors of the grid lines are specified with a call to + PolarAxis::SetGridColor()
+For the angle grid lines it is possible to specify the angle + division between each grid line with the method + PolarAxis::SetAngleStep() You specify the step distance in degrees. + By default the step size is 15 degrees.
+You can individually specify different fonts and colors for the + angle and the radius labels. The radius font is specified with + PolarAxis::SetFont() and the angle font is specified with a call to + PolarAxis::SetAngleFont()
+You can adjust the color with the method +PolarAxis::SetColor() ?>
+The following example specifies different color for the labels. it + also shows that you can add both a radial axis title as well as a + tabbed title. In this example we have also chosen not to show the frame + around the edge of the plot.
+As can be seen from the previous examples the angle labels have a + small superscripted "o" after each label. You can select if you like to + show this degree mark or not with a call to the + PolarAxis::SetANgleDegreeMark() method by which you can enable or + disable that mark after the angels.
+For the radius labels all standard formatting that can be done to + the X-Y axis such as format string or format callbacks are supported.
+A common modification for polar plots is probably to disable the + display the last label when using a 360 degree plot since the last + label will "collide" with the plot box around the plot area. It is + possible to disable the last label with a call to +Axis::HideLastTickLabel() As you can see this has been used in some + of the examples in this chapter.
+If you have specified markers for the polar plot (by setting the + mark property of the plot) each marker can be a hot spot in a client + side image map. The target URL are as usual specified with the + SetCSIMTargets() as the following short code excerpt shows
+// Start by specifying the proper URL targets
+
$targets
+= array("#1","#2", ....... );
+
$polarplot
+= new PoalrPlot
+($data);
+
$polarplot
+->mark->SetType(
+MARK_SQUARE);
+
$polarplot
+->SetCSIMTargets
+(targets);
+
$graph->Add(
+$polarplot);
+
$graph->StrokeCSIM();
+
As a final example we show a full 360 degree polar plot with square + markers as well as background color gradient and a legend for the plot.
+ +The cynical view: To explain why your project is over-due and + over-budget.
+The pragmatic view: To keep management of our back and know what we + have forgotten
+The common view: As a tool to help identify project issues and + highlight problem areas.
+Basically, Gantt charts are used to show the state of a number of + activities (possible grouped) against time.
+Time to show you an example of a Gantt chart and how easy it is to + make one. Lets make it the simplest possible Gantt chart. One activity, + named "Project", which lasts from "2001-11-01" to "2002-02-20".
+All it takes to do this (using default values for everything) is the + following code.
<?php
+
include (
+"../jpgraph.php");
+
include ("../jpgraph_gantt.php");
+
+
// A new graph with automatic size
+
$graph
+= new GanttGraph
+(0,0,
+"auto");
+
+
// A new activity on row '0'
+
$activity
+= new GanttBar
+(0,"Project",
+"2001-12-21",
+"2002-01-20");
+
$graph->Add(
+$activity);
+
+
// Display the Gantt chart
+
$graph->Stroke();
+
?>
+
The resulting image is shown in Figure 147 below.
Let's note a few things with the above image and code:
+So, lets start making this graph a little bit more interesting. + First we are going to add a title, then we will add a month scale and + finally we will change the color of the bar.
+All that is taken care of in the code below.
<?php
+
include (
+"../jpgraph.php");
+
include ("../jpgraph_gantt.php");
+
+
$graph
+= new GanttGraph
+(0,0,
+"auto");
+
$graph->SetShadow();
+
+
// Add title and subtitle
+
$graph->title->
+Set(
+"A nice main title");
+
$graph->title->
+SetFont(
+FF_ARIAL,
+FS_BOLD,12);
+
$graph->subtitle->
+Set(
+"(Draft version)");
+
+
// Show day, week and month scale
+
$graph->ShowHeaders(
+GANTT_HDAY |
+GANTT_HWEEK |
+GANTT_HMONTH);
+
+
+// Instead of week number show the date for the first day in the week
+
// on the week scale
+
$graph->scale->
+week->SetStyle(WEEKSTYLE_FIRSTDAY);
+
+
+// Make the week scale font smaller than the default
+
$graph->scale->
+week->SetFont(FF_FONT0
+);
+
+
+// Use the short name of the month together with a 2 digit year
+
// on the month scale
+
$graph->scale->
+month->
+SetStyle(
+MONTHSTYLE_SHORTNAMEYEAR2);
+
+
+// Format the bar for the first activity
+
// ($row,$title,$startdate,$enddate)
+
$activity
+= new GanttBar
+(0,"Project",
+"2001-12-21",
+"2002-01-20");
+
+
+// Yellow diagonal line pattern on a red background
+
$activity
+->SetPattern(BAND_RDIAG,
+"yellow");
+
$activity
+->SetFillColor
+("red");
+
+
// Finally add the bar to the graph
+
$graph->Add(
+$activity);
+
+
// ... and display it
+
$graph->Stroke();
+
?>
+
From the above example you might note a few things
+To show that this is really simple let's show the full year in the + month, and set the header style to be white text on a dark blue + background by adding the lines
+
+// Use the short name of the month together with a 4 digit year
+
// on the month scale
+
$graph->scale->
+month->
+SetStyle(
+MONTHSTYLE_SHORTNAMEYEAR4);
+
$graph->scale->
+month->
+SetTextColor(
+"white");
+
$graph->scale->
+month->
+SetBackgroundColor(
+"blue");
+
to the code above. The resulting image is shown in Figure 149
+ +A Gantt chart is made up of four distinct areas.
+Since a Gantt chart inherits all the usual properties of a JpGraph + Graph() you have the access to the same method to formatting the image + as before. For example to have a shadow around the image you call + Graph::SetShadow() and to set the margin color you can use + Graph::SetMarginColor(). Please refer to the reference documentation + for a full list of supported features.
+To create a Gantt chart you add objects to it. As + of this writing you may add the following object by the use of the + GanttChart::Add() method
+All these objects may be extensively modified in terms of + formatting. You can specify color (both fill- and frame color), size, + titles, style and patterns and so on. All these objects comes with (in + my mind) sensible default so you don't have to specify a lot of + parameters. But if you need a fine grain control or if you disagree + with my taste you can.
+You create a new Gantt Chart with a call to GanttChart(). The + signature for GanttGraph is the same as for ordinary JpGraph graphs, + i.e
+ function
+GanttGraph(
+$aWidth,
+$aHeight,
+$aCachedName,
+$aTimeOut,
+$aInline)
+
The only real difference is that for GanttCharts you can specify one + or both of the dimension parameters (width and height) as -1 in which + case that dimension will be automatically sized determined by scale and + fonts chosen. The following examples shows some possible ways of + creating a new graph
+Since GanttGraph() inherits all the methods (that make sense for + GanttGraph) from Graph you can specify shadow, color etc of the general + frame.
+Bars and Milestones need both a vertical position and a horizontal + position. The horizontal start position is specified as a date, e.g. + "2001-06-23", and the vertical positions are specified as a number + [0,1,2,3,...]. This vertical number indicates the position from the top + where the object should be placed. To understand this you might imagine + a number of "invisible" horizontal bands with a certain height. If you + specify 0 as the vertical position the bar will be placed in the first + band, specify 3 and the bar will be placed in the fourth band and so + on.
+It is perfectly legal, and perhaps even desirable to leave "gaps" + when laying out bands to group related activities. So, for example you + could have three activities/bars at positions 1,2,3 and then another 2 + bars at position 6,7 leaving band 0,4,5 empty.
+All these "invisible bands" have the same height (equ-spaced). The + height of each band is automatically determined and depends on both the + method of layout ( as specified by (GanttChart::SetLayout()) and the + individual heights of the individual bars and titles. The rules are + quite simple:
+The most common of all object in a Gantt chart is of course the + activity bar (GanttBar()). In terms of formatting this object has a + very large flexibility. The full signature for the GanttBar constructor + is
+ function
+GanttBar(
+$aVPos,$aTitle,$aStart
+,$aEnd,$aCaption,
+$aHeight)
+
+
+ $aVPos
+ | The vertical position for the + bar, [0..n] | |
+
+ $aTitle
+ | Title for the activity | |
+
+ $aStart
+ | Start date for the activity given + as string, e.g "2001-09-22" | |
+
+ $aEnd
+ | End date for activity given as either + a date (a string) or as the duration (in days) of the activity, e.g + both "2001-10-15" and 20.5 are valid inputs | |
+
+ $aCaption
+ | Text string (caption) to appear + at the end (right side) of the bar | |
+
+ $aHeight
+ | Height of bar given as either + a value in range [0,1] in which case this is interpretated as what + fraction of the vertical position should the bar occupy. The height can + also be given in absolute pixels [1..200] |
As described above vertical positions are specified as a numeric + value [0..n] where 'n' is an arbitrary constant. (For practical + purposes n is most likely < 100)
+Using our previous example we will illustrate this parameter by + changing the position of our 'Project' activity to position 7. Therefor + we change the call to GanttBar() to
+ $activity = new GanttBar(
+7,"Project","2001-12-21"
+,"2002-02-20"
+);
and we then get the chart as shown below in Figure 150.
+ +Note that the height of each position (vertical position) will + depend on the actual height of the bar.
+Start of bars are given as a date string. The format depends on the + current locale. Examples of valid date strings are
+Even if several format are supported it is recommended to use all + numeric dates, i.e in the form "2001-10-22".
+Specifying the end position may be done in two different ways, + either by the end date in the same way as for the start date. The other + way is to specify the length of the activity in number of days + (and fractions thereof). Examples of valid end dates are:
+Please note that duration is specified as numerical values and + not strings.
+Milestones are similar to bars but have no end date since milestones + just apply to one single date. Milestones are created much the same way + as activities but using method MileStone() instead.
+The full signature for milestones are
+function MileStone
+($aVPos,$aTitle,
+$aDate,
+$aCaption)
+
+
+ $aVPos
+ | The vertical position for the + bar, [0..n] | |
+
+ $aTitle
+ | Title for the activity | |
+
+ $aDate
+ | Date for the milestone | |
+
+ $aCaption
+ | Text to the right of the + milestone |
Valid milestones are for example
+
+ $milestone = new
+MileStone(3,"Code complete","2001-12-01"
+);
+ $milestone = new
+MileStone(3,"Code complete","2001-12-01"
+,"(2001-12-01)"
+);
By default milestones are rendered as a filled "Diamond" shape. This + may be optionally modified. The actual shape is specified by the 'mark' + property of milestone which is an instance of the PlotMark() class + (same class responsible for the marks in line graphs).
+To change the shape of a milestone to, say a triangle, you use the + SetType() method as in
+ $milestone->mark->
+SetType(
+MARK_DTRIANGLE)
+
Let's put this into practice and add a milestone to our previous + example by adding the following two lines of code which result in + Figure 151 shown below.
+ +You may note that by default the title color is red for milestones. + If you like to change this to be instead, say bold black, you would + invoke the SetColor() and SetFont() methods on the title property of + milestones as in
$milestone->
+title->SetFont(FF_FONT1
+,FF_BOLD);
+
$milestone
+->title->SetColor(
+"black");
+
and thew result would now (not surprisingly be)
+To modify the caption you do exactly the same but act on property + 'caption' instead of 'title', i.e.
+ $milestone->caption->
+SetFont(
+FF_FONT1,
+FF_BOLD);
+
$milestone
+->caption->SetColor(
+"black");
+
It is worth noting that you modify the bar title and caption the + exact same way by acting on the 'title' and 'caption' property for the + bars.
+The final object you may add to a Gantt chart is simple, but quite + useful, a straight vertical line extending over the whole plot height. + This could for example be used to illustrate different phases in a + project. You create a line object by a call to GanttVLine()
+The full signature for GanttVLine() is
+function GanttVLine
+($aDate,$aTitle,
+$aColor,
+$aWeight,
+$aStyle)
+
+
+ $aDate
+ | Date for the milestone | |
+
+ $aTitle
+ | Title for the line. The title is + displayed at the bottom of the line | |
+
+ $aColor
+ | Color for the line | |
+
+ $aWeight
+ | Line width | |
+
+ $aStyle
+ | Line style,"dashed", "dotted" and + so on |
Valid creations of lines are for example
+
+ $vline = new
+GanttVLine(
+"2001-12-24");
+
+ $vline = new
+GanttVLine(
+"2001-12-24",
+"Phase 1");
+
+ $vline = new
+GanttVLine(
+"2001-12-24",
+"Phase 1",
+"darkred");
+
+ $vline = new
+GanttVLine(
+"2001-12-24",
+"Phase 1",
+"darkred",5);
+ $vline = new
+GanttVLine(
+"2001-12-24",
+"Phase 1",
+"darkred",5,"dotted"
+);
To add the line to the graph you just have to call GanttGraph::Add() + as with milestones and bars. Let's illustrate the use of vertical lines + by adding a line to the previous example.
$vline
+= new GanttVLine
+("2001-12-24","Phase 1");
+
$graph->Add(
+$vline);
+
and the example (See 153) now becomes
+From the above figure you can see that by default the line is drawn + at the beginning of the day of the specified date and in a 'dashed' + style. This can (of course!) be modified so that the line is + drawn/aligned anywhere in the specified day. You modify this by + invoking the method SetDayOffset() with an argument specifying the + fraction of the day where you want the line positioned.
+If you, for example, want to display the line in the middle of the + day just add the line
+ $vline->SetDayOffset(
+0.5);
+
to the previous code and the result will be
+ +As usual you may modify the font, size and color by invoking the + appropriate method (SetFont(), SetColor()) on the 'title' property of + lines.
+You can easily add a variety of markers both to the start and end of + the gantt bar. They could for example be used as an alternate way to + illustrate important milestones or anticipated deliveries.
+The left and right markers are accessed through the two properties + 'leftMark' and 'rightMark'. They are both instances of the general + 'PlotMark' class which is also used for the milestones (and in line + graphs). The 'PlotMark' class supports several different styles, for + example, diamond (the default for milestones), filled and unfilled + circles, squares, stares, and so on. Please refer to the reference + section for a complete listing.
+Let's illustrate this by adding a right marker to the previous + example. We will use a style of a filled (red) circle with a white + title, say, "M5". In order to accomplish this we must augment the + previous example with the following lines:
$activity
+->rightMark->Show();
+
$activity
+->rightMark->title->
+Set("M5");
+
$activity
+->rightMark->SetType(
+MARK_FILLEDCIRCLE);
+
$activity
+->rightMark->SetWidth(
+10);
+
$activity
+->rightMark->SetColor(
+"red");
+
$activity
+->rightMark->SetFillColor(
+"red");
+
$activity
+->rightMark->title->
+SetFont(
+FF_ARIAL,
+FS_BOLD,12);
+
$activity
+->rightMark->title->
+SetColor(
+"white");
+
This might seem like a lot of lines but this is as complicated as it + possible can get. As an illustration in the example belwo more or less + everything that is changeable has been changed, the default font, + font-color, fill-color, frame-color and width of marker. The two lines + only really necessary are the first two, showing the mark and setting a + title. One could still get a good result by using default values for + the rest of the properties.
+The resulting image can be seen in Figure 155 below.
+We have deliberately introduced a "strangeness" here. If the + previous two examples are compared it can bee seen that the last + example is larger than the previous one. Why?
+The explanation is trivial once we recall that the height of bars + are sized relative to the horizontal spacing. The horizontal spacing + are based on the highest single bar including title size and, here come + the explanation, marker size. The horizontal spacing has grown since + the minimum height is now based on 10 points(=the height of the mark). + The bar still occupy the same percentage of the height so it seems to + have grown.
+If this behavior is unwanted it is always possible to specify an + absolute size for the bar heigh, say 8 pixels, with a call
$activity->SetHeight
+(8);
and achieve the result in Figure 156 below.
+It is worth noting that the height reserved for each bar is still + the same since we haven't changed the height of the marker and the + reserved space is the maximum height used by any bar.
+Let's see what happens if we set the height of each bar to be 100% + of the reserved height by adding another activity/bar below the first + one and set the height of each bar to 100% by adding the lines (We omit + the added lines to add another bar since they are just a copy of the + first bar)
+ $activity->
+SetHeight(1.0);
+
$activity2
+->SetHeight(1.0);
+
to the previous example. (Note that a value in the range [0..1] is + interpretated as the fraction of the reserved height while a value > 1 + is interpretated as the absolute size in pixels.)
+Aha.. What we are trying to do doesn't really make sense. Since we + have specified that the bar will always occupy 100% of the available + reserved with there will be no distance between the bars. So what if we + specify the bar as 10 pixel absolute by changing the lines to
$activity->SetHeight
+(10);
+
$activity2
+->SetHeight(10);
+
we instead get
+So what can we actually do? Well if you remember the reserved height + for each bar is the maximum height of all bars including titles. This + guarantees that no two bars will ever overlap. To guarantee that titles + don't end up too close together there is a Vertical Label Margin + which basically specifies some extra "air" in between the titles. The + amount of air is specified in percent of the title height. To set the + margin you use
+ GanttGraph::
+SetLabelVMarginFactor(
+$aMargin)
+
As an example let's set that margin in the previous example to 0 and + see what happens.
+As you would perhaps expect the two bars just barely touches now + since there are no extra margin added. If the two bars hadn't had the + extra right marker it would have looked very compressed.
+By default the vertical margin is set to 40%.
+The scale headers allow you to view up to four different scales at + the same time. The four basic scales are:
+You can choose what scale to include and exclude by using the + SetScale() method. For example, for a detailed gantt you might choose + to display days and weeks by specifying
$graph
+->ShowHeaders
+( GANTT_HWEEK
+| GANTT_DAY );
If you instead wanted "the big picture" it might be enough to show + year and months by specifying
+ $graph->ShowHeaders(
+GANTT_YEAR |
+GANTT_MONTH );
+
You can choose freely the combination of scales that you want, but a + chart must at least have one scale of course.
+Once you have decided what level of details you need you can then + fine tune the exact layout/formatting of each of the enabled scales as + described below.
+These scale header are all accessed through the graph instance + variables 'scale' as in
+ $graph->scale->
+week
or
+ $graph->scale->day
. All these headers share the following properties.
+
+ Show()
+
Determine if the scale should be shown or not
+
+ SetFont()
+
Font for text in header
+
+ SetFontColor()
+
Specify the color of the header text
+
+ SetStyle()
+
Specify what date format should be used, for example in the week + scale it is possible to show either week number, the start date of the + week and so on.
+
+ SetBackgroundColor()
+
As it says, the background color for the header
+
+ SetFrameWeight()
+
The line weight of the box around the scale
+
+ SetFrameColor()
+
The line color for the frame
+
+ SetTitleVertMargin()
+
The margin, in percent, below and above the title text
+In addition to these methods each scale also has the property 'grid' + which determines the appearance of grid lines for that specific scale. + You may modify the appearance of grid lines by the "normal" line + methods, i.e. SetColor(),SetWeight() SetStyle() and Show(). So for + example to set the week grid line red you would use
$graph
+->scale->week->
+grid->SetColor("red"
+);
Each of the scales also have some specific formatting possibilities + as described below.
+Minute scale is the lowest resolution you can use. It is often + convenient to use Minute scale with "GanttScale::SetINtervall()" since + by default the increment will be 1 minute. The style of minute scale + can be further adjusted by the use style parameters which can be + one of
+Minute scale is enabled by adding the GANTT_HMIN in the + GanttGraph::ShowHeaders() call. For example as in
$graph
+->ShowHeaders(GANTT_HDAY |
+GANTT_HHOUR |
+GANTT_HMIN);
+
The code snippet below shows how to set up a minute scale with 30 + min interval and some custom colors.
+ $graph->scale->
+minute->
+SetIntervall(
+30);
+
$graph->scale->
+minute->
+SetBackgroundColor(
+'lightyellow:1.5');
+
$graph->scale->
+minute->
+SetFont(
+FF_FONT0);
+
$graph->scale->
+minute->
+SetStyle(
+MINUTESTYLE_MM);
+
$graph->scale->
+minute->grid->SetColor
+('lightgray');
The hour scale has more builtin formatting possibilities. The + following formatting options are available
+For hours it is possible to specify the interval in either of two + ways. With an integer, e.g. 6, or as time interval, e.g. "1:30" which + makes the interval one and a half hour. The only restriction is that + the interval must be even dividable for 24 hours since one day is the + smallest possible interval to show. This means that it is allowed to + use, for example 2,4,6,"1:30" or "0:45" as intervals but not 7, "2:45".
+The code snippet below shows hot to set up a hour scale to with 45 + minutes interval and some custom colors
$graph
+->scale->hour->
+SetBackgroundColor(
+'lightyellow:1.5');
+
$graph->scale->
+hour->SetFont(FF_FONT1
+);
+
$graph->scale->
+hour->SetStyle(HOURSTYLE_HMAMPM);
+
$graph->scale->
+hour->
+SetIntervall(
+"0:45");
+
The example below shows a gantt chart with the day and hour scale + enabled
+ +By default the day scale show the first letter of the week day but + it is also posible to format the day scale in a number of different + ways. Days can have one of the following scale formats.
+The formatting is specified by using the SetStyle() method as in
$graph
+->scale->day->
+SetStyle(
+DAYSTYLE_LONG);
+
The graphical formatting possibilities for days allow the + possibility to specify a different color for the weekend background and + also for the Sunday.
+
+ SetWeekendColor()
+
Set the background color for weekends. (Defaults to light gray)
+
+ SetSundayFontColor()
+
The Sunday font color. (Defaults to red)
+In addition to this there is also a possibility to choose whether or + not the weekend background should be extended vertically down over the + plot area. (the default). Since that is a property more of the whole + plot this behavior is modified with a call to the method
UseWeekendBackground()
of the scale, e.g.
+
+ $graph->scale->UseWeekendBackground(false
+);
Week scales, if enabled, by default shows the week number in range 1 + to 53 (as defined by ISO-8601, see the reference section).
+It might be worth pointing out here that the week number calculation + is carried out within JpGraph and does not rely on the underlying OS + date libraries. This makes the behavior consistent over several OS:s + (at least M$ Windows does not comply to ISO-8601 or supply any + way of doing this through the normal libraries, e.g. strftime())
+You may modify the week behavior in three ways. You can specify + (with SetStyle()) a different date format using the constants
+
+ WEEKSTYLE_WNBR
Show week number To further modify the formatting of the actual week + number you can optionally supply a format string with a call to
SetLabelFormatString()
The format of the string should be a standard sprintf() syntax + expecting an integer (the week number). By default a 'W' is prefixed to + the number.
+
+ WEEKSTYLE_FIRSTDAY
Show date of first day in week.
+
+ WEEKSTYLE_FIRSTDAY2
Show date of first day in week and short month
+
+ WEEKSTYLE_FIRSTDAYWNBR
Show weeknumber of first day in week.
+
+ WEEKSTYLE_FIRSTDAY2WNBR
Show weeknumber of first day in week and month
+For month scale you can use the SetStyle() method to choose between + a variety of formats.
+
+ MONTHSTYLE_SHORTNAME
Display the month name in its locale specific short form, i.e Jan, + Feb etc
+
+ MONTHSTYLE_SHORTNAMEYEAR2
Display the month name in its locale specific short form together + with a 2 digit year , i.e Jan '01, Feb '01 etc
+
+ MONTHSTYLE_SHORTNAMEYEAR4
Display the month name in its locale specific short form together + with a 4 digit year , i.e Jan 2001, Feb 2001 etc
+
+ MONTHSTYLE_LONGNAME
Display the month name in its locale specific long name, i.e. + January, February
+
+ MONTHSTYLE_LONGNAMEYEAR2
Display the month name in its locale specific long name together with + a 2 digit year , i.e January '01, February '01 etc
+
+ MONTHSTYLE_LONGNAMEYEAR4
Display the month name in its locale specific long name together with + a 4 digit year , i.e January 2001, February 2001 etc
+
+ MONTHSTYLE_FIRSTLETTER
The first letter of the month name
+Year scale has no extra formatting possibilities.
+This section shows some further modification you might do to + activity bars.
+Caption for bars are placed at the far right side of the bars. They + can for example be used to indicate the resources assigned to a task, + the duration of the task or the progress of the activity.
+Caption text for a bar is specified either when creating a bar or + later by accessing the 'caption' property of bars. So the two lines
$activity = new GanttBar
+(0,"Activity 1",
+"2001-11-21",
+"2001-12-20",
+"[BS,ER]")
+
and
+ $activity->
+caption->Set("[BS,ER]"
+);
are both ways of specifying the caption "[BS,ER]" for the activity. + Since activity is a standard JpGraph text object you can easily modify + font, color and size with calls to SetFont() and SetColor(), (e.g.
$activity->caption
+->SetFont(FF_ARIAL,
+FF_BOLD,9);
The figure below illustrates the use of caption
+ +To indicate the progress of a specific activity it is also possible + to add a progress indicator to each bar. This progress indicator + consists of a smaller bar within the bar. By default this progress bar + is black and 70% of the height of the bar. These parameter can (of + course) all be changed.
+The properties for the progress indicator are accessed through the + 'progress' property and it's methods.
+To set the progress for a specific activity you only specify the + percent as a fraction. As in
+ $activity->progress->
+Set(0.4)
In Figure 162 the previous example is modified to indicate the + progress of each activity by the default progress indicator. A solid + bar. To make it clearer we have also modified the caption to reflect + the displayed progress. (At the same time we also modified the scale + headers just to illustrate some more formatting options).
+To specify a different format for the progress you use the + SetPattern() method as in
+ $activity->progress->
+SetPattern(
+BAND_RDIAG,
+"blue");
+
In the reference section you can see the exact parameters and all + available methods.
+ +It is common to group activities. We have used this feature in the + examples of constrains. There is no special type for activity bars that + are used to illustrate grouping. The common way of illustrating this + (as have been used above) is to add "half" a triangle marker at both + ends of the bar. The special provision that JpGraph does is that if you + add a left or right marker of type MARK_LEFTTRIANGLE or + MARK_RIGHTTRIANGLE those triangles will be drawn under the bars to give + the effect as show in the examples above. In the example above we also + have made the grouping bars have slightly less heigh since the end + triangles will visually "grow" the bar.
+So to get the effect we want for a group bar we have to use the two + lines:
+ $groupbar->
+leftMark->
+SetType(
+"MARK_LEFTTRIANGLE");
+
$groupbar
+->rightMark->SetType(
+"MARK_RIGHTTRIANGLE")
+
As of the current version There is not yet any formatting support to + accomplish the effect of indentation for the titles so this is + accomplished by using a fixed width font and adding spaces in front of + the title.
+It is often of interest not only to show one title for a gantt bar + but often one wants to show, title, start date, end date, duration or + effort and so on. Up until now we have, to keep things simple only + shown a single title for each activity. We will now show you how you + can specify an arbitrary number of columns as titles for a Gantt chart + as well as adding icons in the graph columns.
+First out is an example to help visualize what we will achieve
+To use multiple columns there is two steps. First you need to set + the titles (name, color, fonts etc). Thereafter you need to add the + title columns for each individual bar.
+To set the columns you will have to work with the Activity + information property of the scale. The following code excerpt show + this
+ $graph->scale->actinfo
+->SetColTitles
+(
+
array('Note'
+,'Task','Duration',
+'Start',
+'Finish'),array(
+30,100));
You will notice two things. We fist specify the titles using an + array. We have also specified a second array with the numbers 30 and + 100. This is an optional array that specifies the minimum width of, in + this case, the first two columns. By default the columns will be wide + enough to hold the widest text string in the column. However for + esthetic reasons you might sometimes want to increase the minium width. + This is what we have done here for the first two columns.
+Furthermore you can also adjust the background colors and the style + and colors of the vertical dividing grid lines. In the previous image + we used the lines
$graph->
+scale->actinfo->SetBackgroundColor('green:0.5@0.5');
+
$graph->scale->
+actinfo->
+SetFont(
+FF_ARIAL,
+FS_NORMAL,10);
+
$graph->scale->
+actinfo->vgrid->SetStyle
+('solid');
+
$graph->scale->
+actinfo->vgrid->SetColor
+('gray');
The style for the grid lines can also be "dashed", "dotted" or + "longdashed" as in other line formatting contexts within the library. + You can also adjust if you would like the small "3D" effect in the + titles. By default this is enabled. You can easily turn this of with a + call to
+ $graph->scale->actinfo
+->SetStyle(ACTINFO_2D);
+
To adjust the colors of the vertical dividing lines in the title the + method SetColor() is used as in + "$graph->scale->actinfo->SetColor('navy');".
+The second thins is to actually populate the columns. This is done + (of course) as you add the activity bars to the graph. Previous we just + used a string as the title when we wasn't using columns. By simply + replacing this string with an array we specify the content of the + columns.
+For example to specify two column titles we just create a + hypothetical Gantt bar as In the full example above we put all this in + arrays to make for better coding practice since we create several bars.
+In addition to ordinary text you can also add an image or any of the + predefined icons available. In order to add that in a column you first + create an instance of IconImage() and then specify that instance + instead of the text. So in the previous code snippet if we wanted a + "open folder" image in the first column we would change the lines to
+ $iconopen = new
+IconImage(
+GICON_FOLDEROPEN,
+0.6);
+
$title2="";
+
$bar
+= new GanttBar
+(0,array($iconopen,
+$title2),
+"2003-11-23",
+"2003-12-05");
+
The available builtin icons are
+In addition you can also use any of you own images if you specify + the argument as a string, for example
+ $myicon = IconImage(
+'myicon.png');
+
If you wonder, the second argument in the IconImage() call is + an optional scaling factor which you can use to adjust the size of the + image.
+Precisely as before you can also have a title spanning all the + columns. This title is specified with the property tableTitle of + the scale. Specifying a table title will automatically adjust the + height of the column titles to fit the table title. The small code + snippet below shows how to add a title.
$graph
+->scale->tableTitle->
+Set('Phase 1');
+
$graph->scale->
+tableTitle->
+SetFont(
+FF_ARIAL,
+FS_NORMAL,12);
+
$graph->scale->
+SetTableTitleBackground(
+'darkgreen@0.6');
+
$graph->scale->
+tableTitle->
+Show(true);
A full example of this is shown below
+ +In exactly the same way as for a single title it is possible to + specify individual CSIM targets for each of the title columns. This is + accomplished by specifying an array for both the target and the alt + text instead of a single string as arguments for SetCSIMTarget() + The following code snippet shows how to specify that.
$bar
+->title->SetCSIMTarget(array('sometarget1.html','sometarget1.html'),
+
array('alttext1'
+,'alttext2'));
In this section we will show a few more way by which you may + customize the gantt chart itself. This includes
+The (default) white area in the top left of the gantt table may have + a title. This is accessed by the 'tableTitle' property of the gantt + scale. Using this is straightforward as the following lines show.
$graph
+->scale->tableTitle->
+Set(
+"(Rev: 1.22)");
+
$graph->scale->
+tableTitle->
+SetFont(
+FF_FONT1,
+FS_BOLD);
+
$graph->scale->
+SetTableTitleBackground(
+"silver");
+
$graph->scale->
+tableTitle->
+Show();
+
The example lines above also changes the default white background to + silver. Adding these lines to the previous example gives the following + result:
+From the above example you might notice that the width of the left + column (which holds all the titles) have automatically adjusted itself + to make the table title fit.
+The vertical and horizontal lines between the titles and the bars + can be modified by accessing the 'divider' and 'dividerh' properties of + the scale. Again, this is straightforward as the following example + shows:
+ $graph->scale->divider
+->SetWeight(3);
+
$graph->scale->
+divider->
+SetColor(
+"navy");
+
$graph->scale->
+dividerh->
+SetWeight(3);
+
$graph->scale->
+dividerh->
+SetColor(
+"navy");
+
The effect of this is shown in Figure 167 below
+ +In a similar manner to the other plots in JpGraph you modify the Box + round the plot with the standard graph method 'SetBox()' as in
$graph
+->SetBox(true,
+"navy",3)
which will result in a thicker plot box around the area as shown + below
+In order to make large charts easier to read it is possible to + specify alternating an horizontal grid and optional alternating line + colors in the background for Gantt charts. The horizontal grid is + accessed through the Graph::hgrid property and the line (used in + the grid) is accessed through the Graph::hgrid::line + sub-property
+In order to specify the alternating line colors the + SetRowFillColor() method is used. For example, to use alternating + blue background with blue grid line the following lines would have to + be added to the graph script
+
+// Setup a horizontal grid
+
$graph->hgrid->
+Show();
+
$graph->hgrid->
+line->SetColor('lightblue'
+);
+
$graph->hgrid->
+SetRowFillColor(
+'darkblue@0.9');
+
Below is an example of a Gantt graph using this formatting
+ +
+ $icon = new IconPlot(
+'penguin.png',
+0.01,0.95,1
+,15);
+
$icon->SetAnchor(
+'left',
+'bottom');
+
$graph->Add(
+$icon);
+
$graph
+= new GanttGraph
+(500);
+
$graph->SetMargin(
+0,0,30
+,0);
As we have shown in the previous examples constructing a Gantt chart + consists of a number of repetitive tasks; Create the individual + activity bars and add them to the graph.
+Now when you have a basic understanding of how this works you are + ready to appreciate a small helper method. +GanttGraph::CreateSimple(). This method takes a few arrays of data + which specifies you Gantt chart and then constructs this chart. By + using this method you sacrifices a few adjustment possibilities for + simplicity. This method is nothing magical it just takes the data for + the activities,(start and end date, titles, progress, any constrains + and so on) and constructs the activities and adds them to the graph.
+The activities are specified in data array which for each activity + have the following fields
+So for example to create a Gantt chart consisting of two activities + which are grouped and a milestone one would have to use something + similar to the following code
+
+ $data = array(
+
array(0,ACTYPE_GROUP, "Phase 1", "2001-10-26",
+"2001-11-23",
+""),
+
array(1,ACTYPE_NORMAL, " Label 2", "2001-10-26",
+"2001-11-13",
+"[KJ]"),
+
array(2,ACTYPE_NORMAL, " Label 3", "2001-11-20",
+"2001-11-22",
+"[EP]"),
+
array(3,ACTYPE_MILESTONE," Phase 1 Done", "2001-11-23",
+"M2") );
+
+
// Create the basic graph
+
$graph
+= new GanttGraph
+();
+
$graph->title->
+Set(
+"Gantt Graph using CreateSimple()");
+
+
// Setup scale
+
$graph->ShowHeaders(
+GANTT_HYEAR |
+GANTT_HMONTH |
+GANTT_HDAY |
+GANTT_HWEEK);
+
$graph->scale->
+week->SetStyle(WEEKSTYLE_FIRSTDAY);
+
+
// Add the specified activities
+
$graph->CreateSimple(
+$data);
+
+
// .. and stroke the graph
+
$graph->Stroke();
+
This will then show up as
+You may (slightly) modify the appearance of the simple Gantt charts + by means of the methods GanttGraph::SetSimpleFont() and GanttGraph::SetSimpleStyle() But not anything else, remember + that the purpose with this way of constructing graphs is to be simple. + If you need full advanced control you have to construct all the + activities in the "normal" way.
+You can also specify constrains and progress for each bar by + supplying additional data arrays to GanttGraph::CreateSimple().
+Gantt charts can have independent (different targets) hot spots in + both the activities and in the associated labels for each activity.
+You specify the target and the associated "Alt" text for an activity + bar by calling the + GanttBar::SetCSIMTarget() and + GanttBar::SetCSIMAlt()
+In a similar way you set the target and Alt texts for the activity + title as the following code extract shows.
$bar
+->SetCSIMTarget
+("http://localhost/abc/"
+);
+
$bar->SetCSIMAlt(
+"Alt Text for the bar");
+
$bar->title->
+SetCSIMTarget(
+"http://localhost/abc");
+
$bar->title->
+SetCSIMAlt(
+"Alt Text for the title");
+
The above code assumes that your activity is available in the + variable 'bar'. In the example directory there is a complete example of + how to use CSIM together with Gantt charts in the "ganttcsimex1.php" + file. (Please note that this example makes use of the simplified Gantt + chart specification using the CreateSimple() method.
+With Gantt charts there is often the need to illustrate constrains + between one or several activities. One of the most common constrain is + that on activity can't start before an other activity finish.
+JpGraph support visualizing the following types of constrains
+An example will clarify how to specify a constrain between two + activities.
+Assume that we start with the Gantt schema as illustrated below
+We would now like to add the constrains that the activity "Label 3" + cant start before activity "Label 2" has finished and that the + milestone "Phase 1 done" is depending on when activity "Label 3" is + done.
+The principle of adding constrains is that you for each activity you + want to have a constrain you have to tell to what other activity this + constrain should be to. That other activity is specified by telling on + what row that activity lies. Depending on what type of constrain, e.g. + Start-to-End, an arrow will now connect the two activities in correct + way.
+The way to do this is to call the + SetConstrain() method on the activity. In this method you specify + the type of constrain as well as to what other activity this constrain + should be to. If you read the class reference you can also see that you + can specify the type and size of arrow used. For now we will just use + the default sizes and type.
+So for example to add an End-To-Start constrain between "Label 2" + and "Label 3" you could write
+ $bar2->
+SetConstrain(2,CONSTRAIN_ENDSTART)
The first parameter in the call above "2" is the row of the target + activity (i.e. the row where "Label 3") activity is. In the example + below we have added the constrains we wanted.
+A note: The actual path followed by the arrow is controlled by some + heuristics to make it clear what the constrain is. It has been a design + decision that in order to keep the API simple the user has no further + detailed controlled on the actual path followed. However, in future + version the heuristics may be extended and provide some + user-controllable parameters.
+You can choose to only display a vertical slice of the overall Gantt + chart by explicitly specifying a date range with the method + GanttGraph::SetDateRange(). This will cap any bars to only be displayed + in between the start and end date given as parameters. For example + specifying
+ $graph->
+SetDateRange(
+"2001-12-20",
+"2002-01-20");
+
will show the part of the Gantt chart between the 20 Dec 2001 and 20 + of January 2002. Please note that the format depends on the locale + setting.
+You can set the week start day with a call to + GanttScale::SetWeekStart(). This method takes an integer [0,6] as input + which represents the start day of the week, 0 means Sunday, 1 Monday, 2 + Tuesday and so on. The default is to start the week on Monday.
+Depending on your installation of PHP you might have support for + several locales. By default the locale is set up to use the default + locale on the server.
+To specifically set a locale you specify the wanted locale with a + locale string (ala standard PHP), for example American English is + specified with the string 'EN_US', British English with 'EN_UK' 'nl_NL' + for Dutch and so on. If your current installation does not support the + specified locale an error message will be given.
+ $graph
+->scale->SetDateLocale(
+"se_SE");
+
The result is displayed below.
+ +From version 1.2 JpGraph supports drawing of anti-aliased lines. + There are a few caveats in order to use this which is discussed in this + section.
+Anti-aliased lines are enabled by calling the method + SetAntiAliasing() in the + Image class in the script where you want to use anti-aliasing.
+The anti-aliasing for lines works by "smoothing" out the edges on + the line by using a progressive scale of colors interpolated between + the background color and the line color.
+An example will show that this, quite simple algorithm, gives a + reasonable good result. The figures below shows a radar plot with and + without anti-aliasing.
+ + + + +One thing you need to keep in mind when deciding to use + anti-aliasing is that it could have potentially a dramatic effect on + the time it takes to generate the image. Line drawing with + anti-aliasing turned on is roughly 8 times slower than the normal line + drawing so treat this feature wisely.
+Furthermore there are a couple of "gotchas" you should be aware of + when using anti-aliasing.
+JpGraph provide the possibility for you to rotate the generated + graph an arbitrary angle. This will only affect the actual graph (axis, + axis titles, labels and so on) and not fixed elements on the graph like + title or footer.
+Rotation is probably most used to rotate a graph 90 degrees, for + example a bar graph to get the effect of horizontal bars.
+ +Performance note: Adding a rotation transformation + will make the graph generation slightly slower since each point of the + graph as to go through a transformation step before being stroked on to + the image. JpGraph optimizes this by using a pre-calculated + transformation matric and also optimizes the special case 90 degrees.
+ +By default the center of the rotation will be the center of the plot + area, which may or may not coincide with the center of the entire + image.
+To control the rotation you use the two methods
+For example
+ $graph->image->SetAngle
+(45);
There is actually a third method that you could use, adding a + translation to the graph after the rotation. Since + this probably a very little used method we don't discuss it further but + refer the reader to the class reference instead + Graph:image::SetTranslation()
+ When you rotate an image you should be aware of that the individual
+ labels on the axis are not rotated. The design decision behind this is
+
a) Bit mapped font can't be rotated
+
b) Maintain readability
Please remember that you may still rotate the labels by calling the Axis::SetLabelAngle() + method.
+Since the anchor point for labels is by default the optimum for + graph at 0 degree you might want to adjust the anchor point and + alignment for the labels on the axis to get a better visual appearance + on you rotated graph. This is accomplished by the method + Axis::SetLabelAlign() For a detailed discussion on how to do this + please see the section on horizontal bar graphs, ( +Working with bar plots )
+The table below shows some examples on different kinds of rotation + to give you an idea of how changing the angle and rotation center may + be used to generate different effects. The top left graph is the + original image. The point of rotation has been marked with a red-cross + in each of the images.
+ + + + + + + +As you can see from the images above if you rotate about any other + point than the center of the plot area the plot can be placed outside + the image after rotation.
+Since the rotation, by design, only affects the plot area it is + often most effective to use when the color of the margin is the same as + the background color.
+The following section only applies to palette images. This + means it wont work on true-color images.
+It is often desirable to have a background image look a little bit + "washed" out so it doesn't take the concentration away from the actual + graph. There are basically two ways of accomplish this
+To adjust the background image call The levels for both brightness + and contrast are real numbers in the range [-1, 1] You can choose to + adjust for example just the background image or you might also choose + to adjust the whole image. To change the background image just use the + method + Graph::AdjBackgroundImage() to specify a suitable value. Let's show + some example on what we can do with this. The following example have + been generated by using the small utility "adjimg.php" which you can + find in the "utils/" directory.
+
+
Brightness=0, contrast=0, saturation = -1 (Original image)
+
Brightness=0, contrast=0, saturation = -1 (Black & White image)
+
Brightness=0.3, contrast=-0.3, saturation=0
+
Brightness=0.4, contrast=-0.7, saturation=0
+
Brightness=0.4, contrast=-0.7, saturation=-1
+
Brightness=0, contrast=0, saturation=1
During development and optimization it can be very handy to have the + actual time it took to generate the image as a footnote. The following + example shows the usage of this feature
+To enable this feature you can proceed in two ways.
+
+ $gJpgBrandTiming=true;
+
in the beginning of the script.
+If you like you might also change the way the timing is formatted by + setting the string defined by BRAND_TIMING_FORMAT (in jpgraph.php). + This string represents a standard printf() format string.
JpGraph has built-in support for over 200 country flags, i.e. they + are available to be used in graphs without any external image + definitions.
+Country flags can be used in primarily two settings
+In order to make it easy to find the appropriate country flags they + can be specified with either full or partial name or as an numeric + index. The routines in JpGraph are "smart" enough to figure out which + way you are trying to specify a particular flag.
+To specify a country flag as a marker you have to specify the + special mark type as one of MARK_FLAG1,MARK_FLAG2,MARK_FLAG3 or + MARK_FLAG4
+Flags are internally stored in 4 different sizes which is indicated + by the number in the mark types. Flags may also be arbitrary scaled + when displayed. Since this is partially overlapping functionality you + might very well ask why the flags are stored in four different basic + sizes. The reason is of course performance. It you only want a very + small flag it takes processing time to scale down a large image to, + say, a small icon size. At the same time for large flags to be used as + background a small original flag might not have enough details to be + scaled up to a large size. Hence the reason for storing the flags in 4 + different sizes.
+The example below shows how to use country flags as markers
+To use country flags as background one has to use the method + Graph::SetBackgroundCountryFlag(). With this method you can specify + both how much of the image should be filled as well as how much of the + flag should be mixed into the background.
+To see a list of all supported country flags you can run the script + "listallcountryflags.php" in the Example directory. This will show you + a table with all flags.
+In addition to the standard background image you can also add an + arbitrary number of icons onto the background of the graph. These icons + are created with a call to the special Plot class IconPlot.
+The image from icons are taken from a file or as one of the builtin + country flags.
+You may control how much of the icon should be blended into the + background by specifying a percentage (1-100). The example below shows + how to mix in the picture of "Tux" into the background of a filled line + graph. Note: This example uses alpha blending and will therefore + require GD2.
+To specify any of the roughly 200 country flags as an icon you first + create an empty Icon and then call the IconPlot::SetCountryFlag() with + the appropriate parameters. (See the class reference). This is + illustrated below by adding the Icelandic flag into the background as + an icon
+Canvas graphing is an advanced feature that comes in handy where you + need to draw some more arbitrary graphics. To give you a flavor of what + you can do the following example shows an architecture overview of + JpGraph which was drawn using a canvas.
+Working with canvas requires more understanding of JpGraph as well + as more programming and fine tuning.
+Canvas graph is really not a graph. It a blank sheet of paper which + you can use to draw arbitrary shapes and still have access to some of + the convenient features of JpGraph.
+You can work with a canvas in different levels of complexity. You + can for example work directly with the Image class which provides a + large number of primitives for drawing but requires that you use + absolute pixel coordinates.
+You can also make life a little bit easier by using a canvas scale. + This lets you define your own scale on the canvas which often makes it + easier by letting you work on a grid you have specified yourself. It + also makes it very easy to re-scale you image automatically by just + changing your scale. For example to half the size of you drawing you + just make the scale twice as large.
+To give you some help in working with different canvas you should + include the "jpgraph_canvtools.php" file when working on canvases. This + is not strictly necessary but it will give you some nice abstraction to + help you create your masterpieces.
+As another (concrete) example on the use of a canvas the figure + below is a listing of font styles available with JpGraph.
+ +In order to create a canvas graph you need to include the file + "jpgraph_canvas.php" in addition to the standard "jpgraph.php" file. + You might also want to include the "jpgraph_canvtools.php" to get + access to some supporting classes that may (or not) come in handy.
+Creating a canvas gives you the opportunity draw arbitrary shapes on + a "white" piece of paper. Let's first show a simple example were we + just draw a text box. We first show you the code which we will walk + through
<?php
+
+// $Id: canvasex01.php,v 1.3 2002/10/23 08:17:23 aditus Exp $
+
include
+"../jpgraph.php";
+
include "../jpgraph_canvas.php";
+
+
// Setup a basic canvas we can work
+
$g = new CanvasGraph(
+400,300,'auto'
+);
+
$g->SetMargin(
+5,11,6
+,11);
+
$g->SetShadow();
+
$g->SetMarginColor(
+"teal");
+
+
+// We need to stroke the plotarea and margin before we add the
+
// text since we otherwise would overwrite the text.
+
$g->InitFrame();
+
+
// Draw a text box in the middle
+
$txt="This\nis\na TEXT!!!";
+
$t = new Text(
+$txt,200,10
+);
+
$t->SetFont(
+FF_ARIAL,
+FS_BOLD,40);
+
+
+// How should the text box interpret the coordinates?
+
$t->Align(
+'center','top');
+
+
// How should the paragraph be aligned?
+
$t->ParagraphAlign(
+'center');
+
+
+// Add a box around the text, white fill, black border and gray shadow
+
$t->SetBox(
+"white",
+"black","gray");
+
+
// Stroke the text
+
$t->Stroke(
+$g->img);
+
+
// Stroke the graph
+
$g->Stroke();
+
+
?>
+
+
The example above starts by creating a (400x200) sized image. We set + the margins to get a nice frame around the image. For canvases the + margins has no effect in the way you enter coordinates. Top left is + (0,0) and bottom right (including any potential margin and shadow) is + the maximum. In this case the coordinates are X:0-399, and Y:0-199
+We then call the + InitFrame() method which actually strokes the margin and plotarea + to the graph. Since everything is stroked in the order you issue the + commands you must make sure that the graphical objects you want on top + is stroked last. This is different from the way you normally work with + JpGraph since it queues up all you addition and then makes sure they + are stroked in the correct order.
+We then create a Text object, + setup it's properties, including the absolute screen position where we + want the text, and then stroke it. Her it might be a need for a closer + explanation of the, perhaps misnamed, method +Text::Align() This method states how the text coordinates + should be interpreted , i.e when we specify (200,10) as the + coordinates for the text paragraph should that be interpreted as the + top left corner, bottom-left corner or something else (of the bounding + box)? In the code above we have chosen to interpret the X-coordinate as + being the center of the bounding box and the Y-coordinate as the top. + Hence the text will be aligned so that the (200,100) point in the graph + is aligned with the middle of the top line of the paragraphs bounding + box.
+We also specify that the lines within the paragraph should be + centered with a call to + Text::ParagraphAlign() Since we also choose to have a box around + the text we have to make use of the method + Text::SetBox() which is used to specify the fill color, the border + color and the shadow color (if you leave out shadow color or set it to + '', no shadow will be used).
+Now we are ready to stroke the text onto the canvas. In order to do + so we must specify the basic Image drawing class we want to use. + Without discussing this further we just state that a suitable image + class can always be found as the img property of the + Graph class.
+Finally we are ready to stroke the entire graph, which in effect + sends the canvas back to the browser. Below you can see the effect of + all this code
+ + +A canvas also makes a good background for using standard graphic + primitives, for example circles and lines. What you first have to + remember is that you are (so far) working with absolute screen + coordinates and secondly all drawing primitives are found in the + Image Class accessible as a property of the Graph class. So for + example to draw a line between coordinate (0,0) and (100,100) you would + have to add the line
+ $graph->img->
+Line(0,0
+,100,100);
+
To your code. The following example shows some of the graphic + primitives you have access to in the Image class
<?php
+
+// $Id: canvasex02.php,v 1.1 2002/08/27 20:08:57 aditus Exp $
+
include
+"../jpgraph.php";
+
include "../jpgraph_canvas.php";
+
+
// Setup a basic canvas we can work
+
$g = new CanvasGraph(
+400,200,'auto'
+);
+
$g->SetMargin(
+5,11,6
+,11);
+
$g->SetShadow();
+
$g->SetMarginColor(
+"teal");
+
+
+// We need to stroke the plotarea and margin before we add the
+
// text since we otherwise would overwrite the text.
+
$g->InitFrame();
+
+
// Add a black line
+
$g->img->
+SetColor(
+'black');
+
$g->img->
+Line(0,0
+,100,100);
+
+
// .. and a circle (x,y,diameter)
+
$g->img->
+Circle(100,100
+,50);
+
+
+// .. and a filled circle (x,y,diameter)
+
$g->img->
+SetColor('red');
+
$g->img->
+FilledCircle(
+200,100,50
+);
+
+
// .. add a rectangle
+
$g->img->
+SetColor(
+'green');
+
$g->img->
+FilledRectangle(
+10,10,50
+,50);
+
+
// .. add a filled rounded rectangle
+
$g->img->
+SetColor(
+'green');
+
$g->img->
+FilledRoundedRectangle(
+300,30,350
+,80,10);
+
// .. with a darker border
+
$g->img->
+SetColor(
+'darkgreen');
+
$g->img->
+RoundedRectangle(
+300,30,350
+,80,10);
+
+
// Stroke the graph
+
$g->Stroke();
+
+
?>
+
+
Pleas note the way to access these routines through the img property + of the Graph class. Please also keep in mind that the coordinates are + absolute.
+ + + +A note on GD For those of you using GD 1.xx you + might notice that the large "filled circle" isn't completely filled. + This is because in GD 1.xx there are no low level primitives to fill an + ellipse or circle so JpGraph tries to make the best out of a bad + situation and manually fake a filled circle. For interest of speed + JpGraph does not contain a complete (for example) Bresenham-circle fill + but cheats by using some existing GD routines. This is not a perfect + solution and for large filled circles like this you get some + moire-patterns in the circle. If you upgrade to GD 2.x JpGraph will be + able to make full use of those new existing methods and the fill will + be perfect.
+ +We refer you to the class reference to find out what other graphic + primitives are available for use.
+The previous method using absolute coordinates works. But nothing + more. It doesn't give you any chance to easily scale the image (unless + you manually recalculate all used coordinates) , it gets tedious to + work with pixel level resolution. Especially if you just like to draw a + few basic shapes.
+To help with this you can use a scale for the canvas. This lets you + define a "work-space" of your choice. You can for example set the + coordinates to be between X:0-10, Y:0-10. This makes it easier to + position objects on the canvas. This also has two additional + advantages:
+To use this type of scaling you must make sure you include the file + "jpgraph_canvtools.php" . In addition to the scaling class their are + also a couple of other utility classes that may come in handy, + especially the Shape class.
+Using the scale is quite simple. You first instantiate a scale + object passing the graph as a parameter and then specify the scale you + want to use. This means you need to add the lines
$scale
+= new CanvasScale
+($g);
+
$scale->Set(
+0,$xmax,0
+,$ymax);
to your code. You can then use one of the translation methods (for + example +CanvasScale::Translate()) in the canvas scale class to translate + between your world coordinates and the absolute screen coordinates. + This means you could take the code in the example above and just add + the lines, for example,
+ list(
+$x1,$y1) = $this
+->scale->Translate(
+$x1,$y1);
+
list($x2,$y2) =
+$this->scale->Translate
+($x2,$y2);
+
$g->img->
+Line($x1,$y1
+,$x2,$y2);
+
Since this pattern has to be repeated for every object that has to + be drawn it makes good sense to encapsulate this in a separate class. + This is exactly why the canvas tools file also have a utility class + called Shape This class is + mainly a wrapper around the most commonly used methods in the basic + Image class (with one important exception) and does all these the + translation for you. Please see the class reference for a complete list + of the available methods To set up the Shape class you instantiate it + with the graphic context and the scale you want to use as argument as + in
+
+ $shape = new
+Shape($g,$scale
+);
You are then ready to use all the methods in the shape class. Using + a scale and imitating the previous example we would get the source + shown below.
<?php
+
+// $Id: canvasex03.php,v 1.1 2002/08/27 20:08:57 aditus Exp $
+
include
+"../jpgraph.php";
+
include "../jpgraph_canvas.php";
+
include "../jpgraph_canvtools.php";
+
+
// Define work space
+
$xmax=20;
+
$ymax=20;
+
+
// Setup a basic canvas we can work
+
$g = new CanvasGraph(
+400,200,'auto'
+);
+
$g->SetMargin(
+5,11,6
+,11);
+
$g->SetShadow();
+
$g->SetMarginColor(
+"teal");
+
+
+// We need to stroke the plotarea and margin before we add the
+
// text since we otherwise would overwrite the text.
+
$g->InitFrame();
+
+
// Create a new scale
+
$scale
+= new CanvasScale
+($g);
+
$scale->Set(
+0,$xmax,0
+,$ymax);
+
+
+// The shape class is wrapper around the Imgae class which translates
+
// the coordinates for us
+
$shape
+= new Shape($g,
+$scale);
+
$shape->SetColor(
+'black');
+
+
+
// Add a black line
+
$shape->SetColor(
+'black');
+
$shape->Line(
+0,0,20
+,20);
+
+
// .. and a circle (x,y,diameter)
+
$shape->Circle(
+5,14,2
+);
+
+
+// .. and a filled circle (x,y,diameter)
+
$shape->SetColor(
+'red');
+
$shape->FilledCircle(
+11,8,3
+);
+
+
// .. add a rectangle
+
$shape->SetColor(
+'green');
+
$shape->FilledRectangle(15,
+8,19,14
+);
+
+
// .. add a filled rounded rectangle
+
$shape->SetColor(
+'green');
+
$shape->FilledRoundedRectangle(2,
+3,8,6
+);
+
// .. with a darker border
+
$shape->SetColor(
+'darkgreen');
+
$shape->RoundedRectangle(2,
+3,8,6
+);
+
+
+
// Stroke the graph
+
$g->Stroke();
+
+
?>
+
+
If we like to make a smaller image we could just change the image + size and everything will be rescaled without any further code changes. + SO for example making the image half the size would give the result
If we instead wanted to keep the image size but shrink the shapes we + could just make the scale twice as large which would result in
+ +We previously mentioned that the Shape class was a wrapper around + the image class with one exception. So what is the exception? Well, + glad you asked. The exception is that it contain an additional method + which draws an "indented rectangle". An indented rectangle is a + rectangle where one of it's four corners have been moved into the + rectangle. You create an indented rectangle by calling either + Shape::IndentedRectangle() or A few examples illustrates what this + shape looks like.
+ +As a final note we mention the class + CanvasRectangleText Which can be used to add a text with a rounded + rectangle (possibly filled) onto the canvas. The previous example where + all the available fonts were drawn were using this class. We don't + describe it further but refer the interested reader to the class + reference and the 'listfontsex1.php' example file.
+As a final example we shortly discuss how the canvas type of graph + was used to generate the DB schema for the DDDA architecture.
+The library php file "utils/misc/imgdbschema.php" included in the + distribution contains some utility classes to make the drawing of table + schemes easier. It contains two basic classes, Class ImgDBTable and + Class ImgDBSchema. The first class understand how to draw an image + illustrating a single table. The second class is responsible for + automatically extract all the relevant information from a DB to draw a + complete DB Schema.
+Before going into this a little bit more we show what an example of + this might look like.
Before going on it should be noted that the ImgDBSchema assumes that + the DB can be accessed through a DB abstraction layer modeled after the + abstraction layer available in the 'jpdb.php' file in the DDDA + architecture. This abstraction layer assumes a MySQL database in the + bottom. This specific dependency of this particular abstraction layer + is the reason why these classes is not included in the generic canvas + tools file.
+The second thing to note is that this library does not contain a + complete automatic-layout engine but rather a very simple automatic + system which, if nothing else is specified, just puts the table in a + rectangular grid. A complete graph layout engine would simple be to + much to write in this context. This is also a very difficult + optimization problem and sofar not even any of the available research + programs that tries this can achieve a satisfactory layout without + manual intervention.
+The critical lines in the code to generate the above graph is
$tblposadj=array($tlo
+,0,$tblwidth+
+$tlo+2,0
+,2*$tblwidth+
+$tlo+4,0
+,-1,16,-
+1,16);
+
$dbschema
+= new ImgDBSchema
+("jpgraph_doc"
+,"FormatTblName"
+,"FormatFldName"
+);
+
$dbschema
+->SetMargin($leftm,
+$topm);
+
$dbschema
+->SetTableWidth
+($tblwidth);
+
$dbschema
+->Stroke($this->
+img,$this->iscale
+,$tblposadj);
The rest of the code in the file is just to setup the canvas, add an + indented rectangle to group some tables and generate a footer with the + date and time this image was generated.
+The first line instantiates a new ImgDBSCheme layout engine asking + it to draw an image for the database 'jpgraph_doc'. The following two + arguments specify two callback functions for formatting the text for + header and each field in a table.
+The next line specify the top left margin where the drawing of the + tables should be started.
+The third line specify the width of a single table. The final lines + starts the engine and draws all tables in the database to the canvas. + The final argument requires some further explanation. This is an offset + (x,y) from the top left corner how each individual table should be + positioned. If the value is -1 indicates that the default value should + be used. If this array is not specified then the tables will simple + arranged line by line.
+The full source code for drawing this DB schema example is shown + below.
+ <?php
+
+/*=======================================================================
+
// File: DBSCHEMAEX1.PHP
+
// Description: Draw a DB schema of the DDDA architecture
+
// Created: 2002-08-25
+
// Author: Johan Persson (johanp@aditus.nu)
+
+// Ver: $Id: dbschemaex1.php,v 1.1 2002/08/27 20:08:57 aditus Exp $
+
//
+
// License: This code is released under QPL
+
// Copyright (C) 2001,2002 Johan Persson
+
+// Note: The actual drawing of the tables are semi-automatically
+
+// but you can easily adjust the individual tables position
+
// with the 'tblposadj' array.
+
//
+
+//========================================================================
+
*/
+
include
+"../jpgraph.php";
+
include "../jpgraph_canvas.php";
+
include "../jpgraph_canvtools.php";
+
include "../utils/misc/imgdbschema.inc";
+
include "../utils/jpdocgen/jpdb.php";
+
+
+
+// Global callback to format the table header names
+
function
+FormatTblName(
+$aName) {
+
+// We want to replace any specifi references to the
+
// 'JpGraph' project with the generic '<project>'
+
return
+str_replace(
+'JpGraph',
+'<project>',
+$aName);
+
}
+
+
+// Global callback to format each field name in the table
+
function
+FormatFldName(
+$aName,$aTable) {
+
return $aName
+;
+
}
+
+
+
class Driver
+{
+
+
var $ig
+, $img, $iscale,
+$ishape;
+
var $iymax
+,$ixmax;
+
var $iwidth
+,$iheight;
+
+
function Driver
+() {
+
+
+// Define Image size and coordinate grid space to work within
+
$this
+->iwidth = 600;
+
$this
+->iheight= 750;
+
$this
+->iymax = 50;
+
$this
+->ixmax = 55;
+
+
// Setup a basic canvas
+
$this
+->ig = new CanvasGraph(
+$this->iwidth,$this
+->iheight,'auto');
+
$this
+->img = $this->
+ig->img;
+
+
// Define the scale to be used
+
$this
+->iscale
+= new CanvasScale
+($this->ig);
+
$this
+->iscale->Set(
+0,$this->ixmax
+,0,$this->
+iymax);
+
$this
+->ishape
+= new Shape($this->
+ig,$this->iscale
+);
+
+
// A small frame around the canvas
+
$this
+->ig->SetMargin(
+2,3,2
+,3);
+
$this
+->ig->SetMarginColor(
+"teal");
+
$this
+->ig->InitFrame();
+
+
}
+
+
function Run
+() {
+
+
$leftm
+=1.5; // Left margin (for table schemes)
+
$topm=5;
+// Top margin (for table schemes)
+
$tblwidth
+=15; // Individual table width
+
$tlo=1;
+// Offset for top line
+
+
// Add the background color for the project specific tables
+
$this
+->ishape->IndentedRectangle($leftm,
+$topm-1,3
+*$tblwidth+$tlo+
+6,45,
+
$tlo
++2*$tblwidth+
+2,30,CORNER_BOTTOMLEFT,
+
'lightblue');
+
+
+// Stroke the tables (series of x,y offsets, If =-1 then use the
+
// automtic positioning
+
$tblposadj
+=array($tlo,0,
+$tblwidth+$tlo+2
+,0,2*
+$tblwidth+$tlo+4
+,
+
0
+,-1,16,-
+1,16);
+
$dbschema
+= new ImgDBSchema
+('jpgraph_doc'
+,'FormatTblName'
+,'FormatFldName'
+);
+
$dbschema
+->SetMargin($leftm,
+$topm);
+
$dbschema
+->SetTableWidth
+($tblwidth);
+
$dbschema
+->Stroke($this->
+img,$this->iscale
+,$tblposadj);
+
+
$tt
+= new CanvasRectangleText
+();
+
$tt->SetFillColor(
+'');
+
$tt->SetColor(
+'');
+
$tt->SetFontColor(
+'navy');
+
+
// Add explanation
+
$tt->SetFont(
+FF_ARIAL,
+FS_NORMAL,12);
+
$tt->Set(
+'Project specific tables',
+$tblwidth+
+$leftm+3,16
+,15);
+
$tt->Stroke(
+$this->img,$this
+->iscale);
+
+
// Add title
+
$tt->SetColor(
+'');
+
$tt->SetFont(
+FF_VERDANA,
+FS_BOLD,26);
+
$tt->Set(
+'DDDA - DB Schema',
+9,0.5,30
+);
+
$tt->Stroke(
+$this->img,$this
+->iscale);
+
+
// Add a version and date
+
$tt->SetFillColor(
+'yellow');
+
$tt->SetFont(
+FF_FONT1,
+FS_NORMAL,10);
+
$tt->Set(
+"Generated: ".
+date("ymd H:i",time
+()),1,$this->
+iymax*0.96,15
+);
+
$tt->Stroke(
+$this->img,$this
+->iscale);
+
+
$this
+->ig->Stroke();
+
}
+
}
+
+
$driver
+= new Driver
+();
+
$driver->Run();
+
+
?>
+
+
JpGraph includes a module to easily generate Anti-Spam challenges. + With this we mean an image consisting of numbers and letters which are + very hard to read for an OCR program. This is often used to secure sign + up for bulletin boards, on-line mail system or mailing lists since this + very effectively prevent automatic sign up by robots (spam-bots).
+The module in JpGraph responsible for this is + jpgraph_antispam.php and behaves as a simplified plot module.
+The example below illustrates how such an image can look like
+Anti spam images have less functionality then the usual images + generated with JpGraph in order to keep this utility reasonable small. + The primary limitation is that there are now additional formatting + options for the images and the image generated will always use the + JPEG image format. Hence it is not possible to change this to use, + for example, PNG.
+There are two basic alternatives on how to generate the content of + the anti-spam image
+In order to write a script to generate a new challenge there are + four steps to be completed.
+First include the library file jpgraph_antispam.php. + Note that there is no need to include the "jpgraph.php" library since + all functionality is included in this library file.
+require_once "jpgraph_antispam.php";
Secondly a new instance of the class AntiSpam must be + created
+ $spam = new
+AntiSpam();
+
Thirdly the string to be used in the challenge must be + specified. To automatically generate a suitable string use
+// The argument determines the length of the generated string
+
$chars = $spam->
+Rand(5);
If instead the string to be used should be specified this string + should be specified in the initial creation of the AntiSpam() or by + calling the Set() method as in
+ $spam->
+Set("aui8k");
Please note that in order to minimize the risk for confusion the + letters 'O' and the number '0' (zero) is not allowed since they are too + alike and can be mistaken for each other.
+The final and fourth step is to output the image with a call + the method Stroke() on the created instance of the AntiSpam + class.
+ if( $spam->Stroke
+() === false
+) {
+
die("Illegal or no data to plot");
+
}
Note that we have put a guard around the output since in the case of + an error this method will result a boolean false value. As with the + other graph types it is possible to write the generated image to a file + by submitting a file name as an argument to Stroke().
+Various settings in JpGraph are controlled by overall DEFINEs in the + configuration file "jpg-config.inc". Most of these defines have default + values that should be valid for most usage.
+In the rest of this chapter all constants are described with default + value and usage.
+ +Define, default value | Comment |
---|---|
"CACHE_DIR", "/tmp/jpgraph_cache/" | The full + absolute name of directory to be used as a cache. This directory + must be readable and writable for PHP. Must end with '/' |
"TTF_DIR", "/usr/local/fonts/ttf/" | +Directory for JpGraph TTF fonts. Must end with '/' The fonts must follow + the naming conventions as used by the supplied TTF fonts in JpGraph. | +
"CSIMCACHE_DIR", "csimcache/" | Directory for + cache directory for CSIM graphs. Must end with '/' Cache directory + specification for use with CSIM graphs that are using the cache. The + directory must be the filesystem name as seen by PHP and the 'http' + version must be the same directory but as seen by the HTTP server + relative to the 'htdocs' directory. If a relative path is specified it + is taken to be relative from where the image script is executed. Note: + The default setting is to create a subdirectory in the directory from + where the image script is executed and store all files there. As usual + this directory must be writable by the PHP process. |
"CSIMCACHE_HTTP_DIR", "csimcache" | Directory + for JpGraph TTF fonts. Must end with '/' Cache directory specification + for use with CSIM graphs that are using the cache. The directory must + be the filesystem name as seen by PHP and the 'http' version must be + the same directory but as seen by the HTTP server relative to the + 'htdocs' directory. If a relative path is specified it is taken to be + relative from where the image script is executed. Note: The default + setting is to create a subdirectory in the directory from where the + image script is executed and store all files there. As usual this + directory must be writable by the PHP process. |
"CHINESE_TTF_FONT", "bkai00mp.ttf" | Actual + name of the TTF file used together with FF_CHINESE aka FF_BIG5 This is + the TTF file being used when the font family is specified as either + FF_CHINESE or FF_BIG5 |
"LANGUAGE_CYRILLIC", false | Special unicode + Cyrillic language support. |
"CYRILLIC_FROM_WINDOWS", false | If you are + setting this config to true the conversion will assume that the input + text is windows 1251, if false it will assume koi8-r |
'MINCHO_TTF_FONT', 'ipam.ttf' | Japanese + TrueType font used with FF_MINCHO |
'PMINCHO_TTF_FONT', 'ipamp.ttf' | Japanese + TrueType font used with FF_PMINCHO |
'GOTHIC_TTF_FONT', 'ipag.ttf' | Japanese + TrueType font used with FF_GOTHIC |
'PGOTHIC_TTF_FONT', 'ipagp.ttf' | Japanese + TrueType font used with FF_PGOTHIC |
"INSTALL_PHP_ERR_HANDLER", false | Determine + if the library should also setup the default PHP error handler to + generate a graphic error message. This is useful during development to + be able to see the error message as an image instead as a "red-cross" + in a page where an image is expected. |
"CATCH_PHPERRMSG", true | Should the library + examine the global php_errmsg string and convert any error in it to a + graphical representation. This is handy for the occasions when, for + example, header files cannot be found and this results in the graph not + being created and just a "red-cross" image would be seen. This should + be turned off for a production site. |
"USE_LIBRARY_GD2",false | Specify if we + should use GD 2.x or GD 1.x If you have GD 2.x installed it is + recommended that you use it since it will give a slightly, slightly + better visual appearance for arcs. If you don't have GD2 installed this + must be set to false! |
'USE_TRUECOLOR',true | Should the image be a + truecolor image? Note 1: Can only be used with GD 2.0.2 and above. Note + 2: GD 2.0.1 + PHP 4.0.6 on Win32 crashes when trying to use truecolor. + Truecolor support is to be considered alpha since GD 2.x is still not + considered stable (especially on Win32). Note 3: MUST be enabled to get + background images working with GD2 Note 4: If enabled then truetype + fonts will look very ugly => You can't have both background images and + truetype fonts in the same image until these bugs has been fixed in GD + 2.01 |
"USE_CACHE",false | Should the cache be used + at all? By setting this to false no files will be generated in the + cache directory. The difference from READ_CACHE being that setting + READ_CACHE to false will still create the image in the cache directory + just not use it. By setting USE_CACHE=false no files will even be + generated in the cache directory. |
"READ_CACHE",true | Should we try to find an + image in the cache before generating it? Set this define to false to + bypass the reading of the cache and always regenerate the image. Note + that even if reading the cache is disabled the cached will still be + updated with the newly generated image. Set also "USE_CACHE" below. | +
"DEFAULT_GFORMAT","auto" | Default graphic + format set to "auto" which will automatically choose the best available + format in the order png,gif,jpg (The supported format depends on what + your PHP installation supports) |
"USE_IMAGE_ERROR_HANDLER",true | Determine + if the error handler should be image based or purely text based. Image + based makes it easier since the script will always return an image even + in case of errors. |
"USE_APPROX_COLORS",true | If the color + palette is full should JpGraph try to allocate the closest match? If + you plan on using background image or gradient fills it might be a good + idea to enable this. If not you will otherwise get an error saying that + the color palette is exhausted. The drawback of using approximations is + that the colors might not be exactly what you specified. Note1: This + does only apply to a palette image, not true color images since they + don't have the limitations of maximum number of colors. |
"ERR_DEPRECATED",false | Should usage of + deprecated functions and parameters give a fatal error? (Useful to + check if code is future proof.) |
"BRAND_TIMING",false | Should the time taken + to generate each picture be branded to the lower left in corner in each + generated image? Useful for performance measurements generating graphs | +
"BRAND_TIME_FORMAT","Generated in: %01.3fs" | +What format should be used for the timing string? |
The following defines should very rarely need to be changed
+ +Define, default value | Comment |
---|---|
"CACHE_FILE_GROUP","wwwadmin" | What group + should the cached file belong to (Set to "" will give the default group + for the "PHP-user") Please note that the Apache user must be a member + of the specified group since otherwise it is impossible for Apache to + set the specified group. |
"CACHE_FILE_MOD",0664 | What permissions + should the cached file have (Set to "" will give the default + permissions for the "PHP-user") |
"USE_BRESENHAM",false | Decide if we should + use the Bresenham circle algorithm or the built in Arc(). Bresenham + gives better visual appearance of circles but is more CPU intensive and + slower then the built in Arc() function in GD. Turned off by default + for speed |
"_CSIM_SPECIALFILE","_csim_special_" | +Special file name to indicate that we only want to calc the image map in + the call to Graph::Stroke() used internally from the GetHTMLCSIM() + method. |
"_CSIM_DISPLAY","_jpg_csimd" | HTTP GET + argument that is used with image map to indicate to the script to just + generate the image and not the full CSIM HTML page. |
+
 
+
+
+ ![]() |
+
+ ![]() JpGraph Manual |
+
+
+ ![]() Class Reference + |
+
+
+
+
+
+[ +HowTo +| + FAQ +| +JpGraph Site +| +JpGraph Forum +] + |
AccBarPlot | BarPlot |
AccBarPlot() + Max() + Min() + |
+Features: +
+Examples: +
+
+
+ +
Argument | Default | Description |
---|---|---|
+$plots + + | Array of bar plots |
Example
+
+
+
+
Example
+
+
+
+
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/AccLinePlot.html b/html/includes/jpgraph/docs/ref/AccLinePlot.html new file mode 100644 index 0000000000..7674b1d575 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/AccLinePlot.html @@ -0,0 +1,90 @@ +
AccLinePlot | Plot |
AccLinePlot() + Max() + Min() + SetInterpolateMode() + |
+Features: +
+
+
+ +
Argument | Default | Description |
---|---|---|
+$plots + + | Array of line plots to use |
Example
+
+
+
+
Example
+
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aIntMode + + | TRUE=Enable interpolation |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/AntiSpam.html b/html/includes/jpgraph/docs/ref/AntiSpam.html new file mode 100644 index 0000000000..ca48212ba3 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/AntiSpam.html @@ -0,0 +1,100 @@ +
AntiSpam |
AntiSpam() + Rand() + Set() + Stroke() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aData + + | +'' + | Data to be displayed |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aLen + + | Sets the length of the generated string |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aData + + | Spam challenge |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStrokeFileName + + | +"" + | An optional file name |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/Axis.html b/html/includes/jpgraph/docs/ref/Axis.html new file mode 100644 index 0000000000..060d03d0e1 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/Axis.html @@ -0,0 +1,881 @@ +
Name | Type | Description |
---|---|---|
title | Text | Axis title text |
scale | LinearScale/LogScale | Scale used for axis |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aHide + + | +true + | Flag. |
Example
+
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aShow + + | +false + | Flag. |
+This is probably of less use for the end user of the library.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aHide + + | +true + | true=Hide all labels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aShow + + | +false + | Flag |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aHide + + | +true + | True=Hide axis line |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aHideMinor + + | +true + | True = Hide minor tick marks |
+$aHideMajor + + | +true + | True = Hide major tick marks |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlag + + | +true + | Flag. |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color for axis | |
+$aLabelColor + + | +false + | Color for labels on axis |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFamily + + | Font family | |
+$aStyle + + | +FS_NORMAL + | Font style |
+$aSize + + | +10 + | Font size |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aHAlign + + | Horizontal alignment | |
+$aVAlign + + | +"top" + | Vertical alignment |
+$aParagraphAlign + + | +'left' + | paragraph align for multi-line texts |
+Note that this is handled automatically but on some occasion there is a genuine need to override the automtic values. For example if the graph is rotated it might be necessary to adjust the alignment to get a visual acceptable label alignment. +
+Possible horizontal alignment are: 'left', 'center', 'right'
+Possible vertical alignment are: 'top', 'center', 'bottom'
+
+See horizbarex1.php, horizbarex2.php for real life examples.
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aAngle + + | Angle in degrees |
+Note:
+If you want to use any angles other than 0 and 90 degrees you must make sure that the labels are using TTF fonts. Internal fonts only support vertical and horizontal angles.
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFormStr + + | Format string |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFuncName + + | Callback function |
+The callback routine is called with one argument, the current number to be displayed and should return the number to be displayed. +
+For simple formatting use SetlabelFormat() to specify a printf() style formatting string. +
+The callback function specified should can either be a +global function or a class method, for example + +
+$SomeClass = new SomeClass(...); +... +$g->SetXLabelFormatCallback(array($SomeClass,'xLabelCallback')); ++
+There is, however, one caution. Any $this data used within LabelFormatCallbackInDerivedClass MUST BE SET BEFORE SetLabelFormatCallback is invoked! it appears that $this is bound/copied when SetLabelFormatCallback is invoked. Only $this data defined at that time is available within the callback function! Likewise, modifications to $this data AFTER SetLabelFormatCallback have no effect since the $this object used by the callback function has already been bound/copied. +
+The same issues obtain when the callback function is in a seperate class! +
+For a full example see barscalecallbackex1.php
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFormStr + + | Format string | |
+$aDate + + | +false + | No description available |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMargin + + | Margin in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aSidePos + + | Position |
+See topaxisex1.php for an example when this is usefull. +
+Note: Synonym to SetLabelSide()
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aSidePos + + | Which side of the axis the labels should be on |
+See topaxisex1.php for an example when this is usefull. +
+Note: Synonym to SetLabelPos()
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMajPos + + | No description available | |
+$aLabels + + | +NULL + | No description available |
+
+ +
Argument | Default | Description |
---|---|---|
+$aPosOnOtherScale + + | Position in world-coordinate |
+See topaxisex1.php for a real life example.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aDelta + + | Delta in pixels |
+
+ +
Argument | Default | Description |
---|---|---|
+$aStep + + | Intervall | |
+$aStart + + | +0 + | No description available |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStep + + | Intervall between ticks | |
+$aStart + + | +0 + | Start tick |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$step + + | Intervall | |
+$start + + | +0 + | Start |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aDir + + | Direction |
+This is a shortform for accessing the tick method directly via the scale in the axis. +
+See topaxisex1.php for real life example.
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMargin + + | Margin in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aLabelArray + + | Array with labels | |
+$aLabelColorArray + + | +null + | Individual colors for each label |
+If fewer labels than data points are specified then the missing labels will be set to the data points ordinal numbers. +
+The color argment is an array that can be used to specify individual colors for each of the labels. If fewer colors than labels are specified then the colors will wrap around.
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMajPos + + | No description available | |
+$aMinPos + + | +NULL + | No description available |
+$aLabels + + | +NULL + | No description available |
+
+ +
Argument | Default | Description |
---|---|---|
+$aDir + + | Specify side |
+This is a shortform for accessing the tick method directly via the scale in the axis. +
+See topaxisex1.php for real life example.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aTitle + + | Title string | |
+$aAdjustAlign + + | +"high" + | Alignment of title along the axis |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMargin + + | Margin in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aSideOfAxis + + | Side |
+By default x-axis have the title below the axis and y-axis have it on the left and y2 on the right. +
+See topaxisex1.php for real life example
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWeight + + | Weight in pixels |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/BarPlot.html b/html/includes/jpgraph/docs/ref/BarPlot.html new file mode 100644 index 0000000000..281fcfb9e1 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/BarPlot.html @@ -0,0 +1,354 @@ +
BarPlot | Plot |
BarPlot() + SetAbsWidth() + SetAlign() + SetFillColor() + SetFillGradient() + SetNoFill() + SetPattern() + SetShadow() + SetValuePos() + SetWidth() + SetYBase() + SetYMin() + |
+To show horizontal plots you can rotate the graph 90 degrees by $graph->Angle(90); +
+
+
+ +
Argument | Default | Description |
---|---|---|
+&$datay + + | Data serie | |
+$datax + + | +false + | X-positions |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWidth + + | Width in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aAlign + + | String to specify alignment |
+Default is to center the bars.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color specification |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFromColor + + | No description available | |
+$aToColor + + | +null + | No description available |
+$aStyle + + | +null + | No description available |
+You should also be observant that gradient fills makes use of more CPU time than solid fills.
+
+
Example
+
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aPattern + + | Pattern | |
+$aColor + + | +'black' + | Color of pattern |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$color + + | +"black" + | Shadow color |
+$hsize + + | +3 + | Horizontal size in pixels |
+$vsize + + | +3 + | Vertical size in pixels |
+$show + + | +true + | TRUE=Display shadow |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aPos + + | Postision |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWidth + + | No description available |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aYStartValue + + | Strta Y-value for bars. |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aYStartValue + + | Y-Value for base of bars |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/Bezier.html b/html/includes/jpgraph/docs/ref/Bezier.html new file mode 100644 index 0000000000..77c56e3434 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/Bezier.html @@ -0,0 +1,91 @@ +
Bezier |
Bezier() + Get() + |
+This class doesn't draw any graphs by itself it is only used to generate a new set of data points representing the smooth line from the input which are the control lines for a bezier interpolated curve. +
+The principle of using this class is that you first create an instance of this class and giving it the X,Y values for your control points. +
+You can then get back an interpolated smooth dataset by calling the Get() method. This method takeas as argument how many data points you want the interpolated graph to have. +
+In order to use this method the file jpgraph_regstat.php must be included. +
+Technical note: The control points for a bezier curve does not necessary lie on the curve. Using the alternative method of spline interpolation guarantees that the specified control point lie on the generated curve. +
+Technical note 2: An alternmative Bezier curve is also availabe in the Canvas tools (jpgraph_canvtools.php). The difference is that that method will not return any data points it will directly draw an interpolate bezier curve on the canvas. +
+
+
+ +
Argument | Default | Description |
---|---|---|
+$datax + + | X-coordinates for control points | |
+$datay + + | Y-coordinates for control points | |
+$attraction_factor + + | Attraction factor | |
+ + + | No description available | |
+ + + | +1 + | No description available |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$steps + + | Number of data points |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/BoxPlot.html b/html/includes/jpgraph/docs/ref/BoxPlot.html new file mode 100644 index 0000000000..f1bf939f22 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/BoxPlot.html @@ -0,0 +1,68 @@ +
BoxPlot | StockPlot |
BoxPlot() + SetMedianColor() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$datay + + | Y-tuples | |
+$datax + + | +false + | If specified, X-positions |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aPos + + | Positive color | |
+$aNeg + + | Negative color |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/CanvasGraph.html b/html/includes/jpgraph/docs/ref/CanvasGraph.html new file mode 100644 index 0000000000..42b95dfac0 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/CanvasGraph.html @@ -0,0 +1,103 @@ +
CanvasGraph | Graph |
CanvasGraph() + InitFrame() + Stroke() + |
+The canvas is meant to be manipulated through the Image class which can be found as an instance variable ($graph->img) in the canvas class. +
+Please remeber taht using the drawing methods in the Image class assumes screen (pixels) coordinates. +
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aWidth + + | +300 + | Width of graph |
+$aHeight + + | +200 + | Height of graph |
+$aCachedName + + | +"" + | Cache file name |
+$timeout + + | +0 + | Cache timeout |
+$inline + + | +1 + | Inline or not |
Example
+
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStrokeFileName + + | +"" + | Filename to stroke to |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/CanvasRectangleText.html b/html/includes/jpgraph/docs/ref/CanvasRectangleText.html new file mode 100644 index 0000000000..87da93e116 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/CanvasRectangleText.html @@ -0,0 +1,432 @@ +
+The text may also be enclosed in a rounded (possibly filled) rectangle. +
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aTxt + + | +'' + | Text |
+$xl + + | +0 + | Top left X |
+$yt + + | +0 + | Top left Y |
+$w + + | +0 + | Width |
+$h + + | +0 + | Height |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aParaAlign + + | Alignment |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$xl + + | +0 + | Top left X |
+$yt + + | +0 + | Top left Y |
+$w + + | +0 + | Width |
+$h + + | +0 + | Height |
+
+ +
Argument | Default | Description |
---|---|---|
+$aTxt + + | Text | |
+$xl + + | Top left X | |
+$yt + + | Top left Y | |
+$w + + | +0 + | Width |
+$h + + | +0 + | Height |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMargin + + | Margin in pixels |
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Border color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRad + + | +5 + | Radius in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFillColor + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$FontFam + + | Font family | |
+$aFontStyle + + | Font style | |
+$aFontSize + + | +12 + | Font size |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color specification |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$xl + + | +0 + | Top left X |
+$yt + + | +0 + | Top left Y |
+$w + + | +0 + | Width |
+$h + + | +0 + | Height |
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | +'gray' + | Color of shadow |
+$aWidth + + | +3 + | Width of shadow |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aTxt + + | Textt |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aImg + + | Image context | |
+$scale + + | Scale |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/CanvasScale.html b/html/includes/jpgraph/docs/ref/CanvasScale.html new file mode 100644 index 0000000000..0c6493db81 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/CanvasScale.html @@ -0,0 +1,161 @@ +
CanvasScale |
CanvasScale() + Set() + Translate() + TranslateX() + TranslateY() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+&$graph + + | Canvas graph | |
+$xmin + + | +0 + | Min X-value for scale |
+$xmax + + | +10 + | Max X-value for scale |
+$ymin + + | +0 + | Min Y-value for scale |
+$ymax + + | +10 + | Max Y-value for scale |
+
+ +
Argument | Default | Description |
---|---|---|
+$xmin + + | +0 + | Min X value |
+$xmax + + | +10 + | Max X-value |
+$ymin + + | +0 + | Min Y-value |
+$ymax + + | +10 + | Max Y-value |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$x + + | X-value | |
+$y + + | Y-value |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$x + + | X-value |
+
+ +
Argument | Default | Description |
---|---|---|
+$y + + | Y-value |
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/DateLocale.html b/html/includes/jpgraph/docs/ref/DateLocale.html new file mode 100644 index 0000000000..af81422002 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/DateLocale.html @@ -0,0 +1,543 @@ +
DateLocale |
DateLocale() + GetDayAbb() + GetLongMonthName() + GetMonth() + GetShortDay() + GetShortMonth() + GetShortMonthName() + Set() + |
+To help with this JpGraph instantiates the global variable $gDateLocale which can be used to access the methods. +
+A quick example could be to for example get hold of the shortform of the names of the month to use as labels. By default this is set to the dafult locale for the installation. +
+// Get localized array of short form of month names +$months = $gDateLocale->GetShortMonth();
+
+
+
+
+
Example
+
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aNbr + + | Number of month [0-11] |
Example
+
+
+
+
Example
+
+
+
+
Example
+
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aNbr + + | Number of month [0-11] |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aLocale + + | Locale |
af_ZA | +ar_AE | +ar_AE.utf8 | +||
ar_BH | +ar_BH | +ar_BH.utf8 | +ar_DZ | +ar_DZ.utf8 | +
ar_EG | +ar_EG | +ar_EG.utf8 | +ar_IN | +ar_IQ | +
ar_IQ.utf8 | +ar_IQ.utf8 | +ar_JO | +ar_JO.utf8 | +ar_KW | +
ar_KW.utf8 | +ar_KW.utf8 | +ar_LB | +ar_LB.utf8 | +ar_LY | +
ar_LY.utf8 | +ar_LY.utf8 | +ar_MA | +ar_MA.utf8 | +ar_OM | +
ar_OM.utf8 | +ar_OM.utf8 | +ar_QA | +ar_QA.utf8 | +ar_SA | +
ar_SA.utf8 | +ar_SA.utf8 | +ar_SD | +ar_SD.utf8 | +ar_SY | +
ar_SY.utf8 | +ar_SY.utf8 | +ar_TN | +ar_TN.utf8 | +ar_YE | +
ar_YE.utf8 | +ar_YE.utf8 | +be_BY | +be_BY.utf8 | +bg_BG | +
bg_BG.utf8 | +bg_BG.utf8 | +bokmal | +bokm?l | +br_FR | +
bs_BA | +bs_BA | +ca_ES | +ca_ES.utf8 | +ca_ES@euro | +
catalan | +catalan | +croatian | +cs_CZ | +cs_CZ.utf8 | +
cy_GB | +cy_GB | +czech | +da_DK | +da_DK.utf8 | +
danish | +danish | +dansk | +de_AT | +de_AT.utf8 | +
de_AT@euro | +de_AT@euro | +de_BE | +de_BE@euro | +de_CH | +
de_CH.utf8 | +de_CH.utf8 | +de_DE | +de_DE.utf8 | +de_DE@euro | +
de_LU | +de_LU | +de_LU.utf8 | +de_LU@euro | +deutsch | +
dutch | +dutch | +eesti | +el_GR | +el_GR.utf8 | +
en_AU | +en_AU | +en_AU.utf8 | +en_BE | +en_BE.utf8 | +
en_BE@euro | +en_BE@euro | +en_BW | +en_CA | +en_CA.utf8 | +
en_DK | +en_DK | +en_GB | +en_GB.utf8 | +en_HK | +
en_IE | +en_IE | +en_IE.utf8 | +en_IE@euro | +en_IN | +
en_NZ | +en_NZ | +en_NZ.utf8 | +en_PH | +en_SG | +
en_US | +en_US | +en_US.utf8 | +en_ZA | +en_ZA.utf8 | +
en_ZW | +en_ZW | +es_AR | +es_AR.utf8 | +es_BO | +
es_BO.utf8 | +es_BO.utf8 | +es_CL | +es_CL.utf8 | +es_CO | +
es_CO.utf8 | +es_CO.utf8 | +es_CR | +es_CR.utf8 | +es_DO | +
es_DO.utf8 | +es_DO.utf8 | +es_EC | +es_EC.utf8 | +es_ES | +
es_ES.utf8 | +es_ES.utf8 | +es_ES@euro | +es_GT | +es_GT.utf8 | +
es_HN | +es_HN | +es_HN.utf8 | +es_MX | +es_MX.utf8 | +
es_NI | +es_NI | +es_NI.utf8 | +es_PA | +es_PA.utf8 | +
es_PE | +es_PE | +es_PE.utf8 | +es_PR | +es_PR.utf8 | +
es_PY | +es_PY | +es_PY.utf8 | +es_SV | +es_SV.utf8 | +
es_US | +es_US | +es_UY | +es_UY.utf8 | +es_VE | +
es_VE.utf8 | +es_VE.utf8 | +estonian | +et_EE | +et_EE.utf8 | +
eu_ES | +eu_ES | +eu_ES@euro | +fa_IR.utf8 | +fi_FI | +
fi_FI.utf8 | +fi_FI.utf8 | +fi_FI@euro | +finnish | +fo_FO | +
fo_FO.utf8 | +fo_FO.utf8 | +fr_BE | +fr_BE.utf8 | +fr_BE@euro | +
fr_CA | +fr_CA | +fr_CA.utf8 | +fr_CH | +fr_CH.utf8 | +
fr_FR | +fr_FR | +fr_FR.utf8 | +fr_FR@euro | +fr_LU | +
fr_LU.utf8 | +fr_LU.utf8 | +fr_LU@euro | +fran?ais | +french | +
ga_IE | +ga_IE | +ga_IE.utf8 | +ga_IE@euro | +galego | +
galician | +galician | +german | +gl_ES | +gl_ES.utf8 | +
gl_ES@euro | +gl_ES@euro | +greek | +gv_GB | +he_IL | +
he_IL.utf8 | +he_IL.utf8 | +hebrew | +hi_IN.utf8 | +hr_HR | +
hr_HR.utf8 | +hr_HR.utf8 | +hrvatski | +hu_HU | +hu_HU.utf8 | +
hungarian | +hungarian | +icelandic | +id_ID | +id_ID.utf8 | +
is_IS | +is_IS | +is_IS.utf8 | +it_CH | +it_CH.utf8 | +
it_IT | +it_IT | +it_IT.utf8 | +it_IT@euro | +italian | +
iw_IL | +iw_IL | +ja_JP | +ja_JP.eucjp | +ja_JP.sjis | +
ja_JP.ujis | +ja_JP.ujis | +ja_JP.utf8 | +japanese | +japanese.euc | +
japanese.sjis | +japanese.sjis | +ka_GE | +kl_GL | +kl_GL.utf8 | +
ko_KR | +ko_KR | +ko_KR.euckr | +ko_KR.utf8 | +korean | +
korean.euc | +korean.euc | +kw_GB | +lithuanian | +lt_LT | +
lt_LT.utf8 | +lt_LT.utf8 | +lv_LV | +lv_LV.utf8 | +mi_NZ | +
mk_MK | +mk_MK | +mk_MK.utf8 | +mr_IN.utf8 | +ms_MY | +
mt_MT | +mt_MT | +nb_NO | +nb_NO.ISO-8859-1 | +nl_BE | +
nl_BE.utf8 | +nl_BE.utf8 | +nl_BE@euro | +nl_NL | +nl_NL.utf8 | +
nl_NL@euro | +nl_NL@euro | +nn_NO | +no_NO | +no_NO.utf8 | +
norwegian | +norwegian | +nynorsk | +oc_FR | +pl_PL | +
pl_PL.utf8 | +pl_PL.utf8 | +polish | +portuguese | +pt_BR | +
pt_BR.utf8 | +pt_BR.utf8 | +pt_PT | +pt_PT.utf8 | +pt_PT@euro | +
ro_RO | +ro_RO | +ro_RO.utf8 | +romanian | +ru_RU | +
ru_RU.koi8r | +ru_RU.koi8r | +ru_RU.utf8 | +ru_UA | +russian | +
sh_YU | +sh_YU | +sh_YU.utf8 | +sk_SK | +sk_SK.utf8 | +
sl_SI | +sl_SI | +sl_SI.utf8 | +slovak | +slovene | +
slovenian | +slovenian | +spanish | +sq_AL | +sq_AL.utf8 | +
sr_YU | +sr_YU | +sr_YU.utf8 | +sr_YU@cyrillic | +sv_FI | +
sv_FI.utf8 | +sv_FI.utf8 | +sv_FI@euro | +sv_SE | +sv_SE.utf8 | +
swedish | +swedish | +ta_IN | +te_IN | +tg_TJ | +
th_TH | +th_TH | +th_TH.utf8 | +thai | +tl_PH | +
tr_TR | +tr_TR | +tr_TR.utf8 | +turkish | +uk_UA | +
uk_UA.utf8 | +uk_UA.utf8 | +ur_PK | +uz_UZ | +vi_VN | +
vi_VN.utf8 | +vi_VN.utf8 | +yi_US | +zh_CN | +zh_CN.gb18030 | +
zh_CN.gbk | +zh_CN.gbk | +zh_CN.utf8 | +zh_HK | +zh_HK.utf8 | +
zh_TW | +zh_TW | +zh_TW.euctw | +zh_TW.utf8 | +
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/DateScale.html b/html/includes/jpgraph/docs/ref/DateScale.html new file mode 100644 index 0000000000..4fefe8bef6 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/DateScale.html @@ -0,0 +1,154 @@ +
DateScale | LinearScale |
AdjustForDST() + SetDateAlign() + SetDateFormat() + SetTimeAlign() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlg + + | +true + | No description available |
+
+ +
Argument | Default | Description |
---|---|---|
+$aStartAlign + + | Start alignment | |
+$aEndAlign + + | +false + | End alignment |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFormat + + | No description available |
+
+ +
Argument | Default | Description |
---|---|---|
+$aStartAlign + + | Start time alignment | |
+$aEndAlign + + | +false + | End time alignment |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/DigitalLED74.html b/html/includes/jpgraph/docs/ref/DigitalLED74.html new file mode 100644 index 0000000000..0fc4dca2e5 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/DigitalLED74.html @@ -0,0 +1,88 @@ +
DigitalLED74 |
DigitalLED74() + SetSupersampling() + StrokeNumber() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aRadius + + | Radius in pixel for each "led" | |
+$aMargin + + | Margin around the "led" |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aSuperSampling + + | Level of supersampling |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aValStr + + | No description available | |
+$aColor + + | +0 + | No description available |
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/DisplayValue.html b/html/includes/jpgraph/docs/ref/DisplayValue.html new file mode 100644 index 0000000000..d5131b5413 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/DisplayValue.html @@ -0,0 +1,251 @@ +
DisplayValue |
HideZero() + SetAlign() + SetAngle() + SetColor() + SetFont() + SetFormat() + SetFormatCallback() + SetMargin() + Show() + |
+This class should never be used directly instead this is an internal class which is accessed through it's instance variable, for example, +
+ +$lineplot = new LinePlot($datay); +// Access the instance of DisplayValue +$lineplot->value->Show();
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlag + + | +true + | True=Hide zero values |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aHAlign + + | Horizontal alignment | |
+$aVAlign + + | +'' + | Vertical alignment |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aAngle + + | Angle in degrees |
+Please rememberthat you must use TTF fonts if you need any angle other than 0 or 90 degrees (horizontal or vertical)
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color for positive values | |
+$aNegcolor + + | +"" + | Color for negative values |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFontFamily + + | Font family | |
+$aFontStyle + + | +FS_NORMAL + | Font style |
+$aFontSize + + | +10 + | Font size |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFormat + + | Format for positive values | |
+$aNegFormat + + | +"" + | Format for negative values |
+Please remember that if you want to format a number with a '%' sign you must use double '%%' as escape format, e.g. '%01.2.f%%' will format a number with two decimal places and a following '%' sign.
+
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFunc + + | Name of callback function |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMargin + + | Margin in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlag + + | +true + | True=show value |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/ErrMsgText.html b/html/includes/jpgraph/docs/ref/ErrMsgText.html new file mode 100644 index 0000000000..363877251d --- /dev/null +++ b/html/includes/jpgraph/docs/ref/ErrMsgText.html @@ -0,0 +1,10 @@ +
ErrMsgText |
+
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/ErrorLinePlot.html b/html/includes/jpgraph/docs/ref/ErrorLinePlot.html new file mode 100644 index 0000000000..8e7ec9b574 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/ErrorLinePlot.html @@ -0,0 +1,41 @@ +
ErrorLinePlot | ErrorPlot |
ErrorLinePlot() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+&$datay + + | Y-data values | |
+$datax + + | +false + | X-data value |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/ErrorPlot.html b/html/includes/jpgraph/docs/ref/ErrorPlot.html new file mode 100644 index 0000000000..b3b19ccb2e --- /dev/null +++ b/html/includes/jpgraph/docs/ref/ErrorPlot.html @@ -0,0 +1,41 @@ +
ErrorPlot | Plot |
ErrorPlot() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+&$datay + + | Y-data. 2 points for each value | |
+$datax + + | +false + | X-data |
+The X-vector is optional.
+
+
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/FieldArrow.html b/html/includes/jpgraph/docs/ref/FieldArrow.html new file mode 100644 index 0000000000..c611e5b95d --- /dev/null +++ b/html/includes/jpgraph/docs/ref/FieldArrow.html @@ -0,0 +1,61 @@ +
FieldArrow |
SetColor() + SetSize() + |
+Only accessed as FieldPlot::arrow
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color specification |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aSize + + | Arrow size in pixels | |
+$aArrowSize + + | +2 + | Arrow head size (and shape) as integer in range (0-9) |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/FieldPlot.html b/html/includes/jpgraph/docs/ref/FieldPlot.html new file mode 100644 index 0000000000..d084482074 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/FieldPlot.html @@ -0,0 +1,74 @@ +
FieldPlot | Plot |
FieldPlot() + SetCallback() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$datay + + | Y-coordinate | |
+$datax + + | X-coordinate | |
+$angles + + | Angle |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFunc + + | Function name |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/Footer.html b/html/includes/jpgraph/docs/ref/Footer.html new file mode 100644 index 0000000000..82ea6c2e58 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/Footer.html @@ -0,0 +1,15 @@ +
Footer |
+For example +
+$graph->footer->left->Set("(C) 2002"); +
+
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/FuncGenerator.html b/html/includes/jpgraph/docs/ref/FuncGenerator.html new file mode 100644 index 0000000000..5525c3bbc9 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/FuncGenerator.html @@ -0,0 +1,85 @@ +
FuncGenerator |
E() + FuncGenerator() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aXMin + + | Min x-value | |
+$aXMax + + | Max x-value | |
+$aSteps + + | +50 + | Number of steps |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFunc + + | Function | |
+$aXFunc + + | +'' + | X-Function |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/GTextTable.html b/html/includes/jpgraph/docs/ref/GTextTable.html new file mode 100644 index 0000000000..66ccd9344d --- /dev/null +++ b/html/includes/jpgraph/docs/ref/GTextTable.html @@ -0,0 +1,1944 @@ +
+
+
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRows + + | +0 + | Number of rows in table |
+$aCols + + | +0 + | Number of columns in table |
+$aFillText + + | +'' + | Deafult fill value for each cell |
+If You plan on specifying the cells by individual calls to Set($row,$col,$value) then this method must have been called after the creation of the table. +
+When You set the entire table content with a call to Set() with a full 2D-matrix as argument the size of the matrix will be used to determine the size of the table.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aR1 + + | Top left row | |
+$aC1 + + | Top left column | |
+$aR2 + + | Bottom right row | |
+$aC2 + + | Bottom right column | |
+$aHAlign + + | +'center' + | Horizontal alignment |
+$aVAlign + + | +'center' + | Vertical alignment |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aCol + + | Column index | |
+$aHAlign + + | +'center' + | Horizontal alignment |
+$aVAlign + + | +'center' + | Vertical alignment |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRow + + | Row index | |
+$aHAlign + + | +'center' + | Horizontal alignment |
+$aVAlign + + | +'center' + | Vertical alignment |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aArg1 + + | 2D-Array or Row index | |
+$aArg2 + + | +NULL + | [Oprional] Columns index |
+$aArg3 + + | +NULL + | (Optional) Value for cell |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aR1HAlign + + | +null + | Top left row OR horizontal alignment |
+$aC1VAlign + + | +null + | Top left column OR vertical alignment |
+$aR2 + + | +null + | Bottom right row |
+$aC2 + + | +null + | Bottom right column |
+$aHArg + + | +null + | Horizontal alignment |
+$aVArg + + | +'center' + | Vertical alignment |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aXAnchor + + | Horizontal anchor | |
+$aYAnchor + + | +'top' + | Vertical anchor |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWeight + + | +1 + | Weight of border |
+$aColor + + | +'black' + | Color of border |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRow + + | Row index | |
+$aCol + + | Column index | |
+$aHorAlign + + | Horizontal alignment | |
+$aVertAlign + + | +'bottom' + | Vertical alignment |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRow + + | Row index | |
+$aCol + + | Column index | |
+$aColor + + | Font color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRow + + | Row index | |
+$aCol + + | Column index | |
+$aFlag + + | Flag specification partial name or index | |
+$aScale + + | +1.0 + | Scaling factor to be used |
+$aMix + + | +100 + | Blending factor (0-100) |
+$aStdSize + + | +3 + | Which original size of flag image to use |
+The parameter "$aMix" is a value between 0-100 and specifies the blend factor for the flag. +
+The paraneter $aStdSize specifes one of three orignal izes of flag where size can be one of +
+Note 1: In order to lock either the height or the width of the flag to a specific value use the SetImageConstrain()
+method.
+
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRow + + | Row index | |
+$aCol + + | Column index | |
+$aTarget + + | Target URL | |
+$aAlt + + | +null + | ALT text |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRow + + | Row index | |
+$aCol + + | Column index | |
+$aColor + + | background color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRow + + | Row index | |
+$aCol + + | Column index | |
+$aFF + + | Font family | |
+$aFS + + | Font style | |
+$aFSize + + | +10 + | Font size |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRow + + | Row index | |
+$aCol + + | Column index | |
+$aFile + + | Image file name | |
+$aScale + + | +1.0 + | Image scale factor |
+$aMix + + | +100 + | Blending factor (0-100) |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRow + + | Row index | |
+$aCol + + | Column index | |
+$aType + + | Specify width or height constrain | |
+$aVal + + | Value of constrain |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRow + + | Row index | |
+$aCol + + | Column index | |
+$aF + + | Format string |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRow + + | Row index | |
+$aCol + + | Column index | |
+$aPad + + | Internal cell margin (in pixels) |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aCol + + | Column index | |
+$aHorAlign + + | Horizontal alignment | |
+$aVertAlign + + | +'bottom' + | Vertical alignment |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aCol + + | Column index | |
+$aColor + + | Font color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aCol + + | Column index | |
+$aColor + + | Background color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aCol + + | Column index | |
+$aFF + + | Font family | |
+$aFS + + | Font style | |
+$aFSize + + | +10 + | Font size |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aCol + + | Grind line to specify | |
+$aWeight + + | +1 + | Width of line |
+$aColor + + | +'black' + | Color of line |
+$aStyle + + | +TGRID_SINGLE + | Grid line style (see below) |
+The style for the grid lines can be one of the following three +
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aCol + + | Column index | |
+$aFile + + | Filename of image | |
+$aScale + + | +1.0 + | Scale of image |
+$aMix + + | +100 + | Blend factor for image (0-100) |
+The Blend factor is specified as an integer between 0 and 100 where 100 is 100% blend factor.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aCol + + | Column index | |
+$aF + + | Format string |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aArgR1 + + | Top left row OR font color | |
+$aC1 + + | +null + | Top left column |
+$aR2 + + | +null + | Bottom right row |
+$aC2 + + | +null + | Bottom right column |
+$aArg + + | +null + | Font color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aCol + + | Column index | |
+$aPad + + | Internal cell margin |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aTarget + + | Target URL | |
+$aAlt + + | +null + | ALT etxt |
+$aAutoTarget + + | +false + | TRUE=Append auto row and column argument |
+An example will clarify this. +
+Assume that the base URL is "target.php". If we then setup the table with
+
+$table->SetCSIMTarget('target.php','Click for details',true);
+
+then if the user clicks the cell (1,1) the url called will be "target.php?row=1&col=1", for cell (2,3) the call would be "target.php?row=2&col=3" and so on.
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aArgR1 + + | Top left row OR color | |
+$aC1 + + | +null + | Top left column |
+$aR2 + + | +null + | Bottom right row |
+$aC2 + + | +null + | Bottom right column |
+$aArg + + | +null + | Color for range |
Example
+
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWeight + + | +1 + | Width of grid lines |
+$aColor + + | +'black' + | Color of grid lines |
+$aStyle + + | +TGRID_SINGLE + | Style of grid lines |
+The style for the grid lines can be one of the following three +
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFileR1 + + | Top left row OR file name | |
+$aScaleC1 + + | +null + | Top left column OR scale |
+$aMixR2 + + | +null + | Bottom right row OR blend factor |
+$aC2 + + | +null + | Bottom right column |
+$aFile + + | +null + | Image filename |
+$aScale + + | +1.0 + | Image scale |
+$aMix + + | +100 + | Blend factor (0-100) |
+The Blend factor is specified as an integer between 0 and 100 where 100 is 100% blend factor.
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColWidth + + | Width or column index | |
+$aWidth + + | +null + | Width |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRowHeight + + | Row index or height | |
+$aHeight + + | +null + | Height |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aArgR1 + + | Top left row OR format string | |
+$aC1 + + | +null + | Top left column |
+$aR2 + + | +null + | Bottom right row |
+$aC2 + + | +null + | Bottom right column |
+$aArg + + | +null + | Format string |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aArgR1 + + | Top left row OR cell padding | |
+$aC1 + + | +null + | Top left column |
+$aR2 + + | +null + | Bottom right row |
+$aC2 + + | +null + | Bottom right column |
+$aPad + + | +null + | Cell padding |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aX + + | X Coordinate of top left corner | |
+$aY + + | Y Coordinate of top left corner |
+Note: The anchor position of the table can also be adjusted by the method SetAnchorPos(). By deagule the top left corner of the table is aligned with the specified coordinates.
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRow + + | Row index | |
+$aHorAlign + + | Horizontal alignment | |
+$aVertAlign + + | +'bottom' + | Vertical alignment |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRow + + | Row index | |
+$aColor + + | Font color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRow + + | Row index | |
+$aColor + + | Background color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRow + + | Row index | |
+$aFF + + | Font family | |
+$aFS + + | Font style | |
+$aFSize + + | +10 + | Font size |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRow + + | Grind line to specify | |
+$aWeight + + | +1 + | Width of line |
+$aColor + + | +'black' + | Color of line |
+$aStyle + + | +TGRID_SINGLE + | Grid line style (see below) |
+The style for the grid lines can be one of the following three +
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRow + + | Row index | |
+$aFile + + | Filename of image | |
+$aScale + + | +1.0 + | Scale of image |
+$aMix + + | +100 + | Blend factor for image (0-100) |
+The Blend factor is specified as an integer between 0 and 100 where 100 is 100% blend factor.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRow + + | Row index | |
+$aF + + | Format string |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRow + + | Row index | |
+$aPad + + | Internal cell margin |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aX + + | X-position according to current scle | |
+$aY + + | Y position according to curent scale |
+Note: The anchor position of the table can also be adjusted by the method SetAnchorPos(). By deagule the top left corner of the table is aligned with the specified coordinates.
+
+
Example
+
+
+
+
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/GanttActivityInfo.html b/html/includes/jpgraph/docs/ref/GanttActivityInfo.html new file mode 100644 index 0000000000..402f758fec --- /dev/null +++ b/html/includes/jpgraph/docs/ref/GanttActivityInfo.html @@ -0,0 +1,267 @@ +
GanttActivityInfo |
Hide() + SetBackgroundColor() + SetColor() + SetColTitles() + SetColumnMargin() + SetFont() + SetFontColor() + SetHeaderAlign() + SetStyle() + Show() + |
+It is instantiated in the scale and is accessed through the Gantt scale for example as in +
+
+$graph->scale->actinfo->SetColTitles(
+ array('Note','Name','Duration','Start','Finish'),array(30,100));
+$graph->scale->actinfo->SetBackgroundColor('green:0.5@0.5');
+$graph->scale->actinfo->SetFont(FF_ARIAL,FS_NORMAL,10);
+$graph->scale->actinfo->vgrid->SetStyle('solid');
+$graph->scale->actinfo->vgrid->SetColor('gray');
+
+
+It is optional to use titles for the columns, so if you don't want to use titles you never have to add the above lines to a Gantt graph (but it sure looks nicer if you do ... ) +
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aF + + | +true + | TRUE=Hide titles |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color specification |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color specification |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aTitles + + | Array of titles | |
+$aWidth + + | +null + | Optional width for each column |
+It is perfectly legal to just specify the explicit width of the first few columns and have the rest of them become automatically sized. See eamplebelow.
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aLeft + + | Left margin (in pixels) | |
+$aRight + + | Right margin (in pixels) |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFFamily + + | Font family | |
+$aFStyle + + | +FS_NORMAL + | Font style |
+$aFSize + + | +10 + | Font size |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFontColor + + | Color specification |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aAlign + + | Header alignment |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStyle + + | 1=3D style |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aF + + | +true + | TRUE=Show headers |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/GanttBar.html b/html/includes/jpgraph/docs/ref/GanttBar.html new file mode 100644 index 0000000000..b1ec4f2b24 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/GanttBar.html @@ -0,0 +1,214 @@ +
GanttBar | GanttPlotObject |
GanttBar() + SetColor() + SetFillColor() + SetHeight() + SetPattern() + SetShadow() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aPos + + | Vertical position (row) | |
+$aLabel + + | Text label | |
+$aStart + + | Start date | |
+$aEnd + + | End date | |
+$aCaption + + | +"" + | Caption string for bar |
+$aHeightFactor + + | +0.6 + | Height factor |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color for gantt bar |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Fill color |
+Note: It is perfectly possible to use both a background color as weel as a pattern.
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aHeight + + | Height specification for bars |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aPattern + + | Pattern specification | |
+$aColor + + | +"blue" + | Pattern color |
+$aDensity + + | +95 + | Density |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aShadow + + | +true + | True=Add drop shadow to bars |
+$aColor + + | +"gray" + | Colro fo shadow |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/GanttGraph.html b/html/includes/jpgraph/docs/ref/GanttGraph.html new file mode 100644 index 0000000000..9535d4aa26 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/GanttGraph.html @@ -0,0 +1,357 @@ +
GanttGraph | Graph |
Add() + CreateSimple() + GanttGraph() + SetDateRange() + SetLabelVMarginFactor() + SetSimpleFont() + SetSimpleStyle() + SetVMarginFactor() + ShowHeaders() + Stroke() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aObject + + | Gantt plot object |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$data + + | Gantt bar specification (See below) | |
+$constrains + + | +array() + | Constrain specification (see below) |
+$progress + + | +array() + | Progress specification (see below) |
+Description of arguments
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWidth + + | +0 + | Width of graph |
+$aHeight + + | +0 + | Height of graph |
+$aCachedName + + | +"" + | Filename to use if cache is enables |
+$aTimeOut + + | +0 + | Timeout in minutes |
+$aInline + + | +true + | True=Stream back to browser |
+As a further refinement you can just specify width and have the height be automtically determined.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStart + + | Start date | |
+$aEnd + + | End date |
+All gantt chart objects, like bar activities, will be clipped to the spcified date range should they happen to be wider then the specified range. +
+The date is specified as a normal date string according to the chosen locale.
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aVal + + | Margin factor |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFont + + | Font family | |
+$aSize + + | Font size |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aBand + + | Patern style | |
+$aColor + + | Pattern color | |
+$aBkgColor + + | Pattern background color |
+The pattern style can be one of + +
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aVal + + | Vertical margin factor |
+Hint: When using icon in titles it is usually a good idea to use a margin factor > 1
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlg + + | Logic OR of flags to specify what headers should be displayed. |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStrokeFileName + + | +"" + | Filename to stroke image to |
+This should as usual be the last method called in your script.
+
+
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/GanttPlotObject.html b/html/includes/jpgraph/docs/ref/GanttPlotObject.html new file mode 100644 index 0000000000..ecf64ca3bc --- /dev/null +++ b/html/includes/jpgraph/docs/ref/GanttPlotObject.html @@ -0,0 +1,176 @@ +
GanttPlotObject |
SetCaptionMargin() + SetConstrain() + SetCSIMAlt() + SetCSIMTarget() + SetLabelLeftMargin() + |
+Internal method that can't be instantiated directly. Used to capture the common properties of all objects that can be added to the Ganttgraph, i.e. GanttBar, MileStones GanttVLine. + +
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aMarg + + | Margin in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRow + + | Gantt row where tarhet for constrain is | |
+$aType + + | Type of constrain | |
+$aColor + + | +'black' + | Color of constrain |
+$aArrowSize + + | +ARROW_S2 + | Size of ending arrow |
+$aArrowType + + | +ARROWT_SOLID + | Type of arrow |
+The possible arrow sizes are +
+Type of arrow can be either of +
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aAlt + + | Alt text |
+Note: You must have specified a CSIM atrget for this to have any effect.
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aTarget + + | Target URL | |
+$aAlt + + | +'' + | Alt texts |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aOff + + | Offset in pixels |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/GanttScale.html b/html/includes/jpgraph/docs/ref/GanttScale.html new file mode 100644 index 0000000000..fb4b8459a2 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/GanttScale.html @@ -0,0 +1,167 @@ +
GanttScale |
SetDateLocale() + SetRange() + SetTableTitleBackground() + SetVertLayout() + SetWeekStart() + UseWeekendBackground() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aLocale + + | String to specify locale |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMin + + | Min date | |
+$aMax + + | Max date |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aLayout + + | Vertical layout parameter |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStartDay + + | Weekday, (0-6) |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aShow + + | True=Use the weekend background color in the ganttgraph |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/GanttVLine.html b/html/includes/jpgraph/docs/ref/GanttVLine.html new file mode 100644 index 0000000000..df8c470b0b --- /dev/null +++ b/html/includes/jpgraph/docs/ref/GanttVLine.html @@ -0,0 +1,111 @@ +
GanttVLine | GanttPlotObject |
GanttVLine() + SetDayOffset() + SetTitleMargin() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aDate + + | Date where the line should be | |
+$aTitle + + | +"" + | Title of line |
+$aColor + + | +"black" + | Color for line |
+$aWeight + + | +3 + | Line weight |
+$aStyle + + | +"dashed" + | Line style (dotted, slashed etc) |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aOff + + | +0.5 + | Fraction of day (0,1) |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMarg + + | Margin in pixels |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/Graph.html b/html/includes/jpgraph/docs/ref/Graph.html new file mode 100644 index 0000000000..0750ecf6ca --- /dev/null +++ b/html/includes/jpgraph/docs/ref/Graph.html @@ -0,0 +1,1748 @@ +
+Please note that to create Pie, Gantt, Canvas and Spider charts you have to use their respective creation classes. +
+Public properties: +
Name | Type | Description |
---|---|---|
xaxis | +Axis | +X-axis | +
yaxis | +Axis | +Y-axis | +
xgrid | +Grid | +Grid lines for X-axis | +
ygrid | +Grid | +Grid lines for Y-axis | +
legend | +Legend | +Properties for legend box | +
title | +Text | +Graph main title | +
subtitle | +Text | +Sub title | +
subsubtitle | +Text | +Sub title | +
tabtitle | +GraphTabTitle | +Option Tab title for graph | +
img | +RotImage | +The image canvas | +
+
+
+ +
Argument | Default | Description |
---|---|---|
+&$aPlot + + | Plot object |
+Note that since the plot is added as a reference any changes you make to the original plot will also happen to the plot you have added to the graph. +
+Add() will always add plots to the first Y-scale. If you are using two Y-axis then you must use AddY2() to add plots to the second Y-scale.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+&$aBand + + | Band object | |
+$aToY2 + + | +false + | Add object to Y2 axis |
+Each band is an instance of the PlotBand class. For types of plot band see the documentation of class PlotBand +
+Note: You can alos use the standard method Add() to add bands.
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+&$aLine + + | Line object to add | |
+$aToY2 + + | +false + | Add line to Y2 axis |
+Note: You can alos use the standard method Add() to add lines.
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+&$aTxt + + | Text object to add | |
+$aToY2 + + | +false + | Add text to Y2 axis |
+Note: You can alos use the standard method Add() to add bands.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aN + + | Number of axis to add data to | |
+&$aPlot + + | The plot to be added |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+&$aPlot + + | Plot to add to the Y2 axis |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aCacheName + + | Cache file name | |
+$aTimeOut + + | +60 + | Timeout (in minutes) |
+This specifically means that no lines of code after this method will be executed in case the image/map is found in the cache.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMapName + + | Image map name |
+Please note that due to the way client side image maps work you need to have both the image map and the image available in the script that is sent back to the browser. Since you can't do this at the same time you will have to create an image to disk and read the image map. The you have to stream the HTML page with an tag to load the previously generated image as well as the image map.
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWidth + + | +300 + | Width |
+$aHeight + + | +200 + | Height |
+$aCachedName + + | +"" + | Cache file name |
+$aTimeOut + + | +0 + | Timeout value for cache |
+$aInline + + | +true + | True=Stream the image back to the browser |
+If the cache name is specifed as 'auto' then the cache name will be based on the basename of the script with an extension indicating the image format used, i.e. JPG, GIF or PNG. +
+If the specified file is found in the cache directory then it will be streamed back to the browser directly. +
+If no cache name is specified then the graph will always be generated and the cache bypassed. The same is true if the DEFINE 'USE_CACHE' or 'READ_CACHE' is set to false. +
+Before any other operation is performed on the graph a call to SetScale() should be made to finish the initialisation of the graph.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aDir + + | +1 + | Direction for 3D perspective |
+$aHorizon + + | +100 + | Distance (in pixels) from the bottom of the image to the horizon |
+$aSkewDist + + | +120 + | Skew distance (in pixels) on the horizon |
+$aQuality + + | +false + | Boolean. High quality = |
+$aFillColor + + | +'#FFFFFF' + | What fill color to use |
+$aBorder + + | +false + | Boolean. Border around? |
+$aMinSize + + | +true + | Boolean. Make the transformed image canvas as small as possible |
+$aHorizonPos + + | +0.5 + | Distance from left on the horizon for the point of focus |
+Allowed argument for $aDir are +
+aSkewDist How far to the right on the horizon is the +"skewing point", a large value gives a very strong for-shortening. +
+aQuality Use high quality (takes longer time) TRUE or FALSE +
+aFIllColor Fill background color in the image on places where the original image no longer cover the entire canvas. +
+aBorder Border around or not +
+aMinSize Just make the image as large as it has to be. TRUE or FALSE. If this argument is set to false then the original image size will be preserved. +
+aHorizonPosHow far, in fraction, should the point of focus be from the left edge of the image.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$lm + + | +0 + | Left margin |
+$rm + + | +0 + | Right Margin |
+$tm + + | +0 + | Top margin |
+$bm + + | +0 + | Bottom margin |
+Remember that when rotating the graph it might be a good idea to adjust the axis so that the alignment of the labels for x and Y axis. For example by setting them as: + +
+$graph->xaxis->SetLabelAlign('right','center','right');
+
+$graph->yaxis->SetLabelAlign('center','bottom');
+
+Note: This is slightly different from using SetAngle() and SetMargin() in that this method automatically adjusts the margin so that width becomes height and vice versa due to the rotation.
+
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlg + + | +true + | TRUE=Enable alpha blending |
+"red@0.5" (or "#FF0000@0.5") +
+can then use this color specification in all places where the color may be specified. If the alpha blending is not active then the alpha parameter will have no effect. +
+Note that the use of alpha blending requires GD 2.01 or higher. By default alpha blending is enabled.
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aAngle + + | Rotation angle for graph |
+See horizbarex1.php for a real life example. +
+Note: If you want a 90 degrees rotated graph consider using Graph::Set90AndMargin() which greatly simplifies this with just one call
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aType + + | No description available | |
+$aXFColor + + | +'lightgray' + | No description available |
+$aXColor + + | +'black' + | No description available |
+$aYFColor + + | +'lightgray' + | No description available |
+$aYColor + + | +'black' + | No description available |
+
+ +
Argument | Default | Description |
---|---|---|
+$aStyle + + | Style of axis |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aName + + | Index or (partial) name of Country | |
+$aBgType + + | +BGIMG_FILLPLOT + | Background fill type |
+$aMix + + | +100 + | Mix percentage |
+The final arcgument "aMix" is a value between 0-100 and specifies the blend factor for the flag.
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aName + + | Full or partial country name | |
+$aBgType + + | +BGIMG_FILLPLOT + | Normal background fill type |
+$aMix + + | +100 + | Mix fraction |
+The final arcgument "aMix" is a value between 0-100 and specifies the blend factor for the flag.
+
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aFrom + + | +'navy' + | Color 1 |
+$aTo + + | +'silver' + | Color 2 |
+$aGradType + + | +2 + | Gradient type |
+$aStyle + + | +BGRAD_FRAME + | Gardient layout style |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFileName + + | Filename for background image | |
+$aBgType + + | +BGIMG_FILLPLOT + | Style of background image |
+$aImgFormat + + | +"auto" + | Image format ("jpeg", "gif", "png") |
+The positioning and sizing of the background image can be controlled by the $aBgType parameter. Possible values are +
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMix + + | Mix value (0-100) |
+
+ +
Argument | Default | Description |
---|---|---|
+$aDrawPlotFrame + + | +true + | True=Draw the frame |
+$aPlotFrameColor + + | +array(0,0,0) + | Frame color |
+$aPlotFrameWeight + + | +1 + | Width fo frame line |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlg + + | +true + | Enable/disbale clipping |
+Clipping may come in handy when you for example set a manual scale and have data points outside the specified range. +
+By default clipping is disabled. +
+Note 1: Clipping is only supported for graphs at 0 or 90 degrees rotation and will generate an error message if enabled together with any other angle. +
+Note 2: The clipping is implemented with a O(1) algorithm in terns of data size.
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aAlt + + | Alt text |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aDrawImgFrame + + | +true + | True=Draw a frame around the entire image |
+$aImgFrameColor + + | +array(0,0,0) + | Frame color |
+$aImgFrameWeight + + | +1 + | Width of frame |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aDepth + + | +3 + | Depth (Height) in pixels for bevel |
+$aBorder + + | +false + | True=Add 1 pixel border around |
+$aBorderColor + + | +'black' + | Border color |
+$aColor1 + + | +'white@0.4' + | Right and bottom shadow |
+$aColor2 + + | +'darkgray@0.4' + | Left and top shadow |
+$aFlg + + | +true + | True=Show bevel frame |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aDepth + + | Grid depth |
+Valid values for grid depth are +
+The default is to draw the grid lines under the plots.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aDepth + + | Depth of icons (see description) |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFormat + + | Format (see description) | |
+$aQuality + + | +75 + | Quality parameter for JPEG |
+The image format is specified as a string that can be one of +
+If the graph has complicated background images or 100s of colors then there is a good chance that JPEG will give better compression on the expense of image quality. +
+The quality parameter is a value between (0,100) inclusively. = gives best compression but worst quality and 100 give the best quality. Suitable ranges is 60-90.
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$lm + + | Left margin (in pixels) | |
+$rm + + | Right margin (in pixels) | |
+$tm + + | Top margin (in pixels) | |
+$bm + + | Bottom margin (in pixels) |
+Note: If you want to set the margin for a 90 degrees rotated graph please consider using Graph::Set90AndMargin() instead since this will automatically adjust for the rotated image and the swapped meaning of width and height.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aAxisType + + | Type of axis | |
+$aYMin + + | +1 + | Y-min |
+$aYMax + + | +1 + | Y-max |
+$aXMin + + | +1 + | X-min |
+$aXMax + + | +1 + | X-max |
+To specify which combination of X and Y scales you want to use the $axtype parameter is specified. In this parameter you specify, by a text string, the type of scale you want to use for both X and Y scale. +
+Possible values for each axis are:
+X: 'lin', 'text', 'log', 'int'
+Y: 'lin', 'log', 'int'
+
+Example of possible combination:
+
+Note: If you want to use a logarithmic scale you must make sure that the ?jpgraph_log.php? is included. +
+Note1:
+Note that if you manually specify the scale you can also specify the tick distance with a call to Ticks::Set(). For example $graph->yaxis->scale->ticks->Set(10,5) If yiou don't ste it manually a suitable tick distance will be automatically choosen.
+
+Note2:
+If you want to keep the autoscaling for Y-axis but specify the X-axis then just call the method with both min and max set to 0 (e.g. SetScale('linlin',0,0,0,50); )
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aShowShadow + + | +true + | True=add a drop shadow |
+$aShadowWidth + + | +5 + | Width (in pixels of shadow) |
+$aShadowColor + + | +array(102,102,102) + | Shadow color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aOff + + | No description available |
+
+ +
Argument | Default | Description |
---|---|---|
+$aYDensity + + | +TICKD_NORMAL + | Y-density |
+$aXDensity + + | +TICKD_NORMAL + | X-density |
+The following DEFINES may be used to hint to the auto-scaling how many ticks should be allocated + +
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aBackColor + + | +'gray' + | Background color |
+$aStyle + + | +TITLEBKG_STYLE1 + | Background size style, see description |
+$aFrameStyle + + | +TITLEBKG_FRAME_NONE + | Frame style, see description |
+$aFrameColor + + | +'black' + | Frame color |
+$aFrameWeight + + | +1 + | Frame thickness (weight) |
+$aBevelHeight + + | +3 + | Bevel height used for frame style bevel |
+$aEnable + + | +true + | Enable/disable background |
+The first argument $aStyle determines the size the background should cover. The two possibilities are +
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStyle + + | Fill style (see description) | |
+$aColor1 + + | +'black' + | Color 1 |
+$aColor2 + + | +'white' + | Color 2 |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aBack + + | +true + | TRUE=under Y axis, FALSE=above |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aAxisType + + | +"lin" + | Type of scale |
+$aY2Min + + | +1 + | Y2Min value |
+$aY2Max + + | +1 + | Y2Max value |
+This method works in the exact same way for the Y2 axis as the SetScale() method previously described. +
+Allowed values for the $axtype are +
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aDist + + | Distance in pixels |
+
+ +
Argument | Default | Description |
---|---|---|
+$aN + + | Index of axis | |
+$aAxisType + + | +"lin" + | Scale type of axis |
+$aYMin + + | +1 + | Optional min scale value |
+$aYMax + + | +1 + | Optional max scale value |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStrokeFileName + + | +"" + | File name* (or special handle, see below) |
+If $aStrokeFileName != "" the image will be written to this file and NOT streamed back to the browser +
+If the file name is specified with the define __IMG_HANDLER (Note: Thre are 2 '_' in the beginning) then no image will be streamed to file or browser. Instead the Stroke() method will simply return the image handle used by the GD library. This can come in handy of you like to post manipulate the image or use the raw GD image in other context. Such as in creating dynamic PDF documents. +
+Note: If you want to use the image in a PDF file you can't take the handle directly since this is a GD handle. To use it in PDF you must first create an PDF image by calling pdf_open_memory_image() to get a proper PDF image handle. See example below. + +
+You may also specify the file name as "auto" in which case the filename will be created from the script name but with the extension changed to reflect the choosen image format.
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aScriptName + + | +'auto' + | Name of the image generating script |
+$aCSIMName + + | +'' + | Image map name |
+$aBorder + + | +0 + | Should the image be bordered? |
+Please note that it is abolutely imperative that you specify the image generating scripts name as the first argument. +
+Why that? Because it is impossible for JpGraph to find out the name of the script it is executed from in the case where it is included as oart of a "standard" HTML/PHP page. Using the PHP_SELF will only return the master document and not the actual script name. +
+If you use several image map images on the same HTML page you must also specify unique names of each of the image maps as the second argument for this function. +
+To specify targets for the image maps you must call the individual plots Pot::SetCSIMTargets() +
+Tip: You can easily specify the script name by using the construction
+basename(__FILE__) as the first argument
+
Example
+
+
+
+
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/GraphTabTitle.html b/html/includes/jpgraph/docs/ref/GraphTabTitle.html new file mode 100644 index 0000000000..191eb3a036 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/GraphTabTitle.html @@ -0,0 +1,202 @@ +
GraphTabTitle | Text |
Set() + SetColor() + SetCorner() + SetFillColor() + SetPos() + SetTabAlign() + SetWidth() + | Align() + Center() + GetFontHeight() + GetTextHeight() + GetWidth() + Hide() + ParagraphAlign() + Pos() +Set() + SetAlign() + SetAngle() + SetBox() +SetColor() + SetCSIMTarget() + SetFont() + SetMargin() + SetOrientation() + SetParagraphAlign() +SetPos() + SetScalePos() + SetShadow() + SetWordWrap() + Show() + Text() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$t + + | Text |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aTxtColor + + | Text color | |
+$aFillColor + + | +'lightyellow' + | Background fill color |
+$aBorderColor + + | +'black' + | Border color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aD + + | Cut in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFillColor + + | Fill color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aAlign + + | 'left', 'center' or 'right' alignment |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aAlign + + | Left right or center position |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWidth + + | Width of tab (see below) |
+The TABTITLE_WIDTHFIT will make the tab just wide enough to hold the text in the tab and the TABTITLE_WIDTHFULL will extend the tab across the entire plot area. +
+By default the tab will be formatted as it had been specified as TABTITLE_WIDTHFIT
+
+
+
+
+
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/Grid.html b/html/includes/jpgraph/docs/ref/Grid.html new file mode 100644 index 0000000000..ab62312dcd --- /dev/null +++ b/html/includes/jpgraph/docs/ref/Grid.html @@ -0,0 +1,153 @@ +
Grid |
SetColor() + SetFill() + SetLineStyle() + SetWeight() + Show() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aMajColor + + | Major color | |
+$aMinColor + + | +false + | Minor color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlg + + | +true + | Flag, True=enable fill |
+$aColor1 + + | +'lightgray' + | Fill color 1 |
+$aColor2 + + | +'lightblue' + | Fill color 2 |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aType + + | String to specify line type |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWeight + + | Line width in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aShowMajor + + | +true + | True=Show major grid lines |
+$aShowMinor + + | +false + | True=Show minor grid lines |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/GroupBarPlot.html b/html/includes/jpgraph/docs/ref/GroupBarPlot.html new file mode 100644 index 0000000000..d61d4d3cf9 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/GroupBarPlot.html @@ -0,0 +1,45 @@ +
GroupBarPlot | BarPlot |
GroupBarPlot() + |
+$b1 = new BarPlot(...);
+$b2 = new BarPlot(...);
+
+$gb = new GroupBarPlot(array($b1,$b2));
+...
+$graph->Add($gb);
+...
+
+
+Each individual bar can be either a BarPlor or an AccBarPlot.
+ +
+
+ +
Argument | Default | Description |
---|---|---|
+$plots + + | Array of individual plots |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/HeaderProperty.html b/html/includes/jpgraph/docs/ref/HeaderProperty.html new file mode 100644 index 0000000000..4baa34ff70 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/HeaderProperty.html @@ -0,0 +1,343 @@ +
+$ganttgraph->scale->min
+$ganttgraph->scale->hour
+$ganttgraph->scale->day
+$ganttgraph->scale->week
+$ganttgraph->scale->month
+$ganttgraph->scale->year
+
+
+You use the methods on these object to specify how you want the scale to be displayed. For example specifying if the week view will show start date or week number. +
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFFamily + + | Font family | |
+$aFStyle + + | +FS_NORMAL + | Font style |
+$aFSize + + | +10 + | Font size |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStr + + | Format string |
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWeight + + | Width in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aInt + + | Integer intervall |
+For example if the scale is an hour scale then SetIntervall() will give number of hours between each scale interball.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStr + + | printf() style format string |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStyle + + | Scale style |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMargin + + | Margin in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Background color for the weekend |
+Tip: If you want the weekend background color to continue down the gantt chart theh use the GanttScale::UseWeekendBackground() method.
+
+
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/HorizontalGridLine.html b/html/includes/jpgraph/docs/ref/HorizontalGridLine.html new file mode 100644 index 0000000000..75155160c5 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/HorizontalGridLine.html @@ -0,0 +1,80 @@ +
HorizontalGridLine |
SetRowFillColor() + SetStart() + Show() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor1 + + | Color 1 | |
+$aColor2 + + | +'' + | Color 2 |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStart + + | Start row |
+
+ +
Argument | Default | Description |
---|---|---|
+$aShow + + | +true + | TRUE/FALSE |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/IconImage.html b/html/includes/jpgraph/docs/ref/IconImage.html new file mode 100644 index 0000000000..d0f4b3c4d1 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/IconImage.html @@ -0,0 +1,117 @@ +
IconImage |
IconImage() + SetAlign() + |
+The icons are then used exactly as you would use text strings when specifying a title for the gantt object. For example:
+
+$icon = new IconImage(GICON_WARNING,0.7);
+$titles = array($icon,'65 days','3 Aug','5 sep');
+$bar = new GanttBar(0,$titles,$startdat,$enddate);
+...
+
+
+Hint: When using icons togehter with titles the height of each bar is not affected (by design!) of the icons height. If you are using icons in several rows it might therefore be usefull to increase the vertical margin factor between each row. This is done by a call to the method GanttGarph::SetVMarginFactor()
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aIcon + + | Icon specification. Either an image file or one of the builtin icons | |
+$aScale + + | +1 + | Scale of icon |
+An icon can either be created from an arbitrary image file (type is determined by the file extension) or it can also be one of the builtin icons. The builtin icons are: +
+A graphic illustration of the differenmt icons can be found in the manual. +
+The second argument specifies an optional scaling factor for the image/builtin icon. +
+The icons are then used exactly as you would use text strings when specifying a title for the gantt object. For example:
+
+$icon = new IconImage(GICON_WARNING,0.7);
+$titles = array($icon,'65 days','3 Aug','5 sep');
+$bar = new GanttBar(0,$titles,$startdat,$enddate);
+...
+
+
+Hint: When using icons togehter with titles the height of each bar is not affected (by design!) of the icons height. If you are using icons in several rows it might therefore be usefull to increase the vertical margin factor between each row. This is done by a call to the method GanttGarph::SetVMarginFactor()
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aX + + | +'left' + | Horizontal anchor point |
+$aY + + | +'center' + | Vertical anchor point |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/IconPlot.html b/html/includes/jpgraph/docs/ref/IconPlot.html new file mode 100644 index 0000000000..0e597aea84 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/IconPlot.html @@ -0,0 +1,227 @@ +
IconPlot |
IconPlot() + SetAnchor() + SetCountryFlag() + SetMix() + SetPos() + SetScale() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aFile + + | +"" + | File name of image |
+$aX + + | +0 + | X-position |
+$aY + + | +0 + | Y-position |
+$aScale + + | +1.0 + | Scale |
+$aMix + + | +100 + | Mixin value |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aXAnchor + + | +'left' + | Horizontal anchor |
+$aYAnchor + + | +'center' + | Verticla anchor |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlag + + | Partial or full country name | |
+$aX + + | X-position | |
+$aY + + | Y-position | |
+$aScale + + | Scaleing of image | |
+$aMix + + | Blend factor (0-100) | |
+$aStdSize + + | Which of the flag standard sizes should be used as the original image (1-4) |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMix + + | Mix value (0-100) |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aX + + | X-position | |
+$aY + + | Y-position |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aScale + + | Scale value. |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/Image.html b/html/includes/jpgraph/docs/ref/Image.html new file mode 100644 index 0000000000..2f90acb41d --- /dev/null +++ b/html/includes/jpgraph/docs/ref/Image.html @@ -0,0 +1,278 @@ +
Image |
RoundedRectangle() + SetAlphaBlending() + SetAntiAliasing() + SetCanvasColor() + SetExpired() + SetImgFormat() + SetMargin() + SetQuality() + SetTransparent() + |
+By replacing Image (and RotImage) it is possible to change the output driver for the whole library withou any further changes. +
+A very close related class is RotImage which builds directly on Image but in additoin provides a 2D rotation featire, i.e the image may be rotated around a given point and possible also translated. +
+The image gets instantiated through in the Graph::Img property, or more accurate the RotImage class gets instantiated. The only method in this class that any end user is likely to need (and use) is the SetMargin() method used to give the margins around between the end of the image and the actual plotarea. +
+Note that all coordinates in methods belonging to Image is given in direct screen coordinates. + + + +
+
+
+ +
Argument | Default | Description |
---|---|---|
+$xt + + | Top left X | |
+$yt + + | Top left Y | |
+$xr + + | Bottom right X | |
+$yl + + | Bottom right Y | |
+$r + + | +5 + | Corner radius |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlg + + | +true + | True/false = Enable/Disable alpha blending |
+Alphablending is enabled by default (when GD2 is used) but can be turned off by a call to this function with the argument false.
+
+
Example
+
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color |
+The one time it matters is when you use a drop shadow on the graph. In the small area (top right and bottom left) where there is an empty are which is covered by neither the shadow nor the graph margin this area will have the canvas color.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlg + + | +true + | True=Return expired header. |
+By default this is turned on. +
+Note: There is no reason as far as we can tell to turn this off.
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFormat + + | Image format | |
+$aQuality + + | +75 + | No description available |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$lm + + | Left margin | |
+$rm + + | Right margin | |
+$tm + + | Top margin | |
+$bm + + | Bottom margin |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$q + + | Image quality paramer (0-100) |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$color + + | Color |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/Legend.html b/html/includes/jpgraph/docs/ref/Legend.html new file mode 100644 index 0000000000..4f8b8a5c13 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/Legend.html @@ -0,0 +1,519 @@ +
+This is all handled by the framework. Legend is instantiated in the graph as instance variable legend. When stroking individual plots this instance variable is used by the individual Legend() methods in the plot classes to add whatever the individual plots need to add. +
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aHide + + | +true + | True = hide |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aX + + | X coordinate | |
+$aY + + | Y coordinate | |
+$aHAlign + + | +"right" + | Horizontal alignment |
+$aVAlign + + | +"top" + | Vertical alignment |
+Horizontal: 'left','right','center'
+Vertical: 'bottom','top','center'
+
+Please note that the X and Y positions should be give as fractions , i.e Pos(0.1,0.1) +
+If the alignment is not given the the default is 'right','top'
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aX + + | x Coordinate | |
+$aY + + | y Coordinate | |
+$aHAlign + + | +"right" + | Horizontal anchor point |
+$aVAlign + + | +"top" + | Vertical Anchor point |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFontColor + + | Font coor | |
+$aColor + + | +'black' + | Frame color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aCols + + | Number of columns |
+By default i column us used.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Fill color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFamily + + | Font family | |
+$aStyle + + | +FS_NORMAL + | Font style |
+$aSize + + | +10 + | Font size |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWeight + + | Width in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aXMarg + + | No description available |
+
+ +
Argument | Default | Description |
---|---|---|
+$aDirection + + | +LEGEND_VERT + | Layout for legend box |
+Allowed arguments: LEGEND_VERT,LEGEND_HOR +
+Please note that horizontal layout is only suitable for a few legends since it makes use of quite a lot of horizontal space.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aXMarg + + | No description available |
+
+ +
Argument | Default | Description |
---|---|---|
+$aSpacing + + | Extra margin (in pixels) |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWeight + + | Line weight in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aSize + + | No description available |
+
+ +
Argument | Default | Description |
---|---|---|
+$aSize + + | Size in pixels |
+It is often desirable to use a smaller size for the marks in the legend than in the graph itself.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aSize + + | No description available |
+
+ +
Argument | Default | Description |
---|---|---|
+$aX + + | X position | |
+$aY + + | Y position | |
+$aHAlign + + | +"right" + | Horizontal anchor point |
+$aVAlign + + | +"top" + | Vertical anchor point |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$f + + | +true + | TRUE=In reverse order |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aShow + + | +'gray' + | True = show drop shadow |
+$aWidth + + | +2 + | Width of drop shadow in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aSpacing + + | No description available |
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/LineErrorPlot.html b/html/includes/jpgraph/docs/ref/LineErrorPlot.html new file mode 100644 index 0000000000..77121ac26b --- /dev/null +++ b/html/includes/jpgraph/docs/ref/LineErrorPlot.html @@ -0,0 +1,40 @@ +
LineErrorPlot | ErrorPlot |
LineErrorPlot() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+&$datay + + | Y-Data | |
+$datax + + | +false + | X-Data [optional] |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/LinePlot.html b/html/includes/jpgraph/docs/ref/LinePlot.html new file mode 100644 index 0000000000..a539740372 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/LinePlot.html @@ -0,0 +1,326 @@ +
+A line plot can only be added to a Graph() image. + +Public properties: +
Name | Type | Description |
---|---|---|
mark | PlotMarkMark at each data point | |
value | DisplayValueDetermine if and hhow each data value should be displayed in the plot |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aMin + + | +0 + | Start X-value |
+$aMax + + | +0 + | End X-value |
+$aFilled + + | +LP_AREA_NOT_FILLED + | Fill area or not (true/false) |
+$aColor + + | +"gray9" + | Color of fill |
+$aBorder + + | +LP_AREA_BORDER + | Use a border (true/false) |
+Predefined values for $aFilled are:
+LP_AREA_FILLED
+LP_AREA_NOT_FILLED
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+&$datay + + | Y-data | |
+$datax + + | +false + | X-data |
+A plot can be specified with either only Y-values or both Y-and X-values. If both X and Y values are specified they should have the same number of elements.
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlag + + | +true + | TRUE = Align line points to center of bars |
+This method is only to be used in the case where line and bar plots are combined. Any other use is undefined.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlg + + | +true + | TRUE=Use fast stroke |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color | |
+$aFilled + + | +true + | Flag. Filled or not |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$f + + | +true + | TRUE=fill from minimum |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFromColor + + | Start color | |
+$aToColor + + | End color | |
+$aNumColors + + | +100 + | Number of colors to use in transition |
+$aFilled + + | +true + | TRUE=Enable gradient fill |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlag + + | +true + | Flag. true to use step style. |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStyle + + | Text string to specify line |
+The default line style is 'solid'
+
+
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/LineProperty.html b/html/includes/jpgraph/docs/ref/LineProperty.html new file mode 100644 index 0000000000..a145e128cf --- /dev/null +++ b/html/includes/jpgraph/docs/ref/LineProperty.html @@ -0,0 +1,99 @@ +
LineProperty |
SetColor() + SetStyle() + SetWeight() + Show() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStyle + + | Line style |
+The default line style is 'solid'
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWeight + + | Line width in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aShow + + | +true + | True=Display line |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/LinearScale.html b/html/includes/jpgraph/docs/ref/LinearScale.html new file mode 100644 index 0000000000..c3d7a8e661 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/LinearScale.html @@ -0,0 +1,126 @@ +
LinearScale |
SetAutoMax() + SetAutoMin() + SetAutoTicks() + SetGrace() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aMax + + | Maximum value |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMin + + | Min value |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlag + + | +true + | TRUE = determine ticks automatically |
+For example:
+
+$graph->SetScale("textlin",0,70);
+$graph->yscale->ticks->Set(10,2);
+
+However by instead using +
+$graph->SetScale("textlin",0,70);
+$graph->yscale->SetAutoTicks();
+
+The major and minor ticks are determined automatically. +
+The thing you have to be aware of is that the specified min and max values might be slightly modified so that the end/beginning of the scale will fall on a major tick step. +
+By default the auto ticks are off.
+
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aGraceTop + + | Top grace value | |
+$aGraceBottom + + | +0 + | Bottom grace value |
+By specifyin the grace you get added space. The value specified is interpretated as extra percentage of the total scale range. +
+For example if the scale range (without grace) is (0,100) and you add 10% top grace (with SetGrace(10)) the modified scale will be (0,110) and if you use a 100% top grace the scale will be (0,200) and so on.
+
+
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/LinearTicks.html b/html/includes/jpgraph/docs/ref/LinearTicks.html new file mode 100644 index 0000000000..ad40322f83 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/LinearTicks.html @@ -0,0 +1,168 @@ +
LinearTicks | Ticks |
AdjustForDST() + GetMajor() + GetMinor() + Set() + SetMajTickPositions() + SetTextLabelStart() + SetTickPositions() + |
+$graph->xaxis->scale->ticks->Set(20,10); +
+Note: When you manually specify a scale you must also specify the major/minor tick intervall.
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlg + + | +true + | No description available |
+
+
+
+
Example
+
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMajStep + + | Distance between major tick marks | |
+$aMinStep + + | +false + | Distance between minor tick marks |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMajPos + + | No description available | |
+$aLabels + + | +NULL + | No description available |
+
+ +
Argument | Default | Description |
---|---|---|
+$aTextLabelOff + + | The number thaht the automatic textscale should start with. |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMajPos + + | Array of major positions | |
+$aMinPos + + | +NULL + | Array of minor positions |
+$aLabels + + | +NULL + | Array of major label strings |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/LogScale.html b/html/includes/jpgraph/docs/ref/LogScale.html new file mode 100644 index 0000000000..49c623c964 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/LogScale.html @@ -0,0 +1,38 @@ +
LogScale | LinearScale |
GetMaxVal() + GetMinVal() + |
+
+
+
+
+
Example
+
+
+
+
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/LogTicks.html b/html/includes/jpgraph/docs/ref/LogTicks.html new file mode 100644 index 0000000000..fae5bf676f --- /dev/null +++ b/html/includes/jpgraph/docs/ref/LogTicks.html @@ -0,0 +1,52 @@ +
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aType + + | Magnitude (10^x) or plain |
+$aType can be either +
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/MileStone.html b/html/includes/jpgraph/docs/ref/MileStone.html new file mode 100644 index 0000000000..a5427057b2 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/MileStone.html @@ -0,0 +1,49 @@ +
MileStone | GanttPlotObject |
MileStone() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aVPos + + | Row for milestone | |
+$aLabel + + | Label | |
+$aDate + + | Position on the date scale | |
+$aCaption + + | +"" + | Caption string |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/PieGraph.html b/html/includes/jpgraph/docs/ref/PieGraph.html new file mode 100644 index 0000000000..8cf546bf3a --- /dev/null +++ b/html/includes/jpgraph/docs/ref/PieGraph.html @@ -0,0 +1,159 @@ +
PieGraph | Graph |
Add() + PieGraph() + SetAntiAliasing() + SetColor() + Stroke() + |
+You can add several PiePlots by adjusting their size and positioning each PiePlot so it doesn't overlap eachother. +
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aObj + + | Object to add |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$width + + | +300 + | Width of graph |
+$height + + | +200 + | Height of graph |
+$cachedName + + | +"" + | Cache file name |
+$timeout + + | +0 + | Cache timeout in s |
+$inline + + | +1 + | Should the image be inline. |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlg + + | +true + | true=enable anti-aliasing |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$c + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStrokeFileName + + | +"" + | Filename |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/PiePlot.html b/html/includes/jpgraph/docs/ref/PiePlot.html new file mode 100644 index 0000000000..b2e81eecfb --- /dev/null +++ b/html/includes/jpgraph/docs/ref/PiePlot.html @@ -0,0 +1,618 @@ +
+By default the value (if enabled through the $pie->label->show() ) close to each slice will have a label corresponding to the percentage of that slice. +
+Each plot may have an arbitrary title which can be accessed through the ?title? property in the PiePlot class. The title will be automatically centred on top of the PiePlot clear of any possible labels. To set the title use the Set() method , i.e. $plot->title->Set(?MyTitle?). +
+To format the slice labels use the SetFormat() method of the value class.
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aExplodeArr + + | Explode specification |
+If you only want to explode a single slice you could also use the ExplodeSlice() method.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$radius + + | +20 + | Explode radius |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$e + + | Which slice to explode | |
+$radius + + | +20 + | Radius to explode to |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$data + + | Data array for Pie |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$x + + | X-position as fraction of width | |
+$y + + | +0.5 + | Y-position as fraction of height |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color. |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$targets + + | Array of URL targets | |
+$alts + + | +null + | Alt strings |
+Each slice will aslo have it's own 'alt' tag. Depending on the browser this tag is usually showed when the mouse is hold over a poarticular area on the image map. When formatting the alt strings can be specified as a printf() format string. The value supplied to the string will be the value for each slice.
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$family + + | Font family | |
+$style + + | +FS_NORMAL + | Font style |
+$size + + | +10 + | Font size |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlg + + | +true + | TRUE=Enable guide lines |
+$aCurved + + | +true + | Curve the labels around the pie |
+$aAlways + + | +false + | Always use a guide line to the label |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aVFactor + + | Vertical fraction | |
+$aRFactor + + | +0.8 + | Radius factor |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aLblPosAdj + + | Position as fraction of radius |
+Note: The adjustment affect both manually speicfied labels with SetLabels() as well as automtic labels.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aLabels + + | Arrays of strings | |
+$aLblPosAdj + + | +"auto" + | Position as fraction of the radius |
+"May %.1f%%" +
+would display the in the pie "May 28.3%" assuming you had choosen to use percentage values (SetLabelType()) +
+The second parameter specifies where to position these labels. The position is specified as a fraction of the radius of the pie plot or as the special strine 'auto'. If you specify this string value JpGraph will automtically determine the best position for the labels inside the pie. This is the default if you don't explicitely specify the position. +
+If you specify a value > 1.0 then the labels will +just be move further out. For example if you specify the position as 1.5 then the labels will move out a further 50% of the current pie radius. +
+Note: The actual alignment of the labels are dependent on the position. If the labels are just outside the pie they will be individually positioned according to the angle. If the labels are positioned inside the pie then the point of gravity within the text will be aligned with the specified position in the pie.
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$t + + | Set absolute or percentage value constant |
+The following values are allowed arguments: +
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aLegend + + | Array of strings |
+Each text string can be formatted as a printf() format string since when printed they will be passed the value for that slice. +
+Tip: If you have many evry small slices then the labels close to the pie may be overwriting each other. In this case it is probably better to hide the labels by the slices and instead just show the values ion the legends.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | +'darkgray' + | Shadow color |
+$aDropWidth + + | +4 + | Drop distance for shadow |
+This is often more affective if one or more slices are exploded.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aSize + + | Size of radius |
+If the value is >1 then it is interpretated as an absolute size in pixels.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColors + + | Array of colors |
+If you supply fewer colors than pie-slices than the colors will be re-used from the beginning of the array.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStart + + | Start angle in degrees |
+The angle should be specified in degrees.
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aTheme + + | Theme name |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aType + + | Value type |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$exterior + + | +true + | Display circle on the outer edge of pieplot |
+$interior + + | +true + | Display the lines between each slice |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/PiePlot3D.html b/html/includes/jpgraph/docs/ref/PiePlot3D.html new file mode 100644 index 0000000000..4c55d68818 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/PiePlot3D.html @@ -0,0 +1,279 @@ +
PiePlot3D | PiePlot |
PiePlot3d() + SetAngle() + SetCSIMTargets() + SetEdge() + SetHeight() + SetLabelMargin() + SetLabels() + SetLegends() + SetSliceColors() + SetStartAngle() + ShowBorder() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+&$data + + | Data array for slices |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$a + + | Projection angle in degrees |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$targets + + | Array of URL targets | |
+$alts + + | +null + | Array of Alt texts |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | +'black' + | Color for line |
+$aWeight + + | +1 + | Width of line |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aHeight + + | Height in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$m + + | Margin in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aLabels + + | Label arrays | |
+$aLblPosAdj + + | +"auto" + | Label position [0.2- 1] |
+The labels may include an optional sprintf() formatting string. Before stroking the label to the graph it will be formatted with the actual value (absolute or percentage) depending on what has been specified with the SetLabelType() method.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aLegend + + | Array of legends |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColors + + | Array of colors |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStart + + | Start angle (in degrees) |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$exterior + + | +true + | Display interior borders |
+$interior + + | +true + | Display exterior borders |
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/PiePlotC.html b/html/includes/jpgraph/docs/ref/PiePlotC.html new file mode 100644 index 0000000000..87f1f04611 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/PiePlotC.html @@ -0,0 +1,163 @@ +
PiePlotC | PiePlot |
PiePlotC() + SetMid() + SetMidColor() + SetMidCSIM() + SetMidSize() + SetMidTitle() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$data + + | Data array | |
+$aCenterTitle + + | +'' + | Title for center circle |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aTitle + + | Title text for center circle | |
+$aColor + + | +'white' + | Fill color for center circle |
+$aSize + + | +0.5 + | Size of center. Specified as fraction of radius |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aTarget + + | Target URL string | |
+$aAlt + + | Alt text |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aSize + + | Size in fraction of the radius |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aTitle + + | Title |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/Plot.html b/html/includes/jpgraph/docs/ref/Plot.html new file mode 100644 index 0000000000..5d5f2d5a4d --- /dev/null +++ b/html/includes/jpgraph/docs/ref/Plot.html @@ -0,0 +1,173 @@ +
Plot |
HideLegend() + SetCenter() + SetColor() + SetCSIMTargets() + SetLegend() + SetLineWeight() + |
Name | Type | Description |
---|---|---|
value | DisplayValue | Control the data value displayed at each data point |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$f + + | +true + | TRUE=Hide legend |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aCenter + + | +true + | True=Center each data point |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aTargets + + | Array of URL targets | |
+$aAlts + + | +null + | Alt texts for each CSIM point |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aLegend + + | Legend string | |
+$aCSIM + + | +"" + | URL for image map |
+$aCSIMAlt + + | +"" + | Alt text for image map |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWeight + + | +1 + | Line weight in pixels |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/PlotBand.html b/html/includes/jpgraph/docs/ref/PlotBand.html new file mode 100644 index 0000000000..5e50885eec --- /dev/null +++ b/html/includes/jpgraph/docs/ref/PlotBand.html @@ -0,0 +1,164 @@ +
PlotBand |
PlotBand() + SetDensity() + SetOrder() + ShowFrame() + |
+A Plot band is then added to the graph via the Graph::AddBand() method. +
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aDir + + | Direction of plot band | |
+$aPattern + + | Type of pattern | |
+$aMin + + | Min value for plot area | |
+$aMax + + | Max value for plot area | |
+$aColor + + | +"black" + | Color of pattern |
+$aWeight + + | +1 + | Line weight |
+$aDepth + + | +DEPTH_BACK + | Depth. Over or under the plot. |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aDens + + | Density [1,100] |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aDepth + + | Pattern Z-order parameter |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlag + + | +true + | True=Display border |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/PlotLine.html b/html/includes/jpgraph/docs/ref/PlotLine.html new file mode 100644 index 0000000000..4a448751e8 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/PlotLine.html @@ -0,0 +1,199 @@ +
PlotLine |
HideLegend() + PlotLine() + SetColor() + SetDirection() + SetLegend() + SetPosition() + SetWeight() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$f + + | True/False |
+
+ +
Argument | Default | Description |
---|---|---|
+$aDir + + | +HORIZONTAL + | Direction, HORIZONTAL or VERTICAL |
+$aPos + + | +0 + | Position |
+$aColor + + | +"black" + | Color |
+$aWeight + + | +1 + | Line weight |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aDir + + | Direction, horizontal or vertical line |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aLegend + + | Legend text | |
+$aCSIM + + | CSIM target | |
+$aCSIMAlt + + | CSIM Alt text |
+
+ +
Argument | Default | Description |
---|---|---|
+$aScalePosition + + | Scale position |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWeight + + | Line weight in pixels |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/PlotMark.html b/html/includes/jpgraph/docs/ref/PlotMark.html new file mode 100644 index 0000000000..607dd4b115 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/PlotMark.html @@ -0,0 +1,506 @@ +
PlotMark |
Hide() + SetCallback() + SetCallbackYX() + SetColor() + SetDefaultWidth() + SetFillColor() + SetSize() + SetType() + SetWeight() + SetWidth() + Show() + |
+There are a number of possible marker, circle, filled circle, square, filled square, star, triangle and so on. +See PlotMark::PlotMark() below for details on how to specify what mark. +
+Marks are accessed thtough the 'mark' property in line and scatter plot, i.e LinePlot::mark and ScatterPlot::mark. Marks in line plot are by default turned off. To enable marks use the construction $lineplot->mark->Show(). +
+You can modify the type of plotmarks by calling the SetType() method. Possible plot marks are: + +
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aHide + + | +true + | True=Hide plot mark |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFunc + + | Function name |
+The specified callback function gets called with the Y-value for the current plotmark. The callback function should return an array consisting of three elements +
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFunc + + | Callback function |
+The specified callback function gets called with the Y-value for the current plotmark. The callback function should return an array consisting of three elements +
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color |
Example
+
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFillColor + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWidth + + | WIdth of mark in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aType + + | Type of plotmark, shape or built-in image | |
+$aFileName + + | +'' + | Filename or country name depending on type of plotmark. See below. |
+$aScale + + | +1.0 + | Scaling of image |
+The following shape (the first class) plot marks are available + +
+For the second class (built-in images) the following table list the different images as well as what color they are available in. For the built-in images you specify the color with the second argument. +
+Note that some of the images are available in different sizes. The reason is that even though you can scale them by the third argument there is a visual degradation to scale an image larger than it's original size since some pixels needs to be interpolated. Reducing the size with a scale < 1.0 gives much better visual apperance. +
+The scaling works with both GD 1 and GD 2 but with GD 2 the quality of the scaling is much better. +
+Built-in images and available colors: +
Type | Description | Colors |
---|---|---|
MARK_IMG_PUSHPIN, MARK_IMG_SPUSHPIN | +Push-pin image | +'red','blue','green','pink','orange' | +
MARK_IMG_LPUSHPIN | +A larger Push-pin image | +'red','blue','green','pink','orange' | +
MARK_IMG_BALL, MARK_IMAGE_SBALL | +A round 3D rendered ball | +'bluegreen','cyan','darkgray','greengray', + 'gray','graypurple','green','greenblue','lightblue', + 'lightred','navy','orange','purple','red','yellow' | +
MARK_IMAGE_MBALL | +A medium sized round 3D rendered ball | ++'blue','bluegreen','brown','cyan', +'darkgray','greengray','gray','green', +'greenblue','lightblue','lightred', +'purple','red','white','yellow' + | +
MARK_IMAGE_LBALL | +A large sized round 3D rendered ball | ++'blue','lightblue','brown','darkgreen', +'green','purple','red','gray','yellow','silver','gray' + | +
MARK_IMAGE_SQUARE | +A 3D rendered square | +'bluegreen','blue','green', +'lightblue','orange','purple','red','yellow' | +
MARK_IMG_STAR | +A 3D rendered star image | +'bluegreen','lightblue','purple','blue','green','pink','red','yellow' | +
MARK_IMG_DIAMOND | +A 3D rendered diamond | +'lightblue','darkblue','gray', +'blue','pink','purple','red','yellow' | +
MARK_IMG_BEVEL | +A 3D rendered bevel style round ring | +'green','purple','orange','red','yellow' | +
+In terms of the builtin flags 230 countries are supported. The following table lists all available flags: +
+
1: 'Afghanistan' | 2: 'Republic of Angola' |
3: 'Republic of Albania' | 4: 'Alderney' |
5: 'Democratic and Popular Republic of Algeria' | 6: 'Territory of American Samoa' |
7: 'Principality of Andorra' | 8: 'British Overseas Territory of Anguilla' |
9: 'Antarctica' | 10: 'Argentine Republic' |
11: 'League of Arab States' | 12: 'Republic of Armenia' |
13: 'Aruba' | 14: 'Commonwealth of Australia' |
15: 'Republic of Austria' | 16: 'Azerbaijani Republic' |
17: 'British Antarctic Territory' | 18: 'Kingdom of Belgium' |
19: 'British Overseas Territory of Bermuda' | 20: 'Commonwealth of the Bahamas' |
21: 'Kingdom of Bahrain' | 22: 'Republic of Belarus' |
23: 'Republic of Bolivia' | 24: 'Belize' |
25: 'Republic of Benin' | 26: 'Republic of Botswana' |
27: 'Federative Republic of Brazil' | 28: 'Barbados' |
29: 'British Indian Ocean Territory' | 30: 'Brunei Darussalam' |
31: 'Republic of Burkina' | 32: 'Republic of Bulgaria' |
33: 'Republic of Burundi' | 34: 'Overseas Territory of the British Virgin Islands' |
35: 'Central African Republic' | 36: 'Kingdom of Cambodia' |
37: 'Republic of Cameroon' | 38: 'Dominion of Canada' |
39: 'Caribbean Community' | 40: 'Republic of Cape Verde' |
41: 'Republic of Chad' | 42: 'Republic of Chile' |
43: 'Territory of Christmas Island' | 44: 'Commonwealth of Independent States' |
45: 'Cook Islands' | 46: 'Republic of Colombia' |
47: 'Territory of Cocos Islands' | 48: 'Commonwealth' |
49: 'Union of the Comoros' | 50: 'Republic of the Congo' |
51: 'Republic of Costa Rica' | 52: 'Republic of Croatia' |
53: 'Republic of Cuba' | 54: 'British Overseas Territory of the Cayman Islands' |
55: 'Republic of Cyprus' | 56: 'The Czech Republic' |
57: 'Kingdom of Denmark' | 58: 'Republic of Djibouti' |
59: 'Commonwealth of Dominica' | 60: 'Dominican Republic' |
61: 'Republic of Ecuador' | 62: 'Arab Republic of Egypt' |
63: 'Republic of El Salvador' | 64: 'England' |
65: 'Republic of Equatorial Guinea' | 66: 'State of Eritrea' |
67: 'Republic of Estonia' | 68: 'Ethiopia' |
69: 'European Union' | 70: 'British Overseas Territory of the Falkland Islands' |
71: 'International Federation of Vexillological Associations' | 72: 'Republic of Fiji' |
73: 'Republic of Finland' | 74: 'Territory of French Polynesia' |
75: 'French Republic' | 76: 'Overseas Department of French Guiana' |
77: 'Gabonese Republic' | 78: 'Republic of the Gambia' |
79: 'Republic of Georgia' | 80: 'Federal Republic of Germany' |
81: 'Republic of Ghana' | 82: 'Gibraltar' |
83: 'Hellenic Republic' | 84: 'State of Grenada' |
85: 'Overseas Department of Guadeloupe' | 86: 'Territory of Guam' |
87: 'Republic of Guatemala' | 88: 'The Bailiwick of Guernsey' |
89: 'Republic of Guinea' | 90: 'Republic of Haiti' |
91: 'Hong Kong Special Administrative Region' | 92: 'Republic of Honduras' |
93: 'Republic of Hungary' | 94: 'Republic of Iceland' |
95: 'International Committee of the Red Cross' | 96: 'Republic of India' |
97: 'Republic of Indonesia' | 98: 'Republic of Iraq' |
99: 'Republic of Ireland' | 100: 'Organization of the Islamic Conference' |
101: 'Isle of Man' | 102: 'State of Israel' |
103: 'Italian Republic' | 104: 'Jamaica' |
105: 'Japan' | 106: 'The Bailiwick of Jersey' |
107: 'Hashemite Kingdom of Jordan' | 108: 'Republic of Kazakhstan' |
109: 'Republic of Kenya' | 110: 'Republic of Kiribati' |
111: 'State of Kuwait' | 112: 'Kyrgyz Republic' |
113: 'Republic of Latvia' | 114: 'Lebanese Republic' |
115: 'Kingdom of Lesotho' | 116: 'Republic of Liberia' |
117: 'Principality of Liechtenstein' | 118: 'Republic of Lithuania' |
119: 'Grand Duchy of Luxembourg' | 120: 'Macao Special Administrative Region' |
121: 'Republic of Macedonia' | 122: 'Republic of Madagascar' |
123: 'Republic of the Marshall Islands' | 124: 'Republic of Mali' |
125: 'Federation of Malaysia' | 126: 'Republic of Malta' |
127: 'Republic of Malawi' | 128: 'Overseas Department of Martinique' |
129: 'Islamic Republic of Mauritania' | 130: 'Territorial Collectivity of Mayotte' |
131: 'United Mexican States' | 132: 'Federated States of Micronesia' |
133: 'Midway Islands' | 134: 'Republic of Moldova' |
135: 'Principality of Monaco' | 136: 'Republic of Mongolia' |
137: 'British Overseas Territory of Montserrat' | 138: 'Kingdom of Morocco' |
139: 'Republic of Mozambique' | 140: 'Republic of Mauritius' |
141: 'Union of Myanmar' | 142: 'Republic of Namibia' |
143: 'North Atlantic Treaty Organization' | 144: 'Republic of Nauru' |
145: 'Turkish Republic of Northern Cyprus' | 146: 'Netherlands Antilles' |
147: 'Kingdom of Nepal' | 148: 'Kingdom of the Netherlands' |
149: 'Territory of Norfolk Island' | 150: 'Federal Republic of Nigeria' |
151: 'Republic of Nicaragua' | 152: 'Republic of Niger' |
153: 'Niue' | 154: 'Commonwealth of the Northern Mariana Islands' |
155: 'Province of Northern Ireland' | 156: 'Nordic Council' |
157: 'Kingdom of Norway' | 158: 'Territory of New Caledonia and Dependencies' |
159: 'New Zealand' | 160: 'Organization of American States' |
161: 'Organization of African Unity' | 162: 'International Olympic Committee' |
163: 'Sultanate of Oman' | 164: 'Islamic Republic of Pakistan' |
165: 'Republic of Palau' | 166: 'Independent State of Papua New Guinea' |
167: 'Republic of Paraguay' | 168: 'Republic of the Philippines' |
169: 'British Overseas Territory of the Pitcairn Islands' | 170: 'Republic of Poland' |
171: 'Republic of Portugal' | 172: 'Commonwealth of Puerto Rico' |
173: 'State of Qatar' | 174: 'Russian Federation' |
175: 'Republic of Rwanda' | 176: 'Kingdom of Saudi Arabia' |
177: 'Republic of San Marino' | 178: 'Nordic Sami Conference' |
179: 'Sark' | 180: 'Scotland' |
181: 'Principality of Seborga' | 182: 'Republic of Sierra Leone' |
183: 'Republic of Singapore' | 184: 'Republic of Korea' |
185: 'Republic of Slovenia' | 186: 'Somali Republic' |
187: 'Republic of Somaliland' | 188: 'Republic of South Africa' |
189: 'Solomon Islands' | 190: 'Kingdom of Spain' |
191: 'Secretariat of the Pacific Community' | 192: 'Democratic Socialist Republic of Sri Lanka' |
193: 'Saint Lucia' | 194: 'Republic of the Sudan' |
195: 'Republic of Suriname' | 196: 'Slovak Republic' |
197: 'Kingdom of Sweden' | 198: 'Swiss Confederation' |
199: 'Syrian Arab Republic' | 200: 'Kingdom of Swaziland' |
201: 'Republic of China' | 202: 'Republic of Tajikistan' |
203: 'United Republic of Tanzania' | 204: 'Kingdom of Thailand' |
205: 'Autonomous Region of Tibet' | 206: 'Turkmenistan' |
207: 'Togolese Republic' | 208: 'Tokelau' |
209: 'Kingdom of Tonga' | 210: 'Tristan da Cunha' |
211: 'Tromelin' | 212: 'Republic of Tunisia' |
213: 'Republic of Turkey' | 214: 'Tuvalu' |
215: 'United Arab Emirates' | 216: 'Republic of Uganda' |
217: 'Ukraine' | 218: 'United Kingdom of Great Britain' |
219: 'United Nations' | 220: 'United States of America' |
221: 'Oriental Republic of Uruguay' | 222: 'Virgin Islands of the United States' |
223: 'Republic of Uzbekistan' | 224: 'State of the Vatican City' |
225: 'Republic of Vanuatu' | 226: 'Bolivarian Republic of Venezuela' |
227: 'Republic of Yemen' | 228: 'Democratic Republic of Congo' |
229: 'Republic of Zimbabwe' | +
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWeight + + | Line weight |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWidth + + | Width in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aShow + + | +true + | True=Show plot marks |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/PolarAxis.html b/html/includes/jpgraph/docs/ref/PolarAxis.html new file mode 100644 index 0000000000..5c6bd138c1 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/PolarAxis.html @@ -0,0 +1,277 @@ +
PolarAxis | Axis |
HideTicks() + SetAngleFont() + SetAngleStep() + SetColor() + SetGridColor() + SetTickColors() + ShowAngleDegreeMark() + ShowAngleLabel() + ShowGrid() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlg + + | +true + | Hide radius tick marks |
+$aAngleFlg + + | +true + | Hide angle tick marks |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFontFam + + | Font family | |
+$aFontStyle + + | +FS_NORMAL + | Font style |
+$aFontSize + + | +10 + | Font size |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStep + + | Step in degrees |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color for radius axis | |
+$aRadColor + + | +'' + | Color for radius labels |
+$aAngleColor + + | +'' + | Color for angle labels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMajorColor + + | Major radius grid color | |
+$aMinorColor + + | +'' + | Minor radius grid color |
+$aAngleColor + + | +'' + | Angle grid color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aRadColor + + | Radius axis colors | |
+$aAngleColor + + | +'' + | Angle axis colors |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlg + + | +true + | True=Add mark |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlg + + | +true + | True=show labels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMajor + + | +true + | Show major radius grid lines |
+$aMinor + + | +false + | Show minor radius grid lines |
+$aAngle + + | +true + | Show angle grid lines |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/PolarGraph.html b/html/includes/jpgraph/docs/ref/PolarGraph.html new file mode 100644 index 0000000000..b5b6b2c59f --- /dev/null +++ b/html/includes/jpgraph/docs/ref/PolarGraph.html @@ -0,0 +1,257 @@ +
PolarGraph | Graph |
PolarGraph() + Set90AndMargin() + SetDensity() + SetPlotSize() + SetScale() + SetType() + Stroke() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aWidth + + | +300 + | Width (in pixels) |
+$aHeight + + | +200 + | Height (in pixels) |
+$aCachedName + + | +"" + | Cache name |
+$aTimeOut + + | +0 + | Cache timeout |
+$aInline + + | +true + | Inline flag (DEPRECATED) |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$lm + + | +0 + | Left margin |
+$rm + + | +0 + | Right Margin |
+$tm + + | +0 + | Top margin |
+$bm + + | +0 + | Bottom margin |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aDense + + | Density |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$w + + | Width | |
+$h + + | Height |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aScale + + | Linear "lin" or logarithmic "log" scale | |
+$rmax + + | +0 + | Manual maximum value |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aType + + | Type |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStrokeFileName + + | +"" + | File name |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/PolarPlot.html b/html/includes/jpgraph/docs/ref/PolarPlot.html new file mode 100644 index 0000000000..85036293e9 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/PolarPlot.html @@ -0,0 +1,165 @@ +
PolarPlot |
PolarPlot() + SetColor() + SetCSIMTargets() + SetFillColor() + SetLegend() + SetWeight() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aData + + | Data array |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Line Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aTargets + + | URL targets | |
+$aAlts + + | +null + | Alt texts |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Fill color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aLegend + + | Legend text | |
+$aCSIM + + | +"" + | URL target for this legend |
+$aCSIMAlt + + | +"" + | ALT text for this legend |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWeight + + | Line weight |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/Progress.html b/html/includes/jpgraph/docs/ref/Progress.html new file mode 100644 index 0000000000..2ad2c8fdea --- /dev/null +++ b/html/includes/jpgraph/docs/ref/Progress.html @@ -0,0 +1,102 @@ +
Progress |
Set() + SetFillColor() + SetPattern() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aProg + + | Progress in percent (0-1) |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aPattern + + | Pattern | |
+$aColor + + | +"blue" + | Color |
+$aDensity + + | +98 + | Density |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/RadarAxis.html b/html/includes/jpgraph/docs/ref/RadarAxis.html new file mode 100644 index 0000000000..5c6132c8f7 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/RadarAxis.html @@ -0,0 +1,10 @@ +
RadarAxis | Axis |
+
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/RadarGraph.html b/html/includes/jpgraph/docs/ref/RadarGraph.html new file mode 100644 index 0000000000..bd1e56561b --- /dev/null +++ b/html/includes/jpgraph/docs/ref/RadarGraph.html @@ -0,0 +1,385 @@ +
+
+
+ +
Argument | Default | Description |
---|---|---|
+&$splot + + | Plot to add (instance of SpiderPlot) |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlag + + | +true + | True=Hide tick marks |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$width + + | +300 + | Imaghe width |
+$height + + | +200 + | Image Height |
+$cachedName + + | +"" + | Cache file name |
+$timeout + + | +0 + | Cache timout (in minutes) |
+$inline + + | +1 + | Inline image |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$px + + | Fraction of width | |
+$py + + | +0.5 + | Fraction of height |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$c + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aSize + + | Fraction of image size |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$px + + | Fraction of width | |
+$py + + | +0.5 + | Fraction of height |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$axtype + + | Axis type | |
+$ymin + + | +1 + | Min Y-value |
+$ymax + + | +1 + | Max Y-value |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aSize + + | Fraction of image size |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$densy + + | +TICKD_NORMAL + | Density |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$title + + | Array of titles |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlag + + | +true + | True=Show minor tick marks |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStrokeFileName + + | +"" + | Filename |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$f + + | +true + | True=Hide tick marks |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/RadarGrid.html b/html/includes/jpgraph/docs/ref/RadarGrid.html new file mode 100644 index 0000000000..69aa9d6db5 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/RadarGrid.html @@ -0,0 +1,10 @@ +
RadarGrid | Grid |
+
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/RadarLinearTicks.html b/html/includes/jpgraph/docs/ref/RadarLinearTicks.html new file mode 100644 index 0000000000..df7f607c46 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/RadarLinearTicks.html @@ -0,0 +1,10 @@ +
RadarLinearTicks | LinearTicks |
+
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/RadarLogTicks.html b/html/includes/jpgraph/docs/ref/RadarLogTicks.html new file mode 100644 index 0000000000..7f9fb8372e --- /dev/null +++ b/html/includes/jpgraph/docs/ref/RadarLogTicks.html @@ -0,0 +1,10 @@ +
RadarLogTicks | Ticks |
+
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/RadarPlot.html b/html/includes/jpgraph/docs/ref/RadarPlot.html new file mode 100644 index 0000000000..15f1830f6b --- /dev/null +++ b/html/includes/jpgraph/docs/ref/RadarPlot.html @@ -0,0 +1,181 @@ +
RadarPlot |
RadarPlot() + SetColor() + SetFill() + SetFillColor() + SetLegend() + SetLineStyle() + SetLineWeight() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$data + + | Data array |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color for line | |
+$aFillColor + + | +false + | Fill color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$f + + | +true + | True=Use fill color and fill plot |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$legend + + | Legend string |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aStyle + + | Line style |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$w + + | Line weight in pixels |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/RotImage.html b/html/includes/jpgraph/docs/ref/RotImage.html new file mode 100644 index 0000000000..abf791e964 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/RotImage.html @@ -0,0 +1,137 @@ +
+
+
+ +
Argument | Default | Description |
---|---|---|
+$a + + | Angle in degrees |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$dx + + | Specify rotation center X | |
+$dy + + | Specify rotation center Y |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$lm + + | Left margin | |
+$rm + + | Right margin | |
+$tm + + | Top margin | |
+$bm + + | Bottom margin |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$dx + + | Horizontal translation | |
+$dy + + | Vertical translation |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/ScatterPlot.html b/html/includes/jpgraph/docs/ref/ScatterPlot.html new file mode 100644 index 0000000000..b20320a3c1 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/ScatterPlot.html @@ -0,0 +1,102 @@ +
ScatterPlot | Plot |
ScatterPlot() + SetImpuls() + SetLinkPoints() + |
+The marks can also be connected with lines by calling the method SetLinkPoints()
+
+
+ +
Argument | Default | Description |
---|---|---|
+$datay + + | Y-data array | |
+$datax + + | +false + | X-data array |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$f + + | +true + | True=Use impuls type |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlag + + | +true + | True=Link scatter points |
+$aColor + + | +"black" + | Color of line |
+$aWeight + + | +1 + | Line width |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/Shape.html b/html/includes/jpgraph/docs/ref/Shape.html new file mode 100644 index 0000000000..6facfadc2a --- /dev/null +++ b/html/includes/jpgraph/docs/ref/Shape.html @@ -0,0 +1,562 @@ +
+
+
+ +
Argument | Default | Description |
---|---|---|
+$p + + | Array with control points | |
+$aSteps + + | +40 + | Number of line segments in curve |
+(0,1) x0,y0 (First point on curver)
+(2,3) x,y, (Control point 1)
+(4,5) x,y, (Control point 2)
+(6,7) x,y, (End point of curve)
+
+See example in canvasbezierex1.php
+
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$x1 + + | Center X-coordinate | |
+$y1 + + | Center Y-coordinate | |
+$r + + | Radius |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$x1 + + | Center X-coordinate | |
+$y1 + + | Center Y-coordinate | |
+$r + + | Radius |
+Note: If you are using GD1.xx you will see moire-patterns in large circles. This is due to the lack of a proper filled circle function in GD 1.xx. Using GD 2.xx will avoid this problem.
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$p + + | Polygon array |
+
+ +
Argument | Default | Description |
---|---|---|
+$x1 + + | Top left X | |
+$y1 + + | Top left Y | |
+$x2 + + | Bottom right X | |
+$y2 + + | Bottom right Y |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$x1 + + | Top left X | |
+$y1 + + | Top left Y | |
+$x2 + + | Bottom right X | |
+$y2 + + | Bottom right Y | |
+$r + + | +null + | Corner radius |
+
+ +
Argument | Default | Description |
---|---|---|
+$xt + + | Top left X | |
+$yt + + | Top left Y | |
+$w + + | Width | |
+$h + + | Height | |
+$iw + + | +0 + | Indented width |
+$ih + + | +0 + | Indeted height |
+$aCorner + + | +3 + | Corner to indent |
+$aFillColor + + | +"" + | Fill color |
+$r + + | +4 + | Corner radius |
+The corners (as used in the $aCorner) are numbered as
+0=Top left, 1=top right, 2=bottom right, 3=bottom left
+
+
+
+ +
Argument | Default | Description |
---|---|---|
+$x1 + + | X1 | |
+$y1 + + | Y1 | |
+$x2 + + | X2 | |
+$y2 + + | Y2 |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$p + + | Array of points in polygon | |
+$aClosed + + | +false + | No description available |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$x1 + + | Top left X | |
+$y1 + + | Top left Y | |
+$x2 + + | Bottom right X | |
+$y2 + + | Bottom right Y |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$x1 + + | Top left X | |
+$y1 + + | Top left Y | |
+$x2 + + | Bottom right X | |
+$y2 + + | Bottom right Y | |
+$r + + | +null + | Corner radius |
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color specification |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$halign + + | Horizontal position for basepoint | |
+$valign + + | +"bottom" + | Vertical position for base point |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$x1 + + | Top left X | |
+$y1 + + | Top left Y | |
+$x2 + + | Bottom right X | |
+$y2 + + | Bottom right Y | |
+$fcolor + + | +false + | Fill color |
+$shadow_width + + | +null + | Shadow width |
+$shadow_color + + | +array(102,102,102) + | Shadow color |
+
+ +
Argument | Default | Description |
---|---|---|
+&$aGraph + + | Canvas graph | |
+&$scale + + | Canvas scale |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/Spline.html b/html/includes/jpgraph/docs/ref/Spline.html new file mode 100644 index 0000000000..21d98eb3f0 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/Spline.html @@ -0,0 +1,70 @@ +
Spline |
Get() + Spline() + |
+This class doesn't draw any graphs by itself it is only used to generate a new set of data points representing the smooth line from the input which are the control lines for the cubic spline. +
+The principle of using this class is that you first create an instance of this class and giving it the X,Y values for your control points. +
+You can then get back an interpolated smooth dataset by calling the Get() method. This method takeas as argument how many data points you want the interpolated graph to have. +
+Technical note: The spline is constructed with natural 2:nd derivates at the start and end points of the line. +
+
+
+ +
Argument | Default | Description |
---|---|---|
+$num + + | +50 + | Number of data points |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$xdata + + | Control points. X-coordinates | |
+$ydata + + | Control points. Y-coordinates |
+Technical note: The spline is constructed with natural 2:nd derivates at the start and end point.
+
+
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/StockPlot.html b/html/includes/jpgraph/docs/ref/StockPlot.html new file mode 100644 index 0000000000..5c27b9e7a8 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/StockPlot.html @@ -0,0 +1,135 @@ +
StockPlot | Plot |
HideEndLines() + SetColor() + SetWidth() + StockPlot() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aHide + + | +true + | Flag true=show end lines |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Line color for positive bars | |
+$aColor1 + + | +'white' + | Fill color for positive bars |
+$aColor2 + + | +'darkred' + | Line color for negative bars |
+$aColor3 + + | +'darkred' + | Fill color for negative bars |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWidth + + | Width in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+&$datay + + | Y data array | |
+$datax + + | +false + | X data array |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/SuperScriptText.html b/html/includes/jpgraph/docs/ref/SuperScriptText.html new file mode 100644 index 0000000000..29204a012c --- /dev/null +++ b/html/includes/jpgraph/docs/ref/SuperScriptText.html @@ -0,0 +1,190 @@ +
SuperScriptText | Text |
FromReal() + GetFontHeight() + GetTextHeight() + GetWidth() + Set() + SetSuperFont() + SuperScriptText() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aVal + + | Real value to be used | |
+$aPrecision + + | +2 + | Precision (number of digits) to be printed |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+&$aImg + + | Image context |
+
+ +
Argument | Default | Description |
---|---|---|
+&$aImg + + | Image context |
+
+ +
Argument | Default | Description |
---|---|---|
+&$aImg + + | Image context |
+
+ +
Argument | Default | Description |
---|---|---|
+$aTxt + + | Mantissa | |
+$aSuper + + | +"" + | Exponent |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFontFam + + | Font family | |
+$aFontStyle + + | +FS_NORMAL + | Font style |
+$aFontSize + + | +8 + | Font size |
+
+ +
Argument | Default | Description |
---|---|---|
+$aTxt + + | +"" + | Mantissa text |
+$aSuper + + | +"" + | Suoerscript text |
+$aXAbsPos + + | +0 + | X-position (in pixels) |
+$aYAbsPos + + | +0 + | Y-position (in pixels) |
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/Text.html b/html/includes/jpgraph/docs/ref/Text.html new file mode 100644 index 0000000000..c7faa3cf4c --- /dev/null +++ b/html/includes/jpgraph/docs/ref/Text.html @@ -0,0 +1,777 @@ +
Text |
Align() + Center() + GetFontHeight() + GetTextHeight() + GetWidth() + Hide() + ParagraphAlign() + Pos() + Set() + SetAlign() + SetAngle() + SetBox() + SetColor() + SetCSIMTarget() + SetFont() + SetMargin() + SetOrientation() + SetParagraphAlign() + SetPos() + SetScalePos() + SetShadow() + SetWordWrap() + Show() + Text() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aHAlign + + | Horizontal alignment | |
+$aVAlign + + | +"top" + | Vertical alignment |
+$aParagraphAlign + + | +"" + | Paragraph alignment |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aLeft + + | Left corner X-coordinate | |
+$aRight + + | Right corner X-coordinate | |
+$aYAbsPos + + | +false + | The common Y-coodinate |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+&$aImg + + | No description available |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+&$aImg + + | No description available |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+&$aImg + + | No description available |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aHide + + | +true + | True=Hide text |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aAlign + + | Alignment for a multiline text |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aXAbsPos + + | +0 + | X-position absolute position |
+$aYAbsPos + + | +0 + | Y-position absolute position |
+$aHAlign + + | +"left" + | Horizontal alignment |
+$aVAlign + + | +"top" + | Vertical alignment |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aTxt + + | Text string |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aHAlign + + | Horizontal anchor point | |
+$aVAlign + + | +"top" + | Vertical anchor point |
+$aParagraphAlign + + | +"" + | Paragraph alignment |
+
+ +
Argument | Default | Description |
---|---|---|
+$aAngle + + | Angle in degrees |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFrameColor + + | +array(255,255,255) + | Color for text background |
+$aBorderColor + + | +array(0,0,0) + | Color for border around text |
+$aShadowColor + + | +false + | Color for shadow |
+$aCornerRadius + + | +4 + | Corner radius for rectangle |
+$aShadowWidth + + | +3 + | Drop shadow width |
+To use the old style of stright corners specify a corner radius of 0.
+
+
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aTarget + + | Target URL | |
+$aAlt + + | +null + | Alt-tag text |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFamily + + | Font family | |
+$aStyle + + | +FS_NORMAL + | Font style |
+$aSize + + | +10 + | Font size |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMarg + + | Margin in pixels |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aDirection + + | +0 + | Orientation of text in degrees |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aAlign + + | Horizontal alignment |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aXAbsPos + + | +0 + | X position |
+$aYAbsPos + + | +0 + | Y position |
+$aHAlign + + | +"left" + | Horizontal align |
+$aVAlign + + | +"top" + | Vertical align |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aX + + | X-position | |
+$aY + + | Y-position |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aShadowColor + + | +'darkgray' + | Shadow color |
+$aShadowWidth + + | +3 + | Shadow width (in pixels) |
+Note: You can also specify the shadow directly in the SetBox() call. This method was added to make Text more like other graph objects which have a SetShadow() method.
+
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aCol + + | Number of chars in column |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aShow + + | +true + | True=Display text |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aTxt + + | +'' + | Text string |
+$aXAbsPos + + | +0 + | X-coordinate |
+$aYAbsPos + + | +0 + | Y-coordinate |
Example
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/TextProperty.html b/html/includes/jpgraph/docs/ref/TextProperty.html new file mode 100644 index 0000000000..f2fcbd8797 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/TextProperty.html @@ -0,0 +1,189 @@ +
TextProperty |
Align() + Set() + SetAlign() + SetColor() + SetFont() + Show() + |
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aHAlign + + | Horizontal alignment | |
+$aVAlign + + | +"bottom" + | Vertical alignment |
+
+ +
Argument | Default | Description |
---|---|---|
+$aTxt + + | Text string |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aHAlign + + | Horizontal alignment | |
+$aVAlign + + | +"bottom" + | Vertical alignment |
+
+ +
Argument | Default | Description |
---|---|---|
+$aColor + + | Color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFFamily + + | Font family | |
+$aFStyle + + | +FS_NORMAL + | Font style |
+$aFSize + + | +10 + | Font size |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aShow + + | +true + | True=Show text |
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/Ticks.html b/html/includes/jpgraph/docs/ref/Ticks.html new file mode 100644 index 0000000000..3855d6c170 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/Ticks.html @@ -0,0 +1,306 @@ +
+
+
+ +
Argument | Default | Description |
---|---|---|
+$aMaj + + | Distance (world coordinates) for major tick marks | |
+$aMin + + | Distance (world coordinates) for minor tick marks |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMajorColor + + | Major tick mark color | |
+$aMinorColor + + | +"" + | Minor tick mark color |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aCallbackFuncName + + | name of function |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aFormatString + + | Specify a printf() style format string | |
+$aDate + + | +FALSE + | No description available |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aSide + + | Side |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aMajSize + + | Major tick size | |
+$aMinSize + + | +3 + | Minor tick size |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aWeight + + | Width (in pixels) |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aHide + + | +true + | True=Hide the vbery first tick mark on the axis |
Example
+
+ +
Argument | Default | Description |
---|---|---|
+$aHide + + | +true + | True=Hide the last tick mark |
+
+ +
Argument | Default | Description |
---|---|---|
+$aHide + + | +true + | True=Hide minor tick marks |
+
+ +
Argument | Default | Description |
---|---|---|
+$aHide + + | +true + | True=Hide major tick marks |
+
+ +
Argument | Default | Description |
---|---|---|
+$aFlag + + | +true + | True=Hide zero-label |
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/class_toc.html b/html/includes/jpgraph/docs/ref/class_toc.html new file mode 100644 index 0000000000..1ba80cd4e5 --- /dev/null +++ b/html/includes/jpgraph/docs/ref/class_toc.html @@ -0,0 +1,618 @@ +JpGraph
+
\ No newline at end of file diff --git a/html/includes/jpgraph/docs/ref/index.html b/html/includes/jpgraph/docs/ref/index.html new file mode 100644 index 0000000000..40b98a967d --- /dev/null +++ b/html/includes/jpgraph/docs/ref/index.html @@ -0,0 +1,10 @@ + +
+ +JpGraph |
+This version does not include private methods & classes
Generated at 18 Mar 2007 at 13:32
+
This software library is released under QPL 1.0
© 2002 - 2005 Aditus Consulting. All rights reserved.
"; + echo "
Done.
"; + } +} + +$type=@$HTTP_GET_VARS['t']; +if( empty($type) ) { + $type=1; +} + +$driver = new TestDriver($type); +$driver->Run(); + +?> diff --git a/html/includes/jpgraph/src/Examples/text-example1.php b/html/includes/jpgraph/src/Examples/text-example1.php new file mode 100644 index 0000000000..a8ac965259 --- /dev/null +++ b/html/includes/jpgraph/src/Examples/text-example1.php @@ -0,0 +1,18 @@ +Pos(0.05,0.5); +$t1->SetOrientation("h"); +$t1->SetFont(FF_FONT1,FS_NORMAL); +$t1->SetBox("white","black",'gray'); +$t1->SetColor("black"); +$graph->AddText($t1); + +$graph->Stroke(); + +?> \ No newline at end of file diff --git a/html/includes/jpgraph/src/Examples/text-example2.php b/html/includes/jpgraph/src/Examples/text-example2.php new file mode 100644 index 0000000000..4bfa9616f7 --- /dev/null +++ b/html/includes/jpgraph/src/Examples/text-example2.php @@ -0,0 +1,18 @@ +Pos(0.05,100); +$t1->SetFont(FF_FONT1,FS_NORMAL); +$t1->SetBox("white","black",true); +$t1->ParagraphAlign("right"); +$t1->SetColor("black"); +$graph->AddText($t1); + +$graph->Stroke(); + +?> \ No newline at end of file diff --git a/html/includes/jpgraph/src/Examples/textalignex1.php b/html/includes/jpgraph/src/Examples/textalignex1.php new file mode 100644 index 0000000000..84d9b3c537 --- /dev/null +++ b/html/includes/jpgraph/src/Examples/textalignex1.php @@ -0,0 +1,77 @@ +img; +$aImg->SetFont(FF_ARIAL,FS_NORMAL,16); +$tw=$aImg->GetBBoxWidth($txt,$angle); +$th=$aImg->GetBBoxHeight($txt,$angle); + +$aImg->SetFont(FF_ARIAL,FS_NORMAL,11); +$ch=$aImg->GetBBoxHeight($caption); + +// Calculate needed height for the image +$h = 3*$th+2*$ym + $ch; +$g = new CanvasGraph($w,$h); +$aImg = $g->img; + +$prof = array('left','top', + 'center','top', + 'right','top', + 'left','center', + 'center','center', + 'right','center', + 'left','bottom', + 'center','bottom', + 'right','bottom'); +$n = count($prof)/2; + +for( $i=0,$r=0,$c=0; $i < $n; ++$i ) { + $x = $c*($tw+$xm)+$xm/2; + $y = $r*($th+$ym)+$ym/2-10; + $aImg->SetColor('blue'); + $aImg->SetTextAlign($prof[$i*2],$prof[$i*2+1]); + $aImg->SetFont(FF_ARIAL,FS_NORMAL,16); + $aImg->StrokeText($x,$y,$txt,$angle,"left",true); + + $aImg->SetColor('black'); + $aImg->SetFont(FF_FONT1,FS_BOLD); + $aImg->SetTextAlign('center','top'); + $align = sprintf('("%s","%s")',$prof[$i*2],$prof[$i*2+1]); + $aImg->StrokeText($c*($tw/2+$xm)+$xm/2+$tw/2,$r*($th/2+$ym)+$th+$ym/2-4,$align); + $c++; + if( $c==3 ) { + $c=0;$r++; + } +} + +$aImg->SetTextAlign('center','bottom'); +$aImg->SetFont(FF_ARIAL,FS_ITALIC,11); +$aImg->StrokeText($w/2,$h-10,$caption,0,'left'); + +$aImg->SetColor('navy'); +$aImg->Rectangle(0,0,$w-1,$h-1); + +$g->Stroke(); + +?> + diff --git a/html/includes/jpgraph/src/Examples/tiger_bkg.gif b/html/includes/jpgraph/src/Examples/tiger_bkg.gif new file mode 100644 index 0000000000..3faaa174dc Binary files /dev/null and b/html/includes/jpgraph/src/Examples/tiger_bkg.gif differ diff --git a/html/includes/jpgraph/src/Examples/tiger_bkg.jpg b/html/includes/jpgraph/src/Examples/tiger_bkg.jpg new file mode 100644 index 0000000000..43d45f30e8 Binary files /dev/null and b/html/includes/jpgraph/src/Examples/tiger_bkg.jpg differ diff --git a/html/includes/jpgraph/src/Examples/tiger_bkg.png b/html/includes/jpgraph/src/Examples/tiger_bkg.png new file mode 100644 index 0000000000..78d8e25b0c Binary files /dev/null and b/html/includes/jpgraph/src/Examples/tiger_bkg.png differ diff --git a/html/includes/jpgraph/src/Examples/timestampex01.php b/html/includes/jpgraph/src/Examples/timestampex01.php new file mode 100644 index 0000000000..62142a98ab --- /dev/null +++ b/html/includes/jpgraph/src/Examples/timestampex01.php @@ -0,0 +1,59 @@ +SetMargin(40,20,30,50); + +// Now specify the X-scale explicit but let the Y-scale be auto-scaled +$graph->SetScale("intlin",0,0,$adjstart,$adjend); +$graph->title->Set("Example on TimeStamp Callback"); + +// Setup the callback and adjust the angle of the labels +$graph->xaxis->SetLabelFormatCallback('TimeCallback'); +$graph->xaxis->SetLabelAngle(90); + +// Set the labels every 5min (i.e. 300seconds) and minor ticks every minute +$graph->xaxis->scale->ticks->Set(300,60); + +$line = new LinePlot($data,$xdata); +$line->SetColor('lightblue'); +$graph->Add($line); + +$graph->Stroke(); +?> diff --git a/html/includes/jpgraph/src/Examples/titlecsimex01.php b/html/includes/jpgraph/src/Examples/titlecsimex01.php new file mode 100644 index 0000000000..e384a4aaeb --- /dev/null +++ b/html/includes/jpgraph/src/Examples/titlecsimex01.php @@ -0,0 +1,62 @@ +SetScale("textlin"); +$graph->SetMargin(50,80,20,40); +$graph->yaxis->SetTitleMargin(30); +$graph->yaxis->scale->SetGrace(30); +$graph->SetShadow(); + + +// Create a bar pot +$bplot = new BarPlot($datay); + +// Create targets for the bars image maps. One for each column +$targ=array("bar_clsmex1.php#1","bar_clsmex1.php#2","bar_clsmex1.php#3","bar_clsmex1.php#4","bar_clsmex1.php#5","bar_clsmex1.php#6"); +$alts=array("val=%d","val=%d","val=%d","val=%d","val=%d","val=%d"); +$bplot->SetCSIMTargets($targ,$alts); +$bplot->SetFillColor("orange"); +$bplot->SetLegend('Year 2001 %%','#kalle ','%s'); + +// Display the values on top of each bar +$bplot->SetShadow(); +$bplot->value->SetFormat(" $ %2.1f",70); +$bplot->value->SetFont(FF_ARIAL,FS_NORMAL,9); +$bplot->value->SetColor("blue"); +$bplot->value->Show(); + +$graph->Add($bplot); + +// Create a big "button" that has an image map action +$txt1 = new Text("A simple text with\ntwo rows"); +$txt1->SetFont(FF_ARIAL); +$txt1->SetBox('lightblue','black','white@1',5); +$txt1->SetParagraphAlign('center'); +$txt1->SetPos(40,50); +$txt1->SetCSIMTarget('#88','Text element'); +$graph->Add($txt1); + +// Add image map to the graph title as well (you can do this to the +// sub- and subsub-title as well) +$graph->title->Set("Image maps barex1"); +$graph->title->SetFont(FF_FONT1,FS_BOLD); +$graph->title->SetCSIMTarget('#45','Title for Bar'); +$graph->xaxis->title->Set("X-title"); +$graph->yaxis->title->Set("Y-title"); + +// Setup the axis title image map and font style +$graph->yaxis->title->SetFont(FF_FONT2,FS_BOLD); +$graph->yaxis->title->SetCSIMTarget('#55','Y-axis title'); +$graph->xaxis->title->SetFont(FF_FONT2,FS_BOLD); +$graph->xaxis->title->SetCSIMTarget('#55','X-axis title'); + +// Send back the HTML page which will call this script again +// to retrieve the image. +$graph->StrokeCSIM(); + +?> diff --git a/html/includes/jpgraph/src/Examples/topxaxisex1.php b/html/includes/jpgraph/src/Examples/topxaxisex1.php new file mode 100644 index 0000000000..956fcbf7a0 --- /dev/null +++ b/html/includes/jpgraph/src/Examples/topxaxisex1.php @@ -0,0 +1,49 @@ +img->SetMargin(40,40,40,20); + +$graph->SetScale("linlin"); +$graph->SetShadow(); +$graph->title->Set("Top X-axis"); + +// Start at 0 +$graph->yscale->SetAutoMin(0); + +// Add some air around the Y-scale +$graph->yscale->SetGrace(100); + +// Use built in font +$graph->title->SetFont(FF_FONT1,FS_BOLD); + +// Adjust the X-axis +$graph->xaxis->SetPos("max"); +$graph->xaxis->SetLabelSide(SIDE_UP); +$graph->xaxis->SetTickSide(SIDE_DOWN); + +// Create the line plot +$p1 = new LinePlot($datay); +$p1->SetColor("blue"); + +// Specify marks for the line plots +$p1->mark->SetType(MARK_FILLEDCIRCLE); +$p1->mark->SetFillColor("red"); +$p1->mark->SetWidth(4); + +// Show values +$p1->value->Show(); + +// Add lineplot to graph +$graph->Add($p1); + +// Output line +$graph->Stroke(); + +?> + + diff --git a/html/includes/jpgraph/src/Examples/worldmap1.jpg b/html/includes/jpgraph/src/Examples/worldmap1.jpg new file mode 100644 index 0000000000..caa7c14045 Binary files /dev/null and b/html/includes/jpgraph/src/Examples/worldmap1.jpg differ diff --git a/html/includes/jpgraph/src/flags.dat b/html/includes/jpgraph/src/flags.dat new file mode 100644 index 0000000000..1cd2e72345 Binary files /dev/null and b/html/includes/jpgraph/src/flags.dat differ diff --git a/html/includes/jpgraph/src/flags_thumb100x100.dat b/html/includes/jpgraph/src/flags_thumb100x100.dat new file mode 100644 index 0000000000..545e7ade58 Binary files /dev/null and b/html/includes/jpgraph/src/flags_thumb100x100.dat differ diff --git a/html/includes/jpgraph/src/flags_thumb35x35.dat b/html/includes/jpgraph/src/flags_thumb35x35.dat new file mode 100644 index 0000000000..7335011ec9 Binary files /dev/null and b/html/includes/jpgraph/src/flags_thumb35x35.dat differ diff --git a/html/includes/jpgraph/src/flags_thumb60x60.dat b/html/includes/jpgraph/src/flags_thumb60x60.dat new file mode 100644 index 0000000000..6107d084eb Binary files /dev/null and b/html/includes/jpgraph/src/flags_thumb60x60.dat differ diff --git a/html/includes/jpgraph/src/gd_image.inc.php b/html/includes/jpgraph/src/gd_image.inc.php new file mode 100644 index 0000000000..00ee97db04 --- /dev/null +++ b/html/includes/jpgraph/src/gd_image.inc.php @@ -0,0 +1,2161 @@ +img = &$aImg; + + // Conversion array between color names and RGB + $this->rgb_table = array( + "aqua"=> array(0,255,255), + "lime"=> array(0,255,0), + "teal"=> array(0,128,128), + "whitesmoke"=>array(245,245,245), + "gainsboro"=>array(220,220,220), + "oldlace"=>array(253,245,230), + "linen"=>array(250,240,230), + "antiquewhite"=>array(250,235,215), + "papayawhip"=>array(255,239,213), + "blanchedalmond"=>array(255,235,205), + "bisque"=>array(255,228,196), + "peachpuff"=>array(255,218,185), + "navajowhite"=>array(255,222,173), + "moccasin"=>array(255,228,181), + "cornsilk"=>array(255,248,220), + "ivory"=>array(255,255,240), + "lemonchiffon"=>array(255,250,205), + "seashell"=>array(255,245,238), + "mintcream"=>array(245,255,250), + "azure"=>array(240,255,255), + "aliceblue"=>array(240,248,255), + "lavender"=>array(230,230,250), + "lavenderblush"=>array(255,240,245), + "mistyrose"=>array(255,228,225), + "white"=>array(255,255,255), + "black"=>array(0,0,0), + "darkslategray"=>array(47,79,79), + "dimgray"=>array(105,105,105), + "slategray"=>array(112,128,144), + "lightslategray"=>array(119,136,153), + "gray"=>array(190,190,190), + "lightgray"=>array(211,211,211), + "midnightblue"=>array(25,25,112), + "navy"=>array(0,0,128), + "cornflowerblue"=>array(100,149,237), + "darkslateblue"=>array(72,61,139), + "slateblue"=>array(106,90,205), + "mediumslateblue"=>array(123,104,238), + "lightslateblue"=>array(132,112,255), + "mediumblue"=>array(0,0,205), + "royalblue"=>array(65,105,225), + "blue"=>array(0,0,255), + "dodgerblue"=>array(30,144,255), + "deepskyblue"=>array(0,191,255), + "skyblue"=>array(135,206,235), + "lightskyblue"=>array(135,206,250), + "steelblue"=>array(70,130,180), + "lightred"=>array(211,167,168), + "lightsteelblue"=>array(176,196,222), + "lightblue"=>array(173,216,230), + "powderblue"=>array(176,224,230), + "paleturquoise"=>array(175,238,238), + "darkturquoise"=>array(0,206,209), + "mediumturquoise"=>array(72,209,204), + "turquoise"=>array(64,224,208), + "cyan"=>array(0,255,255), + "lightcyan"=>array(224,255,255), + "cadetblue"=>array(95,158,160), + "mediumaquamarine"=>array(102,205,170), + "aquamarine"=>array(127,255,212), + "darkgreen"=>array(0,100,0), + "darkolivegreen"=>array(85,107,47), + "darkseagreen"=>array(143,188,143), + "seagreen"=>array(46,139,87), + "mediumseagreen"=>array(60,179,113), + "lightseagreen"=>array(32,178,170), + "palegreen"=>array(152,251,152), + "springgreen"=>array(0,255,127), + "lawngreen"=>array(124,252,0), + "green"=>array(0,255,0), + "chartreuse"=>array(127,255,0), + "mediumspringgreen"=>array(0,250,154), + "greenyellow"=>array(173,255,47), + "limegreen"=>array(50,205,50), + "yellowgreen"=>array(154,205,50), + "forestgreen"=>array(34,139,34), + "olivedrab"=>array(107,142,35), + "darkkhaki"=>array(189,183,107), + "khaki"=>array(240,230,140), + "palegoldenrod"=>array(238,232,170), + "lightgoldenrodyellow"=>array(250,250,210), + "lightyellow"=>array(255,255,200), + "yellow"=>array(255,255,0), + "gold"=>array(255,215,0), + "lightgoldenrod"=>array(238,221,130), + "goldenrod"=>array(218,165,32), + "darkgoldenrod"=>array(184,134,11), + "rosybrown"=>array(188,143,143), + "indianred"=>array(205,92,92), + "saddlebrown"=>array(139,69,19), + "sienna"=>array(160,82,45), + "peru"=>array(205,133,63), + "burlywood"=>array(222,184,135), + "beige"=>array(245,245,220), + "wheat"=>array(245,222,179), + "sandybrown"=>array(244,164,96), + "tan"=>array(210,180,140), + "chocolate"=>array(210,105,30), + "firebrick"=>array(178,34,34), + "brown"=>array(165,42,42), + "darksalmon"=>array(233,150,122), + "salmon"=>array(250,128,114), + "lightsalmon"=>array(255,160,122), + "orange"=>array(255,165,0), + "darkorange"=>array(255,140,0), + "coral"=>array(255,127,80), + "lightcoral"=>array(240,128,128), + "tomato"=>array(255,99,71), + "orangered"=>array(255,69,0), + "red"=>array(255,0,0), + "hotpink"=>array(255,105,180), + "deeppink"=>array(255,20,147), + "pink"=>array(255,192,203), + "lightpink"=>array(255,182,193), + "palevioletred"=>array(219,112,147), + "maroon"=>array(176,48,96), + "mediumvioletred"=>array(199,21,133), + "violetred"=>array(208,32,144), + "magenta"=>array(255,0,255), + "violet"=>array(238,130,238), + "plum"=>array(221,160,221), + "orchid"=>array(218,112,214), + "mediumorchid"=>array(186,85,211), + "darkorchid"=>array(153,50,204), + "darkviolet"=>array(148,0,211), + "blueviolet"=>array(138,43,226), + "purple"=>array(160,32,240), + "mediumpurple"=>array(147,112,219), + "thistle"=>array(216,191,216), + "snow1"=>array(255,250,250), + "snow2"=>array(238,233,233), + "snow3"=>array(205,201,201), + "snow4"=>array(139,137,137), + "seashell1"=>array(255,245,238), + "seashell2"=>array(238,229,222), + "seashell3"=>array(205,197,191), + "seashell4"=>array(139,134,130), + "AntiqueWhite1"=>array(255,239,219), + "AntiqueWhite2"=>array(238,223,204), + "AntiqueWhite3"=>array(205,192,176), + "AntiqueWhite4"=>array(139,131,120), + "bisque1"=>array(255,228,196), + "bisque2"=>array(238,213,183), + "bisque3"=>array(205,183,158), + "bisque4"=>array(139,125,107), + "peachPuff1"=>array(255,218,185), + "peachpuff2"=>array(238,203,173), + "peachpuff3"=>array(205,175,149), + "peachpuff4"=>array(139,119,101), + "navajowhite1"=>array(255,222,173), + "navajowhite2"=>array(238,207,161), + "navajowhite3"=>array(205,179,139), + "navajowhite4"=>array(139,121,94), + "lemonchiffon1"=>array(255,250,205), + "lemonchiffon2"=>array(238,233,191), + "lemonchiffon3"=>array(205,201,165), + "lemonchiffon4"=>array(139,137,112), + "ivory1"=>array(255,255,240), + "ivory2"=>array(238,238,224), + "ivory3"=>array(205,205,193), + "ivory4"=>array(139,139,131), + "honeydew"=>array(193,205,193), + "lavenderblush1"=>array(255,240,245), + "lavenderblush2"=>array(238,224,229), + "lavenderblush3"=>array(205,193,197), + "lavenderblush4"=>array(139,131,134), + "mistyrose1"=>array(255,228,225), + "mistyrose2"=>array(238,213,210), + "mistyrose3"=>array(205,183,181), + "mistyrose4"=>array(139,125,123), + "azure1"=>array(240,255,255), + "azure2"=>array(224,238,238), + "azure3"=>array(193,205,205), + "azure4"=>array(131,139,139), + "slateblue1"=>array(131,111,255), + "slateblue2"=>array(122,103,238), + "slateblue3"=>array(105,89,205), + "slateblue4"=>array(71,60,139), + "royalblue1"=>array(72,118,255), + "royalblue2"=>array(67,110,238), + "royalblue3"=>array(58,95,205), + "royalblue4"=>array(39,64,139), + "dodgerblue1"=>array(30,144,255), + "dodgerblue2"=>array(28,134,238), + "dodgerblue3"=>array(24,116,205), + "dodgerblue4"=>array(16,78,139), + "steelblue1"=>array(99,184,255), + "steelblue2"=>array(92,172,238), + "steelblue3"=>array(79,148,205), + "steelblue4"=>array(54,100,139), + "deepskyblue1"=>array(0,191,255), + "deepskyblue2"=>array(0,178,238), + "deepskyblue3"=>array(0,154,205), + "deepskyblue4"=>array(0,104,139), + "skyblue1"=>array(135,206,255), + "skyblue2"=>array(126,192,238), + "skyblue3"=>array(108,166,205), + "skyblue4"=>array(74,112,139), + "lightskyblue1"=>array(176,226,255), + "lightskyblue2"=>array(164,211,238), + "lightskyblue3"=>array(141,182,205), + "lightskyblue4"=>array(96,123,139), + "slategray1"=>array(198,226,255), + "slategray2"=>array(185,211,238), + "slategray3"=>array(159,182,205), + "slategray4"=>array(108,123,139), + "lightsteelblue1"=>array(202,225,255), + "lightsteelblue2"=>array(188,210,238), + "lightsteelblue3"=>array(162,181,205), + "lightsteelblue4"=>array(110,123,139), + "lightblue1"=>array(191,239,255), + "lightblue2"=>array(178,223,238), + "lightblue3"=>array(154,192,205), + "lightblue4"=>array(104,131,139), + "lightcyan1"=>array(224,255,255), + "lightcyan2"=>array(209,238,238), + "lightcyan3"=>array(180,205,205), + "lightcyan4"=>array(122,139,139), + "paleturquoise1"=>array(187,255,255), + "paleturquoise2"=>array(174,238,238), + "paleturquoise3"=>array(150,205,205), + "paleturquoise4"=>array(102,139,139), + "cadetblue1"=>array(152,245,255), + "cadetblue2"=>array(142,229,238), + "cadetblue3"=>array(122,197,205), + "cadetblue4"=>array(83,134,139), + "turquoise1"=>array(0,245,255), + "turquoise2"=>array(0,229,238), + "turquoise3"=>array(0,197,205), + "turquoise4"=>array(0,134,139), + "cyan1"=>array(0,255,255), + "cyan2"=>array(0,238,238), + "cyan3"=>array(0,205,205), + "cyan4"=>array(0,139,139), + "darkslategray1"=>array(151,255,255), + "darkslategray2"=>array(141,238,238), + "darkslategray3"=>array(121,205,205), + "darkslategray4"=>array(82,139,139), + "aquamarine1"=>array(127,255,212), + "aquamarine2"=>array(118,238,198), + "aquamarine3"=>array(102,205,170), + "aquamarine4"=>array(69,139,116), + "darkseagreen1"=>array(193,255,193), + "darkseagreen2"=>array(180,238,180), + "darkseagreen3"=>array(155,205,155), + "darkseagreen4"=>array(105,139,105), + "seagreen1"=>array(84,255,159), + "seagreen2"=>array(78,238,148), + "seagreen3"=>array(67,205,128), + "seagreen4"=>array(46,139,87), + "palegreen1"=>array(154,255,154), + "palegreen2"=>array(144,238,144), + "palegreen3"=>array(124,205,124), + "palegreen4"=>array(84,139,84), + "springgreen1"=>array(0,255,127), + "springgreen2"=>array(0,238,118), + "springgreen3"=>array(0,205,102), + "springgreen4"=>array(0,139,69), + "chartreuse1"=>array(127,255,0), + "chartreuse2"=>array(118,238,0), + "chartreuse3"=>array(102,205,0), + "chartreuse4"=>array(69,139,0), + "olivedrab1"=>array(192,255,62), + "olivedrab2"=>array(179,238,58), + "olivedrab3"=>array(154,205,50), + "olivedrab4"=>array(105,139,34), + "darkolivegreen1"=>array(202,255,112), + "darkolivegreen2"=>array(188,238,104), + "darkolivegreen3"=>array(162,205,90), + "darkolivegreen4"=>array(110,139,61), + "khaki1"=>array(255,246,143), + "khaki2"=>array(238,230,133), + "khaki3"=>array(205,198,115), + "khaki4"=>array(139,134,78), + "lightgoldenrod1"=>array(255,236,139), + "lightgoldenrod2"=>array(238,220,130), + "lightgoldenrod3"=>array(205,190,112), + "lightgoldenrod4"=>array(139,129,76), + "yellow1"=>array(255,255,0), + "yellow2"=>array(238,238,0), + "yellow3"=>array(205,205,0), + "yellow4"=>array(139,139,0), + "gold1"=>array(255,215,0), + "gold2"=>array(238,201,0), + "gold3"=>array(205,173,0), + "gold4"=>array(139,117,0), + "goldenrod1"=>array(255,193,37), + "goldenrod2"=>array(238,180,34), + "goldenrod3"=>array(205,155,29), + "goldenrod4"=>array(139,105,20), + "darkgoldenrod1"=>array(255,185,15), + "darkgoldenrod2"=>array(238,173,14), + "darkgoldenrod3"=>array(205,149,12), + "darkgoldenrod4"=>array(139,101,8), + "rosybrown1"=>array(255,193,193), + "rosybrown2"=>array(238,180,180), + "rosybrown3"=>array(205,155,155), + "rosybrown4"=>array(139,105,105), + "indianred1"=>array(255,106,106), + "indianred2"=>array(238,99,99), + "indianred3"=>array(205,85,85), + "indianred4"=>array(139,58,58), + "sienna1"=>array(255,130,71), + "sienna2"=>array(238,121,66), + "sienna3"=>array(205,104,57), + "sienna4"=>array(139,71,38), + "burlywood1"=>array(255,211,155), + "burlywood2"=>array(238,197,145), + "burlywood3"=>array(205,170,125), + "burlywood4"=>array(139,115,85), + "wheat1"=>array(255,231,186), + "wheat2"=>array(238,216,174), + "wheat3"=>array(205,186,150), + "wheat4"=>array(139,126,102), + "tan1"=>array(255,165,79), + "tan2"=>array(238,154,73), + "tan3"=>array(205,133,63), + "tan4"=>array(139,90,43), + "chocolate1"=>array(255,127,36), + "chocolate2"=>array(238,118,33), + "chocolate3"=>array(205,102,29), + "chocolate4"=>array(139,69,19), + "firebrick1"=>array(255,48,48), + "firebrick2"=>array(238,44,44), + "firebrick3"=>array(205,38,38), + "firebrick4"=>array(139,26,26), + "brown1"=>array(255,64,64), + "brown2"=>array(238,59,59), + "brown3"=>array(205,51,51), + "brown4"=>array(139,35,35), + "salmon1"=>array(255,140,105), + "salmon2"=>array(238,130,98), + "salmon3"=>array(205,112,84), + "salmon4"=>array(139,76,57), + "lightsalmon1"=>array(255,160,122), + "lightsalmon2"=>array(238,149,114), + "lightsalmon3"=>array(205,129,98), + "lightsalmon4"=>array(139,87,66), + "orange1"=>array(255,165,0), + "orange2"=>array(238,154,0), + "orange3"=>array(205,133,0), + "orange4"=>array(139,90,0), + "darkorange1"=>array(255,127,0), + "darkorange2"=>array(238,118,0), + "darkorange3"=>array(205,102,0), + "darkorange4"=>array(139,69,0), + "coral1"=>array(255,114,86), + "coral2"=>array(238,106,80), + "coral3"=>array(205,91,69), + "coral4"=>array(139,62,47), + "tomato1"=>array(255,99,71), + "tomato2"=>array(238,92,66), + "tomato3"=>array(205,79,57), + "tomato4"=>array(139,54,38), + "orangered1"=>array(255,69,0), + "orangered2"=>array(238,64,0), + "orangered3"=>array(205,55,0), + "orangered4"=>array(139,37,0), + "deeppink1"=>array(255,20,147), + "deeppink2"=>array(238,18,137), + "deeppink3"=>array(205,16,118), + "deeppink4"=>array(139,10,80), + "hotpink1"=>array(255,110,180), + "hotpink2"=>array(238,106,167), + "hotpink3"=>array(205,96,144), + "hotpink4"=>array(139,58,98), + "pink1"=>array(255,181,197), + "pink2"=>array(238,169,184), + "pink3"=>array(205,145,158), + "pink4"=>array(139,99,108), + "lightpink1"=>array(255,174,185), + "lightpink2"=>array(238,162,173), + "lightpink3"=>array(205,140,149), + "lightpink4"=>array(139,95,101), + "palevioletred1"=>array(255,130,171), + "palevioletred2"=>array(238,121,159), + "palevioletred3"=>array(205,104,137), + "palevioletred4"=>array(139,71,93), + "maroon1"=>array(255,52,179), + "maroon2"=>array(238,48,167), + "maroon3"=>array(205,41,144), + "maroon4"=>array(139,28,98), + "violetred1"=>array(255,62,150), + "violetred2"=>array(238,58,140), + "violetred3"=>array(205,50,120), + "violetred4"=>array(139,34,82), + "magenta1"=>array(255,0,255), + "magenta2"=>array(238,0,238), + "magenta3"=>array(205,0,205), + "magenta4"=>array(139,0,139), + "mediumred"=>array(140,34,34), + "orchid1"=>array(255,131,250), + "orchid2"=>array(238,122,233), + "orchid3"=>array(205,105,201), + "orchid4"=>array(139,71,137), + "plum1"=>array(255,187,255), + "plum2"=>array(238,174,238), + "plum3"=>array(205,150,205), + "plum4"=>array(139,102,139), + "mediumorchid1"=>array(224,102,255), + "mediumorchid2"=>array(209,95,238), + "mediumorchid3"=>array(180,82,205), + "mediumorchid4"=>array(122,55,139), + "darkorchid1"=>array(191,62,255), + "darkorchid2"=>array(178,58,238), + "darkorchid3"=>array(154,50,205), + "darkorchid4"=>array(104,34,139), + "purple1"=>array(155,48,255), + "purple2"=>array(145,44,238), + "purple3"=>array(125,38,205), + "purple4"=>array(85,26,139), + "mediumpurple1"=>array(171,130,255), + "mediumpurple2"=>array(159,121,238), + "mediumpurple3"=>array(137,104,205), + "mediumpurple4"=>array(93,71,139), + "thistle1"=>array(255,225,255), + "thistle2"=>array(238,210,238), + "thistle3"=>array(205,181,205), + "thistle4"=>array(139,123,139), + "gray1"=>array(10,10,10), + "gray2"=>array(40,40,30), + "gray3"=>array(70,70,70), + "gray4"=>array(100,100,100), + "gray5"=>array(130,130,130), + "gray6"=>array(160,160,160), + "gray7"=>array(190,190,190), + "gray8"=>array(210,210,210), + "gray9"=>array(240,240,240), + "darkgray"=>array(100,100,100), + "darkblue"=>array(0,0,139), + "darkcyan"=>array(0,139,139), + "darkmagenta"=>array(139,0,139), + "darkred"=>array(139,0,0), + "silver"=>array(192, 192, 192), + "eggplant"=>array(144,176,168), + "lightgreen"=>array(144,238,144)); + } +//---------------- +// PUBLIC METHODS + // Colors can be specified as either + // 1. #xxxxxx HTML style + // 2. "colorname" as a named color + // 3. array(r,g,b) RGB triple + // This function translates this to a native RGB format and returns an + // RGB triple. + function Color($aColor) { + if (is_string($aColor)) { + // Strip of any alpha factor + $pos = strpos($aColor,'@'); + if( $pos === false ) { + $alpha = 0; + } + else { + $pos2 = strpos($aColor,':'); + if( $pos2===false ) + $pos2 = $pos-1; // Sentinel + if( $pos > $pos2 ) { + $alpha = str_replace(',','.',substr($aColor,$pos+1)); + $aColor = substr($aColor,0,$pos); + } + else { + $alpha = substr($aColor,$pos+1,$pos2-$pos-1); + $aColor = substr($aColor,0,$pos).substr($aColor,$pos2); + } + } + + // Extract potential adjustment figure at end of color + // specification + $pos = strpos($aColor,":"); + if( $pos === false ) { + $adj = 1.0; + } + else { + $adj = 0.0 + str_replace(',','.',substr($aColor,$pos+1)); + $aColor = substr($aColor,0,$pos); + } + if( $adj < 0 ) + JpGraphError::RaiseL(25077);//('Adjustment factor for color must be > 0'); + + if (substr($aColor, 0, 1) == "#") { + $r = hexdec(substr($aColor, 1, 2)); + $g = hexdec(substr($aColor, 3, 2)); + $b = hexdec(substr($aColor, 5, 2)); + } else { + if(!isset($this->rgb_table[$aColor]) ) + JpGraphError::RaiseL(25078,$aColor);//(" Unknown color: $aColor"); + $tmp=$this->rgb_table[$aColor]; + $r = $tmp[0]; + $g = $tmp[1]; + $b = $tmp[2]; + } + // Scale adj so that an adj=2 always + // makes the color 100% white (i.e. 255,255,255. + // and adj=1 neutral and adj=0 black. + if( $adj > 1 ) { + $m = ($adj-1.0)*(255-min(255,min($r,min($g,$b)))); + return array(min(255,$r+$m), min(255,$g+$m), min(255,$b+$m),$alpha); + } + elseif( $adj < 1 ) { + $m = ($adj-1.0)*max(255,max($r,max($g,$b))); + return array(max(0,$r+$m), max(0,$g+$m), max(0,$b+$m),$alpha); + } + else { + return array($r,$g,$b,$alpha); + } + + } elseif( is_array($aColor) ) { + if( count($aColor)==3 ) { + $aColor[3]=0; + return $aColor; + } + else + return $aColor; + } + else + JpGraphError::RaiseL(25079,$aColor,count($aColor));//(" Unknown color specification: $aColor , size=".count($aColor)); + } + + // Compare two colors + // return true if equal + function Equal($aCol1,$aCol2) { + $c1 = $this->Color($aCol1); + $c2 = $this->Color($aCol2); + if( $c1[0]==$c2[0] && $c1[1]==$c2[1] && $c1[2]==$c2[2] ) + return true; + else + return false; + } + + // Allocate a new color in the current image + // Return new color index, -1 if no more colors could be allocated + function Allocate($aColor,$aAlpha=0.0) { + list ($r, $g, $b, $a) = $this->color($aColor); + // If alpha is specified in the color string then this + // takes precedence over the second argument + if( $a > 0 ) + $aAlpha = $a; + if( $aAlpha < 0 || $aAlpha > 1 ) { + JpGraphError::RaiseL(25080);//('Alpha parameter for color must be between 0.0 and 1.0'); + } + return imagecolorresolvealpha($this->img, $r, $g, $b, round($aAlpha * 127)); + } +} // Class + + +//=================================================== +// CLASS Image +// Description: Wrapper class with some goodies to form the +// Interface to low level image drawing routines. +//=================================================== +class Image { + var $img_format; + var $expired=true; + var $img=null; + var $left_margin=30,$right_margin=20,$top_margin=20,$bottom_margin=30; + var $plotwidth=0,$plotheight=0; + var $rgb=null; + var $current_color,$current_color_name; + var $lastx=0, $lasty=0; + var $width=0, $height=0; + var $line_weight=1; + var $line_style=1; // Default line style is solid + var $obs_list=array(); + var $font_size=12,$font_family=FF_FONT1, $font_style=FS_NORMAL; + var $font_file=''; + var $text_halign="left",$text_valign="bottom"; + var $ttf=null; + var $use_anti_aliasing=false; + var $quality=null; + var $colorstack=array(),$colorstackidx=0; + var $canvascolor = 'white' ; + var $langconv = null ; + + //--------------- + // CONSTRUCTOR + function Image($aWidth,$aHeight,$aFormat=DEFAULT_GFORMAT,$aSetAutoMargin=true) { + $this->CreateImgCanvas($aWidth,$aHeight); + if( $aSetAutoMargin ) + $this->SetAutoMargin(); + + if( !$this->SetImgFormat($aFormat) ) { + JpGraphError::RaiseL(25081,$aFormat);//("JpGraph: Selected graphic format is either not supported or unknown [$aFormat]"); + } + $this->ttf = new TTF(); + $this->langconv = new LanguageConv(); + } + + // Should we use anti-aliasing. Note: This really slows down graphics! + function SetAntiAliasing() { + $this->use_anti_aliasing=true; + } + + function CreateRawCanvas($aWidth=0,$aHeight=0) { + if( $aWidth <= 1 || $aHeight <= 1 ) { + JpGraphError::RaiseL(25082,$aWidth,$aHeight);//("Illegal sizes specified for width or height when creating an image, (width=$aWidth, height=$aHeight)"); + } + $this->img = @imagecreatetruecolor($aWidth, $aHeight); + if( $this->img < 1 ) { + JpGraphError::RaiseL(25126); + //die("Can't create truecolor image. Check that you really have GD2 library installed."); + } + $this->SetAlphaBlending(); + if( $this->rgb != null ) + $this->rgb->img = $this->img ; + else + $this->rgb = new RGB($this->img); + } + + function CloneCanvasH() { + $oldimage = $this->img; + $this->CreateRawCanvas($this->width,$this->height); + imagecopy($this->img,$oldimage,0,0,0,0,$this->width,$this->height); + return $oldimage; + } + + function CreateImgCanvas($aWidth=0,$aHeight=0) { + + $old = array($this->img,$this->width,$this->height); + + $aWidth = round($aWidth); + $aHeight = round($aHeight); + + $this->width=$aWidth; + $this->height=$aHeight; + + + if( $aWidth==0 || $aHeight==0 ) { + // We will set the final size later. + // Note: The size must be specified before any other + // img routines that stroke anything are called. + $this->img = null; + $this->rgb = null; + return $old; + } + + $this->CreateRawCanvas($aWidth,$aHeight); + + // Set canvas color (will also be the background color for a + // a pallett image + $this->SetColor($this->canvascolor); + $this->FilledRectangle(0,0,$aWidth,$aHeight); + + return $old ; + } + + function CopyCanvasH($aToHdl,$aFromHdl,$aToX,$aToY,$aFromX,$aFromY,$aWidth,$aHeight,$aw=-1,$ah=-1) { + if( $aw === -1 ) { + $aw = $aWidth; + $ah = $aHeight; + $f = 'imagecopyresized'; + } + else { + $f = 'imagecopyresampled' ; + } + $f($aToHdl,$aFromHdl, + $aToX,$aToY,$aFromX,$aFromY, $aWidth,$aHeight,$aw,$ah); + } + + function Copy($fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth=-1,$fromHeight=-1) { + $this->CopyCanvasH($this->img,$fromImg,$toX,$toY,$fromX,$fromY, + $toWidth,$toHeight,$fromWidth,$fromHeight); + } + + function CopyMerge($fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth=-1,$fromHeight=-1,$aMix=100) { + if( $aMix == 100 ) { + $this->CopyCanvasH($this->img,$fromImg, + $toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth,$fromHeight); + } + else { + if( ($fromWidth != -1 && ($fromWidth != $toWidth)) || + ($fromHeight != -1 && ($fromHeight != $fromHeight)) ) { + // Create a new canvas that will hold the re-scaled original from image + if( $toWidth <= 1 || $toHeight <= 1 ) { + JpGraphError::RaiseL(25083);//('Illegal image size when copying image. Size for copied to image is 1 pixel or less.'); + } + $tmpimg = @imagecreatetruecolor($toWidth, $toHeight); + if( $tmpimg < 1 ) { + JpGraphError::RaiseL(25084);//('Failed to create temporary GD canvas. Out of memory ?'); + } + $this->CopyCanvasH($tmpimg,$fromImg,0,0,0,0, + $toWidth,$toHeight,$fromWidth,$fromHeight); + $fromImg = $tmpimg; + } + imagecopymerge($this->img,$fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$aMix); + } + } + + function GetWidth($aImg=null) { + if( $aImg === null ) + $aImg = $this->img; + return imagesx($aImg); + } + + function GetHeight($aImg=null) { + if( $aImg === null ) + $aImg = $this->img; + return imagesy($aImg); + } + + function CreateFromString($aStr) { + $img = @imagecreatefromstring($aStr); + if( $img === false ) { + JpGraphError::RaiseL(25085);//('An image can not be created from the supplied string. It is either in a format not supported or the string is representing an corrupt image.'); + } + return $img; + } + + function SetCanvasH($aHdl) { + $this->img = $aHdl; + $this->rgb->img = $aHdl; + } + + function SetCanvasColor($aColor) { + $this->canvascolor = $aColor ; + } + + function SetAlphaBlending($aFlg=true) { + ImageAlphaBlending($this->img,$aFlg); + } + + + function SetAutoMargin() { + GLOBAL $gJpgBrandTiming; + $min_bm=5; + /* + if( $gJpgBrandTiming ) + $min_bm=15; + */ + $lm = min(40,$this->width/7); + $rm = min(20,$this->width/10); + $tm = max(5,$this->height/7); + $bm = max($min_bm,$this->height/7); + + $this->SetMargin($lm,$rm,$tm,$bm); + } + + + //--------------- + // PUBLIC METHODS + + function SetFont($family,$style=FS_NORMAL,$size=10) { + $this->font_family=$family; + $this->font_style=$style; + $this->font_size=$size; + $this->font_file=''; + if( ($this->font_family==FF_FONT1 || $this->font_family==FF_FONT2) && $this->font_style==FS_BOLD ){ + ++$this->font_family; + } + if( $this->font_family > FF_FONT2+1 ) { // A TTF font so get the font file + + // Check that this PHP has support for TTF fonts + if( !function_exists('imagettfbbox') ) { + JpGraphError::RaiseL(25087);//('This PHP build has not been configured with TTF support. You need to recompile your PHP installation with FreeType support.'); + } + $this->font_file = $this->ttf->File($this->font_family,$this->font_style); + } + } + + // Get the specific height for a text string + function GetTextHeight($txt="",$angle=0) { + $tmp = split("\n",$txt); + $n = count($tmp); + $m=0; + for($i=0; $i< $n; ++$i) + $m = max($m,strlen($tmp[$i])); + + if( $this->font_family <= FF_FONT2+1 ) { + if( $angle==0 ) { + $h = imagefontheight($this->font_family); + if( $h === false ) { + JpGraphError::RaiseL(25088);//('You have a misconfigured GD font support. The call to imagefontwidth() fails.'); + } + + return $n*$h; + } + else { + $w = @imagefontwidth($this->font_family); + if( $w === false ) { + JpGraphError::RaiseL(25088);//('You have a misconfigured GD font support. The call to imagefontwidth() fails.'); + } + + return $m*$w; + } + } + else { + $bbox = $this->GetTTFBBox($txt,$angle); + return $bbox[1]-$bbox[5]; + } + } + + // Estimate font height + function GetFontHeight($angle=0) { + $txt = "XOMg"; + return $this->GetTextHeight($txt,$angle); + } + + // Approximate font width with width of letter "O" + function GetFontWidth($angle=0) { + $txt = 'O'; + return $this->GetTextWidth($txt,$angle); + } + + // Get actual width of text in absolute pixels + function GetTextWidth($txt,$angle=0) { + + $tmp = split("\n",$txt); + $n = count($tmp); + if( $this->font_family <= FF_FONT2+1 ) { + + $m=0; + for($i=0; $i < $n; ++$i) { + $l=strlen($tmp[$i]); + if( $l > $m ) { + $m = $l; + } + } + + if( $angle==0 ) { + $w = @imagefontwidth($this->font_family); + if( $w === false ) { + JpGraphError::RaiseL(25088);//('You have a misconfigured GD font support. The call to imagefontwidth() fails.'); + } + return $m*$w; + } + else { + // 90 degrees internal so height becomes width + $h = @imagefontheight($this->font_family); + if( $h === false ) { + JpGraphError::RaiseL(25089);//('You have a misconfigured GD font support. The call to imagefontheight() fails.'); + } + return $n*$h; + } + } + else { + // For TTF fonts we must walk through a lines and find the + // widest one which we use as the width of the multi-line + // paragraph + $m=0; + for( $i=0; $i < $n; ++$i ) { + $bbox = $this->GetTTFBBox($tmp[$i],$angle); + $mm = $bbox[2] - $bbox[0]; + if( $mm > $m ) + $m = $mm; + } + return $m; + } + } + + // Draw text with a box around it + function StrokeBoxedText($x,$y,$txt,$dir=0,$fcolor="white",$bcolor="black", + $shadowcolor=false,$paragraph_align="left", + $xmarg=6,$ymarg=4,$cornerradius=0,$dropwidth=3) { + + if( !is_numeric($dir) ) { + if( $dir=="h" ) $dir=0; + elseif( $dir=="v" ) $dir=90; + else JpGraphError::RaiseL(25090,$dir);//(" Unknown direction specified in call to StrokeBoxedText() [$dir]"); + } + + if( $this->font_family >= FF_FONT0 && $this->font_family <= FF_FONT2+1) { + $width=$this->GetTextWidth($txt,$dir) ; + $height=$this->GetTextHeight($txt,$dir) ; + } + else { + $width=$this->GetBBoxWidth($txt,$dir) ; + $height=$this->GetBBoxHeight($txt,$dir) ; + } + + $height += 2*$ymarg; + $width += 2*$xmarg; + + if( $this->text_halign=="right" ) $x -= $width; + elseif( $this->text_halign=="center" ) $x -= $width/2; + if( $this->text_valign=="bottom" ) $y -= $height; + elseif( $this->text_valign=="center" ) $y -= $height/2; + + $olda = $this->SetAngle(0); + + if( $shadowcolor ) { + $this->PushColor($shadowcolor); + $this->FilledRoundedRectangle($x-$xmarg+$dropwidth,$y-$ymarg+$dropwidth, + $x+$width+$dropwidth,$y+$height-$ymarg+$dropwidth, + $cornerradius); + $this->PopColor(); + $this->PushColor($fcolor); + $this->FilledRoundedRectangle($x-$xmarg,$y-$ymarg, + $x+$width,$y+$height-$ymarg, + $cornerradius); + $this->PopColor(); + $this->PushColor($bcolor); + $this->RoundedRectangle($x-$xmarg,$y-$ymarg, + $x+$width,$y+$height-$ymarg,$cornerradius); + $this->PopColor(); + } + else { + if( $fcolor ) { + $oc=$this->current_color; + $this->SetColor($fcolor); + $this->FilledRoundedRectangle($x-$xmarg,$y-$ymarg,$x+$width,$y+$height-$ymarg,$cornerradius); + $this->current_color=$oc; + } + if( $bcolor ) { + $oc=$this->current_color; + $this->SetColor($bcolor); + $this->RoundedRectangle($x-$xmarg,$y-$ymarg,$x+$width,$y+$height-$ymarg,$cornerradius); + $this->current_color=$oc; + } + } + + $h=$this->text_halign; + $v=$this->text_valign; + $this->SetTextAlign("left","top"); + $this->StrokeText($x, $y, $txt, $dir, $paragraph_align); + $bb = array($x-$xmarg,$y+$height-$ymarg,$x+$width,$y+$height-$ymarg, + $x+$width,$y-$ymarg,$x-$xmarg,$y-$ymarg); + $this->SetTextAlign($h,$v); + + $this->SetAngle($olda); + + return $bb; + } + + // Set text alignment + function SetTextAlign($halign,$valign="bottom") { + $this->text_halign=$halign; + $this->text_valign=$valign; + } + + + function _StrokeBuiltinFont($x,$y,$txt,$dir=0,$paragraph_align="left",&$aBoundingBox,$aDebug=false) { + + if( is_numeric($dir) && $dir!=90 && $dir!=0) + JpGraphError::RaiseL(25091);//(" Internal font does not support drawing text at arbitrary angle. Use TTF fonts instead."); + + $h=$this->GetTextHeight($txt); + $fh=$this->GetFontHeight(); + $w=$this->GetTextWidth($txt); + + if( $this->text_halign=="right") + $x -= $dir==0 ? $w : $h; + elseif( $this->text_halign=="center" ) { + // For center we subtract 1 pixel since this makes the middle + // be prefectly in the middle + $x -= $dir==0 ? $w/2-1 : $h/2; + } + if( $this->text_valign=="top" ) + $y += $dir==0 ? $h : $w; + elseif( $this->text_valign=="center" ) + $y += $dir==0 ? $h/2 : $w/2; + + if( $dir==90 ) { + imagestringup($this->img,$this->font_family,$x,$y,$txt,$this->current_color); + $aBoundingBox = array(round($x),round($y),round($x),round($y-$w),round($x+$h),round($y-$w),round($x+$h),round($y)); + if( $aDebug ) { + // Draw bounding box + $this->PushColor('green'); + $this->Polygon($aBoundingBox,true); + $this->PopColor(); + } + } + else { + if( ereg("\n",$txt) ) { + $tmp = split("\n",$txt); + for($i=0; $i < count($tmp); ++$i) { + $w1 = $this->GetTextWidth($tmp[$i]); + if( $paragraph_align=="left" ) { + imagestring($this->img,$this->font_family,$x,$y-$h+1+$i*$fh,$tmp[$i],$this->current_color); + } + elseif( $paragraph_align=="right" ) { + imagestring($this->img,$this->font_family,$x+($w-$w1), + $y-$h+1+$i*$fh,$tmp[$i],$this->current_color); + } + else { + imagestring($this->img,$this->font_family,$x+$w/2-$w1/2, + $y-$h+1+$i*$fh,$tmp[$i],$this->current_color); + } + } + } + else { + //Put the text + imagestring($this->img,$this->font_family,$x,$y-$h+1,$txt,$this->current_color); + } + if( $aDebug ) { + // Draw the bounding rectangle and the bounding box + $p1 = array(round($x),round($y),round($x),round($y-$h),round($x+$w),round($y-$h),round($x+$w),round($y)); + + // Draw bounding box + $this->PushColor('green'); + $this->Polygon($p1,true); + $this->PopColor(); + + } + $aBoundingBox=array(round($x),round($y),round($x),round($y-$h),round($x+$w),round($y-$h),round($x+$w),round($y)); + } + } + + function AddTxtCR($aTxt) { + // If the user has just specified a '\n' + // instead of '\n\t' we have to add '\r' since + // the width will be too muchy otherwise since when + // we print we stroke the individually lines by hand. + $e = explode("\n",$aTxt); + $n = count($e); + for($i=0; $i<$n; ++$i) { + $e[$i]=str_replace("\r","",$e[$i]); + } + return implode("\n\r",$e); + } + + function GetTTFBBox($aTxt,$aAngle=0) { + $bbox = @ImageTTFBBox($this->font_size,$aAngle,$this->font_file,$aTxt); + if( $bbox === false ) { + JpGraphError::RaiseL(25092,$this->font_file); +//("There is either a configuration problem with TrueType or a problem reading font file (".$this->font_file."). Make sure file exists and is in a readable place for the HTTP process. (If 'basedir' restriction is enabled in PHP then the font file must be located in the document root.). It might also be a wrongly installed FreeType library. Try uppgrading to at least FreeType 2.1.13 and recompile GD with the correct setup so it can find the new FT library."); + } + return $bbox; + } + + function GetBBoxTTF($aTxt,$aAngle=0) { + // Normalize the bounding box to become a minimum + // enscribing rectangle + + $aTxt = $this->AddTxtCR($aTxt); + + if( !is_readable($this->font_file) ) { + JpGraphError::RaiseL(25093,$this->font_file); +//('Can not read font file ('.$this->font_file.') in call to Image::GetBBoxTTF. Please make sure that you have set a font before calling this method and that the font is installed in the TTF directory.'); + } + $bbox = $this->GetTTFBBox($aTxt,$aAngle); + + if( $aAngle==0 ) + return $bbox; + if( $aAngle >= 0 ) { + if( $aAngle <= 90 ) { //<=0 + $bbox = array($bbox[6],$bbox[1],$bbox[2],$bbox[1], + $bbox[2],$bbox[5],$bbox[6],$bbox[5]); + } + elseif( $aAngle <= 180 ) { //<= 2 + $bbox = array($bbox[4],$bbox[7],$bbox[0],$bbox[7], + $bbox[0],$bbox[3],$bbox[4],$bbox[3]); + } + elseif( $aAngle <= 270 ) { //<= 3 + $bbox = array($bbox[2],$bbox[5],$bbox[6],$bbox[5], + $bbox[6],$bbox[1],$bbox[2],$bbox[1]); + } + else { + $bbox = array($bbox[0],$bbox[3],$bbox[4],$bbox[3], + $bbox[4],$bbox[7],$bbox[0],$bbox[7]); + } + } + elseif( $aAngle < 0 ) { + if( $aAngle <= -270 ) { // <= -3 + $bbox = array($bbox[6],$bbox[1],$bbox[2],$bbox[1], + $bbox[2],$bbox[5],$bbox[6],$bbox[5]); + } + elseif( $aAngle <= -180 ) { // <= -2 + $bbox = array($bbox[0],$bbox[3],$bbox[4],$bbox[3], + $bbox[4],$bbox[7],$bbox[0],$bbox[7]); + } + elseif( $aAngle <= -90 ) { // <= -1 + $bbox = array($bbox[2],$bbox[5],$bbox[6],$bbox[5], + $bbox[6],$bbox[1],$bbox[2],$bbox[1]); + } + else { + $bbox = array($bbox[0],$bbox[3],$bbox[4],$bbox[3], + $bbox[4],$bbox[7],$bbox[0],$bbox[7]); + } + } + return $bbox; + } + + function GetBBoxHeight($aTxt,$aAngle=0) { + $box = $this->GetBBoxTTF($aTxt,$aAngle); + return $box[1]-$box[7]+1; + } + + function GetBBoxWidth($aTxt,$aAngle=0) { + $box = $this->GetBBoxTTF($aTxt,$aAngle); + return $box[2]-$box[0]+1; + } + + function _StrokeTTF($x,$y,$txt,$dir=0,$paragraph_align="left",&$aBoundingBox,$debug=false) { + + // Setupo default inter line margin for paragraphs to + // 25% of the font height. + $ConstLineSpacing = 0.25 ; + + // Remember the anchor point before adjustment + if( $debug ) { + $ox=$x; + $oy=$y; + } + + if( !ereg("\n",$txt) || ($dir>0 && ereg("\n",$txt)) ) { + // Format a single line + + $txt = $this->AddTxtCR($txt); + + $bbox=$this->GetBBoxTTF($txt,$dir); + + // Align x,y ot lower left corner of bbox + $x -= $bbox[0]; + $y -= $bbox[1]; + + // Note to self: "topanchor" is deprecated after we changed the + // bopunding box stuff. + if( $this->text_halign=="right" || $this->text_halign=="topanchor" ) + $x -= $bbox[2]-$bbox[0]; + elseif( $this->text_halign=="center" ) $x -= ($bbox[2]-$bbox[0])/2; + + if( $this->text_valign=="top" ) $y += abs($bbox[5])+$bbox[1]; + elseif( $this->text_valign=="center" ) $y -= ($bbox[5]-$bbox[1])/2; + + ImageTTFText ($this->img, $this->font_size, $dir, $x, $y, + $this->current_color,$this->font_file,$txt); + + // Calculate and return the co-ordinates for the bounding box + $box=@ImageTTFBBox($this->font_size,$dir,$this->font_file,$txt); + $p1 = array(); + + + for($i=0; $i < 4; ++$i) { + $p1[] = round($box[$i*2]+$x); + $p1[] = round($box[$i*2+1]+$y); + } + $aBoundingBox = $p1; + + // Debugging code to highlight the bonding box and bounding rectangle + // For text at 0 degrees the bounding box and bounding rectangle are the + // same + if( $debug ) { + // Draw the bounding rectangle and the bounding box + $box=@ImageTTFBBox($this->font_size,$dir,$this->font_file,$txt); + $p = array(); + $p1 = array(); + for($i=0; $i < 4; ++$i) { + $p[] = $bbox[$i*2]+$x; + $p[] = $bbox[$i*2+1]+$y; + $p1[] = $box[$i*2]+$x; + $p1[] = $box[$i*2+1]+$y; + } + + // Draw bounding box + $this->PushColor('green'); + $this->Polygon($p1,true); + $this->PopColor(); + + // Draw bounding rectangle + $this->PushColor('darkgreen'); + $this->Polygon($p,true); + $this->PopColor(); + + // Draw a cross at the anchor point + $this->PushColor('red'); + $this->Line($ox-15,$oy,$ox+15,$oy); + $this->Line($ox,$oy-15,$ox,$oy+15); + $this->PopColor(); + } + } + else { + // Format a text paragraph + $fh=$this->GetFontHeight(); + + // Line margin is 25% of font height + $linemargin=round($fh*$ConstLineSpacing); + $fh += $linemargin; + $w=$this->GetTextWidth($txt); + + $y -= $linemargin/2; + $tmp = split("\n",$txt); + $nl = count($tmp); + $h = $nl * $fh; + + if( $this->text_halign=="right") + $x -= $dir==0 ? $w : $h; + elseif( $this->text_halign=="center" ) { + $x -= $dir==0 ? $w/2 : $h/2; + } + + if( $this->text_valign=="top" ) + $y += $dir==0 ? $h : $w; + elseif( $this->text_valign=="center" ) + $y += $dir==0 ? $h/2 : $w/2; + + // Here comes a tricky bit. + // Since we have to give the position for the string at the + // baseline this means thaht text will move slightly up + // and down depending on any of it's character descend below + // the baseline, for example a 'g'. To adjust the Y-position + // we therefore adjust the text with the baseline Y-offset + // as used for the current font and size. This will keep the + // baseline at a fixed positoned disregarding the actual + // characters in the string. + $standardbox = $this->GetTTFBBox('Gg',$dir); + $yadj = $standardbox[1]; + $xadj = $standardbox[0]; + $aBoundingBox = array(); + for($i=0; $i < $nl; ++$i) { + $wl = $this->GetTextWidth($tmp[$i]); + $bbox = $this->GetTTFBBox($tmp[$i],$dir); + if( $paragraph_align=="left" ) { + $xl = $x; + } + elseif( $paragraph_align=="right" ) { + $xl = $x + ($w-$wl); + } + else { + // Center + $xl = $x + $w/2 - $wl/2 ; + } + + $xl -= $bbox[0]; + $yl = $y - $yadj; + $xl = $xl - $xadj; + ImageTTFText ($this->img, $this->font_size, $dir, + $xl, $yl-($h-$fh)+$fh*$i, + $this->current_color,$this->font_file,$tmp[$i]); + + if( $debug ) { + // Draw the bounding rectangle around each line + $box=@ImageTTFBBox($this->font_size,$dir,$this->font_file,$tmp[$i]); + $p = array(); + for($j=0; $j < 4; ++$j) { + $p[] = $bbox[$j*2]+$xl; + $p[] = $bbox[$j*2+1]+$yl-($h-$fh)+$fh*$i; + } + + // Draw bounding rectangle + $this->PushColor('darkgreen'); + $this->Polygon($p,true); + $this->PopColor(); + } + } + + // Get the bounding box + $bbox = $this->GetBBoxTTF($txt,$dir); + for($j=0; $j < 4; ++$j) { + $bbox[$j*2]+= round($x); + $bbox[$j*2+1]+= round($y - ($h-$fh) - $yadj); + } + $aBoundingBox = $bbox; + + if( $debug ) { + // Draw a cross at the anchor point + $this->PushColor('red'); + $this->Line($ox-25,$oy,$ox+25,$oy); + $this->Line($ox,$oy-25,$ox,$oy+25); + $this->PopColor(); + } + + } + } + + function StrokeText($x,$y,$txt,$dir=0,$paragraph_align="left",$debug=false) { + + $x = round($x); + $y = round($y); + + // Do special language encoding + $txt = $this->langconv->Convert($txt,$this->font_family); + + if( !is_numeric($dir) ) + JpGraphError::RaiseL(25094);//(" Direction for text most be given as an angle between 0 and 90."); + + if( $this->font_family >= FF_FONT0 && $this->font_family <= FF_FONT2+1) { + $this->_StrokeBuiltinFont($x,$y,$txt,$dir,$paragraph_align,$boundingbox,$debug); + } + elseif($this->font_family >= _FF_FIRST && $this->font_family <= _FF_LAST) { + $this->_StrokeTTF($x,$y,$txt,$dir,$paragraph_align,$boundingbox,$debug); + } + else + JpGraphError::RaiseL(25095);//(" Unknown font font family specification. "); + return $boundingbox; + } + + function SetMargin($lm,$rm,$tm,$bm) { + $this->left_margin=$lm; + $this->right_margin=$rm; + $this->top_margin=$tm; + $this->bottom_margin=$bm; + $this->plotwidth=$this->width - $this->left_margin-$this->right_margin ; + $this->plotheight=$this->height - $this->top_margin-$this->bottom_margin ; + if( $this->width > 0 && $this->height > 0 ) { + if( $this->plotwidth < 0 || $this->plotheight < 0 ) + JpGraphError::raise("Too small plot area. ($lm,$rm,$tm,$bm : $this->plotwidth x $this->plotheight). With the given image size and margins there is to little space left for the plot. Increase the plot size or reduce the margins."); + } + } + + function SetTransparent($color) { + imagecolortransparent ($this->img,$this->rgb->allocate($color)); + } + + function SetColor($color,$aAlpha=0) { + $this->current_color_name = $color; + $this->current_color=$this->rgb->allocate($color,$aAlpha); + if( $this->current_color == -1 ) { + JpGraphError::RaiseL(25096); +//("Can't allocate any more colors."); + } + return $this->current_color; + } + + function PushColor($color) { + if( $color != "" ) { + $this->colorstack[$this->colorstackidx]=$this->current_color_name; + $this->colorstack[$this->colorstackidx+1]=$this->current_color; + $this->colorstackidx+=2; + $this->SetColor($color); + } + else { + JpGraphError::RaiseL(25097);//("Color specified as empty string in PushColor()."); + } + } + + function PopColor() { + if($this->colorstackidx<1) + JpGraphError::RaiseL(25098);//(" Negative Color stack index. Unmatched call to PopColor()"); + $this->current_color=$this->colorstack[--$this->colorstackidx]; + $this->current_color_name=$this->colorstack[--$this->colorstackidx]; + } + + + function SetLineWeight($weight) { + $this->line_weight = $weight; + } + + function SetStartPoint($x,$y) { + $this->lastx=round($x); + $this->lasty=round($y); + } + + function Arc($cx,$cy,$w,$h,$s,$e) { + // GD Arc doesn't like negative angles + while( $s < 0) $s += 360; + while( $e < 0) $e += 360; + + imagearc($this->img,round($cx),round($cy),round($w),round($h), + $s,$e,$this->current_color); + } + + function FilledArc($xc,$yc,$w,$h,$s,$e,$style="") { + + while( $s < 0 ) $s += 360; + while( $e < 0 ) $e += 360; + if( $style=="" ) + $style=IMG_ARC_PIE; + + // Workaround for bug in 4.4.7 which will not draw a correct 360 + // degree slice with any other angles than 0,360 + if( 360-abs($s-$e) < 0.01 ) { + $s = 0; + $e = 360; + } + if( abs($s-$e) > 0.001 ) { + imagefilledarc($this->img,round($xc),round($yc),round($w),round($h), + round($s),round($e),$this->current_color,$style); + } + } + + function FilledCakeSlice($cx,$cy,$w,$h,$s,$e) { + $this->CakeSlice($cx,$cy,$w,$h,$s,$e,$this->current_color_name); + } + + function CakeSlice($xc,$yc,$w,$h,$s,$e,$fillcolor="",$arccolor="") { + $s = round($s); $e = round($e); + $w = round($w); $h = round($h); + $xc = round($xc); $yc = round($yc); + + if( $s==$e ) { + // A full circle. We draw this a plain circle + $this->PushColor($fillcolor); + imagefilledellipse($this->img,$xc,$yc,2*$w,2*$h,$this->current_color); + $this->PopColor(); + $this->PushColor($arccolor); + imageellipse($this->img,$xc,$yc,2*$w,2*$h,$this->current_color); + $this->Line($xc,$yc,cos($s*M_PI/180)*$w+$xc,$yc+sin($s*M_PI/180)*$h); + $this->PopColor(); + } + else { + $this->PushColor($fillcolor); + $this->FilledArc($xc,$yc,2*$w,2*$h,$s,$e); + $this->PopColor(); + if( $arccolor != "" ) { + $this->PushColor($arccolor); + // We add 2 pixels to make the Arc() better aligned with the filled arc. + imagefilledarc($this->img,$xc,$yc,2*$w,2*$h,$s,$e,$this->current_color,IMG_ARC_NOFILL | IMG_ARC_EDGED ) ; + + // Workaround for bug in 4.4.7 which will not draw a correct 360 + // degree slice with any other angles than 0,360. Unfortunately we cannot just + // adjust the angles since the interior ar edge is drawn correct but not the surrounding + // circle. This workaround can only be used with perfect circle shaped arcs + if( PHP_VERSION==='4.4.7' && (360-abs($s-$e) < 0.01 && $w==$h) ) { + $this->Circle($xc,$yc,$w); + } + $this->PopColor(); + } + } + } + + function Ellipse($xc,$yc,$w,$h) { + $this->Arc($xc,$yc,$w,$h,0,360); + } + + // Breseham circle gives visually better result then using GD + // built in arc(). It takes some more time but gives better + // accuracy. + function BresenhamCircle($xc,$yc,$r) { + $d = 3-2*$r; + $x = 0; + $y = $r; + while($x<=$y) { + $this->Point($xc+$x,$yc+$y); + $this->Point($xc+$x,$yc-$y); + $this->Point($xc-$x,$yc+$y); + $this->Point($xc-$x,$yc-$y); + + $this->Point($xc+$y,$yc+$x); + $this->Point($xc+$y,$yc-$x); + $this->Point($xc-$y,$yc+$x); + $this->Point($xc-$y,$yc-$x); + + if( $d<0 ) $d += 4*$x+6; + else { + $d += 4*($x-$y)+10; + --$y; + } + ++$x; + } + } + + function Circle($xc,$yc,$r) { + if( USE_BRESENHAM ) + $this->BresenhamCircle($xc,$yc,$r); + else { + + /* + // Some experimental code snippet to see if we can get a decent + // result doing a trig-circle + // Create an approximated circle with 0.05 rad resolution + $end = 2*M_PI; + $l = $r/10; + if( $l < 3 ) $l=3; + $step_size = 2*M_PI/(2*$r*M_PI/$l); + $pts = array(); + $pts[] = $r + $xc; + $pts[] = $yc; + for( $a=$step_size; $a <= $end; $a += $step_size ) { + $pts[] = round($xc + $r*cos($a)); + $pts[] = round($yc - $r*sin($a)); + } + imagepolygon($this->img,$pts,count($pts)/2,$this->current_color); + */ + + $this->Arc($xc,$yc,$r*2,$r*2,0,360); + + // For some reason imageellipse() isn't in GD 2.0.1, PHP 4.1.1 + //imageellipse($this->img,$xc,$yc,$r,$r,$this->current_color); + } + } + + function FilledCircle($xc,$yc,$r) { + imagefilledellipse($this->img,round($xc),round($yc),2*$r,2*$r,$this->current_color); + } + + // Linear Color InterPolation + function lip($f,$t,$p) { + $p = round($p,1); + $r = $f[0] + ($t[0]-$f[0])*$p; + $g = $f[1] + ($t[1]-$f[1])*$p; + $b = $f[2] + ($t[2]-$f[2])*$p; + return array($r,$g,$b); + } + + // Anti-aliased line. + // Note that this is roughly 8 times slower then a normal line! + function WuLine($x1,$y1,$x2,$y2) { + // Get foreground line color + $lc = imagecolorsforindex($this->img,$this->current_color); + $lc = array($lc["red"],$lc["green"],$lc["blue"]); + + $dx = $x2-$x1; + $dy = $y2-$y1; + + if( abs($dx) > abs($dy) ) { + if( $dx<0 ) { + $dx = -$dx;$dy = -$dy; + $tmp=$x2;$x2=$x1;$x1=$tmp; + $tmp=$y2;$y2=$y1;$y1=$tmp; + } + $x=$x1<<16; $y=$y1<<16; + $yinc = ($dy*65535)/$dx; + $first=true; + while( ($x >> 16) < $x2 ) { + + $bc = @imagecolorsforindex($this->img,imagecolorat($this->img,$x>>16,$y>>16)); + if( $bc <= 0 ) { + JpGraphError::RaiseL(25100);//('Problem with color palette and your GD setup. Please disable anti-aliasing or use GD2 with true-color. If you have GD2 library installed please make sure that you have set the USE_GD2 constant to true and that truecolor is enabled.'); + } + $bc=array($bc["red"],$bc["green"],$bc["blue"]); + + $this->SetColor($this->lip($lc,$bc,($y & 0xFFFF)/65535)); + imagesetpixel($this->img,$x>>16,$y>>16,$this->current_color); + $this->SetColor($this->lip($lc,$bc,(~$y & 0xFFFF)/65535)); + if( !$first ) + imagesetpixel($this->img,$x>>16,($y>>16)+1,$this->current_color); + $x += 65536; $y += $yinc; + $first=false; + } + } + else { + if( $dy<0 ) { + $dx = -$dx;$dy = -$dy; + $tmp=$x2;$x2=$x1;$x1=$tmp; + $tmp=$y2;$y2=$y1;$y1=$tmp; + } + $x=$x1<<16; $y=$y1<<16; + $xinc = ($dx*65535)/$dy; + $first = true; + while( ($y >> 16) < $y2 ) { + + $bc = @imagecolorsforindex($this->img,imagecolorat($this->img,$x>>16,$y>>16)); + if( $bc <= 0 ) { + JpGraphError::RaiseL(25100);//('Problem with color palette and your GD setup. Please disable anti-aliasing or use GD2 with true-color. If you have GD2 library installed please make sure that you have set the USE_GD2 constant to true and truecolor is enabled.'); + + } + + $bc=array($bc["red"],$bc["green"],$bc["blue"]); + + $this->SetColor($this->lip($lc,$bc,($x & 0xFFFF)/65535)); + imagesetpixel($this->img,$x>>16,$y>>16,$this->current_color); + $this->SetColor($this->lip($lc,$bc,(~$x & 0xFFFF)/65535)); + if( !$first ) + imagesetpixel($this->img,($x>>16)+1,$y>>16,$this->current_color); + $y += 65536; $x += $xinc; + $first = false; + } + } + $this->SetColor($lc); + //imagesetpixel($this->img,$x2,$y2,$this->current_color); + //imagesetpixel($this->img,$x1,$y1,$this->current_color); + } + + // Set line style dashed, dotted etc + function SetLineStyle($s) { + if( is_numeric($s) ) { + if( $s<1 || $s>4 ) + JpGraphError::RaiseL(25101,$s);//(" Illegal numeric argument to SetLineStyle(): ($s)"); + } + elseif( is_string($s) ) { + if( $s == "solid" ) $s=1; + elseif( $s == "dotted" ) $s=2; + elseif( $s == "dashed" ) $s=3; + elseif( $s == "longdashed" ) $s=4; + else JpGraphError::RaiseL(25102,$s);//(" Illegal string argument to SetLineStyle(): $s"); + } + else { + JpGraphError::RaiseL(25103,$s);//(" Illegal argument to SetLineStyle $s"); + } + $old = $this->line_style; + $this->line_style=$s; + return $old; + } + + // Same as Line but take the line_style into account + function StyleLine($x1,$y1,$x2,$y2) { + switch( $this->line_style ) { + case 1:// Solid + $this->Line($x1,$y1,$x2,$y2); + break; + case 2: // Dotted + $this->DashedLine($x1,$y1,$x2,$y2,1,6); + break; + case 3: // Dashed + $this->DashedLine($x1,$y1,$x2,$y2,2,4); + break; + case 4: // Longdashes + $this->DashedLine($x1,$y1,$x2,$y2,8,6); + break; + default: + JpGraphError::RaiseL(25104,$this->line_style);//(" Unknown line style: $this->line_style "); + break; + } + } + + function Line($x1,$y1,$x2,$y2) { + + $x1 = round($x1); + $x2 = round($x2); + $y1 = round($y1); + $y2 = round($y2); + + if( $this->line_weight==0 ) return; + if( $this->use_anti_aliasing ) { + $dx = $x2-$x1; + $dy = $y2-$y1; + // Vertical, Horizontal or 45 lines don't need anti-aliasing + if( $dx!=0 && $dy!=0 && $dx!=$dy ) { + $this->WuLine($x1,$y1,$x2,$y2); + return; + } + } + if( $this->line_weight==1 ) { + imageline($this->img,$x1,$y1,$x2,$y2,$this->current_color); + } + elseif( $x1==$x2 ) { // Special case for vertical lines + imageline($this->img,$x1,$y1,$x2,$y2,$this->current_color); + $w1=floor($this->line_weight/2); + $w2=floor(($this->line_weight-1)/2); + for($i=1; $i<=$w1; ++$i) + imageline($this->img,$x1+$i,$y1,$x2+$i,$y2,$this->current_color); + for($i=1; $i<=$w2; ++$i) + imageline($this->img,$x1-$i,$y1,$x2-$i,$y2,$this->current_color); + } + elseif( $y1==$y2 ) { // Special case for horizontal lines + imageline($this->img,$x1,$y1,$x2,$y2,$this->current_color); + $w1=floor($this->line_weight/2); + $w2=floor(($this->line_weight-1)/2); + for($i=1; $i<=$w1; ++$i) + imageline($this->img,$x1,$y1+$i,$x2,$y2+$i,$this->current_color); + for($i=1; $i<=$w2; ++$i) + imageline($this->img,$x1,$y1-$i,$x2,$y2-$i,$this->current_color); + } + else { // General case with a line at an angle + $a = atan2($y1-$y2,$x2-$x1); + // Now establish some offsets from the center. This gets a little + // bit involved since we are dealing with integer functions and we + // want the apperance to be as smooth as possible and never be thicker + // then the specified width. + + // We do the trig stuff to make sure that the endpoints of the line + // are perpendicular to the line itself. + $dx=(sin($a)*$this->line_weight/2); + $dy=(cos($a)*$this->line_weight/2); + + $pnts = array(round($x2+$dx),round($y2+$dy),round($x2-$dx),round($y2-$dy), + round($x1-$dx),round($y1-$dy),round($x1+$dx),round($y1+$dy)); + imagefilledpolygon($this->img,$pnts,count($pnts)/2,$this->current_color); + } + $this->lastx=$x2; $this->lasty=$y2; + } + + function Polygon($p,$closed=FALSE,$fast=FALSE) { + if( $this->line_weight==0 ) return; + $n=count($p); + $oldx = $p[0]; + $oldy = $p[1]; + if( $fast ) { + for( $i=2; $i < $n; $i+=2 ) { + imageline($this->img,$oldx,$oldy,$p[$i],$p[$i+1],$this->current_color); + $oldx = $p[$i]; + $oldy = $p[$i+1]; + } + if( $closed ) { + imageline($this->img,$p[$n*2-2],$p[$n*2-1],$p[0],$p[1],$this->current_color); + } + } + else { + for( $i=2; $i < $n; $i+=2 ) { + $this->StyleLine($oldx,$oldy,$p[$i],$p[$i+1]); + $oldx = $p[$i]; + $oldy = $p[$i+1]; + } + if( $closed ) + $this->Line($oldx,$oldy,$p[0],$p[1]); + } + } + + function FilledPolygon($pts) { + $n=count($pts); + if( $n == 0 ) { + JpGraphError::RaiseL(25105);//('NULL data specified for a filled polygon. Check that your data is not NULL.'); + } + for($i=0; $i < $n; ++$i) + $pts[$i] = round($pts[$i]); + imagefilledpolygon($this->img,$pts,count($pts)/2,$this->current_color); + } + + function Rectangle($xl,$yu,$xr,$yl) { + $this->Polygon(array($xl,$yu,$xr,$yu,$xr,$yl,$xl,$yl,$xl,$yu)); + } + + function FilledRectangle($xl,$yu,$xr,$yl) { + $this->FilledPolygon(array($xl,$yu,$xr,$yu,$xr,$yl,$xl,$yl)); + } + + function FilledRectangle2($xl,$yu,$xr,$yl,$color1,$color2,$style=1) { + // Fill a rectangle with lines of two colors + if( $style===1 ) { + // Horizontal stripe + if( $yl < $yu ) { + $t = $yl; $yl=$yu; $yu=$t; + } + for( $y=$yu; $y <= $yl; ++$y) { + $this->SetColor($color1); + $this->Line($xl,$y,$xr,$y); + ++$y; + $this->SetColor($color2); + $this->Line($xl,$y,$xr,$y); + } + } + else { + if( $xl < $xl ) { + $t = $xl; $xl=$xr; $xr=$t; + } + for( $x=$xl; $x <= $xr; ++$x) { + $this->SetColor($color1); + $this->Line($x,$yu,$x,$yl); + ++$x; + $this->SetColor($color2); + $this->Line($x,$yu,$x,$yl); + } + } + } + + function ShadowRectangle($xl,$yu,$xr,$yl,$fcolor=false,$shadow_width=3,$shadow_color=array(102,102,102)) { + // This is complicated by the fact that we must also handle the case where + // the reactangle has no fill color + $this->PushColor($shadow_color); + $this->FilledRectangle($xr-$shadow_width,$yu+$shadow_width,$xr,$yl-$shadow_width-1); + $this->FilledRectangle($xl+$shadow_width,$yl-$shadow_width,$xr,$yl); + //$this->FilledRectangle($xl+$shadow_width,$yu+$shadow_width,$xr,$yl); + $this->PopColor(); + if( $fcolor==false ) + $this->Rectangle($xl,$yu,$xr-$shadow_width-1,$yl-$shadow_width-1); + else { + $this->PushColor($fcolor); + $this->FilledRectangle($xl,$yu,$xr-$shadow_width-1,$yl-$shadow_width-1); + $this->PopColor(); + $this->Rectangle($xl,$yu,$xr-$shadow_width-1,$yl-$shadow_width-1); + } + } + + function FilledRoundedRectangle($xt,$yt,$xr,$yl,$r=5) { + if( $r==0 ) { + $this->FilledRectangle($xt,$yt,$xr,$yl); + return; + } + + // To avoid overlapping fillings (which will look strange + // when alphablending is enabled) we have no choice but + // to fill the five distinct areas one by one. + + // Center square + $this->FilledRectangle($xt+$r,$yt+$r,$xr-$r,$yl-$r); + // Top band + $this->FilledRectangle($xt+$r,$yt,$xr-$r,$yt+$r-1); + // Bottom band + $this->FilledRectangle($xt+$r,$yl-$r+1,$xr-$r,$yl); + // Left band + $this->FilledRectangle($xt,$yt+$r+1,$xt+$r-1,$yl-$r); + // Right band + $this->FilledRectangle($xr-$r+1,$yt+$r,$xr,$yl-$r); + + // Topleft & Topright arc + $this->FilledArc($xt+$r,$yt+$r,$r*2,$r*2,180,270); + $this->FilledArc($xr-$r,$yt+$r,$r*2,$r*2,270,360); + + // Bottomleft & Bottom right arc + $this->FilledArc($xt+$r,$yl-$r,$r*2,$r*2,90,180); + $this->FilledArc($xr-$r,$yl-$r,$r*2,$r*2,0,90); + + } + + function RoundedRectangle($xt,$yt,$xr,$yl,$r=5) { + + if( $r==0 ) { + $this->Rectangle($xt,$yt,$xr,$yl); + return; + } + + // Top & Bottom line + $this->Line($xt+$r,$yt,$xr-$r,$yt); + $this->Line($xt+$r,$yl,$xr-$r,$yl); + + // Left & Right line + $this->Line($xt,$yt+$r,$xt,$yl-$r); + $this->Line($xr,$yt+$r,$xr,$yl-$r); + + // Topleft & Topright arc + $this->Arc($xt+$r,$yt+$r,$r*2,$r*2,180,270); + $this->Arc($xr-$r,$yt+$r,$r*2,$r*2,270,360); + + // Bottomleft & Bottomright arc + $this->Arc($xt+$r,$yl-$r,$r*2,$r*2,90,180); + $this->Arc($xr-$r,$yl-$r,$r*2,$r*2,0,90); + } + + function FilledBevel($x1,$y1,$x2,$y2,$depth=2,$color1='white@0.4',$color2='darkgray@0.4') { + $this->FilledRectangle($x1,$y1,$x2,$y2); + $this->Bevel($x1,$y1,$x2,$y2,$depth,$color1,$color2); + } + + function Bevel($x1,$y1,$x2,$y2,$depth=2,$color1='white@0.4',$color2='black@0.5') { + $this->PushColor($color1); + for( $i=0; $i < $depth; ++$i ) { + $this->Line($x1+$i,$y1+$i,$x1+$i,$y2-$i); + $this->Line($x1+$i,$y1+$i,$x2-$i,$y1+$i); + } + $this->PopColor(); + + $this->PushColor($color2); + for( $i=0; $i < $depth; ++$i ) { + $this->Line($x1+$i,$y2-$i,$x2-$i,$y2-$i); + $this->Line($x2-$i,$y1+$i,$x2-$i,$y2-$i-1); + } + $this->PopColor(); + } + + function StyleLineTo($x,$y) { + $this->StyleLine($this->lastx,$this->lasty,$x,$y); + $this->lastx=$x; + $this->lasty=$y; + } + + function LineTo($x,$y) { + $this->Line($this->lastx,$this->lasty,$x,$y); + $this->lastx=$x; + $this->lasty=$y; + } + + function Point($x,$y) { + imagesetpixel($this->img,round($x),round($y),$this->current_color); + } + + function Fill($x,$y) { + imagefill($this->img,round($x),round($y),$this->current_color); + } + + function FillToBorder($x,$y,$aBordColor) { + $bc = $this->rgb->allocate($aBordColor); + if( $bc == -1 ) { + JpGraphError::RaiseL(25106);//('Image::FillToBorder : Can not allocate more colors'); + } + imagefilltoborder($this->img,round($x),round($y),$bc,$this->current_color); + } + + function DashedLine($x1,$y1,$x2,$y2,$dash_length=1,$dash_space=4) { + + $x1 = round($x1); + $x2 = round($x2); + $y1 = round($y1); + $y2 = round($y2); + + // Code based on, but not identical to, work by Ariel Garza and James Pine + $line_length = ceil (sqrt(pow(($x2 - $x1),2) + pow(($y2 - $y1),2)) ); + $dx = ($line_length) ? ($x2 - $x1) / $line_length : 0; + $dy = ($line_length) ? ($y2 - $y1) / $line_length : 0; + $lastx = $x1; $lasty = $y1; + $xmax = max($x1,$x2); + $xmin = min($x1,$x2); + $ymax = max($y1,$y2); + $ymin = min($y1,$y2); + for ($i = 0; $i < $line_length; $i += ($dash_length + $dash_space)) { + $x = ($dash_length * $dx) + $lastx; + $y = ($dash_length * $dy) + $lasty; + + // The last section might overshoot so we must take a computational hit + // and check this. + if( $x>$xmax ) $x=$xmax; + if( $y>$ymax ) $y=$ymax; + + if( $x<$xmin ) $x=$xmin; + if( $y<$ymin ) $y=$ymin; + + $this->Line($lastx,$lasty,$x,$y); + $lastx = $x + ($dash_space * $dx); + $lasty = $y + ($dash_space * $dy); + } + } + + function SetExpired($aFlg=true) { + $this->expired = $aFlg; + } + + // Generate image header + function Headers() { + + // In case we are running from the command line with the client version of + // PHP we can't send any headers. + $sapi = php_sapi_name(); + if( $sapi == 'cli' ) + return; + + // These parameters are set by headers_sent() but they might cause + // an undefined variable error unless they are initilized + $file=''; + $lineno=''; + if( headers_sent($file,$lineno) ) { + $file=basename($file); + $t = new ErrMsgText(); + $msg = $t->Get(10,$file,$lineno); + die($msg); + } + + if ($this->expired) { + header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT"); + header("Cache-Control: no-cache, must-revalidate"); + header("Pragma: no-cache"); + } + header("Content-type: image/$this->img_format"); + } + + // Adjust image quality for formats that allow this + function SetQuality($q) { + $this->quality = $q; + } + + // Stream image to browser or to file + function Stream($aFile="") { + $func="image".$this->img_format; + if( $this->img_format=="jpeg" && $this->quality != null ) { + $res = @$func($this->img,$aFile,$this->quality); + } + else { + if( $aFile != "" ) { + $res = @$func($this->img,$aFile); + if( !$res ) + JpGraphError::RaiseL(25107,$aFile);//("Can't write to file '$aFile'. Check that the process running PHP has enough permission."); + } + else { + $res = @$func($this->img); + if( !$res ) + JpGraphError::RaiseL(25108);//("Can't stream image. This is most likely due to a faulty PHP/GD setup. Try to recompile PHP and use the built-in GD library that comes with PHP."); + + } + } + } + + // Clear resource tide up by image + function Destroy() { + imagedestroy($this->img); + } + + // Specify image format. Note depending on your installation + // of PHP not all formats may be supported. + function SetImgFormat($aFormat,$aQuality=75) { + $this->quality = $aQuality; + $aFormat = strtolower($aFormat); + $tst = true; + $supported = imagetypes(); + if( $aFormat=="auto" ) { + if( $supported & IMG_PNG ) + $this->img_format="png"; + elseif( $supported & IMG_JPG ) + $this->img_format="jpeg"; + elseif( $supported & IMG_GIF ) + $this->img_format="gif"; + elseif( $supported & IMG_WBMP ) + $this->img_format="wbmp"; + elseif( $supported & IMG_XPM ) + $this->img_format="xpm"; + else + JpGraphError::RaiseL(25109);//("Your PHP (and GD-lib) installation does not appear to support any known graphic formats. You need to first make sure GD is compiled as a module to PHP. If you also want to use JPEG images you must get the JPEG library. Please see the PHP docs for details."); + + return true; + } + else { + if( $aFormat=="jpeg" || $aFormat=="png" || $aFormat=="gif" || $aFormat=="wbmp" || $aFormat=="xpm") { + if( $aFormat=="jpeg" && !($supported & IMG_JPG) ) + $tst=false; + elseif( $aFormat=="png" && !($supported & IMG_PNG) ) + $tst=false; + elseif( $aFormat=="gif" && !($supported & IMG_GIF) ) + $tst=false; + elseif( $aFormat=="wbmp" && !($supported & IMG_WBMP) ) + $tst=false; + elseif( $aFormat=="xpm" && !($supported & IMG_XPM) ) + $tst=false; + else { + $this->img_format=$aFormat; + return true; + } + } + else + $tst=false; + if( !$tst ) + JpGraphError::RaiseL(25110,$aFormat);//(" Your PHP installation does not support the chosen graphic format: $aFormat"); + } + } +} // CLASS + +//=================================================== +// CLASS RotImage +// Description: Exactly as Image but draws the image at +// a specified angle around a specified rotation point. +//=================================================== +class RotImage extends Image { + var $m=array(); + var $a=0; + var $dx=0,$dy=0,$transx=0,$transy=0; + + function RotImage($aWidth,$aHeight,$a=0,$aFormat=DEFAULT_GFORMAT,$aSetAutoMargin=true) { + $this->Image($aWidth,$aHeight,$aFormat,$aSetAutoMargin); + $this->dx=$this->left_margin+$this->plotwidth/2; + $this->dy=$this->top_margin+$this->plotheight/2; + $this->SetAngle($a); + } + + function SetCenter($dx,$dy) { + $old_dx = $this->dx; + $old_dy = $this->dy; + $this->dx=$dx; + $this->dy=$dy; + $this->SetAngle($this->a); + return array($old_dx,$old_dy); + } + + function SetTranslation($dx,$dy) { + $old = array($this->transx,$this->transy); + $this->transx = $dx; + $this->transy = $dy; + return $old; + } + + function UpdateRotMatrice() { + $a = $this->a; + $a *= M_PI/180; + $sa=sin($a); $ca=cos($a); + // Create the rotation matrix + $this->m[0][0] = $ca; + $this->m[0][1] = -$sa; + $this->m[0][2] = $this->dx*(1-$ca) + $sa*$this->dy ; + $this->m[1][0] = $sa; + $this->m[1][1] = $ca; + $this->m[1][2] = $this->dy*(1-$ca) - $sa*$this->dx ; + } + + function SetAngle($a) { + $tmp = $this->a; + $this->a = $a; + $this->UpdateRotMatrice(); + return $tmp; + } + + function Circle($xc,$yc,$r) { + // Circle get's rotated through the Arc() call + // made in the parent class + parent::Circle($xc,$yc,$r); + } + + function FilledCircle($xc,$yc,$r) { + list($xc,$yc) = $this->Rotate($xc,$yc); + parent::FilledCircle($xc,$yc,$r); + } + + function Arc($xc,$yc,$w,$h,$s,$e) { + list($xc,$yc) = $this->Rotate($xc,$yc); + $s += $this->a; + $e += $this->a; + parent::Arc($xc,$yc,$w,$h,$s,$e); + } + + function FilledArc($xc,$yc,$w,$h,$s,$e) { + list($xc,$yc) = $this->Rotate($xc,$yc); + $s += $this->a; + $e += $this->a; + parent::FilledArc($xc,$yc,$w,$h,$s,$e); + } + + function SetMargin($lm,$rm,$tm,$bm) { + parent::SetMargin($lm,$rm,$tm,$bm); + $this->dx=$this->left_margin+$this->plotwidth/2; + $this->dy=$this->top_margin+$this->plotheight/2; + $this->UpdateRotMatrice(); + } + + function Rotate($x,$y) { + // Optimization. Ignore rotation if Angle==0 || ANgle==360 + if( $this->a == 0 || $this->a == 360 ) { + return array($x + $this->transx, $y + $this->transy ); + } + else { + $x1=round($this->m[0][0]*$x + $this->m[0][1]*$y,1) + $this->m[0][2] + $this->transx; + $y1=round($this->m[1][0]*$x + $this->m[1][1]*$y,1) + $this->m[1][2] + $this->transy; + return array($x1,$y1); + } + } + + function CopyMerge($fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth=-1,$fromHeight=-1,$aMix=100) { + list($toX,$toY) = $this->Rotate($toX,$toY); + parent::CopyMerge($fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth,$fromHeight,$aMix); + + } + + function ArrRotate($pnts) { + $n = count($pnts)-1; + for($i=0; $i < $n; $i+=2) { + list ($x,$y) = $this->Rotate($pnts[$i],$pnts[$i+1]); + $pnts[$i] = $x; $pnts[$i+1] = $y; + } + return $pnts; + } + + function Line($x1,$y1,$x2,$y2) { + list($x1,$y1) = $this->Rotate($x1,$y1); + list($x2,$y2) = $this->Rotate($x2,$y2); + parent::Line($x1,$y1,$x2,$y2); + } + + function Rectangle($x1,$y1,$x2,$y2) { + // Rectangle uses Line() so it will be rotated through that call + parent::Rectangle($x1,$y1,$x2,$y2); + } + + function FilledRectangle($x1,$y1,$x2,$y2) { + if( $y1==$y2 || $x1==$x2 ) + $this->Line($x1,$y1,$x2,$y2); + else + $this->FilledPolygon(array($x1,$y1,$x2,$y1,$x2,$y2,$x1,$y2)); + } + + function Polygon($pnts,$closed=FALSE,$fast=false) { + // Polygon uses Line() so it will be rotated through that call unless + // fast drawing routines are used in which case a rotate is needed + if( $fast ) { + parent::Polygon($this->ArrRotate($pnts)); + } + else + parent::Polygon($pnts,$closed,$fast); + } + + function FilledPolygon($pnts) { + parent::FilledPolygon($this->ArrRotate($pnts)); + } + + function Point($x,$y) { + list($xp,$yp) = $this->Rotate($x,$y); + parent::Point($xp,$yp); + } + + function StrokeText($x,$y,$txt,$dir=0,$paragraph_align="left",$debug=false) { + list($xp,$yp) = $this->Rotate($x,$y); + return parent::StrokeText($xp,$yp,$txt,$dir,$paragraph_align,$debug); + } +} + + +?> diff --git a/html/includes/jpgraph/src/imgdata_balls.inc.php b/html/includes/jpgraph/src/imgdata_balls.inc.php new file mode 100644 index 0000000000..11291efd3f --- /dev/null +++ b/html/includes/jpgraph/src/imgdata_balls.inc.php @@ -0,0 +1,1063 @@ + 'imgdata_large', + MARK_IMG_MBALL => 'imgdata_small', + MARK_IMG_SBALL => 'imgdata_xsmall', + MARK_IMG_BALL => 'imgdata_xsmall'); + var $colors_1 = array('blue','lightblue','brown','darkgreen', + 'green','purple','red','gray','yellow','silver','gray'); + var $index_1 = array('blue'=>9,'lightblue'=>1,'brown'=>6,'darkgreen'=>7, + 'green'=>8,'purple'=>4,'red'=>0,'gray'=>5,'silver'=>3,'yellow'=>2); + var $maxidx_1 = 9 ; + + var $colors_2 = array('blue','bluegreen','brown','cyan', + 'darkgray','greengray','gray','green', + 'greenblue','lightblue','lightred', + 'purple','red','white','yellow'); + + + var $index_2 = array('blue'=>9,'bluegreen'=>13,'brown'=>8,'cyan'=>12, + 'darkgray'=>5,'greengray'=>6,'gray'=>2,'green'=>10, + 'greenblue'=>3,'lightblue'=>1,'lightred'=>14, + 'purple'=>7,'red'=>0,'white'=>11,'yellow'=>4); + + var $maxidx_2 = 14 ; + + + var $colors_3 = array('bluegreen','cyan','darkgray','greengray', + 'gray','graypurple','green','greenblue','lightblue', + 'lightred','navy','orange','purple','red','yellow'); + + var $index_3 = array('bluegreen'=>1,'cyan'=>11,'darkgray'=>14,'greengray'=>10, + 'gray'=>3,'graypurple'=>4,'green'=>9,'greenblue'=>7, + 'lightblue'=>13,'lightred'=>0,'navy'=>2,'orange'=>12, + 'purple'=>8,'red'=>5,'yellow'=>6); + var $maxidx_3 = 14 ; + + var $colors,$index,$maxidx; + var $imgdata_large ; + var $imgdata_small ; + var $imgdata_xsmall ; + + + function GetImg($aMark,$aIdx) { + switch( $aMark ) { + case MARK_IMG_SBALL: + case MARK_IMG_BALL: + $this->colors = $this->colors_3; + $this->index = $this->index_3 ; + $this->maxidx = $this->maxidx_3 ; + break; + case MARK_IMG_MBALL: + $this->colors = $this->colors_2; + $this->index = $this->index_2 ; + $this->maxidx = $this->maxidx_2 ; + break; + default: + $this->colors = $this->colors_1; + $this->index = $this->index_1 ; + $this->maxidx = $this->maxidx_1 ; + break; + } + return parent::GetImg($aMark,$aIdx); + } + + function ImgData_Balls() { + +//========================================================== +// File: bl_red.png +//========================================================== + $this->imgdata_large[0][0]= 1072 ; + $this->imgdata_large[0][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAByF'. + 'BMVEX/////////xsb/vb3/lIz/hIT/e3v/c3P/c2v/a2v/Y2P/'. + 'UlL/Skr/SkL/Qjn/MTH/MSn/KSn/ISH/IRj/GBj/GBD/EBD/EA'. + 'j/CAj/CAD/AAD3QkL3MTH3KSn3KSH3GBj3EBD3CAj3AAD1zMzv'. + 'QkLvISHvIRjvGBjvEBDvEAjvAADnUlLnSkrnMTnnKSnnIRjnGB'. + 'DnEBDnCAjnAADec3PeSkreISHeGBjeGBDeEAjWhITWa2vWUlLW'. + 'SkrWISnWGBjWEBDWEAjWCAjWAADOnp7Oa2vOGCHOGBjOGBDOEB'. + 'DOCAjOAADJrq7Gt7fGGBjGEBDGCAjGAADEpKS/v7+9QkK9GBC9'. + 'EBC9CAi9AAC1e3u1a2u1Skq1KSm1EBC1CAi1AACtEBCtCBCtCA'. + 'itAACngYGlCAilAACghIScOTmcCAicAACYgYGUGAiUCAiUAAiU'. + 'AACMKSmMEACMAACEa2uEGAiEAAB7GBh7CAB7AABzOTlzGBBzCA'. + 'BzAABrSkprOTlrGBhrAABjOTljAABaQkJaOTlaCABaAABSKSlS'. + 'GBhSAABKKSlKGBhKAABCGBhCCABCAAA5CAA5AAAxCAAxAAApCA'. + 'ApAAAhAAAYAACc9eRyAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'. + 'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkRFD'. + 'UHLytKAAAB4UlEQVR4nGNgIAK4mGjrmNq6BmFIWMmISUpKSmk5'. + 'B8ZEokj4qoiLiQCBgqald3xaBpKMj6y4sLCQkJCIvIaFV0RaUR'. + 'lCSk5cWEiAn19ASN7QwisuraihHiajKyEixM/NwckjoKrvEACU'. + 'qumpg7pAUlREiJdNmZmLT9/cMzwps7Smc3I2WEpGUkxYkJuFiY'. + 'lTxszePzY1v7Shc2oX2D+K4iLCgjzsrOw8embuYUmZeTVtPVOn'. + 'gqSslYAOF+Ln4ZHWtXMPTcjMrWno7J82rRgoZWOsqaCgrqaqqm'. + 'fn5peQmlsK1DR52vRaoFSIs5GRoYG5ub27n19CYm5pdVPnxKnT'. + 'pjWDpLydnZwcHTz8QxMSEnJLgDL9U6dNnQ6Sio4PDAgICA+PTU'. + 'zNzSkph8hADIxKS46Pj0tKTc3MLSksqWrtmQySAjuDIT8rKy0r'. + 'Kz+vtLSmur6jb9JUIJgGdjxDQUVRUVFpaUVNQ1NrZ9+kKVOmTZ'. + 'k6vR0sldJUAwQNTU2dnX0TgOJTQLrSIYFY2dPW1NbW2TNxwtQp'. + 'U6ZMmjJt2rRGWNB3TO7vnzh5MsgSoB6gy7sREdY7bRrQEDAGOb'. + 'wXOQW0TJsOEpwClmxBTTbZ7UDVIPkp7dkYaYqhuLa5trYYUxwL'. + 'AADzm6uekAAcXAAAAABJRU5ErkJggg==' ; + +//========================================================== +// File: bl_bluegreen.png +//========================================================== + $this->imgdata_large[1][0]= 1368 ; + $this->imgdata_large[1][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMMFi8hE9b2uAAABOVJREFUeNq9lk2sJFUVx3+3qv'. + 'tW95t57zFvhiFxmCFRUJRoNCQiJARMhiFx/Igxii5goTG6ZDAu'. + '/EhcSCIrTAgLEiKsJ8ywABNZEMJXEDYCukAmjgjzBkK/j35V1d'. + '333FtV97io97pfzwxfG86qcu/N+Z3zP+fcW/Apmfk4hx57+R/6'. + 'Rqmc9ykhsWjlsUngAA1fXIQ7b73pI/186IGHnn9dH/8frC8v4I'. + 'PiG53uaerR4GmKkv31mB8cyfjd946ZTwR66qVX9OTWIi8UKUv9'. + 'BOrZXpYZvFeiBvzI0fgSUSFKwbVG+Pl1V3HH0VvNR4KeeukV/f'. + 'PmMmdHhst76aXD64AbeVQ9bjNHaiGOC2o3wLrAb2/4LL/84ffn'. + 'fCdzkOdayKpLppBemrBsU5Y1Zdmm9LJdGU6E/t4M24Q26jRDRL'. + 'j3mdc49cSTekFsMzs5XuTsyLDUNSDQ25NwKOly9YIl22MYhJr/'. + 'uoDtBBoT0CxBRGYOAhibIaOCe//2MpfM6KHnX9cXipSlbkKWmS'. + 'nk9iv38J0jixw7vJfrTMYBOvhSoQHJBS09ANELloAGDxW8tfoW'. + 'J+5/UC8CPS0LU7r3SpYarr7M8rmFjMPLXT6/33L4si7Z2GCrQC'. + '+0ctlOaNs9DReV8vSLr85ndPLpZ/WNvHW+01kAVFBOGvJx0wYg'. + 'Sp47RIQ4Emwa8FGJXlDxSCFo5YlVgAo2hwPue/hRndboTV3EW2'. + 'Wp3k6wBp8q56QiWzecW6vwQfnPRkAWhFgILnq08jQ+R2nlUzzN'. + 'uES9Q7Vd+9fba7NmWJW61db2247qACmcjxXr45psYphsFGSLBu'. + 'kIajxqtjNwHkvAjQt0sg3crhPA2+fPz0CuyNFOghsGsr19mnFg'. + 'DGwrRm8UoAtNmQPQtRXDgdC4HImCFEKcCE0oieUWUYq2LtbiGp'. + 'mBQmppfIkjw45DK0QNNkvQ0jMBtPL0UnDRM1rN+cxKwzvOo2NP'. + 'tykR9a1kfpZNDLMG6QDYJqCTBvUe1+uxs+YKyPoGrTwY2HhvC4'. + 'CDWQd5d4xNApNQEEMgjgLdUCLBQ5cprL/trwNwKG2IUmDqDFd5'. + 'sr5BWrlxuSdLDFEFlqAzXGc4zFjupqh6uqYihpxJcEgp026l2w'. + '7wFUv7Z6AvrfRo/n0OYzPwIKE3HUKAJg2otMBiElnsF7wngis9'. + '3ZDjNnLi7huCWUZfueZKTu/M0V3HvmkOFDVxVKDG04ScejSgW5'. + 'V0q5JYFEghuDLHlTmToqDeGOCKIVtrW9hsdmXufEcNLPSXuPHa'. + 'a+bvuh9df5AH/v5PDFmbWQC3Mx+TVvfGVTRB2CodNgT2JBX003'. + 'aANZAYS/BxCv32TV/l2C03G7jgmfjGiT/qmeEmibEYm7XzAO2k'. + 'A+pbgHhBgydqu54YO5eRiLCy7yDvPP6Xqf+5Z+Lu277OYuOpiw'. + 'H15oBmlNOMcmK5RbP+PrEscGU+DSAxdg4CICIkxnLP8aNz63Og'. + 'H3/rdvOb795GVhuaYo0oBc3GGrEsUPVTwO6a7LYd+X51x3Hu/t'. + 'lP5tS65FN+6okn9U+n/sqb596dTvhOF+02myXTmkQNrOw7yD3H'. + 'j14E+UDQjp24/0E9/eKrbA4HH3aMK1b2ccvXvswjv//1J/s5ud'. + 'Due/hRPfP+OmfOrk7vrn7a48ihA3zh8CH+8Iuffiw/n4r9H1ZZ'. + '0zz7G56hAAAAAElFTkSuQmCC' ; + +//========================================================== +// File: bl_yellow.png +//========================================================== + $this->imgdata_large[2][0]= 1101 ; + $this->imgdata_large[2][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAB2l'. + 'BMVEX//////////+///+f//9b//8b//73//7X//63//6X//5T/'. + '/4z//4T//3P//2v//1r//0r//0L//zH//yn//yH//xj//xD//w'. + 'j//wD/90L/9zn/9zH/9xj/9xD/9wj/9wD39yn37zn37zH37yH3'. + '7xD37wj37wDv70Lv50rv50Lv5znv5yHv5xjv5wjv5wDn51Ln5x'. + 'Dn3jHn3iHn3hjn3hDn3gje3oze3nPe3lLe1oze1nPe1lLe1ine'. + '1iHe1hje1hDe1gje1gDW1qXW1mvWzqXWzkLWzhjWzhDWzgjWzg'. + 'DOzrXOzq3OzpzOzgDOxkrOxinOxhjOxhDOxgjOxgDGxqXGxnvG'. + 'xmvGvRjGvRDGvQjGvQDFxbnAvr6/v7+9vaW9vZS9vQi9vQC9tR'. + 'C9tQi9tQC7u7W1tZS1tXu1tTG1tQi1rRC1rQi1rQCtrYytrSGt'. + 'rQitrQCtpYStpSGtpQitpQClpYSlpXulpQClnBClnAilnACcnG'. + 'ucnAicnACclAiclACUlFqUlCmUlAiUlACUjFKUjAiUjACMjFKM'. + 'jEqMjACMhACEhACEewB7ezF7exB7ewB7cwBzcylzcwBzaxBzaw'. + 'BraxhrawhrawBrYxBrYwBjYwBjWgBaWgBaUgCXBwRMAAAAAXRS'. + 'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'. + 'LdfvwAAAAHdElNRQfTAwkRFBKiJZ4hAAAB7ElEQVR4nI3S+1vS'. + 'UBgHcB67WJmIMWAVdDHEDLBC6Go0slj3Ft0m9RRBWQEmFZFDEM'. + 'Qgt0EMFBY7p/+198hj1kM/9N1+++x73rOd6XT/kStnTx4fPzd9'. + 'uwfOjFhomj7smAhwj/6Cm2O0xUwy6g7cCL99uCW3jtBmE7lsdr'. + 'fvejgpzP7uEDFRRoqy2k8xQPnypo2BUMP6waF9Vpf3ciiSzErL'. + 'XTkPc0zDe3bsHDAcc00yoVgqL3UWN2iENpspff+2vn6D0+NnZ9'. + '6lC5K6RuSqBTZn1O/a3rd7v/MSez+WyIpVFX8GuuCA9SjD4N6B'. + 'oRNTfo5PCAVR0fBXoIuOQzab1XjwwNHx00GOj8/nKtV1DdeArk'. + '24R+0ul9PjmbrHPYl+EipyU0OoQSjg8/m83kl/MMhx0fjCkqio'. + 'SMOE7t4JMAzDsizH81AqSdW2hroLPg4/CEF4PhKNx98vlevrbY'. + 'QQXgV6kXwVfjkTiSXmhYVcSa7DIE1DOENe7GM6lUym0l+EXKks'. + 'K20VAeH2M0JvVgrZfL5Qqkiy0lRVaMBd7H7EZUmsiJJcrTdVja'. + 'wGpdbTLj3/3qwrUOjAfGgg4LnNA5tdQx14Hm00QFBm65hfNzAm'. + '+yIFhFtzuj+z2MI/MQn6Uez5pz4Ua41G7VumB/6RX4zMr1TKBr'. + 'SXAAAAAElFTkSuQmCC' ; + +//========================================================== +// File: bl_silver.png +//========================================================== + $this->imgdata_large[3][0]= 1481 ; + $this->imgdata_large[3][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAADAF'. + 'BMVEUAAADOzs7Gxsa9vb21tbXOxsbOzsbGzsb3///O1ta1vb2c'. + 'paVSWlpKWlpSY2ve5+97hIze7/9aY2vO5/9zhJRaa3tSY3PGzt'. + 'aMlJxrc3tja3NKUlpCSlK1vcZze4RSWmPW5/+Upb3G3v9zhJxS'. + 'Y3t7jKVaa4TO3veltc6ElK1re5Rjc4ycpbV7hJRaY3M5QlLn7/'. + '/Gzt6lrb2EjJzO3v9ja3vG1ve9zu+1xueltdacrc6UpcaMnL1C'. + 'SlqElLV7jK1zhKVre5zW3u/O1ue1vc6ttcaMlKVze4xrc4RSWm'. + 'tKUmPG1v+9zve1xu+tveeltd6crdbe5/+9xt6cpb17hJxaY3s5'. + 'QlrW3vfO1u/Gzue1vdattc6lrcaUnLWMlK2EjKVze5Rrc4xja4'. + 'RSWnNKUmtCSmO9xuecpcZ7hKVaY4TW3v/O1vfGzu+1vd6ttdal'. + 'rc69xu+UnL2MlLWEjK1ze5xrc5R7hK1ja4zO1v+1veettd6lrd'. + 'aMlL3Gzv/39//W1t7Gxs61tb29vcatrbWlpa2cnKWUlJyEhIx7'. + 'e4TW1ufGxta1tcZSUlqcnK3W1u+UlKW9vda1tc57e4ytrcalpb'. + '1ra3vOzu9jY3OUlK29vd6MjKWEhJxaWmtSUmNzc4xKSlpjY3tK'. + 'SmNCQlqUjJzOxs7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAD///9fnkWVAAAAAnRSTlP/AOW3'. + 'MEoAAAABYktHRP+lB/LFAAAACXBIWXMAAABFAAAARQBP+QatAA'. + 'AB/klEQVR42mNgxAsYqCdd3+lcb4hLmj8wMMvEu8DCMqYbU9op'. + 'UEFB2MTb26eyysomFl06XEEhUCHLpAKo2z/fujikEUVaXUFBMB'. + 'BouLePuV+VVWGRciIXknSEsImCQd3//xwmPr65llaFcSFJHkjS'. + '3iYmWUDZ//8NfCr989NjNUMSUyTg0jneSiaCINn/gmlVQM12qg'. + 'lJnp5waTMTE5NAkCyHWZW/lXWNfUlikmdYK0zax7siS4EDKJtd'. + 'mQeU1XRwLBdLkRGASucWmGVnZ4dnhZvn5lmm29iVOWpnJqcuko'. + 'JKR1Wm5eTkRKYF5eblp9sU2ZeUJiV7zbfVg0pH56UFBQXNjIqK'. + 'jgkujItX1koKTVmYajsdKu2qETVhwgSXiUDZ2Bn9xqUeoZ5e0t'. + 'LzYYZ3B092ndjtOnmKTmycW1s7SHa+l5dtB8zlccE6RlN0dGbM'. + 'mDVbd5KupNBcL6+F82XgHouLj5vRP2PWLGNdd4+ppnxe8tJec6'. + 'XnNsKkm0uVQ5RDRHQTPTym68nPlZbvkfYCexsa5rpJ2qXa5Umm'. + 'ocmec3m8vHjmSs+fgxyhC5JDQ8WSPT2lvbzm8vDIe0nbtiBLN8'. + '8BigNdu1B6Lsje+fPbUFMLi5TMfGmvHi/puUAv23q2YCTFNqH5'. + 'MvPnSwPh3HasCbm3XUpv+nS5VtrkEkwAANSTpGHdye9PAAAASn'. + 'RFWHRzaWduYXR1cmUANGJkODkyYmE4MWZhNTk4MTIyNDJjNjUx'. + 'NzZhY2UxMDAzOGFhZjdhZWIyNzliNTM2ZGFmZDlkM2RiNDU3Zm'. + 'NlNT9CliMAAAAASUVORK5CYII=' ; + +//========================================================== +// File: bl_purple.png +//========================================================== + $this->imgdata_large[4][0]= 1149 ; + $this->imgdata_large[4][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAACAV'. + 'BMVEX/////////7///5///1v//xv//rf//pf//lP//jP//hP//'. + 'c///a///Wv//Wvf/Uv//Sv//Qv//Qvf/Off/Mf//Kf//If//If'. + 'f/GP//GPf/EP//EPf/CP//CPf/CO//AP//APf3Oe/3Kff3Ke/3'. + 'Ie/3GO/3EO/3AO/vSu/vSufvOefvMefvIefvGOfvEOfvCOfvAO'. + 'fnUufnSufnMd7nId7nGN7nGNbnEN7nCN7nAN7ejN7ejNbec97e'. + 'c9beUtbeQtbeIdbeGNbeENbeCNbeANbWpdbWa9bWQs7WGM7WEM'. + '7WCM7WAM7Otc7Orc7OnM7OSsbOIb3OGMbOEMbOCMbOAM7OAMbG'. + 'pcbGnMbGe8bGa8bGKbXGEL3GCL3GAL3FucXBu73AvsC/v7+9pb'. + '29Ka29GLW9ELW9CLW9AL29ALW5rrm1lLW1e7W1MbW1GKW1EK21'. + 'CLW1CK21AK2tjK2thKWtMaWtIaWtGJytCK2tCKWtAK2tAKWlhK'. + 'Wle6WlEJylCJylAKWlAJyca5ycGJScEJScCJScAJycAJSUWpSU'. + 'UoyUKZSUEIyUCIyUAJSUAIyMUoyMSoyMIYSMEISMCISMAIyMAI'. + 'SECHuEAISEAHt7MXt7EHt7CHt7AHt7AHNzKXNzEGtzAHNzAGtr'. + 'GGtrEGNrCGtrAGtrAGNjCFpjAGNjAFpaAFpaAFIpZn4bAAAAAX'. + 'RSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsS'. + 'AdLdfvwAAAAHdElNRQfTAwkRFB0ymoOwAAAB9UlEQVR4nGNgIA'. + 'K42hhqGtm5+WFIWClKycvLK6gbuARGoEj4aMjLSElISUir6Tt7'. + 'x+aEIWR8leQlwEBSTc/CK7awLguuR0lGQkJMVFRUTFJVzwko1d'. + 'oFk9OQl5IQE+Dh5hVR0TV3CkkvbJgyASJjDZIR5GBl5eRX0TH1'. + 'DEqrbJ2ypBEspSgvJSXKw8bMxMavbOLoGZNf1TZlybw4oIyfLN'. + 'BxotxsLEzsQiaOHkFpBQ2905esrAZK2SpIAaUEuDm5+LTNPAKj'. + 'C+pbps1evrIDKGWnLictKSkuLKyoZQyUya9o7Z2+YMXKGUApew'. + 'M9PTVdXR0TEwf3wOjUirruafOXL18xFyjl72Kpb25qaurg4REU'. + 'EFVe2zJ5zpLlK1aCpbydnZ2dnDwDA6NTopLLeiZNXbB8BcTAyP'. + 'TQ0JDg4KCY1NS83JKmiVOBepYvX9UPlAovzEiPSU/LLyior2vq'. + 'mjZr3vLlIF01IC+XVhUWFlZW1Lc290ycOGfxohVATSsXx4Oksn'. + 'vaWlsb2tq6J0+bM2/RohVA81asbIcEYueU3t7JU6ZNnwNyGkhm'. + '+cp5CRCppJnzZ8+ZM3/JUogECBbBIixr8Yqly8FCy8F6ltUgoj'. + 'lz7sqVK2ByK+cVMSCDxoUrwWDVysXt8WhJKqG4Y8bcuTP6qrGk'. + 'QwwAABiMu7T4HMi4AAAAAElFTkSuQmCC' ; + +//========================================================== +// File: bl_gray.png +//========================================================== + $this->imgdata_large[5][0]= 905 ; + $this->imgdata_large[5][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAABO1'. + 'BMVEX////////3///39/fv7+/e5+fW3t7Wzs7WxsbG1tbGzsbG'. + 'xsbDxMS/v7++wMC+v7+9zsa9xsa9vb29tbW9ra29pa24uLi1xs'. + 'a1vb21tbWxtrattbWmpqalra2cra2cpaWcnJycjIyUpaWUnJyU'. + 'lJSUjIyMnJyMnJSMlJSMlIyMjJSMjIyElJSElIyEjIyEhIR7jI'. + 'x7hIR7hHt7e3t7e3N7e2tzhIRze3tze3Nzc3Nre3trc3Nrc2tr'. + 'a2tjc3Njc2tja3Nja2tjY2NjWlpaa2taY2taY2NaY1paWlpaUl'. + 'JSY2NSY1pSWlpSWlJSUlJSUkpKWlpKWlJKUlpKUlJKUkpKSkpK'. + 'SkJCUlJCUkJCSkpCSkJCQkI5Sko5QkI5Qjk5OUI5OTkxQkIxOT'. + 'kxMTkxMTEpMTEhMTEhKSkYISEpy7AFAAAAAXRSTlMAQObYZgAA'. + 'AAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdE'. + 'lNRQfTAwkRFQfW40uLAAABx0lEQVR4nI3SbXfSMBQA4NV3nce5'. + 'TecAHUywRMHSgFuBCFsQUqwBS1OsWQh0GTj//y8wZUzdwQ/efM'. + 'tzcm/uuXdj4z9ic/PR9k4qk1qDnf0X2/uZzKt8GaRvSubg4LVp'. + 'mkWzCGAT/i3Zsm2XNQHLsm2n2937LaaNnGoJFAEo27B50qN0ay'. + 'Wg26lXsw8fP8nmzcJb2CbsnF5JmmCE8ncN404KvLfsYwd7/MdV'. + 'Pdgl/VbKMIzbuwVgVZw2JlSKJTVJ3609vWUY957lgAUd1KNcqr'. + 'yWnOcOPn8q7d5/8PywAqsOOiVDrn42NFk+HQ7dVuXNYeFdBTpN'. + 'nY5JdZl8xI5Y+HXYaTVqEDp1hAnRohZM03EUjMdhn5wghOoNnD'. + 'wSK7KiiDPqEtz+iD4ctdyAifNYzUnScBSxwPd6GLfRURW7Ay5i'. + 'pS5bmrY8348C5vvUI+TLiIVSJrVA0heK/GDkJxYMRoyfCSmk4s'. + 'uWc3yic/oBo4yF374LGQs5Xw0GyQljI8bYmEsxVUoKxa6HMpAT'. + 'vgyhU2mR8uU1pXmsa8ezqb6U4mwWF/5MeY8uLtQ0nmmQ8UWYvb'. + 'EcJaYWar7QhztrO5Wr4Q4hDbAG/4hfTAF2iCiWrCEAAAAASUVO'. + 'RK5CYII=' ; + +//========================================================== +// File: bl_brown.png +//========================================================== + $this->imgdata_large[6][0]= 1053 ; + $this->imgdata_large[6][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAABoV'. + 'BMVEX////Gzs7GvbXGrZTGpXu9nHO1nHO1nIy9taXGxs7GtaXO'. + 'nHPGlFrGjEq9hEq1hEqte0Klczmcazmce1KtnIzGxsbGvb3OlF'. + 'LOlFq9hFKte0qcc0KUYzGEWimMc1K9ta3OnGvOnGPWnGO9jFq9'. + 'jFKlc0KUazmMYzl7UilzUjGtpZzGxr3GnGPWpWvepXO1hFJ7Wj'. + 'FrSiFjUjG1ra3GnHPvxpT/5733zpythFKUa0KEYzlzUilaOSF7'. + 'Wjm9jErvvYz/99b///f/78bnrYS1hFqle0p7UjFrSiljQiFCMR'. + 'iMhHO9lGvGjFLWnGv/3q3////erXuthEqlc0paQiFKMRhSQin/'. + '1qX/997//++cc0pjSilaQilKORhCKRiclIy9pYzGlGPntYT33q'. + '3vvZSEWjlSOSE5KRB7c2O1lHutczmthFqte1JrWkqtjGtCKRBa'. + 'SjmljGuca0KMYzGMaznOztaclISUYzmEWjFKOSF7a1qEYzFaSi'. + 'GUjISEa0pKOSm9vb2llIxaQhg5IQiEc2tzY0paORilnJy1raVS'. + 'OSljUkJjWkKTpvQWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'. + 'gAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkREiei'. + 'zP2EAAAB9UlEQVR4nGWS/VfSUBjHL5QluhhBxtwyWcCus5Blpm'. + 'wDC4ONaWXCyBi7RMZmpQ2Bypm9W/byV3cHHo/W88s95/s5z/d5'. + 'uwCcCh/4L3zAf+bs0NC588On9QAYGSUuBINk6GI4cmnsBLk8Go'. + '1SFEGMkzRzZeLq5JE8FvDHouw1lqXiCZJOcnCKnx4AcP0GBqmZ'. + 'mRgRT9MMB4Wbs7cGSXNRik3dnp9fiMUzNCNKgpzN9bsaWaQo9s'. + '7dfH7pXiFTZCBU1JK27LmtBO8TDx7mV1eXHqXXyiIUFLWiVzHx'. + 'BxcJIvV4/cn6wkqmWOOwmVE3UQOAp6HxRKL5bGPj+VwhUhalFq'. + '8alm5vAt+LlySZTsebzcKrraIIW4JqZC3N3ga+1+EQTZKZta1M'. + 'pCZCSeDViqVrThsEdsLJZLJYLpZrHVGScrKBvTQNtQHY6XIM02'. + 'E6Ik7odRW1Dzy3N28n3kGuB3tQagm7UMBFXI/sATAs7L5vdbEs'. + '8Lycm923NB0j5wMe6KOsKIIyxcuqauxbrmlqyEWfPmPy5assY1'. + 'U1SvWKZWom9nK/HfQ3+v2HYZSMStayTNN0PYKqg11P1nWsWq7u'. + '4gJeY8g9PLrddNXRdW8Iryv86I3ja/9s26gvukhDdvUQnIjlKr'. + 'IdZCNH+3Xw779qbG63f//ZOzb6C4+ofdbzERrSAAAAAElFTkSu'. + 'QmCC' ; + +//========================================================== +// File: bl_darkgreen.png +//========================================================== + $this->imgdata_large[7][0]= 1113 ; + $this->imgdata_large[7][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAB2l'. + 'BMVEX////////3///v///n/+/e99bW/+/W99bO786/v7++vr69'. + '/96999a7wb24vbu1/9a1zqW1u7itxrWosq6l772l1qWlxrWlxq'. + '2lva2cxpSU562U3q2UxqWUvaWUpZyM77WM57WMvYyMtZyMrZyM'. + 'pZSMnJSEvZyEtYyErZSElIx7zpR7xpx7xpR7vZR7jIRz1pRzxp'. + 'RzjIRrzpRrzoxrxoxrtYRrrYxrrXtrpYRrhHNjzoxjxoxjxoRj'. + 'vYRjtYRjrXtjpXtjlGNje2tazoxazoRaxoxaxoRavYRatYRatX'. + 'tarXtapXNanHNajFpae2tSzoRSxoRSvXtStXtSrXtSrXNSpXNS'. + 'nHNSnGtSlGtSlGNSjGtSjGNKvXtKtXNKrXNKpWtKnGtKlGNKjG'. + 'NKhGNKhFJKc1pKa1JCrWtCpWtCnGtClGNCjGNCjFpChFpCe1JC'. + 'a1JCY1I5pWs5nGM5lGM5jFo5hFo5e1o5c0o5WkoxjFoxhFoxhF'. + 'Ixe1Ixc1Ixc0oxa0ophFIpe0opc0opa0opa0IpY0IpWkIpWjkp'. + 'UkIpUjkhc0oha0IhY0IhWjkhWjEhUjkhUjEhSjEhSikhQjEhQi'. + 'kYWjkYSjEYSikYQjEYQikQSikQQikQQiEQOSExf8saAAAAAXRS'. + 'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'. + 'LdfvwAAAAHdElNRQfTAwkRFCaDkWqUAAAB+ElEQVR4nI3S+1vS'. + 'UBgHcGZlPV0ks/vFrmQWFimJjiwiYUJWjFBWFhClyZCy5hLrwA'. + 'x2EIwJC1w7zf2vnU0re+iHvs9++7x7zznvORbLf+TA6ct9fYMX'. + 'jrfAUYefpp+/iM1ykxf/lmuhUZ/PTwXC8dml5Wcd23o5H5Mk6b'. + '5NUU8icXbhS67rNzn9JDnguOEYGQtEEtwC+Crs3RJ76P5A/znr'. + 'vsNX7wQnEiwHCtK7TTkW8rvdZ9uJtvZTLkxpHhSrP66bNEj7/P'. + '3WNoLYeeSWQQCIpe9lQw7RNEU5rDsIYtcJ14Nocg7kRUlBNkxn'. + 'YmGKcp7cv3vPwR7XOJPmc0VYU3Sv0e9NOBAYG7Hbz/cMjTMveZ'. + 'CHkqxuTBv0PhYJB4N3XR6PJ5rMAPMnpGUxDX1IxSeMTEaZp1OZ'. + 'nGAIQiYtsalUIhFlmGTy3sO3AizJCKn6DKYryxzHsWyaneMzr6'. + 'cWxRVZVlFTe4SpE3zm+U/4+whyiwJcWVMQNr3XONirVWAklxcE'. + 'EdbqchPhjhVzGpeqhUKhWBQhLElr9fo3pDaQPrw5xOl1CGG1JE'. + 'k1uYEBIVkrb02+o6RItfq6rBhbw/tuINT96766KhuqYpY3UFPF'. + 'BbY/19yZ1XF1U0UNBa9T7rZsz80K0jWk6bpWGW55UzbvTHZ+3t'. + 'vbAv/IT+K1uCmhIrKJAAAAAElFTkSuQmCC' ; + +//========================================================== +// File: bl_green.png +//========================================================== + $this->imgdata_large[8][0]= 1484 ; + $this->imgdata_large[8][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMMFjM4kcoDJQAABVlJREFUeNq9ll2MJFUVx3/11V'. + 'Vd/TE9vU0v4zLDwJIF16jBqLAPhsRXEiDqg0QTJiQSjcSNvCzw'. + 'sBEDDxizhvAAxBgf1oR9QF9NiE9ESFZkQyZB5WtddmdnZ3qqqr'. + 'uqbt367Cofqu3ZZpWVaDzJfbkf53//55z/PVdZXV3l/2H6f7Lp'. + '5VdOV/4Nb+GmHpUeA7AdBNxc3kafNb73jRPK9Xwon8ToxVefqU'. + 'b91wibH5EkCQBCizFihTSviHUHR0hWws9xe3wvJ7/7nPKpgX5y'. + '9oFqt3eOgWniRBoAbUBGGqZUibSYaeoT2B5bnkdaSA6793Cv/S'. + 'QPPbihXBfo5VdOV+8dfgnvwAU62YH5fCZ12sDujFkwyegCqTrB'. + 'iUOKTOJKj8jr88jS8zy6cXwBTP048nuHX0I0nDlIp7RpTG7kM0'. + 'sdyAYsTVukUuWGhlWHMq0ITL92lnUp9R1Obz/GmTNnqn9bDD8/'. + '+0D1oX0O0zQZZDYCsK2j3Gl9jQqDfHiei8GfiKVLlsZkJaBAN1'. + '0i6PgwUbB0GxG5/PrtE/xLRr959Znqw9452oVNI+jiJhnr1pe4'. + 'k29zB1/nFr5Kj7tpt1YYhJ0FJ7nUYbcJQBgahN2MzeCP/OipR6'. + 'prgN6Qr6ELFQFUWoRpNVjlKwxZB8DCpE+PtfEKqV1cUzxpVudu'. + 'GTBHA5Y1g99e+dUio9O/P1Vpq+/WE5GGjDSMoAtAQjrf3C52IP'. + 'QxpY4WK2hpReka9Gfrhqgz0bACRoCWjDh56kQ1z9FeuUUQxVhK'. + 'B92sD1VahM+bAJgcoJhGjP/6Ln8rAgDiRCVRKiIzxMkkodBJ85'. + 'im1IlEHbE4k1xyNveL4YP8HarmGJIOpqyjeQmfNHmTvnqZTWBt'. + 'vIJXpPwlukJSuSTKGK3pEwtJmiX00ZlInTyNscImO6XBITvH1c'. + '8vVt2OucdKvIyeKRTNCivsEMgcpg6taYs30nfq0Gqg6hOSSFJ4'. + 'BSnJPht0IqEjWmOGocEI6F0J94F0qaL6BntTF0MtUfweKQKAPU'. + 'Wwp4OcVnQAmVb0p9DLOzjEhEKnGRmoRc7EzRGlwA6NujAKG4yP'. + '6Sjwc4aVznZ7DK0xXdkDoJf0kGmFBniFBOBGcZSCCSKd0IwN0k'. + 'IS+QZWCGVZex4BnUxya3+Zt9iugQbcRFpIAtuHvAZulPUdLhUJ'. + 'RqegI3WcqaSXddlT3idsWMSRRGkEtNwmyTifAwyBo7LP+11J0e'. + '7tM7pZOYblHkBLcqZ5LcYtw6Wbd4CM3SpE9foYZsIHoqDKCrbz'. + 'mLSQtPwmuhXgtBLs0GBdbXOhFGB7WBKO2F8GXt9/VO97Ya3atF'. + '7nUHnwGjGGQqcPxFEdFqURkEidiZszAERoYIsGju1hq21kWee3'. + 'bw15+8WpsvAy3K1+i3JkkhZyPpxxjjPOsfOYiZ+TFhLPzQnHOU'. + 'tpzGB2dgA4tscIkKIx19Cxg/fPL7vQJu47eXt1VvsDK8pwPueZ'. + 'PuZoQMOqhRoJHSs0kKLBWjvjYinmeQGw1TaX1RFdfZ3LMzYLjA'. + 'C++dkn6AaH2Nobk6cxEzdnuG0TdC8zvdJkN0hqkFkO/jwL0fxa'. + 'so8sBcuFzQ+/+MRC+BeAHnpwQzn++ee5KT9Eshuy46dcKAXm32'. + '0uzPQhS4GttkH2GQID2Wc0Y4LtAbDxhZ/x5A+e/uTG9+jGceXH'. + '9/ySnnIXnUzOxXe1038mW3ZynNmam4yYWkO+f9cv+Oljz16/lV'. + '9tDz/9nerc1hm8ZEScSRK7VvtYl1i1dklsOKyvc+zg/bzw1O8+'. + '/efkajt56kR1ydlEJBc5H46xzbrJ3dY9wrB7hGcff+6/+279L+'. + '0fHxyiE8XMLl4AAAAASUVORK5CYII=' ; + +//========================================================== +// File: bl_blue.png +//========================================================== + $this->imgdata_large[9][0]= 1169 ; + $this->imgdata_large[9][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAACEF'. + 'BMVEX/////////7//35//v1v/exv/Wvf/Wrf/Wpf/Orf+/v7+9'. + 'tc69jP+9hP+5ucW1tc6tlP+rq7Wlpdalpcalpb2cnM6cnMacc/'. + '+cWv+UlLWUjN6UjK2Uc/+Ma/+MUv+EhKWEa/+EQvd7e8Z7e7V7'. + 'e6V7c957Wv9za9Zza8ZzSv9ra5xrSv9rOf9rMe9jUudjQv9jOe'. + '9aWpRaUt5aUpRaSu9aSudSUoxSSs5SSoxSMf9KQtZKOfdKMedK'. + 'Kf9KKe9CKf9CKb1CKa1CIfdCIedCId45MXs5Kfc5If85Iec5Id'. + 'Y5GP8xMbUxMXsxKc4xKZQxIf8xGP8xGO8xGN4xGNYxGL0xGK0p'. + 'KXMpIYwpGP8pGO8pGOcpGNYpGM4pEP8pEPcpEOcpEN4pENYpEM'. + 'YpEL0hGKUhEP8hEPchEO8hEOchEN4hENYhEM4hEMYhELUhCP8h'. + 'CO8hCN4YGJwYGGsYEL0YEK0YEHMYCN4YCM4YCMYYCL0YCKUYAP'. + '8QEJQQEIwQEHsQEGsQCM4QCLUQCK0QCKUQCJwQCJQQCIwQCHMQ'. + 'CGsQAP8QAPcQAO8QAOcQAN4QANYQAM4QAMYQAL0QALUQAKUQAJ'. + 'QQAIQICGsICGMIAO8IANYIAL0IALUIAK0IAKUIAJwIAJQIAIwI'. + 'AIQIAHsIAHMIAGsIAGMAAN4AAMYAAK0AAJQAAIwAAIQAAHMAAG'. + 'sAAGMAAFrR1dDlAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkRFRPMOZ'. + '/2AAAB+klEQVR4nGNgIAIIqeqZmBqpi2JISNml5lVXV3d198Yo'. + 'oUjwm1SnxsbGRsSm5ZfNXO4tjCTjVh0ABhFx6QV9E1Y0S8JkuN'. + '3yAgLc7W3t/QPi4jPKJ8ye1yoIlTKpjvVy15eVUbN0i4zKLJ8w'. + 'ae6qcKgLqmMj3PUFWFl5NJ0CExLLJzbNW7BWCyxlXR0ba6/Axs'. + 'zELmfnkRBT0QiSKgXJCOflxUbYy3KyMHEoOrtEZ1c2TZ6/cMl6'. + 'eaCUamdsbIC7tjgPr4SBS3BMMVDTwkXr1hsDpYy6UmMj/O0tdX'. + 'QNbDxjknJLWqYsXLx0vStQynxGflpkZGCgs7Onp29SbtNkoMy6'. + 'pevCgFJWy3oyMuKjgoKCPWNCvEuqWhcsWrJ06XqQlPnMvrKyrM'. + 'TomJjkZAfHlNa2qdOWrlu63gcopbG8v7+hvLwip7g4JdSxsLZu'. + '8dKlS9ettwBKic2eNXHChIkTG5tKqgpr2uo6loLAehWQx0LnzJ'. + '49p6mpeXLLlNq6RUvqly6dvnR9Bx9ISnnlvLmT582bMr9t4aL2'. + '+vrp60GaDCGB6Ld6wfwFCxYCJZYsXQ+SmL6+FBryInVrFi1atH'. + 'jJkqVQsH6pNCzCJNvXrQW6CmQJREYFEc2CYevXrwMLAyXXl0oz'. + 'IAOt0vVQUGSIkabkDV3DwlzNVDAksAAAfUbNQRCwr88AAAAASU'. + 'VORK5CYII=' ; + +//========================================================== +// File: bs_red.png +//========================================================== + $this->imgdata_small[0][0]= 437 ; + $this->imgdata_small[0][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAk1'. + 'BMVEX////////GxsbGra3/xsbOhITWhIT/hIT/e3v/c3P/a2vG'. + 'UlK1SkrOUlL/Y2PWUlLGSkrnUlLeSkrnSkr/SkqEGBj/KSmlGB'. + 'jeGBjvGBj3GBj/EBD/CAj/AAD3AADvAADnAADeAADWAADOAADG'. + 'AAC9AAC1AACtAAClAACcAACUAACMAACEAAB7AABzAABrAABjAA'. + 'BuukXBAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. + 'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGDNEMgOYAAAAm0'. + 'lEQVR4nI3Q3RKCIBAFYGZMy9RKzX7MVUAUlQTe/+kS0K49d3wD'. + '7JlFaG+CvIR3FvzPXgpLatxevVVS+Jzv0BDGk/UJwOkQ1ph2g/'. + 'Ct5ACX4wNT1o/zzUoJUFUGBiGfVnDTYGJgmrWy8iKEtp0Bpd2d'. + 'jLGu56MB7f4JOOfDJAwoNwslk/jOUi+Jts6RVNrC1hkhPy50Ef'. + 'u79/ADQMQSGQ8bBywAAAAASUVORK5CYII=' ; + + +//========================================================== +// File: bs_lightblue.png +//========================================================== + $this->imgdata_small[1][0]= 657 ; + $this->imgdata_small[1][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABVl'. + 'BMVEX////////d///AwMC7wcS08P+y+P+xxdCwxM+uws2twMur'. + 'vsinzNynytylzuKhyN6e5v6d5P+d1fOcwNWcu8ub4f+at8iZ3v'. + '+ZvdGY2/yW2f+VscGU1vuT1fqTr72Sx+SSxeKR0fWRz/GPz/OP'. + 'rr+OyeqMy+6Myu2LyeyKxueJudSGw+SGorGDvt+Cvd6CvN2Aud'. + 'p+uNd+t9Z9tdV8tdR8tNN6sc94r813rct2q8h0qcZ0qMVzp8Rx'. + 'o8Bwor5tn7ptnrptnrlsnbhqmbRpmbNpi51ol7Flkqtkkqtkka'. + 'pjj6hijaRhjaZgi6NfiqJfiaFdh55bhJtag5pZgphYgJZYf5VX'. + 'cn9Ve5FSeI1RdopRdYlQdYlPc4dPcoZPcoVNcINLboBLbH9GZn'. + 'hGZXdFZHZEY3RDYnJCXW4/W2s/WWg+Wmo7VmU7VGM7U2E6VGM6'. + 'VGI5UV82T1wGxheQAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'. + 'gAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGTok'. + '9Yp9AAAAtElEQVR4nGNgIBaw8wkpKghzwvksPAKiUsraprYiLF'. + 'ARXkE2JiZ1PXMHXzGIAIekOFBE08TGLTCOCyzCLyvDxsZqZOnk'. + 'E56kAhaRV9NQUjW2tPcMjs9wBYsY6Oobmlk7egRGpxZmgkW0zC'. + '2s7Jy9giKT8gohaiQcnVzc/UNjkrMLCyHmcHr7BYREJKTlFxbm'. + 'QOxiEIuKTUzJKgQCaZibpdOzQfwCOZibGRi4dcJyw3S4iQ4HAL'. + 'qvIlIAMH7YAAAAAElFTkSuQmCC' ; + +//========================================================== +// File: bs_gray.png +//========================================================== + $this->imgdata_small[2][0]= 550 ; + $this->imgdata_small[2][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAAQCAMAAADH72RtAAABI1'. + 'BMVEX///8AAAD8EAD8IAD8NAD8RAD8VAAYGBi/v7+goKCCgoJk'. + 'ZGRGRkb8yAD83AD87AD8/AD4+ADo+ADY+ADI+AC0+ACk+ACU+A'. + 'CE+AB0/ABk/ABU/ABE/AAw/AAg/AAQ/AAA/AAA+AAA6BAA2CAA'. + 'yDQAtEQApFQAlGQAhHQAdIgAZJgAVKgARLgAMMgAINwAEOwAAP'. + 'wAAPgIAPAQAOgYAOAkANgsANA0AMg8AMBEALhMALBUAKhcAKBo'. + 'AJhwAJB4AIiAAID////4+Pjy8vLs7Ozm5ubg4ODa2trT09PNzc'. + '3Hx8fBwcG7u7u1tbWurq6oqKiioqKcnJyWlpaQkJCJiYmDg4N9'. + 'fX13d3dxcXFra2tkZGReXl5YWFhSUlJMTExGRkZAQEA1BLn4AA'. + 'AAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIA'. + 'AAsSAdLdfvwAAAAHdElNRQfTAwkUGiIctEHoAAAAfElEQVR4nI'. + '2N2xKDIAwF+bZ2kAa8cNFosBD//yvKWGh9dN+yk9kjxH28R7ze'. + 'wzBOYSX6CaNB927Z9qZ66KTSNmBM7UU9Hx2c5qjmJaWCaV5j4t'. + 'o1ANr40sn5a+x4biElrqHgrXMeac/c1nEpFHG0LSFoo/jO/BeF'. + 'lJnFbT58ayUf0BpA8wAAAABJRU5ErkJggg==' ; + +//========================================================== +// File: bs_greenblue.png +//========================================================== + $this->imgdata_small[3][0]= 503 ; + $this->imgdata_small[3][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAxl'. + 'BMVEX///////+/v79znJQhSkJ7raU5hHtjraVKnJRCjIRClIyU'. + '9++E595avbVaxr2/v7+ctbWcvb17nJxrjIx7paUxQkK9//+Mvb'. + '17ra2Evb17tbVCY2MQGBiU5+ec9/eM5+d71tZanJxjra1rvb1j'. + 'tbVSnJxara1rzs5jxsZKlJRChIQpUlIhQkJatbVSpaU5c3MxY2'. + 'MYMTEQISFavb1Sra1KnJxCjIw5e3sxa2spWlpClJQhSkoYOTkp'. + 'Y2MhUlIQKSkIGBgQMTH+e30mAAAAAXRSTlMAQObYZgAAAAFiS0'. + 'dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfT'. + 'AwkUGTIqLgJPAAAAqklEQVR4nI2QVxOCMBCEM6Mi2OiCvSslJB'. + 'CUoqjn//9TYgCfubf9Zu9uZxFqO+rscO7b6l/LljMZX29J2pNr'. + 'YjmX4ZaIEs2NeiWO19NNacl8rHAyD4LR6jjw6PMRdTjZE0JOiU'. + 'dDv2ALTlzRvSdCCfAHGCc7yRPSrAQRQOWxKc3C/IUjBlDdUcM8'. + '97vFGwBY9QsZGBc/A4DWZNbeXIPWZEZI0c2lqSute/gCO9MXGY'. + '4/IOkAAAAASUVORK5CYII=' ; + +//========================================================== +// File: bs_yellow.png +//========================================================== + $this->imgdata_small[4][0]= 507 ; + $this->imgdata_small[4][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAzF'. + 'BMVEX///////+/v79zYwCMewDOxoTWzoTezkr/5wj/5wDnzgDe'. + 'xgC1pQCtnACllACcjACUhABjWgDGvVK1rUrOxlLGvUqEexilnB'. + 'jv3hj35xj/7wj/7wD35wDv3gDn1gDezgDWxgDOvQDGtQC9rQCE'. + 'ewB7cwBzawBrYwDWzlLn3lLe1krn3kre1hi9tQC1rQCtpQClnA'. + 'CclACUjACMhAD/9wC/v7///8bOzoT//4T//3v//3P//2v//2Pn'. + '50r//0r//yn39xj//xD//wBjYwDO8noaAAAAAXRSTlMAQObYZg'. + 'AAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAH'. + 'dElNRQfTAwkUGSDZl3MHAAAAqElEQVR4nI3QWRNDMBAA4My09E'. + 'IF1SME0VT1okXvM/3//6kEfbZv+81eswA0DfHxRpOV+M+zkDGG'. + 'rL63zCoJ2ef2RLZDIqNqYexyvFrY9ePkxGWdpvfzC7tEGtIRly'. + 'nqzboFKMlizAXbNnZyiFUKAy4bZ+B6W0lRaQDLmg4h/k7eFwDL'. + 'OWIky8qhXUBQ7gKGmsxpC+ah1TdriwByqG8GQNDNr6kLjf/wAx'. + 'KgEq+FpPbfAAAAAElFTkSuQmCC' ; + +//========================================================== +// File: bs_darkgray.png +//========================================================== + $this->imgdata_small[5][0]= 611 ; + $this->imgdata_small[5][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAABJl'. + 'BMVEX////////o8v/f6O7W4OnR3PXL1OTL0evEyLvCzePAwMC/'. + 'v7a8wsq7t7C1xum1vtS1q6GzopmyxeKsrsOqvNWoq7anvN+nsb'. + 'qhrcGgqbGfpq6cp7+bqMuVmJKRm7yPlKKMnL6FkKWFipOEkLSE'. + 'j6qEhoqAiaB+jqd8haF7hZR4iJt4g5l3hZl2gIt2cod1hJVzeY'. + 'VzboJvhp9sfJJsb41peY1pd5xpdoVod4xndI5lcHxka4BjcYVg'. + 'Z3BfboFbb4lbZnZbYntaZ4laZYVZV3JYYWpXX3JWWm5VX4RVW2'. + 'NUYX9SXHxPWn5OVFxNWWtNVXVMVWFKV3xHUGZGU3dGTldFSlxE'. + 'Sk9ESXBCRlNBS3k/SGs/RU4+R1k9R2U6RFU2PUg0PEQxNU0ECL'. + 'QWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAA'. + 'CxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGQmbJetrAAAAtklEQV'. + 'R4nGNgwAK4JZTNNOWlYDxhMT4ZDTOzQE1uMF9CiJWVU0LbxDlS'. + 'G8QVF+FnZ2KRNHAIiPUHaZGSlmZj5lH19A1KjLUA8lXU5MWllF'. + 'yjo30TYr2BfG19G11b37CEeN84H38gX1HbwTUkOjo+zjfG3hLI'. + 'l1exCvCNCwnxjfMz0gTyRdXNHXx9fUNCQu2MwU6SN3ZwD42LCH'. + 'W30IK4T8vUJSAkNMhDiwPqYiktXWN9JZj7UQAAjWEfhlG+kScA'. + 'AAAASUVORK5CYII=' ; + + +//========================================================== +// File: bs_darkgreen.png +//========================================================== + $this->imgdata_small[6][0]= 666 ; + $this->imgdata_small[6][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABX1'. + 'BMVEX////////l/+nAwMC86r+8wb28wby8wLy78sCzw7SywrSx'. + 'wLKwvrGuvK+syK+ryq2rx62n36ym3aumxKmk2qij0Keh16ahva'. + 'Og1aSguKKe06KeuaCetZ+d0KGdtZ+bz6Cay56ZyZ2Zwp2Zr5qZ'. + 'rpqYwJuXyZuXrJmVw5mUxZiTxJeTw5eTq5WRwJWPtJKOvZKKuI'. + '6Kt42Kn4yJt42ItIuGsomFsYmEsIiEr4eDr4eBrIR/qoN+qIJ8'. + 'poB7pH56o356on14nnt2nXl0mndzmnZzmXZymHVwlXNvlHJukn'. + 'FtiHBqjm1qjW1oi2toiWpniWplh2hlhmdkhWdig2VggGNgf2Je'. + 'fmFdfGBde19bbl1aeFxXdFpWclhVclhVcVdUcFZTb1VSbVRQal'. + 'JPaVFKY0xKYkxJYUtIYEpHX0lEWkZCWERCV0NCVkM/U0A+U0A+'. + 'UUA+UEA9Uj89UT48Tj45TDvewfrHAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. + 'RQfTAwkUGRjxlcuZAAAAtElEQVR4nGNgIBZw8osqqIpzw/msfI'. + 'IiUmr6lo6SbFARASEOJiYtQ2uXADmIAJeEGFBE18LBMySBBywi'. + 'LC/LwcFiZuvmH5WiAxZR0tRW1DC3dfYJS8zyAouYGBibWtm7+o'. + 'TEpZfkgEX0rG3snNx9Q2NSCksgaqRd3Ty8gyLiU/NKSiDmcPsF'. + 'BodHJ2UUlZTkQ+xikIlNSE7LLgECZagL2VQyc0H8YnV2uD94jS'. + 'ILIo14iQ4HALarJBNwbJVNAAAAAElFTkSuQmCC' ; + +//========================================================== +// File: bs_purple.png +//========================================================== + $this->imgdata_small[7][0]= 447 ; + $this->imgdata_small[7][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAnF'. + 'BMVEX///////+/v7/Gvca9rb3Grcb/xv+1hLWte629hL21e7XG'. + 'hMbWhNbOe87We9b/hP//e/97OXv/c///a///Y/+cOZz/Sv/WOd'. + 'bnOefvOe//Kf9jCGNrCGv/EP//CP/nCOf/AP/3APfvAO/nAOfe'. + 'AN7WANbOAM7GAMa9AL21ALWtAK2lAKWcAJyUAJSMAIyEAIR7AH'. + 'tzAHNrAGtjAGPP1sZnAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'. + 'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGS'. + 'o5QpoZAAAAnElEQVR4nI3Q2xJDMBAG4MyQokWrZz3oSkJISJH3'. + 'f7dK0Gv/Xb7J7vyzCK0NjtPsHuH/2wlhTE7LnTNLCO/TFQjjIp'. + 'hHAA6bY06LSqppMAY47x+04HXTba2kAFlmQKr+YuVDCGUG2k6/'. + 'rNwYK8rKwKCnPxHnVS0aA3rag4UQslUGhrlk0Kpv1+sx3tLZ6w'. + 'dtYemMkOsnz8R3V9/hB87DEu2Wos5+AAAAAElFTkSuQmCC' ; + + +//========================================================== +// File: bs_brown.png +//========================================================== + $this->imgdata_small[8][0]= 677 ; + $this->imgdata_small[8][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABaF'. + 'BMVEX//////////8X/3oD/3nj/1HX/0Gr/xGP/rkv/gBf+iS/2'. + 'bAL1agDxaQDuZwDrZwLpZQDmZQLlZADjcx7gZATeYQDdZgraXw'. + 'DZXwHYXgDXiEvXZAvUjlfUXwXTjVfTbR7ShUvRbR7RWwDMWQDL'. + 'WADKooLKWADJoYLJgkvHWATGoILFn4LFgEvFVgDEZx7EVQDDt6'. + '/DVQDCt6/CnoLChlfCVADAwMC+hFe+UgC8UgC6UQC4gVe4UAC3'. + 'gVe3UAC1gFe1eUu1TwC1TgCzTgCwTQKuTACrSgCqSgCpSgCpSQ'. + 'CodEulSACkRwCiRgCdRACcRACaQwCYQgCWQgKVQQCVQACUQACS'. + 'UR6RPwCOPgCNPQCLPACKPACJOwCEOQCBOAB+NwB9NgB8NgB7NQ'. + 'B6NwJ4NAB3RR52MwB0MgBuLwBtLwBsLwBqLgBpLQBkLQJiKgBh'. + 'KgBgKwRcKABbKQJbJwBaKQRaJwBYKAJVJQDZvdIYAAAAAXRSTl'. + 'MAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLd'. + 'fvwAAAAHdElNRQfTAwkUGho0tvl2AAAAtklEQVR4nGNgIBaoSg'. + 'mLKGpowfkGMty8AqJKpi4mRlAROR5ONg4JFUv3YHOIgDo/HwsT'. + 'q6yps29EsjZYREFIkJ2ZS9/OMzA20wEsIi8uKSZtaOPmH5WSFw'. + 'YW0VRW07Vw8vCLSMguLwCL6FlaObp6B0TGZxSXQ9TouHv6+IXG'. + 'JGYWlpdDzNEKCgmPjkvLKS0vL4LYxWAen5SelV8OBNZQFxrZ5h'. + 'aC+GX2MDczMBh7pZakehkTHQ4AA0Am/jsB5gkAAAAASUVORK5C'. + 'YII=' ; + +//========================================================== +// File: bs_blue.png +//========================================================== + $this->imgdata_small[9][0]= 436 ; + $this->imgdata_small[9][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAk1'. + 'BMVEX///////+/v7+trcbGxv+EhM6EhNaEhP97e/9zc/9ra/9S'. + 'UsZKSrVSUs5jY/9SUtZKSsZSUudKSt5KSudKSv8YGIQpKf8YGK'. + 'UYGN4YGO8YGPcQEP8ICP8AAP8AAPcAAO8AAOcAAN4AANYAAM4A'. + 'AMYAAL0AALUAAK0AAKUAAJwAAJQAAIwAAIQAAHsAAHMAAGsAAG'. + 'ONFkFbAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. + 'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGhNNakHSAAAAmk'. + 'lEQVR4nI3P2xKCIBAGYGfM6SBWo1nauIqogaDA+z9dK9Lhrv47'. + 'vtl/2A2CfxNlJRRp9IETYGraJeEb7ocLNKznia8A7Db7umWDUG'. + 'sxAzhurxRHxok4KQGqCuEhlL45oU1D2w5BztY4KRhj/bCAsetM'. + '2uObjwvY8/oX50JItYDxSyZSTrO2mNhvGMbaWAevnbFIcpuTr7'. + 't+5AkyfBIKSJHdSQAAAABJRU5ErkJggg==' ; + +//========================================================== +// File: bs_green.png +//========================================================== + $this->imgdata_small[10][0]= 452 ; + $this->imgdata_small[10][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAn1'. + 'BMVEX///////+/v7+/v7/G/8aUxpSMvYyUzpSMzoyM1oxarVqE'. + '/4R7/3tavVpKnEpaxlpz/3Nr/2tKtUpj/2Na51pKzkpK1kpK50'. + 'pK/0oYcxgp/ykYlBgY3hgY7xgY9xgQ/xAI/wgA/wAA9wAA7wAA'. + '5wAA3gAA1gAAzgAAxgAAvQAAtQAArQAApQAAnAAAlAAAjAAAhA'. + 'AAewAAcwAAawAAYwA0tyxUAAAAAXRSTlMAQObYZgAAAAFiS0dE'. + 'AIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAw'. + 'kUGgW5vvSDAAAAnklEQVR4nI3QSxKCMAwA0M4gqCgoiiJ+kEAL'. + 'LQUq0PufzX7ENdnlJZNkgtDS2CYZvK6bf+7EoKLA9cH5SQzv6A'. + 'YloTywsAbYr44FrlgrXCMJwHl3xxVtuuFkJAPIcw2tGB9GcFli'. + 'oqEf5GTkSUhVMw2TtD0XSlnDOw3SznE5520vNEi7CwW9+Ayjyq'. + 'U/3+yPuq5gvhkhL0xlGnqL//AFf14UIh4mkEkAAAAASUVORK5C'. + 'YII=' ; + + +//========================================================== +// File: bs_white.png +//========================================================== + $this->imgdata_small[11][0]= 480 ; + $this->imgdata_small[11][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAAQCAYAAADwMZRfAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMLFTsY/ewvBQAAAW1JREFUeJytkz2u4jAUhT/jic'. + 'gfBUKiZhE0bIKeVbCWrIKenp6eDiGlCEEEBArIxvzGU4xeZjLk'. + 'jWb05lRXuvbx+exr4bouX1Xjyw7Atz81F4uFBYjjGIDhcCjq1o'. + 'k6nN1uZwFerxfP55Msy1itVmRZBsB4PK6YveHkeW5d18XzPIIg'. + 'wPd9Wq0WnU6HMAxJkoQoiuynOIfDwUopkVIihKAoCgAcx6Hdbm'. + 'OMIU1T5vN55eBKEikljUYDIX6kFUKU9e8aDAZlmjcca+1b7TgO'. + '1+uVy+VS9nzfr8e53++VzdZaiqIgz3OMMWitOZ/PaK0JgqDeRC'. + 'mF53lIKYGfr3O73TDGoJQiTVO01nS73XqT4/FIs9kkCAIej0eZ'. + 'brPZEMcxSZKgtQZgMpmIWpN+vy+m06n1PK9yTx8Gy+WS/X5Pr9'. + 'er9GuHLYoiG4YhSilOpxPr9Zrtdlti/JriU5MPjUYjq7UuEWaz'. + '2d+P/b/qv/zi75oetJcv7QQXAAAAAElFTkSuQmCC' ; + + +//========================================================== +// File: bs_cyan.png +//========================================================== + $this->imgdata_small[12][0]= 633 ; + $this->imgdata_small[12][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABPl'. + 'BMVEX////////F///AwMCvxsaC1NSC0dGCz8+CzMyA//94//91'. + '//9q//9j//9X4uJX09NXz89Xx8dXxMRL//9L5uZL3d1L2NhLxs'. + 'ZLt7cv//8e9fUe8fEe7u4e398epqYehoYX//8L+PgK//8F9fUE'. + '/v4E5+cEb28EZ2cC//8C/v4C/f0CzMwCrq4Cjo4CdXUCaWkCZW'. + 'UB/PwA//8A/f0A+/sA8/MA7e0A7OwA6+sA5eUA5OQA4uIA4eEA'. + '3NwA2toA2NgA1dUA09MA0tIA0NAAysoAxsYAxcUAxMQAv78Avr'. + '4AvLwAtrYAtbUAs7MAsLAAra0Aq6sAqKgApaUApKQAoqIAoKAA'. + 'n58AmpoAlZUAk5MAkpIAkJAAj48AjIwAiYkAh4cAf38AfX0Ae3'. + 'sAenoAcnIAcHAAa2sAaWkAaGgAYmIUPEuTAAAAAXRSTlMAQObY'. + 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. + 'AHdElNRQfTAwkUGQDi+VPPAAAAtElEQVR4nGNgIBawikipyIiy'. + 'wfksfJpGRkamNtr8LFARPiMFHmFDcztXfwGoFi0jLiZuZRtnry'. + 'BddrCIiJEGL6eklYO7X3iCOFhE2thESdHawdUnJDZFDiyiamZh'. + 'aevk5h0UlZSpBhaRtbN3dPHwDY5MSM+EqBFzc/f0DgiLTkjLzI'. + 'SYw6bjHxgaEZeckZmpD7GLQSAqJj4xNRMIBGFuFtRLA/ENhGBu'. + 'ZmDgkJBXl5fgIDocAAKcINaFePT4AAAAAElFTkSuQmCC' ; + +//========================================================== +// File: bs_bluegreen.png +//========================================================== + $this->imgdata_small[13][0]= 493 ; + $this->imgdata_small[13][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAvV'. + 'BMVEX///////+/v79j//855/8x3v851v9Spb1C1v8AOUqEtcZK'. + 'lK1StdYxzv8hxv8AY4QASmNSlK1KpcZKtd4YQlIYnM4YrecIvf'. + '8AtfcAre8AjL0AhLUAc5wAa5QAWnsAQloAKTkAGCFKhJxKrdYY'. + 'jL0Ypd4Atf8ArfcApecAnN4AlM4AjMYAe60Ac6UAY4wAUnNSnL'. + '0AlNYAWoQASmsAOVIAITGEtc4YWnsAUnsAMUqtvcaErcYAKUIA'. + 'GCkAECHUyVh/AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAA'. + 'AJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGxNUcXCT'. + 'AAAAqUlEQVR4nI2Q1xKCMBREM2NHLCCogAGCjd6SqLT8/2cZKT'. + '6zb3tm987OBWCsXoejp8rC35fi4+l6gXFZlD0Rz6fZ1tdDmKR9'. + 'RdOmkzmP7DDpilfX3SzvRgQ/Vr1uiZplfsCBiVf03RJd140wgj'. + 'kmNqMtuYXcxyYmNWJdRoYwzpM9qRvGujuCmSR7q7ARY00/MiWk'. + 'sCnjkobNEm1+HknDZgAqR0GKU43+wxdu2hYzbsHU6AAAAABJRU'. + '5ErkJggg==' ; + +//========================================================== +// File: bs_lightred.png +//========================================================== + $this->imgdata_small[14][0]= 532 ; + $this->imgdata_small[14][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAA3l'. + 'BMVEX///////+/v7/Gvb0hGBj/5///3v//zu//1u//xucpGCG9'. + 'nK21lKVSQkp7Wms5KTExISlaOUpjQlIhEBj/tdbOhKXnrcbGjK'. + 'Wla4TetcbGnK2EWmv/rc73pcZ7UmOcY3vOpbW1jJzenLW9e5Rz'. + 'Slq1c4xrQlJSOULGhJz/pcb3nL2chIzOnK33rcbelK3WjKWMWm'. + 'vGe5SEUmM5ISnOtb3GrbXerb3vpb2ca3v/rcaUY3POhJxCKTF7'. + 'SlrWnK21e4ytc4TvnLXnlK2la3taOUK1lJxrSlLGhJRjQkpSMT'. + 'lw+q2nAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. + 'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGjoP2Nm+AAAAr0'. + 'lEQVR4nGNgIBaYiOk62imYwPnMkiIyso76yhJSzFARMxkRNk49'. + 'a3t5OW6oFk1LVkYOfWUHKxUXiEYzLS12DnN3VXkjIRtFsIiSk5'. + '6evqGqhYGKugAfWMRa1FpD2UHeQEXQRlgALCJur+rgbCUNFOAS'. + 'hqjRkZe3MpBTcwEKCEPMMTGSs3Xz8OQHCnBBHckt6OJpIyAMBD'. + 'wwN/MYc4H4LK4wNzMwmGrzcvFqmxIdDgDiHRT6VVQkrAAAAABJ'. + 'RU5ErkJggg==' ; + +//========================================================== +// File: bxs_lightred.png +//========================================================== + $this->imgdata_xsmall[0][0]= 432 ; + $this->imgdata_xsmall[0][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAA3l'. + 'BMVEX///////+/v7/Gvb0hGBj/5///3v//zu//1u//xucpGCG9'. + 'nK21lKVSQkp7Wms5KTExISlaOUpjQlIhEBj/tdbOhKXnrcbGjK'. + 'Wla4TetcbGnK2EWmv/rc73pcZ7UmOcY3vOpbW1jJzenLW9e5Rz'. + 'Slq1c4xrQlJSOULGhJz/pcb3nL2chIzOnK33rcbelK3WjKWMWm'. + 'vGe5SEUmM5ISnOtb3GrbXerb3vpb2ca3v/rcaUY3POhJxCKTF7'. + 'SlrWnK21e4ytc4TvnLXnlK2la3taOUK1lJxrSlLGhJRjQkpSMT'. + 'lw+q2nAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. + 'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUKBOgGhWjAAAAS0'. + 'lEQVR4nGNgQAEmunYmEJaMCKe1vBxYzJKVQ9lKBSSupKdnaKGi'. + 'zgdkiqs6WKnYcIGYJnK2HvzCwmCNgi42wsLCECNMeXlNUY0HAL'. + 'DaB7Du8MiEAAAAAElFTkSuQmCC' ; + +//========================================================== +// File: bxs_bluegreen.png +//========================================================== + $this->imgdata_xsmall[1][0]= 397 ; + $this->imgdata_xsmall[1][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAvV'. + 'BMVEX///////+/v79j//855/8x3v851v9Spb1C1v8AOUqEtcZK'. + 'lK1StdYxzv8hxv8AY4QASmNSlK1KpcZKtd4YQlIYnM4YrecIvf'. + '8AtfcAre8AjL0AhLUAc5wAa5QAWnsAQloAKTkAGCFKhJxKrdYY'. + 'jL0Ypd4Atf8ArfcApecAnN4AlM4AjMYAe60Ac6UAY4wAUnNSnL'. + '0AlNYAWoQASmsAOVIAITGEtc4YWnsAUnsAMUqtvcaErcYAKUIA'. + 'GCkAECHUyVh/AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAA'. + 'AJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUKDVyF5Be'. + 'AAAASUlEQVR4nGNgQAFmYqJcEJaEOJ+UrD5YTJKFTZrfGCQuaq'. + 'glLWvMaQ5kqujo6hnbKIKYXPr68gp2dmCNJiZAlh3ECGsREWtU'. + '4wF1kwdpAHfnSwAAAABJRU5ErkJggg==' ; + +//========================================================== +// File: bxs_navy.png +//========================================================== + $this->imgdata_xsmall[2][0]= 353 ; + $this->imgdata_xsmall[2][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAk1'. + 'BMVEX///////+/v7+trcbGxv+EhM6EhNaEhP97e/9zc/9ra/9S'. + 'UsZKSrVSUs5jY/9SUtZKSsZSUudKSt5KSudKSv8YGIQpKf8YGK'. + 'UYGN4YGO8YGPcQEP8ICP8AAP8AAPcAAO8AAOcAAN4AANYAAM4A'. + 'AMYAAL0AALUAAK0AAKUAAJwAAJQAAIwAAIQAAHsAAHMAAGsAAG'. + 'ONFkFbAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. + 'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUJxXO4axZAAAAR0'. + 'lEQVR4nGNgQAGskhKsEJaslIi8ijpYTJaDU1FVAyQuKSujoKKh'. + 'LQ5kSigpqWro6oOYrOoaWroGBmCNWiCWAdQwUVFWVOMBOp4GCJ'. + 's5S60AAAAASUVORK5CYII=' ; + +//========================================================== +// File: bxs_gray.png +//========================================================== + $this->imgdata_xsmall[3][0]= 492 ; + $this->imgdata_xsmall[3][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABI1'. + 'BMVEX///8AAAD8EAD8IAD8NAD8RAD8VAAYGBi/v7+goKCCgoJk'. + 'ZGRGRkb8yAD83AD87AD8/AD4+ADo+ADY+ADI+AC0+ACk+ACU+A'. + 'CE+AB0/ABk/ABU/ABE/AAw/AAg/AAQ/AAA/AAA+AAA6BAA2CAA'. + 'yDQAtEQApFQAlGQAhHQAdIgAZJgAVKgARLgAMMgAINwAEOwAAP'. + 'wAAPgIAPAQAOgYAOAkANgsANA0AMg8AMBEALhMALBUAKhcAKBo'. + 'AJhwAJB4AIiAAID////4+Pjy8vLs7Ozm5ubg4ODa2trT09PNzc'. + '3Hx8fBwcG7u7u1tbWurq6oqKiioqKcnJyWlpaQkJCJiYmDg4N9'. + 'fX13d3dxcXFra2tkZGReXl5YWFhSUlJMTExGRkZAQEA1BLn4AA'. + 'AAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEA'. + 'AAsRAX9kX5EAAAAHdElNRQfTAwkUKC74clmyAAAAQklEQVR4nG'. + 'NgQAVBYVCGt5dXYEQ0mOnp5h4QFgVmeri6+4dHxYMVeHoFRUTH'. + 'gTUFBIZBWAwMkZEx8bFQM2Lj0UwHANc/DV6yq/BiAAAAAElFTk'. + 'SuQmCC' ; + +//========================================================== +// File: bxs_graypurple.png +//========================================================== + $this->imgdata_xsmall[4][0]= 542 ; + $this->imgdata_xsmall[4][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABSl'. + 'BMVEX////////11P/MqdvKrNfAwMC+u7+9u7+4rr24lsi3rby3'. + 'lMe1rLq1o720q7i0oL20ksSzoryyqbaykMGxlb2wkL+vnbiujb'. + '2sjLuri7qpl7GoirWoibenmK2mla6mjLKmhrSllauki7CjhrCj'. + 'hLGihLChg6+ggq2fkqadkKOcfqqai6Gag6WYe6WXeqSWeaOTd6'. + 'CTd5+Rdp6RdZ6RdZ2Qg5eOc5qMcpiLcZeJb5WIbpOHbZKGbJGE'. + 'a4+CaY2AZ4t/Z4p/Zop/Zol+Zol7ZIZ6Y4V5YoR1ZH11X391Xn'. + '9zXX1yXXtxXHtvWnluWXhsV3VqVnNpVXJoVHFnU3BmUm9jUGth'. + 'VGdgTmheTGZcS2RcSmRaSWJYR19XRl5SQllRQlhQQVdPQFZOP1'. + 'VLPlFJO09IPE5IOk5FOEtEN0lDOEpDOElDNklCNkc/M0XhbrfD'. + 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'. + 'EAAAsRAX9kX5EAAAAHdElNRQfTAwkUKCgREfyHAAAATUlEQVR4'. + 'nGNgQAEcIko8EBY3M5Ougy+IxSXMwmTsFsAHZMqrSRvZB0W7A5'. + 'k6FlYugXEZICaPr394Um4uSAFDRFRCbm4uxAihsDAhVOMBHT0L'. + 'hkeRpo8AAAAASUVORK5CYII=' ; + +//========================================================== +// File: bxs_red.png +//========================================================== + $this->imgdata_xsmall[5][0]= 357 ; + $this->imgdata_xsmall[5][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAk1'. + 'BMVEX////////GxsbGra3/xsbOhITWhIT/hIT/e3v/c3P/a2vG'. + 'UlK1SkrOUlL/Y2PWUlLGSkrnUlLeSkrnSkr/SkqEGBj/KSmlGB'. + 'jeGBjvGBj3GBj/EBD/CAj/AAD3AADvAADnAADeAADWAADOAADG'. + 'AAC9AAC1AACtAAClAACcAACUAACMAACEAAB7AABzAABrAABjAA'. + 'BuukXBAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. + 'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUIyjy5SVMAAAAS0'. + 'lEQVR4nGNgQAFsUpJsEJastIi8ijpYTJaDU0FVgxXIlJKVUVDR'. + '0BYHMiUUlVQ1dPVBTDZ1dS1dAwOQAgYtbSDLAGIEq6goK6rxAD'. + 'yXBg73lwGUAAAAAElFTkSuQmCC' ; + +//========================================================== +// File: bxs_yellow.png +//========================================================== + $this->imgdata_xsmall[6][0]= 414 ; + $this->imgdata_xsmall[6][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAzF'. + 'BMVEX///////+/v79zYwCMewDOxoTWzoTezkr/5wj/5wDnzgDe'. + 'xgC1pQCtnACllACcjACUhABjWgDGvVK1rUrOxlLGvUqEexilnB'. + 'jv3hj35xj/7wj/7wD35wDv3gDn1gDezgDWxgDOvQDGtQC9rQCE'. + 'ewB7cwBzawBrYwDWzlLn3lLe1krn3kre1hi9tQC1rQCtpQClnA'. + 'CclACUjACMhAD/9wC/v7///8bOzoT//4T//3v//3P//2v//2Pn'. + '50r//0r//yn39xj//xD//wBjYwDO8noaAAAAAXRSTlMAQObYZg'. + 'AAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAH'. + 'dElNRQfTAwkUIzoBXFQEAAAAS0lEQVR4nGNgQAFsDhJsEJaTo5'. + '2skj5YzMnSSk7ZwBzIlOSUklPiMxYHMnW4FXT5VNVBTDZeXiNV'. + 'QUGQAgYBYyBLEGIEq5gYK6rxAH4kBmHBaMQQAAAAAElFTkSuQm'. + 'CC' ; + +//========================================================== +// File: bxs_greenblue.png +//========================================================== + $this->imgdata_xsmall[7][0]= 410 ; + $this->imgdata_xsmall[7][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAxl'. + 'BMVEX///////+/v79znJQhSkJ7raU5hHtjraVKnJRCjIRClIyU'. + '9++E595avbVaxr2/v7+ctbWcvb17nJxrjIx7paUxQkK9//+Mvb'. + '17ra2Evb17tbVCY2MQGBiU5+ec9/eM5+d71tZanJxjra1rvb1j'. + 'tbVSnJxara1rzs5jxsZKlJRChIQpUlIhQkJatbVSpaU5c3MxY2'. + 'MYMTEQISFavb1Sra1KnJxCjIw5e3sxa2spWlpClJQhSkoYOTkp'. + 'Y2MhUlIQKSkIGBgQMTH+e30mAAAAAXRSTlMAQObYZgAAAAFiS0'. + 'dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfT'. + 'AwkUJy5/6kV9AAAATUlEQVR4nGNgQAGCyuyCEJaGugKHviVYzF'. + 'hO3sxCWwDIVNLTM9PXtpEGMhW12Cy0DR1ATEFLSxZ7BweQAgYd'. + 'HUMHBweIEQKiogKoxgMAo/4H5AfSehsAAAAASUVORK5CYII=' ; + +//========================================================== +// File: bxs_purple.png +//========================================================== + $this->imgdata_xsmall[8][0]= 364 ; + $this->imgdata_xsmall[8][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAnF'. + 'BMVEX///////+/v7/Gvca9rb3Grcb/xv+1hLWte629hL21e7XG'. + 'hMbWhNbOe87We9b/hP//e/97OXv/c///a///Y/+cOZz/Sv/WOd'. + 'bnOefvOe//Kf9jCGNrCGv/EP//CP/nCOf/AP/3APfvAO/nAOfe'. + 'AN7WANbOAM7GAMa9AL21ALWtAK2lAKWcAJyUAJSMAIyEAIR7AH'. + 'tzAHNrAGtjAGPP1sZnAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'. + 'HUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUIj'. + 'mBTjT/AAAASUlEQVR4nGNgQAGskhKsEJaCrJiSuhZYTEFASFlD'. + 'GyQuqSCnrK6tJwpkiquoamgbGIGYrFpaugbGxmCNunpAljHECB'. + 'ZBQRZU4wFSMAZsXeM71AAAAABJRU5ErkJggg==' ; + +//========================================================== +// File: bxs_green.png +//========================================================== + $this->imgdata_xsmall[9][0]= 370 ; + $this->imgdata_xsmall[9][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAn1'. + 'BMVEX///////+/v7+/v7/G/8aUxpSMvYyUzpSMzoyM1oxarVqE'. + '/4R7/3tavVpKnEpaxlpz/3Nr/2tKtUpj/2Na51pKzkpK1kpK50'. + 'pK/0oYcxgp/ykYlBgY3hgY7xgY9xgQ/xAI/wgA/wAA9wAA7wAA'. + '5wAA3gAA1gAAzgAAxgAAvQAAtQAArQAApQAAnAAAlAAAjAAAhA'. + 'AAewAAcwAAawAAYwA0tyxUAAAAAXRSTlMAQObYZgAAAAFiS0dE'. + 'AIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAw'. + 'kUKBrZxq0HAAAATElEQVR4nGNgQAGccrIcEJaivISyhjaIxa7I'. + 'I6CiqcMKZMopKqho6OhLA5kyqmqaOobGICartraeoYkJSAGDnj'. + '6QZQIxgk1Skg3VeABlVgbItqEBUwAAAABJRU5ErkJggg==' ; + +//========================================================== +// File: bxs_darkgreen.png +//========================================================== + $this->imgdata_xsmall[10][0]= 563 ; + $this->imgdata_xsmall[10][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABX1'. + 'BMVEX////////l/+nAwMC86r+8wb28wby8wLy78sCzw7SywrSx'. + 'wLKwvrGuvK+syK+ryq2rx62n36ym3aumxKmk2qij0Keh16ahva'. + 'Og1aSguKKe06KeuaCetZ+d0KGdtZ+bz6Cay56ZyZ2Zwp2Zr5qZ'. + 'rpqYwJuXyZuXrJmVw5mUxZiTxJeTw5eTq5WRwJWPtJKOvZKKuI'. + '6Kt42Kn4yJt42ItIuGsomFsYmEsIiEr4eDr4eBrIR/qoN+qIJ8'. + 'poB7pH56o356on14nnt2nXl0mndzmnZzmXZymHVwlXNvlHJukn'. + 'FtiHBqjm1qjW1oi2toiWpniWplh2hlhmdkhWdig2VggGNgf2Je'. + 'fmFdfGBde19bbl1aeFxXdFpWclhVclhVcVdUcFZTb1VSbVRQal'. + 'JPaVFKY0xKYkxJYUtIYEpHX0lEWkZCWERCV0NCVkM/U0A+U0A+'. + 'UUA+UEA9Uj89UT48Tj45TDvewfrHAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElN'. + 'RQfTAwkUKCFozUQjAAAATUlEQVR4nGNgQAGcoqrcEJYQB5OhSw'. + 'CIxSXGwWThGcIDZCppK5o7hyV6AZl6NnbuoSmFICZ3YHB0RkkJ'. + 'SAFDbEJaSUkJxAjeyEheVOMBQj4MOEkWew4AAAAASUVORK5CYI'. + 'I=' ; + +//========================================================== +// File: bxs_cyan.png +//========================================================== + $this->imgdata_xsmall[11][0]= 530 ; + $this->imgdata_xsmall[11][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABPl'. + 'BMVEX////////F///AwMCvxsaC1NSC0dGCz8+CzMyA//94//91'. + '//9q//9j//9X4uJX09NXz89Xx8dXxMRL//9L5uZL3d1L2NhLxs'. + 'ZLt7cv//8e9fUe8fEe7u4e398epqYehoYX//8L+PgK//8F9fUE'. + '/v4E5+cEb28EZ2cC//8C/v4C/f0CzMwCrq4Cjo4CdXUCaWkCZW'. + 'UB/PwA//8A/f0A+/sA8/MA7e0A7OwA6+sA5eUA5OQA4uIA4eEA'. + '3NwA2toA2NgA1dUA09MA0tIA0NAAysoAxsYAxcUAxMQAv78Avr'. + '4AvLwAtrYAtbUAs7MAsLAAra0Aq6sAqKgApaUApKQAoqIAoKAA'. + 'n58AmpoAlZUAk5MAkpIAkJAAj48AjIwAiYkAh4cAf38AfX0Ae3'. + 'sAenoAcnIAcHAAa2sAaWkAaGgAYmIUPEuTAAAAAXRSTlMAQObY'. + 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAA'. + 'AHdElNRQfTAwkUKQFKuFWqAAAATUlEQVR4nGNgQAGsUjJsEJaR'. + 'grC5qz9YzIiL28YriB3IlDZRsnYNiZUDMmXtHT2CE9JBTDb/wI'. + 'jkzEyQAoaomMTMzEyIERzy8hyoxgMAN2MLVPW0f4gAAAAASUVO'. + 'RK5CYII=' ; + +//========================================================== +// File: bxs_orange.png +//========================================================== + $this->imgdata_xsmall[12][0]= 572 ; + $this->imgdata_xsmall[12][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABaF'. + 'BMVEX//////////8X/3oD/3nj/1HX/0Gr/xGP/rkv/gBf+iS/2'. + 'bAL1agDxaQDuZwDrZwLpZQDmZQLlZADjcx7gZATeYQDdZgraXw'. + 'DZXwHYXgDXiEvXZAvUjlfUXwXTjVfTbR7ShUvRbR7RWwDMWQDL'. + 'WADKooLKWADJoYLJgkvHWATGoILFn4LFgEvFVgDEZx7EVQDDt6'. + '/DVQDCt6/CnoLChlfCVADAwMC+hFe+UgC8UgC6UQC4gVe4UAC3'. + 'gVe3UAC1gFe1eUu1TwC1TgCzTgCwTQKuTACrSgCqSgCpSgCpSQ'. + 'CodEulSACkRwCiRgCdRACcRACaQwCYQgCWQgKVQQCVQACUQACS'. + 'UR6RPwCOPgCNPQCLPACKPACJOwCEOQCBOAB+NwB9NgB8NgB7NQ'. + 'B6NwJ4NAB3RR52MwB0MgBuLwBtLwBsLwBqLgBpLQBkLQJiKgBh'. + 'KgBgKwRcKABbKQJbJwBaKQRaJwBYKAJVJQDZvdIYAAAAAXRSTl'. + 'MAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9k'. + 'X5EAAAAHdElNRQfTAwkUJBSSy88MAAAATUlEQVR4nGNgQAGqwo'. + 'paEBYPJ4eKezCIpc7HwmrqG6ENZMpLihm6RaWEAZl6Vo7ekRnF'. + 'IKZWSHhcTnk5SAFDfFJWeXk5xAjj1FRjVOMBeFwNcWYSLjsAAA'. + 'AASUVORK5CYII=' ; + +//========================================================== +// File: bxs_lightblue.png +//========================================================== + $this->imgdata_xsmall[13][0]= 554 ; + $this->imgdata_xsmall[13][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABVl'. + 'BMVEX////////d///AwMC7wcS08P+y+P+xxdCwxM+uws2twMur'. + 'vsinzNynytylzuKhyN6e5v6d5P+d1fOcwNWcu8ub4f+at8iZ3v'. + '+ZvdGY2/yW2f+VscGU1vuT1fqTr72Sx+SSxeKR0fWRz/GPz/OP'. + 'rr+OyeqMy+6Myu2LyeyKxueJudSGw+SGorGDvt+Cvd6CvN2Aud'. + 'p+uNd+t9Z9tdV8tdR8tNN6sc94r813rct2q8h0qcZ0qMVzp8Rx'. + 'o8Bwor5tn7ptnrptnrlsnbhqmbRpmbNpi51ol7Flkqtkkqtkka'. + 'pjj6hijaRhjaZgi6NfiqJfiaFdh55bhJtag5pZgphYgJZYf5VX'. + 'cn9Ve5FSeI1RdopRdYlQdYlPc4dPcoZPcoVNcINLboBLbH9GZn'. + 'hGZXdFZHZEY3RDYnJCXW4/W2s/WWg+Wmo7VmU7VGM7U2E6VGM6'. + 'VGI5UV82T1wGxheQAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'. + 'gAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUJziL'. + 'PvAsAAAATUlEQVR4nGNgQAHsQgqcEJYgG5Oegy+IxSHOxmTiFs'. + 'gFZMprKBnbB8e7AplaFlbOQUl5ICanX0BEWmEhSAFDVGxKYWEh'. + 'xAjusDBuVOMBJO8LrFHRAykAAAAASUVORK5CYII=' ; + +//========================================================== +// File: bxs_darkgray.png +//========================================================== + $this->imgdata_xsmall[14][0]= 574 ; + $this->imgdata_xsmall[14][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABm'. + 'JLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsRAAALEQF/ZF+RAAAB'. + 'iElEQVR42k3QPU8TYRwA8P//ebkXrgdIColXRAOEkJqbaExMut'. + 'DBhE1GNjYHPg+DG6ODiU6QOLjVxITBcFKBYCstlAC2Bz17fe76'. + 'vLD6+wg/1FpTRFR5lpaub/u1eGBGaAT4HneD4OlXx7avtDYUjT'. + 'HQabd2Ti8e3vVSKzxrtHS32wIpFVldno22Nqvvg2Bhl0gp/aNm'. + 'vJ3qqXAtLIva+ks1H0wqlSXi4+d6+OFTfRsAfHJx2d1od24rZP'. + 'xP2HzopINr1mkesX7ccojqif0v9crxWXODZTno3+dNGA7uWLsd'. + 'mUYU4fHJCViMG9umLBmM4L6fagZGg9QKfjZ+Qfy3C3G/B3mugF'. + 'IHHNcDf64E3KJALApk2p8CSolUUqLjFkyxOGMsTtFyJ+Wz57NQ'. + '8DghS4sLB0svioeZZo7nPhFoUKZDIVFbglkTTnl5/rC8snjAkJ'. + 'Bk/XV5LxHC/v7tR8jzTFPbg8LENK9WX0Vv31T2AEmCSmlKCCoh'. + 'ROnP1U1tPFYjJBRcbtzSf+GPsFTAQBq1n4AAAABKdEVYdHNpZ2'. + '5hdHVyZQBiYzYyMDIyNjgwYThjODMyMmUxNjk0NWUzZjljOGFh'. + 'N2VmZWFhMjA4OTE2ZjkwOTdhZWE1MzYyMjk0MWRkM2I5EqaPDA'. + 'AAAABJRU5ErkJggg==' ; + } +} + +?> \ No newline at end of file diff --git a/html/includes/jpgraph/src/imgdata_bevels.inc.php b/html/includes/jpgraph/src/imgdata_bevels.inc.php new file mode 100644 index 0000000000..569c7dd654 --- /dev/null +++ b/html/includes/jpgraph/src/imgdata_bevels.inc.php @@ -0,0 +1,104 @@ + 'imgdata'); + + var $colors = array('green','purple','orange','red','yellow'); + var $index = array('green'=>1,'purple'=>4,'orange'=>2,'red'=>0,'yellow'=>3); + var $maxidx = 4 ; + + var $imgdata ; + + function ImgData_Bevels() { +//========================================================== +// File: bullets_balls_red_013.png +//========================================================== + $this->imgdata[0][0]= 337 ; + $this->imgdata[0][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. + 'BMVEX////////27t/f3+LFwcmNxMuxm62DmqKth1VpZmIWg6fv'. + 'HCa7K0BwMEytCjFnIyUlEBg9vhQvAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. + 'RQfTAxcBNhk+pYJVAAAAl0lEQVR4nE2Q2xLDIAgFHUWBKJf//9'. + 'oekmbafVDZARRbK/pYTKP9WNcNv64zzUdd9BjmrgnsVXRNSzO3'. + 'CJ5ahdhy0XKQkxld1kxb45j7dp0x2lBNOyVgQpMaoadX7Hs7zr'. + 'P1yKj47DKBnKaBKiSAkNss7O6PkMx6kIgYXISQJpcZCqdY6KR+'. + 'J1PkS5Xob/h7MNz8x6D3fz5DKQjpkZOBYAAAAABJRU5ErkJggg'. + '==' ; + +//========================================================== +// File: bullets_balls_green_013.png +//========================================================== + $this->imgdata[1][0]= 344 ; + $this->imgdata[1][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. + 'BMVEX////////27t/e3+K3vriUub/Dm18j4xc3ob10k0ItqQlU'. + 'e5JBmwpxY1ENaKBgUh0iHgwsSre9AAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. + 'RQfTAxcBNTfJXtxZAAAAnklEQVR4nE2QWY4EMQhDUVhSIRC4/2'. + 'kbaqLp9p+f2AxAayAzDfiK9znPORuvH0x8Ss9z6I9sHp6tcxE9'. + 'nLmWmebmt5F5p2AR0+C9AWpLBjXRaZsCAT3SqklVp0YkAWaGtd'. + 'c5Z41/STYpPzW7BjyiRrwkVmQto/Cw9tNEMvsgcekyCyFPboIu'. + 'IsuXiKffYB4NK4r/h6d4g9HPPwCR7i8+GscIiiaonUAAAAAASU'. + 'VORK5CYII=' ; + +//========================================================== +// File: bullets_balls_oy_035.png +//========================================================== + $this->imgdata[2][0]= 341 ; + $this->imgdata[2][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. + 'BMVEX////////27t/f3+K5tbqNwcjnkjXjbxR2i5anfEoNkbis'. + 'PBxpU0sZbZejKgdqIRIlERIwYtkYAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. + 'RQfTAxcBNgK0wEu5AAAAm0lEQVR4nE3QVxIEIQgEUErAgTHA/U'. + '+7zbipf9RXgoGo0liMmX6RdSPLPtZM9F4LuuSIaZtZWffiU6Iz'. + 'Y8SOMF0NogBj30ioGRGLZgiPvce1TbIRz6oBQEbOFGK0rIoxrn'. + '5hDomMA1cfGRCaRVhjS3gkzheM+4HtnlkXcvdZhWG4qZawewe6'. + '9Jnz/TKLB/ML6HUepn//QczazuwFO/0Ivpolhi4AAAAASUVORK'. + '5CYII=' ; + +//========================================================== +// File: bullets_balls_oy_036.png +//========================================================== + $this->imgdata[3][0]= 340 ; + $this->imgdata[3][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. + 'BMVEX////////27t/e3+LO3hfYzz65ubiNwci6uQ12ipadgVGa'. + 'fwsNkbhnVkcaZ5dwSA8lFg7CEepmAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElN'. + 'RQfTAxcCBySi1nevAAAAjElEQVR4nFXPWw7EIAgFUNMoCMhj/6'. + 'staKczc/2RkwjS2glQ+w3YytgXCXCZpRo8gJdGxZadJws13CUP'. + '4SZI4MYiUxypeiGGw1XShVBTNN9kLXP2GRrZPFvKgd7z/sqGGV'. + '7C7r7r3l09alYN3iA8Yn+ImdVrNoEeSRqJPAaHfhZzLYwXstdZ'. + 'rP3n2bvdAI4INwtihiwAAAAASUVORK5CYII=' ; + +//========================================================== +// File: bullets_balls_pp_019.png +//========================================================== + $this->imgdata[4][0]= 334 ; + $this->imgdata[4][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. + 'BMVEX////+/v7i4eO/w8eHxcvKroNVormtfkjrMN2BeXQrepPc'. + 'Esy4IL+OFaR7F25LHF8mFRh5XXtUAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. + 'RQfTAxcBNgkjEpIxAAAAlElEQVR4nE2QAQ7FIAhDDTAVndL7n3'. + 'ZV/7JfEwMvFIWUlkTMVNInbVv5ZeJqG7Smh2QTBwJBpsdizAZP'. + '5NyW0awhK8kYodnZxS6ECvPRp2sI+y7PBv1mN02KH7h77QCJ8D'. + '4VvY5NUgEmCwj6ZMzHtJRgRSXwC1gfcqJJH0GBnSnK1kUQ72DY'. + 'CPBv+MCS/e0jib77eQAJxwiEWm7hFwAAAABJRU5ErkJggg==' ; + + } +} + + +?> \ No newline at end of file diff --git a/html/includes/jpgraph/src/imgdata_diamonds.inc.php b/html/includes/jpgraph/src/imgdata_diamonds.inc.php new file mode 100644 index 0000000000..eefdc8d828 --- /dev/null +++ b/html/includes/jpgraph/src/imgdata_diamonds.inc.php @@ -0,0 +1,177 @@ +'imgdata'); + var $colors = array('lightblue','darkblue','gray', + 'blue','pink','purple','red','yellow'); + var $index = array('lightblue' =>7,'darkblue'=>2,'gray'=>6, + 'blue'=>4,'pink'=>1,'purple'=>5,'red'=>0,'yellow'=>3); + + var $maxidx = 7 ; + var $imgdata ; + + function ImgData_Diamonds() { +//========================================================== +// File: diam_red.png +//========================================================== + $this->imgdata[0][0]= 668 ; + $this->imgdata[0][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/F'. + 'BMVEX///////+cAAD/AADOAABjAABrAADWGBjOCAj/CAj/GBj/'. + 'EBCcCAiMOTl7KSl7ISFzGBilGBjOEBBrCAjv5+eMQkK1QkKtMT'. + 'GtKSnWKSn/KSlzEBCcEBDexsb/tbXOe3ucWlqcUlKUSkr/e3vn'. + 'a2u9UlL/a2uEMTHeUlLeSkqtOTn/UlL/SkrWOTn/QkL/OTmlIS'. + 'H/MTH/ISH39/f/9/f35+fezs7/5+fvzs7WtbXOra3nvb3/zs7G'. + 'nJzvtbXGlJTepaW9jIy1hITWlJS1e3uta2ulY2P/lJTnhITne3'. + 'vGY2O9Wlr/c3PeY2O1Skr/Y2P/WlreQkLWISGlEBCglEUaAAAA'. + 'AXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAA'. + 'sSAdLdfvwAAAAHdElNRQfTAwsWEw5WI4qnAAABGUlEQVR4nHXQ'. + '1XLDMBAFUKUCM1NiO8zcpIxpp8z0//9SWY7b2LHv6EU6s1qtAN'. + 'iMBAojLPkigpJvogKC4pxDuQipjanlICXof1RQDkYEF21mKIfg'. + '/GGKtjAmOKt9oSyuCU7OhyiDCQnjowGfRnooCJIkiWJvv8NxnG'. + 'nyNAwFcekvZpPP3mu7Vrp8fOq8DYbTyjdnAvBj7Jbd7nP95urs'. + '+MC2D6unF+Cu0VJULQBAlsOQuueN3Hrp2nGUvqppemBZ0aU7Se'. + 'SXvYZFMKaLJn7MH3btJmZEMEmGSOreqy0SI/4ffo3uiUOYEACy'. + 'OFopmNWlP5uZd9uPWmUoxvK9ilO9NtBo6mS7KkZD0fOJYqgGBU'. + 'S/T7OKCAA9tfsFOicXcbxt29cAAAAASUVORK5CYII=' ; + +//========================================================== +// File: diam_pink.png +//========================================================== + $this->imgdata[1][0]= 262 ; + $this->imgdata[1][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'. + 'BMVEX///+AgID/M5n/Zpn/zMz/mZn1xELhAAAAAXRSTlMAQObY'. + 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. + 'AHdElNRQfTAwsWEi3tX8qUAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'. + 'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'. + '6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'. + 'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'. + '==' ; + +//========================================================== +// File: diam_blue.png +//========================================================== + $this->imgdata[2][0]= 662 ; + $this->imgdata[2][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA+V'. + 'BMVEX///+AgIAAAJwAAP8AAM4AAGMAAGsQEP8YGHMQEHMYGP8Q'. + 'EKUICJwICM5KSpQxMYQpKXsYGNYQEM4ICGsICP97e85aWpw5OY'. + 'xSUv85ObVCQt4xMa0pKa0hIaUpKf+9vd6EhLVra+dzc/9SUr1r'. + 'a/9aWt5SUt5CQrVaWv9KSv8hIXs5Of8xMf8pKdYhIdYYGKUhIf'. + '/Ozs739//v7/fn5+/v7//n5/fW1ufOzufOzu/W1v+trc69veel'. + 'pc6trd6UlMa9vf+MjL21tfe1tf+UlNZzc61ra6Wlpf+EhOeMjP'. + '9ra8ZSUpyEhP9CQoxKSrVCQv85Od4xMdYQENZnJhlWAAAAAXRS'. + 'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'. + 'LdfvwAAAAHdElNRQfTAwsWEx3Snct5AAABFklEQVR4nHXR5XbD'. + 'IBgGYM6AuHsaqbvOfeuknev9X8xISbplSd5/8JyXwwcA/I0AKm'. + 'PFchVBdvKNKggKQx2VIoRwMZihMiQE49YUlWBCcPL0hYq4ITh+'. + 'qKECUoLDZWqoQNA766F/mJHlHXblPJJNiyURhM5eU9cNw5BlmS'. + 'IrLOLxhzfotF7vwO2j3ez2ap/TmW4AIM7DoN9+tu+vLk6Pdg9O'. + '6ufXjfXLm6pxPACSJIpRFAa+/26DhuK6qjbiON40k0N3skjOvm'. + 'NijBmchF5mi+1jhQqDmWyIzPp1hUlrv8On5l+6mMm1tigFNyrt'. + '5R97g+FKKyGKkTNKesXPJTZXOFIrUoKiypcTQVHjK4g8H2dWEQ'. + 'B8bvUDLSQXSr41rmEAAAAASUVORK5CYII=' ; + +//========================================================== +// File: diam_yellow.png +//========================================================== + $this->imgdata[3][0]= 262 ; + $this->imgdata[3][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'. + 'BMVEX///+AgIBmMwCZZgD/zADMmQD/QLMZAAAAAXRSTlMAQObY'. + 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. + 'AHdElNRQfTAwsWEwcv/zIDAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'. + 'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'. + '6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'. + 'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'. + '==' ; + +//========================================================== +// File: diam_lightblue.png +//========================================================== + $this->imgdata[4][0]= 671 ; + $this->imgdata[4][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/1'. + 'BMVEX///+AgIAAnP8A//8Azv8AY/8Aa/8I//8Y1v8Izv8Y//8Q'. + '//8InP8Qzv8Ypf85jP8he/8Yc/8Ia/8pe/8p//8p1v9Ctf8xrf'. + '8prf8QnP8Qc/9CjP+1//97//9r//9S//9K//9C//85//8x//8h'. + '//9r5/9K3v9S3v851v97zv9Svf85rf8hpf/G3v9SnP9anP9KlP'. + '8xhP/n7//v7+f3///n///O//+U//9z//9j//9a//975/9C3v8h'. + '1v+E5/+17/9j3v/O7//n9/+95/+l3v9jxv+U1v8Qpf9avf9Ktf'. + '+Uxv+11v97tf9rrf+cxv+Mvf9jpf+tzv+Etf/O3v/39/8Akkxr'. + 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'. + 'IAAAsSAdLdfvwAAAAHdElNRQfTAwsWEiHk6Ya/AAABGUlEQVR4'. + 'nHXQ13KDMBAF0J2o0E01GHDvJa7p3em95/+/JQJMYjDc0Yt0Zr'. + 'VaAaxHgtxwbSGPkGQpOIeQ2ORxJiJmNWYZyAhZR0WcgQGhViU0'. + 'nEGoedDHGxgRapRPcRpXhOr7XZzCmLjaXk9IIjvkOEmSRLG62+'. + 'F5XlEElhA5sW21GvXj6mGlDBfnJ51lr9svnvEKwH1hu2QPbwd3'. + 'N9eXVzuL7/Hn29frdKaamgcgy67L3HFG9gDefV+dm5qme4YRXL'. + 'oVR374mRqUELZYosf84XAxISFRQuMh4rrH8YxGSP6HX6H97NNQ'. + 'KEAaR08qCeuSnx2a8zIPWqUowtKHSRK91rAw0elmVYQFVc8mhq'. + '7p5RD7Ps3IIwA9sfsFxFUX6eZ4Zh4AAAAASUVORK5CYII=' ; + +//========================================================== +// File: diam_purple.png +//========================================================== + $this->imgdata[5][0]= 657 ; + $this->imgdata[5][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/F'. + 'BMVEX///////8xAP/OAP+cAP9jAP9rAP+cCP85CP/OEP9SKf/O'. + 'CP9CEP9zGP9rCP+lGP/WOf/WIf9KIf9jOf+MQv+EMf97If9zEP'. + '+1Sv+lIf/ne//eUv/na//n5//Oxv/Wzv+chP9zUv97Wv9rQv9a'. + 'Mf9KGP/v5/+te/97Kf+9Y/+tOf+tKf+lEP/vtf/WMf/WKf/v7+'. + 'f39/+tnP+9rf9rSv9jQv9CGP+ljP+EY//Gtf+tlP+Ma/9zSv/e'. + 'zv+UUv+9lP+cWv+lY/+cUv+MOf+EKf+UQv/Opf/OhP/Ga/+1Qv'. + '/Oe/+9Uv/ntf/eWv/eSv/WGP/3zv/vlP/WEP//9/+pL4oHAAAA'. + 'AXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAA'. + 'sSAdLdfvwAAAAHdElNRQfTAwsWEjX+M1LCAAABDklEQVR4nHXQ'. + '1bLDIBAGYFqIEW+ksbr7cXd3ff93OUCamdOE/Mxw882yywLwPz'. + '+gNKotlRFUVnNUQlCxTMRFCKEdE+MgpJaEiIOU4DKaoSIygtb3'. + 'FBUQrm3xjPK4JvXjK0A5hFniYSBtIilQVYUm+X0KTVNiYah+2q'. + 'ulFb8nUbSovD2+TCavwXQWmnMA6ro+di+uR5cPzfPhVqPV3N1p'. + 'n3b3+rimAWAYhP3xnXd7P6oc9vadPsa1wYEs00dFQRAFehlX21'. + '25Sg9NOgwF5jeNTjVL9om0TjDc1lmeCKZ17nFPzhPtSRt6J06R'. + 'WKUoeG3MoXRa/wjLHGLodwZcotPqjsYngnWslRBZH91hWTbpD2'. + 'EdF1ECWW1SAAAAAElFTkSuQmCC' ; + +//========================================================== +// File: diam_gray.png +//========================================================== + $this->imgdata[6][0]= 262 ; + $this->imgdata[6][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'. + 'BMVEX//////wAzMzNmZmbMzMyZmZlq4Qo5AAAAAXRSTlMAQObY'. + 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. + 'AHdElNRQfTAwsWExZFTxLxAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'. + 'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'. + '6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'. + 'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'. + '==' ; + +//========================================================== +// File: diam_blgr.png +//========================================================== + $this->imgdata[7][0]= 262 ; + $this->imgdata[7][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'. + 'BMVEX///+AgIBmzP9m///M//+Z//8hMmBVAAAAAXRSTlMAQObY'. + 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. + 'AHdElNRQfTAwsWEwCxm6egAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'. + 'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'. + '6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'. + 'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'. + '==' ; + } +} + +?> \ No newline at end of file diff --git a/html/includes/jpgraph/src/imgdata_pushpins.inc.php b/html/includes/jpgraph/src/imgdata_pushpins.inc.php new file mode 100644 index 0000000000..a9659d2b58 --- /dev/null +++ b/html/includes/jpgraph/src/imgdata_pushpins.inc.php @@ -0,0 +1,517 @@ + 'imgdata_small', + MARK_IMG_SPUSHPIN => 'imgdata_small', + MARK_IMG_LPUSHPIN => 'imgdata_large'); + + var $colors = array('blue','green','orange','pink','red'); + var $index = array('red' => 0, 'orange' => 1, 'pink' => 2, 'blue' => 3, 'green' => 4 ) ; + var $maxidx = 4 ; + var $imgdata_large, $imgdata_small ; + + function ImgData_PushPins() { + + // The anchor should be where the needle "hits" the paper + // (bottom left corner) + $this->anchor_x = 0; + $this->anchor_y = 1; + +//========================================================== +// File: ppl_red.png +//========================================================== + $this->imgdata_large[0][0]= 2490 ; + $this->imgdata_large[0][1]= + 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMKBh4Ryh89CgAACUdJREFUeJy9mNtTFFcexz+/7p'. + '4Lw1wZJKDGCAwmDAqUySamcCq1ed6k9mn3UfMP7F+1T3nYqn2J'. + 'lZdoDEjpbq0KG8EBFBFBEJye6Zmenkv32Ydu5GYiUMmeqq6uqT'. + '6Xz3zP73aOcIKmAQkIFyD3N/jrBPwlKjLQEglVlJKyUjR3u7cc'. + 'WLoP3/4dvv03LNrQ8I6x1rFbDML9kOmHvh7IRHU9JKmUSG8vpF'. + 'IoXX/TV0AiEM5A5jT0noFMFMJHXUt/d5f9TUAbhtQ3cPFruDog'. + '8klHMnmO0dGYe/myOJGINEwTz3F2higFXgy8PpAkOC+h8hoaCt'. + '4ppHFcQAWSgOQlyI/p+lUjmRxWAwNJd3xca/f34yoFi4tgmjtD'. + 'NIFkJ4xcgBCgVqEBFJ9DqcZea/gNAAVEg7AOGYnHe9XoaJd3+X'. + 'LISSSwnz6lsbKCZ9sHh4UVdBkwdA6cPwNnIfJPmC3Ctgft3wwQ'. + 'QPkvTZJJnbExzfvsM2nMzVG7e5fG48d4lnXwTwEYCjJxuHQBog'. + 'BHUfKkgAIIhiGk06hTp/Dm5qS1uYlXLvtWd4gPgIiCrAEcVckT'. + 'Ab5p7TaYJrK1hQaEenrwSiVfQdc91P0kSp7Ii89D5ksY/kAkLy'. + 'IZXFdXkQjS1YUSEbdcRu168V6+HTUNIKJDRwdE+sBIQmP9Ld59'. + 'bEBA3of4F/D+uXb7rGaaCSmXI3pPj64PDaHCYfEqFVSjgWo2D2'. + '73XlJNQTgCyQykIuBWoNKEeh1aLXBPBCggGdBOgxZVSjoajVhH'. + 'o5HWlIpq4bCQSgm9vXhK4ZZKh5SUYygp4J1EQVUD9xlU18BJQD'. + 'bUbJ5T5XJStyxN9fSI099P3baxV1dRloW2h2ivx/yakg2ot6F1'. + 'EkCa4G1D+zVEq5ArKTWM42Q6HUczQV7U66w9e0ZpdRXlOIQ5vF'. + 'VHUXILKify4jiEzkOqC3peQMoBQymFlMt4Dx6wUSxSsm2UZXEK'. + 'P30QvOUt8/2Sd78CdWwFDTA+gsw3cOlPcPUD+CQB52oQ21RKXM'. + 'eRhGXhOg7VoKrx8KuS4ygZhVg3ZI8FGIfwR9BVgAtfwxdXdP3L'. + '86nUR91dXelNXTeWWy10paQHX602YAP1ADASAL7LJvFtMpOCc0'. + 'cG3FHuGlz6Gr4YEpnoTCbzsdHRbOzy5RCRiLRMk5rjyOtAimwA'. + 'U4U3SurBN/0wnAASBCVDIKpB4kiAB5Ub0/UvO9LpPAMDGfn005'. + 'AxPCzxep3Q6iqPLUseBoufCZRsAE6g5g5kKIDfKUj3wnpAG8QB'. + '/Z1OIqANQuI65AtwNScyYXR2XlAXL2YZHzcklRKWl5GVFXFtGx'. + 'MoAiV/EQaAGH6BUQNWgQpwFngv+Ca8KUAQEBcwgTJHyMV7679R'. + 'XS8YqdSI6u/PMD5ukMtJY3GR2uQkr5aXeWVZOEALmA8WsIAxfL'. + 'd0goVLAdCOd+/YpgqeVtBv4yiA++q/RKKXixe7GB8PSyoljcVF'. + 'yg8fyubyMpulEk2lyAIfAAvAC+B+oOQFoAt/+0rAejB/EzjNri'. + 'vvqNnCd64jxcE39V8spnP+vMbAgDSePKE2NcXm06dslMuUlcID'. + 'TuFvqwXMBU8N39bGgRR+ki0Dz4L5DSAe9NGD7zq+6kcN1L6H2b'. + 'ao5WWaQHllRTafPmWrVMJUimoAQrBYJFjQwre7B6A8YAi8LCgD'. + '5DVo6/hbb/iHK1KggvFeD3hHziQKEMuiNTNDbXGRTdtmw7Iwla'. + 'KGH0oqwbscLOoG46rAY6AOzRhY74PT6QuUKEN4PegXxd/yEDTT'. + 'YMWOk+oEaLkuFdNk0zTZwjfkavDUArXWgGXgFb4dEShXhfYqlI'. + 'ow3w9rg3B6ED60IOOA5oEYQBrcpG+mj9bg0VG8GMJhVDZLyzAo'. + 'VSq8rFYxXXefcjVgG9+uisDrXUCApoKSBcUHMBmHhfcgNwhtD3'. + 'q9IG6Lr15b4OUTmPwBJt8JqGuapp05o0mhoHnptLQfPsR+8IBK'. + 'uYyNH3yr+B77LHheA3tK1Ta+IrMeTL2C6Xl48TOsNWDDgAz7s5'. + '/r+krP/eddCsbj8fDQ4GBm9MqVvvRXX2VULBayRGRzaYn1SoWa'. + 'UjgB4PIB5QK4ZgBXBKaAHxQsrED1H7CRgCUPwgHZDqACmhWwXv'. + '2aDRqGYeRyufS169cvThQKV88PDuYbW1vJ5VRK+5euqxWlPMdX'. + 'SRqgreHbZGN3ijfKBXBTAeh2Fdwi2MofshP/dvKwCmKhp4m83Y'. + 'vj8Xg4l8tlCoXC0MTExMTFkZE/1m37wvLGRvKRacoD1209E7Fc'. + 'pZwYREOQqEJ4z3HskHLsz4AoXykPIBSN0t3dTTQafROoHdumXC'. + '4fjoMiog0ODiauX7+eLxQKV3O53ETdti88nJnJ3rl505ifmWm3'. + 'arWSodR8GNbycDoNHy5C5jFold1k8d+DyvELNwg93d18/vnn9P'. + 'X1oes6nufx/Plz7t+/fxhQKSWJRCI5NjaWHxkZKdj1+sjSwkJm'. + '+uZN/dZ337VqCwullGUVdZjsgIUC5LqhrUPvCugWuApeApPAzY'. + 'PKHWyaphGNRunt7WVwcBARwfM8Ojo6sCzrMKBhGLphGFEF2Wq1'. + '2jc7M5OZ/vHH0MPbt93awkJJmeZsC6ZaMK3DCwvWdNioQUb5B6'. + 'AdBR+9SzkAz/NwHIeXL18iIui6TjgcJplMMjY2th8wHo+Hh4aG'. + 'MsPDw6fddru7+Phxx51bt/RbN260qwsLpZhlFZsw9QJ+2Pbrga'. + 'oJG2FY2oKwuTtVEz9uV34NbqdtbW0xPT1NNBoF4MyZM1y5coWu'. + 'rq5dQBHRcrlc4tq1a/l8Pj9RMs38ndu3Ez//9JNXLRZNyuXZJk'. + 'xVYKoExQpsK/+IaAuYb7no8zjC/R+A4zisrq7u+53NZjl16tQ+'. + 'QIlEIslsNpuPRCJXZ2dnh2/duNFRW1oy07a96MKd575yxRqU1B'. + '5vPMpF5HHa1tYW9+7do7Ozc/eQpZTSQ6FQt1Lq8pMnT/5w7969'. + 'nuLcXE1rNufO9fRMhlKpOyvt9qPtVmvb25fFfvvWbrepVCqHwo'. + 'xaX19vff/996ZhGC8qlkW9Wt1Onz073fXxxz+6MB+9e9dUjuO+'. + '7ebq9wLdB9hoNCrr6+s/4wf3FCJW3fPmTZhXsNWCprjuW66Dfr'. + '928KAfBhJAEgiJSLuzs7OSTqctoFkqlZRt26j/I+L/AGjPTN4d'. + 'Nqn4AAAAAElFTkSuQmCC' ; + +//========================================================== +// File: ppl_orange.png +//========================================================== + $this->imgdata_large[1][0]= 2753 ; + $this->imgdata_large[1][1]= + 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMLFQ0VCkHCzQAACk5JREFUeJytmGtzG0d2hp8zNw'. + 'AEcRdJ6EJK9FL0CqZUm9jWbkwq3vhDstl8dmLvz8rP2H8Q75ZT'. + 'pkRfpLgqsS6WIFEKGYkiSBCDO+banQ8DUpRWEkklXQUUqlCDfv'. + 'rp857pgfAOQ4AMOJdg4R/hX96Hf06bvDc5iT07i8yeg8ksiIAI'. + '4TBi/ds9/vivD/njapNHvRBfHXMu410AM+BUoVSF05NQsi1sO4'. + '8402AXwLQTuP31OAZO2aG0MEn14iSlnI1z3LnMk8IZYJyBwjIs'. + '/TWsVIWPJkvMFS4zMfMhUp5BsoCpAAEBLYKaMFGn00jBxnvu02'. + '35+JHmSJEnBpQEcPo38MmCxd/nS9Ry71Ga/g1W9a8gn0GsHkgA'. + '6DGjxkqb5CoO+YxF3A3p+jGjQUzoK+L/V0ADzFMwtSR8eLbAr8'. + 'uXOTf9NzhTc0geSLUQcYHgYEH786RMg0zWJHV2Aitv4x/HpHVS'. + 'QA2YBqTTGIUq5qkPMWaWkVwPnPtAA/BevmZcjxaaUtHh8pJJGu'. + 'DpCB9FvT7A7YT7S3p5vFMNzmWo/O0MSx/Ms3TqI8r59zFTfUQe'. + 'I7SBODE3tnfoIxYnNHligwik0zAzDdVpyKbA8sff5YAeMEwgkV'. + 'cufQeTJzZoCsaFLKXPTnNpoUTNsSgJmNoGsuNQjIDwYD2HlnZy'. + 'k++yxTKXZfKTU8zOpjhneeQYkorSmGERtIlICBKRbLX+y98YN3'. + 'ADcNIm+bJD4U3pPnmbEaRgYVRTGBkDSSsmxKfY7ZLuDJA4hdjl'. + 'JEgyBB2SJOvQ9RzTpNKoEwNq0CNFvOXR3/HxMgYVPObaz8kPmh'. + 'hkEWMatAfRONGGvLizyOE9P8KkpwhPDAgQKJQbELUD0oOIhbbH'. + 'JeVTmowxjAgZutB5AoOngA+2DdYrcTyOyYZP9+QpBvI29vwEhb'. + 'It042BVQgDy9KTMfkwQG1A9ACCLlgBBGUwxxoc52WDh2ATyEPp'. + '1hoaPvrEBh0Dq5an9OUsl/9hylk5b5c+mowLc4E2Jtw4Eoljyf'. + 'ogA/AGEAagNRjGyUxOmEycyVA5EWDBxrmUp3ytLIv/NJP69Goh'. + '+9mFydIvS5PZYkvH1oY/RFtKymlwBFQAgQd+kAA6qSQ8pvn2mp'. + 'SkJkuVFHPHBnQMrEt5Sl+e4/Lvp51PF1PF5Xy6WMvOWZXMom8z'. + 'OZTQ8+j5sbQiMEwopsCIwRtBGIJSCdzbTGo9NimkDcgdC7Bg49'. + 'TG5n4/nfr0Si77WdYp1YzyZEkWPdteaEnB7pPqBTxuIf/VgciE'. + 'SgasCPwh+GNIkaNNag1RiPge5pEhMQVjfoLcF+eoXSvbKxedwn'. + 'LKzC3KWbOi5/sW5a44/SHFUSgVA7SCzRG0AvA9mPOgFIETgu4n'. + 'Ww0wNQWFAqRSL6D2ZQYBdDrQ7R7jXiwgRcvIL02makuTmWtpM/'. + '+BlLMl5vuWzLVEuwH6oYnR1KS8kJINGXMM2YdfRlALoQoQQKeb'. + 'bDVwoMdxQMaLCwLo96HZTF5HbrEhmOftianfZisfzueKv7ZmrX'. + 'MsjhxKXZGBjzyeEHmSE3oWiggtyVGmE8DTIXTC5NxgAxOAGUM8'. + 'fun9mnSSLQ/CxNzOTgJ3LIMgoGwkKBiiMyaVviHVkdCO4FEKNv'. + 'LQzWBYHfITPa4UBVM0LR/WB7ARJsdDDTjA6deYFIFUOimJ3d0E'. + 'sNdLavYYgBpthqKcjiiJRO8K6CK0CsJTjfQAGaJtD9vQFAxNNQ'. + '1FB0yBAfA8gdMAIagLoCVAen0M00zMOTYShNDtoHs9CAIUoI4E'. + '1IBihCdNhsMhsj6NuV7BCC2IBpBqQaaFOENCCeiEsO1BO4RQgy'. + 'I5Hm4k4oIU9MrgZSAdBeTabZz+ODxKQRRBFBJo6IUc51anYRQo'. + 'dto+24FNxYCiaWKkQsj00KkO4gxRRkAngJ868M0u3OkkM+hxQA'. + 'cQ7YD7GO5XYSsPZybh/TCkFIYY+kWniTW4Q7jXgHvHMhiRpmuW'. + 'ca08GZkkZ/nY6TZMNhCnf2CuPoDVJvxpB+q9BHA8Ag1uH+oP4c'. + 'YEPCzDwmzSLquShHW/E0YRbG/BjZtw40hAy7aNzJlzRn75E6N0'. + 'qiwTzafI7kOU3gWrhzZC2iHcbsPqLlxvJnCt4KC1RYAL3I5hzY'. + 'Xv/huePYCtITQMKEnyB4KQvMURuJvw889HGSwUCs7CwkLpo6tX'. + 'Ty/+7nel6VLGDn/8N9m+eZuo1UP8iNhLau6b3RfmOsHBGTUYw9'. + 'WBNeDrGB4+h/4qNLKwTnLbHj9CJw/6GoIh9Jpvq0HHcayFhYXi'. + 'l3/4w9LK8vLKexfma3G/mb/3n1njTivS7tNQaaU1grQDjJ868D'. + 'Axx6vmxnBrY9C9IcSbSXbavNjb/S3eN6/0m1JcKBScixcvllZW'. + 'Vi6uLC8v12q1v/M8b/HxVjP//YYr32yE4dYWvShO0ogi14xwxq'. + 'F4rbnxZ3cMjtpvEEeMvwA0TdOYn5/PffHFF7Vr166tvPeLXyx7'. + 'nrd4+/btyg/frFo//Xgncnd67qCn78earQqcmYD3fSi1wPCTSV'. + '3gzqvm9uFOMl5nUAqFQn5paal26dKla57vf7D+6FHph9VV88af'. + 'vgq79bo70e3VT2l9A3hYg4UiRALVHTCHSZvYBm4A//6quf8zoG'. + '3bpuM4acMwKr1+//SDe/dK31+/bv90/Xrcq9fduNW6rbVeC+E7'. + 'gWdD2DKg4UEpBmPcm10RuScida31ntb62HAigoigDw6Gh0axWH'. + 'QWFhZKi4uLZ+I4PrVer2e+u37dXPvqq6hbr7tOp1NXWq89h6/b'. + '8FBB34WGBesdcPrj38lkMkGlUuml0+mu53nR3t4eo9HoSLhMJk'. + 'OlUiGdTuN5Hq7rvgA0TdO4cOFC7vPPP6/VarXldqdTu7m2lrv7'. + '7beq++BBO263b/tKrfWSXlbvwJ6CuAtDgTYiaBFMw6BSqfDxxx'. + '+rarWqGo0GN2/eZGtrC6XenAkRoVKpcPXqVWZmZmg0Gty6desF'. + 'oIhIOp3Ol8vlmmVZK3fv3Lm09uc/Zwbr653ccPgoNIzvnmn99Z'. + '7W9QG46lAaM5mM2l95GIYUi0VOnz7N7OwsWmsymQzyuse5Q8Mw'. + 'DNLpNDMzM5w/f/7A6AGgUkoajYa9urpayOXzUz/fvZutr68Pim'. + 'F4/2y1+n2o9Q/ru7uPesPhXnyo4A+vfHp6mmazybNnz9jZ2UFr'. + 'TbPZJAhe+8/aS0Mphed5NBoNABqNBqPR6MWBVWstvu/nnj9/Pv'. + 'vo0aPq5uZmPBgM/qcwPf39xV/9ajU1M3Nvq9PZaw8GoT50PjdN'. + 'k6mpKa5cucL58+eJ45j19XWePHnCzs4OnudhmiaWZRGGIVH05r'. + 'yEYYjrumxubrKxsfFyDQJ6NBp1Pc+7C4jWumBaVm+kVL2l1H2l'. + '1G6otS+H6V6z8u3tbVzXpdFooJRicXGRqakptre3uXXr1ltrcT'. + 'Qa8ezZszemWAE9rfUdYBOwtVLRbrPZ+48ff+wDvuu6Sr3MB4Dr'. + 'uty6desgfa1WC3iRyrNnz4pSSmezWUzTfGtYtNYcdvC/9sMlgP'. + 'n5N4cAAAAASUVORK5CYII=' ; + +//========================================================== +// File: ppl_pink.png +//========================================================== + $this->imgdata_large[2][0]= 2779 ; + $this->imgdata_large[2][1]= + 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMLFQolY9lkpgAACmhJREFUeJy9mOtzFNl5h5+3b9'. + 'Mz0kzPBWmEVtIiWYhIiC0HCDhB8lb8ISk7nzdZ5+/zJ/8BTmpT'. + '660CZLwG1pVFgBkgGIHECEaa+/T9nHzQCCQuRpCNz6mp6g893U'. + '8/c37ve3qEjxiC4OA4n/Lp/EUu/tsMM/+aEWduVBx7WhdkShcY'. + 'xUH2zo0Dwod/5N6vf8V//PoGdx8M8EOFPtK9jI8BdHCcMuVSmf'. + 'LxHLmSZdm2U8xIbmKETDGDZZnIy4dBbCynyGhphurEDBOlHFnn'. + 'qPcyPxTOwDCOccw7w5nlBRZWylI+ny/mZ6rL1dzUZ5/IWGZU3D'. + 'ZIOMQDDaJcHDVGWUbJBi9odVr0QoVSPzigIEaZ8vgSS/8wZU3/'. + 'k1fylipz5dLM2WlrZqHKaGCKbEbontq3KAKWQyZfZKTgYqc9Bp'. + '2I2PcJ4ogk/UEBQcwipbFZmT13vDBx8fhnE1Ofnp9yJopFyT3X'. + 'yANfks0QHSQMDaL37pOxMLIu2UyVkjVKLjyKSeuD8dAYCFkso1'. + 'gYMaeWJ40T56cl8yAi/O4FSa2P6kYczIDsgVpAqcDImZPMuAB1'. + 'dkLQtcc8a/bwox8IUHAxZVxGZMouSLVYwKuMkD5IxN+JSdsRJB'. + 'pexuTVgYYM6EoGmxkmg3/hEhNUMr/hd7dqbOzExMn/GRDAxWZc'. + 'j3I8HiXfMjF2FQowKw7pjoN6E/Llw/GBJj8qxVOMlX4ipxc/lY'. + 'kl2zBLkmrTcEzMkoNoRLVidLi/9g+Z3I+1xRHX5EcAihxnbPRv'. + 'OTU9kZSmpKPy9FTGrLimPZ1H+UiyGaF67w6n7E1DwMngFDxGvc'. + 'w70v0xZUby5IxjlIyMssUJrJwVWkXBdbXvSvwEibcSdKCAFI16'. + '4/sc0SRo9cGAGq1DwvQFzV6DVuBiV4zYnlEts6A2TSPcSiXoxo'. + 'QqJCEEFMbQ2b69o5qMiOOPqIMQkagu/aSL7waE8101WFShLjk9'. + 'yxgEvjRUiyYd+gwAjY2J9VpXfZ/JEXLhDp3OR6U4T97+hEnPwx'. + 'tv4HsRjy2tTQSFzQgDUnwSLBQRI+x1ZgcH87Vcv4SF19Kt0ezS'. + '1h9s0Ma25pgr/YJfnLnEysok0+ezjM6EBLldGqKIJYuDRhOQEJ'. + 'Oih8X9Q0xmcXNjlCofBJgn78wxVz7L2YWf8tPPz1hnfjbjzfxN'. + 'qVwutq2etZXUQSXikcXGIgUiUkJSDIQMJgYGJsaB3c7b1qQ4GZ'. + 'xSkdGZIwMeNLfK6uezMnvJK3pLxeVixfvMsyVjSNSO6IV9adPG'. + 'AArkEEz8oUkFmBjYGO80qfd6pCWIayD59wIKcsjcKqufn7JO/S'. + 'xfyi+5c24pey5rZ09mJRNkiDdT/tzbkBr3SYkpMYpgEaIJSYhI'. + 'kSOY1GhilAQk5ntDIojxCZ/kf87Pl85xbuWEnLiUy+cW3NNuJX'. + 'MmY5meKf6mT7wZS+THdOjxlG06tIlIOMZxchSxcFFEGAwAGGME'. + 'jwyZYSnWL3cXWiIUbUI6hO/vxXuFOV84ycmlBWthNeflTjuzTi'. + 'lzJmM5s46Ej0J63/ZoPmoy6PYxtYVNhmfs0mbAND1mmKVMBY1L'. + 'mxA1LN7WgXQbCApNhKJHRIM+DQbv7yQGhjnJ5NgFuXBuxpu5mD'. + 'udm3LPuY7pmZLUE6L1SIJaIPFuDAqyw9lnwDYv6NFHkWJh4ZDB'. + 'wCBFD3uMxsTAwcBAiElpE/KcPg36dIiOvpsRxDCyhmlP2YY9ZU'. + 'v8NMb/1id+FGO0DTztkSXLOONUqeITsMkW2zwnJEIDFhYGx+A1'. + 'kwK4mASkvKDPc3p0iYhRRwYUhZLUTyV6Eu0t4s1Y4kcx6W6KaM'. + 'EZThcXH59RRhGEgIAddnBwNEBKqqpUtWBIF22YDIhJsbEkJqFN'. + 'qLtERHs7GnUkwISEQAf0uj30bY39PzbiC6qrDu2cExJ69Nhhhz'. + '59UlIUipCQOnVi4sjG7ubJBy6um0C+he/0iDHQKIQERYyKFLqr'. + 'SI/W6kJCnvOcrWSLSquC1/Jw9Ks3R0FQKHr0uMc9bnCDGjX69A'. + 'H0XlcJkibN5jOe/alCZStHbjJL9lSMLkXExvCXRiDV6GZEeGeX'. + '3TvvBVQoEjfBL/v0rT75Th7VU5C8gktI6NLlMY+5yU3WWGODDf'. + 'r098tHpNFNH7/2lKdXXdz7efLzVaqJIBOCmK8AJUlI6g0aV+9y'. + '9+p7AR3bMQpTBWPy7yeN6fy0jNwewfpvC9Xe+3kFoUuXe9zj5n'. + 'BusEGHjh6GIAGawC2FWuvSvbbF1maFylZAsC1ISZADBiVNSJrP'. + 'eX73MY//skHP85z5+fnSxQsXj//4n39cmnPn7LbZlsajBmEnBL'. + '1nuEGDG9x4aa5Ldz+h0RCuBqwBv1Wo+7vs9r7n++0MmYeAM+zB'. + '+61EK1QUEnbbtN+9Bh3Hsebn54u//PdfLq9eWl2ZnZ1dSnaSwu'. + 'Pin40b9g3doKE0WoNIl65xj3v75njd3BBubQi6ExKmDWkMRKSl'. + 'tSbVKQcMao1Go5Ugb0+x53nOyZMnSysrKydXLq1cWlxa/McgCB'. + 'Yev3hU+GPrD3I5/q94k3pXYQY58q6B5Bs0HB//neaGx00gyWaz'. + 'VCoV7bquCoKAnZ0dfN/f03egLGj0m3XQNE1jdnY2/+WXXy6trq'. + '6uzP3oR5eCIFi4detW5feXL1vr679Let37zVB3/mQytjXJwmSB'. + 'wikHp9ShY0RESqObwPrr5oBERKhUKly4cIFqtUq9XufmzZtsbW'. + '2hXvuDwTTNtxZq8TyvsLy8vLS4uLgahOHphw8elL69fNlc++qr'. + 'uFOrNXPddm1cczVL5f5P+Lv5MuOJgTGxwYbZpZsCdeAq8M1Bcw'. + 'CGYeC6LtVqlRMnTjAyMkKn0yGXyx0N0LZt03Ec1zCMSrfXO37v'. + 'zp3S769csb+/ciXt1mrNdHf3ltZ6Lca8ZpJsduhtCdb2gEFJoQ'. + 'xADYHuHDS3f32lFEEQUK/XGRkZoVAocP78eZaXl9FaI/Jq25Uk'. + 'yWHAYrHozM/PlxYWFibTND32sFbLXrtyxVz76qukXas1M61WTW'. + 'm99gx+20TdN9jqtfjP7QzOwwYNp037Zd0DukDnIByA1pqdnR2+'. + '++472u02Z8+eZWJiAsMwDsEBRNGBzYJpmsaJEyfyX3zxxdLS0t'. + 'KlVqu1dP3q1cLta9ekU6u1dat1J9b6Sk9kraV1rYXegW7apDYw'. + 'kFY6fPc4MNTw88bwfZ/NzU2UUnieRxAEiAiGcXiXfcigiIjruo'. + 'VyubxkWdbK7fX1xWvffFMInjzBM82uMT5+p++6V1UUrSe7u03t'. + '+8lezlKt3gHyl0aSJDQaDa5fv876+vo+w6FzDq1BpZRsb2/bly'. + '9f9vL5/Njdu3fzG0+eMJHNxsfn532vXN5NPG/7abPZal6/Hvfe'. + 'kroPHfsm98f7AHW9Xo+//vrrlmVZm71+37QNw3JnZ9PK4uJGpV'. + 'pt4Dh+vLGhsrmcfv1iHzu01m89HjIdCon2fb8TBMHtvYeRUn50'. + '1Oj4vqp3Ok1f5LYSadfr9dQfDN642P/XeF2DA+SBAuA4jkOhUK'. + 'BQKESO43S11p3BYBDt7u4y+CtB/i/q7jp1GMiw2AAAAABJRU5E'. + 'rkJggg==' ; + +//========================================================== +// File: ppl_blue.png +//========================================================== + $this->imgdata_large[3][0]= 2284 ; + $this->imgdata_large[3][1]= + 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMLFRAiTZAL3gAACHlJREFUeJy9mGtv29YZgJ9zKF'. + 'F3y/Q9jh05tuQkarKgbYasde0UBdZgwNou/Vqga/sD9mP2B4a1'. + 'BbZ9atFPxb5sqOtmXbI19bqsluPYiR3HN90vFEWRZx/IJI5zqa'. + 'x0OwBBSgR5Hj7v+55zSEFXTUgIJyA9C6/9RsjMjAyFIxxJCDc7'. + 'iBqKgyZACGg3G2x9+xXf/fG33P3mC9qNKsp1O+1JdkEnQTdgIO'. + 'ttCSMUi8gj072MnugllAyB9G8rBGi6RsToJTF6iuRoFi1kHKZf'. + '7fB8Iggj0/Dy23D2dakNTR3JDsXPvzstxmZGRMER1EwHhQAEgE'. + 'CLhIkPD6InY9S3djGLJVBtQP1Qb4HDAyoJYQOOZkPx49nhTH9i'. + '7MUBGT7egxkJgd70wZS/CUkoZtA/fRoE1DZ2ACiv52ibReCp4e'. + '7CIEHomxDiuVdGTqUnf/ZeOjR8fpiVXZul5ZrY3bWwbdcLr/dA'. + 'AAIpAwQjUWIjQ+g9HZvswiCgBVF9/SI6OSLGzo0i+oLi6+Utbq'. + '+bKEftgwOE/0Ohocf66M+cBjo22U2RQLIHMhmYnvaOpR9S8bSU'. + 'UqCURGpRkuMZMm9cIvPGJZLj0yBjT2LprkiSkykx9cuXIhOnUs'. + 'm+QNC2XdG02ggBTcvFabsPWwTPpBAChSCgh4kYBpoeplWp47Qs'. + '7EYDt21xINzd5GCAxLExRl89Z+nHjpbKMmjbmkgfDzI0JEW53K'. + 'Jaa6NcAOEX8v52uJzsBlAS6u0hcnTIccPRqhWPCUcLD+s1EaUp'. + 'HCEhEMCyHNpt9SjgIU12A6iw6xb123vYhaaKjB9tlgMD5X+uBp'. + 'zdkpg6azA8EaNQtKlVba+Xez4eCntnJrsDdFsW5nYFpxlFN846'. + 'DXe8utkM4mhi+EgQmjYbS2WqexZKk6BpjwJ2YlK5VjeA3pNDiH'. + 'YjRWPzPE7tmBo8EWwGhkXx+z3uXL7D3rU97LIF8RBEAl6lK/Uo'. + '6JNM1rZ2aTcr3eUgIQOGTgbdwXMGyRejenLYTvQGbAdRuetSud'. + 'OivVuFZgtCEgICghICnZoMhmlVTPR49LCAEkQUhk/B7KXe0MWf'. + 'nxj8xVR/cDheK14WZmtVMJSBnlGoN6FmQq0FLfdwJgORKPHRo/'. + 'Snzx4G0F/FjJ4KiOdmjPCrrx8bffnMybMv9MQGNG3rzlVqtR1B'. + 'sh/CYXCD4Aag1oCW7ZnUOjSp6WFi/QNEB8Y7BfTNjZyCmUvJ0I'. + 'XXT47MTp98Ybon9VZCk8cVazfqlNargsY34G7ByAlIjkHd9CCr'. + 'LbBdiHViUgiECuDKYCdz8b2cywREdiYZOj8zNnLuzOTzx6ODp+'. + 'OaGaqwVzBFqz0Idhz2loE7YEwBLaAJLQcKbW8qjAcBF5Jh0AMP'. + 'IOHe6kxgtb3UMO2OxkF//ffK28nQqxfvm3szrtnDVa799Qb/+v'. + 'NtsbNSpm3tAv8B+w7Ub0FhAyoBcMPec9oK6raXk48ziQBXQcmC'. + 'pT3YqHa0mpEBkTR6wz/Jjo2cy04+fzwxdDquNfQKO7sFUbpu0c'. + 'wp3JoAYsA42Bbkl4GCryUNDEM7Avm6Z/CgSYBWG8pNuFuDu1Wo'. + 'tjoxKIJGeHIiM/jmK9NnX5ycuJQMtUcqXPvLDTa+qIie4hAJ1U'. + 'vdrmO2HaDfB931twJgAn1A4lGT96obPHPLBbhVgUoTHHWo9aAA'. + 'JVAKpyKEmQNzWRENAsL18ycKjAFN/9gCNvzLB/390MMmE7pnDi'. + 'Bvwt0K5Jv3O+0oB22nJ1Vvjb/UMhOpcKknqN1OiMB2DNHU2G5s'. + 'sVndpGJVcZXjX1IAlvw9PmhRQcOFPhsSDkiBrQR1G7brgs0a7D'. + 'ag3FK4rguqBXarI4Nt1SJv5gls7TEWtJDRBO2GwnIs8maevFnA'. + 'Gx6awLZvzeTBu4kFbLigijC47pscpx0xyDfkvtUEnlarCDtrUC'. + 't2HGIhvPHVdVwqjTIrxRU2a5uUrYoP0QZ2gMvACl7+3V/LuKDq'. + 'sJuDy597516+CEezIHXv7vcgXQu2l+Bvn8He9Y4AE4kgk5P9DE'. + 'R6aFdq5Et5Nit3yTf3m9sBcsAN3+D98c0Fit5JawE25r1zg1Fo'. + '5B8GFD7g+nVYnu8EUEop9XTa0N/9dUbqcphP/rDJzbUClVbpgR'. + 'y2fXM3fND95qj75J8AC6BWPINfVSBieK+x+6cS5UCzCLu3oFV9'. + 'GqCMx2NGOp2Znpv7aXZudsool3T5J/179sxVlHJ4kGPrP2COBX'. + '/7DmiApWCjxIMXpYNznYuXM+6TAKWUMppOZzLvv//ery5cuDCT'. + 'SqVS336bCwr1JfAPB9r+2KAFwJS+OcETzZHz/7v3etl6ipz77X'. + 'GAMh6PG+l0OjM3NzczOzs3k0pNnFlbW43+e/GKtMqrblSsF03V'. + 'WHcJA0PjIAzvg9JTze2H67g9DjAwOTmZ+uCDD96anZ2dnZiYmF'. + '5dW41++Lvfa1fnr7qllVK9103mXNTnJgPA+YugsvB3HTaEl+Qs'. + 'AZ/yeHPPDCiTyaRx5syZbGoilV1dW00szC9oV+avusuLy0Xd0X'. + 'MgFkDM+zkYBZEHV8f7wwKu84zmngQoNU0LaZoWUa4K31y5qX/8'. + '4cfyyvwVN5/L10NOKNeg8UmDxoKF5Vfj1xXAgD0JrgAcvBDfel'. + 'a4g4AykUgY6XR6emJiIru2ttZXq9S0K19eUcuLy8WQE8o5OAsN'. + 'Ggsmpl+NpoL1g9X4UBU+C9xDgEKIwNTUVOqdd955M9mbnJ3/cj'. + '6Vu5aTheXCQXNdVeMzAwJSCGEA2XKpnF1cXIzlFnOVhJPIKdR+'. + 'c88ctq4AlVKsrKzw0UcfKcC5uXqzXnNqSzb2pwLxOHP/l7Z/BN'. + 'eB01LKt4HTrusKvGr8jB+hGn8MQAkYQMrfw4Nq/MFPtf+rdvDb'. + 'k8QL+/5Z4Uepxm7bfwHuTAVUWpWaqAAAAABJRU5ErkJggg==' ; + +//========================================================== +// File: ppl_green.png +//========================================================== + $this->imgdata_large[4][0]= 2854 ; + $this->imgdata_large[4][1]= + 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMLFQ4hANhluwAACrNJREFUeJytmF1zE1eagJ+3u9'. + 'XdkvUty2AbmLEtEzDBgZ0UpDBOalNTUzU3czl7tct/2n+wt3M/'. + 'NVM12SSTQQSyW2TA+QAJQogtYYFtyfrqL3WfvWj5g8AEjzfvhS'. + 'SXjk8//Zz3Pf3qCMcJAWxMKlT4kH+jwu/FknnJSUItKFHzCrKA'. + 'BggBQx5ziz/wn/yBz3hED4/oaJfSjgVoYjJJgTLTZCjohp7IGT'. + 'k5aZ4kb+bRTR30Q7djj8f/kpPMUSCFedRL6W8e8qMQNE6S4xpv'. + 'c5HrTPFubiJ3ZnlyOXV59rJYU5Z00h1c3d0brxAiUkScRijisk'. + '6XLTyiN3s8HuAJpniXa/q8/pt8Or+0kF8oXJm5YiydWcIpOrJu'. + 'rjOQwd54AQwsMpTJYhPSoYuLQ58An/DnBQSdImXO8avsTPbqpc'. + 'lLp67OXDVzMznZLGxSs2qyIRu4at8gKHQEC50kE1icxqCAdxST'. + 'xjEA44tqaJlERl8uLWvvnX5PHuQfcCdxh5qq0aX76vj4WgWyXO'. + 'QiNgBP8IAaddr08X8+wHFmJSQhBbPAZGoSZSt5wQs6qoNC7UEd'. + '4AEoLIQSCaCCy78Dv8Tiv1hjjW1CRj8XIAgEKqDtt9keboMJZa'. + 'vMjuzQVd3Xr9prTJo+GF/jKZea95R25Lxs8jg5qFGiwDnOS0mW'. + 'NE0rjNRIt3WbklUCA9mV3Zdz8OBT/JfCQLB0SKYVVjGFYSfx/E'. + '26ow4e6uDujlPFQpE0FU6P8qNTHdXJdEdda0qf0itWBVM3pa/3'. + 'ccUlIECJet0cAJoeYk5EZCeS5IwEoerSxccJBwRqFFf38QCTaO'. + 'TRVFKJm3NTbtLNSyh2IkhIXsvLCesEGNCWdmwyruSD/z9kUlRc'. + '3bqNlSxhJNJ43p5JITrOEis8Qtr0cXEpU/JT/pmO18n2vb42pU'. + '3JnDnHMBqyPlpnoAaxhr2llv1ZUBqEGlqYwDQMsskMOcMgVL3Y'. + 'ZOQTHAcQQiIGjHCwCaiovjrv4hbcpKuJJjIcDHm685RGr4GLCx'. + 'YHkAcrLoAoDSLBiAQrMkjqybHJCbxgh+7xAC1MpsgzwRwD3qHL'. + 'WyTIBdlAa6u2rHfXaew06PV78ZZjAwleNnkolECoH5i090wOcY'. + '+TgwYzFHiPi1zkOkXexeAMASnVU+LiyiA1wFUuaqggACLizeWw'. + 'ycMzyssmVYKkbpGyC5T+OUALk2mKLHKWf+ED/az+YW42d66YL+'. + 'aNrmEEzQCFEnKw368EgEvcN1m80eTIQIt0TFOjMJHkzNEBBYPp'. + 'sblf8QHzrORO5JaWZ5ZLl6cuJyyxpNPv4PZdoT+GyIxBfI5uUg'. + 'eJMCwP2/bIHO1JEudcgUUWOceKNq99mCvnzs5PzRcuTV4y5mRO'. + 'SMIjo47z5S7a94oQCNKgJsZwO7D/IDNg3/LLhRNXt4JohBb4aG'. + '82GLdXcf93mQ+Y43r2RHZp+cRy6cqJK4l8MS+tdItaqiYtc0Mm'. + 'QpfJARh98HYh9IiXVcaAo58wGb+LBAjbSPgCOcoSa0wzxXtc08'. + '/pv8mfyL+9MLVQvDJ1JVHJV6SZbFI1qtTsB+KlehRtRTGE8Afo'. + 'P4DRcAxiEudhAHjjzz+ubgX4oHowakHQOlqzICQwyVPITGVOXi'. + 'xfLF6aumzmczl5lHzMff2+fCdPaGttEkXoLQAO9B7C6EugPYby'. + 'gVPjGXc5eIbNAJPjGwiAbaAJUQv8wVG7GROkJFpyOqn/ovgLba'. + '44L0+sDaraXb6jzq7aBQWjBOyUoHcaopOgmaA3IRyNDZnA1HjO'. + 'HSBkr7eEFDAEngHrQCf+/s2A8cSiSkqcKUeeTjwFy2Jd78t3+L'. + 'TR4itIiBLwLQhzkJyB5Cx4HXDaENVQCBAQcRqFIHTRaBIvuYXg'. + 'AdsouuNxEL0ZUBHnSQp66R73zYfUtQ6OytKT8RckQAJQoLtgO5'. + 'BJgj0D/WfgdyHaAHx8THoUcbGx8ciwhUl3bDEiToURPooeI7pH'. + 'MziK9Yd9nU5a6GgKjOH41vsgI4hAcyC5AZkapF+AoYNrjjsuhx'. + 'FbtPmeB5ykyQQzTPAWAQWC8S9oAI0QRRuPb9jkmyMZNAOTklvC'. + 'GGYZaFkGmkVAh8h4DtKFMIBunG+pB5B5AIkGBDsQ+qBiL20caj'. + 'zhJknq5KlgMkLjJHJos4kYEbFJi5vc5eYbATVN02bNWe19+32t'. + 'aJWlFm3wbf8Rz5NbDFJdlOFBF/g7cBf0JkrbBb+F6j1DOduEkU'. + '8bWCOiSofPWadBnSZDWmgUkEMGhZCINut8S/0NBtPptFlZrBSu'. + 'vnt1+ndnflfIp9OJ/279Ubbbd+lP7KBKPoEBsgnqLph/BRzwdS'. + 'LnBUFvHcfdpRsGPAGqwMco6jynz+e0SPKYCHMfLX5VKHwcenR+'. + 'Igd1XTcqlUr+xn/cePv91fevzy8sLO2OtrOpWkqL7gXKSAVRdh'. + 'ZFEmEXoYkwBNqovoc/3GHH3aUR+jwC1oD/AWrANi4hGwyBzqEG'. + 'Vvb77Dgi0eT1VZzJZMxKpVJYXV1dXF1dXVm6sPSvruue3Xzcyj'. + '6/syvDzwj0lNazK6Fj5LFCRZouZpBABj6jXouu3+Np6HNvDHaf'. + 'g91t74msbMuOJicnSSaTKKUQEUQEpRSO69But1/dB0VEm5uby9'. + 'y4cWNpdXX1+sLCworrume//PuXpeqnVeOban0U1PW2kcx+O9L7'. + 'Te9sUB4lWFR9SqNtNGcHx+/RDD2+Am4D94CnQA8OjjlEhMnyJC'. + 'srK8zOzu7BiYioMAzZ2Njg9u3brwIqpSSXy2WXl5eXLly4sOo4'. + 'zoV6vV6oflrVP/7Tx8Hmw1Zb6ydqmpWp7ha8h4O3gjOhzVANmF'. + 'XPMNQWvdDnCXCXuHR+APqH4fbCtm2mp6eZn59H13WJuYXRaKSU'. + 'UiSTyVcBdV3XDcOwRaTU7/en19bWCn/79G+JL/76RbhZ22y7u+'. + '6ahl71nPDz/nO17m7wAxlabFOihy4+DvAcqAMbPzZ3OFzX5dmz'. + 'Z2iahoiosUUVhiGNRgPHcV4GzGQy5uLiYuH8+fMzo9FoslarJW'. + '9+elP75E+fBJu1zY7qqpqBUW3T/niohnVvy+1zm5aVtp+WE2XT'. + 'nrHFzbjh1tYLz3XdPjD4R3BKKba2tqhWq4dzUO3noBPn4H5PKy'. + 'LaO++8U7hx48byhQsXVne7u6tf3/v64t3P7mbq9+odt+OuaWi3'. + 'PLxbW2ytubjbQCgiMnt6VlaurWgz0zM0m02q1WrUaDSUUuqI56'. + 'ivDxE5MCgiYllWtlwuL5mmufLV/a/O/uXPf9Ff1F+80Lv6Yx29'. + '2qHzyZBh3cdvc7gaTZuZkzPh/Py8ACqVSv1/uPZDKXUAGEWRtF'. + 'qtxEcffZTL5XLF+2v39fqjeivshA/TpP83JLwzYFBzcA4370Cc'. + 'S81nTRBUs9lkOByi1GuOPI4Rh3+26JZlnSkWi781DOPXvV4v3+'. + '/2G0R8kSBxB/jew+tERK+c49m2TblcxrZtXNfl+fPneJ6HZVmU'. + 'y2VJJpNyaJ9TSinlOA5bW1u4rntkQA0oAG8D54gb9W3ianxM3A'. + 'e/cn73U3Hq1Cm5du2aPjs7a+ztcSIShmE4ajQa6tatWzQajZ+0'. + 'fbiKI+It4SvijVUj7kL2qvGfgkskEqTTaZmcnDROnTplJhIJTU'. + 'QiwPd9P/Q8T6XTaQzDIAiCfzjP/wFVfszuFqdHXgAAAABJRU5E'. + 'rkJggg==' ; + + +//========================================================== +// File: pp_red.png +//========================================================== + $this->imgdata_small[0][0]= 384 ; + $this->imgdata_small[0][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. + 'B3RJTUUH0wMJFhouFobZrQAAAQ1JREFUeJyV1dFtwyAQBuD/og'. + 'xQdYxa8gRY6hJ0jK6QdohMkTEuE5wUj5ERen05IoLvID7Jkn2G'. + 'j8MgTMyMXqRlUQBYq9ydmaL2h1cwqD7l30t+L1iwlbYFRegY7I'. + 'SHjkEifGg4ww3aBa/l4+9AhxWWr/dLhEunXUGHq6yGniw3QkOw'. + '3jJ7UBd82n/VVAlAtvsfp98lAj2sAJOhU4AeQ7DC1ubVBODWDJ'. + 'TtCsEWa6u5M1NeFs1NzgdtuhHGtj+9Q2IDppQUAL6Cyrlz0gDN'. + 'ohSMiJCt861672EiAhEhESG3woJ9V9OKTkwRKbdqz4cHmFLSFg'. + 's69+LvAZKdeZ/n89uLnd2g0S+gjd5g8zzjH5Y/eLLi+NPEAAAA'. + 'AElFTkSuQmCC' ; + +//========================================================== +// File: pp_orange.png +//========================================================== + $this->imgdata_small[1][0]= 403 ; + $this->imgdata_small[1][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. + 'B3RJTUUH0wMJFhwAnApz5AAAASBJREFUeJyN1dFthDAMBuDf7S'. + '3BCm2VCRKpS4QxbhikW6IewzcBqm6Fm6JyH7iEEByCn5AJH38g'. + 'BBIRHNUzBAWAGNfe/SrUGv92CtNt309BrfFdMGPjvt9CD8Fyml'. + 'ZZaDchRgA/59FDMD18pvNoNyHxMnUmgLmPHoJ+CqqfMaNAH22C'. + 'fgqKRwR+GRpxGjXBEiuXDBWQhTK3plxijyWWvtKVS5KNG1xM8I'. + 'OBr7geV1WupDqpmTAPKjCqLhxk/z0PImQmjKrAuI6vMXlhFroD'. + 'vfdqITXWqg2YMSJEAFcReoag6UXU2DzPG8w5t09YYsAyLWvHrL'. + 'HUy6D3XmvMAAhAay8kAJpBosX4vt0G4+4Jam6s6Rz1fgFG0ncA'. + 'f3XfOQcA+Acv5IUSdQw9hgAAAABJRU5ErkJggg==' ; + +//========================================================== +// File: pp_pink.png +//========================================================== + $this->imgdata_small[2][0]= 419 ; + $this->imgdata_small[2][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. + 'B3RJTUUH0wMJFhsQzvz1RwAAATBJREFUeJyd1MFthDAQheF/oi'. + 'gF+JYWQKICkCJRA1vGtrDbxFbhGvY0HVjCLeS2BeTiHFgTB2wg'. + 'eRISstCnmcG2qCpbuXf3ADBQzWsPfZfS9y9HsEu4/Fo33Wf4Fx'. + 'gxL3a1XkI3wbTNXHLoboVeLFUYDqObYBy+Fw/Uh9DdCmtOwIjF'. + 'YvG76CZoOhNGRmpO8zz30CJoOhMAqlDxFzQLppgXj2XaNlP7FF'. + 'GLL7ccMYCBgZERgCvXLBrfi2DEclmiKZwFY4tp6sW26bVfnede'. + 'e5Hc5dC2bUgrXGKqWrwcXnNYDjmCrcCIiQgDcFYV05kQ8SXmnB'. + 'NgPiVN06wrTDGAhz5EWY/FOccTk+cTnHM/YNu2YYllgFxCWuUM'. + 'ikzGx+2Gc+4N+CoJW8n+5a2UKm2aBoBvGA6L7wfl8aoAAAAASU'. + 'VORK5CYII=' ; + + +//========================================================== +// File: pp_blue.png +//========================================================== + $this->imgdata_small[3][0]= 883 ; + $this->imgdata_small[3][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAACi1'. + 'BMVEX///8AAAAAADMAAGYAAJkAAMwAAP8zAAAzADMzAGYzAJkz'. + 'AMwzAP9mAABmADNmAGZmAJlmAMxmAP+ZAACZADOZAGaZAJmZAM'. + 'yZAP/MAADMADPMAGbMAJnMAMzMAP//AAD/ADP/AGb/AJn/AMz/'. + 'AP8AMwAAMzMAM2YAM5kAM8wAM/8zMwAzMzMzM2YzM5kzM8wzM/'. + '9mMwBmMzNmM2ZmM5lmM8xmM/+ZMwCZMzOZM2aZM5mZM8yZM//M'. + 'MwDMMzPMM2bMM5nMM8zMM///MwD/MzP/M2b/M5n/M8z/M/8AZg'. + 'AAZjMAZmYAZpkAZswAZv8zZgAzZjMzZmYzZpkzZswzZv9mZgBm'. + 'ZjNmZmZmZplmZsxmZv+ZZgCZZjOZZmaZZpmZZsyZZv/MZgDMZj'. + 'PMZmbMZpnMZszMZv//ZgD/ZjP/Zmb/Zpn/Zsz/Zv8AmQAAmTMA'. + 'mWYAmZkAmcwAmf8zmQAzmTMzmWYzmZkzmcwzmf9mmQBmmTNmmW'. + 'ZmmZlmmcxmmf+ZmQCZmTOZmWaZmZmZmcyZmf/MmQDMmTPMmWbM'. + 'mZnMmczMmf//mQD/mTP/mWb/mZn/mcz/mf8AzAAAzDMAzGYAzJ'. + 'kAzMwAzP8zzAAzzDMzzGYzzJkzzMwzzP9mzABmzDNmzGZmzJlm'. + 'zMxmzP+ZzACZzDOZzGaZzJmZzMyZzP/MzADMzDPMzGbMzJnMzM'. + 'zMzP//zAD/zDP/zGb/zJn/zMz/zP8A/wAA/zMA/2YA/5kA/8wA'. + '//8z/wAz/zMz/2Yz/5kz/8wz//9m/wBm/zNm/2Zm/5lm/8xm//'. + '+Z/wCZ/zOZ/2aZ/5mZ/8yZ///M/wDM/zPM/2bM/5nM/8zM////'. + '/wD//zP//2b//5n//8z///9jJVUgAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. + 'RQfTAwkWGTNerea3AAAAYUlEQVR4nHXNwQ3AIAxDUUfyoROxRZ'. + 'icARin0EBTIP3Hp1gBRqSqYo0seqjZpnngojlWBir5+b8o06lM'. + 'ha5uFKEpDZulV8l52axhVzqaCdxQp32qVSSwC1wN3fYiw7b76w'. + 'bN4SMue4/KbwAAAABJRU5ErkJggg==' ; + +//========================================================== +// File: pp_green.png +//========================================================== + $this->imgdata_small[4][0]= 447 ; + $this->imgdata_small[4][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. + 'B3RJTUUH0wMJFhkLdq9eKQAAAUxJREFUeJyN1LFVwzAQxvH/8f'. + 'IeDS0FLKABlN6eIwPYAzCHB0gWYI2jj+i1ABUTQN4TRSQ7iiWZ'. + 'qxLn9Mt9ydmiqrSq930AYFiu6YdKrf/hP1gYQn6960PxwBaYMG'. + 'E9UA3dBFtVQjdBOQmBakLennK0CapRwbZRZ3N0O/IeEsqp3HKL'. + 'Smtt5pUZgTPg4gdDud+6xoS97wM2rsxxmRSoTgoVcMZsXJkBho'. + 'SmKqCuOuEtls6nmGMFPTUmxBKx/MeyNfQGLoOOiC2ddsxb1Kzv'. + 'ZzUqu5IXbGDvBJf+hDisi77qFSuhq7Xpuu66TyJLRGbsXVUPxV'. + 'SxsgkzDMt0mKT3/RcjL8C5hHnvJToXY0xYRZ4xnVKsV/S+a8YA'. + 'AvCb3s9g13UhYj+TTo93B3fApRV1FVlEAD6H42DjN9/WvzDYuJ'. + 'dL5b1/ji+/IX8EGWP4AwRii8PdFHTqAAAAAElFTkSuQmCC' ; + } +} + +?> \ No newline at end of file diff --git a/html/includes/jpgraph/src/imgdata_squares.inc.php b/html/includes/jpgraph/src/imgdata_squares.inc.php new file mode 100644 index 0000000000..dfc26bffc7 --- /dev/null +++ b/html/includes/jpgraph/src/imgdata_squares.inc.php @@ -0,0 +1,150 @@ +'imgdata'); + + var $colors = array('bluegreen','blue','green', + 'lightblue','orange','purple','red','yellow'); + var $index = array('bluegreen' =>2,'blue'=>5,'green'=>6, + 'lightblue'=>0,'orange'=>7,'purple'=>4,'red'=>3,'yellow'=>1); + var $maxidx = 7 ; + var $imgdata ; + + function ImgData_Squares () { +//========================================================== +//sq_lblue.png +//========================================================== + $this->imgdata[0][0]= 362 ; + $this->imgdata[0][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMLFgojiPx/ygAAAPdJREFUeNpj/P377+kzHx89/c'. + 'VAHNBQ5VBX52HavPWWjg6nnDQbkXoUFTnnL7zD9PPXrz17HxCj'. + 'E6Jn6fL7H7/+ZWJgYCBGJ7IeBgYGJogofp1oehDa8OjE1IOiDa'. + 'tOrHoYGBhY0NwD0enirMDAwMDFxYRVD7ptyDrNTAU0NXix6sGu'. + 'jYGBgZOT9e/f/0xMjFyczFgVsGAKCfBza2kKzpl3hIuT1c9Xb/'. + 'PW58/foKchJqx6tmy98vbjj8cvPm/afMnXW1JShA2fNmQ9EBFc'. + 'Opnw6MGjkwm/Hlw6mQjqwaqTiRg9mDoZv//4M2/+UYJ64EBWgj'. + 'cm2hwA8l24oNDl+DMAAAAASUVORK5CYII=' ; + +//========================================================== +//sq_yellow.png +//========================================================== + $this->imgdata[1][0]= 338 ; + $this->imgdata[1][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAWl'. + 'BMVEX////+/+H+/9/9/9v8/8P8/8H8/7v8/7n6/4P5/335/3n5'. + '/3X4/1f4/1P3/031/w30/wn0/wPt+ADp9ADm8ADk7gDc5gDa5A'. + 'DL1ADFzgCwuACqsgClrABzeAC9M0MzAAAAAWJLR0QAiAUdSAAA'. + 'AAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEDlOgDj'. + 'EAAAB+SURBVHjaVcpbCsQgDEDRGERGKopjDa2a/W9zfLWj9/Nw'. + 'Ac21ZRBOtZlRN9ApzSYFaDUj79KIorRDbJNO9bN/GUSh2ZRJFJ'. + 'S18iorURBiyksO8buT0zkfYaUqzI91ckfhWhoGXTLzsDjI68Sz'. + 'pGMjrzPzauA/iXk1AtykmvgBC8UcWUdc9HkAAAAASUVORK5CYI'. + 'I=' ; + +//========================================================== +//sq_blgr.png +//========================================================== + $this->imgdata[2][0]= 347 ; + $this->imgdata[2][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAZl'. + 'BMVEX////0+vv0+vrz+fry+frv+Png7e/d7e/a6+zY6+250tSz'. + '0tSyztCtztGM0NWIz9SDzdNfsLVcrrRZrbJOp61MpqtIr7dHn6'. + 'RErrZArLQ6q7M2g4kygYcsp68npa4ctr8QZ20JnqepKsl4AAAA'. + 'AWJLR0QAiAUdSAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU'. + '1FB9MDCxYEByp8tpUAAAB7SURBVHjaVcjRFoIgDADQWZpWJpjY'. + 'MsnG//9kzIFn3McLzfArDA3MndFjrhvgfDHFBEB9pt0CVzwrY3'. + 'n2yicjhY4vTSp0nbXtN+hCV53SHDWe61dZY+/9463r2XuifHAM'. + '0SoH+6xEcovUlCfefeFSIwfTTQ3fB+pi4lV/bTIgvmaA7a0AAA'. + 'AASUVORK5CYII=' ; + +//========================================================== +//sq_red.png +//========================================================== + $this->imgdata[3][0]= 324 ; + $this->imgdata[3][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAXV'. + 'BMVEX////++Pn99/j99ff99fb98/X98/T98PL55uj43+P24+bw'. + 'kKPvjaHviJ3teJHpxMnoL2Pjs73WW3rWNljVWXnUVnbUK1DTJk'. + '3SUHPOBz/KQmmxPVmuOFasNFOeIkWVka/fAAAAAWJLR0QAiAUd'. + 'SAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEHd'. + 'ceT+8AAABtSURBVHjaVchbAkMwEAXQq6i3VrQiQfa/zDYTw8z5'. + 'PCjGt9JVWFt1XWPh1fWNdfDy+tq6WPfRUPENNKnSnXNWPB4uv2'. + 'b54nSZ8jHrMtOxvWZZZtpD4KP6xLkO9/AhzhaCOMhJh68cOjzV'. + '/K/4Ac2cG+nBcaRuAAAAAElFTkSuQmCC' ; + +//========================================================== +//sq_pink.png +//========================================================== + $this->imgdata[4][0]= 445 ; + $this->imgdata[4][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAApV'. + 'BMVEX////6+Pz69/v49Pr38/r17/jr4+/l3Onj2efh1ua/L+i+'. + 'q8m+Lue9Lua8qsS8LuW8LeS7pca5LOG4LN+2Y9O2YNW1ZdO1Kt'. + 'y0atC0aNGzb82zbc6zKtuzKdqycsuwa8qtJtOISZ2GRpuFN6GE'. + 'NqCDQpmCMZ+BPpd/LJ1/K519S5B9Jpx9Jpt9JZt6RY11BJZ1BJ'. + 'V0BJV0BJRzBJNvNoRtIoJUEmdZ/XbrAAAAAWJLR0QAiAUdSAAA'. + 'AAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYDF3iKMD'. + 'YAAACeSURBVHjaVczbEoIgGARgCiMtrexoWpaa2FHUgvd/tH4Y'. + 'BnEvv9ldhNPradPnnGBUTtPDzMRPSIF46SaBoR25dYjz3I20Lb'. + 'ek6BgQz73Il7KKpSgCO0pTHU0886J1sCe0ZYbALjGhjFnEM2es'. + 'VhZVI4d+B1QtfnV47ywCEaKeP/p7JdLejSYt0j6NIiOq1wJZIs'. + 'QTDA0ELHwhPBCwyR/Cni9cOmzJtwAAAABJRU5ErkJggg==' ; + +//========================================================== +//sq_blue.png +//========================================================== + $this->imgdata[5][0]= 283 ; + $this->imgdata[5][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAQl'. + 'BMVEX////4+fz39/z19vvy8vru7/ni4+7g4fHW1ue8vteXmt6B'. + 'hdhiZ7FQVaZETcxCSJo1Oq4zNoMjKakhJHcKFaMEC2jRVYdWAA'. + 'AAAWJLR0QAiAUdSAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0'. + 'SU1FB9MDCxYDN0PkEP4AAABfSURBVHjaVchHAoAgDATAVcCCIF'. + 'j4/1elJEjmOFDHKVgDv4iz640gLs+LMF6ZUv/VqcXXplU7Gqpy'. + 'PFzBT5qml9NzlOX259riWHlS4kOffviHD8PQYZx2EFMPRkw+9Q'. + 'FSnRPeWEDzKAAAAABJRU5ErkJggg==' ; + +//========================================================== +//sq_green.png +//========================================================== + $this->imgdata[6][0]= 325 ; + $this->imgdata[6][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAXV'. + 'BMVEX////2+vX1+vX1+fT0+fPz+PPx9/Dv9u7u9e3h7uHe697a'. + '6dnO2s3I1sa10LOvza2ay5aEwYBWlE9TqE5Tkk1RkEpMrUJMg0'. + 'hKiUNGpEFBojw8oTcsbScaYBMWlwmMT0NtAAAAAWJLR0QAiAUd'. + 'SAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEFd'. + 'nFx90AAABuSURBVHjaVc9HAoAgDADB2HuJWLDx/2cKBITscW4L'. + '5byzMIWtZobNDZIZtrcCGZsRQ8GwvRSRNxIiMuysODKG3alikl'. + 'ueOPlpKTLBaRmOZxQxaXlfb5ZWI9om4WntrXiDSJzp7SBkwMQa'. + 'FEy0VR/NAB2kNuj7rgAAAABJRU5ErkJggg==' ; + +//========================================================== +//sq_orange.png +//========================================================== + $this->imgdata[7][0]= 321 ; + $this->imgdata[7][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAUV'. + 'BMVEX/////8+n/8uf/8OP/59H/5Mv/zqH/zJ3/ypv/yJf/vYH/'. + 'u33/uXn/n0n/nUX/m0H/lzn/ljf/lDP/kS3/kCv/iR//hxv/fg'. + 'n/fAX/eQDYZgDW6ia5AAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAL'. + 'EgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEJIgbx+cAAAB2SURBVH'. + 'jaVczRCoQwDETRbLAWLZSGUA35/w/dVI0283i4DODew3YESmWW'. + 'kg5gWkoQAe6TleUQI/66Sy7i56+kLk7cht2N0+hcnJgQu0SqiC'. + '1SzSIbzWSi6gavqJ63wSduRi2f+kwyD5rEukwCdZ1kGAMGMfv9'. + 'AbWuGMOr5COSAAAAAElFTkSuQmCC' ; + } +} + +?> \ No newline at end of file diff --git a/html/includes/jpgraph/src/imgdata_stars.inc.php b/html/includes/jpgraph/src/imgdata_stars.inc.php new file mode 100644 index 0000000000..bd3272a71a --- /dev/null +++ b/html/includes/jpgraph/src/imgdata_stars.inc.php @@ -0,0 +1,144 @@ + 'imgdata'); + + var $colors = array('bluegreen','lightblue','purple','blue','green','pink','red','yellow'); + var $index = array('bluegreen'=>3,'lightblue'=>4,'purple'=>1, + 'blue'=>5,'green'=>0,'pink'=>7,'red'=>2,'yellow'=>6); + var $maxidx = 7 ; + var $imgdata ; + + function ImgData_Stars() { +//========================================================== +// File: bstar_green_001.png +//========================================================== + $this->imgdata[0][0]= 329 ; + $this->imgdata[0][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAAUV'. + 'BMVEX///////+/v7+83rqcyY2Q/4R7/15y/1tp/05p/0lg/zdX'. + '/zdX/zVV/zdO/zFJ9TFJvDFD4yg+8Bw+3iU68hwurhYotxYosx'. + 'YokBoTfwANgQFUp7DWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'. + 'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJj'. + 'CRyxgTAAAAcUlEQVR4nH3MSw6AIAwEUBL/IKBWwXL/g0pLojUS'. + 'ZzGLl8ko9Zumhr5iy66/GH0dp49llNPB5sTotDY5PVuLG6tnM9'. + 'CVKSIe1joSgPsAKSuANNaENFQvTAGzmheSkUpMBWeJZwqBT8wo'. + 'hmysD4bnnPsC/x8ItUdGPfAAAAAASUVORK5CYII=' ; +//========================================================== +// File: bstar_blred.png +//========================================================== + $this->imgdata[1][0]= 325 ; + $this->imgdata[1][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v79uRJ6jWPOSUtKrb+ejWO+gWPaGTruJTr6rZvF2'. + 'RqC2ocqdVuCeV+egV/GsnLuIXL66rMSpcOyATbipY/OdWOp+VK'. + 'aTU9WhV+yJKBoLAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJwynv1'. + 'XVAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + +//========================================================== +// File: bstar_red_001.png +//========================================================== + $this->imgdata[2][0]= 325 ; + $this->imgdata[2][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v7+eRFHzWG3SUmHnb37vWGr2WHG7Tlm+TljxZneg'. + 'Rk3KoaXgVmXnV2nxV227nJ++XGzErK3scIS4TVzzY3fqWG2mVF'. + 'zVU2PsV2rJFw9VAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJzCI0C'. + 'lSAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + +//========================================================== +// File: bstar_blgr_001.png +//========================================================== + $this->imgdata[3][0]= 325 ; + $this->imgdata[3][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v79Ehp5Yx/NSq9Jvw+dYwu9YzfZOmbtOmb5myPFG'. + 'gqChvcpWteBXvedXxvGcsbtcpb6su8RwzOxNmrhjyvNYwupUjK'. + 'ZTr9VXwOyJhmWNAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJTC65k'. + 'vQAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + +//========================================================== +// File: bstar_blgr_002.png +//========================================================== + $this->imgdata[4][0]= 325 ; + $this->imgdata[4][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v79EnpxY8/FS0dJv5+dY7+9Y9vBOubtOur5m8fFG'. + 'nKChycpW3uBX5+ZX8e2curtcvrqswsRw7OdNuLZj8/BY6udUpK'. + 'ZT1dRX7OtNkrW5AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJgXHeN'. + 'wwAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + +//========================================================== +// File: bstar_blue_001.png +//========================================================== + $this->imgdata[5][0]= 325 ; + $this->imgdata[5][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v79EY55Yi/NSetJvledYiO9YkPZOb7tObr5mkvFG'. + 'X6ChrcpWgOBXhedXi/Gcpbtcf76sssRwnOxNcbhjk/NYiepUbK'. + 'ZTfdVXh+ynNEzzAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJhStyP'. + 'zCAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + +//========================================================== +// File: bstar_oy_007.png +//========================================================== + $this->imgdata[6][0]= 325 ; + $this->imgdata[6][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v7+ejUTz11jSvVLn02/v1lj21li7q06+r07x2mag'. + 'lUbKxKHgy1bnz1fx1Ve7t5y+qlzEwqzs03C4pE3z2WPqz1imml'. + 'TVv1Ps01dGRjeyAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJjsGGc'. + 'GbAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + +//========================================================== +// File: bstar_lred.png +//========================================================== + $this->imgdata[7][0]= 325 ; + $this->imgdata[7][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v7+eRJPzWN3SUr7nb9TvWNj2WOS7Tqi+TqnxZtyg'. + 'Ro/KocPgVsjnV9LxV927nLa+XLTErL7scN24TarzY9/qWNemVJ'. + 'jVU8LsV9VCwcc9AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJxi9ZY'. + 'GoAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + } +} + +?> \ No newline at end of file diff --git a/html/includes/jpgraph/src/jpg-config.inc.php b/html/includes/jpgraph/src/jpg-config.inc.php new file mode 100644 index 0000000000..7936f2a1f8 --- /dev/null +++ b/html/includes/jpgraph/src/jpg-config.inc.php @@ -0,0 +1,216 @@ + diff --git a/html/includes/jpgraph/src/jpgraph.php b/html/includes/jpgraph/src/jpgraph.php new file mode 100644 index 0000000000..0da5cb5aae --- /dev/null +++ b/html/includes/jpgraph/src/jpgraph.php @@ -0,0 +1,5950 @@ +Get(11,$file,$lineno); + die($msg); + } + else { + DEFINE('CACHE_DIR', $_SERVER['TEMP'] . '/'); + } + } else { + DEFINE('CACHE_DIR','/tmp/jpgraph_cache/'); + } + } +} +elseif( !defined('CACHE_DIR') ) { + DEFINE('CACHE_DIR', ''); +} + +if (!defined('TTF_DIR')) { + if (strstr( PHP_OS, 'WIN') ) { + $sroot = getenv('SystemRoot'); + if( empty($sroot) ) { + $t = new ErrMsgText(); + $msg = $t->Get(12,$file,$lineno); + die($msg); + } + else { + DEFINE('TTF_DIR', $sroot.'/fonts/'); + } + } else { + DEFINE('TTF_DIR','/usr/X11R6/lib/X11/fonts/truetype/'); + } +} + +if (!defined('MBTTF_DIR')) { + if (strstr( PHP_OS, 'WIN') ) { + $sroot = getenv('SystemRoot'); + if( empty($sroot) ) { + $t = new ErrMsgText(); + $msg = $t->Get(12,$file,$lineno); + die($msg); + } + else { + DEFINE('TTF_DIR', $sroot.'/fonts/'); + } + } else { + DEFINE('MBTTF_DIR','/usr/share/fonts/ja/TrueType/'); + } +} + +//------------------------------------------------------------------ +// Constants which are used as parameters for the method calls +//------------------------------------------------------------------ + +// Tick density +DEFINE("TICKD_DENSE",1); +DEFINE("TICKD_NORMAL",2); +DEFINE("TICKD_SPARSE",3); +DEFINE("TICKD_VERYSPARSE",4); + +// Side for ticks and labels. +DEFINE("SIDE_LEFT",-1); +DEFINE("SIDE_RIGHT",1); +DEFINE("SIDE_DOWN",-1); +DEFINE("SIDE_BOTTOM",-1); +DEFINE("SIDE_UP",1); +DEFINE("SIDE_TOP",1); + +// Legend type stacked vertical or horizontal +DEFINE("LEGEND_VERT",0); +DEFINE("LEGEND_HOR",1); + +// Mark types for plot marks +DEFINE("MARK_SQUARE",1); +DEFINE("MARK_UTRIANGLE",2); +DEFINE("MARK_DTRIANGLE",3); +DEFINE("MARK_DIAMOND",4); +DEFINE("MARK_CIRCLE",5); +DEFINE("MARK_FILLEDCIRCLE",6); +DEFINE("MARK_CROSS",7); +DEFINE("MARK_STAR",8); +DEFINE("MARK_X",9); +DEFINE("MARK_LEFTTRIANGLE",10); +DEFINE("MARK_RIGHTTRIANGLE",11); +DEFINE("MARK_FLASH",12); +DEFINE("MARK_IMG",13); +DEFINE("MARK_FLAG1",14); +DEFINE("MARK_FLAG2",15); +DEFINE("MARK_FLAG3",16); +DEFINE("MARK_FLAG4",17); + +// Builtin images +DEFINE("MARK_IMG_PUSHPIN",50); +DEFINE("MARK_IMG_SPUSHPIN",50); +DEFINE("MARK_IMG_LPUSHPIN",51); +DEFINE("MARK_IMG_DIAMOND",52); +DEFINE("MARK_IMG_SQUARE",53); +DEFINE("MARK_IMG_STAR",54); +DEFINE("MARK_IMG_BALL",55); +DEFINE("MARK_IMG_SBALL",55); +DEFINE("MARK_IMG_MBALL",56); +DEFINE("MARK_IMG_LBALL",57); +DEFINE("MARK_IMG_BEVEL",58); + +// Inline defines +DEFINE("INLINE_YES",1); +DEFINE("INLINE_NO",0); + +// Format for background images +DEFINE("BGIMG_FILLPLOT",1); +DEFINE("BGIMG_FILLFRAME",2); +DEFINE("BGIMG_COPY",3); +DEFINE("BGIMG_CENTER",4); + +// Depth of objects +DEFINE("DEPTH_BACK",0); +DEFINE("DEPTH_FRONT",1); + +// Direction +DEFINE("VERTICAL",1); +DEFINE("HORIZONTAL",0); + +// Axis styles for scientific style axis +DEFINE('AXSTYLE_SIMPLE',1); +DEFINE('AXSTYLE_BOXIN',2); +DEFINE('AXSTYLE_BOXOUT',3); +DEFINE('AXSTYLE_YBOXIN',4); +DEFINE('AXSTYLE_YBOXOUT',5); + +// Style for title backgrounds +DEFINE('TITLEBKG_STYLE1',1); +DEFINE('TITLEBKG_STYLE2',2); +DEFINE('TITLEBKG_STYLE3',3); +DEFINE('TITLEBKG_FRAME_NONE',0); +DEFINE('TITLEBKG_FRAME_FULL',1); +DEFINE('TITLEBKG_FRAME_BOTTOM',2); +DEFINE('TITLEBKG_FRAME_BEVEL',3); +DEFINE('TITLEBKG_FILLSTYLE_HSTRIPED',1); +DEFINE('TITLEBKG_FILLSTYLE_VSTRIPED',2); +DEFINE('TITLEBKG_FILLSTYLE_SOLID',3); + +// Style for background gradient fills +DEFINE('BGRAD_FRAME',1); +DEFINE('BGRAD_MARGIN',2); +DEFINE('BGRAD_PLOT',3); + +// Width of tab titles +DEFINE('TABTITLE_WIDTHFIT',0); +DEFINE('TABTITLE_WIDTHFULL',-1); + +// Defines for 3D skew directions +DEFINE('SKEW3D_UP',0); +DEFINE('SKEW3D_DOWN',1); +DEFINE('SKEW3D_LEFT',2); +DEFINE('SKEW3D_RIGHT',3); + +// For internal use only +DEFINE("_JPG_DEBUG",false); +DEFINE("_FORCE_IMGTOFILE",false); +DEFINE("_FORCE_IMGDIR",'/tmp/jpgimg/'); + + +function CheckPHPVersion($aMinVersion) +{ + list($majorC, $minorC, $editC) = split('[/.-]', PHP_VERSION); + list($majorR, $minorR, $editR) = split('[/.-]', $aMinVersion); + + if ($majorC > $majorR) return true; + if ($majorC < $majorR) return false; + // same major - check minor + if ($minorC > $minorR) return true; + if ($minorC < $minorR) return false; + // and same minor + if ($editC >= $editR) return true; + return true; +} + +// +// Make sure PHP version is high enough +// +if( !CheckPHPVersion(MIN_PHPVERSION) ) { + JpGraphError::RaiseL(13,PHP_VERSION,MIN_PHPVERSION); +} + +// +// Routine to determine if GD1 or GD2 is installed +// +function CheckGDVersion() { + if( !function_exists("imagetypes") || !function_exists('imagecreatefromstring') ) + return 0; + $GDfuncList = get_extension_funcs('gd'); + if( !$GDfuncList ) + return 0 ; + else { + if( in_array('imagegd2',$GDfuncList) && + in_array('imagecreatetruecolor',$GDfuncList)) + return 2; + else + return 1; + } +} + +// +// Check what version of the GD library is installed. +// +$gdversion = CheckGDVersion(); +if( $gdversion != 2 ) { + JpGraphError::RaiseL(25002); +//(" Your PHP installation does not seem to have the required GD 2.x library. Please see the PHP documentation on how to install and enable the GD library."); +} + +// +// Setup PHP error handler +// +function _phpErrorHandler($errno,$errmsg,$filename, $linenum, $vars) { + // Respect current error level + if( $errno & error_reporting() ) { + JpGraphError::RaiseL(25003,basename($filename),$linenum,$errmsg); + } +} + +if( INSTALL_PHP_ERR_HANDLER ) { + set_error_handler("_phpErrorHandler"); +} + +// +//Check if there were any warnings, perhaps some wrong includes by the user +// +if( isset($GLOBALS['php_errormsg']) && CATCH_PHPERRMSG && + !preg_match('/|Deprecated|/i', $GLOBALS['php_errormsg'])) { + JpGraphError::RaiseL(25004,$GLOBALS['php_errormsg']); +} + + +// Useful mathematical function +function sign($a) {return $a >= 0 ? 1 : -1;} + +// Utility function to generate an image name based on the filename we +// are running from and assuming we use auto detection of graphic format +// (top level), i.e it is safe to call this function +// from a script that uses JpGraph +function GenImgName() { + global $_SERVER; + + // Determine what format we should use when we save the images + $supported = imagetypes(); + if( $supported & IMG_PNG ) $img_format="png"; + elseif( $supported & IMG_GIF ) $img_format="gif"; + elseif( $supported & IMG_JPG ) $img_format="jpeg"; + elseif( $supported & IMG_WBMP ) $img_format="wbmp"; + elseif( $supported & IMG_XPM ) $img_format="xpm"; + + if( !isset($_SERVER['PHP_SELF']) ) + JpGraphError::RaiseL(25005); +//(" Can't access PHP_SELF, PHP global variable. You can't run PHP from command line if you want to use the 'auto' naming of cache or image files."); + $fname = basename($_SERVER['PHP_SELF']); + if( !empty($_SERVER['QUERY_STRING']) ) { + $q = @$_SERVER['QUERY_STRING']; + $fname .= '_'.preg_replace("/\W/", "_", $q).'.'.$img_format; + } + else { + $fname = substr($fname,0,strlen($fname)-4).'.'.$img_format; + } + return $fname; +} + +//=================================================== +// CLASS JpgTimer +// Description: General timing utility class to handle +// time measurement of generating graphs. Multiple +// timers can be started. +//=================================================== +class JpgTimer { + var $start; + var $idx; +//--------------- +// CONSTRUCTOR + function JpgTimer() { + $this->idx=0; + } + +//--------------- +// PUBLIC METHODS + + // Push a new timer start on stack + function Push() { + list($ms,$s)=explode(" ",microtime()); + $this->start[$this->idx++]=floor($ms*1000) + 1000*$s; + } + + // Pop the latest timer start and return the diff with the + // current time + function Pop() { + assert($this->idx>0); + list($ms,$s)=explode(" ",microtime()); + $etime=floor($ms*1000) + (1000*$s); + $this->idx--; + return $etime-$this->start[$this->idx]; + } +} // Class + +$gJpgBrandTiming = BRAND_TIMING; +//=================================================== +// CLASS DateLocale +// Description: Hold localized text used in dates +//=================================================== +class DateLocale { + + var $iLocale = 'C'; // environmental locale be used by default + + var $iDayAbb = null; + var $iShortDay = null; + var $iShortMonth = null; + var $iMonthName = null; + +//--------------- +// CONSTRUCTOR + function DateLocale() { + settype($this->iDayAbb, 'array'); + settype($this->iShortDay, 'array'); + settype($this->iShortMonth, 'array'); + settype($this->iMonthName, 'array'); + + + $this->Set('C'); + } + +//--------------- +// PUBLIC METHODS + function Set($aLocale) { + if ( in_array($aLocale, array_keys($this->iDayAbb)) ){ + $this->iLocale = $aLocale; + return TRUE; // already cached nothing else to do! + } + + $pLocale = setlocale(LC_TIME, 0); // get current locale for LC_TIME + + if (is_array($aLocale)) { + foreach ($aLocale as $loc) { + $res = @setlocale(LC_TIME, $loc); + if ( $res ) { + $aLocale = $loc; + break; + } + } + } + else { + $res = @setlocale(LC_TIME, $aLocale); + } + if ( ! $res ){ + JpGraphError::RaiseL(25007,$aLocale); +//("You are trying to use the locale ($aLocale) which your PHP installation does not support. Hint: Use '' to indicate the default locale for this geographic region."); + return FALSE; + } + + $this->iLocale = $aLocale; + + for ( $i = 0, $ofs = 0 - strftime('%w'); $i < 7; $i++, $ofs++ ){ + $day = strftime('%a', strtotime("$ofs day")); + $day{0} = strtoupper($day{0}); + $this->iDayAbb[$aLocale][]= $day{0}; + $this->iShortDay[$aLocale][]= $day; + } + + for($i=1; $i<=12; ++$i) { + list($short ,$full) = explode('|', strftime("%b|%B",strtotime("2001-$i-01"))); + $this->iShortMonth[$aLocale][] = ucfirst($short); + $this->iMonthName [$aLocale][] = ucfirst($full); + } + + // Return to original locale + setlocale(LC_TIME, $pLocale); + + return TRUE; + } + + + function GetDayAbb() { + return $this->iDayAbb[$this->iLocale]; + } + + function GetShortDay() { + return $this->iShortDay[$this->iLocale]; + } + + function GetShortMonth() { + return $this->iShortMonth[$this->iLocale]; + } + + function GetShortMonthName($aNbr) { + return $this->iShortMonth[$this->iLocale][$aNbr]; + } + + function GetLongMonthName($aNbr) { + return $this->iMonthName[$this->iLocale][$aNbr]; + } + + function GetMonth() { + return $this->iMonthName[$this->iLocale]; + } +} + +$gDateLocale = new DateLocale(); +$gJpgDateLocale = new DateLocale(); + + +//======================================================= +// CLASS Footer +// Description: Encapsulates the footer line in the Graph +//======================================================= +class Footer { + var $left,$center,$right; + var $iLeftMargin = 3; + var $iRightMargin = 3; + var $iBottomMargin = 3; + + function Footer() { + $this->left = new Text(); + $this->left->ParagraphAlign('left'); + $this->center = new Text(); + $this->center->ParagraphAlign('center'); + $this->right = new Text(); + $this->right->ParagraphAlign('right'); + } + + function Stroke(&$aImg) { + $y = $aImg->height - $this->iBottomMargin; + $x = $this->iLeftMargin; + $this->left->Align('left','bottom'); + $this->left->Stroke($aImg,$x,$y); + + $x = ($aImg->width - $this->iLeftMargin - $this->iRightMargin)/2; + $this->center->Align('center','bottom'); + $this->center->Stroke($aImg,$x,$y); + + $x = $aImg->width - $this->iRightMargin; + $this->right->Align('right','bottom'); + $this->right->Stroke($aImg,$x,$y); + } +} + + +//=================================================== +// CLASS Graph +// Description: Main class to handle graphs +//=================================================== +class Graph { + var $cache=null; // Cache object (singleton) + var $img=null; // Img object (singleton) + var $plots=array(); // Array of all plot object in the graph (for Y 1 axis) + var $y2plots=array();// Array of all plot object in the graph (for Y 2 axis) + var $ynplots=array(); + var $xscale=null; // X Scale object (could be instance of LinearScale or LogScale + var $yscale=null,$y2scale=null, $ynscale=array(); + var $iIcons = array(); // Array of Icons to add to + var $cache_name; // File name to be used for the current graph in the cache directory + var $xgrid=null; // X Grid object (linear or logarithmic) + var $ygrid=null,$y2grid=null; + var $doframe=true,$frame_color=array(0,0,0), $frame_weight=1; // Frame around graph + var $boxed=false, $box_color=array(0,0,0), $box_weight=1; // Box around plot area + var $doshadow=false,$shadow_width=4,$shadow_color=array(102,102,102); // Shadow for graph + var $xaxis=null; // X-axis (instane of Axis class) + var $yaxis=null, $y2axis=null, $ynaxis=array(); // Y axis (instance of Axis class) + var $margin_color=array(200,200,200); // Margin color of graph + var $plotarea_color=array(255,255,255); // Plot area color + var $title,$subtitle,$subsubtitle; // Title and subtitle(s) text object + var $axtype="linlin"; // Type of axis + var $xtick_factor,$ytick_factor; // Factot to determine the maximum number of ticks depending on the plot with + var $texts=null, $y2texts=null; // Text object to ge shown in the graph + var $lines=null, $y2lines=null; + var $bands=null, $y2bands=null; + var $text_scale_off=0, $text_scale_abscenteroff=-1; // Text scale offset in fractions and for centering bars in absolute pixels + var $background_image="",$background_image_type=-1,$background_image_format="png"; + var $inline; + var $showcsim=0,$csimcolor="red"; //debug stuff, draw the csim boundaris on the image if <>0 + var $grid_depth=DEPTH_BACK; // Draw grid under all plots as default + var $iAxisStyle = AXSTYLE_SIMPLE; + var $iCSIMdisplay=false,$iHasStroked = false; + var $footer; + var $csimcachename = '', $csimcachetimeout = 0, $iCSIMImgAlt=''; + var $iDoClipping = false; + var $y2orderback=true; + var $tabtitle; + var $bkg_gradtype=-1,$bkg_gradstyle=BGRAD_MARGIN; + var $bkg_gradfrom='navy', $bkg_gradto='silver'; + var $titlebackground = false; + var $titlebackground_color = 'lightblue', + $titlebackground_style = 1, + $titlebackground_framecolor = 'blue', + $titlebackground_framestyle = 2, + $titlebackground_frameweight = 1, + $titlebackground_bevelheight = 3 ; + var $titlebkg_fillstyle=TITLEBKG_FILLSTYLE_SOLID; + var $titlebkg_scolor1='black',$titlebkg_scolor2='white'; + var $framebevel = false, $framebeveldepth = 2 ; + var $framebevelborder = false, $framebevelbordercolor='black'; + var $framebevelcolor1='white@0.4', $framebevelcolor2='black@0.4'; + var $background_image_mix=100; + var $background_cflag = ''; + var $background_cflag_type = BGIMG_FILLPLOT; + var $background_cflag_mix = 100; + var $iImgTrans=false, + $iImgTransHorizon = 100,$iImgTransSkewDist=150, + $iImgTransDirection = 1, $iImgTransMinSize = true, + $iImgTransFillColor='white',$iImgTransHighQ=false, + $iImgTransBorder=false,$iImgTransHorizonPos=0.5; + var $iYAxisDeltaPos=50; + var $iIconDepth=DEPTH_BACK; + var $iAxisLblBgType = 0, + $iXAxisLblBgFillColor = 'lightgray', $iXAxisLblBgColor = 'black', + $iYAxisLblBgFillColor = 'lightgray', $iYAxisLblBgColor = 'black'; + var $iTables=NULL; + var $legend; + +//--------------- +// CONSTRUCTOR + + // aWIdth Width in pixels of image + // aHeight Height in pixels of image + // aCachedName Name for image file in cache directory + // aTimeOut Timeout in minutes for image in cache + // aInline If true the image is streamed back in the call to Stroke() + // If false the image is just created in the cache + function Graph($aWidth=300,$aHeight=200,$aCachedName="",$aTimeOut=0,$aInline=true) { + GLOBAL $gJpgBrandTiming; + // If timing is used create a new timing object + if( $gJpgBrandTiming ) { + global $tim; + $tim = new JpgTimer(); + $tim->Push(); + } + + if( !is_numeric($aWidth) || !is_numeric($aHeight) ) { + JpGraphError::RaiseL(25008);//('Image width/height argument in Graph::Graph() must be numeric'); + } + + // Automatically generate the image file name based on the name of the script that + // generates the graph + if( $aCachedName=="auto" ) + $aCachedName=GenImgName(); + + // Should the image be streamed back to the browser or only to the cache? + $this->inline=$aInline; + + $this->img = new RotImage($aWidth,$aHeight); + + $this->cache = new ImgStreamCache($this->img); + $this->cache->SetTimeOut($aTimeOut); + + $this->title = new Text(); + $this->title->ParagraphAlign('center'); + $this->title->SetFont(FF_FONT2,FS_BOLD); + $this->title->SetMargin(3); + $this->title->SetAlign('center'); + + $this->subtitle = new Text(); + $this->subtitle->ParagraphAlign('center'); + $this->subtitle->SetMargin(2); + $this->subtitle->SetAlign('center'); + + $this->subsubtitle = new Text(); + $this->subsubtitle->ParagraphAlign('center'); + $this->subsubtitle->SetMargin(2); + $this->subsubtitle->SetAlign('center'); + + $this->legend = new Legend(); + $this->footer = new Footer(); + + // Window doesn't like '?' in the file name so replace it with an '_' + $aCachedName = str_replace("?","_",$aCachedName); + + // If the cached version exist just read it directly from the + // cache, stream it back to browser and exit + if( $aCachedName!="" && READ_CACHE && $aInline ) + if( $this->cache->GetAndStream($aCachedName) ) { + exit(); + } + + $this->cache_name = $aCachedName; + $this->SetTickDensity(); // Normal density + + $this->tabtitle = new GraphTabTitle(); + } +//--------------- +// PUBLIC METHODS + // Enable final image perspective transformation + function Set3DPerspective($aDir=1,$aHorizon=100,$aSkewDist=120,$aQuality=false,$aFillColor='#FFFFFF',$aBorder=false,$aMinSize=true,$aHorizonPos=0.5) { + $this->iImgTrans = true; + $this->iImgTransHorizon = $aHorizon; + $this->iImgTransSkewDist= $aSkewDist; + $this->iImgTransDirection = $aDir; + $this->iImgTransMinSize = $aMinSize; + $this->iImgTransFillColor=$aFillColor; + $this->iImgTransHighQ=$aQuality; + $this->iImgTransBorder=$aBorder; + $this->iImgTransHorizonPos=$aHorizonPos; + } + + // Set Image format and optional quality + function SetImgFormat($aFormat,$aQuality=75) { + $this->img->SetImgFormat($aFormat,$aQuality); + } + + // Should the grid be in front or back of the plot? + function SetGridDepth($aDepth) { + $this->grid_depth=$aDepth; + } + + function SetIconDepth($aDepth) { + $this->iIconDepth=$aDepth; + } + + // Specify graph angle 0-360 degrees. + function SetAngle($aAngle) { + $this->img->SetAngle($aAngle); + } + + function SetAlphaBlending($aFlg=true) { + $this->img->SetAlphaBlending($aFlg); + } + + // Shortcut to image margin + function SetMargin($lm,$rm,$tm,$bm) { + $this->img->SetMargin($lm,$rm,$tm,$bm); + } + + function SetY2OrderBack($aBack=true) { + $this->y2orderback = $aBack; + } + + // Rotate the graph 90 degrees and set the margin + // when we have done a 90 degree rotation + function Set90AndMargin($lm=0,$rm=0,$tm=0,$bm=0) { + $lm = $lm ==0 ? floor(0.2 * $this->img->width) : $lm ; + $rm = $rm ==0 ? floor(0.1 * $this->img->width) : $rm ; + $tm = $tm ==0 ? floor(0.2 * $this->img->height) : $tm ; + $bm = $bm ==0 ? floor(0.1 * $this->img->height) : $bm ; + + $adj = ($this->img->height - $this->img->width)/2; + $this->img->SetMargin($tm-$adj,$bm-$adj,$rm+$adj,$lm+$adj); + $this->img->SetCenter(floor($this->img->width/2),floor($this->img->height/2)); + $this->SetAngle(90); + if( empty($this->yaxis) || empty($this->xaxis) ) { + JpgraphError::RaiseL(25009);//('You must specify what scale to use with a call to Graph::SetScale()'); + } + $this->xaxis->SetLabelAlign('right','center'); + $this->yaxis->SetLabelAlign('center','bottom'); + } + + function SetClipping($aFlg=true) { + $this->iDoClipping = $aFlg ; + } + + // Add a plot object to the graph + function Add(&$aPlot) { + if( $aPlot == null ) + JpGraphError::RaiseL(25010);//("Graph::Add() You tried to add a null plot to the graph."); + if( is_array($aPlot) && count($aPlot) > 0 ) + $cl = $aPlot[0]; + else + $cl = $aPlot; + + if( is_a($cl,'Text') ) + $this->AddText($aPlot); + elseif( is_a($cl,'PlotLine') ) + $this->AddLine($aPlot); + elseif( is_a($cl,'PlotBand') ) + $this->AddBand($aPlot); + elseif( is_a($cl,'IconPlot') ) + $this->AddIcon($aPlot); + elseif( is_a($cl,'GTextTable') ) + $this->AddTable($aPlot); + else + $this->plots[] = &$aPlot; + } + + + function AddTable(&$aTable) { + if( is_array($aTable) ) { + for($i=0; $i < count($aTable); ++$i ) + $this->iTables[]=&$aTable[$i]; + } + else { + $this->iTables[] = &$aTable ; + } + } + + function AddIcon(&$aIcon) { + if( is_array($aIcon) ) { + for($i=0; $i < count($aIcon); ++$i ) + $this->iIcons[]=&$aIcon[$i]; + } + else { + $this->iIcons[] = &$aIcon ; + } + } + + // Add plot to second Y-scale + function AddY2(&$aPlot) { + if( $aPlot == null ) + JpGraphError::RaiseL(25011);//("Graph::AddY2() You tried to add a null plot to the graph."); + + if( is_array($aPlot) && count($aPlot) > 0 ) + $cl = $aPlot[0]; + else + $cl = $aPlot; + + if( is_a($cl,'Text') ) + $this->AddText($aPlot,true); + elseif( is_a($cl,'PlotLine') ) + $this->AddLine($aPlot,true); + elseif( is_a($cl,'PlotBand') ) + $this->AddBand($aPlot,true); + else + $this->y2plots[] = &$aPlot; + } + + // Add plot to second Y-scale + function AddY($aN,&$aPlot) { + + if( $aPlot == null ) + JpGraphError::RaiseL(25012);//("Graph::AddYN() You tried to add a null plot to the graph."); + + if( is_array($aPlot) && count($aPlot) > 0 ) + $cl = $aPlot[0]; + else + $cl = $aPlot; + + if( is_a($cl,'Text') || is_a($cl,'PlotLine') || is_a($cl,'PlotBand') ) + JpGraph::RaiseL(25013);//('You can only add standard plots to multiple Y-axis'); + else + $this->ynplots[$aN][] = &$aPlot; + } + + // Add text object to the graph + function AddText(&$aTxt,$aToY2=false) { + if( $aTxt == null ) + JpGraphError::RaiseL(25014);//("Graph::AddText() You tried to add a null text to the graph."); + if( $aToY2 ) { + if( is_array($aTxt) ) { + for($i=0; $i < count($aTxt); ++$i ) + $this->y2texts[]=&$aTxt[$i]; + } + else + $this->y2texts[] = &$aTxt; + } + else { + if( is_array($aTxt) ) { + for($i=0; $i < count($aTxt); ++$i ) + $this->texts[]=&$aTxt[$i]; + } + else + $this->texts[] = &$aTxt; + } + } + + // Add a line object (class PlotLine) to the graph + function AddLine(&$aLine,$aToY2=false) { + if( $aLine == null ) + JpGraphError::RaiseL(25015);//("Graph::AddLine() You tried to add a null line to the graph."); + + if( $aToY2 ) { + if( is_array($aLine) ) { + for($i=0; $i < count($aLine); ++$i ) + $this->y2lines[]=&$aLine[$i]; + } + else + $this->y2lines[] = &$aLine; + } + else { + if( is_array($aLine) ) { + for($i=0; $i < count($aLine); ++$i ) + $this->lines[]=&$aLine[$i]; + } + else + $this->lines[] = &$aLine; + } + } + + // Add vertical or horizontal band + function AddBand(&$aBand,$aToY2=false) { + if( $aBand == null ) + JpGraphError::RaiseL(25016);//(" Graph::AddBand() You tried to add a null band to the graph."); + + if( $aToY2 ) { + if( is_array($aBand) ) { + for($i=0; $i < count($aBand); ++$i ) + $this->y2bands[] = &$aBand[$i]; + } + else + $this->y2bands[] = &$aBand; + } + else { + if( is_array($aBand) ) { + for($i=0; $i < count($aBand); ++$i ) + $this->bands[] = &$aBand[$i]; + } + else + $this->bands[] = &$aBand; + } + } + + function SetBackgroundGradient($aFrom='navy',$aTo='silver',$aGradType=2,$aStyle=BGRAD_FRAME) { + $this->bkg_gradtype=$aGradType; + $this->bkg_gradstyle=$aStyle; + $this->bkg_gradfrom = $aFrom; + $this->bkg_gradto = $aTo; + } + + // Set a country flag in the background + function SetBackgroundCFlag($aName,$aBgType=BGIMG_FILLPLOT,$aMix=100) { + $this->background_cflag = $aName; + $this->background_cflag_type = $aBgType; + $this->background_cflag_mix = $aMix; + } + + // Alias for the above method + function SetBackgroundCountryFlag($aName,$aBgType=BGIMG_FILLPLOT,$aMix=100) { + $this->background_cflag = $aName; + $this->background_cflag_type = $aBgType; + $this->background_cflag_mix = $aMix; + } + + + // Specify a background image + function SetBackgroundImage($aFileName,$aBgType=BGIMG_FILLPLOT,$aImgFormat="auto") { + + // Get extension to determine image type + if( $aImgFormat == "auto" ) { + $e = explode('.',$aFileName); + if( !$e ) { + JpGraphError::RaiseL(25018,$aFileName);//('Incorrect file name for Graph::SetBackgroundImage() : '.$aFileName.' Must have a valid image extension (jpg,gif,png) when using autodetection of image type'); + } + + $valid_formats = array('png', 'jpg', 'gif'); + $aImgFormat = strtolower($e[count($e)-1]); + if ($aImgFormat == 'jpeg') { + $aImgFormat = 'jpg'; + } + elseif (!in_array($aImgFormat, $valid_formats) ) { + JpGraphError::RaiseL(25019,$aImgFormat);//('Unknown file extension ($aImgFormat) in Graph::SetBackgroundImage() for filename: '.$aFileName); + } + } + + $this->background_image = $aFileName; + $this->background_image_type=$aBgType; + $this->background_image_format=$aImgFormat; + } + + function SetBackgroundImageMix($aMix) { + $this->background_image_mix = $aMix ; + } + + // Specify axis style (boxed or single) + function SetAxisStyle($aStyle) { + $this->iAxisStyle = $aStyle ; + } + + // Set a frame around the plot area + function SetBox($aDrawPlotFrame=true,$aPlotFrameColor=array(0,0,0),$aPlotFrameWeight=1) { + $this->boxed = $aDrawPlotFrame; + $this->box_weight = $aPlotFrameWeight; + $this->box_color = $aPlotFrameColor; + } + + // Specify color for the plotarea (not the margins) + function SetColor($aColor) { + $this->plotarea_color=$aColor; + } + + // Specify color for the margins (all areas outside the plotarea) + function SetMarginColor($aColor) { + $this->margin_color=$aColor; + } + + // Set a frame around the entire image + function SetFrame($aDrawImgFrame=true,$aImgFrameColor=array(0,0,0),$aImgFrameWeight=1) { + $this->doframe = $aDrawImgFrame; + $this->frame_color = $aImgFrameColor; + $this->frame_weight = $aImgFrameWeight; + } + + function SetFrameBevel($aDepth=3,$aBorder=false,$aBorderColor='black',$aColor1='white@0.4',$aColor2='darkgray@0.4',$aFlg=true) { + $this->framebevel = $aFlg ; + $this->framebeveldepth = $aDepth ; + $this->framebevelborder = $aBorder ; + $this->framebevelbordercolor = $aBorderColor ; + $this->framebevelcolor1 = $aColor1 ; + $this->framebevelcolor2 = $aColor2 ; + + $this->doshadow = false ; + } + + // Set the shadow around the whole image + function SetShadow($aShowShadow=true,$aShadowWidth=5,$aShadowColor=array(102,102,102)) { + $this->doshadow = $aShowShadow; + $this->shadow_color = $aShadowColor; + $this->shadow_width = $aShadowWidth; + $this->footer->iBottomMargin += $aShadowWidth; + $this->footer->iRightMargin += $aShadowWidth; + } + + // Specify x,y scale. Note that if you manually specify the scale + // you must also specify the tick distance with a call to Ticks::Set() + function SetScale($aAxisType,$aYMin=1,$aYMax=1,$aXMin=1,$aXMax=1) { + $this->axtype = $aAxisType; + + if( $aYMax < $aYMin || $aXMax < $aXMin ) + JpGraphError::RaiseL(25020);//('Graph::SetScale(): Specified Max value must be larger than the specified Min value.'); + + $yt=substr($aAxisType,-3,3); + if( $yt=="lin" ) + $this->yscale = new LinearScale($aYMin,$aYMax); + elseif( $yt == "int" ) { + $this->yscale = new LinearScale($aYMin,$aYMax); + $this->yscale->SetIntScale(); + } + elseif( $yt=="log" ) + $this->yscale = new LogScale($aYMin,$aYMax); + else + JpGraphError::RaiseL(25021,$aAxisType);//("Unknown scale specification for Y-scale. ($aAxisType)"); + + $xt=substr($aAxisType,0,3); + if( $xt == "lin" || $xt == "tex" ) { + $this->xscale = new LinearScale($aXMin,$aXMax,"x"); + $this->xscale->textscale = ($xt == "tex"); + } + elseif( $xt == "int" ) { + $this->xscale = new LinearScale($aXMin,$aXMax,"x"); + $this->xscale->SetIntScale(); + } + elseif( $xt == "dat" ) { + $this->xscale = new DateScale($aXMin,$aXMax,"x"); + } + elseif( $xt == "log" ) + $this->xscale = new LogScale($aXMin,$aXMax,"x"); + else + JpGraphError::RaiseL(25022,$aAxisType);//(" Unknown scale specification for X-scale. ($aAxisType)"); + + $this->xaxis = new Axis($this->img,$this->xscale); + $this->yaxis = new Axis($this->img,$this->yscale); + $this->xgrid = new Grid($this->xaxis); + $this->ygrid = new Grid($this->yaxis); + $this->ygrid->Show(); + } + + // Specify secondary Y scale + function SetY2Scale($aAxisType="lin",$aY2Min=1,$aY2Max=1) { + if( $aAxisType=="lin" ) + $this->y2scale = new LinearScale($aY2Min,$aY2Max); + elseif( $aAxisType == "int" ) { + $this->y2scale = new LinearScale($aY2Min,$aY2Max); + $this->y2scale->SetIntScale(); + } + elseif( $aAxisType=="log" ) { + $this->y2scale = new LogScale($aY2Min,$aY2Max); + } + else JpGraphError::RaiseL(25023,$aAxisType);//("JpGraph: Unsupported Y2 axis type: $aAxisType\nMust be one of (lin,log,int)"); + + $this->y2axis = new Axis($this->img,$this->y2scale); + $this->y2axis->scale->ticks->SetDirection(SIDE_LEFT); + $this->y2axis->SetLabelSide(SIDE_RIGHT); + $this->y2axis->SetPos('max'); + $this->y2axis->SetTitleSide(SIDE_RIGHT); + + // Deafult position is the max x-value + $this->y2grid = new Grid($this->y2axis); + } + + // Set the delta position (in pixels) between the multiple Y-axis + function SetYDeltaDist($aDist) { + $this->iYAxisDeltaPos = $aDist; + } + + // Specify secondary Y scale + function SetYScale($aN,$aAxisType="lin",$aYMin=1,$aYMax=1) { + + if( $aAxisType=="lin" ) + $this->ynscale[$aN] = new LinearScale($aYMin,$aYMax); + elseif( $aAxisType == "int" ) { + $this->ynscale[$aN] = new LinearScale($aYMin,$aYMax); + $this->ynscale[$aN]->SetIntScale(); + } + elseif( $aAxisType=="log" ) { + $this->ynscale[$aN] = new LogScale($aYMin,$aYMax); + } + else JpGraphError::RaiseL(25024,$aAxisType);//("JpGraph: Unsupported Y axis type: $aAxisType\nMust be one of (lin,log,int)"); + + $this->ynaxis[$aN] = new Axis($this->img,$this->ynscale[$aN]); + $this->ynaxis[$aN]->scale->ticks->SetDirection(SIDE_LEFT); + $this->ynaxis[$aN]->SetLabelSide(SIDE_RIGHT); + } + + + // Specify density of ticks when autoscaling 'normal', 'dense', 'sparse', 'verysparse' + // The dividing factor have been determined heuristically according to my aesthetic + // sense (or lack off) y.m.m.v ! + function SetTickDensity($aYDensity=TICKD_NORMAL,$aXDensity=TICKD_NORMAL) { + $this->xtick_factor=30; + $this->ytick_factor=25; + switch( $aYDensity ) { + case TICKD_DENSE: + $this->ytick_factor=12; + break; + case TICKD_NORMAL: + $this->ytick_factor=25; + break; + case TICKD_SPARSE: + $this->ytick_factor=40; + break; + case TICKD_VERYSPARSE: + $this->ytick_factor=100; + break; + default: + JpGraphError::RaiseL(25025,$densy);//("JpGraph: Unsupported Tick density: $densy"); + } + switch( $aXDensity ) { + case TICKD_DENSE: + $this->xtick_factor=15; + break; + case TICKD_NORMAL: + $this->xtick_factor=30; + break; + case TICKD_SPARSE: + $this->xtick_factor=45; + break; + case TICKD_VERYSPARSE: + $this->xtick_factor=60; + break; + default: + JpGraphError::RaiseL(25025,$densx);//("JpGraph: Unsupported Tick density: $densx"); + } + } + + + // Get a string of all image map areas + function GetCSIMareas() { + if( !$this->iHasStroked ) + $this->Stroke(_CSIM_SPECIALFILE); + + $csim = $this->title->GetCSIMAreas(); + $csim .= $this->subtitle->GetCSIMAreas(); + $csim .= $this->subsubtitle->GetCSIMAreas(); + $csim .= $this->legend->GetCSIMAreas(); + + if( $this->y2axis != NULL ) { + $csim .= $this->y2axis->title->GetCSIMAreas(); + } + + if( $this->texts != null ) { + $n = count($this->texts); + for($i=0; $i < $n; ++$i ) { + $csim .= $this->texts[$i]->GetCSIMAreas(); + } + } + + if( $this->y2texts != null && $this->y2scale != null ) { + $n = count($this->y2texts); + for($i=0; $i < $n; ++$i ) { + $csim .= $this->y2texts[$i]->GetCSIMAreas(); + } + } + + if( $this->yaxis != null && $this->xaxis != null ) { + $csim .= $this->yaxis->title->GetCSIMAreas(); + $csim .= $this->xaxis->title->GetCSIMAreas(); + } + + $n = count($this->plots); + for( $i=0; $i < $n; ++$i ) + $csim .= $this->plots[$i]->GetCSIMareas(); + + $n = count($this->y2plots); + for( $i=0; $i < $n; ++$i ) + $csim .= $this->y2plots[$i]->GetCSIMareas(); + + $n = count($this->ynaxis); + for( $i=0; $i < $n; ++$i ) { + $m = count($this->ynplots[$i]); + for($j=0; $j < $m; ++$j ) { + $csim .= $this->ynplots[$i][$j]->GetCSIMareas(); + } + } + + $n = count($this->iTables); + for( $i=0; $i < $n; ++$i ) { + $csim .= $this->iTables[$i]->GetCSIMareas(); + } + + return $csim; + } + + // Get a complete tag for the final image map + function GetHTMLImageMap($aMapName) { + $im = ""; + return $im; + } + + function CheckCSIMCache($aCacheName,$aTimeOut=60) { + global $_SERVER; + + if( $aCacheName=='auto' ) + $aCacheName=basename($_SERVER['PHP_SELF']); + + $urlarg = $this->GetURLArguments(); + $this->csimcachename = CSIMCACHE_DIR.$aCacheName.$urlarg; + $this->csimcachetimeout = $aTimeOut; + + // First determine if we need to check for a cached version + // This differs from the standard cache in the sense that the + // image and CSIM map HTML file is written relative to the directory + // the script executes in and not the specified cache directory. + // The reason for this is that the cache directory is not necessarily + // accessible from the HTTP server. + if( $this->csimcachename != '' ) { + $dir = dirname($this->csimcachename); + $base = basename($this->csimcachename); + $base = strtok($base,'.'); + $suffix = strtok('.'); + $basecsim = $dir.'/'.$base.'?'.$urlarg.'_csim_.html'; + $baseimg = $dir.'/'.$base.'?'.$urlarg.'.'.$this->img->img_format; + + $timedout=false; + // Does it exist at all ? + + if( file_exists($basecsim) && file_exists($baseimg) ) { + // Check that it hasn't timed out + $diff=time()-filemtime($basecsim); + if( $this->csimcachetimeout>0 && ($diff > $this->csimcachetimeout*60) ) { + $timedout=true; + @unlink($basecsim); + @unlink($baseimg); + } + else { + if ($fh = @fopen($basecsim, "r")) { + fpassthru($fh); + return true; + } + else + JpGraphError::RaiseL(25027,$basecsim);//(" Can't open cached CSIM \"$basecsim\" for reading."); + } + } + } + return false; + } + + // Build the argument string to be used with the csim images + function GetURLArguments() { + + // This is a JPGRAPH internal defined that prevents + // us from recursively coming here again + $urlarg = _CSIM_DISPLAY.'=1'; + + // Now reconstruct any user URL argument + reset($_GET); + while( list($key,$value) = each($_GET) ) { + if( is_array($value) ) { + foreach ( $value as $k => $v ) { + $urlarg .= '&'.$key.'%5B'.$k.'%5D='.urlencode($v); + } + } + else { + $urlarg .= '&'.$key.'='.urlencode($value); + } + } + + // It's not ideal to convert POST argument to GET arguments + // but there is little else we can do. One idea for the + // future might be recreate the POST header in case. + reset($_POST); + while( list($key,$value) = each($_POST) ) { + if( is_array($value) ) { + foreach ( $value as $k => $v ) { + $urlarg .= '&'.$key.'%5B'.$k.'%5D='.urlencode($v); + } + } + else { + $urlarg .= '&'.$key.'='.urlencode($value); + } + } + + return $urlarg; + } + + function SetCSIMImgAlt($aAlt) { + $this->iCSIMImgAlt = $aAlt; + } + + function StrokeCSIM($aScriptName='auto',$aCSIMName='',$aBorder=0) { + if( $aCSIMName=='' ) { + // create a random map name + srand ((double) microtime() * 1000000); + $r = rand(0,100000); + $aCSIMName='__mapname'.$r.'__'; + } + + if( $aScriptName=='auto' ) + $aScriptName=basename($_SERVER['PHP_SELF']); + + $urlarg = $this->GetURLArguments(); + + if( empty($_GET[_CSIM_DISPLAY]) ) { + // First determine if we need to check for a cached version + // This differs from the standard cache in the sense that the + // image and CSIM map HTML file is written relative to the directory + // the script executes in and not the specified cache directory. + // The reason for this is that the cache directory is not necessarily + // accessible from the HTTP server. + if( $this->csimcachename != '' ) { + $dir = dirname($this->csimcachename); + $base = basename($this->csimcachename); + $base = strtok($base,'.'); + $suffix = strtok('.'); + $basecsim = $dir.'/'.$base.'?'.$urlarg.'_csim_.html'; + $baseimg = $base.'?'.$urlarg.'.'.$this->img->img_format; + + // Check that apache can write to directory specified + + if( file_exists($dir) && !is_writeable($dir) ) { + JpgraphError::RaiseL(25028,$dir);//('Apache/PHP does not have permission to write to the CSIM cache directory ('.$dir.'). Check permissions.'); + } + + // Make sure directory exists + $this->cache->MakeDirs($dir); + + // Write the image file + $this->Stroke(CSIMCACHE_DIR.$baseimg); + + // Construct wrapper HTML and write to file and send it back to browser + + // In the src URL we must replace the '?' with its encoding to prevent the arguments + // to be converted to real arguments. + $tmp = str_replace('?','%3f',$baseimg); + $htmlwrap = $this->GetHTMLImageMap($aCSIMName)."\n". + '";
+ echo "Major = $maj s, ".floor($maj/60)."min, ".floor($maj/3600)."h, ".floor($maj/86400)."day
";
+ echo "Min = $min s, ".floor($min/60)."min, ".floor($min/3600)."h, ".floor($min/86400)."day
";
+ echo "Format=$format
";
+ }
+ */
+
+ if( $this->iStartTimeAlign !== false && $this->iStartAlign !== false ) {
+ JpGraphError::RaiseL(3001);
+//('It is only possible to use either SetDateAlign() or SetTimeAlign() but not both');
+ }
+
+ if( $this->iStartTimeAlign !== false ) {
+ if( $this->iStartTimeAlign >= 30 ) {
+ $adjstart = $this->AdjStartTime($aStartTime,$this->iStartTimeAlign-30);
+ }
+ elseif( $this->iStartTimeAlign >= 20 ) {
+ $adjstart = $this->AdjStartTime($aStartTime,false,$this->iStartTimeAlign-20);
+ }
+ else {
+ $adjstart = $this->AdjStartTime($aStartTime,false,false,$this->iStartTimeAlign);
+ }
+ }
+ if( $this->iEndTimeAlign !== false ) {
+ if( $this->iEndTimeAlign >= 30 ) {
+ $adjend = $this->AdjEndTime($aEndTime,$this->iEndTimeAlign-30);
+ }
+ elseif( $this->iEndTimeAlign >= 20 ) {
+ $adjend = $this->AdjEndTime($aEndTime,false,$this->iEndTimeAlign-20);
+ }
+ else {
+ $adjend = $this->AdjEndTime($aEndTime,false,false,$this->iEndTimeAlign);
+ }
+ }
+
+
+
+ if( $this->iStartAlign !== false ) {
+ if( $this->iStartAlign >= 30 ) {
+ $adjstart = $this->AdjStartDate($aStartTime,$this->iStartAlign-30);
+ }
+ elseif( $this->iStartAlign >= 20 ) {
+ $adjstart = $this->AdjStartDate($aStartTime,false,$this->iStartAlign-20);
+ }
+ else {
+ $adjstart = $this->AdjStartDate($aStartTime,false,false,$this->iStartAlign);
+ }
+ }
+ if( $this->iEndAlign !== false ) {
+ if( $this->iEndAlign >= 30 ) {
+ $adjend = $this->AdjEndDate($aEndTime,$this->iEndAlign-30);
+ }
+ elseif( $this->iEndAlign >= 20 ) {
+ $adjend = $this->AdjEndDate($aEndTime,false,$this->iEndAlign-20);
+ }
+ else {
+ $adjend = $this->AdjEndDate($aEndTime,false,false,$this->iEndAlign);
+ }
+ }
+ $this->Update($img,$adjstart,$adjend);
+ if( ! $this->ticks->IsSpecified() )
+ $this->ticks->Set($maj,$min);
+ if( $this->date_format == '' )
+ $this->ticks->SetLabelDateFormat($format);
+ else
+ $this->ticks->SetLabelDateFormat($this->date_format);
+ }
+}
+
+
+?>
diff --git a/html/includes/jpgraph/src/jpgraph_errhandler.inc.php b/html/includes/jpgraph/src/jpgraph_errhandler.inc.php
new file mode 100644
index 0000000000..0afb416a56
--- /dev/null
+++ b/html/includes/jpgraph/src/jpgraph_errhandler.inc.php
@@ -0,0 +1,277 @@
+lt = $_jpg_messages;
+ }
+
+ function Get($errnbr,$a1=null,$a2=null,$a3=null,$a4=null,$a5=null) {
+ GLOBAL $__jpg_err_locale;
+ if( !isset($this->lt[$errnbr]) ) {
+ return 'Internal error: The specified error message ('.$errnbr.') does not exist in the chosen locale ('.$__jpg_err_locale.')';
+ }
+ $ea = $this->lt[$errnbr];
+ $j=0;
+ if( $a1 !== null ) {
+ $argv[$j++] = $a1;
+ if( $a2 !== null ) {
+ $argv[$j++] = $a2;
+ if( $a3 !== null ) {
+ $argv[$j++] = $a3;
+ if( $a4 !== null ) {
+ $argv[$j++] = $a4;
+ if( $a5 !== null ) {
+ $argv[$j++] = $a5;
+ }
+ }
+ }
+ }
+ }
+ $numargs = $j;
+ if( $ea[1] != $numargs ) {
+ // Error message argument count do not match.
+ // Just return the error message without arguments.
+ return $ea[0];
+ }
+ switch( $numargs ) {
+ case 1:
+ $msg = sprintf($ea[0],$argv[0]);
+ break;
+ case 2:
+ $msg = sprintf($ea[0],$argv[0],$argv[1]);
+ break;
+ case 3:
+ $msg = sprintf($ea[0],$argv[0],$argv[1],$argv[2]);
+ break;
+ case 4:
+ $msg = sprintf($ea[0],$argv[0],$argv[1],$argv[2],$argv[3]);
+ break;
+ case 5:
+ $msg = sprintf($ea[0],$argv[0],$argv[1],$argv[2],$argv[3],$argv[4]);
+ break;
+ case 0:
+ default:
+ $msg = sprintf($ea[0]);
+ break;
+ }
+ return $msg;
+ }
+}
+
+//
+// A wrapper class that is used to access the specified error object
+// (to hide the global error parameter and avoid having a GLOBAL directive
+// in all methods.
+//
+class JpGraphError {
+ function Install($aErrObject) {
+ GLOBAL $__jpg_err;
+ $__jpg_err = $aErrObject;
+ }
+ function SetErrLocale($aLoc) {
+ GLOBAL $__jpg_err_locale ;
+ $__jpg_err_locale = $aLoc;
+ }
+ function Raise($aMsg,$aHalt=true){
+ GLOBAL $__jpg_err;
+ $tmp = new $__jpg_err;
+ $tmp->Raise($aMsg,$aHalt);
+ }
+ function RaiseL($errnbr,$a1=null,$a2=null,$a3=null,$a4=null,$a5=null) {
+ GLOBAL $__jpg_err;
+ $t = new ErrMsgText();
+ $msg = $t->Get($errnbr,$a1,$a2,$a3,$a4,$a5);
+ $tmp = new $__jpg_err;
+ $tmp->Raise($msg);
+ }
+}
+
+// The default trivial text error handler.
+class JpGraphErrObject {
+
+ var $iTitle = "JpGraph Error";
+ var $iDest = false;
+
+ function JpGraphErrObject() {
+ // Empty. Reserved for future use
+ }
+
+ function SetTitle($aTitle) {
+ $this->iTitle = $aTitle;
+ }
+
+ function SetStrokeDest($aDest) {
+ $this->iDest = $aDest;
+ }
+
+ // If aHalt is true then execution can't continue. Typical used for fatal errors.
+ function Raise($aMsg,$aHalt=true) {
+ $aMsg = $this->iTitle.' '.$aMsg."\n";
+ if ($this->iDest) {
+ $f = @fopen($this->iDest,'a');
+ if( $f ) {
+ @fwrite($f,$aMsg);
+ @fclose($f);
+ }
+ }
+ else {
+ echo $aMsg;
+ }
+ if( $aHalt )
+ die();
+ }
+}
+
+//==============================================================
+// An image based error handler
+//==============================================================
+class JpGraphErrObjectImg extends JpGraphErrObject {
+
+ function Raise($aMsg,$aHalt=true) {
+ $img_iconerror =
+ 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAaV'.
+ 'BMVEX//////2Xy8mLl5V/Z2VvMzFi/v1WyslKlpU+ZmUyMjEh/'.
+ 'f0VyckJlZT9YWDxMTDjAwMDy8sLl5bnY2K/MzKW/v5yyspKlpY'.
+ 'iYmH+MjHY/PzV/f2xycmJlZVlZWU9MTEXY2Ms/PzwyMjLFTjea'.
+ 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'.
+ 'IAAAsSAdLdfvwAAAAHdElNRQfTBgISOCqusfs5AAABLUlEQVR4'.
+ '2tWV3XKCMBBGWfkranCIVClKLd/7P2Q3QsgCxjDTq+6FE2cPH+'.
+ 'xJ0Ogn2lQbsT+Wrs+buAZAV4W5T6Bs0YXBBwpKgEuIu+JERAX6'.
+ 'wM2rHjmDdEITmsQEEmWADgZm6rAjhXsoMGY9B/NZBwJzBvn+e3'.
+ 'wHntCAJdGu9SviwIwoZVDxPB9+Rc0TSEbQr0j3SA1gwdSn6Db0'.
+ '6Tm1KfV6yzWGQO7zdpvyKLKBDmRFjzeB3LYgK7r6A/noDAfjtS'.
+ 'IXaIzbJSv6WgUebTMV4EoRB8a2mQiQjgtF91HdKDKZ1gtFtQjk'.
+ 'YcWaR5OKOhkYt+ZsTFdJRfPAApOpQYJTNHvCRSJR6SJngQadfc'.
+ 'vd69OLMddVOPCGVnmrFD8bVYd3JXfxXPtLR/+mtv59/ALWiiMx'.
+ 'qL72fwAAAABJRU5ErkJggg==' ;
+
+ if( function_exists("imagetypes") )
+ $supported = imagetypes();
+ else
+ $supported = 0;
+
+ if( !function_exists('imagecreatefromstring') )
+ $supported = 0;
+
+ if( ob_get_length() || headers_sent() || !($supported & IMG_PNG) ) {
+ // Special case for headers already sent or that the installation doesn't support
+ // the PNG format (which the error icon is encoded in).
+ // Dont return an image since it can't be displayed
+ die($this->iTitle.' '.$aMsg);
+ }
+
+ $aMsg = wordwrap($aMsg,55);
+ $lines = substr_count($aMsg,"\n");
+
+ // Create the error icon GD
+ $erricon = Image::CreateFromString(base64_decode($img_iconerror));
+
+ // Create an image that contains the error text.
+ $w=400;
+ $h=100 + 15*max(0,$lines-3);
+
+ $img = new Image($w,$h);
+
+ // Drop shadow
+ $img->SetColor("gray");
+ $img->FilledRectangle(5,5,$w-1,$h-1,10);
+ $img->SetColor("gray:0.7");
+ $img->FilledRectangle(5,5,$w-3,$h-3,10);
+
+ // Window background
+ $img->SetColor("lightblue");
+ $img->FilledRectangle(1,1,$w-5,$h-5);
+ $img->CopyCanvasH($img->img,$erricon,5,30,0,0,40,40);
+
+ // Window border
+ $img->SetColor("black");
+ $img->Rectangle(1,1,$w-5,$h-5);
+ $img->Rectangle(0,0,$w-4,$h-4);
+
+ // Window top row
+ $img->SetColor("darkred");
+ for($y=3; $y < 18; $y += 2 )
+ $img->Line(1,$y,$w-6,$y);
+
+ // "White shadow"
+ $img->SetColor("white");
+
+ // Left window edge
+ $img->Line(2,2,2,$h-5);
+ $img->Line(2,2,$w-6,2);
+
+ // "Gray button shadow"
+ $img->SetColor("darkgray");
+
+ // Gray window shadow
+ $img->Line(2,$h-6,$w-5,$h-6);
+ $img->Line(3,$h-7,$w-5,$h-7);
+
+ // Window title
+ $m = floor($w/2-5);
+ $l = 100;
+ $img->SetColor("lightgray:1.3");
+ $img->FilledRectangle($m-$l,2,$m+$l,16);
+
+ // Stroke text
+ $img->SetColor("darkred");
+ $img->SetFont(FF_FONT2,FS_BOLD);
+ $img->StrokeText($m-50,15,$this->iTitle);
+ $img->SetColor("black");
+ $img->SetFont(FF_FONT1,FS_NORMAL);
+ $txt = new Text($aMsg,52,25);
+ $txt->Align("left","top");
+ $txt->Stroke($img);
+ if ($this->iDest) {
+ $img->Stream($this->iDest);
+ } else {
+ $img->Headers();
+ $img->Stream();
+ }
+ if( $aHalt )
+ die();
+ }
+}
+
+// Install the default error handler in a global accessible variable
+if( USE_IMAGE_ERROR_HANDLER ) {
+ $__jpg_err = "JpGraphErrObjectImg";
+}
+else {
+ $__jpg_err = "JpGraphErrObject";
+}
+
+
+?>
diff --git a/html/includes/jpgraph/src/jpgraph_error.php b/html/includes/jpgraph/src/jpgraph_error.php
new file mode 100644
index 0000000000..098741185a
--- /dev/null
+++ b/html/includes/jpgraph/src/jpgraph_error.php
@@ -0,0 +1,156 @@
+Plot($datay,$datax);
+ $this->numpoints /= 2;
+ }
+//---------------
+// PUBLIC METHODS
+
+ // Gets called before any axis are stroked
+ function PreStrokeAdjust(&$graph) {
+ if( $this->center ) {
+ $a=0.5; $b=0.5;
+ ++$this->numpoints;
+ } else {
+ $a=0; $b=0;
+ }
+ $graph->xaxis->scale->ticks->SetXLabelOffset($a);
+ $graph->SetTextScaleOff($b);
+ //$graph->xaxis->scale->ticks->SupressMinorTickMarks();
+ }
+
+ // Method description
+ function Stroke(&$img,&$xscale,&$yscale) {
+ $numpoints=count($this->coords[0])/2;
+ $img->SetColor($this->color);
+ $img->SetLineWeight($this->weight);
+
+ if( isset($this->coords[1]) ) {
+ if( count($this->coords[1])!=$numpoints )
+ JpGraphError::RaiseL(2003,count($this->coords[1]),$numpoints);
+//("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints");
+ else
+ $exist_x = true;
+ }
+ else
+ $exist_x = false;
+
+ for( $i=0; $i<$numpoints; ++$i) {
+ if( $exist_x )
+ $x=$this->coords[1][$i];
+ else
+ $x=$i;
+
+ if( !is_numeric($x) ||
+ !is_numeric($this->coords[0][$i*2]) || !is_numeric($this->coords[0][$i*2+1]) ) {
+ continue;
+ }
+
+ $xt = $xscale->Translate($x);
+ $yt1 = $yscale->Translate($this->coords[0][$i*2]);
+ $yt2 = $yscale->Translate($this->coords[0][$i*2+1]);
+ $img->Line($xt,$yt1,$xt,$yt2);
+ $img->Line($xt-$this->errwidth,$yt1,$xt+$this->errwidth,$yt1);
+ $img->Line($xt-$this->errwidth,$yt2,$xt+$this->errwidth,$yt2);
+ }
+ return true;
+ }
+} // Class
+
+
+//===================================================
+// CLASS ErrorLinePlot
+// Description: Combine a line and error plot
+// THIS IS A DEPRECATED PLOT TYPE JUST KEPT FOR
+// BACKWARD COMPATIBILITY
+//===================================================
+class ErrorLinePlot extends ErrorPlot {
+ var $line=null;
+//---------------
+// CONSTRUCTOR
+ function ErrorLinePlot(&$datay,$datax=false) {
+ $this->ErrorPlot($datay,$datax);
+ // Calculate line coordinates as the average of the error limits
+ $n = count($datay);
+ for($i=0; $i < $n; $i+=2 ) {
+ $ly[]=($datay[$i]+$datay[$i+1])/2;
+ }
+ $this->line=new LinePlot($ly,$datax);
+ }
+
+//---------------
+// PUBLIC METHODS
+ function Legend(&$graph) {
+ if( $this->legend != "" )
+ $graph->legend->Add($this->legend,$this->color);
+ $this->line->Legend($graph);
+ }
+
+ function Stroke(&$img,&$xscale,&$yscale) {
+ parent::Stroke($img,$xscale,$yscale);
+ $this->line->Stroke($img,$xscale,$yscale);
+ }
+} // Class
+
+
+//===================================================
+// CLASS LineErrorPlot
+// Description: Combine a line and error plot
+//===================================================
+class LineErrorPlot extends ErrorPlot {
+ var $line=null;
+//---------------
+// CONSTRUCTOR
+ // Data is (val, errdeltamin, errdeltamax)
+ function LineErrorPlot(&$datay,$datax=false) {
+ $ly=array(); $ey=array();
+ $n = count($datay);
+ if( $n % 3 != 0 ) {
+ JpGraphError::RaiseL(4002);
+//('Error in input data to LineErrorPlot. Number of data points must be a multiple of 3');
+ }
+ for($i=0; $i < $n; $i+=3 ) {
+ $ly[]=$datay[$i];
+ $ey[]=$datay[$i]+$datay[$i+1];
+ $ey[]=$datay[$i]+$datay[$i+2];
+ }
+ $this->ErrorPlot($ey,$datax);
+ $this->line=new LinePlot($ly,$datax);
+ }
+
+//---------------
+// PUBLIC METHODS
+ function Legend(&$graph) {
+ if( $this->legend != "" )
+ $graph->legend->Add($this->legend,$this->color);
+ $this->line->Legend($graph);
+ }
+
+ function Stroke(&$img,&$xscale,&$yscale) {
+ parent::Stroke($img,$xscale,$yscale);
+ $this->line->Stroke($img,$xscale,$yscale);
+ }
+} // Class
+
+
+/* EOF */
+?>
\ No newline at end of file
diff --git a/html/includes/jpgraph/src/jpgraph_flags.php b/html/includes/jpgraph/src/jpgraph_flags.php
new file mode 100644
index 0000000000..41920d2406
--- /dev/null
+++ b/html/includes/jpgraph/src/jpgraph_flags.php
@@ -0,0 +1,376 @@
+ 'afgh',
+ 'Republic of Angola' => 'agla',
+ 'Republic of Albania' => 'alba',
+ 'Alderney' => 'alde',
+ 'Democratic and Popular Republic of Algeria' => 'alge',
+ 'Territory of American Samoa' => 'amsa',
+ 'Principality of Andorra' => 'andr',
+ 'British Overseas Territory of Anguilla' => 'angu',
+ 'Antarctica' => 'anta',
+ 'Argentine Republic' => 'arge',
+ 'League of Arab States' => 'arle',
+ 'Republic of Armenia' => 'arme',
+ 'Aruba' => 'arub',
+ 'Commonwealth of Australia' => 'astl',
+ 'Republic of Austria' => 'aust',
+ 'Azerbaijani Republic' => 'azer',
+ 'Bangladesh' => 'bngl',
+ 'British Antarctic Territory' => 'bant',
+ 'Kingdom of Belgium' => 'belg',
+ 'British Overseas Territory of Bermuda' => 'berm',
+ 'Commonwealth of the Bahamas' => 'bhms',
+ 'Kingdom of Bahrain' => 'bhrn',
+ 'Republic of Belarus' => 'blru',
+ 'Republic of Bolivia' => 'blva',
+ 'Belize' => 'blze',
+ 'Republic of Benin' => 'bnin',
+ 'Republic of Botswana' => 'bots',
+ 'Federative Republic of Brazil' => 'braz',
+ 'Barbados' => 'brbd',
+ 'British Indian Ocean Territory' => 'brin',
+ 'Brunei Darussalam' => 'brun',
+ 'Republic of Burkina' => 'bufa',
+ 'Republic of Bulgaria' => 'bulg',
+ 'Republic of Burundi' => 'buru',
+ 'Overseas Territory of the British Virgin Islands' => 'bvis',
+ 'Central African Republic' => 'cafr',
+ 'Kingdom of Cambodia' => 'camb',
+ 'Republic of Cameroon' => 'came',
+ 'Dominion of Canada' => 'cana',
+ 'Caribbean Community' => 'cari',
+ 'Republic of Cape Verde' => 'cave',
+ 'Republic of Chad' => 'chad',
+ 'Republic of Chile' => 'chil',
+ 'Peoples Republic of China' => 'chin',
+ 'Territory of Christmas Island' => 'chms',
+ 'Commonwealth of Independent States' => 'cins',
+ 'Cook Islands' => 'ckis',
+ 'Republic of Colombia' => 'clmb',
+ 'Territory of Cocos Islands' => 'cois',
+ 'Commonwealth' => 'comn',
+ 'Union of the Comoros' => 'como',
+ 'Republic of the Congo' => 'cong',
+ 'Republic of Costa Rica' => 'corc',
+ 'Republic of Croatia' => 'croa',
+ 'Republic of Cuba' => 'cuba',
+ 'British Overseas Territory of the Cayman Islands' => 'cyis',
+ 'Republic of Cyprus' => 'cypr',
+ 'The Czech Republic' => 'czec',
+ 'Kingdom of Denmark' => 'denm',
+ 'Republic of Djibouti' => 'djib',
+ 'Commonwealth of Dominica' => 'domn',
+ 'Dominican Republic' => 'dore',
+ 'Republic of Ecuador' => 'ecua',
+ 'Arab Republic of Egypt' => 'egyp',
+ 'Republic of El Salvador' => 'elsa',
+ 'England' => 'engl',
+ 'Republic of Equatorial Guinea' => 'eqgu',
+ 'State of Eritrea' => 'erit',
+ 'Republic of Estonia' => 'estn',
+ 'Ethiopia' => 'ethp',
+ 'European Union' => 'euun',
+ 'British Overseas Territory of the Falkland Islands' => 'fais',
+ 'International Federation of Vexillological Associations' => 'fiav',
+ 'Republic of Fiji' => 'fiji',
+ 'Republic of Finland' => 'finl',
+ 'Territory of French Polynesia' => 'fpol',
+ 'French Republic' => 'fran',
+ 'Overseas Department of French Guiana' => 'frgu',
+ 'Gabonese Republic' => 'gabn',
+ 'Republic of the Gambia' => 'gamb',
+ 'Republic of Georgia' => 'geor',
+ 'Federal Republic of Germany' => 'germ',
+ 'Republic of Ghana' => 'ghan',
+ 'Gibraltar' => 'gibr',
+ 'Hellenic Republic' => 'grec',
+ 'State of Grenada' => 'gren',
+ 'Overseas Department of Guadeloupe' => 'guad',
+ 'Territory of Guam' => 'guam',
+ 'Republic of Guatemala' => 'guat',
+ 'The Bailiwick of Guernsey' => 'guer',
+ 'Republic of Guinea' => 'guin',
+ 'Republic of Haiti' => 'hait',
+ 'Hong Kong Special Administrative Region' => 'hokn',
+ 'Republic of Honduras' => 'hond',
+ 'Republic of Hungary' => 'hung',
+ 'Republic of Iceland' => 'icel',
+ 'International Committee of the Red Cross' => 'icrc',
+ 'Republic of India' => 'inda',
+ 'Republic of Indonesia' => 'indn',
+ 'Republic of Iraq' => 'iraq',
+ 'Republic of Ireland' => 'irel',
+ 'Organization of the Islamic Conference' => 'isco',
+ 'Isle of Man' => 'isma',
+ 'State of Israel' => 'isra',
+ 'Italian Republic' => 'ital',
+ 'Jamaica' => 'jama',
+ 'Japan' => 'japa',
+ 'The Bailiwick of Jersey' => 'jers',
+ 'Hashemite Kingdom of Jordan' => 'jord',
+ 'Republic of Kazakhstan' => 'kazk',
+ 'Republic of Kenya' => 'keny',
+ 'Republic of Kiribati' => 'kirb',
+ 'State of Kuwait' => 'kuwa',
+ 'Kyrgyz Republic' => 'kyrg',
+ 'Republic of Latvia' => 'latv',
+ 'Lebanese Republic' => 'leba',
+ 'Kingdom of Lesotho' => 'lest',
+ 'Republic of Liberia' => 'libe',
+ 'Principality of Liechtenstein' => 'liec',
+ 'Republic of Lithuania' => 'lith',
+ 'Grand Duchy of Luxembourg' => 'luxe',
+ 'Macao Special Administrative Region' => 'maca',
+ 'Republic of Macedonia' => 'mace',
+ 'Republic of Madagascar' => 'mada',
+ 'Republic of the Marshall Islands' => 'mais',
+ 'Republic of Mali' => 'mali',
+ 'Federation of Malaysia' => 'mals',
+ 'Republic of Malta' => 'malt',
+ 'Republic of Malawi' => 'malw',
+ 'Overseas Department of Martinique' => 'mart',
+ 'Islamic Republic of Mauritania' => 'maur',
+ 'Territorial Collectivity of Mayotte' => 'mayt',
+ 'United Mexican States' => 'mexc',
+ 'Federated States of Micronesia' => 'micr',
+ 'Midway Islands' => 'miis',
+ 'Republic of Moldova' => 'mold',
+ 'Principality of Monaco' => 'mona',
+ 'Republic of Mongolia' => 'mong',
+ 'British Overseas Territory of Montserrat' => 'mont',
+ 'Kingdom of Morocco' => 'morc',
+ 'Republic of Mozambique' => 'moza',
+ 'Republic of Mauritius' => 'mrts',
+ 'Union of Myanmar' => 'myan',
+ 'Republic of Namibia' => 'namb',
+ 'North Atlantic Treaty Organization' => 'nato',
+ 'Republic of Nauru' => 'naur',
+ 'Turkish Republic of Northern Cyprus' => 'ncyp',
+ 'Netherlands Antilles' => 'nean',
+ 'Kingdom of Nepal' => 'nepa',
+ 'Kingdom of the Netherlands' => 'neth',
+ 'Territory of Norfolk Island' => 'nfis',
+ 'Federal Republic of Nigeria' => 'ngra',
+ 'Republic of Nicaragua' => 'nica',
+ 'Republic of Niger' => 'nigr',
+ 'Niue' => 'niue',
+ 'Commonwealth of the Northern Mariana Islands' => 'nmar',
+ 'Province of Northern Ireland' => 'noir',
+ 'Nordic Council' => 'nord',
+ 'Kingdom of Norway' => 'norw',
+ 'Territory of New Caledonia and Dependencies' => 'nwca',
+ 'New Zealand' => 'nwze',
+ 'Organization of American States' => 'oast',
+ 'Organization of African Unity' => 'oaun',
+ 'International Olympic Committee' => 'olym',
+ 'Sultanate of Oman' => 'oman',
+ 'Islamic Republic of Pakistan' => 'paks',
+ 'Republic of Palau' => 'pala',
+ 'Independent State of Papua New Guinea' => 'pang',
+ 'Republic of Paraguay' => 'para',
+ 'Republic of Peru' => 'peru',
+ 'Republic of the Philippines' => 'phil',
+ 'British Overseas Territory of the Pitcairn Islands' => 'piis',
+ 'Republic of Poland' => 'pola',
+ 'Republic of Portugal' => 'port',
+ 'Commonwealth of Puerto Rico' => 'purc',
+ 'State of Qatar' => 'qata',
+ 'Russian Federation' => 'russ',
+ 'Romania' => 'rmna',
+ 'Republic of Rwanda' => 'rwan',
+ 'Kingdom of Saudi Arabia' => 'saar',
+ 'Republic of San Marino' => 'sama',
+ 'Nordic Sami Conference' => 'sami',
+ 'Sark' => 'sark',
+ 'Scotland' => 'scot',
+ 'Principality of Seborga' => 'sebo',
+ 'Republic of Serbia' => 'serb',
+ 'Republic of Sierra Leone' => 'sile',
+ 'Republic of Singapore' => 'sing',
+ 'Republic of Korea' => 'skor',
+ 'Republic of Slovenia' => 'slva',
+ 'Somali Republic' => 'smla',
+ 'Republic of Somaliland' => 'smld',
+ 'Republic of South Africa' => 'soaf',
+ 'Solomon Islands' => 'sois',
+ 'Kingdom of Spain' => 'span',
+ 'Secretariat of the Pacific Community' => 'spco',
+ 'Democratic Socialist Republic of Sri Lanka' => 'srla',
+ 'Saint Lucia' => 'stlu',
+ 'Republic of the Sudan' => 'suda',
+ 'Republic of Suriname' => 'surn',
+ 'Slovak Republic' => 'svka',
+ 'Kingdom of Sweden' => 'swdn',
+ 'Swiss Confederation' => 'swit',
+ 'Syrian Arab Republic' => 'syra',
+ 'Kingdom of Swaziland' => 'szld',
+ 'Republic of China' => 'taiw',
+ 'Taiwan' => 'taiw',
+ 'Republic of Tajikistan' => 'tajk',
+ 'United Republic of Tanzania' => 'tanz',
+ 'Kingdom of Thailand' => 'thal',
+ 'Autonomous Region of Tibet' => 'tibe',
+ 'Turkmenistan' => 'tkst',
+ 'Togolese Republic' => 'togo',
+ 'Tokelau' => 'toke',
+ 'Kingdom of Tonga' => 'tong',
+ 'Tristan da Cunha' => 'trdc',
+ 'Tromelin' => 'tris',
+ 'Republic of Tunisia' => 'tuns',
+ 'Republic of Turkey' => 'turk',
+ 'Tuvalu' => 'tuva',
+ 'United Arab Emirates' => 'uaem',
+ 'Republic of Uganda' => 'ugan',
+ 'Ukraine' => 'ukrn',
+ 'United Kingdom of Great Britain' => 'unkg',
+ 'United Nations' => 'unna',
+ 'United States of America' => 'unst',
+ 'Oriental Republic of Uruguay' => 'urgy',
+ 'Virgin Islands of the United States' => 'usvs',
+ 'Republic of Uzbekistan' => 'uzbk',
+ 'State of the Vatican City' => 'vacy',
+ 'Republic of Vanuatu' => 'vant',
+ 'Bolivarian Republic of Venezuela' => 'venz',
+ 'Republic of Yemen' => 'yemn',
+ 'Democratic Republic of Congo' => 'zare',
+ 'Republic of Zimbabwe' => 'zbwe' ) ;
+
+
+ var $iFlagCount = -1;
+ var $iFlagSetMap = array(
+ FLAGSIZE1 => 'flags_thumb35x35',
+ FLAGSIZE2 => 'flags_thumb60x60',
+ FLAGSIZE3 => 'flags_thumb100x100',
+ FLAGSIZE4 => 'flags'
+ );
+
+ var $iFlagData ;
+ var $iOrdIdx=array();
+
+ function FlagImages($aSize=FLAGSIZE1) {
+ switch($aSize) {
+ case FLAGSIZE1 :
+ case FLAGSIZE2 :
+ case FLAGSIZE3 :
+ case FLAGSIZE4 :
+ $file = dirname(__FILE__).'/'.$this->iFlagSetMap[$aSize].'.dat';
+ $fp = fopen($file,'rb');
+ $rawdata = fread($fp,filesize($file));
+ $this->iFlagData = unserialize($rawdata);
+ break;
+ default:
+ JpGraphError::RaiseL(5001,$aSize);
+//('Unknown flag size. ('.$aSize.')');
+ }
+ $this->iFlagCount = count($this->iCountryNameMap);
+ }
+
+ function GetNum() {
+ return $this->iFlagCount;
+ }
+
+ function GetImgByName($aName,&$outFullName) {
+ $idx = $this->GetIdxByName($aName,$outFullName);
+ return $this->GetImgByIdx($idx);
+ }
+
+ function GetImgByIdx($aIdx) {
+ if( array_key_exists($aIdx,$this->iFlagData) ) {
+ $d = $this->iFlagData[$aIdx][1];
+ return Image::CreateFromString($d);
+ }
+ else {
+ JpGraphError::RaiseL(5002,$aIdx);
+//("Flag index \" $aIdx\" does not exist.");
+ }
+ }
+
+ function GetIdxByOrdinal($aOrd,&$outFullName) {
+ $aOrd--;
+ $n = count($this->iOrdIdx);
+ if( $n == 0 ) {
+ reset($this->iCountryNameMap);
+ $this->iOrdIdx=array();
+ $i=0;
+ while( list($key,$val) = each($this->iCountryNameMap) ) {
+ $this->iOrdIdx[$i++] = array($val,$key);
+ }
+ $tmp=$this->iOrdIdx[$aOrd];
+ $outFullName = $tmp[1];
+ return $tmp[0];
+
+ }
+ elseif( $aOrd >= 0 && $aOrd < $n ) {
+ $tmp=$this->iOrdIdx[$aOrd];
+ $outFullName = $tmp[1];
+ return $tmp[0];
+ }
+ else {
+ JpGraphError::RaiseL(5003,$aOrd);
+//('Invalid ordinal number specified for flag index.');
+ }
+ }
+
+ function GetIdxByName($aName,&$outFullName) {
+
+ if( is_integer($aName) ) {
+ $idx = $this->GetIdxByOrdinal($aName,$outFullName);
+ return $idx;
+ }
+
+ $found=false;
+ $aName = strtolower($aName);
+ $nlen = strlen($aName);
+ reset($this->iCountryNameMap);
+ // Start by trying to match exact index name
+ while( list($key,$val) = each($this->iCountryNameMap) ) {
+ if( $nlen == strlen($val) && $val == $aName ) {
+ $found=true;
+ break;
+ }
+ }
+ if( !$found ) {
+ reset($this->iCountryNameMap);
+ // If the exact index doesn't work try a (partial) full name
+ while( list($key,$val) = each($this->iCountryNameMap) ) {
+ if( strpos(strtolower($key), $aName) !== false ) {
+ $found=true;
+ break;
+ }
+ }
+ }
+ if( $found ) {
+ $outFullName = $key;
+ return $val;
+ }
+ else {
+ JpGraphError::RaiseL(5004,$aName);
+//("The (partial) country name \"$aName\" does not have a cooresponding flag image. The flag may still exist but under another name, e.g. insted of \"usa\" try \"united states\".");
+ }
+ }
+}
+
+
+
+
+?>
\ No newline at end of file
diff --git a/html/includes/jpgraph/src/jpgraph_gantt.php b/html/includes/jpgraph/src/jpgraph_gantt.php
new file mode 100644
index 0000000000..0fd6551076
--- /dev/null
+++ b/html/includes/jpgraph/src/jpgraph_gantt.php
@@ -0,0 +1,3808 @@
+vgrid = new LineProperty();
+ }
+
+ function Hide($aF=true) {
+ $this->iShow=!$aF;
+ }
+
+ function Show($aF=true) {
+ $this->iShow=$aF;
+ }
+
+ // Specify font
+ function SetFont($aFFamily,$aFStyle=FS_NORMAL,$aFSize=10) {
+ $this->iFFamily = $aFFamily;
+ $this->iFStyle = $aFStyle;
+ $this->iFSize = $aFSize;
+ }
+
+ function SetStyle($aStyle) {
+ $this->iStyle = $aStyle;
+ }
+
+ function SetColumnMargin($aLeft,$aRight) {
+ $this->iLeftColMargin = $aLeft;
+ $this->iRightColMargin = $aRight;
+ }
+
+ function SetFontColor($aFontColor) {
+ $this->iFontColor = $aFontColor;
+ }
+
+ function SetColor($aColor) {
+ $this->iColor = $aColor;
+ }
+
+ function SetBackgroundColor($aColor) {
+ $this->iBackgroundColor = $aColor;
+ }
+
+ function SetColTitles($aTitles,$aWidth=null) {
+ $this->iTitles = $aTitles;
+ $this->iWidth = $aWidth;
+ }
+
+ function SetMinColWidth($aWidths) {
+ $n = min(count($this->iTitles),count($aWidths));
+ for($i=0; $i < $n; ++$i ) {
+ if( !empty($aWidths[$i]) ) {
+ if( empty($this->iWidth[$i]) ) {
+ $this->iWidth[$i] = $aWidths[$i];
+ }
+ else {
+ $this->iWidth[$i] = max($this->iWidth[$i],$aWidths[$i]);
+ }
+ }
+ }
+ }
+
+ function GetWidth(&$aImg) {
+ $txt = new TextProperty();
+ $txt->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
+ $n = count($this->iTitles) ;
+ $rm=$this->iRightColMargin;
+ $w = 0;
+ for($h=0, $i=0; $i < $n; ++$i ) {
+ $w += $this->iLeftColMargin;
+ $txt->Set($this->iTitles[$i]);
+ if( !empty($this->iWidth[$i]) ) {
+ $w1 = max($txt->GetWidth($aImg)+$rm,$this->iWidth[$i]);
+ }
+ else {
+ $w1 = $txt->GetWidth($aImg)+$rm;
+ }
+ $this->iWidth[$i] = $w1;
+ $w += $w1;
+ $h = max($h,$txt->GetHeight($aImg));
+ }
+ $this->iHeight = $h+$this->iTopHeaderMargin;
+ $txt='';
+ return $w;
+ }
+
+ function GetColStart(&$aImg,&$ioStart,$aAddLeftMargin=false) {
+ $n = count($this->iTitles) ;
+ $adj = $aAddLeftMargin ? $this->iLeftColMargin : 0;
+ $ioStart=array($aImg->left_margin+$adj);
+ for( $i=1; $i < $n; ++$i ) {
+ $ioStart[$i] = $ioStart[$i-1]+$this->iLeftColMargin+$this->iWidth[$i-1];
+ }
+ }
+
+ // Adjust headers left, right or centered
+ function SetHeaderAlign($aAlign) {
+ $this->iHeaderAlign=$aAlign;
+ }
+
+ function Stroke(&$aImg,$aXLeft,$aYTop,$aXRight,$aYBottom,$aUseTextHeight=false) {
+
+ if( !$this->iShow ) return;
+
+ $txt = new TextProperty();
+ $txt->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
+ $txt->SetColor($this->iFontColor);
+ $txt->SetAlign($this->iHeaderAlign,'top');
+ $n=count($this->iTitles);
+
+ if( $n == 0 )
+ return;
+
+ $x = $aXLeft;
+ $h = $this->iHeight;
+ $yTop = $aUseTextHeight ? $aYBottom-$h-$this->iTopColMargin-$this->iBottomColMargin : $aYTop ;
+
+ if( $h < 0 ) {
+ JpGraphError::RaiseL(6001);
+//('Internal error. Height for ActivityTitles is < 0');
+ }
+
+ $aImg->SetLineWeight(1);
+ // Set background color
+ $aImg->SetColor($this->iBackgroundColor);
+ $aImg->FilledRectangle($aXLeft,$yTop,$aXRight,$aYBottom-1);
+
+ if( $this->iStyle == 1 ) {
+ // Make a 3D effect
+ $aImg->SetColor('white');
+ $aImg->Line($aXLeft,$yTop+1,
+ $aXRight,$yTop+1);
+ }
+
+ for($i=0; $i < $n; ++$i ) {
+ if( $this->iStyle == 1 ) {
+ // Make a 3D effect
+ $aImg->SetColor('white');
+ $aImg->Line($x+1,$yTop,$x+1,$aYBottom);
+ }
+ $x += $this->iLeftColMargin;
+ $txt->Set($this->iTitles[$i]);
+
+ // Adjust the text anchor position according to the choosen alignment
+ $xp = $x;
+ if( $this->iHeaderAlign == 'center' ) {
+ $xp = (($x-$this->iLeftColMargin)+($x+$this->iWidth[$i]))/2;
+ }
+ elseif( $this->iHeaderAlign == 'right' ) {
+ $xp = $x +$this->iWidth[$i]-$this->iRightColMargin;
+ }
+
+ $txt->Stroke($aImg,$xp,$yTop+$this->iTopHeaderMargin);
+ $x += $this->iWidth[$i];
+ if( $i < $n-1 ) {
+ $aImg->SetColor($this->iColor);
+ $aImg->Line($x,$yTop,$x,$aYBottom);
+ }
+ }
+
+ $aImg->SetColor($this->iColor);
+ $aImg->Line($aXLeft,$yTop, $aXRight,$yTop);
+
+ // Stroke vertical column dividers
+ $cols=array();
+ $this->GetColStart($aImg,$cols);
+ $n=count($cols);
+ for( $i=1; $i < $n; ++$i ) {
+ $this->vgrid->Stroke($aImg,$cols[$i],$aYBottom,$cols[$i],
+ $aImg->height - $aImg->bottom_margin);
+ }
+ }
+}
+
+
+//===================================================
+// CLASS GanttGraph
+// Description: Main class to handle gantt graphs
+//===================================================
+class GanttGraph extends Graph {
+ var $scale; // Public accessible
+ var $iObj=array(); // Gantt objects
+ var $iLabelHMarginFactor=0.2; // 10% margin on each side of the labels
+ var $iLabelVMarginFactor=0.4; // 40% margin on top and bottom of label
+ var $iLayout=GANTT_FROMTOP; // Could also be GANTT_EVEN
+ var $iSimpleFont = FF_FONT1,$iSimpleFontSize=11;
+ var $iSimpleStyle=GANTT_RDIAG,$iSimpleColor='yellow',$iSimpleBkgColor='red';
+ var $iSimpleProgressBkgColor='gray',$iSimpleProgressColor='darkgreen';
+ var $iSimpleProgressStyle=GANTT_SOLID;
+ var $hgrid=null;
+//---------------
+// CONSTRUCTOR
+ // Create a new gantt graph
+ function GanttGraph($aWidth=0,$aHeight=0,$aCachedName="",$aTimeOut=0,$aInline=true) {
+
+ // Backward compatibility
+ if( $aWidth == -1 ) $aWidth=0;
+ if( $aHeight == -1 ) $aHeight=0;
+
+ if( $aWidth< 0 || $aHeight < 0 ) {
+ JpgraphError::RaiseL(6002);
+//("You can't specify negative sizes for Gantt graph dimensions. Use 0 to indicate that you want the library to automatically determine a dimension.");
+ }
+ Graph::Graph($aWidth,$aHeight,$aCachedName,$aTimeOut,$aInline);
+ $this->scale = new GanttScale($this->img);
+
+ // Default margins
+ $this->img->SetMargin(15,17,25,15);
+
+ $this->hgrid = new HorizontalGridLine();
+
+ $this->scale->ShowHeaders(GANTT_HWEEK|GANTT_HDAY);
+ $this->SetBox();
+ }
+
+//---------------
+// PUBLIC METHODS
+
+ //
+
+ function SetSimpleFont($aFont,$aSize) {
+ $this->iSimpleFont = $aFont;
+ $this->iSimpleFontSize = $aSize;
+ }
+
+ function SetSimpleStyle($aBand,$aColor,$aBkgColor) {
+ $this->iSimpleStyle = $aBand;
+ $this->iSimpleColor = $aColor;
+ $this->iSimpleBkgColor = $aBkgColor;
+ }
+
+ // A utility function to help create basic Gantt charts
+ function CreateSimple($data,$constrains=array(),$progress=array()) {
+ $num = count($data);
+ for( $i=0; $i < $num; ++$i) {
+ switch( $data[$i][1] ) {
+ case ACTYPE_GROUP:
+ // Create a slightly smaller height bar since the
+ // "wings" at the end will make it look taller
+ $a = new GanttBar($data[$i][0],$data[$i][2],$data[$i][3],$data[$i][4],'',8);
+ $a->title->SetFont($this->iSimpleFont,FS_BOLD,$this->iSimpleFontSize);
+ $a->rightMark->Show();
+ $a->rightMark->SetType(MARK_RIGHTTRIANGLE);
+ $a->rightMark->SetWidth(8);
+ $a->rightMark->SetColor('black');
+ $a->rightMark->SetFillColor('black');
+
+ $a->leftMark->Show();
+ $a->leftMark->SetType(MARK_LEFTTRIANGLE);
+ $a->leftMark->SetWidth(8);
+ $a->leftMark->SetColor('black');
+ $a->leftMark->SetFillColor('black');
+
+ $a->SetPattern(BAND_SOLID,'black');
+ $csimpos = 6;
+ break;
+
+ case ACTYPE_NORMAL:
+ $a = new GanttBar($data[$i][0],$data[$i][2],$data[$i][3],$data[$i][4],'',10);
+ $a->title->SetFont($this->iSimpleFont,FS_NORMAL,$this->iSimpleFontSize);
+ $a->SetPattern($this->iSimpleStyle,$this->iSimpleColor);
+ $a->SetFillColor($this->iSimpleBkgColor);
+ // Check if this activity should have a constrain line
+ $n = count($constrains);
+ for( $j=0; $j < $n; ++$j ) {
+ if( empty($constrains[$j]) || (count($constrains[$j]) != 3) ) {
+ JpGraphError::RaiseL(6003,$j);
+//("Invalid format for Constrain parameter at index=$j in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Constrain-To,Constrain-Type)");
+ }
+ if( $constrains[$j][0]==$data[$i][0] ) {
+ $a->SetConstrain($constrains[$j][1],$constrains[$j][2],'black',ARROW_S2,ARROWT_SOLID);
+ }
+ }
+
+ // Check if this activity have a progress bar
+ $n = count($progress);
+ for( $j=0; $j < $n; ++$j ) {
+
+ if( empty($progress[$j]) || (count($progress[$j]) != 2) ) {
+ JpGraphError::RaiseL(6004,$j);
+//("Invalid format for Progress parameter at index=$j in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Progress)");
+ }
+ if( $progress[$j][0]==$data[$i][0] ) {
+ $a->progress->Set($progress[$j][1]);
+ $a->progress->SetHeight(0.5);
+ $a->progress->SetPattern($this->iSimpleProgressStyle,
+ $this->iSimpleProgressColor);
+ $a->progress->SetFillColor($this->iSimpleProgressBkgColor);
+ //$a->progress->SetPattern($progress[$j][2],$progress[$j][3]);
+ break;
+ }
+ }
+ $csimpos = 6;
+ break;
+
+ case ACTYPE_MILESTONE:
+ $a = new MileStone($data[$i][0],$data[$i][2],$data[$i][3]);
+ $a->title->SetFont($this->iSimpleFont,FS_NORMAL,$this->iSimpleFontSize);
+ $a->caption->SetFont($this->iSimpleFont,FS_NORMAL,$this->iSimpleFontSize);
+ $csimpos = 5;
+ break;
+ default:
+ die('Unknown activity type');
+ break;
+ }
+
+ // Setup caption
+ $a->caption->Set($data[$i][$csimpos-1]);
+
+ // Check if this activity should have a CSIM target ?
+ if( !empty($data[$i][$csimpos]) ) {
+ $a->SetCSIMTarget($data[$i][$csimpos]);
+ $a->SetCSIMAlt($data[$i][$csimpos+1]);
+ }
+ if( !empty($data[$i][$csimpos+2]) ) {
+ $a->title->SetCSIMTarget($data[$i][$csimpos+2]);
+ $a->title->SetCSIMAlt($data[$i][$csimpos+3]);
+ }
+
+ $this->Add($a);
+ }
+ }
+
+
+ // Set what headers should be shown
+ function ShowHeaders($aFlg) {
+ $this->scale->ShowHeaders($aFlg);
+ }
+
+ // Specify the fraction of the font height that should be added
+ // as vertical margin
+ function SetLabelVMarginFactor($aVal) {
+ $this->iLabelVMarginFactor = $aVal;
+ }
+
+ // Synonym to the method above
+ function SetVMarginFactor($aVal) {
+ $this->iLabelVMarginFactor = $aVal;
+ }
+
+
+ // Add a new Gantt object
+ function Add($aObject) {
+ if( is_array($aObject) && count($aObject) > 0 ) {
+ $cl = $aObject[0];
+ if( is_a($cl,'IconPlot') ) {
+ $this->AddIcon($aObject);
+ }
+ else {
+ $n = count($aObject);
+ for($i=0; $i < $n; ++$i)
+ $this->iObj[] = $aObject[$i];
+ }
+ }
+ else {
+ if( is_a($aObject,'IconPlot') ) {
+ $this->AddIcon($aObject);
+ }
+ else {
+ $this->iObj[] = $aObject;
+ }
+ }
+ }
+
+ // Override inherit method from Graph and give a warning message
+ function SetScale() {
+ JpGraphError::RaiseL(6005);
+//("SetScale() is not meaningfull with Gantt charts.");
+ }
+
+ // Specify the date range for Gantt graphs (if this is not set it will be
+ // automtically determined from the input data)
+ function SetDateRange($aStart,$aEnd) {
+ // Adjust the start and end so that the indicate the
+ // begining and end of respective start and end days
+ if( strpos($aStart,':') === false )
+ $aStart = date('Y-m-d 00:00',strtotime($aStart));
+ if( strpos($aEnd,':') === false )
+ $aEnd = date('Y-m-d 23:59',strtotime($aEnd));
+ $this->scale->SetRange($aStart,$aEnd);
+ }
+
+ // Get the maximum width of the activity titles columns for the bars
+ // The name is lightly misleading since we from now on can have
+ // multiple columns in the label section. When this was first written
+ // it only supported a single label, hence the name.
+ function GetMaxLabelWidth() {
+ $m=50;
+ if( $this->iObj != null ) {
+ $marg = $this->scale->actinfo->iLeftColMargin+$this->scale->actinfo->iRightColMargin;
+ $m = $this->iObj[0]->title->GetWidth($this->img)+$marg;
+ $n = count($this->iObj);
+ for($i=1; $i < $n; ++$i) {
+ if( !empty($this->iObj[$i]->title) ) {
+ if( $this->iObj[$i]->title->HasTabs() ) {
+ list($tot,$w) = $this->iObj[$i]->title->GetWidth($this->img,true);
+ $m=max($m,$tot);
+ }
+ else
+ $m=max($m,$this->iObj[$i]->title->GetWidth($this->img));
+ }
+ }
+ }
+ return $m;
+ }
+
+ // Get the maximum height of the titles for the bars
+ function GetMaxLabelHeight() {
+ $m=0;
+ if( $this->iObj != null ) {
+ $m = $this->iObj[0]->title->GetHeight($this->img);
+ $n = count($this->iObj);
+ for($i=1; $i < $n; ++$i) {
+ if( !empty($this->iObj[$i]->title) ) {
+ $m=max($m,$this->iObj[$i]->title->GetHeight($this->img));
+ }
+ }
+ }
+ return $m;
+ }
+
+ function GetMaxBarAbsHeight() {
+ $m=0;
+ if( $this->iObj != null ) {
+ $m = $this->iObj[0]->GetAbsHeight($this->img);
+ $n = count($this->iObj);
+ for($i=1; $i < $n; ++$i) {
+ $m=max($m,$this->iObj[$i]->GetAbsHeight($this->img));
+ }
+ }
+ return $m;
+ }
+
+ // Get the maximum used line number (vertical position) for bars
+ function GetBarMaxLineNumber() {
+ $m=0;
+ if( $this->iObj != null ) {
+ $m = $this->iObj[0]->GetLineNbr();
+ $n = count($this->iObj);
+ for($i=1; $i < $n; ++$i) {
+ $m=max($m,$this->iObj[$i]->GetLineNbr());
+ }
+ }
+ return $m;
+ }
+
+ // Get the minumum and maximum used dates for all bars
+ function GetBarMinMax() {
+ $start = 0 ;
+ $n = count($this->iObj);
+
+ while( $start < $n && $this->iObj[$start]->GetMaxDate() === false )
+ ++$start;
+ if( $start >= $n ) {
+ JpgraphError::RaiseL(6006);
+//('Cannot autoscale Gantt chart. No dated activities exist. [GetBarMinMax() start >= n]');
+ }
+
+ $max=$this->scale->NormalizeDate($this->iObj[$start]->GetMaxDate());
+ $min=$this->scale->NormalizeDate($this->iObj[$start]->GetMinDate());
+
+ for($i=$start+1; $i < $n; ++$i) {
+ $rmax = $this->scale->NormalizeDate($this->iObj[$i]->GetMaxDate());
+ if( $rmax != false )
+ $max=Max($max,$rmax);
+ $rmin = $this->scale->NormalizeDate($this->iObj[$i]->GetMinDate());
+ if( $rmin != false )
+ $min=Min($min,$rmin);
+ }
+ $minDate = date("Y-m-d",$min);
+ $min = strtotime($minDate);
+ $maxDate = date("Y-m-d 23:59",$max);
+ $max = strtotime($maxDate);
+ return array($min,$max);
+ }
+
+ // Create a new auto sized canvas if the user hasn't specified a size
+ // The size is determined by what scale the user has choosen and hence
+ // the minimum width needed to display the headers. Some margins are
+ // also added to make it better looking.
+ function AutoSize() {
+ if( $this->img->img == null ) {
+ // The predefined left, right, top, bottom margins.
+ // Note that the top margin might incease depending on
+ // the title.
+ $lm = $this->img->left_margin;
+ $rm = $this->img->right_margin;
+ $rm += 2 ;
+ $tm = $this->img->top_margin;
+ $bm = $this->img->bottom_margin;
+ $bm += 1;
+ if( BRAND_TIMING ) $bm += 10;
+
+ // First find out the height
+ $n=$this->GetBarMaxLineNumber()+1;
+ $m=max($this->GetMaxLabelHeight(),$this->GetMaxBarAbsHeight());
+ $height=$n*((1+$this->iLabelVMarginFactor)*$m);
+
+ // Add the height of the scale titles
+ $h=$this->scale->GetHeaderHeight();
+ $height += $h;
+
+ // Calculate the top margin needed for title and subtitle
+ if( $this->title->t != "" ) {
+ $tm += $this->title->GetFontHeight($this->img);
+ }
+ if( $this->subtitle->t != "" ) {
+ $tm += $this->subtitle->GetFontHeight($this->img);
+ }
+
+ // ...and then take the bottom and top plot margins into account
+ $height += $tm + $bm + $this->scale->iTopPlotMargin + $this->scale->iBottomPlotMargin;
+ // Now find the minimum width for the chart required
+
+ // If day scale or smaller is shown then we use the day font width
+ // as the base size unit.
+ // If only weeks or above is displayed we use a modified unit to
+ // get a smaller image.
+ if( $this->scale->IsDisplayHour() || $this->scale->IsDisplayMinute() ) {
+ // Add 2 pixel margin on each side
+ $fw=$this->scale->day->GetFontWidth($this->img)+4;
+ }
+ elseif( $this->scale->IsDisplayWeek() ) {
+ $fw = 8;
+ }
+ elseif( $this->scale->IsDisplayMonth() ) {
+ $fw = 4;
+ }
+ else {
+ $fw = 2;
+ }
+
+ $nd=$this->scale->GetNumberOfDays();
+
+ if( $this->scale->IsDisplayDay() ) {
+ // If the days are displayed we also need to figure out
+ // how much space each day's title will require.
+ switch( $this->scale->day->iStyle ) {
+ case DAYSTYLE_LONG :
+ $txt = "Monday";
+ break;
+ case DAYSTYLE_LONGDAYDATE1 :
+ $txt = "Monday 23 Jun";
+ break;
+ case DAYSTYLE_LONGDAYDATE2 :
+ $txt = "Monday 23 Jun 2003";
+ break;
+ case DAYSTYLE_SHORT :
+ $txt = "Mon";
+ break;
+ case DAYSTYLE_SHORTDAYDATE1 :
+ $txt = "Mon 23/6";
+ break;
+ case DAYSTYLE_SHORTDAYDATE2 :
+ $txt = "Mon 23 Jun";
+ break;
+ case DAYSTYLE_SHORTDAYDATE3 :
+ $txt = "Mon 23";
+ break;
+ case DAYSTYLE_SHORTDATE1 :
+ $txt = "23/6";
+ break;
+ case DAYSTYLE_SHORTDATE2 :
+ $txt = "23 Jun";
+ break;
+ case DAYSTYLE_SHORTDATE3 :
+ $txt = "Mon 23";
+ break;
+ case DAYSTYLE_SHORTDATE4 :
+ $txt = "88";
+ break;
+ case DAYSTYLE_CUSTOM :
+ $txt = date($this->scale->day->iLabelFormStr,
+ strtotime('2003-12-20 18:00'));
+ break;
+ case DAYSTYLE_ONELETTER :
+ default:
+ $txt = "M";
+ break;
+ }
+ $fw = $this->scale->day->GetStrWidth($this->img,$txt)+6;
+ }
+
+ // If we have hours enabled we must make sure that each day has enough
+ // space to fit the number of hours to be displayed.
+ if( $this->scale->IsDisplayHour() ) {
+ // Depending on what format the user has choose we need different amount
+ // of space. We therefore create a typical string for the choosen format
+ // and determine the length of that string.
+ switch( $this->scale->hour->iStyle ) {
+ case HOURSTYLE_HMAMPM:
+ $txt = '12:00pm';
+ break;
+ case HOURSTYLE_H24:
+ // 13
+ $txt = '24';
+ break;
+ case HOURSTYLE_HAMPM:
+ $txt = '12pm';
+ break;
+ case HOURSTYLE_CUSTOM:
+ $txt = date($this->scale->hour->iLabelFormStr,strtotime('2003-12-20 18:00'));
+ break;
+ case HOURSTYLE_HM24:
+ default:
+ $txt = '24:00';
+ break;
+ }
+
+ $hfw = $this->scale->hour->GetStrWidth($this->img,$txt)+6;
+ $mw = $hfw;
+ if( $this->scale->IsDisplayMinute() ) {
+ // Depending on what format the user has choose we need different amount
+ // of space. We therefore create a typical string for the choosen format
+ // and determine the length of that string.
+ switch( $this->scale->minute->iStyle ) {
+ case HOURSTYLE_CUSTOM:
+ $txt2 = date($this->scale->minute->iLabelFormStr,strtotime('2005-05-15 18:55'));
+ break;
+ case MINUTESTYLE_MM:
+ default:
+ $txt2 = '15';
+ break;
+ }
+
+ $mfw = $this->scale->minute->GetStrWidth($this->img,$txt2)+6;
+ $n2 = ceil(60 / $this->scale->minute->GetIntervall() );
+ $mw = $n2 * $mfw;
+ }
+ $hfw = $hfw < $mw ? $mw : $hfw ;
+ $n = ceil(24*60 / $this->scale->TimeToMinutes($this->scale->hour->GetIntervall()) );
+ $hw = $n * $hfw;
+ $fw = $fw < $hw ? $hw : $fw ;
+ }
+
+ // We need to repeat this code block here as well.
+ // THIS iS NOT A MISTAKE !
+ // We really need it since we need to adjust for minutes both in the case
+ // where hour scale is shown and when it is not shown.
+
+ if( $this->scale->IsDisplayMinute() ) {
+ // Depending on what format the user has choose we need different amount
+ // of space. We therefore create a typical string for the choosen format
+ // and determine the length of that string.
+ switch( $this->scale->minute->iStyle ) {
+ case HOURSTYLE_CUSTOM:
+ $txt = date($this->scale->minute->iLabelFormStr,strtotime('2005-05-15 18:55'));
+ break;
+ case MINUTESTYLE_MM:
+ default:
+ $txt = '15';
+ break;
+ }
+
+ $mfw = $this->scale->minute->GetStrWidth($this->img,$txt)+6;
+ $n = ceil(60 / $this->scale->TimeToMinutes($this->scale->minute->GetIntervall()) );
+ $mw = $n * $mfw;
+ $fw = $fw < $mw ? $mw : $fw ;
+ }
+
+ // If we display week we must make sure that 7*$fw is enough
+ // to fit up to 10 characters of the week font (if the week is enabled)
+ if( $this->scale->IsDisplayWeek() ) {
+ // Depending on what format the user has choose we need different amount
+ // of space
+ $fsw = strlen($this->scale->week->iLabelFormStr);
+ if( $this->scale->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR ) {
+ $fsw += 8;
+ }
+ elseif( $this->scale->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR ) {
+ $fsw += 7;
+ }
+ else {
+ $fsw += 4;
+ }
+
+ $ww = $fsw*$this->scale->week->GetFontWidth($this->img);
+ if( 7*$fw < $ww ) {
+ $fw = ceil($ww/7);
+ }
+ }
+
+ if( !$this->scale->IsDisplayDay() && !$this->scale->IsDisplayHour() &&
+ !( ($this->scale->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR ||
+ $this->scale->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) && $this->scale->IsDisplayWeek() ) ) {
+ // If we don't display the individual days we can shrink the
+ // scale a little bit. This is a little bit pragmatic at the
+ // moment and should be re-written to take into account
+ // a) What scales exactly are shown and
+ // b) what format do they use so we know how wide we need to
+ // make each scale text space at minimum.
+ $fw /= 2;
+ if( !$this->scale->IsDisplayWeek() ) {
+ $fw /= 1.8;
+ }
+ }
+
+ $cw = $this->GetMaxActInfoColWidth() ;
+ $this->scale->actinfo->SetMinColWidth($cw);
+ if( $this->img->width <= 0 ) {
+ // Now determine the width for the activity titles column
+
+ // Firdst find out the maximum width of each object column
+ $titlewidth = max(max($this->GetMaxLabelWidth(),
+ $this->scale->tableTitle->GetWidth($this->img)),
+ $this->scale->actinfo->GetWidth($this->img));
+
+ // Add the width of the vertivcal divider line
+ $titlewidth += $this->scale->divider->iWeight*2;
+
+
+ // Now get the total width taking
+ // titlewidth, left and rigt margin, dayfont size
+ // into account
+ $width = $titlewidth + $nd*$fw + $lm+$rm;
+ }
+ else {
+ $width = $this->img->width;
+ }
+
+ $width = round($width);
+ $height = round($height);
+ if( $width > MAX_GANTTIMG_SIZE_W || $height > MAX_GANTTIMG_SIZE_H ) {
+ JpgraphError::RaiseL(6007,$width,$height);
+//("Sanity check for automatic Gantt chart size failed. Either the width (=$width) or height (=$height) is larger than MAX_GANTTIMG_SIZE. This could potentially be caused by a wrong date in one of the activities.");
+ }
+
+ $this->img->CreateImgCanvas($width,$height);
+ $this->img->SetMargin($lm,$rm,$tm,$bm);
+ }
+ }
+
+ // Return an array width the maximum width for each activity
+ // column. This is used when we autosize the columns where we need
+ // to find out the maximum width of each column. In order to do that we
+ // must walk through all the objects, sigh...
+ function GetMaxActInfoColWidth() {
+ $n = count($this->iObj);
+ if( $n == 0 ) return;
+ $w = array();
+ $m = $this->scale->actinfo->iLeftColMargin + $this->scale->actinfo->iRightColMargin;
+
+ for( $i=0; $i < $n; ++$i ) {
+ $tmp = $this->iObj[$i]->title->GetColWidth($this->img,$m);
+ $nn = count($tmp);
+ for( $j=0; $j < $nn; ++$j ) {
+ if( empty($w[$j]) )
+ $w[$j] = $tmp[$j];
+ else
+ $w[$j] = max($w[$j],$tmp[$j]);
+ }
+ }
+ return $w;
+ }
+
+ // Stroke the gantt chart
+ function Stroke($aStrokeFileName="") {
+
+
+ // If the filename is the predefined value = '_csim_special_'
+ // we assume that the call to stroke only needs to do enough
+ // to correctly generate the CSIM maps.
+ // We use this variable to skip things we don't strictly need
+ // to do to generate the image map to improve performance
+ // a best we can. Therefor you will see a lot of tests !$_csim in the
+ // code below.
+ $_csim = ($aStrokeFileName===_CSIM_SPECIALFILE);
+
+ // Should we autoscale dates?
+ if( !$this->scale->IsRangeSet() ) {
+ list($min,$max) = $this->GetBarMinMax();
+ $this->scale->SetRange($min,$max);
+ }
+
+ $this->scale->AdjustStartEndDay();
+
+ // Check if we should autoscale the image
+ $this->AutoSize();
+
+ // Should we start from the top or just spread the bars out even over the
+ // available height
+ $this->scale->SetVertLayout($this->iLayout);
+ if( $this->iLayout == GANTT_FROMTOP ) {
+ $maxheight=max($this->GetMaxLabelHeight(),$this->GetMaxBarAbsHeight());
+ $this->scale->SetVertSpacing($maxheight*(1+$this->iLabelVMarginFactor));
+ }
+ // If it hasn't been set find out the maximum line number
+ if( $this->scale->iVertLines == -1 )
+ $this->scale->iVertLines = $this->GetBarMaxLineNumber()+1;
+
+ $maxwidth=max($this->scale->actinfo->GetWidth($this->img),
+ max($this->GetMaxLabelWidth(),
+ $this->scale->tableTitle->GetWidth($this->img)));
+
+ $this->scale->SetLabelWidth($maxwidth+$this->scale->divider->iWeight);//*(1+$this->iLabelHMarginFactor));
+
+ if( !$_csim ) {
+ $this->StrokePlotArea();
+ if( $this->iIconDepth == DEPTH_BACK ) {
+ $this->StrokeIcons();
+ }
+ }
+
+ $this->scale->Stroke();
+
+ if( !$_csim ) {
+ // Due to a minor off by 1 bug we need to temporarily adjust the margin
+ $this->img->right_margin--;
+ $this->StrokePlotBox();
+ $this->img->right_margin++;
+ }
+
+ // Stroke Grid line
+ $this->hgrid->Stroke($this->img,$this->scale);
+
+ $n = count($this->iObj);
+ for($i=0; $i < $n; ++$i) {
+ //$this->iObj[$i]->SetLabelLeftMargin(round($maxwidth*$this->iLabelHMarginFactor/2));
+ $this->iObj[$i]->Stroke($this->img,$this->scale);
+ }
+
+ $this->StrokeTitles();
+
+ if( !$_csim ) {
+ $this->StrokeConstrains();
+ $this->footer->Stroke($this->img);
+
+ if( $this->iIconDepth == DEPTH_FRONT) {
+ $this->StrokeIcons();
+ }
+
+ // Should we do any final image transformation
+ if( $this->iImgTrans ) {
+ if( !class_exists('ImgTrans') ) {
+ require_once('jpgraph_imgtrans.php');
+ }
+
+ $tform = new ImgTrans($this->img->img);
+ $this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist,
+ $this->iImgTransDirection,$this->iImgTransHighQ,
+ $this->iImgTransMinSize,$this->iImgTransFillColor,
+ $this->iImgTransBorder);
+ }
+
+
+ // If the filename is given as the special "__handle"
+ // then the image handler is returned and the image is NOT
+ // streamed back
+ if( $aStrokeFileName == _IMG_HANDLER ) {
+ return $this->img->img;
+ }
+ else {
+ // Finally stream the generated picture
+ $this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,
+ $aStrokeFileName);
+ }
+ }
+ }
+
+ function StrokeConstrains() {
+ $n = count($this->iObj);
+
+ // Stroke all constrains
+ for($i=0; $i < $n; ++$i) {
+
+ // Some gantt objects may not have constraints associated with them
+ // for example we can add IconPlots which doesn't have this property.
+ if( empty($this->iObj[$i]->constraints) ) continue;
+
+ $numConstrains = count($this->iObj[$i]->constraints);
+
+ for( $k = 0; $k < $numConstrains; $k++ ) {
+ $vpos = $this->iObj[$i]->constraints[$k]->iConstrainRow;
+ if( $vpos >= 0 ) {
+ $c1 = $this->iObj[$i]->iConstrainPos;
+
+ // Find out which object is on the target row
+ $targetobj = -1;
+ for( $j=0; $j < $n && $targetobj == -1; ++$j ) {
+ if( $this->iObj[$j]->iVPos == $vpos ) {
+ $targetobj = $j;
+ }
+ }
+ if( $targetobj == -1 ) {
+ JpGraphError::RaiseL(6008,$this->iObj[$i]->iVPos,$vpos);
+//('You have specifed a constrain from row='.$this->iObj[$i]->iVPos.' to row='.$vpos.' which does not have any activity.');
+ }
+ $c2 = $this->iObj[$targetobj]->iConstrainPos;
+ if( count($c1) == 4 && count($c2 ) == 4) {
+ switch( $this->iObj[$i]->constraints[$k]->iConstrainType ) {
+ case CONSTRAIN_ENDSTART:
+ if( $c1[1] < $c2[1] ) {
+ $link = new GanttLink($c1[2],$c1[3],$c2[0],$c2[1]);
+ }
+ else {
+ $link = new GanttLink($c1[2],$c1[1],$c2[0],$c2[3]);
+ }
+ $link->SetPath(3);
+ break;
+ case CONSTRAIN_STARTEND:
+ if( $c1[1] < $c2[1] ) {
+ $link = new GanttLink($c1[0],$c1[3],$c2[2],$c2[1]);
+ }
+ else {
+ $link = new GanttLink($c1[0],$c1[1],$c2[2],$c2[3]);
+ }
+ $link->SetPath(0);
+ break;
+ case CONSTRAIN_ENDEND:
+ if( $c1[1] < $c2[1] ) {
+ $link = new GanttLink($c1[2],$c1[3],$c2[2],$c2[1]);
+ }
+ else {
+ $link = new GanttLink($c1[2],$c1[1],$c2[2],$c2[3]);
+ }
+ $link->SetPath(1);
+ break;
+ case CONSTRAIN_STARTSTART:
+ if( $c1[1] < $c2[1] ) {
+ $link = new GanttLink($c1[0],$c1[3],$c2[0],$c2[1]);
+ }
+ else {
+ $link = new GanttLink($c1[0],$c1[1],$c2[0],$c2[3]);
+ }
+ $link->SetPath(3);
+ break;
+ default:
+ JpGraphError::RaiseL(6009,$this->iObj[$i]->iVPos,$vpos);
+//('Unknown constrain type specified from row='.$this->iObj[$i]->iVPos.' to row='.$vpos);
+ break;
+ }
+
+ $link->SetColor($this->iObj[$i]->constraints[$k]->iConstrainColor);
+ $link->SetArrow($this->iObj[$i]->constraints[$k]->iConstrainArrowSize,
+ $this->iObj[$i]->constraints[$k]->iConstrainArrowType);
+
+ $link->Stroke($this->img);
+ }
+ }
+ }
+ }
+ }
+
+ function GetCSIMAreas() {
+ if( !$this->iHasStroked )
+ $this->Stroke(_CSIM_SPECIALFILE);
+
+ $csim = $this->title->GetCSIMAreas();
+ $csim .= $this->subtitle->GetCSIMAreas();
+ $csim .= $this->subsubtitle->GetCSIMAreas();
+
+ $n = count($this->iObj);
+ for( $i=$n-1; $i >= 0; --$i )
+ $csim .= $this->iObj[$i]->GetCSIMArea();
+ return $csim;
+ }
+}
+
+//===================================================
+// CLASS PredefIcons
+// Description: Predefined icons for use with Gantt charts
+//===================================================
+DEFINE('GICON_WARNINGRED',0);
+DEFINE('GICON_TEXT',1);
+DEFINE('GICON_ENDCONS',2);
+DEFINE('GICON_MAIL',3);
+DEFINE('GICON_STARTCONS',4);
+DEFINE('GICON_CALC',5);
+DEFINE('GICON_MAGNIFIER',6);
+DEFINE('GICON_LOCK',7);
+DEFINE('GICON_STOP',8);
+DEFINE('GICON_WARNINGYELLOW',9);
+DEFINE('GICON_FOLDEROPEN',10);
+DEFINE('GICON_FOLDER',11);
+DEFINE('GICON_TEXTIMPORTANT',12);
+
+class PredefIcons {
+ var $iBuiltinIcon = null;
+ var $iLen = -1 ;
+
+ function GetLen() {
+ return $this->iLen ;
+ }
+
+ function GetImg($aIdx) {
+ if( $aIdx < 0 || $aIdx >= $this->iLen ) {
+ JpGraphError::RaiseL(6010,$aIdx);
+//('Illegal icon index for Gantt builtin icon ['.$aIdx.']');
+ }
+ return Image::CreateFromString(base64_decode($this->iBuiltinIcon[$aIdx][1]));
+ }
+
+ function PredefIcons() {
+ //==========================================================
+ // warning.png
+ //==========================================================
+ $this->iBuiltinIcon[0][0]= 1043 ;
+ $this->iBuiltinIcon[0][1]=
+ 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'.
+ 'B3RJTUUH0wgKFSgilWPhUQAAA6BJREFUeNrtl91rHFUYh5/3zMx+Z5JNUoOamCZNaqTZ6IWIkqRiQWmi1IDetHfeiCiltgXBP8AL'.
+ '0SIUxf/AvfRSBS9EKILFFqyIH9CEmFZtPqrBJLs7c+b1YneT3WTTbNsUFPLCcAbmzPt73o9zzgzs2Z793231UOdv3w9k9Z2uzOdA'.
+ '5+2+79yNeL7Hl7hw7oeixRMZ6PJM26W18DNAm/Vh7lR8fqh97NmMF11es1iFpMATqdirwMNA/J4DpIzkr5YsAF1PO6gIMYHRdPwl'.
+ 'oO2elmB+qH3sm7XozbkgYvy8SzYnZPtcblyM6I+5z3jQ+0vJfgpEu56BfI9vUkbyi2HZd1QJoeWRiAjBd4SDCW8SSAOy6wBHMzF7'.
+ 'YdV2A+ROuvRPLfHoiSU0EMY/cDAIhxJeGngKaN1VgHyPL7NBxI1K9P4QxBzw3K1zJ/zkG8B9uwaQ7/HNsRZv9kohBGD0o7JqMYS/'.
+ '/ynPidQw/LrBiPBcS/yFCT95DvB2BWAy4575PaQbQKW+tPd3GCItu2odKI++YxiKu0d26oWmAD7paZU/rLz37VqIijD2YbnzNBBE'.
+ 'IBHf8K8qjL7vYhCGErEU8CTg3xXAeMp96GrJEqkyXkm9Bhui1xfsunjdGhcYLq+IzjsGmBt5YH/cmJkFq6gIqlon3u4LxdKGuCIo'.
+ 'Qu41g0E41po+2R33Xt5uz9kRIB2UTle7PnfKrROP1HD4sRjZlq0lzhwoZ6rDNeTi3nEg1si/7FT7kYQbXS6E5E65tA5uRF9tutq0'.
+ 'K/VwAF+/FbIYWt6+tjQM/AqUms7A4Wy6d7YSfSNxgMmzi0ycWWworio4QJvj4LpuL5BqugTnXzzqJsJwurrlNhJXFaavW67NRw3F'.
+ 'q+aJcCQVe9fzvJGmAY7/dPH0gi0f64OveGxa+usCuQMeZ0+kt8BVrX+qPO9Bzx0MgqBvs+a2PfDdYIf+WAjXU1ub4tqNaPPzRs8A'.
+ 'blrli+WVn79cXn0cWKl+tGx7HLc7pu3CSmnfitL+l1UihAhwjFkPQev4K/fSABjBM8JCaFuurJU+rgW41SroA8aNMVNAFtgHJCsn'.
+ 'XGy/58QVxAC9MccJtZ5kIzNlW440WrJ2ea4YPA9cAooA7i0A/gS+iqLoOpB1HOegqrYB3UBmJrAtQAJwpwPr1Ry92wVlgZsiYlW1'.
+ 'uX1gU36dymgqYxJIJJNJT1W9QqHgNwFQBGYqo94OwHZQUuPD7ACglSvc+5n5T9m/wfJJX4U9qzEAAAAASUVORK5CYII=' ;
+
+ //==========================================================
+ // edit.png
+ //==========================================================
+ $this->iBuiltinIcon[1][0]= 959 ;
+ $this->iBuiltinIcon[1][1]=
+ 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAFgAWABY9j+ZuwAAAAlwSFlz'.
+ 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AKDAwbIEXOA6AAAAM8SURBVHicpdRPaBxlHMbx76ZvsmOTmm1dsEqQSIIsEmGVBAQjivEQ'.
+ 'PAUJngpWsAWlBw8egpQepKwplN4ULEG9CjkEyUFKlSJrWTG0IU51pCsdYW2ncUPjdtp9Z+f3vuNhu8nKbmhaf5cZeGc+PO8zf1Lc'.
+ 'm0KhkACICCKCMeaBjiLC0tLSnjNvPmuOHRpH0TZTU1M8zBi9wakzn7OFTs5sw8YYACYmJrre7HkeuVyu69qPF77hlT1XmZ0eQ03O'.
+ 'wOLJTvhBx1rLz18VmJ0eY+jVd2FxDkKXnvYLHgb97OgLzE4ON9Hzc1B1QaQzsed5O0Lta3Ec89OnR5h5McfQ+Mw2qgQUnfBOPbZ3'.
+ 'bK3l+xOvMT0+3ERLp5FNF6UEjcL32+DdVmGt5WLhDYYPZrbRqreFumXwql0S3w9tnDvLWD5PZigPpdOwuYpSCo3C8wU3UHxQdHbf'.
+ 'cZIkNM6dxcnlUM4k1eUFMlUPpUADbpkttFarHe6oYqeOr6yt4RzMQHYUcUsQVtGicHDwKprViuLDkkOtVnsHCHZVRVy/zcj1i5Af'.
+ 'h8AjdIts+hUcGcYPK3iBtKM3gD/uAzf/AdY2mmmVgy6X8YNNKmGIvyloPcB8SUin07RQ4EZHFdsdG0wkJEnEaHAJxvKEpSLeaokV'.
+ 'r4zWmhUZYLlY4b1D03y5eIEWCtS7vsciAgiIxkQRabWOrlQor66y4pUphoJb1jiO4uO5o0S3q6RSqVbiOmC7VCEgAhLSaDQ48dH7'.
+ 'vD46REY0iysegSjKQciRt99ib7qXwX0O+pG4teM6YKHLB9JMq4mTmF9/+AKA4wvLZByH7OgYL7+UY2qvw/7Bfg5kHiXjJFyv3CGO'.
+ 'Y1rof+BW4t/XLiPG0DCGr79d4XzRxRnIMn98huXSTYyJ6et1UNYQhRvcinpJq86H3wGPPPM0iBDd+QffD1g4eZjLvuG7S1Wef26E'.
+ 'J7L7eSx7gAHVg7V3MSbi6m/r93baBd6qQjerAJg/9Ql/XrvG0ON1+vv7GH3qSfY5fahUnSTpwZgIEQesaVXRPbHRG/xyJSAxMYlp'.
+ 'EOm71HUINiY7mGb95l/8jZCyQmJjMDGJjUmsdCROtZ0n/P/Z8v4Fs2MTUUf7vYoAAAAASUVORK5CYII=' ;
+
+ //==========================================================
+ // endconstrain.png
+ //==========================================================
+ $this->iBuiltinIcon[2][0]= 666 ;
+ $this->iBuiltinIcon[2][1]=
+ 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'.
+ 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9ALEREILkh0+eQAAAIXSURBVHictZU9aFNRFMd/N81HX77aptJUWmp1LHRpIcWhg5sIDlUQ'.
+ 'LAXB4t7RRUpwEhy7iQ46CCIoSHcl0CFaoVARU2MFMYktadLXJNok7x2HtCExvuYFmnO4w/3gx+Gc/z1HKRTdMEdXqHbB/sgc/sic'.
+ 'nDoYAI8XwDa8o1RMLT+2hAsigtTvbIGVqhX46szUifBGswUeCPgAGB7QeLk0X4Ork+HOxo1VgSqGASjMqkn8W4r4vVtEgI/RRQEL'.
+ 'vaoGD85cl5V3nySR/S1mxWxab7f35PnntNyMJeRr9kCMqiHTy09EoeToLwggx6ymiMOD/VwcD7Oa/MHkcIiQx026WGYto5P/U+ZZ'.
+ '7gD0QwDuT5z9N3LrVPi0Xs543eQPKkRzaS54eviJIp4tMFQFMllAWN2qcRZHBnixNM8NYD162xq8u7ePSQ+GX2Pjwxc2dB2cLtB8'.
+ '7GgamCb0anBYBeChMtl8855CarclxU1gvViiUK4w2OMkNDnGeJ8bt9fH90yOnOkCwLFTwhzykhvtYzOWoBBbY//R3dbaNTYhf2RO'.
+ 'QpeuUMzv188MlwuHy0H13HnE48UzMcL0WAtUHX8OxZHoG1URiFw7rnLLCswuSPD1ulze/iWjT2PSf+dBXRFtVVGIvzqph0pQL7VE'.
+ 'avXYaXXxPwsnt0imdttCocMmZBdK7YU9D8wuNOW0nXc6QWzPsSa5naZ1beb9BbGB6dxGtMnXAAAAAElFTkSuQmCC' ;
+
+ //==========================================================
+ // mail.png
+ //==========================================================
+ $this->iBuiltinIcon[3][0]= 1122 ;
+ $this->iBuiltinIcon[3][1]=
+ 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'.
+ 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AJHAMfFvL9OU8AAAPfSURBVHictZRdaBRXFMd/987H7tbNx8aYtGCrEexDsOBDaKHFxirb'.
+ 'h0qhsiY0ykppKq1osI99C4H2WSiFFMHWUhXBrjRi0uCmtSEUGgP1QWqhWjGkoW7M1kTX3WRn5p4+TJJNGolQ6IXDnDtz+N0z/3PP'.
+ 'UWBIpdpYa23b9g09PZ2kUrOrvmUyGVKp1Ao/mUyi56YnVgWfO/P1CihAd/dJMpmaNROIRq8BkM1m0bH6TasC3j6QXgFdXI+DR6PR'.
+ 'JX/Pno8B+KLnMKqlpUU8z8MYs2RBEDzWf9J+0RcRbMdxGBsbw/fmCXwPMUEYID4iAVp8wIRmDIHMo4yHSIBSASKC+CWE0C/PF9jU'.
+ '3B6Cp+4M07C5FUtKGNvGwQJctPgIsgD2wRhEIqAMGB+UQYkHJgYYZD7P1HwVlmWhHcfhyk83KeRGUW4t6CgoG5SNUS4KBWgQDUov'.
+ '7AGlwYASBVqH0Bk49dXpCviVV3dw/tI1Bvr7kMIIlh0NYUpjlF0BAYvcxSXmEVLKceHSCJm+PnbueBHbtkNwTXUNBzo6aGpq4sSZ'.
+ 'GwT5H7BsF6Wdf1GWHQAoM0upeI9PT1yioS7B7tdaSdSuw7KsUGMAy7HYsmUztTW1nMwM0txssX1rlHjjS5jy/Uq2YkK/eJuLl6/z'.
+ 'x+1xkslW6mrixGIODx8EFSlEBC0+tmXT0NhA2763iEUjnLv4C8XpUbSbAB1mKkGJ3J83Od77HW5EszvZSqK2iljMIeJaRGNuJePF'.
+ '6mspY7BJ1DXwQnCd2fxGRq5OUCz8xt72dyhMZcn++Cu3xu9SKhdp2b4ZHWnAtTSxmIWlhcIjlksR3lNBYzlxZsb7+f7ne+xtSzOd'.
+ 'u83szH1OnThOPp/n+a0beeP1l4mvq+PU2Qyd+5PY1RuwlAqLYFaBfbTbyPSdfgaH77A//QF4f1O/vpr6RJyq+C5Kc/M8FbFxXItY'.
+ 'xOHDrvfo/fxLDnbsJBp5BowBReVWYAzabeTh5ABDw7cWoNNL3YYYNtSv57lnn6Z+Qx01VeuIuBa2DV1HD3H63BAPZu4u1WGpeLHq'.
+ 'Rh7+NcjA0O+0p4+CNwXigwnbWlQQdpuEpli+n+PIkcOc//YKuckJJFh2K2anrjFw+QZt6S6kPImIF/b+cqAJD1LihWAxC61twBTo'.
+ 'fPcQF/oGsVW5ovHQlavs2/8+uYnRVSOUgHAmmAClBIOBwKC0gPjhIRgEIX2wg7NnwpZW3d3d4vs+vu8TBMGK51rvPM9b8hdteZxd'.
+ 'LBbVR8feJDs0Rlv6GFKeXJ21rNRXESxMPR+CBUl0nN7PjtO+dye7Up/8v1I88bf/ixT/AO1/hZsqW+C6AAAAAElFTkSuQmCC' ;
+
+ //==========================================================
+ // startconstrain.png
+ //==========================================================
+ $this->iBuiltinIcon[4][0]= 725 ;
+ $this->iBuiltinIcon[4][1]=
+ 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'.
+ 'AAALDgAACw4BQL7hQQAAAAd0SU1FB9ALEREICJp5fBkAAAJSSURBVHic3dS9a1NRGMfx77kxtS+xqS9FG6p1ER3qVJpBQUUc3CRU'.
+ 'BwURVLB1EAuKIP0THJQiiNRJBK3iJl18AyeltRZa0bbaJMbUNmlNSm5e7s25j0NqpSSmyag/OMM9POdzDuflwn8djz8gClVRrVEV'.
+ 'ur4Bl1FTNSzLrSS6vbml0jUUwSXj8Qfk3PkLtLW2AeBIybmrgz3+gFzpucjlE4f4btuFTuWuCF5XDr3a3UPf6cM8GQvxzbsRAJdh'.
+ 'ScfxSywml5j7mVypN0eGEJ0tebIre+zxB6Tv7jPReS2hREpOvpmUXU+H5eC913JnNCSRVE60pUVbWoZjprR39Yq70bdqj4pW7PEH'.
+ '5FpvL9e79jOTTHM7ssDL6CJZ08LbvAGnrpZg2mI2Z/MlZfN8IkxuSwu4V9+WIrj7zFlOHfXzKrLIi2SGh5ECKjnNVNxkQEc55vOw'.
+ 'rb6O8JLFdHyJ+ayFElUeHvjwkfteL/V7fKTSkFvIQE4DoLI2Mz/muTkTApcBKIwaN8pwIUrKw+ajWwDknAO0d/r4zFaMuRS63sWm'.
+ 'RoOdm+vRIriUYjKexrQV+t1o0YEVwfZSVJmD/dIABJuO0LG3lRFx0GOfiAELE9OgCrfU0XnIp5FwGLEy5WEAOxlR5uN+ARhP7GN3'.
+ '5w7Gv4bQI2+xpt4jjv2nWBmIlcExE2vDAHYioszBZXw6CPE4ADoWVHmd/tuwlZR9eXYyoszBfpiNQqaAOU5+TXRN+DeeenADPT9b'.
+ 'EVgKVsutKPl0TGWGhwofoquaoKK4apsq/tH/e/kFwBMXLgAEKK4AAAAASUVORK5CYII=' ;
+
+ //==========================================================
+ // calc.png
+ //==========================================================
+ $this->iBuiltinIcon[5][0]= 589 ;
+ $this->iBuiltinIcon[5][1]=
+ 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAA4AIwBbgMF12wAAAAlwSFlz'.
+ 'AAALEQAACxEBf2RfkQAAAAd0SU1FB9AHBxQeFsqn0wQAAAHKSURBVHicnZWff+RAGIef3U/gcOEgUAgUCgcLhYXCwsHBQeGgUDgs'.
+ 'FgMHB4VA/4Bg4XChWFgIFIqBwkJhsRAYeOGF+TQHmWSTTbKd9pU37/x45jvfTDITXEynAbdWKVQB0NazcVm0alcL4rJaRVzm+w/e'.
+ '3iwAkzbYRcnnYgI04GCvsxxSPabYaEdt2Ra6D0atcvvvDmyrMWBX1zPq2ircP/Tk98DiJtjV/fim6ziOCL6dDHZNhxQ3arIMsox4'.
+ 'vejleL2Ay9+jaw6A+4OSICG2cacGKhsGxg+CxeqAQS0Y7BYJvowq7iGMOhXHEfzpvpQkA9bLKgOgWKt+4Lo1mM9hs9m17QNsJ70P'.
+ 'Fjc/O52joogoX8MZKiBiAFxd9Z1vcj9wfSpUlDRNMcYQxzFpmnJ0FPH8nDe1MQaWSz9woQpWSZKEojDkeaWoKAyr1tlu+s48wfVx'.
+ 'u7n5i7jthmGIiEGcT+36PP+gFeJrxWLhb0UA/lb4ggGs1T0rZs0zwM/ZjNfilcIY5tutPxgOW3F6dUX464LrKILLiw+A7WErrl+2'.
+ 'rABG1EL/BilZP8DjU2uR4U+2E49P1Z8QJmNXUzl24A9GBT0IruCfi86d9x+D12RGzt+pNAAAAABJRU5ErkJggg==' ;
+
+ //==========================================================
+ // mag.png
+ //==========================================================
+ $this->iBuiltinIcon[6][0]= 1415 ;
+ $this->iBuiltinIcon[6][1]=
+ 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'.
+ 'AAALDAAACwwBP0AiyAAAAAd0SU1FB9ALDxEWDY6Ul+UAAAUESURBVHicdZVrbFRFGIafsyyF0nalV1R6WiggaAptlzsr1OgEogmC'.
+ '0IgoBAsBgkIrBAPEhBj/AP6xRTCUFEwRI4jcgsitXMrFCJptJWvBNpXYbbXtbtttt6e7e86ec/yxadlCfZPJZDIz73zzzjfvR2VL'.
+ 'F7U+hf0HD2JduIzTFy6SlJRkPtkcDgdCCE65OxFC8NPV6wghyM7OptankJ2dzbSC5QghEEIgCSHog9PpNAF27dlN6miZuPgElB4/'.
+ 'nmY3O7ZtByA1NVUCkGWZweD1eklJScESTbqxuIjrd+/x6uIl5M19hSy7nfGOeUxf+g7VjU1sKi7C4/GYsiyz7tAJAD4/cRaA1tZW'.
+ 'AHIPnECUVGD1+/3U19ebG4uLeHf1akamjsIwoVnVCOvQEdLoVILYYmMo3PIxSBJflpSaDX5FAmju1QAYv/8k/s8+wLVxOU0jR2LZ'.
+ '8sMFAApWrCApbRRDrRZirBYSLBKaoRPQw3SFernf2sav7T0Ubt4KwL4FMwF4Vu8FoHBCKgCzDhwHwLIhZ7y5a89u4m2JhA0wTdDC'.
+ 'OrphEjJMNElCHxKDEjaobmvlfo/Krj27CQQCJsCGJW8C0KXqAMxMiosQA8hZWcTFx9OsaniDKh1qmG7VoFsL0x0K06kbeAMhWpRe'.
+ '/KpG+gwHAKUnz7Dz3BUMw6DK18nuw99wt0Nh6VdHI8RJicmETQgFg7SFwjSrGv+oKp6ghldV6dZ0ugJBlF6FmCESQ2w2AIqXLsan'.
+ 'BrFYLJTnTCBrdBqveeopWZiPFaBHUegJhegMqGgxEkHDwB/UaQ9rdIV06v0+TD2EEQjQFtAY0dsNgNvt5sialQAIIXh7wQKuVf6J'.
+ 'gTsSccPDWlQstClBGjr9eHpVWvUQncEwdYEedF8noQ4vmYmpZMTH0nTvDn25vLbrNmu7bvfnsYEbAMnhcPDgwQPzUo2LJusw/mhp'.
+ 'QwlHNO0KBAnoIfxtrcQMT2De1Mm891wyUzNlUlJSpIyMDBobGzlzr5rFM/Koq6vrP8ASGxsLwPmKcvIShjPGZiPOakE3VFB8hHwd'.
+ 'vJAxhrk5L7Ly+RQuH/sWgPdXrwFg/6HDFBUsIj09nehfbAWwPWOT9n5RYhqGwarNWxkRM5TRCfF4U1PQsDDJFk9uYhwXvzvKjm3b'.
+ 'KSsro3DJInNW5RXp7u2bAKSlpeH1esnPz6eqqgqLpmmcr3Fht9ulfaV7mZk1Bs+lM6T1djM9fhg5egDPpTNMy5TZsW07kydPYdWM'.
+ 'aXx96ixOp9O8cfUa80srmDpjOgAulytiQqZpMnvObLbt/JTtHxXj9/tRVdU0DGOAufRpevPDTeac0hJyc3NxOOawfv161lVWS6eX'.
+ 'z+9/UOCxu1VWVvaTRGv16NFfjB2bNeAQp9NpTpmSM4DcbrdL0WsGDKLRR+52uwe1yP8jb2lpYfikyY9t80n03UCWZeaXVjw1f+zs'.
+ 'Oen+/d+pqanhzp2fKSsrw+l0mi6XiyPl5ZGITdN8fAVJwjRNJEmi1qfw1kw7siyTnJxMe3s71dXV3GpoZO64DG41NPJylvxU5D/e'.
+ 'qJKsfWQD9IkaZ2RmUvr9aV4aGYcQgjfO3aWoYBF5eXm4ewIsu/CbdPz1aWb0/p1bNoOrQxlUiuiaFo3c3FyEEOx9+C9CCD6paaTW'.
+ 'p/TXyYkTJ0Xe59jf7QOyAKDWp/QXxcFQ61P4pT3ShBBcvnUHIQTjxmX19/8BCeVg+/GPpskAAAAASUVORK5CYII=' ;
+
+ //==========================================================
+ // lock.png
+ //==========================================================
+ $this->iBuiltinIcon[7][0]= 963 ;
+ $this->iBuiltinIcon[7][1]=
+ 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'.
+ 'AAALCwAACwsBbQSEtwAAAAd0SU1FB9AKAw0XDmwMOwIAAANASURBVHic7ZXfS1t3GMY/3+PprI7aisvo2YU6h6ATA8JW4rrlsF4U'.
+ 'qiAsF9mhl0N2cYTRy9G/wptAYWPD9iJtRy5asDe7cYFmyjaXOLaMImOrmkRrjL9yTmIS3120JybWQgfb3R74wuc8Lzw858vLOUpE'.
+ 'OK6pqSm2trbY39+nu7tbPHYch7m5OcLhMIA67kWj0aMQEWk6tm17rNm2LSIie3t7ksvlJJ1OSyqVkls3Z8SyLMnlcqTTaVKpFLdu'.
+ 'zmBZVj1HeY2VUti2TSQSQSml2bZdi0QirK2tMT09zerqKtlslqGhISYnJ4nHv2N+foFsNquOe9FotLlxOBwmk8lgWRbhcFgymYxY'.
+ 'liUi0mqaJoAuIi2macrdO7fFsizx3to0Te7euV1vrXtXEgqFmJmZYWVlhXK5LB4/U9kwDL784kYV0A3DYHd3m4sXRymXywKoRi8U'.
+ 'Ch01DgQCJBIJLMsiEAhIIpHw2uLz+eqtYrEYIqKZpimxWEyCwaCMjY01zYPBIJpXqVQqsby8TLVabWKA/v5+RkZGMAyDrq4ulFKH'.
+ 'HsfjcWZnZ+ns7KTRqwcnk0mKxSKFQqGJlVKtruuSTCYB6O3trW9UI/v9/iZPB/j8s2HOnX0FgHfeXpeffnzK+fWf+fijvhLs0PtG'.
+ 'D/n1OJ9+MsrlSwb3733DwMCAt1EyPj6uACYmJp56168NU6nUqFSE9nZdPE7+WqC/r4NKTagcCJVqDaUUB5VDAA4Pa9x7sMLlSwan'.
+ 'WjRmv13D7/erpaWlo604qOp88OF7LC48rPNosMq5Th+Dgxd4/XyA1rbzADi7j8jnf2P++wdcvSr8MJ/i8eomAKlUqn41OsDAQDeD'.
+ 'g++yuPCwzm/2vU8+n2a7sMFfj79mp7BBuVzioFSiXHJx3SKuW2Rzy0Up9dxnQVvODALQerqNRn4ZKe0Mvtc6TpzpmqbxalcY9Ato'.
+ '2v06t515C73YQftZB9GLnDrt4LoujuPgOA4Ui+C6yOpXJwZrJ7r/gv4P/u+D9W7fLxTz+1ScQxrZ3atRLaVxdjbY2d184R6/sLHe'.
+ 'opHP7/Do90Ua+WWUyezzZHObP/7cfX54/dowE1d66s8TV3oE+Mfn+L/zb4XmHPjRG9YjAAAAAElFTkSuQmCC' ;
+
+ //==========================================================
+ // stop.png
+ //==========================================================
+ $this->iBuiltinIcon[8][0]= 889 ;
+ $this->iBuiltinIcon[8][1]=
+ 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'.
+ 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9AJDwEvNyD6M/0AAAL2SURBVHic1ZTLaxVnGIefb2bO5OScHJN4oWrFNqcUJYoUEgU3/Qf6'.
+ 'F7gwCkIrvdBLUtqqiLhSg9bgBduFSHZdiG5ctkJ3xRDbUFwUmghNzBDanPGMkzOX79LFJGPMOSd204U/+Bbzvd/78F4H/ieJdoad'.
+ 'pZKxRFszAI/DcP0HazXY22v+HB01kee1PA/v3zfnjx4xgGnHcNZe7OvuNj+cOEF1ZATv5nUA4jhBSgmADCVWo8Ge2Of9wb18P/G7'.
+ 'oUXmYi30zqlTVEdGWLh1g2D6MYlKkXGE0Vl8aa2GEB149+4xXSzyoOIw/mimiZV/DPb25pFOj13A9gOMEChhUEqhVYqWKUk9QAUp'.
+ 'sT/P4s8PmKlUmNhQaIJbkDVqBbpw6wZ2zUc4Nm+ePku5p4eOrgpueQOFUoVCVxcD4+N07dpF9+5tVJeWGPBjhvr7WF1zC8ASgtcP'.
+ 'H8a7eZ1odh4sh50nzwCw9ZNh3M4Stutiu0X2nB/LyjZ6lcIbVTpdQU/jWVPzLADM8+ZGBRdtC7wrF/O7bR99iu26VL86iU4SAH4b'.
+ 'Po5d6AQhstMSvGyI4wS5FJBKSRwnzF8byx/u+PjzzMF1mfryQ1K/jnCahqp1xEopjFLoNEFJSRJHzF799gWHqa+/QKcSUXBI609f'.
+ 'Al5W4teQSiHDOipNUKnMI13RvnOXAIEKQixvGWya98SC560MFwPiqEG86JM8q79Q06lvhnOndy5/B6GPCUOMUu3BQgg8z0M3GmBZ'.
+ 'iGJn3v2VmsqnfzNx7FDueODuj8ROCFpjtG5TCmOYv32bJ09msP0ISydMfnAUgF8/O45RAA6WTPjlvXcB+Gn7FuRf/zAnNX6x3ARe'.
+ 'PSdmqL+P/YHkwMGDOGWDZTlQcNBRhPEComgB/YeHfq2InF1kLlXUOkpMbio1bd7aATRD/X0M1lPeSlM2vt2X1XBZjZnpLG2tmZO6'.
+ 'LbQVOIcP+HG2UauH3xgwBqOz9Cc3l1tC24Fz+MvUDroeGNb5if9H/1dM/wLPCYMw9fryKgAAAABJRU5ErkJggg==' ;
+
+ //==========================================================
+ // error.png
+ //==========================================================
+ $this->iBuiltinIcon[9][0]= 541 ;
+ $this->iBuiltinIcon[9][1]=
+ 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAaVBMVEX//////2Xy8mLl5V/Z2VvMzFi/v1WyslKlpU+ZmUyMjEh/'.
+ 'f0VyckJlZT9YWDxMTDjAwMDy8sLl5bnY2K/MzKW/v5yyspKlpYiYmH+MjHY/PzV/f2xycmJlZVlZWU9MTEXY2Ms/PzwyMjLFTjea'.
+ 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTCAkUMSj9wWSOAAABLUlEQVR4'.
+ '2s2U3ZKCMAxGjfzJanFAXFkUle/9H9JUKA1gKTN7Yy6YMjl+kNPK5rlZVSuxf1ZRnlZxFYAm93NnIKvR+MEHUgqBXx93wZGIUrSe'.
+ 'h+ctEgbpiMo3iQ4kioHCGxir/ZYUbr7AgPXs9bX0BCYM8vN/cPe8oQYzom3tVsSBMVHEoOJ5dm5F1RsIe9CtqGgRacCAkUvRtevT'.
+ 'e2pd6vOWF+gCuc/brcuhyARakBU9FgK5bUBWdHEH8tHpDsZnRTZQGzdLVvQ3CzyYZiTAmSIODEwzFCAdJopuvbpeZDisJ4pKEcjD'.
+ 'ijWPJhU1MjCo9dkYfiUVjQNTDKY6CVbR6A0niUSZjRwFanR0l9i/TyvGnFdqwStq5axMfDbyBksld/FUumvxS/Bd9VyJvQDWiiMx'.
+ 'iOsCHgAAAABJRU5ErkJggg==' ;
+
+ //==========================================================
+ // openfolder.png
+ //==========================================================
+ $this->iBuiltinIcon[10][0]= 2040 ;
+ $this->iBuiltinIcon[10][1]=
+ 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEANAAtwClFht71AAAAAlwSFlz'.
+ 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AKDQ4RIXMeaLcAAAd1SURBVHicxZd7jBXVHcc/58zcvTNzH8vusqw8FsTsKiCUUh5WBZXG'.
+ 'GkOptmqwNWsWLKXFGlEpzZI0AWNKSy0WhDS22gJKtWlTsSRqzYIuLGB2WVvDIwQMZQMsy2OFfdzde+/OnHP6x907vJaFpjb9JZM5'.
+ 'c85Mfp/f9/s7Jxn4P4e41gtSyp78WGvtfdEAcqDFYUOH9HS0NhGk9tPb/ilSyp789UUB2AMuqhQy3Uzm7HGkE6W3dTNZMRI3EcWO'.
+ 'jf9ClLmWBT3dzW8jUsevWHCG3UpWl+IkHSxnbDh/Mcz12NevBcuWXTmf6TjnXvJ88gDmVB3pw3+nt3UzHa1NqMzBS2zqPLGFjtMN'.
+ 'ZNr3XdW+qyqwZcFk76HX/tHWfuQvyO4W7qhaHwL8efkMRlRUpPv7rqD0RrJ+FgAjLy1a20OIxZJEEuNCRfIApj+om4bGM3u2/sYU'.
+ '9J41d8973f3Dhg1pISTV1dXXBRNJxPGFCzhou+DCQrScZOkktNaeDZjamgeZ9MgiYmVDccvHhjAzJw0NTh8/alyZMaVJicp0iTHj'.
+ 'JpgNv38tjWUhhGROdbUL9W5/MH5XCkjlcibi+KIop5LVHLKEu8A/f4r286doa9pGrGwYAAsfqbbH3b8MgO/Nqgy6WvdbbXHMkEFJ'.
+ '4xUOMVEvaTZu3BgmvF4Yk4hz9rO/Ulr5cE9owae/rcGxohSOuiWkC2IjcIqKyPZm+OmCH7GhoZEF077EEzVVweAbJ+riEeO0Ey8y'.
+ 'UubqOHn0AOgMwvf59txnBrSp9dgxKmf/+kIP1NY8SFk0jh5ajmNHAWg5b2E5EexojGHjbiVRMoRMNs0LC+Yz46vTuH3enN7BI8fr'.
+ 'qFdo0BoVZNC9aVSQ4fNjBzEmQJiARxb+/AqYPMAVB5FsPU5v37g9OxgLhe14ZM5/ju052E6MNZvf5pmHHuLmmWOkEysxUtpGAtme'.
+ 'dtHTflJkezqQto3jFRnLssyf1jydxiiM7zNnye/c3ZsqLu2BN5fcMfzrv/hby1tPzmRUoihcTJ87CwQI2yLtDcIqsIjYUf51qBlf'.
+ 'OnScOSrdQUOMURkiXsLUzJnvbGhoBGDHH5cGyZLhOpYoNl5hqYnYEXOu5fDl9eYAHntx98n8hFHZcPHUuTSxSASAeK/CGIOxJJ0f'.
+ 'bOGNPU280dgkq6Y2yu8vfjCIlwwzr+/ZQ/PHO0gOLuO5qsftDQ2NbN+4OCgqG6WTxWVaq6zpF+DiSHWnicdylp3r6aZTWthIOrNp'.
+ 'ktHcvBu0sHX1Sm6ozB3B42d90zZA9bQp7PvgPSzXZfnqX/HS4DKKK2+x69Y/HURs26iBAN5ccsfw7774UcumF37C6f07KSt2OHji'.
+ 'DEUJD0tISjyPrrSPlAKvN0JP/U4O1NfjuhG2rvklN1SOpfXwftpbTqAyKRrff5fb7rs9V1R7m4wlz2ihA3HpmXflUWyOH2umpLiY'.
+ 'ui3v8M+6bWzfsRNbSgqkxaCkiy0simMuEWEhpcRzIhQWOIAh6tiAwS4owInFiTou5dOnMnl2NR++ujBwXEc9terD6M43nrj6LgAB'.
+ 'QnDPA9/irtkP8JRS7Hr/3T6YekDQ1pEiEXOwpUVJzCVlZZFS4mZtkpEo9ChAkDp/jtLMBACy6S4RiQghLyv5cgBRPnKUOX6smUGF'.
+ 'hSil0MYw9d77mPy1e5mnFE3batm3czvb6nYgEJztSFGU9LCRlMRdUjIH0+lnEMIwPNXD3NumoVJnrMCJaiciMUZfvQnz4QcBSvV1'.
+ 'vjE5GK358t0zmXDnDB79saLpo20c+aSRD+t25JTp7GZQwsEWFiVxl6hlUf/WO9z32CxmL1rOe6u/I2KuwGhzLQCB7/sYY9Bah3el'.
+ 'FKbvrrVm4vS7GH/7ncx+chEHGz7myCeNbPtoO0JI2jq78WIRLGkzsqs7V5SfFV5EovXACoiqqsfNpk2vo5VCWtYFBfoU0VoTBAFa'.
+ 'a7TRaK2p+MoURk+cxMzq+Rzbv49DDbuo27UTW9h0dedssPxuK+kIfN8XxhgDYPVXf2Fh4XKtFIl4AiklAlBKAYRKKK36wHIweTCt'.
+ 'NfHiEkaOn8j0+7/BmDFjaT30GbHywSxcuZkpFfFg+m1jjZ/NmnVvNfRvwd69e8WBA/uNFAIh4JVXXmHsmDHE4vEQQgjQ2lxQIm9N'.
+ 'nz35q3BEOZOHzaG2thaA4mRU+L29It+IV21CpbRQfeMFC35gRB/M2rVrubnyZmLxWJhECBEmz/eHyo/7lMlH3LFFujsthNFCCGOu'.
+ '+WNyeUgpjSVzMKtWraKyshLPdcPEeYWCIEBdpIxSivr6eta8vI7d6+cGnhdV06pe1QP+F/QXWmuRL+jZZ58LlVmxYgUVFRV4rhtu'.
+ '4TzMxXAA6XRaRAtsYUkx8I/JtSJQOlSwpmZpCLN8+fPcdNNoHMfB9/0QJgRoP295TlR7UVv8xxZcHMuWIZ9/Hn35vG3JEGZpzVJG'.
+ 'jx5N1IlitKahsZE1L69j69qHgx+urFX/lQL9JYdLlfnZihUhzOLFi8N3Ml1dthOxVH/f/8/CtqSJ2JaJ2JZ59J7RPsC/AViJsQS/'.
+ 'dBntAAAAAElFTkSuQmCC' ;
+
+ //==========================================================
+ // folder.png
+ //==========================================================
+ $this->iBuiltinIcon[11][0]= 1824 ;
+ $this->iBuiltinIcon[11][1]=
+ 'iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'.
+ 'AAALEAAACxABrSO9dQAAAAd0SU1FB9ECAQgFFyd9cRUAAAadSURBVHiczdhvbBP3Hcfx9/2xfefEOA5JoCNNnIT8AdtZmYBETJsI'.
+ '6+jQOlQihT1AYgytqzZpD1atfyYqlT1h0lRpT7aRJ4NQpRvZGELVuo5Ua9jEJDIETQsNQyPBsUJMWGPnj//e+e72wNg4xElMR6ed'.
+ 'ZNln3933dZ/f93f6yfB/sgmrHdDV1WXlPg8NDZUDScD8LFFFEZZlWYZhWMFg0Orq6sq/gDJAfFy1iiZy9OjrVnj4JzQ1rMWqfxm/'.
+ '309jYyNtbW0kEgnu3bvH4cOH88c/jqSKQl4/XGkd+eVtAN46up1LH92ktqYS++ZX8Pv9NDQ0sGnTJlKpFOFwmO7u7vy5IyMjeVRd'.
+ 'XV1+WEOh0IrY4pDnq6wXX/sTiCJaMkFZdRNqxefoe7VtCSqXVDqdZnZ2ltraWkzTpKqqijt3JpFlG7dvj7NzZ1f++qFQyA3EClHL'.
+ 'Ql743nFkhxPDtJAd5eTaYSVUfX09lZWVlJWVIUnSg7sVQMBCUcu4ceMGe/bsIRQK1QAzOcyykIM9P0KyudAyCWyqG8nhwqa4SkLt'.
+ '3r0bVVVxu924XC40TUOWZUQxe97CwgIdHR2LMHIxSCaVInVvFElxE0vMY1Pd2NUKJMWNTXHlUfF//4vETJCelwbpFm3MjP2dt37x'.
+ 'AlN+PzU1NViWRSwW4+7du3g8HjweD4qi5EFAJzAExIpCANbooxhplfB0FJvTg6xWIqsVRVF6MopkU3FXPcnkJxGU0VEAdF2noqKC'.
+ 'W3/8DpnqLjzep2lubsblcjE8PExHR8fboVDID9xYFpLBDpJF0jDQIncQpWlkm31FlFLtp9PfyuW/vYQj1kPSuRW/38+lj27S2Q7v'.
+ '/aWXUBVUffVNtm3blivVCEwsC5Eyc5iiApEpDEAXMqQdldhSiWVQHjJagud+8Fuexck/zv+K82dfoSbSCsDe75/km+4GVPd6+l5t'.
+ '4zJHcqVUYN2yEEtZQDCSJCueRAYsPY49HsFIZVG6p25JUumFafT4DKJN4amtT7Nz38sk5+5A70HMtEYyMkFiZhxzjQ/poXrLQrRU'.
+ 'DFGEeFpAlkQkm4pRiCpIKodKzk0T/2QMh+piPjxKZPwiSkUtu/b9mNnJEWS7E8nhAmvpM60oJDkXJxqNozxRRUxPIesispBBlsXV'.
+ 'UaKEFo8gzoaJhz8s2lOmrpUG+WBhJ9/60g+Z+fDXTAXfxllRjl1VkO0OFATsYhYliiK21ZKKhhHnFveUqSdKgwAEOp7F2v51vvw8'.
+ 'XH7/N1wd/BlTweuUV65BdtgfoLTSkipsdD3tRi0VYpommUwGwzDwdT5HYEc3giAwcvH3jLz3BlPB67jWeZBEKYsSBWwpHZtNKo4q'.
+ 'aHTDsJeeiGEYWJaFZVmYpommaRiGQdPnv0bb1m8gSRL/vPIOV979aR4lmAJ2p4qCgCxksNuKJ6VNpx4NYhgGpmkuQhmGQTqdxjAM'.
+ 'qr2d7HtxEEEQuH1tkKvvvkF44tqDnrIcKJKAPf1g+LAUElq8dIiu60sApmnm93Pfzc7OYhgGrie+wFe++ztcLhcT1wf54PzPCU9c'.
+ 'w7XWjWS3IdsdOAUBWZAxrRJnTQ6SG5bce2FCpmkughmGQSqVYm5uDtnj44sH38TtdhP6+Dwf//V4ttHXrkGURZJaic8RgHQ6jWma'.
+ 'SJKUL5RLKNfIOczDKF3XSSaTRCIRhLJWntp3nGfWrSMxc5OLf3iNP4+68T9Ub9nF76lTpxgfHycajZJKpdA0LZ9GbjYV7hcDWZaF'.
+ 'pmnMz88Ti8UYunSLmu1HFi2aVkxkaGjINTY2ttDb24vX6+XQoUNs3ryZ8vJyIDu1BUFYkkxhgxeiWlpaOHPmDE1NTdTX1xe98eWG'.
+ 'JnF/9dQZCoXUYDA4AOD1ejlw4ACtra2Ul5fniwmCkEcUJiUIAoFAgL6+Pnw+H21tbfT39z8SxCS7hHsfWH9/8dL4MKqnp4eWlhac'.
+ 'TmcekEvMNE2am5s5ceIEgUCA9vZ2Tp48ic/nY3j4UsmQHCYOjJHtpeBKqL1799Lc3IzT6UTXdRobGxkYGKC9vZ3W1tZ8Ko86NJ8a'.
+ 'tXHjRo4dO8bp06fZsmULGzZsoL+/n0AggNfr5ezZs/8VpGTU5OSkc//+/acBfD4f1dXV7Nq1i4aGBs6dO4fP5+Pq1SuPBbIiyjTN'.
+ 'RUnV1dUNXLhwAa/Xy44dO4jFYgBEo9FFF1r134BPuYlk16LrAYXsAlmtq6sbKDwoFAp9m+ykuP5ZQVZF3f8tCdwCov8LyHIoAANI'.
+ 'AXf/A1TI0XCDh7OWAAAAAElFTkSuQmCC' ;
+
+ //==========================================================
+ // file_important.png
+ //==========================================================
+ $this->iBuiltinIcon[12][0]= 1785 ;
+ $this->iBuiltinIcon[12][1]=
+ 'iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'.
+ 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9ECDAcjDeD3lKsAAAZ2SURBVHicrZhPaFzHHcc/897s7lutJCsr2VHsOHWMk0MPbsBUrcnF'.
+ 'OFRdSo6FNhdB6SGHlpDmYtJCDyoxyKe6EBxKQkt7KKL0T6ABo0NbciqigtC6PhWKI2NFqqxdSd7V2/dmftPDvPd212t55dCBYfbN'.
+ 'zpvfZ77z+/1mdhUjytWrV93Hf/24eD5z9gwiMlDjOKbb7dLtdhER2u02u7u73Lp1CxEZBw4AeZwdNQqkMd9wbziFGINJUt6rRbz5'.
+ '1ptUq1XK5TJBEAAUMHt7e+zu7gKwvLzMysoKwAng/uNg9CgQgFKlgg1DUJ67Vqtx6tQpZmdniaIIpRTOOZRSdDoddnZ2aLfbLC8v'.
+ 's7S0xJUrV7ZGwQSj1PhhfRodVdDlMrpc5vup5Z2fvMPdu3fZ29vDWjvwztjYGPV6nVqtRqVS4dKlSywtLQFsAdOH2XwsCEApg3jl'.
+ 'w98Rak2gvYjNZpNms0mSJDjnHgkDMDc3dySYQ0Ea8w139YUX0OUKulzyg7UmCEO+l1huvHuDra0t9vf3h1TJYSqVypFhHquIrlQI'.
+ 'S5qv/uIDAC7/4bcEQYAKvK+0Wq1DVQGIoog7d+4cCeaRII35hrt+8SsEOkRlUaEyR0UpFIrXHxyMVKVUKnHv3r0jwRwaNelBjBjL'.
+ 'Sz/7KYuLiwAsLi7y4z/9kY9e+TpkCuSqjI+Po7XuAWeKXLt2DWNMUZMkwRjDhQsXWFtbK6JpCCT3jfQgxomPtPX19YHWicM5x3c2'.
+ '73Pj3Ru8/aO3mZqaolKpoHVvyuvXr/Ppnf/Q7uzz380NPtu4y/qnG+ztd1hfX2dtbQ3gIvDnRyqSxl1UoPjyz98D4PTp0wPtq39Z'.
+ '4fdzLxegrVaLVqvF5OQkYRgWqpRKJZ77wvNsbW1RG5tgfKLOTH2G7Z1twqBQrgrMDvhInjfSOCY5iIv+hYWFgRZArEWsZWF941Bf'.
+ 'SdMUgMnJCWpjVU4cn+HUyePM1Gc4+fRUPkzBI5w1jbukcczLv/5l0XfmzJmBFuCba38r/CRXpT+CrDUoZ0jjB4RYonJAOYRobJKT'.
+ 'z5zgqfqxAbsFSH6mpHFM2qdGXh4VnoViD6mSJF2cTQeqDqBaKVHWmonJCWpZjhkC6anR5WsffTgwaHV1FaUUq6urA/2v3f5k4LnV'.
+ 'arG9tUn3oI2YBCcWHYAxMVYs1qZEZY2SFB2aYZDGfMN9d7uJiWPSeFiNo5Rclc3NTXZbO6RpF7EJVixYA9agwwDnUiqlEPdQ3imi'.
+ 'Jo27BGHIt/7x9yEjc3Nzh27Na7c/4TdffKl4bja3ae5MUIu0T/HOEIaOpJt4gwoSsVTK4SBIY77hFtY3ABBjBiZ90rKwvsH77/+K'.
+ 't37wOhO1iPpTk4SBw1mLsz6CnKQ4l3qV+kE+t9XHlNZOk+bUJLVIE1VCcIJWQmJ6qjj30NbcXLkZMt8YPig+Z3n1G5fZ39/j/vY2'.
+ '9ckqZT2Ochbn0p4qNkU/dDfUADdXbh4HXgRO4zNdEU0XL1784PLly5w9e7Z4SazFOfGrEotDcOKrcoJPmrYIXf/Zop3QNd1skuGt'.
+ 'cUAb2MgAxvHZTgFUq1Wmp6eZnZ0F8JlTjDduDThBnDeECEoJtbGIp6enqEblzCcEZ1PECU4yVRiOGgd0gc+AB0CZvkv1sWPHOHfu'.
+ 'HOfPn8da41cpkkltEBEPJhYnBkTQJcdYVKGkgRxCfBsq5xXNgAa2Bn+hjTOgHEKBP8pzRUxykIH4ifLJRTJAl+UMBJzPHQ6bfe/f'.
+ 'cWIzPxlUpD+zugzIZtVk1d8znBAqRxgoQuVQgSJQ3h9C5QhDRYgjUILCAzlnEdsHYTKfMTEBcP7F54YUGVmc2GLlIn6ve6v0ahSt'.
+ '8X25TzjJ+rIx1grKpQPWR4LkGVVsMgghvS0qjPdvm5OeceOTWA5Evo2mFzkjQfL7hZPUy5yvvF/uPFQL3+nbDmsLCEmT3sTmCTNr'.
+ 'rogT6yFsOix3ftw7OwQhkvSU6CuinhCk0+kAkFoBazEEICHaHHiPVmU0gnUp4EAc1mYrF0EBVpwPi34VrBkwPxKk3W5ju/e5/c+d'.
+ 'bGUHIAIuydTIE5zfc5Wr4lJcahHnHTP3CVGm78DrgY38N+DEibp7dmYKdAQmBh1hjEFjis+9CTWYGK21H6PxPyOI0DobYwzZF/z7'.
+ '7jadTvJtYG0kCD7lfwl49ijgT1gc0AH+dZSJA/xB+Mz/GSIvFoj/B7H1mAd8CO/zAAAAAElFTkSuQmCC' ;
+
+ $this->iLen = count($this->iBuiltinIcon);
+ }
+}
+
+//===================================================
+// Global cache for builtin images
+//===================================================
+$_gPredefIcons = new PredefIcons();
+
+//===================================================
+// CLASS IconImage
+// Description: Holds properties for an icon image
+//===================================================
+class IconImage {
+ var $iGDImage=null;
+ var $iWidth,$iHeight;
+ var $ixalign='left',$iyalign='center';
+ var $iScale=1.0;
+
+ function IconImage($aIcon,$aScale=1) {
+ GLOBAL $_gPredefIcons ;
+ if( is_string($aIcon) ) {
+ $this->iGDImage = Graph::LoadBkgImage('',$aIcon);
+ }
+ elseif( is_integer($aIcon) ) {
+ // Builtin image
+ $this->iGDImage = $_gPredefIcons->GetImg($aIcon);
+ }
+ else {
+ JpGraphError::RaiseL(6011);
+//('Argument to IconImage must be string or integer');
+ }
+ $this->iScale = $aScale;
+ $this->iWidth = Image::GetWidth($this->iGDImage);
+ $this->iHeight = Image::GetHeight($this->iGDImage);
+ }
+
+ function GetWidth() {
+ return round($this->iScale*$this->iWidth);
+ }
+
+ function GetHeight() {
+ return round($this->iScale*$this->iHeight);
+ }
+
+ function SetAlign($aX='left',$aY='center') {
+
+ $this->ixalign = $aX;
+ $this->iyalign = $aY;
+
+ }
+
+ function Stroke(&$aImg,$x,$y) {
+
+ if( $this->ixalign == 'right' ) {
+ $x -= $this->iWidth;
+ }
+ elseif( $this->ixalign == 'center' ) {
+ $x -= round($this->iWidth/2*$this->iScale);
+ }
+
+ if( $this->iyalign == 'bottom' ) {
+ $y -= $this->iHeight;
+ }
+ elseif( $this->iyalign == 'center' ) {
+ $y -= round($this->iHeight/2*$this->iScale);
+ }
+
+ $aImg->Copy($this->iGDImage,
+ $x,$y,0,0,
+ round($this->iWidth*$this->iScale),round($this->iHeight*$this->iScale),
+ $this->iWidth,$this->iHeight);
+ }
+}
+
+
+//===================================================
+// CLASS TextProperty
+// Description: Holds properties for a text
+//===================================================
+class TextProperty {
+ var $iFFamily=FF_FONT1,$iFStyle=FS_NORMAL,$iFSize=10;
+ var $iColor="black";
+ var $iShow=true;
+ var $iText="";
+ var $iHAlign="left",$iVAlign="bottom";
+ var $csimtarget='',$csimwintarget='',$csimalt='';
+
+//---------------
+// CONSTRUCTOR
+ function TextProperty($aTxt='') {
+ $this->iText = $aTxt;
+ }
+
+//---------------
+// PUBLIC METHODS
+ function Set($aTxt) {
+ $this->iText = $aTxt;
+ }
+
+ function SetCSIMTarget($aTarget,$aAltText='',$aWinTarget='') {
+ if( is_string($aTarget) )
+ $aTarget = array($aTarget);
+ $this->csimtarget=$aTarget;
+
+ if( is_string($aWinTarget) )
+ $aWinTarget = array($aWinTarget);
+ $this->csimwintarget=$aWinTarget;
+
+ if( is_string($aAltText) )
+ $aAltText = array($aAltText);
+ $this->csimalt=$aAltText;
+
+ }
+
+ function SetCSIMAlt($aAltText) {
+ if( is_string($aAltText) )
+ $aAltText = array($aAltText);
+ $this->csimalt=$aAltText;
+ }
+
+ // Set text color
+ function SetColor($aColor) {
+ $this->iColor = $aColor;
+ }
+
+ function HasTabs() {
+ if( is_string($this->iText) ) {
+ return substr_count($this->iText,"\t") > 0;
+ }
+ elseif( is_array($this->iText) ) {
+ return false;
+ }
+ }
+
+ // Get number of tabs in string
+ function GetNbrTabs() {
+ if( is_string($this->iText) ) {
+ return substr_count($this->iText,"\t") ;
+ }
+ else{
+ return 0;
+ }
+ }
+
+ // Set alignment
+ function Align($aHAlign,$aVAlign="bottom") {
+ $this->iHAlign=$aHAlign;
+ $this->iVAlign=$aVAlign;
+ }
+
+ // Synonym
+ function SetAlign($aHAlign,$aVAlign="bottom") {
+ $this->iHAlign=$aHAlign;
+ $this->iVAlign=$aVAlign;
+ }
+
+ // Specify font
+ function SetFont($aFFamily,$aFStyle=FS_NORMAL,$aFSize=10) {
+ $this->iFFamily = $aFFamily;
+ $this->iFStyle = $aFStyle;
+ $this->iFSize = $aFSize;
+ }
+
+ function IsColumns() {
+ return is_array($this->iText) ;
+ }
+
+ // Get width of text. If text contains several columns separated by
+ // tabs then return both the total width as well as an array with a
+ // width for each column.
+ function GetWidth(&$aImg,$aUseTabs=false,$aTabExtraMargin=1.1) {
+ $extra_margin=4;
+ $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
+ if( is_string($this->iText) ) {
+ if( strlen($this->iText) == 0 ) return 0;
+ $tmp = split("\t",$this->iText);
+ if( count($tmp) <= 1 || !$aUseTabs ) {
+ $w = $aImg->GetTextWidth($this->iText);
+ return $w + 2*$extra_margin;
+ }
+ else {
+ $tot=0;
+ $n = count($tmp);
+ for($i=0; $i < $n; ++$i) {
+ $res[$i] = $aImg->GetTextWidth($tmp[$i]);
+ $tot += $res[$i]*$aTabExtraMargin;
+ }
+ return array(round($tot),$res);
+ }
+ }
+ elseif( is_object($this->iText) ) {
+ // A single icon
+ return $this->iText->GetWidth()+2*$extra_margin;
+ }
+ elseif( is_array($this->iText) ) {
+ // Must be an array of texts. In this case we return the sum of the
+ // length + a fixed margin of 4 pixels on each text string
+ $n = count($this->iText);
+ for( $i=0, $w=0; $i < $n; ++$i ) {
+ $tmp = $this->iText[$i];
+ if( is_string($tmp) ) {
+ $w += $aImg->GetTextWidth($tmp)+$extra_margin;
+ }
+ else {
+ if( is_object($tmp) === false ) {
+ JpGraphError::RaiseL(6012);
+ }
+ $w += $tmp->GetWidth()+$extra_margin;
+ }
+ }
+ return $w;
+ }
+ else {
+ JpGraphError::RaiseL(6012);
+ }
+ }
+
+ // for the case where we have multiple columns this function returns the width of each
+ // column individually. If there is no columns just return the width of the single
+ // column as an array of one
+ function GetColWidth(&$aImg,$aMargin=0) {
+ $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
+ if( is_array($this->iText) ) {
+ $n = count($this->iText);
+ for( $i=0, $w=array(); $i < $n; ++$i ) {
+ $tmp = $this->iText[$i];
+ if( is_string($tmp) ) {
+ $w[$i] = $aImg->GetTextWidth($this->iText[$i])+$aMargin;
+ }
+ else {
+ if( is_object($tmp) === false ) {
+ JpGraphError::RaiseL(6012);
+ }
+ $w[$i] = $tmp->GetWidth()+$aMargin;
+ }
+ }
+ return $w;
+ }
+ else {
+ return array($this->GetWidth($aImg));
+ }
+ }
+
+ // Get total height of text
+ function GetHeight(&$aImg) {
+ $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
+ return $aImg->GetFontHeight();
+ }
+
+ // Unhide/hide the text
+ function Show($aShow=true) {
+ $this->iShow=$aShow;
+ }
+
+ // Stroke text at (x,y) coordinates. If the text contains tabs then the
+ // x parameter should be an array of positions to be used for each successive
+ // tab mark. If no array is supplied then the tabs will be ignored.
+ function Stroke(&$aImg,$aX,$aY) {
+ if( $this->iShow ) {
+ $aImg->SetColor($this->iColor);
+ $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
+ $aImg->SetTextAlign($this->iHAlign,$this->iVAlign);
+ if( $this->GetNbrTabs() <= 1 ) {
+ if( is_string($this->iText) ) {
+ // Get rid of any "\t" characters and stroke string
+ if( is_array($aX) ) $aX=$aX[0];
+ if( is_array($aY) ) $aY=$aY[0];
+ $aImg->StrokeText($aX,$aY,str_replace("\t"," ",$this->iText));
+ }
+ elseif( is_array($this->iText) && ($n = count($this->iText)) > 0 ) {
+ $ax = is_array($aX) ;
+ $ay = is_array($aY) ;
+ if( $ax && $ay ) {
+ // Nothing; both are already arrays
+ }
+ elseif( $ax ) {
+ $aY = array_fill(0,$n,$aY);
+ }
+ elseif( $ay ) {
+ $aX = array_fill(0,$n,$aX);
+ }
+ else {
+ $aX = array_fill(0,$n,$aX);
+ $aY = array_fill(0,$n,$aY);
+ }
+ $n = min($n, count($aX) ) ;
+ $n = min($n, count($aY) ) ;
+ for($i=0; $i < $n; ++$i ) {
+ $tmp = $this->iText[$i];
+ if( is_object($tmp) ) {
+ $tmp->Stroke($aImg,$aX[$i],$aY[$i]);
+ }
+ else
+ $aImg->StrokeText($aX[$i],$aY[$i],str_replace("\t"," ",$tmp));
+ }
+ }
+ }
+ else {
+ $tmp = split("\t",$this->iText);
+ $n = min(count($tmp),count($aX));
+ for($i=0; $i < $n; ++$i) {
+ $aImg->StrokeText($aX[$i],$aY,$tmp[$i]);
+ }
+ }
+ }
+ }
+}
+
+//===================================================
+// CLASS HeaderProperty
+// Description: Data encapsulating class to hold property
+// for each type of the scale headers
+//===================================================
+class HeaderProperty {
+ var $iTitleVertMargin=3,$iFFamily=FF_FONT0,$iFStyle=FS_NORMAL,$iFSize=8;
+ var $iFrameColor="black",$iFrameWeight=1;
+ var $iShowLabels=true,$iShowGrid=true;
+ var $iBackgroundColor="white";
+ var $iWeekendBackgroundColor="lightgray",$iSundayTextColor="red"; // these are only used with day scale
+ var $iTextColor="black";
+ var $iLabelFormStr="%d";
+ var $grid,$iStyle=0;
+ var $iIntervall = 1;
+
+//---------------
+// CONSTRUCTOR
+ function HeaderProperty() {
+ $this->grid = new LineProperty();
+ }
+
+//---------------
+// PUBLIC METHODS
+ function Show($aShow=true) {
+ $this->iShowLabels = $aShow;
+ }
+
+ function SetIntervall($aInt) {
+ $this->iIntervall = $aInt;
+ }
+
+ function GetIntervall() {
+ return $this->iIntervall ;
+ }
+
+ function SetFont($aFFamily,$aFStyle=FS_NORMAL,$aFSize=10) {
+ $this->iFFamily = $aFFamily;
+ $this->iFStyle = $aFStyle;
+ $this->iFSize = $aFSize;
+ }
+
+ function SetFontColor($aColor) {
+ $this->iTextColor = $aColor;
+ }
+
+ function GetFontHeight(&$aImg) {
+ $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
+ return $aImg->GetFontHeight();
+ }
+
+ function GetFontWidth(&$aImg) {
+ $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
+ return $aImg->GetFontWidth();
+ }
+
+ function GetStrWidth(&$aImg,$aStr) {
+ $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
+ return $aImg->GetTextWidth($aStr);
+ }
+
+ function SetStyle($aStyle) {
+ $this->iStyle = $aStyle;
+ }
+
+ function SetBackgroundColor($aColor) {
+ $this->iBackgroundColor=$aColor;
+ }
+
+ function SetFrameWeight($aWeight) {
+ $this->iFrameWeight=$aWeight;
+ }
+
+ function SetFrameColor($aColor) {
+ $this->iFrameColor=$aColor;
+ }
+
+ // Only used by day scale
+ function SetWeekendColor($aColor) {
+ $this->iWeekendBackgroundColor=$aColor;
+ }
+
+ // Only used by day scale
+ function SetSundayFontColor($aColor) {
+ $this->iSundayTextColor=$aColor;
+ }
+
+ function SetTitleVertMargin($aMargin) {
+ $this->iTitleVertMargin=$aMargin;
+ }
+
+ function SetLabelFormatString($aStr) {
+ $this->iLabelFormStr=$aStr;
+ }
+
+ function SetFormatString($aStr) {
+ $this->SetLabelFormatString($aStr);
+ }
+
+
+}
+
+//===================================================
+// CLASS GanttScale
+// Description: Responsible for calculating and showing
+// the scale in a gantt chart. This includes providing methods for
+// converting dates to position in the chart as well as stroking the
+// date headers (days, week, etc).
+//===================================================
+class GanttScale {
+ var $minute,$hour,$day,$week,$month,$year;
+ var $divider,$dividerh,$tableTitle;
+ var $iStartDate=-1,$iEndDate=-1;
+ // Number of gantt bar position (n.b not necessariliy the same as the number of bars)
+ // we could have on bar in position 1, and one bar in position 5 then there are two
+ // bars but the number of bar positions is 5
+ var $iVertLines=-1;
+ // The width of the labels (defaults to the widest of all labels)
+ var $iLabelWidth;
+ // Out image to stroke the scale to
+ var $iImg;
+ var $iTableHeaderBackgroundColor="white",$iTableHeaderFrameColor="black";
+ var $iTableHeaderFrameWeight=1;
+ var $iAvailableHeight=-1,$iVertSpacing=-1,$iVertHeaderSize=-1;
+ var $iDateLocale;
+ var $iVertLayout=GANTT_EVEN;
+ var $iTopPlotMargin=10,$iBottomPlotMargin=15;
+ var $iUsePlotWeekendBackground=true;
+ var $iWeekStart = 1; // Default to have weekends start on Monday
+ var $actinfo;
+
+//---------------
+// CONSTRUCTOR
+ function GanttScale(&$aImg) {
+ $this->iImg = &$aImg;
+ $this->iDateLocale = new DateLocale();
+
+ $this->minute = new HeaderProperty();
+ $this->minute->SetIntervall(15);
+ $this->minute->SetLabelFormatString('i');
+ $this->minute->SetFont(FF_FONT0);
+ $this->minute->grid->SetColor("gray");
+
+ $this->hour = new HeaderProperty();
+ $this->hour->SetFont(FF_FONT0);
+ $this->hour->SetIntervall(6);
+ $this->hour->SetStyle(HOURSTYLE_HM24);
+ $this->hour->SetLabelFormatString('H:i');
+ $this->hour->grid->SetColor("gray");
+
+ $this->day = new HeaderProperty();
+ $this->day->grid->SetColor("gray");
+ $this->day->SetLabelFormatString('l');
+
+ $this->week = new HeaderProperty();
+ $this->week->SetLabelFormatString("w%d");
+ $this->week->SetFont(FF_FONT1);
+
+ $this->month = new HeaderProperty();
+ $this->month->SetFont(FF_FONT1,FS_BOLD);
+
+ $this->year = new HeaderProperty();
+ $this->year->SetFont(FF_FONT1,FS_BOLD);
+
+ $this->divider=new LineProperty();
+ $this->dividerh=new LineProperty();
+ $this->dividerh->SetWeight(2);
+ $this->divider->SetWeight(6);
+ $this->divider->SetColor('gray');
+ $this->divider->SetStyle('fancy');
+
+ $this->tableTitle=new TextProperty();
+ $this->tableTitle->Show(false);
+ $this->actinfo = new GanttActivityInfo();
+ }
+
+//---------------
+// PUBLIC METHODS
+ // Specify what headers should be visible
+ function ShowHeaders($aFlg) {
+ $this->day->Show($aFlg & GANTT_HDAY);
+ $this->week->Show($aFlg & GANTT_HWEEK);
+ $this->month->Show($aFlg & GANTT_HMONTH);
+ $this->year->Show($aFlg & GANTT_HYEAR);
+ $this->hour->Show($aFlg & GANTT_HHOUR);
+ $this->minute->Show($aFlg & GANTT_HMIN);
+
+ // Make some default settings of gridlines whihc makes sense
+ if( $aFlg & GANTT_HWEEK ) {
+ $this->month->grid->Show(false);
+ $this->year->grid->Show(false);
+ }
+ if( $aFlg & GANTT_HHOUR ) {
+ $this->day->grid->SetColor("black");
+ }
+ }
+
+ // Should the weekend background stretch all the way down in the plotarea
+ function UseWeekendBackground($aShow) {
+ $this->iUsePlotWeekendBackground = $aShow;
+ }
+
+ // Have a range been specified?
+ function IsRangeSet() {
+ return $this->iStartDate!=-1 && $this->iEndDate!=-1;
+ }
+
+ // Should the layout be from top or even?
+ function SetVertLayout($aLayout) {
+ $this->iVertLayout = $aLayout;
+ }
+
+ // Which locale should be used?
+ function SetDateLocale($aLocale) {
+ $this->iDateLocale->Set($aLocale);
+ }
+
+ // Number of days we are showing
+ function GetNumberOfDays() {
+ return round(($this->iEndDate-$this->iStartDate)/SECPERDAY);
+ }
+
+ // The width of the actual plot area
+ function GetPlotWidth() {
+ $img=$this->iImg;
+ return $img->width - $img->left_margin - $img->right_margin;
+ }
+
+ // Specify the width of the titles(labels) for the activities
+ // (This is by default set to the minimum width enought for the
+ // widest title)
+ function SetLabelWidth($aLabelWidth) {
+ $this->iLabelWidth=$aLabelWidth;
+ }
+
+ // Which day should the week start?
+ // 0==Sun, 1==Monday, 2==Tuesday etc
+ function SetWeekStart($aStartDay) {
+ $this->iWeekStart = $aStartDay % 7;
+
+ //Recalculate the startday since this will change the week start
+ $this->SetRange($this->iStartDate,$this->iEndDate);
+ }
+
+ // Do we show min scale?
+ function IsDisplayMinute() {
+ return $this->minute->iShowLabels;
+ }
+
+ // Do we show day scale?
+ function IsDisplayHour() {
+ return $this->hour->iShowLabels;
+ }
+
+
+ // Do we show day scale?
+ function IsDisplayDay() {
+ return $this->day->iShowLabels;
+ }
+
+ // Do we show week scale?
+ function IsDisplayWeek() {
+ return $this->week->iShowLabels;
+ }
+
+ // Do we show month scale?
+ function IsDisplayMonth() {
+ return $this->month->iShowLabels;
+ }
+
+ // Do we show year scale?
+ function IsDisplayYear() {
+ return $this->year->iShowLabels;
+ }
+
+ // Specify spacing (in percent of bar height) between activity bars
+ function SetVertSpacing($aSpacing) {
+ $this->iVertSpacing = $aSpacing;
+ }
+
+ // Specify scale min and max date either as timestamp or as date strings
+ // Always round to the nearest week boundary
+ function SetRange($aMin,$aMax) {
+ $this->iStartDate = $this->NormalizeDate($aMin);
+ $this->iEndDate = $this->NormalizeDate($aMax);
+ }
+
+
+ // Adjust the start and end date so they fit to beginning/ending
+ // of the week taking the specified week start day into account.
+ function AdjustStartEndDay() {
+
+ if( !($this->IsDisplayYear() ||$this->IsDisplayMonth() || $this->IsDisplayWeek()) ) {
+ // Don't adjust
+ return;
+ }
+
+ // Get day in week for start and ending date (Sun==0)
+ $ds=strftime("%w",$this->iStartDate);
+ $de=strftime("%w",$this->iEndDate);
+
+ // We want to start on iWeekStart day. But first we subtract a week
+ // if the startdate is "behind" the day the week start at.
+ // This way we ensure that the given start date is always included
+ // in the range. If we don't do this the nearest correct weekday in the week
+ // to start at might be later than the start date.
+ if( $ds < $this->iWeekStart )
+ $d = strtotime('-7 day',$this->iStartDate);
+ else
+ $d = $this->iStartDate;
+ $adjdate = strtotime(($this->iWeekStart-$ds).' day',$d /*$this->iStartDate*/ );
+ $this->iStartDate = $adjdate;
+
+ // We want to end on the last day of the week
+ $preferredEndDay = ($this->iWeekStart+6)%7;
+ if( $preferredEndDay != $de ) {
+ // Solve equivalence eq: $de + x ~ $preferredDay (mod 7)
+ $adj = (7+($preferredEndDay - $de)) % 7;
+ $adjdate = strtotime("+$adj day",$this->iEndDate);
+ $this->iEndDate = $adjdate;
+ }
+ }
+
+ // Specify background for the table title area (upper left corner of the table)
+ function SetTableTitleBackground($aColor) {
+ $this->iTableHeaderBackgroundColor = $aColor;
+ }
+
+///////////////////////////////////////
+// PRIVATE Methods
+
+ // Determine the height of all the scale headers combined
+ function GetHeaderHeight() {
+ $img=$this->iImg;
+ $height=1;
+ if( $this->minute->iShowLabels ) {
+ $height += $this->minute->GetFontHeight($img);
+ $height += $this->minute->iTitleVertMargin;
+ }
+ if( $this->hour->iShowLabels ) {
+ $height += $this->hour->GetFontHeight($img);
+ $height += $this->hour->iTitleVertMargin;
+ }
+ if( $this->day->iShowLabels ) {
+ $height += $this->day->GetFontHeight($img);
+ $height += $this->day->iTitleVertMargin;
+ }
+ if( $this->week->iShowLabels ) {
+ $height += $this->week->GetFontHeight($img);
+ $height += $this->week->iTitleVertMargin;
+ }
+ if( $this->month->iShowLabels ) {
+ $height += $this->month->GetFontHeight($img);
+ $height += $this->month->iTitleVertMargin;
+ }
+ if( $this->year->iShowLabels ) {
+ $height += $this->year->GetFontHeight($img);
+ $height += $this->year->iTitleVertMargin;
+ }
+ return $height;
+ }
+
+ // Get width (in pixels) for a single day
+ function GetDayWidth() {
+ return ($this->GetPlotWidth()-$this->iLabelWidth+1)/$this->GetNumberOfDays();
+ }
+
+ // Get width (in pixels) for a single hour
+ function GetHourWidth() {
+ return $this->GetDayWidth() / 24 ;
+ }
+
+ function GetMinuteWidth() {
+ return $this->GetHourWidth() / 60 ;
+ }
+
+ // Nuber of days in a year
+ function GetNumDaysInYear($aYear) {
+ if( $this->IsLeap($aYear) )
+ return 366;
+ else
+ return 365;
+ }
+
+ // Get week number
+ function GetWeekNbr($aDate,$aSunStart=true) {
+ // We can't use the internal strftime() since it gets the weeknumber
+ // wrong since it doesn't follow ISO on all systems since this is
+ // system linrary dependent.
+ // Even worse is that this works differently if we are on a Windows
+ // or UNIX box (it even differs between UNIX boxes how strftime()
+ // is natively implemented)
+ //
+ // Credit to Nicolas Hoizey Most likely you have some text in your script before the call to Graph::Stroke(). If this texts gets sent back to the browser the browser will assume that all data is plain text. Look for any text, even spaces and newlines, that might have been sent back to the browser. For example it is a common mistake to leave a blank line before the opening \"<?php\". Wahrscheinlich steht Text im Skript bevor Graph::Stroke() aufgerufen wird. Wenn dieser Text zum Browser gesendet wird, nimmt dieser an, dass die gesamten Daten aus Text bestehen. Such nach irgendwelchem Text, auch nach Leerzeichen und Zeilenumbrüchen, die eventuell bereits zum Browser gesendet wurden. Zum Beispiel ist ein oft auftretender Fehler, eine Leerzeile am Anfang der Datei oder vor Graph::Stroke() zu lassen."<?php". Most likely you have some text in your script before the call to Graph::Stroke(). If this texts gets sent back to the browser the browser will assume that all data is plain text. Look for any text, even spaces and newlines, that might have been sent back to the browser. For example it is a common mistake to leave a blank line before the opening "<?php". Most likely you have some text in your script before the call to Graph::Stroke(). If this texts gets sent back to the browser the browser will assume that all data is plain text. Look for any text, even spaces and newlines, that might have been sent back to the browser. For example it is a common mistake to leave a blank line before the opening "<?php".
";
+
+ die();
+
+ }
+
+
+ if ($this->expired) {
+ header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
+ header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT");
+ header("Cache-Control: no-cache, must-revalidate");
+ header("Pragma: no-cache");
+ }
+ header("Content-type: image/$this->img_format");
+ }
+
+ function SetImgFormat($aFormat,$aQuality=75) {
+ $this->image_quality = $aQuality;
+ $aFormat = strtolower($aFormat);
+ $tst = true;
+ $supported = imagetypes();
+ if( $aFormat=="auto" ) {
+ if( $supported & IMG_PNG )
+ $this->img_format="png";
+ elseif( $supported & IMG_JPG )
+ $this->img_format="jpeg";
+ elseif( $supported & IMG_GIF )
+ $this->img_format="gif";
+ else
+ JpGraphError::RaiseL(12008);
+//(" Your PHP (and GD-lib) installation does not appear to support any known graphic formats.".
+ return true;
+ }
+ else {
+ if( $aFormat=="jpeg" || $aFormat=="png" || $aFormat=="gif" ) {
+ if( $aFormat=="jpeg" && !($supported & IMG_JPG) )
+ $tst=false;
+ elseif( $aFormat=="png" && !($supported & IMG_PNG) )
+ $tst=false;
+ elseif( $aFormat=="gif" && !($supported & IMG_GIF) )
+ $tst=false;
+ else {
+ $this->img_format=$aFormat;
+ return true;
+ }
+ }
+ else
+ $tst=false;
+ if( !$tst )
+ JpGraphError::RaiseL(12009,$aFormat);
+//(" Your PHP installation does not support the chosen graphic format: $aFormat");
+ }
+ }
+
+ // Stream image to browser or to file
+ function Stream($aFile="") {
+ $func="image".$this->img_format;
+ if( $this->img_format=="jpeg" && $this->image_quality != null ) {
+ $res = @$func($this->img,$aFile,$this->image_quality);
+ }
+ else {
+ if( $aFile != "" ) {
+ $res = @$func($this->img,$aFile);
+ }
+ else
+ $res = @$func($this->img);
+ }
+ if( !$res )
+ JpGraphError::RaiseL(12010,$aFile);
+//("Can't create or stream image to file $aFile Check that PHP has enough permission to write a file to the current directory.");
+ }
+
+ function Stroke($aFileName='') {
+ // Find out the necessary size for the container image
+ $w=0; $h=0;
+ for($i=0; $i < $this->iCnt; ++$i ) {
+ $maxw = $this->iGraphs[$i][1]+$this->iGraphs[$i][5];
+ $maxh = $this->iGraphs[$i][2]+$this->iGraphs[$i][6];
+ $w = max( $w, $maxw );
+ $h = max( $h, $maxh );
+ }
+ $w += $this->lm+$this->rm;
+ $h += $this->tm+$this->bm;
+
+ // User specified width,height overrides
+ if( $this->iWidth !== NULL ) $w = $this->iWidth;
+ if( $this->iHeight!== NULL ) $h = $this->iHeight;
+
+ $this->_imageCreate($w,$h);
+ $this->iRGB = new RGB($this->img);
+
+ $this->_setcolor($this->iFillColor);
+ $this->_filledRectangle(0,0,$w-1,$h-1);
+
+ $this->_strokeBackgroundImage();
+
+ if( $this->iDoFrame ) {
+ $this->_setColor($this->iFrameColor);
+ $this->iLineWeight=$this->iFrameWeight;
+ $this->_rectangle(0,0,$w-1,$h-1);
+ }
+
+ // Copy all sub graphs to the container
+ for($i=0; $i < $this->iCnt; ++$i ) {
+ $this->_imageCp($this->iGraphs[$i][0],
+ $this->iGraphs[$i][1]+$this->lm,$this->iGraphs[$i][2]+$this->tm,
+ $this->iGraphs[$i][3],$this->iGraphs[$i][4],
+ $this->iGraphs[$i][5],$this->iGraphs[$i][6],
+ $this->iGraphs[$i][7]);
+ }
+
+ // Output image
+ if( $aFileName == _IMG_HANDLER ) {
+ return $this->img;
+ }
+ else {
+ if( $aFileName != '' ) {
+ $this->Stream($aFileName);
+ }
+ else {
+ $this->Headers();
+ $this->Stream();
+ }
+ }
+ }
+}
+
+?>
diff --git a/html/includes/jpgraph/src/jpgraph_pie.php b/html/includes/jpgraph/src/jpgraph_pie.php
new file mode 100644
index 0000000000..f52b59e71a
--- /dev/null
+++ b/html/includes/jpgraph/src/jpgraph_pie.php
@@ -0,0 +1,1437 @@
+ array(136,34,40,45,46,62,63,134,74,10,120,136,141,168,180,77,209,218,346,395,89,430),
+ "pastel" => array(27,415,128,59,66,79,105,110,42,147,152,230,236,240,331,337,405,38),
+ "water" => array(8,370,24,40,335,56,213,237,268,14,326,387,10,388),
+ "sand" => array(27,168,34,170,19,50,65,72,131,209,46,393));
+ var $theme="earth";
+ var $setslicecolors=array();
+ var $labeltype=0; // Default to percentage
+ var $pie_border=true,$pie_interior_border=true;
+ var $value;
+ var $ishadowcolor='',$ishadowdrop=4;
+ var $ilabelposadj=1;
+ var $legendcsimtargets = array();
+ var $legendcsimwintargets = array();
+ var $legendcsimalts = array();
+ var $adjusted_data = array();
+ var $guideline = null,$guidelinemargin=10;
+ var $iShowGuideLineForSingle = false;
+ var $iGuideLineCurve = false,$iGuideVFactor=1.4,$iGuideLineRFactor=0.8;
+ var $la = array(); // Holds the angle for each label
+//---------------
+// CONSTRUCTOR
+ function PiePlot($data) {
+ $this->data = array_reverse($data);
+ $this->title = new Text("");
+ $this->title->SetFont(FF_FONT1,FS_BOLD);
+ $this->value = new DisplayValue();
+ $this->value->Show();
+ $this->value->SetFormat('%.1f%%');
+ $this->guideline = new LineProperty();
+ }
+
+//---------------
+// PUBLIC METHODS
+ function SetCenter($x,$y=0.5) {
+ $this->posx = $x;
+ $this->posy = $y;
+ }
+
+ // Enable guideline and set drwaing policy
+ function SetGuideLines($aFlg=true,$aCurved=true,$aAlways=false) {
+ $this->guideline->Show($aFlg);
+ $this->iShowGuideLineForSingle = $aAlways;
+ $this->iGuideLineCurve = $aCurved;
+ }
+
+ // Adjuste the distance between labels and labels and pie
+ function SetGuideLinesAdjust($aVFactor,$aRFactor=0.8) {
+ $this->iGuideVFactor=$aVFactor;
+ $this->iGuideLineRFactor=$aRFactor;
+ }
+
+ function SetColor($aColor) {
+ $this->color = $aColor;
+ }
+
+ function SetSliceColors($aColors) {
+ $this->setslicecolors = $aColors;
+ }
+
+ function SetShadow($aColor='darkgray',$aDropWidth=4) {
+ $this->ishadowcolor = $aColor;
+ $this->ishadowdrop = $aDropWidth;
+ }
+
+ function SetCSIMTargets($aTargets,$aAlts='',$aWinTargets='') {
+ $this->csimtargets=array_reverse($aTargets);
+ if( is_array($aWinTargets) )
+ $this->csimwintargets=array_reverse($aWinTargets);
+ if( is_array($aAlts) )
+ $this->csimalts=array_reverse($aAlts);
+ }
+
+ function GetCSIMareas() {
+ return $this->csimareas;
+ }
+
+ function AddSliceToCSIM($i,$xc,$yc,$radius,$sa,$ea) {
+
+ //Slice number, ellipse centre (x,y), height, width, start angle, end angle
+ while( $sa > 2*M_PI ) $sa = $sa - 2*M_PI;
+ while( $ea > 2*M_PI ) $ea = $ea - 2*M_PI;
+
+ $sa = 2*M_PI - $sa;
+ $ea = 2*M_PI - $ea;
+
+ // Special case when we have only one slice since then both start and end
+ // angle will be == 0
+ if( abs($sa - $ea) < 0.0001 ) {
+ $sa=2*M_PI; $ea=0;
+ }
+
+ //add coordinates of the centre to the map
+ $xc = floor($xc);$yc=floor($yc);
+ $coords = "$xc, $yc";
+
+ //add coordinates of the first point on the arc to the map
+ $xp = floor(($radius*cos($ea))+$xc);
+ $yp = floor($yc-$radius*sin($ea));
+ $coords.= ", $xp, $yp";
+ //add coordinates every 0.2 radians
+ $a=$ea+0.2;
+
+ // If we cross the 260-limit with a slice we need to handle
+ // the fact that end angle is smaller than start
+ if( $sa < $ea ) {
+ while ($a <= 2*M_PI) {
+ $xp = floor($radius*cos($a)+$xc);
+ $yp = floor($yc-$radius*sin($a));
+ $coords.= ", $xp, $yp";
+ $a += 0.2;
+ }
+ $a -= 2*M_PI;
+ }
+
+ while ($a < $sa) {
+ $xp = floor($radius*cos($a)+$xc);
+ $yp = floor($yc-$radius*sin($a));
+ $coords.= ", $xp, $yp";
+ $a += 0.2;
+ }
+
+ //Add the last point on the arc
+ $xp = floor($radius*cos($sa)+$xc);
+ $yp = floor($yc-$radius*sin($sa));
+ $coords.= ", $xp, $yp";
+ if( !empty($this->csimtargets[$i]) ) {
+ $this->csimareas .= "csimtargets[$i]."\"";
+ $tmp="";
+ if( !empty($this->csimwintargets[$i]) ) {
+ $this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" ";
+ }
+ if( !empty($this->csimalts[$i]) ) {
+ $tmp=sprintf($this->csimalts[$i],$this->data[$i]);
+ $this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" ";
+ }
+ $this->csimareas .= " />\n";
+ }
+ }
+
+
+ function SetTheme($aTheme) {
+ if( in_array($aTheme,array_keys($this->themearr)) )
+ $this->theme = $aTheme;
+ else
+ JpGraphError::RaiseL(15001,$aTheme);//("PiePLot::SetTheme() Unknown theme: $aTheme");
+ }
+
+ function ExplodeSlice($e,$radius=20) {
+ if( ! is_integer($e) )
+ JpGraphError::RaiseL(15002);//('Argument to PiePlot::ExplodeSlice() must be an integer');
+ $this->explode_radius[$e]=$radius;
+ }
+
+ function ExplodeAll($radius=20) {
+ $this->explode_all=true;
+ $this->explode_r = $radius;
+ }
+
+ function Explode($aExplodeArr) {
+ if( !is_array($aExplodeArr) ) {
+ JpGraphError::RaiseL(15003);
+//("Argument to PiePlot::Explode() must be an array with integer distances.");
+ }
+ $this->explode_radius = $aExplodeArr;
+ }
+
+ function SetStartAngle($aStart) {
+ if( $aStart < 0 || $aStart > 360 ) {
+ JpGraphError::RaiseL(15004);//('Slice start angle must be between 0 and 360 degrees.');
+ }
+ $this->startangle = 360-$aStart;
+ $this->startangle *= M_PI/180;
+ }
+
+ function SetFont($family,$style=FS_NORMAL,$size=10) {
+ JpGraphError::RaiseL(15005);//('PiePlot::SetFont() is deprecated. Use PiePlot->value->SetFont() instead.');
+ }
+
+ // Size in percentage
+ function SetSize($aSize) {
+ if( ($aSize>0 && $aSize<=0.5) || ($aSize>10 && $aSize<1000) )
+ $this->radius = $aSize;
+ else
+ JpGraphError::RaiseL(15006);
+//("PiePlot::SetSize() Radius for pie must either be specified as a fraction [0, 0.5] of the size of the image or as an absolute size in pixels in the range [10, 1000]");
+ }
+
+ function SetFontColor($aColor) {
+ JpGraphError::RaiseL(15007);
+//('PiePlot::SetFontColor() is deprecated. Use PiePlot->value->SetColor() instead.');
+ }
+
+ // Set label arrays
+ function SetLegends($aLegend) {
+ $this->legends = $aLegend;
+ }
+
+ // Set text labels for slices
+ function SetLabels($aLabels,$aLblPosAdj="auto") {
+ $this->labels = array_reverse($aLabels);
+ $this->ilabelposadj=$aLblPosAdj;
+ }
+
+ function SetLabelPos($aLblPosAdj) {
+ $this->ilabelposadj=$aLblPosAdj;
+ }
+
+ // Should we display actual value or percentage?
+ function SetLabelType($t) {
+ if( $t < 0 || $t > 2 )
+ JpGraphError::RaiseL(15008,$t);
+//("PiePlot::SetLabelType() Type for pie plots must be 0 or 1 (not $t).");
+ $this->labeltype=$t;
+ }
+
+ // Deprecated.
+ function SetValueType($aType) {
+ $this->SetLabelType($aType);
+ }
+
+ // Should the circle around a pie plot be displayed
+ function ShowBorder($exterior=true,$interior=true) {
+ $this->pie_border = $exterior;
+ $this->pie_interior_border = $interior;
+ }
+
+ // Setup the legends (Framework method)
+ function Legend(&$graph) {
+ $colors = array_keys($graph->img->rgb->rgb_table);
+ sort($colors);
+ $ta=$this->themearr[$this->theme];
+ $n = count($this->data);
+
+ if( $this->setslicecolors==null ) {
+ $numcolors=count($ta);
+ if( is_a($this,'PiePlot3D') ) {
+ $ta = array_reverse(array_slice($ta,0,$n));
+ }
+ }
+ else {
+ $this->setslicecolors = array_slice($this->setslicecolors,0,$n);
+ $numcolors=count($this->setslicecolors);
+ if( $graph->pieaa && !is_a($this,'PiePlot3D') ) {
+ $this->setslicecolors = array_reverse($this->setslicecolors);
+ }
+ }
+
+ $sum=0;
+ for($i=0; $i < $n; ++$i)
+ $sum += $this->data[$i];
+
+ // Bail out with error if the sum is 0
+ if( $sum==0 )
+ JpGraphError::RaiseL(15009);//("Illegal pie plot. Sum of all data is zero for Pie!");
+
+ // Make sure we don't plot more values than data points
+ // (in case the user added more legends than data points)
+ $n = min(count($this->legends),count($this->data));
+ if( $this->legends != "" ) {
+ $this->legends = array_reverse(array_slice($this->legends,0,$n));
+ }
+ for( $i=$n-1; $i >= 0; --$i ) {
+ $l = $this->legends[$i];
+ // Replace possible format with actual values
+ if( count($this->csimalts) > $i ) {
+ $fmt = $this->csimalts[$i];
+ }
+ else {
+ $fmt = "%d"; // Deafult Alt if no other has been specified
+ }
+ if( $this->labeltype==0 ) {
+ $l = sprintf($l,100*$this->data[$i]/$sum);
+ $alt = sprintf($fmt,$this->data[$i]);
+
+ }
+ elseif( $this->labeltype == 1) {
+ $l = sprintf($l,$this->data[$i]);
+ $alt = sprintf($fmt,$this->data[$i]);
+
+ }
+ else {
+ $l = sprintf($l,$this->adjusted_data[$i]);
+ $alt = sprintf($fmt,$this->adjusted_data[$i]);
+ }
+
+ if( empty($this->csimwintargets[$i]) ) {
+ $wintarg = '';
+ }
+ else {
+ $wintarg = $this->csimwintargets[$i];
+ }
+
+ if( $this->setslicecolors==null ) {
+ $graph->legend->Add($l,$colors[$ta[$i%$numcolors]],"",0,$this->csimtargets[$i],$alt,$wintarg);
+ }
+ else {
+ $graph->legend->Add($l,$this->setslicecolors[$i%$numcolors],"",0,$this->csimtargets[$i],$alt,$wintarg);
+ }
+ }
+ }
+
+ // Adjust the rounded percetage value so that the sum of
+ // of the pie slices are always 100%
+ // Using the Hare/Niemeyer method
+ function AdjPercentage($aData,$aPrec=0) {
+ $mul=100;
+ if( $aPrec > 0 && $aPrec < 3 ) {
+ if( $aPrec == 1 )
+ $mul=1000;
+ else
+ $mul=10000;
+ }
+
+ $tmp = array();
+ $result = array();
+ $quote_sum=0;
+ $n = count($aData) ;
+ for( $i=0, $sum=0; $i < $n; ++$i )
+ $sum+=$aData[$i];
+ foreach($aData as $index => $value) {
+ $tmp_percentage=$value/$sum*$mul;
+ $result[$index]=floor($tmp_percentage);
+ $tmp[$index]=$tmp_percentage-$result[$index];
+ $quote_sum+=$result[$index];
+ }
+ if( $quote_sum == $mul) {
+ if( $mul > 100 ) {
+ $tmp = $mul / 100;
+ for( $i=0; $i < $n; ++$i ) {
+ $result[$i] /= $tmp ;
+ }
+ }
+ return $result;
+ }
+ arsort($tmp,SORT_NUMERIC);
+ reset($tmp);
+ for($i=0; $i < $mul-$quote_sum; $i++)
+ {
+ $result[key($tmp)]++;
+ next($tmp);
+ }
+ if( $mul > 100 ) {
+ $tmp = $mul / 100;
+ for( $i=0; $i < $n; ++$i ) {
+ $result[$i] /= $tmp ;
+ }
+ }
+ return $result;
+ }
+
+
+ function Stroke(&$img,$aaoption=0) {
+ // aaoption is used to handle antialias
+ // aaoption == 0 a normal pie
+ // aaoption == 1 just the body
+ // aaoption == 2 just the values
+
+ // Explode scaling. If anti anti alias we scale the image
+ // twice and we also need to scale the exploding distance
+ $expscale = $aaoption === 1 ? 2 : 1;
+
+ if( $this->labeltype == 2 ) {
+ // Adjust the data so that it will add up to 100%
+ $this->adjusted_data = $this->AdjPercentage($this->data);
+ }
+
+ $colors = array_keys($img->rgb->rgb_table);
+ sort($colors);
+ $ta=$this->themearr[$this->theme];
+ $n = count($this->data);
+
+ if( $this->setslicecolors==null ) {
+ $numcolors=count($ta);
+ }
+ else {
+ $this->setslicecolors = array_reverse(array_slice($this->setslicecolors,0,$n));
+ $numcolors=count($this->setslicecolors);
+ $tt = array_slice($this->setslicecolors,$n % $numcolors);
+ $tt2 = array_slice($this->setslicecolors,0,$n % $numcolors);
+ $tt2 = array_merge($tt, $tt2);
+ $this->setslicecolors = $tt + $tt2;
+ }
+
+ // Draw the slices
+ $sum=0;
+ for($i=0; $i < $n; ++$i)
+ $sum += $this->data[$i];
+
+ // Bail out with error if the sum is 0
+ if( $sum==0 )
+ JpGraphError::RaiseL(15009);//("Sum of all data is 0 for Pie.");
+
+ // Set up the pie-circle
+ if( $this->radius <= 1 )
+ $radius = floor($this->radius*min($img->width,$img->height));
+ else {
+ $radius = $aaoption === 1 ? $this->radius*2 : $this->radius;
+ }
+
+ if( $this->posx <= 1 && $this->posx > 0 )
+ $xc = round($this->posx*$img->width);
+ else
+ $xc = $this->posx ;
+
+ if( $this->posy <= 1 && $this->posy > 0 )
+ $yc = round($this->posy*$img->height);
+ else
+ $yc = $this->posy ;
+
+ $n = count($this->data);
+
+ if( $this->explode_all )
+ for($i=0; $i < $n; ++$i)
+ $this->explode_radius[$i]=$this->explode_r;
+
+ // If we have a shadow and not just drawing the labels
+ if( $this->ishadowcolor != "" && $aaoption !== 2) {
+ $accsum=0;
+ $angle2 = $this->startangle;
+ $img->SetColor($this->ishadowcolor);
+ for($i=0; $sum > 0 && $i < $n; ++$i) {
+ $j = $n-$i-1;
+ $d = $this->data[$i];
+ $angle1 = $angle2;
+ $accsum += $d;
+ $angle2 = $this->startangle+2*M_PI*$accsum/$sum;
+ if( empty($this->explode_radius[$j]) )
+ $this->explode_radius[$j]=0;
+
+ if( $d < 0.00001 ) continue;
+
+ $la = 2*M_PI - (abs($angle2-$angle1)/2.0+$angle1);
+
+ $xcm = $xc + $this->explode_radius[$j]*cos($la)*$expscale;
+ $ycm = $yc - $this->explode_radius[$j]*sin($la)*$expscale;
+
+ $xcm += $this->ishadowdrop*$expscale;
+ $ycm += $this->ishadowdrop*$expscale;
+
+ $_sa = round($angle1*180/M_PI);
+ $_ea = round($angle2*180/M_PI);
+
+ // The CakeSlice method draws a full circle in case of start angle = end angle
+ // for pie slices we don't want this behaviour unless we only have one
+ // slice in the pie in case it is the wanted behaviour
+ if( $_ea-$_sa > 0.1 || $n==1 ) {
+ $img->CakeSlice($xcm,$ycm,$radius-1,$radius-1,
+ $angle1*180/M_PI,$angle2*180/M_PI,$this->ishadowcolor);
+ }
+ }
+ }
+
+ //--------------------------------------------------------------------------------
+ // This is the main loop to draw each cake slice
+ //--------------------------------------------------------------------------------
+
+ // Set up the accumulated sum, start angle for first slice and border color
+ $accsum=0;
+ $angle2 = $this->startangle;
+ $img->SetColor($this->color);
+
+ // Loop though all the slices if there is a pie to draw (sum>0)
+ // There are n slices in total
+ for($i=0; $sum>0 && $i < $n; ++$i) {
+
+ // $j is the actual index used for the slice
+ $j = $n-$i-1;
+
+ // Make sure we havea valid distance to explode the slice
+ if( empty($this->explode_radius[$j]) )
+ $this->explode_radius[$j]=0;
+
+ // The actual numeric value for the slice
+ $d = $this->data[$i];
+
+ $angle1 = $angle2;
+
+ // Accumlate the sum
+ $accsum += $d;
+
+ // The new angle when we add the "size" of this slice
+ // angle1 is then the start and angle2 the end of this slice
+ $angle2 = $this->NormAngle($this->startangle+2*M_PI*$accsum/$sum);
+
+ // We avoid some trouble by not allowing end angle to be 0, in that case
+ // we translate to 360
+
+
+ // la is used to hold the label angle, which is centered on the slice
+ if( $angle2 < 0.0001 && $angle1 > 0.0001 ) {
+ $this->la[$i] = 2*M_PI - (abs(2*M_PI-$angle1)/2.0+$angle1);
+ }
+ elseif( $angle1 > $angle2 ) {
+ // The case where the slice crosses the 3 a'clock line
+ $this->la[$i] = 2*M_PI-$this->NormAngle($angle1 + ((2*M_PI - $angle1)+$angle2)/2);
+ }
+ else {
+ $this->la[$i] = 2*M_PI - (abs($angle2-$angle1)/2.0+$angle1);
+ }
+
+ //$_sa = round($angle1*180/M_PI);
+ //$_ea = round($angle2*180/M_PI);
+ //$_la = round($this->la[$i]*180/M_PI);
+ //echo "ang1=$_sa , ang2=$_ea - la=$_laJpGraph Error:
+HTTP headers have already been sent. Explanation:
HTTP headers have already been sent back to the browser indicating the data as text before the library got a chance to send it's image HTTP header to this browser. This makes it impossible for the library to send back image data to the browser (since that would be interpretated as text by the browser and show up as junk text).
";
+
+ // Too avoid rounding problems we skip the slice if it is too small
+ if( $d < 0.00001 ) continue;
+
+ // If the user has specified an array of colors for each slice then use
+ // that a color otherwise use the theme array (ta) of colors
+ if( $this->setslicecolors==null )
+ $slicecolor=$colors[$ta[$i%$numcolors]];
+ else
+ $slicecolor=$this->setslicecolors[$i%$numcolors];
+
+ // If we have enabled antialias then we don't draw any border so
+ // make the bordedr color the same as the slice color
+ if( $this->pie_interior_border && $aaoption===0 )
+ $img->SetColor($this->color);
+ else
+ $img->SetColor($slicecolor);
+ $arccolor = $this->pie_border && $aaoption===0 ? $this->color : "";
+
+ // Calculate the x,y coordinates for the base of this slice taking
+ // the exploded distance into account. Here we use the mid angle as the
+ // ray of extension and we have the mid angle handy as it is also the
+ // label angle
+ $xcm = $xc + $this->explode_radius[$j]*cos($this->la[$i])*$expscale;
+ $ycm = $yc - $this->explode_radius[$j]*sin($this->la[$i])*$expscale;
+
+ // If we are not just drawing the labels then draw this cake slice
+ if( $aaoption !== 2 ) {
+
+
+ $_sa = round($angle1*180/M_PI);
+ $_ea = round($angle2*180/M_PI);
+ $_la = round($this->la[$i]*180/M_PI);
+ //echo "[$i] sa=$_sa, ea=$_ea, la[$i]=$_la, (color=$slicecolor)
";
+
+
+ // The CakeSlice method draws a full circle in case of start angle = end angle
+ // for pie slices we don't want this behaviour unless we only have one
+ // slice in the pie in case it is the wanted behaviour
+ if( abs($_ea-$_sa) > 0.1 || $n==1 ) {
+ $img->CakeSlice($xcm,$ycm,$radius-1,$radius-1,$_sa,$_ea,$slicecolor,$arccolor);
+ }
+ }
+
+ // If the CSIM is used then make sure we register a CSIM area for this slice as well
+ if( $this->csimtargets && $aaoption !== 1 ) {
+ $this->AddSliceToCSIM($i,$xcm,$ycm,$radius,$angle1,$angle2);
+ }
+ }
+
+ // Format the titles for each slice
+ if( $aaoption!==2) {
+ for( $i=0; $i < $n; ++$i) {
+ if( $this->labeltype==0 ) {
+ if( $sum != 0 )
+ $l = 100.0*$this->data[$i]/$sum;
+ else
+ $l = 0.0;
+ }
+ elseif( $this->labeltype==1 ) {
+ $l = $this->data[$i]*1.0;
+ }
+ else {
+ $l = $this->adjusted_data[$i];
+ }
+ if( isset($this->labels[$i]) && is_string($this->labels[$i]) )
+ $this->labels[$i]=sprintf($this->labels[$i],$l);
+ else
+ $this->labels[$i]=$l;
+ }
+ }
+
+ If( $this->value->show && $aaoption !== 1 ) {
+ $this->StrokeAllLabels($img,$xc,$yc,$radius);
+ }
+
+ // Adjust title position
+ if( $aaoption !== 1 ) {
+ $this->title->Pos($xc,
+ $yc-$this->title->GetFontHeight($img)-$radius-$this->title->margin,
+ "center","bottom");
+ $this->title->Stroke($img);
+ }
+
+ }
+
+//---------------
+// PRIVATE METHODS
+
+ function NormAngle($a) {
+ while( $a < 0 ) $a += 2*M_PI;
+ while( $a > 2*M_PI ) $a -= 2*M_PI;
+ return $a;
+ }
+
+ function Quadrant($a) {
+ $a=$this->NormAngle($a);
+ if( $a > 0 && $a <= M_PI/2 )
+ return 0;
+ if( $a > M_PI/2 && $a <= M_PI )
+ return 1;
+ if( $a > M_PI && $a <= 1.5*M_PI )
+ return 2;
+ if( $a > 1.5*M_PI )
+ return 3;
+ }
+
+ function StrokeGuideLabels(&$img,$xc,$yc,$radius) {
+ $n = count($this->labels);
+
+ //-----------------------------------------------------------------------
+ // Step 1 of the algorithm is to construct a number of clusters
+ // a cluster is defined as all slices within the same quadrant (almost)
+ // that has an angular distance less than the treshold
+ //-----------------------------------------------------------------------
+ $tresh_hold=25 * M_PI/180; // 25 degrees difference to be in a cluster
+ $incluster=false; // flag if we are currently in a cluster or not
+ $clusters = array(); // array of clusters
+ $cidx=-1; // running cluster index
+
+ // Go through all the labels and construct a number of clusters
+ for($i=0; $i < $n-1; ++$i) {
+ // Calc the angle distance between two consecutive slices
+ $a1=$this->la[$i];
+ $a2=$this->la[$i+1];
+ $q1 = $this->Quadrant($a1);
+ $q2 = $this->Quadrant($a2);
+ $diff = abs($a1-$a2);
+ if( $diff < $tresh_hold ) {
+ if( $incluster ) {
+ $clusters[$cidx][1]++;
+ // Each cluster can only cover one quadrant
+ // Do we cross a quadrant ( and must break the cluster)
+ if( $q1 != $q2 ) {
+ // If we cross a quadrant boundary we normally start a
+ // new cluster. However we need to take the 12'a clock
+ // and 6'a clock positions into a special consideration.
+ // Case 1: WE go from q=1 to q=2 if the last slice on
+ // the cluster for q=1 is close to 12'a clock and the
+ // first slice in q=0 is small we extend the previous
+ // cluster
+ if( $q1 == 1 && $q2 == 0 && $a2 > (90-15)*M_PI/180 ) {
+ if( $i < $n-2 ) {
+ $a3 = $this->la[$i+2];
+ // If there isn't a cluster coming up with the next-next slice
+ // we extend the previous cluster to cover this slice as well
+ if( abs($a3-$a2) >= $tresh_hold ) {
+ $clusters[$cidx][1]++;
+ $i++;
+ }
+ }
+ }
+ elseif( $q1 == 3 && $q2 == 2 && $a2 > (270-15)*M_PI/180 ) {
+ if( $i < $n-2 ) {
+ $a3 = $this->la[$i+2];
+ // If there isn't a cluster coming up with the next-next slice
+ // we extend the previous cluster to cover this slice as well
+ if( abs($a3-$a2) >= $tresh_hold ) {
+ $clusters[$cidx][1]++;
+ $i++;
+ }
+ }
+ }
+
+ if( $q1==2 && $q2==1 && $a2 > (180-15)*M_PI/180 ) {
+ $clusters[$cidx][1]++;
+ $i++;
+ }
+
+ $incluster = false;
+ }
+ }
+ elseif( $q1 == $q2) {
+ $incluster = true;
+ // Now we have a special case for quadrant 0. If we previously
+ // have a cluster of one in quadrant 0 we just extend that
+ // cluster. If we don't do this then we risk that the label
+ // for the cluster of one will cross the guide-line
+ if( $q1 == 0 && $cidx > -1 &&
+ $clusters[$cidx][1] == 1 &&
+ $this->Quadrant($this->la[$clusters[$cidx][0]]) == 0 ) {
+ $clusters[$cidx][1]++;
+ }
+ else {
+ $cidx++;
+ $clusters[$cidx][0] = $i;
+ $clusters[$cidx][1] = 1;
+ }
+ }
+ else {
+ // Create a "cluster" of one since we are just crossing
+ // a quadrant
+ $cidx++;
+ $clusters[$cidx][0] = $i;
+ $clusters[$cidx][1] = 1;
+ }
+ }
+ else {
+ if( $incluster ) {
+ // Add the last slice
+ $clusters[$cidx][1]++;
+ $incluster = false;
+ }
+ else { // Create a "cluster" of one
+ $cidx++;
+ $clusters[$cidx][0] = $i;
+ $clusters[$cidx][1] = 1;
+ }
+ }
+ }
+ // Handle the very last slice
+ if( $incluster ) {
+ $clusters[$cidx][1]++;
+ }
+ else { // Create a "cluster" of one
+ $cidx++;
+ $clusters[$cidx][0] = $i;
+ $clusters[$cidx][1] = 1;
+ }
+
+ /*
+ if( true ) {
+ // Debug printout in labels
+ for( $i=0; $i <= $cidx; ++$i ) {
+ for( $j=0; $j < $clusters[$i][1]; ++$j ) {
+ $a = $this->la[$clusters[$i][0]+$j];
+ $aa = round($a*180/M_PI);
+ $q = $this->Quadrant($a);
+ $this->labels[$clusters[$i][0]+$j]="[$q:$aa] $i:$j";
+ }
+ }
+ }
+ */
+
+ //-----------------------------------------------------------------------
+ // Step 2 of the algorithm is use the clusters and draw the labels
+ // and guidelines
+ //-----------------------------------------------------------------------
+
+ // We use the font height as the base factor for how far we need to
+ // spread the labels in the Y-direction.
+ $img->SetFont($this->value->ff,$this->value->fs,$this->value->fsize);
+ $fh = $img->GetFontHeight();
+ $origvstep=$fh*$this->iGuideVFactor;
+ $this->value->SetMargin(0);
+
+ // Number of clusters found
+ $nc = count($clusters);
+
+ // Walk through all the clusters
+ for($i=0; $i < $nc; ++$i) {
+
+ // Start angle and number of slices in this cluster
+ $csize = $clusters[$i][1];
+ $a = $this->la[$clusters[$i][0]];
+ $q = $this->Quadrant($a);
+
+ // Now set up the start and end conditions to make sure that
+ // in each cluster we walk through the all the slices starting with the slice
+ // closest to the equator. Since all slices are numbered clockwise from "3'a clock"
+ // we have different conditions depending on in which quadrant the slice lies within.
+ if( $q == 0 ) {
+ $start = $csize-1; $idx = $start; $step = -1; $vstep = -$origvstep;
+ }
+ elseif( $q == 1 ) {
+ $start = 0; $idx = $start; $step = 1; $vstep = -$origvstep;
+ }
+ elseif( $q == 2 ) {
+ $start = $csize-1; $idx = $start; $step = -1; $vstep = $origvstep;
+ }
+ elseif( $q == 3 ) {
+ $start = 0; $idx = $start; $step = 1; $vstep = $origvstep;
+ }
+
+ // Walk through all slices within this cluster
+ for($j=0; $j < $csize; ++$j) {
+ // Now adjust the position of the labels in each cluster starting
+ // with the slice that is closest to the equator of the pie
+ $a = $this->la[$clusters[$i][0]+$idx];
+
+ // Guide line start in the center of the arc of the slice
+ $r = $radius+$this->explode_radius[$n-1-($clusters[$i][0]+$idx)];
+ $x = round($r*cos($a)+$xc);
+ $y = round($yc-$r*sin($a));
+
+ // The distance from the arc depends on chosen font and the "R-Factor"
+ $r += $fh*$this->iGuideLineRFactor;
+
+ // Should the labels be placed curved along the pie or in straight columns
+ // outside the pie?
+ if( $this->iGuideLineCurve )
+ $xt=round($r*cos($a)+$xc);
+
+ // If this is the first slice in the cluster we need some first time
+ // proessing
+ if( $idx == $start ) {
+ if( ! $this->iGuideLineCurve )
+ $xt=round($r*cos($a)+$xc);
+ $yt=round($yc-$r*sin($a));
+
+ // Some special consideration in case this cluster starts
+ // in quadrant 1 or 3 very close to the "equator" (< 20 degrees)
+ // and the previous clusters last slice is within the tolerance.
+ // In that case we add a font height to this labels Y-position
+ // so it doesn't collide with
+ // the slice in the previous cluster
+ $prevcluster = ($i + ($nc-1) ) % $nc;
+ $previdx=$clusters[$prevcluster][0]+$clusters[$prevcluster][1]-1;
+ if( $q == 1 && $a > 160*M_PI/180 ) {
+ // Get the angle for the previous clusters last slice
+ $diff = abs($a-$this->la[$previdx]);
+ if( $diff < $tresh_hold ) {
+ $yt -= $fh;
+ }
+ }
+ elseif( $q == 3 && $a > 340*M_PI/180 ) {
+ // We need to subtract 360 to compare angle distance between
+ // q=0 and q=3
+ $diff = abs($a-$this->la[$previdx]-360*M_PI/180);
+ if( $diff < $tresh_hold ) {
+ $yt += $fh;
+ }
+ }
+
+ }
+ else {
+ // The step is at minimum $vstep but if the slices are relatively large
+ // we make sure that we add at least a step that corresponds to the vertical
+ // distance between the centers at the arc on the slice
+ $prev_a = $this->la[$clusters[$i][0]+($idx-$step)];
+ $dy = abs($radius*(sin($a)-sin($prev_a))*1.2);
+ if( $vstep > 0 )
+ $yt += max($vstep,$dy);
+ else
+ $yt += min($vstep,-$dy);
+ }
+
+ $label = $this->labels[$clusters[$i][0]+$idx];
+
+ if( $csize == 1 ) {
+ // A "meta" cluster with only one slice
+ $r = $radius+$this->explode_radius[$n-1-($clusters[$i][0]+$idx)];
+ $rr = $r+$img->GetFontHeight()/2;
+ $xt=round($rr*cos($a)+$xc);
+ $yt=round($yc-$rr*sin($a));
+ $this->StrokeLabel($label,$img,$xc,$yc,$a,$r);
+ if( $this->iShowGuideLineForSingle )
+ $this->guideline->Stroke($img,$x,$y,$xt,$yt);
+ }
+ else {
+ $this->guideline->Stroke($img,$x,$y,$xt,$yt);
+ if( $q==1 || $q==2 ) {
+ // Left side of Pie
+ $this->guideline->Stroke($img,$xt,$yt,$xt-$this->guidelinemargin,$yt);
+ $lbladj = -$this->guidelinemargin-5;
+ $this->value->halign = "right";
+ $this->value->valign = "center";
+ }
+ else {
+ // Right side of pie
+ $this->guideline->Stroke($img,$xt,$yt,$xt+$this->guidelinemargin,$yt);
+ $lbladj = $this->guidelinemargin+5;
+ $this->value->halign = "left";
+ $this->value->valign = "center";
+ }
+ $this->value->Stroke($img,$label,$xt+$lbladj,$yt);
+ }
+
+ // Udate idx to point to next slice in the cluster to process
+ $idx += $step;
+ }
+ }
+ }
+
+ function StrokeAllLabels(&$img,$xc,$yc,$radius) {
+ // First normalize all angles for labels
+ $n = count($this->la);
+ for($i=0; $i < $n; ++$i) {
+ $this->la[$i] = $this->NormAngle($this->la[$i]);
+ }
+ if( $this->guideline->iShow ) {
+ $this->StrokeGuideLabels($img,$xc,$yc,$radius);
+ }
+ else {
+ $n = count($this->labels);
+ for($i=0; $i < $n; ++$i) {
+ $this->StrokeLabel($this->labels[$i],$img,$xc,$yc,
+ $this->la[$i],
+ $radius + $this->explode_radius[$n-1-$i]);
+ }
+ }
+ }
+
+ // Position the labels of each slice
+ function StrokeLabel($label,&$img,$xc,$yc,$a,$radius) {
+
+ // Default value
+ if( $this->ilabelposadj === 'auto' )
+ $this->ilabelposadj = 0.65;
+ $r = $radius;
+
+ // We position the values diferently depending on if they are inside
+ // or outside the pie
+ if( $this->ilabelposadj < 1.0 ) {
+
+ $this->value->SetAlign('center','center');
+ $this->value->margin = 0;
+
+ $xt=round($this->ilabelposadj*$r*cos($a)+$xc);
+ $yt=round($yc-$this->ilabelposadj*$r*sin($a));
+
+ $this->value->Stroke($img,$label,$xt,$yt);
+ }
+ else {
+
+ $this->value->halign = "left";
+ $this->value->valign = "top";
+ $this->value->margin = 0;
+
+ // Position the axis title.
+ // dx, dy is the offset from the top left corner of the bounding box that sorrounds the text
+ // that intersects with the extension of the corresponding axis. The code looks a little
+ // bit messy but this is really the only way of having a reasonable position of the
+ // axis titles.
+ $img->SetFont($this->value->ff,$this->value->fs,$this->value->fsize);
+ $h=$img->GetTextHeight($label);
+ // For numeric values the format of the display value
+ // must be taken into account
+ if( is_numeric($label) ) {
+ if( $label > 0 )
+ $w=$img->GetTextWidth(sprintf($this->value->format,$label));
+ else
+ $w=$img->GetTextWidth(sprintf($this->value->negformat,$label));
+ }
+ else
+ $w=$img->GetTextWidth($label);
+ if( $this->ilabelposadj > 1.0 && $this->ilabelposadj < 5.0) {
+ $r *= $this->ilabelposadj;
+ }
+
+ $r += $img->GetFontHeight()/1.5;
+
+ $xt=round($r*cos($a)+$xc);
+ $yt=round($yc-$r*sin($a));
+
+ // Normalize angle
+ while( $a < 0 ) $a += 2*M_PI;
+ while( $a > 2*M_PI ) $a -= 2*M_PI;
+
+ if( $a>=7*M_PI/4 || $a <= M_PI/4 ) $dx=0;
+ if( $a>=M_PI/4 && $a <= 3*M_PI/4 ) $dx=($a-M_PI/4)*2/M_PI;
+ if( $a>=3*M_PI/4 && $a <= 5*M_PI/4 ) $dx=1;
+ if( $a>=5*M_PI/4 && $a <= 7*M_PI/4 ) $dx=(1-($a-M_PI*5/4)*2/M_PI);
+
+ if( $a>=7*M_PI/4 ) $dy=(($a-M_PI)-3*M_PI/4)*2/M_PI;
+ if( $a<=M_PI/4 ) $dy=(1-$a*2/M_PI);
+ if( $a>=M_PI/4 && $a <= 3*M_PI/4 ) $dy=1;
+ if( $a>=3*M_PI/4 && $a <= 5*M_PI/4 ) $dy=(1-($a-3*M_PI/4)*2/M_PI);
+ if( $a>=5*M_PI/4 && $a <= 7*M_PI/4 ) $dy=0;
+
+ $this->value->Stroke($img,$label,$xt-$dx*$w,$yt-$dy*$h);
+ }
+ }
+} // Class
+
+
+//===================================================
+// CLASS PiePlotC
+// Description: Same as a normal pie plot but with a
+// filled circle in the center
+//===================================================
+class PiePlotC extends PiePlot {
+ var $imidsize=0.5; // Fraction of total width
+ var $imidcolor='white';
+ var $midtitle='';
+ var $middlecsimtarget='',$middlecsimwintarget='',$middlecsimalt='';
+
+ function PiePlotC($data,$aCenterTitle='') {
+ parent::PiePlot($data);
+ $this->midtitle = new Text();
+ $this->midtitle->ParagraphAlign('center');
+ }
+
+ function SetMid($aTitle,$aColor='white',$aSize=0.5) {
+ $this->midtitle->Set($aTitle);
+
+ $this->imidsize = $aSize ;
+ $this->imidcolor = $aColor ;
+ }
+
+ function SetMidTitle($aTitle) {
+ $this->midtitle->Set($aTitle);
+ }
+
+ function SetMidSize($aSize) {
+ $this->imidsize = $aSize ;
+ }
+
+ function SetMidColor($aColor) {
+ $this->imidcolor = $aColor ;
+ }
+
+ function SetMidCSIM($aTarget,$aAlt='',$aWinTarget='') {
+ $this->middlecsimtarget = $aTarget;
+ $this->middlecsimwintarget = $aWinTarget;
+ $this->middlecsimalt = $aAlt;
+ }
+
+ function AddSliceToCSIM($i,$xc,$yc,$radius,$sa,$ea) {
+
+ //Slice number, ellipse centre (x,y), radius, start angle, end angle
+ while( $sa > 2*M_PI ) $sa = $sa - 2*M_PI;
+ while( $ea > 2*M_PI ) $ea = $ea - 2*M_PI;
+
+ $sa = 2*M_PI - $sa;
+ $ea = 2*M_PI - $ea;
+
+ // Special case when we have only one slice since then both start and end
+ // angle will be == 0
+ if( abs($sa - $ea) < 0.0001 ) {
+ $sa=2*M_PI; $ea=0;
+ }
+
+ // Add inner circle first point
+ $xp = floor(($this->imidsize*$radius*cos($ea))+$xc);
+ $yp = floor($yc-($this->imidsize*$radius*sin($ea)));
+ $coords = "$xp, $yp";
+
+ //add coordinates every 0.25 radians
+ $a=$ea+0.25;
+
+ // If we cross the 260-limit with a slice we need to handle
+ // the fact that end angle is smaller than start
+ if( $sa < $ea ) {
+ while ($a <= 2*M_PI) {
+ $xp = floor($radius*cos($a)+$xc);
+ $yp = floor($yc-$radius*sin($a));
+ $coords.= ", $xp, $yp";
+ $a += 0.25;
+ }
+ $a -= 2*M_PI;
+ }
+
+ while ($a < $sa) {
+ $xp = floor(($this->imidsize*$radius*cos($a)+$xc));
+ $yp = floor($yc-($this->imidsize*$radius*sin($a)));
+ $coords.= ", $xp, $yp";
+ $a += 0.25;
+ }
+
+ // Make sure we end at the last point
+ $xp = floor(($this->imidsize*$radius*cos($sa)+$xc));
+ $yp = floor($yc-($this->imidsize*$radius*sin($sa)));
+ $coords.= ", $xp, $yp";
+
+ // Straight line to outer circle
+ $xp = floor($radius*cos($sa)+$xc);
+ $yp = floor($yc-$radius*sin($sa));
+ $coords.= ", $xp, $yp";
+
+ //add coordinates every 0.25 radians
+ $a=$sa - 0.25;
+ while ($a > $ea) {
+ $xp = floor($radius*cos($a)+$xc);
+ $yp = floor($yc-$radius*sin($a));
+ $coords.= ", $xp, $yp";
+ $a -= 0.25;
+ }
+
+ //Add the last point on the arc
+ $xp = floor($radius*cos($ea)+$xc);
+ $yp = floor($yc-$radius*sin($ea));
+ $coords.= ", $xp, $yp";
+
+ // Close the arc
+ $xp = floor(($this->imidsize*$radius*cos($ea))+$xc);
+ $yp = floor($yc-($this->imidsize*$radius*sin($ea)));
+ $coords .= ", $xp, $yp";
+
+ if( !empty($this->csimtargets[$i]) ) {
+ $this->csimareas .= "csimtargets[$i]."\"";
+ if( !empty($this->csimwintargets[$i]) ) {
+ $this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" ";
+ }
+ if( !empty($this->csimalts[$i]) ) {
+ $tmp=sprintf($this->csimalts[$i],$this->data[$i]);
+ $this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" ";
+ }
+ $this->csimareas .= " />\n";
+ }
+ }
+
+
+ function Stroke(&$img,$aaoption=0) {
+
+ // Stroke the pie but don't stroke values
+ $tmp = $this->value->show;
+ $this->value->show = false;
+ parent::Stroke($img,$aaoption);
+ $this->value->show = $tmp;
+
+ $xc = round($this->posx*$img->width);
+ $yc = round($this->posy*$img->height);
+
+ $radius = floor($this->radius * min($img->width,$img->height)) ;
+
+
+ if( $this->imidsize > 0 && $aaoption !== 2 ) {
+
+ if( $this->ishadowcolor != "" ) {
+ $img->SetColor($this->ishadowcolor);
+ $img->FilledCircle($xc+$this->ishadowdrop,$yc+$this->ishadowdrop,
+ round($radius*$this->imidsize));
+ }
+
+ $img->SetColor($this->imidcolor);
+ $img->FilledCircle($xc,$yc,round($radius*$this->imidsize));
+
+ if( $this->pie_border && $aaoption === 0 ) {
+ $img->SetColor($this->color);
+ $img->Circle($xc,$yc,round($radius*$this->imidsize));
+ }
+
+ if( !empty($this->middlecsimtarget) )
+ $this->AddMiddleCSIM($xc,$yc,round($radius*$this->imidsize));
+
+ }
+
+ if( $this->value->show && $aaoption !== 1) {
+ $this->StrokeAllLabels($img,$xc,$yc,$radius);
+ $this->midtitle->Pos($xc,$yc,'center','center');
+ $this->midtitle->Stroke($img);
+ }
+
+ }
+
+ function AddMiddleCSIM($xc,$yc,$r) {
+ $xc=round($xc);$yc=round($yc);$r=round($r);
+ $this->csimareas .= "middlecsimtarget."\"";
+ if( !empty($this->middlecsimwintarget) ) {
+ $this->csimareas .= " target=\"".$this->middlecsimwintarget."\"";
+ }
+ if( !empty($this->middlecsimalt) ) {
+ $tmp = $this->middlecsimalt;
+ $this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" ";
+ }
+ $this->csimareas .= " />\n";
+ }
+
+ function StrokeLabel($label,$img,$xc,$yc,$a,$r) {
+
+ if( $this->ilabelposadj === 'auto' )
+ $this->ilabelposadj = (1-$this->imidsize)/2+$this->imidsize;
+
+ parent::StrokeLabel($label,$img,$xc,$yc,$a,$r);
+
+ }
+
+}
+
+
+//===================================================
+// CLASS PieGraph
+// Description:
+//===================================================
+class PieGraph extends Graph {
+ var $posx, $posy, $radius;
+ var $legends=array();
+ var $plots=array();
+ var $pieaa = false ;
+//---------------
+// CONSTRUCTOR
+ function PieGraph($width=300,$height=200,$cachedName="",$timeout=0,$inline=1) {
+ $this->Graph($width,$height,$cachedName,$timeout,$inline);
+ $this->posx=$width/2;
+ $this->posy=$height/2;
+ $this->SetColor(array(255,255,255));
+ }
+
+//---------------
+// PUBLIC METHODS
+ function Add($aObj) {
+
+ if( is_array($aObj) && count($aObj) > 0 )
+ $cl = $aObj[0];
+ else
+ $cl = $aObj;
+
+ if( is_a($cl,'Text') )
+ $this->AddText($aObj);
+ elseif( is_a($cl,'IconPlot') )
+ $this->AddIcon($aObj);
+ else {
+ if( is_array($aObj) ) {
+ $n = count($aObj);
+ for($i=0; $i < $n; ++$i ) {
+ $this->plots[] = $aObj[$i];
+ }
+ }
+ else {
+ $this->plots[] = $aObj;
+ }
+ }
+ }
+
+ function SetAntiAliasing($aFlg=true) {
+ $this->pieaa = $aFlg;
+ }
+
+ function SetColor($c) {
+ $this->SetMarginColor($c);
+ }
+
+ function DisplayCSIMAreas() {
+ $csim="";
+ foreach($this->plots as $p ) {
+ $csim .= $p->GetCSIMareas();
+ }
+ //$csim.= $this->legend->GetCSIMareas();
+ if (preg_match_all("/area shape=\"(\w+)\" coords=\"([0-9\, ]+)\"/", $csim, $coords)) {
+ $this->img->SetColor($this->csimcolor);
+ $n = count($coords[0]);
+ for ($i=0; $i < $n; $i++) {
+ if ($coords[1][$i]=="poly") {
+ preg_match_all('/\s*([0-9]+)\s*,\s*([0-9]+)\s*,*/',$coords[2][$i],$pts);
+ $this->img->SetStartPoint($pts[1][count($pts[0])-1],$pts[2][count($pts[0])-1]);
+ $m = count($pts[0]);
+ for ($j=0; $j < $m; $j++) {
+ $this->img->LineTo($pts[1][$j],$pts[2][$j]);
+ }
+ } else if ($coords[1][$i]=="rect") {
+ $pts = preg_split('/,/', $coords[2][$i]);
+ $this->img->SetStartPoint($pts[0],$pts[1]);
+ $this->img->LineTo($pts[2],$pts[1]);
+ $this->img->LineTo($pts[2],$pts[3]);
+ $this->img->LineTo($pts[0],$pts[3]);
+ $this->img->LineTo($pts[0],$pts[1]);
+
+ }
+ }
+ }
+ }
+
+ // Method description
+ function Stroke($aStrokeFileName="") {
+ // If the filename is the predefined value = '_csim_special_'
+ // we assume that the call to stroke only needs to do enough
+ // to correctly generate the CSIM maps.
+ // We use this variable to skip things we don't strictly need
+ // to do to generate the image map to improve performance
+ // a best we can. Therefor you will see a lot of tests !$_csim in the
+ // code below.
+ $_csim = ($aStrokeFileName===_CSIM_SPECIALFILE);
+
+ // We need to know if we have stroked the plot in the
+ // GetCSIMareas. Otherwise the CSIM hasn't been generated
+ // and in the case of GetCSIM called before stroke to generate
+ // CSIM without storing an image to disk GetCSIM must call Stroke.
+ $this->iHasStroked = true;
+
+ $n = count($this->plots);
+
+ if( $this->pieaa ) {
+
+ if( !$_csim ) {
+ if( $this->background_image != "" ) {
+ $this->StrokeFrameBackground();
+ }
+ else {
+ $this->StrokeFrame();
+ }
+ }
+
+
+ $w = $this->img->width;
+ $h = $this->img->height;
+ $oldimg = $this->img->img;
+
+ $this->img->CreateImgCanvas(2*$w,2*$h);
+
+ $this->img->SetColor( $this->margin_color );
+ $this->img->FilledRectangle(0,0,2*$w-1,2*$h-1);
+
+ // Make all icons *2 i size since we will be scaling down the
+ // image to do the anti aliasing
+ $ni = count($this->iIcons);
+ for($i=0; $i < $ni; ++$i) {
+ $this->iIcons[$i]->iScale *= 2 ;
+ if( $this->iIcons[$i]->iX > 1 )
+ $this->iIcons[$i]->iX *= 2 ;
+ if( $this->iIcons[$i]->iY > 1 )
+ $this->iIcons[$i]->iY *= 2 ;
+ }
+
+ $this->StrokeIcons();
+
+ for($i=0; $i < $n; ++$i) {
+ if( $this->plots[$i]->posx > 1 )
+ $this->plots[$i]->posx *= 2 ;
+ if( $this->plots[$i]->posy > 1 )
+ $this->plots[$i]->posy *= 2 ;
+
+ $this->plots[$i]->Stroke($this->img,1);
+
+ if( $this->plots[$i]->posx > 1 )
+ $this->plots[$i]->posx /= 2 ;
+ if( $this->plots[$i]->posy > 1 )
+ $this->plots[$i]->posy /= 2 ;
+ }
+ $indent = $this->doframe ? ($this->frame_weight + ($this->doshadow ? $this->shadow_width : 0 )) : 0 ;
+ $indent += $this->framebevel ? $this->framebeveldepth + 1 : 0 ;
+ $this->img->CopyCanvasH($oldimg,$this->img->img,$indent,$indent,$indent,$indent,
+ $w-2*$indent,$h-2*$indent,2*($w-$indent),2*($h-$indent));
+
+ $this->img->img = $oldimg ;
+ $this->img->width = $w ;
+ $this->img->height = $h ;
+
+ for($i=0; $i < $n; ++$i) {
+ $this->plots[$i]->Stroke($this->img,2); // Stroke labels
+ $this->plots[$i]->Legend($this);
+ }
+
+ }
+ else {
+ // No antialias
+ if( !$_csim ) {
+ if( $this->background_image != "" ) {
+ $this->StrokeFrameBackground();
+ }
+ else {
+ $this->StrokeFrame();
+ $this->StrokeBackgroundGrad();
+ }
+ }
+
+ $this->StrokeIcons();
+ for($i=0; $i < $n; ++$i) {
+ $this->plots[$i]->Stroke($this->img);
+ $this->plots[$i]->Legend($this);
+ }
+ }
+
+ $this->legend->Stroke($this->img);
+ $this->footer->Stroke($this->img);
+ $this->StrokeTitles();
+
+ if( !$_csim ) {
+
+ // Stroke texts
+ if( $this->texts != null ) {
+ $n = count($this->texts);
+ for($i=0; $i < $n; ++$i ) {
+ $this->texts[$i]->Stroke($this->img);
+ }
+ }
+
+ if( _JPG_DEBUG ) {
+ $this->DisplayCSIMAreas();
+ }
+
+ // Should we do any final image transformation
+ if( $this->iImgTrans ) {
+ if( !class_exists('ImgTrans') ) {
+ require_once('jpgraph_imgtrans.php');
+ //JpGraphError::Raise('In order to use image transformation you must include the file jpgraph_imgtrans.php in your script.');
+ }
+
+ $tform = new ImgTrans($this->img->img);
+ $this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist,
+ $this->iImgTransDirection,$this->iImgTransHighQ,
+ $this->iImgTransMinSize,$this->iImgTransFillColor,
+ $this->iImgTransBorder);
+ }
+
+
+ // If the filename is given as the special "__handle"
+ // then the image handler is returned and the image is NOT
+ // streamed back
+ if( $aStrokeFileName == _IMG_HANDLER ) {
+ return $this->img->img;
+ }
+ else {
+ // Finally stream the generated picture
+ $this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,
+ $aStrokeFileName);
+ }
+ }
+ }
+} // Class
+
+/* EOF */
+?>
diff --git a/html/includes/jpgraph/src/jpgraph_pie3d.php b/html/includes/jpgraph/src/jpgraph_pie3d.php
new file mode 100644
index 0000000000..82afcdc803
--- /dev/null
+++ b/html/includes/jpgraph/src/jpgraph_pie3d.php
@@ -0,0 +1,923 @@
+radius = 0.5;
+ $this->data = $data;
+ $this->title = new Text("");
+ $this->title->SetFont(FF_FONT1,FS_BOLD);
+ $this->value = new DisplayValue();
+ $this->value->Show();
+ $this->value->SetFormat('%.0f%%');
+ }
+
+//---------------
+// PUBLIC METHODS
+
+ // Set label arrays
+ function SetLegends($aLegend) {
+ $this->legends = array_reverse(array_slice($aLegend,0,count($this->data)));
+ }
+
+ function SetSliceColors($aColors) {
+ $this->setslicecolors = $aColors;
+ }
+
+ function Legend(&$aGraph) {
+ parent::Legend($aGraph);
+ $aGraph->legend->txtcol = array_reverse($aGraph->legend->txtcol);
+ }
+
+ function SetCSIMTargets($aTargets,$aAlts='',$aWinTargets='') {
+ $this->csimtargets = $aTargets;
+ $this->csimwintargets = $aWinTargets;
+ $this->csimalts = $aAlts;
+ }
+
+ // Should the slices be separated by a line? If color is specified as "" no line
+ // will be used to separate pie slices.
+ function SetEdge($aColor='black',$aWeight=1) {
+ $this->edgecolor = $aColor;
+ $this->edgeweight = $aWeight;
+ }
+
+ // Dummy function to make Pie3D behave in a similair way to 2D
+ function ShowBorder($exterior=true,$interior=true) {
+ JpGraphError::RaiseL(14001);
+//('Pie3D::ShowBorder() . Deprecated function. Use Pie3D::SetEdge() to control the edges around slices.');
+ }
+
+ // Specify projection angle for 3D in degrees
+ // Must be between 20 and 70 degrees
+ function SetAngle($a) {
+ if( $a<5 || $a>90 )
+ JpGraphError::RaiseL(14002);
+//("PiePlot3D::SetAngle() 3D Pie projection angle must be between 5 and 85 degrees.");
+ else
+ $this->angle = $a;
+ }
+
+ function AddSliceToCSIM($i,$xc,$yc,$height,$width,$thick,$sa,$ea) { //Slice number, ellipse centre (x,y), height, width, start angle, end angle
+
+ $sa *= M_PI/180;
+ $ea *= M_PI/180;
+
+ //add coordinates of the centre to the map
+ $coords = "$xc, $yc";
+
+ //add coordinates of the first point on the arc to the map
+ $xp = floor($width*cos($sa)/2+$xc);
+ $yp = floor($yc-$height*sin($sa)/2);
+ $coords.= ", $xp, $yp";
+
+ //If on the front half, add the thickness offset
+ if ($sa >= M_PI && $sa <= 2*M_PI*1.01) {
+ $yp = floor($yp+$thick);
+ $coords.= ", $xp, $yp";
+ }
+
+ //add coordinates every 0.2 radians
+ $a=$sa+0.2;
+ while ($a<$ea) {
+ $xp = floor($width*cos($a)/2+$xc);
+ if ($a >= M_PI && $a <= 2*M_PI*1.01) {
+ $yp = floor($yc-($height*sin($a)/2)+$thick);
+ } else {
+ $yp = floor($yc-$height*sin($a)/2);
+ }
+ $coords.= ", $xp, $yp";
+ $a += 0.2;
+ }
+
+ //Add the last point on the arc
+ $xp = floor($width*cos($ea)/2+$xc);
+ $yp = floor($yc-$height*sin($ea)/2);
+
+
+ if ($ea >= M_PI && $ea <= 2*M_PI*1.01) {
+ $coords.= ", $xp, ".floor($yp+$thick);
+ }
+ $coords.= ", $xp, $yp";
+ $alt='';
+
+ if( !empty($this->csimtargets[$i]) ) {
+ $this->csimareas .= "csimtargets[$i]."\"";
+
+ if( !empty($this->csimwintargets[$i]) ) {
+ $this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" ";
+ }
+
+ if( !empty($this->csimalts[$i]) ) {
+ $tmp=sprintf($this->csimalts[$i],$this->data[$i]);
+ $this->csimareas .= "alt=\"$tmp\" title=\"$tmp\" ";
+ }
+ $this->csimareas .= " />\n";
+ }
+
+ }
+
+ function SetLabels($aLabels,$aLblPosAdj="auto") {
+ $this->labels = $aLabels;
+ $this->ilabelposadj=$aLblPosAdj;
+ }
+
+
+ // Distance from the pie to the labels
+ function SetLabelMargin($m) {
+ $this->value->SetMargin($m);
+ }
+
+ // Show a thin line from the pie to the label for a specific slice
+ function ShowLabelHint($f=true) {
+ $this->showlabelhint=$f;
+ }
+
+ // Set color of hint line to label for each slice
+ function SetLabelHintColor($c) {
+ $this->labelhintcolor=$c;
+ }
+
+ function SetHeight($aHeight) {
+ $this->iThickness = $aHeight;
+ }
+
+
+// Normalize Angle between 0-360
+ function NormAngle($a) {
+ // Normalize anle to 0 to 2M_PI
+ //
+ if( $a > 0 ) {
+ while($a > 360) $a -= 360;
+ }
+ else {
+ while($a < 0) $a += 360;
+ }
+ if( $a < 0 )
+ $a = 360 + $a;
+
+ if( $a == 360 ) $a=0;
+ return $a;
+ }
+
+
+
+// Draw one 3D pie slice at position ($xc,$yc) with height $z
+ function Pie3DSlice(&$img,$xc,$yc,$w,$h,$sa,$ea,$z,$fillcolor,$shadow=0.65) {
+
+ // Due to the way the 3D Pie algorithm works we are
+ // guaranteed that any slice we get into this method
+ // belongs to either the left or right side of the
+ // pie ellipse. Hence, no slice will cross 90 or 270
+ // point.
+ if( ($sa < 90 && $ea > 90) || ( ($sa > 90 && $sa < 270) && $ea > 270) ) {
+ JpGraphError::RaiseL(14003);//('Internal assertion failed. Pie3D::Pie3DSlice');
+ exit(1);
+ }
+
+ $p[] = array();
+
+ // Setup pre-calculated values
+ $rsa = $sa/180*M_PI; // to Rad
+ $rea = $ea/180*M_PI; // to Rad
+ $sinsa = sin($rsa);
+ $cossa = cos($rsa);
+ $sinea = sin($rea);
+ $cosea = cos($rea);
+
+ // p[] is the points for the overall slice and
+ // pt[] is the points for the top pie
+
+ // Angular step when approximating the arc with a polygon train.
+ $step = 0.05;
+
+ if( $sa >= 270 ) {
+ if( $ea > 360 || ($ea > 0 && $ea <= 90) ) {
+ if( $ea > 0 && $ea <= 90 ) {
+ // Adjust angle to simplify conditions in loops
+ $rea += 2*M_PI;
+ }
+
+ $p = array($xc,$yc,$xc,$yc+$z,
+ $xc+$w*$cossa,$z+$yc-$h*$sinsa);
+ $pt = array($xc,$yc,$xc+$w*$cossa,$yc-$h*$sinsa);
+
+ for( $a=$rsa; $a < 2*M_PI; $a += $step ) {
+ $tca = cos($a);
+ $tsa = sin($a);
+ $p[] = $xc+$w*$tca;
+ $p[] = $z+$yc-$h*$tsa;
+ $pt[] = $xc+$w*$tca;
+ $pt[] = $yc-$h*$tsa;
+ }
+
+ $pt[] = $xc+$w;
+ $pt[] = $yc;
+
+ $p[] = $xc+$w;
+ $p[] = $z+$yc;
+ $p[] = $xc+$w;
+ $p[] = $yc;
+ $p[] = $xc;
+ $p[] = $yc;
+
+ for( $a=2*M_PI+$step; $a < $rea; $a += $step ) {
+ $pt[] = $xc + $w*cos($a);
+ $pt[] = $yc - $h*sin($a);
+ }
+
+ $pt[] = $xc+$w*$cosea;
+ $pt[] = $yc-$h*$sinea;
+ $pt[] = $xc;
+ $pt[] = $yc;
+
+ }
+ else {
+ $p = array($xc,$yc,$xc,$yc+$z,
+ $xc+$w*$cossa,$z+$yc-$h*$sinsa);
+ $pt = array($xc,$yc,$xc+$w*$cossa,$yc-$h*$sinsa);
+
+ $rea = $rea == 0.0 ? 2*M_PI : $rea;
+ for( $a=$rsa; $a < $rea; $a += $step ) {
+ $tca = cos($a);
+ $tsa = sin($a);
+ $p[] = $xc+$w*$tca;
+ $p[] = $z+$yc-$h*$tsa;
+ $pt[] = $xc+$w*$tca;
+ $pt[] = $yc-$h*$tsa;
+ }
+
+ $pt[] = $xc+$w*$cosea;
+ $pt[] = $yc-$h*$sinea;
+ $pt[] = $xc;
+ $pt[] = $yc;
+
+ $p[] = $xc+$w*$cosea;
+ $p[] = $z+$yc-$h*$sinea;
+ $p[] = $xc+$w*$cosea;
+ $p[] = $yc-$h*$sinea;
+ $p[] = $xc;
+ $p[] = $yc;
+ }
+ }
+ elseif( $sa >= 180 ) {
+ $p = array($xc,$yc,$xc,$yc+$z,$xc+$w*$cosea,$z+$yc-$h*$sinea);
+ $pt = array($xc,$yc,$xc+$w*$cosea,$yc-$h*$sinea);
+
+ for( $a=$rea; $a>$rsa; $a -= $step ) {
+ $tca = cos($a);
+ $tsa = sin($a);
+ $p[] = $xc+$w*$tca;
+ $p[] = $z+$yc-$h*$tsa;
+ $pt[] = $xc+$w*$tca;
+ $pt[] = $yc-$h*$tsa;
+ }
+
+ $pt[] = $xc+$w*$cossa;
+ $pt[] = $yc-$h*$sinsa;
+ $pt[] = $xc;
+ $pt[] = $yc;
+
+ $p[] = $xc+$w*$cossa;
+ $p[] = $z+$yc-$h*$sinsa;
+ $p[] = $xc+$w*$cossa;
+ $p[] = $yc-$h*$sinsa;
+ $p[] = $xc;
+ $p[] = $yc;
+
+ }
+ elseif( $sa >= 90 ) {
+ if( $ea > 180 ) {
+ $p = array($xc,$yc,$xc,$yc+$z,$xc+$w*$cosea,$z+$yc-$h*$sinea);
+ $pt = array($xc,$yc,$xc+$w*$cosea,$yc-$h*$sinea);
+
+ for( $a=$rea; $a > M_PI; $a -= $step ) {
+ $tca = cos($a);
+ $tsa = sin($a);
+ $p[] = $xc+$w*$tca;
+ $p[] = $z + $yc - $h*$tsa;
+ $pt[] = $xc+$w*$tca;
+ $pt[] = $yc-$h*$tsa;
+ }
+
+ $p[] = $xc-$w;
+ $p[] = $z+$yc;
+ $p[] = $xc-$w;
+ $p[] = $yc;
+ $p[] = $xc;
+ $p[] = $yc;
+
+ $pt[] = $xc-$w;
+ $pt[] = $z+$yc;
+ $pt[] = $xc-$w;
+ $pt[] = $yc;
+
+ for( $a=M_PI-$step; $a > $rsa; $a -= $step ) {
+ $pt[] = $xc + $w*cos($a);
+ $pt[] = $yc - $h*sin($a);
+ }
+
+ $pt[] = $xc+$w*$cossa;
+ $pt[] = $yc-$h*$sinsa;
+ $pt[] = $xc;
+ $pt[] = $yc;
+
+ }
+ else { // $sa >= 90 && $ea <= 180
+ $p = array($xc,$yc,$xc,$yc+$z,
+ $xc+$w*$cosea,$z+$yc-$h*$sinea,
+ $xc+$w*$cosea,$yc-$h*$sinea,
+ $xc,$yc);
+
+ $pt = array($xc,$yc,$xc+$w*$cosea,$yc-$h*$sinea);
+
+ for( $a=$rea; $a>$rsa; $a -= $step ) {
+ $pt[] = $xc + $w*cos($a);
+ $pt[] = $yc - $h*sin($a);
+ }
+
+ $pt[] = $xc+$w*$cossa;
+ $pt[] = $yc-$h*$sinsa;
+ $pt[] = $xc;
+ $pt[] = $yc;
+
+ }
+ }
+ else { // sa > 0 && ea < 90
+
+ $p = array($xc,$yc,$xc,$yc+$z,
+ $xc+$w*$cossa,$z+$yc-$h*$sinsa,
+ $xc+$w*$cossa,$yc-$h*$sinsa,
+ $xc,$yc);
+
+ $pt = array($xc,$yc,$xc+$w*$cossa,$yc-$h*$sinsa);
+
+ for( $a=$rsa; $a < $rea; $a += $step ) {
+ $pt[] = $xc + $w*cos($a);
+ $pt[] = $yc - $h*sin($a);
+ }
+
+ $pt[] = $xc+$w*$cosea;
+ $pt[] = $yc-$h*$sinea;
+ $pt[] = $xc;
+ $pt[] = $yc;
+ }
+
+ $img->PushColor($fillcolor.":".$shadow);
+ $img->FilledPolygon($p);
+ $img->PopColor();
+
+ $img->PushColor($fillcolor);
+ $img->FilledPolygon($pt);
+ $img->PopColor();
+ }
+
+ function SetStartAngle($aStart) {
+ if( $aStart < 0 || $aStart > 360 ) {
+ JpGraphError::RaiseL(14004);//('Slice start angle must be between 0 and 360 degrees.');
+ }
+ $this->startangle = $aStart;
+ }
+
+// Draw a 3D Pie
+ function Pie3D($aaoption,&$img,$data,$colors,$xc,$yc,$d,$angle,$z,
+ $shadow=0.65,$startangle=0,$edgecolor="",$edgeweight=1) {
+
+ //---------------------------------------------------------------------------
+ // As usual the algorithm get more complicated than I originally
+ // envisioned. I believe that this is as simple as it is possible
+ // to do it with the features I want. It's a good exercise to start
+ // thinking on how to do this to convince your self that all this
+ // is really needed for the general case.
+ //
+ // The algorithm two draw 3D pies without "real 3D" is done in
+ // two steps.
+ // First imagine the pie cut in half through a thought line between
+ // 12'a clock and 6'a clock. It now easy to imagine that we can plot
+ // the individual slices for each half by starting with the topmost
+ // pie slice and continue down to 6'a clock.
+ //
+ // In the algortithm this is done in three principal steps
+ // Step 1. Do the knife cut to ensure by splitting slices that extends
+ // over the cut line. This is done by splitting the original slices into
+ // upto 3 subslices.
+ // Step 2. Find the top slice for each half
+ // Step 3. Draw the slices from top to bottom
+ //
+ // The thing that slightly complicates this scheme with all the
+ // angle comparisons below is that we can have an arbitrary start
+ // angle so we must take into account the different equivalence classes.
+ // For the same reason we must walk through the angle array in a
+ // modulo fashion.
+ //
+ // Limitations of algorithm:
+ // * A small exploded slice which crosses the 270 degree point
+ // will get slightly nagged close to the center due to the fact that
+ // we print the slices in Z-order and that the slice left part
+ // get printed first and might get slightly nagged by a larger
+ // slice on the right side just before the right part of the small
+ // slice. Not a major problem though.
+ //---------------------------------------------------------------------------
+
+
+ // Determine the height of the ellippse which gives an
+ // indication of the inclination angle
+ $h = ($angle/90.0)*$d;
+ $sum = 0;
+ for($i=0; $i
',2),
+
+/*
+** Setup Fehler
+*/
+11 => array('Es wurde kein Pfad für CACHE_DIR angegeben. Bitte gib einen Pfad CACHE_DIR in der Datei jpg-config.inc an.',0),
+12 => array('Es wurde kein Pfad für TTF_DIR angegeben und der Pfad kann nicht automatisch ermittelt werden. Bitte gib den Pfad in der Datei jpg-config.inc an.',0),
+13 => array('The installed PHP version (%s) is not compatible with this release of the library. The library requires at least PHP version %s',2),
+
+/*
+** jpgraph_bar
+*/
+
+2001 => array('Die Anzahl der Farben ist nicht gleich der Anzahl der Vorlagen in BarPlot::SetPattern().',0),
+2002 => array('Unbekannte Vorlage im Aufruf von BarPlot::SetPattern().',0),
+2003 => array('Anzahl der X- und Y-Koordinaten sind nicht identisch. Anzahl der X-Koordinaten: %d; Anzahl der Y-Koordinaten: %d.',2),
+2004 => array('Alle Werte für ein Balkendiagramm (barplot) müssen numerisch sein. Du hast den Wert nr [%d] == %s angegeben.',2),
+2005 => array('Du hast einen leeren Vektor für die Schattierungsfarben im Balkendiagramm (barplot) angegeben.',0),
+2006 => array('Unbekannte Position für die Werte der Balken: %s.',1),
+2007 => array('Kann GroupBarPlot nicht aus einem leeren Vektor erzeugen.',0),
+2008 => array('GroupBarPlot Element nbr %d wurde nicht definiert oder ist leer.',0),
+2009 => array('Eins der Objekte, das an GroupBar weitergegeben wurde ist kein Balkendiagramm (BarPlot). Versichere Dich, dass Du den GroupBarPlot aus einem Vektor von Balkendiagrammen (barplot) oder AccBarPlot-Objekten erzeugst. (Class = %s)',1),
+2010 => array('Kann AccBarPlot nicht aus einem leeren Vektor erzeugen.',0),
+2011 => array('AccBarPlot-Element nbr %d wurde nicht definiert oder ist leer.',1),
+2012 => array('Eins der Objekte, das an AccBar weitergegeben wurde ist kein Balkendiagramm (barplot). Versichere Dich, dass Du den AccBar-Plot aus einem Vektor von Balkendiagrammen (barplot) erzeugst. (Class=%s)',1),
+2013 => array('Du hast einen leeren Vektor für die Schattierungsfarben im Balkendiagramm (barplot) angegeben.',0),
+2014 => array('Die Anzahl der Datenpunkte jeder Datenreihe in AccBarPlot muss gleich sein.',0),
+
+
+/*
+** jpgraph_date
+*/
+
+3001 => array('Es ist nur möglich, entweder SetDateAlign() oder SetTimeAlign() zu benutzen, nicht beides!',0),
+
+/*
+** jpgraph_error
+*/
+
+4002 => array('Fehler bei den Eingabedaten von LineErrorPlot. Die Anzahl der Datenpunkte mus ein Mehrfaches von drei sein!',0),
+
+/*
+** jpgraph_flags
+*/
+
+5001 => array('Unbekannte Flaggen-Größe (%d).',1),
+5002 => array('Der Flaggen-Index %s existiert nicht.',1),
+5003 => array('Es wurde eine ungültige Ordnungszahl (%d) für den Flaggen-Index angegeben.',1),
+5004 => array('Der Landesname %s hat kein korrespondierendes Flaggenbild. Die Flagge mag existieren, abr eventuell unter einem anderen Namen, z.B. versuche "united states" statt "usa".',1),
+
+
+/*
+** jpgraph_gantt
+*/
+
+6001 => array('Interner Fehler. Die Höhe für ActivityTitles ist < 0.',0),
+6002 => array('Es dürfen keine negativen Werte für die Gantt-Diagramm-Dimensionen angegeben werden. Verwende 0, wenn die Dimensionen automatisch ermittelt werden sollen.',0),
+6003 => array('Ungültiges Format für den Bedingungs-Parameter bei Index=%d in CreateSimple(). Der Parameter muss bei index 0 starten und Vektoren in der Form (Row,Constrain-To,Constrain-Type) enthalten.',1),
+6004 => array('Ungültiges Format für den Fortschritts-Parameter bei Index=%d in CreateSimple(). Der Parameter muss bei Index 0 starten und Vektoren in der Form (Row,Progress) enthalten.',1),
+6005 => array('SetScale() ist nicht sinnvoll bei Gantt-Diagrammen.',0),
+6006 => array('Das Gantt-Diagramm kann nicht automatisch skaliert werden. Es existieren keine Aktivitäten mit Termin. [GetBarMinMax() start >= n]',0),
+6007 => array('Plausibiltätsprüfung für die automatische Gantt-Diagramm-Größe schlug fehl. Entweder die Breite (=%d) oder die Höhe (=%d) ist größer als MAX_GANTTIMG_SIZE. Dies kann möglicherweise durch einen falschen Wert bei einer Aktivität hervorgerufen worden sein.',2),
+6008 => array('Du hast eine Bedingung angegeben von Reihe=%d bis Reihe=%d, die keine Aktivität hat.',2),
+6009 => array('Unbekannter Bedingungstyp von Reihe=%d bis Reihe=%d',2),
+6010 => array('Ungültiger Icon-Index für das eingebaute Gantt-Icon [%d]',1),
+6011 => array('Argument für IconImage muss entweder ein String oder ein Integer sein.',0),
+6012 => array('Unbekannter Typ bei der Gantt-Objekt-Title-Definition.',0),
+6015 => array('Ungültige vertikale Position %d',1),
+6016 => array('Der eingegebene Datums-String (%s) für eine Gantt-Aktivität kann nicht interpretiert werden. Versichere Dich, dass es ein gültiger Datumsstring ist, z.B. 2005-04-23 13:30',1),
+6017 => array('Unbekannter Datumstyp in GanttScale (%s).',1),
+6018 => array('Intervall für Minuten muss ein gerader Teiler einer Stunde sein, z.B. 1,5,10,12,15,20,30, etc. Du hast ein Intervall von %d Minuten angegeben.',1),
+6019 => array('Die vorhandene Breite (%d) für die Minuten ist zu klein, um angezeigt zu werden. Bitte benutze die automatische Größenermittlung oder vergrößere die Breite des Diagramms.',1),
+6020 => array('Das Intervall für die Stunden muss ein gerader Teiler eines Tages sein, z.B. 0:30, 1:00, 1:30, 4:00, etc. Du hast ein Intervall von %d eingegeben.',1),
+6021 => array('Unbekanntes Format für die Woche.',0),
+6022 => array('Die Gantt-Skala wurde nicht eingegeben.',0),
+6023 => array('Wenn Du sowohl Stunden als auch Minuten anzeigen lassen willst, muss das Stunden-Interval gleich 1 sein (anderenfalls ist es nicht sinnvoll, Minuten anzeigen zu lassen).',0),
+6024 => array('Das CSIM-Ziel muss als String angegeben werden. Der Start des Ziels ist: %d',1),
+6025 => array('Der CSIM-Alt-Text muss als String angegeben werden. Der Beginn des Alt-Textes ist: %d',1),
+6027 => array('Der Fortschrittswert muss im Bereich [0, 1] liegen.',0),
+6028 => array('Die eingegebene Höhe (%d) für GanttBar ist nicht im zulässigen Bereich.',1),
+6029 => array('Der Offset für die vertikale Linie muss im Bereich [0,1] sein.',0),
+6030 => array('Unbekannte Pfeilrichtung für eine Verbindung.',0),
+6031 => array('Unbekannter Pfeiltyp für eine Verbindung.',0),
+6032 => array('Interner Fehler: Unbekannter Pfadtyp (=%d) für eine Verbindung.',1),
+
+/*
+** jpgraph_gradient
+*/
+
+7001 => array('Unbekannter Gradiententyp (=%d).',1),
+
+/*
+** jpgraph_iconplot
+*/
+
+8001 => array('Der Mix-Wert für das Icon muss zwischen 0 und 100 sein.',0),
+8002 => array('Die Ankerposition für Icons muss entweder "top", "bottom", "left", "right" oder "center" sein.',0),
+8003 => array('Es ist nicht möglich, gleichzeitig ein Bild und eine Landesflagge für dasselbe Icon zu definieren',0),
+8004 => array('Wenn Du Landesflaggen benutzen willst, musst Du die Datei "jpgraph_flags.php" hinzufügen (per include).',0),
+
+/*
+** jpgraph_imgtrans
+*/
+
+9001 => array('Der Wert für die Bildtransformation ist außerhalb des zulässigen Bereichs. Der verschwindende Punkt am Horizont muss als Wert zwischen 0 und 1 angegeben werden.',0),
+
+/*
+** jpgraph_lineplot
+*/
+
+10001 => array('Die Methode LinePlot::SetFilled() sollte nicht mehr benutzt werden. Benutze lieber SetFillColor()',0),
+10002 => array('Der Plot ist zu kompliziert für FastLineStroke. Benutze lieber den StandardStroke()',0),
+10003 => array('Each plot in an accumulated lineplot must have the same number of data points.',0),
+/*
+** jpgraph_log
+*/
+
+11001 => array('Deine Daten enthalten nicht-numerische Werte.',0),
+11002 => array('Negative Werte können nicht für logarithmische Achsen verwendet werden.',0),
+11003 => array('Deine Daten enthalten nicht-numerische Werte.',0),
+11004 => array('Skalierungsfehler für die logarithmische Achse. Es gibt ein Problem mit den Daten der Achse. Der größte Wert muss größer sein als Null. Es ist mathematisch nicht möglich, einen Wert gleich Null in der Skala zu haben.',0),
+11005 => array('Das Tick-Intervall für die logarithmische Achse ist nicht definiert. Lösche jeden Aufruf von SetTextLabelStart() oder SetTextTickInterval() bei der logarithmischen Achse.',0),
+
+/*
+** jpgraph_mgraph
+*/
+
+12001 => array("Du benutzt GD 2.x und versuchst ein Nicht-Truecolor-Bild als Hintergrundbild zu benutzen. Um Hintergrundbilder mit GD 2.x zu benutzen, ist es notwendig Truecolor zu aktivieren, indem die USE_TRUECOLOR-Konstante auf TRUE gesetzt wird. Wegen eines Bugs in GD 2.0.1 ist die Qualität der Truetype-Schriften sehr schlecht, wenn man Truetype-Schriften mit Truecolor-Bildern verwendet.",0),
+12002 => array('Ungültiger Dateiname für MGraph::SetBackgroundImage() : %s. Die Datei muss eine gültige Dateierweiterung haben (jpg,gif,png), wenn die automatische Typerkennung verwendet wird.',1),
+12003 => array('Unbekannte Dateierweiterung (%s) in MGraph::SetBackgroundImage() für Dateiname: %s',2),
+12004 => array('Das Bildformat des Hintergrundbildes (%s) wird von Deiner System-Konfiguration nicht unterstützt. ',1),
+12005 => array('Das Hintergrundbild kann nicht gelesen werden: %s',1),
+12006 => array('Es wurden ungültige Größen für Breite oder Höhe beim Erstellen des Bildes angegeben, (Breite=%d, Höhe=%d)',2),
+12007 => array('Das Argument für MGraph::Add() ist nicht gültig für GD.',0),
+12008 => array('Deine PHP- (und GD-lib-) Installation scheint keine bekannten Bildformate zu unterstützen.',0),
+12009 => array('Deine PHP-Installation unterstützt das gewählte Bildformat nicht: %s',1),
+12010 => array('Es konnte kein Bild als Datei %s erzeugt werden. Überprüfe, ob Du die entsprechenden Schreibrechte im aktuellen Verzeichnis hast.',1),
+12011 => array('Es konnte kein Truecolor-Bild erzeugt werden. Überprüfe, ob Du wirklich die GD2-Bibliothek installiert hast.',0),
+12012 => array('Es konnte kein Bild erzeugt werden. Überprüfe, ob Du wirklich die GD2-Bibliothek installiert hast.',0),
+
+/*
+** jpgraph_pie3d
+*/
+
+14001 => array('Pie3D::ShowBorder(). Missbilligte Funktion. Benutze Pie3D::SetEdge(), um die Ecken der Tortenstücke zu kontrollieren.',0),
+14002 => array('PiePlot3D::SetAngle() 3D-Torten-Projektionswinkel muss zwischen 5 und 85 Grad sein.',0),
+14003 => array('Interne Festlegung schlug fehl. Pie3D::Pie3DSlice',0),
+14004 => array('Tortenstück-Startwinkel muss zwischen 0 und 360 Grad sein.',0),
+14005 => array('Pie3D Interner Fehler: Versuch, zweimal zu umhüllen bei der Suche nach dem Startindex.',0,),
+14006 => array('Pie3D Interner Fehler: Z-Sortier-Algorithmus für 3D-Tortendiagramme funktioniert nicht einwandfrei (2). Versuch, zweimal zu umhüllen beim Erstellen des Bildes.',0),
+14007 => array('Die Breite für das 3D-Tortendiagramm ist 0. Gib eine Breite > 0 an.',0),
+
+/*
+** jpgraph_pie
+*/
+
+15001 => array('PiePLot::SetTheme() Unbekannter Stil: %s',1),
+15002 => array('Argument für PiePlot::ExplodeSlice() muss ein Integer-Wert sein',0),
+15003 => array('Argument für PiePlot::Explode() muss ein Vektor mit Integer-Werten sein.',0),
+15004 => array('Tortenstück-Startwinkel muss zwischen 0 und 360 Grad sein.',0),
+15005 => array('PiePlot::SetFont() sollte nicht mehr verwendet werden. Benutze stattdessen PiePlot->value->SetFont().',0),
+15006 => array('PiePlot::SetSize() Radius für Tortendiagramm muss entweder als Bruch [0, 0.5] der Bildgröße oder als Absoluwert in Pixel im Bereich [10, 1000] angegeben werden.',0),
+15007 => array('PiePlot::SetFontColor() sollte nicht mehr verwendet werden. Benutze stattdessen PiePlot->value->SetColor()..',0),
+15008 => array('PiePlot::SetLabelType() der Typ für Tortendiagramme muss entweder 0 or 1 sein (nicht %d).',1),
+15009 => array('Ungültiges Tortendiagramm. Die Summe aller Daten ist Null.',0),
+15010 => array('Die Summe aller Daten ist Null.',0),
+15011 => array('Um Bildtransformationen benutzen zu können, muss die Datei jpgraph_imgtrans.php eingefügt werden (per include).',0),
+
+/*
+** jpgraph_plotband
+*/
+
+16001 => array('Die Dichte für das Pattern muss zwischen 1 und 100 sein. (Du hast %f eingegeben)',1),
+16002 => array('Es wurde keine Position für das Pattern angegeben.',0),
+16003 => array('Unbekannte Pattern-Definition (%d)',0),
+16004 => array('Der Mindeswert für das PlotBand ist größer als der Maximalwert. Bitte korrigiere dies!',0),
+
+
+/*
+** jpgraph_polar
+*/
+
+17001 => array('PolarPlots müssen eine gerade Anzahl von Datenpunkten haben. Jeder Datenpunkt ist ein Tupel (Winkel, Radius).',0),
+17002 => array('Unbekannte Ausrichtung für X-Achsen-Titel. (%s)',1),
+//17003 => array('Set90AndMargin() wird für PolarGraph nicht unterstützt.',0),
+17004 => array('Unbekannter Achsentyp für PolarGraph. Er muss entweder \'lin\' oder \'log\' sein.',0),
+
+/*
+** jpgraph_radar
+*/
+
+18001 => array('ClientSideImageMaps werden für RadarPlots nicht unterstützt.',0),
+18002 => array('RadarGraph::SupressTickMarks() sollte nicht mehr verwendet werden. Benutze stattdessen HideTickMarks().',0),
+18003 => array('Ungültiger Achsentyp für RadarPlot (%s). Er muss entweder \'lin\' oder \'log\' sein.',1),
+18004 => array('Die RadarPlot-Größe muss zwischen 0.1 und 1 sein. (Dein Wert=%f)',1),
+18005 => array('RadarPlot: nicht unterstützte Tick-Dichte: %d',1),
+18006 => array('Minimum Daten %f (RadarPlots sollten nur verwendet werden, wenn alle Datenpunkte einen Wert > 0 haben).',1),
+18007 => array('Die Anzahl der Titel entspricht nicht der Anzahl der Datenpunkte.',0),
+18008 => array('Jeder RadarPlot muss die gleiche Anzahl von Datenpunkten haben.',0),
+
+/*
+** jpgraph_regstat
+*/
+
+19001 => array('Spline: Anzahl der X- und Y-Koordinaten muss gleich sein.',0),
+19002 => array('Ungültige Dateneingabe für Spline. Zwei oder mehr aufeinanderfolgende X-Werte sind identisch. Jeder eigegebene X-Wert muss unterschiedlich sein, weil vom mathematischen Standpunkt ein Eins-zu-Eins-Mapping vorliegen muss, d.h. jeder X-Wert korrespondiert mit exakt einem Y-Wert.',0),
+19003 => array('Bezier: Anzahl der X- und Y-Koordinaten muss gleich sein.',0),
+
+/*
+** jpgraph_scatter
+*/
+
+20001 => array('Fieldplots müssen die gleiche Anzahl von X und Y Datenpunkten haben.',0),
+20002 => array('Bei Fieldplots muss ein Winkel für jeden X und Y Datenpunkt angegeben werden.',0),
+20003 => array('Scatterplots müssen die gleiche Anzahl von X- und Y-Datenpunkten haben.',0),
+
+/*
+** jpgraph_stock
+*/
+
+21001 => array('Die Anzahl der Datenwerte für Stock-Charts müssen ein Mehrfaches von %d Datenpunkten sein.',1),
+
+/*
+** jpgraph_plotmark
+*/
+
+23001 => array('Der Marker "%s" existiert nicht in der Farbe: %d',2),
+23002 => array('Der Farb-Index ist zu hoch für den Marker "%s"',1),
+23003 => array('Ein Dateiname muss angegeben werden, wenn Du den Marker-Typ auf MARK_IMG setzt.',0),
+
+/*
+** jpgraph_utils
+*/
+
+24001 => array('FuncGenerator : Keine Funktion definiert. ',0),
+24002 => array('FuncGenerator : Syntax-Fehler in der Funktionsdefinition ',0),
+24003 => array('DateScaleUtils: Unknown tick type specified in call to GetTicks()',0),
+
+/*
+** jpgraph
+*/
+
+25001 => array('Diese PHP-Installation ist nicht mit der GD-Bibliothek kompiliert. Bitte kompiliere PHP mit GD-Unterstützung neu, damit JpGraph funktioniert. (Weder die Funktion imagetypes() noch imagecreatefromstring() existiert!)',0),
+25002 => array('Diese PHP-Installation scheint nicht die benötigte GD-Bibliothek zu unterstützen. Bitte schau in der PHP-Dokumentation nach, wie man die GD-Bibliothek installiert und aktiviert.',0),
+25003 => array('Genereller PHP Fehler : Bei %s:%d : %s',3),
+25004 => array('Genereller PHP Fehler : %s ',1),
+25005 => array('PHP_SELF, die PHP-Global-Variable kann nicht ermittelt werden. PHP kann nicht von der Kommandozeile gestartet werden, wenn der Cache oder die Bilddateien automatisch benannt werden sollen.',0),
+25006 => array('Die Benutzung der FF_CHINESE (FF_BIG5) Schriftfamilie benötigt die iconv() Funktion in Deiner PHP-Konfiguration. Dies wird nicht defaultmäßig in PHP kompiliert (benötigt "--width-iconv" bei der Konfiguration).',0),
+25007 => array('Du versuchst das lokale (%s) zu verwenden, was von Deiner PHP-Installation nicht unterstützt wird. Hinweis: Benutze \'\', um das defaultmäßige Lokale für diese geographische Region festzulegen.',1),
+25008 => array('Die Bild-Breite und Höhe in Graph::Graph() müssen numerisch sein',0),
+25009 => array('Die Skalierung der Achsen muss angegeben werden mit Graph::SetScale()',0),
+
+25010 => array('Graph::Add() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0),
+25011 => array('Graph::AddY2() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0),
+25012 => array('Graph::AddYN() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0),
+25013 => array('Es können nur Standard-Plots zu multiplen Y-Achsen hinzugefügt werden',0),
+25014 => array('Graph::AddText() Du hast versucht, einen leeren Text zum Graph hinzuzufügen.',0),
+25015 => array('Graph::AddLine() Du hast versucht, eine leere Linie zum Graph hinzuzufügen.',0),
+25016 => array('Graph::AddBand() Du hast versucht, ein leeres Band zum Graph hinzuzufügen.',0),
+25017 => array('Du benutzt GD 2.x und versuchst, ein Hintergrundbild in einem Truecolor-Bild zu verwenden. Um Hintergrundbilder mit GD 2.x zu verwenden, ist es notwendig, Truecolor zu aktivieren, indem die USE_TRUECOLOR-Konstante auf TRUE gesetzt wird. Wegen eines Bugs in GD 2.0.1 ist die Qualität der Schrift sehr schlecht, wenn Truetype-Schrift in Truecolor-Bildern verwendet werden.',0),
+25018 => array('Falscher Dateiname für Graph::SetBackgroundImage() : "%s" muss eine gültige Dateinamenerweiterung (jpg,gif,png) haben, wenn die automatische Dateityperkennung verwenndet werden soll.',1),
+25019 => array('Unbekannte Dateinamenerweiterung (%s) in Graph::SetBackgroundImage() für Dateiname: "%s"',2),
+
+25020 => array('Graph::SetScale(): Dar Maximalwert muss größer sein als der Mindestwert.',0),
+25021 => array('Unbekannte Achsendefinition für die Y-Achse. (%s)',1),
+25022 => array('Unbekannte Achsendefinition für die X-Achse. (%s)',1),
+25023 => array('Nicht unterstützter Y2-Achsentyp: "%s" muss einer von (lin,log,int) sein.',1),
+25024 => array('Nicht unterstützter X-Achsentyp: "%s" muss einer von (lin,log,int) sein.',1),
+25025 => array('Nicht unterstützte Tick-Dichte: %d',1),
+25026 => array('Nicht unterstützter Typ der nicht angegebenen Y-Achse. Du hast entweder: 1. einen Y-Achsentyp für automatisches Skalieren definiert, aber keine Plots angegeben. 2. eine Achse direkt definiert, aber vergessen, die Tick-Dichte zu festzulegen.',0),
+25027 => array('Kann cached CSIM "%s" zum Lesen nicht öffnen.',1),
+25028 => array('Apache/PHP hat keine Schreibrechte, in das CSIM-Cache-Verzeichnis (%s) zu schreiben. Überprüfe die Rechte.',1),
+25029 => array('Kann nicht in das CSIM "%s" schreiben. Überprüfe die Schreibrechte und den freien Speicherplatz.',1),
+
+25030 => array('Fehlender Skriptname für StrokeCSIM(). Der Name des aktuellen Skriptes muss als erster Parameter von StrokeCSIM() angegeben werden.',0),
+25031 => array('Der Achsentyp muss mittels Graph::SetScale() angegeben werden.',0),
+25032 => array('Es existieren keine Plots für die Y-Achse nbr:%d',1),
+25033 => array('',0),
+25034 => array('Undefinierte X-Achse kann nicht gezeichnet werden. Es wurden keine Plots definiert.',0),
+25035 => array('Du hast Clipping aktiviert. Clipping wird nur für Diagramme mit 0 oder 90 Grad Rotation unterstützt. Bitte verändere Deinen Rotationswinkel (=%d Grad) dementsprechend oder deaktiviere Clipping.',1),
+25036 => array('Unbekannter Achsentyp AxisStyle() : %s',1),
+25037 => array('Das Bildformat Deines Hintergrundbildes (%s) wird von Deiner System-Konfiguration nicht unterstützt. ',1),
+25038 => array('Das Hintergrundbild scheint von einem anderen Typ (unterschiedliche Dateierweiterung) zu sein als der angegebene Typ. Angegebenen: %s; Datei: %s',2),
+25039 => array('Hintergrundbild kann nicht gelesen werden: "%s"',1),
+
+25040 => array('Es ist nicht möglich, sowohl ein Hintergrundbild als auch eine Hintergrund-Landesflagge anzugeben.',0),
+25041 => array('Um Landesflaggen als Hintergrund benutzen zu können, muss die Datei "jpgraph_flags.php" eingefügt werden (per include).',0),
+25042 => array('Unbekanntes Hintergrundbild-Layout',0),
+25043 => array('Unbekannter Titelhintergrund-Stil.',0),
+25044 => array('Automatisches Skalieren kann nicht verwendet werden, weil es unmöglich ist, einen gültigen min/max Wert für die Y-Achse zu ermitteln (nur Null-Werte).',0),
+25045 => array('Die Schriftfamilien FF_HANDWRT und FF_BOOK sind wegen Copyright-Problemen nicht mehr verfügbar. Diese Schriften können nicht mehr mit JpGraph verteilt werden. Bitte lade Dir Schriften von http://corefonts.sourceforge.net/ herunter.',0),
+25046 => array('Angegebene TTF-Schriftfamilie (id=%d) ist unbekannt oder existiert nicht. Bitte merke Dir, dass TTF-Schriften wegen Copyright-Problemen nicht mit JpGraph mitgeliefert werden. Du findest MS-TTF-Internetschriften (arial, courier, etc.) zum Herunterladen unter http://corefonts.sourceforge.net/',1),
+25047 => array('Stil %s ist nicht verfügbar für Schriftfamilie %s',2),
+25048 => array('Unbekannte Schriftstildefinition [%s].',1),
+25049 => array('Schriftdatei "%s" ist nicht lesbar oder existiert nicht.',1),
+
+25050 => array('Erstes Argument für Text::Text() muss ein String sein.',0),
+25051 => array('Ungültige Richtung angegeben für Text.',0),
+25052 => array('PANIK: Interner Fehler in SuperScript::Stroke(). Unbekannte vertikale Ausrichtung für Text.',0),
+25053 => array('PANIK: Interner Fehler in SuperScript::Stroke(). Unbekannte horizontale Ausrichtung für Text.',0),
+25054 => array('Interner Fehler: Unbekannte Grid-Achse %s',1),
+25055 => array('Axis::SetTickDirection() sollte nicht mehr verwendet werden. Benutze stattdessen Axis::SetTickSide().',0),
+25056 => array('SetTickLabelMargin() sollte nicht mehr verwendet werden. Benutze stattdessen Axis::SetLabelMargin().',0),
+25057 => array('SetTextTicks() sollte nicht mehr verwendet werden. Benutze stattdessen SetTextTickInterval().',0),
+25058 => array('TextLabelIntevall >= 1 muss angegeben werden.',0),
+25059 => array('SetLabelPos() sollte nicht mehr verwendet werden. Benutze stattdessen Axis::SetLabelSide().',0),
+
+25060 => array('Unbekannte Ausrichtung angegeben für X-Achsentitel (%s).',1),
+25061 => array('Unbekannte Ausrichtung angegeben für Y-Achsentitel (%s).',1),
+25062 => array('Label unter einem Winkel werden für die Y-Achse nicht unterstützt.',0),
+25063 => array('Ticks::SetPrecision() sollte nicht mehr verwendet werden. Benutze stattdessen Ticks::SetLabelFormat() (oder Ticks::SetFormatCallback()).',0),
+25064 => array('Kleinere oder größere Schrittgröße ist 0. Überprüfe, ob Du fälschlicherweise SetTextTicks(0) in Deinem Skript hast. Wenn dies nicht der Fall ist, bist Du eventuell über einen Bug in JpGraph gestolpert. Bitte sende einen Report und füge den Code an, der den Fehler verursacht hat.',0),
+25065 => array('Tick-Positionen müssen als array() angegeben werden',0),
+25066 => array('Wenn die Tick-Positionen und -Label von Hand eingegeben werden, muss die Anzahl der Ticks und der Label gleich sein.',0),
+25067 => array('Deine von Hand eingegebene Achse und Ticks sind nicht korrekt. Die Skala scheint zu klein zu sein für den Tickabstand.',0),
+25068 => array('Ein Plot hat eine ungültige Achse. Dies kann beispielsweise der Fall sein, wenn Du automatisches Text-Skalieren verwendest, um ein Liniendiagramm zu zeichnen mit nur einem Datenpunkt, oder wenn die Bildfläche zu klein ist. Es kann auch der Fall sein, dass kein Datenpunkt einen numerischen Wert hat (vielleicht nur \'-\' oder \'x\').',0),
+25069 => array('Grace muss größer sein als 0',0),
+
+25070 => array('Deine Daten enthalten nicht-numerische Werte.',0),
+25071 => array('Du hast mit SetAutoMin() einen Mindestwert angegeben, der größer ist als der Maximalwert für die Achse. Dies ist nicht möglich.',0),
+25072 => array('Du hast mit SetAutoMax() einen Maximalwert angegeben, der kleiner ist als der Minimalwert der Achse. Dies ist nicht möglich.',0),
+25073 => array('Interner Fehler. Der Integer-Skalierungs-Algorithmus-Vergleich ist außerhalb der Grenzen (r=%f).',1),
+25074 => array('Interner Fehler. Der Skalierungsbereich ist negativ (%f) [für %s Achse]. Dieses Problem könnte verursacht werden durch den Versuch, \'ungültige\' Werte in die Daten-Vektoren einzugeben (z.B. nur String- oder NULL-Werte), was beim automatischen Skalieren einen Fehler erzeugt.',2),
+25075 => array('Die automatischen Ticks können nicht gesetzt werden, weil min==max.',0),
+25077 => array('Einstellfaktor für die Farbe muss größer sein als 0',0),
+25078 => array('Unbekannte Farbe: %s',1),
+25079 => array('Unbekannte Farbdefinition: %s, Größe=%d',2),
+
+25080 => array('Der Alpha-Parameter für Farben muss zwischen 0.0 und 1.0 liegen.',0),
+25081 => array('Das ausgewählte Grafikformat wird entweder nicht unterstützt oder ist unbekannt [%s]',1),
+25082 => array('Es wurden ungültige Größen für Breite und Höhe beim Erstellen des Bildes definiert (Breite=%d, Höhe=%d).',2),
+25083 => array('Es wurde eine ungültige Größe beim Kopieren des Bildes angegeben. Die Größe für das kopierte Bild wurde auf 1 Pixel oder weniger gesetzt.',0),
+25084 => array('Fehler beim Erstellen eines temporären GD-Canvas. Möglicherweise liegt ein Arbeitsspeicherproblem vor.',0),
+25085 => array('Ein Bild kann nicht aus dem angegebenen String erzeugt werden. Er ist entweder in einem nicht unterstützen Format oder er represäntiert ein kaputtes Bild.',0),
+25086 => array('Du scheinst nur GD 1.x installiert zu haben. Um Alphablending zu aktivieren, ist GD 2.x oder höher notwendig. Bitte installiere GD 2.x oder versichere Dich, dass die Konstante USE_GD2 richtig gesetzt ist. Standardmäßig wird die installierte GD-Version automatisch erkannt. Ganz selten wird GD2 erkannt, obwohl nur GD1 installiert ist. Die Konstante USE_GD2 muss dann zu "false" gesetzt werden.',0),
+25087 => array('Diese PHP-Version wurde ohne TTF-Unterstützung konfiguriert. PHP muss mit TTF-Unterstützung neu kompiliert und installiert werden.',0),
+25088 => array('Die GD-Schriftunterstützung wurde falsch konfiguriert. Der Aufruf von imagefontwidth() ist fehlerhaft.',0),
+25089 => array('Die GD-Schriftunterstützung wurde falsch konfiguriert. Der Aufruf von imagefontheight() ist fehlerhaft.',0),
+
+25090 => array('Unbekannte Richtung angegeben im Aufruf von StrokeBoxedText() [%s].',1),
+25091 => array('Die interne Schrift untestützt das Schreiben von Text in einem beliebigen Winkel nicht. Benutze stattdessen TTF-Schriften.',0),
+25092 => array('Es liegt entweder ein Konfigurationsproblem mit TrueType oder ein Problem beim Lesen der Schriftdatei "%s" vor. Versichere Dich, dass die Datei existiert und Leserechte und -pfad vergeben sind. (wenn \'basedir\' restriction in PHP aktiviert ist, muss die Schriftdatei im Dokumentwurzelverzeichnis abgelegt werden). Möglicherweise ist die FreeType-Bibliothek falsch installiert. Versuche, mindestens zur FreeType-Version 2.1.13 zu aktualisieren und kompiliere GD mit einem korrekten Setup neu, damit die FreeType-Bibliothek gefunden werden kann.',1),
+25093 => array('Die Schriftdatei "%s" kann nicht gelesen werden beim Aufruf von Image::GetBBoxTTF. Bitte versichere Dich, dass die Schrift gesetzt wurde, bevor diese Methode aufgerufen wird, und dass die Schrift im TTF-Verzeichnis installiert ist.',1),
+25094 => array('Die Textrichtung muss in einem Winkel zwischen 0 und 90 engegeben werden.',0),
+25095 => array('Unbekannte Schriftfamilien-Definition. ',0),
+25096 => array('Der Farbpalette können keine weiteren Farben zugewiesen werden. Dem Bild wurde bereits die größtmögliche Anzahl von Farben (%d) zugewiesen und die Palette ist voll. Verwende stattdessen ein TrueColor-Bild',0),
+25097 => array('Eine Farbe wurde als leerer String im Aufruf von PushColor() angegegeben.',0),
+25098 => array('Negativer Farbindex. Unpassender Aufruf von PopColor().',0),
+25099 => array('Die Parameter für Helligkeit und Kontrast sind außerhalb des zulässigen Bereichs [-1,1]',0),
+
+25100 => array('Es liegt ein Problem mit der Farbpalette und dem GD-Setup vor. Bitte deaktiviere anti-aliasing oder verwende GD2 mit TrueColor. Wenn die GD2-Bibliothek installiert ist, versichere Dich, dass die Konstante USE_GD2 auf "true" gesetzt und TrueColor aktiviert ist.',0),
+25101 => array('Ungültiges numerisches Argument für SetLineStyle(): (%d)',1),
+25102 => array('Ungültiges String-Argument für SetLineStyle(): %s',1),
+25103 => array('Ungültiges Argument für SetLineStyle %s',1),
+25104 => array('Unbekannter Linientyp: %s',1),
+25105 => array('Es wurden NULL-Daten für ein gefülltes Polygon angegeben. Sorge dafür, dass keine NULL-Daten angegeben werden.',0),
+25106 => array('Image::FillToBorder : es können keine weiteren Farben zugewiesen werden.',0),
+25107 => array('In Datei "%s" kann nicht geschrieben werden. Überprüfe die aktuellen Schreibrechte.',1),
+25108 => array('Das Bild kann nicht gestreamt werden. Möglicherweise liegt ein Fehler im PHP/GD-Setup vor. Kompiliere PHP neu und verwende die eingebaute GD-Bibliothek, die mit PHP angeboten wird.',0),
+25109 => array('Deine PHP- (und GD-lib-) Installation scheint keine bekannten Grafikformate zu unterstützen. Sorge zunächst dafür, dass GD als PHP-Modul kompiliert ist. Wenn Du außerdem JPEG-Bilder verwenden willst, musst Du die JPEG-Bibliothek installieren. Weitere Details sind in der PHP-Dokumentation zu finden.',0),
+
+25110 => array('Dein PHP-Installation unterstützt das gewählte Grafikformat nicht: %s',1),
+25111 => array('Das gecachete Bild %s kann nicht gelöscht werden. Problem mit den Rechten?',1),
+25112 => array('Das Datum der gecacheten Datei (%s) liegt in der Zukunft.',1),
+25113 => array('Das gecachete Bild %s kann nicht gelöscht werden. Problem mit den Rechten?',1),
+25114 => array('PHP hat nicht die erforderlichen Rechte, um in die Cache-Datei %s zu schreiben. Bitte versichere Dich, dass der Benutzer, der PHP anwendet, die entsprechenden Schreibrechte für die Datei hat, wenn Du das Cache-System in JPGraph verwenden willst.',1),
+25115 => array('Berechtigung für gecachetes Bild %s kann nicht gesetzt werden. Problem mit den Rechten?',1),
+25116 => array('Datei kann nicht aus dem Cache %s geöffnet werden',1),
+25117 => array('Gecachetes Bild %s kann nicht zum Lesen geöffnet werden.',1),
+25118 => array('Verzeichnis %s kann nicht angelegt werden. Versichere Dich, dass PHP die Schreibrechte in diesem Verzeichnis hat.',1),
+25119 => array('Rechte für Datei %s können nicht gesetzt werden. Problem mit den Rechten?',1),
+
+25120 => array('Die Position für die Legende muss als Prozentwert im Bereich 0-1 angegeben werden.',0),
+25121 => array('Eine leerer Datenvektor wurde für den Plot eingegeben. Es muss wenigstens ein Datenpunkt vorliegen.',0),
+25122 => array('Stroke() muss als Subklasse der Klasse Plot definiert sein.',0),
+25123 => array('Du kannst keine Text-X-Achse mit X-Koordinaten verwenden. Benutze stattdessen eine "int" oder "lin" Achse.',0),
+25124 => array('Der Eingabedatenvektor mus aufeinanderfolgende Werte von 0 aufwärts beinhalten. Der angegebene Y-Vektor beginnt mit leeren Werten (NULL).',0),
+25125 => array('Ungültige Richtung für statische Linie.',0),
+25126 => array('Es kann kein TrueColor-Bild erzeugt werden. Überprüfe, ob die GD2-Bibliothek und PHP korrekt aufgesetzt wurden.',0),
+25127 => array('The library has been configured for automatic encoding conversion of Japanese fonts. This requires that PHP has the mb_convert_encoding() function. Your PHP installation lacks this function (PHP needs the "--enable-mbstring" when compiled).',0),
+
+/*
+**---------------------------------------------------------------------------------------------
+** Pro-version strings
+**---------------------------------------------------------------------------------------------
+*/
+
+/*
+** jpgraph_table
+*/
+
+27001 => array('GTextTable: Ungültiges Argument für Set(). Das Array-Argument muss 2-- dimensional sein.',0),
+27002 => array('GTextTable: Ungültiges Argument für Set()',0),
+27003 => array('GTextTable: Falsche Anzahl von Argumenten für GTextTable::SetColor()',0),
+27004 => array('GTextTable: Angegebener Zellenbereich, der verschmolzen werden soll, ist ungültig.',0),
+27005 => array('GTextTable: Bereits verschmolzene Zellen im Bereich (%d,%d) bis (%d,%d) können nicht ein weiteres Mal verschmolzen werden.',4),
+27006 => array('GTextTable: Spalten-Argument = %d liegt außerhalb der festgelegten Tabellengröße.',1),
+27007 => array('GTextTable: Zeilen-Argument = %d liegt außerhalb der festgelegten Tabellengröße.',1),
+27008 => array('GTextTable: Spalten- und Zeilengröße müssen zu den Dimensionen der Tabelle passen.',0),
+27009 => array('GTextTable: Die Anzahl der Tabellenspalten oder -zeilen ist 0. Versichere Dich, dass die Methoden Init() oder Set() aufgerufen werden.',0),
+27010 => array('GTextTable: Es wurde keine Ausrichtung beim Aufruf von SetAlign() angegeben.',0),
+27011 => array('GTextTable: Es wurde eine unbekannte Ausrichtung beim Aufruf von SetAlign() abgegeben. Horizontal=%s, Vertikal=%s',2),
+27012 => array('GTextTable: Interner Fehler. Es wurde ein ungültiges Argument festgeleget %s',1),
+27013 => array('GTextTable: Das Argument für FormatNumber() muss ein String sein.',0),
+27014 => array('GTextTable: Die Tabelle wurde weder mit einem Aufruf von Set() noch von Init() initialisiert.',0),
+27015 => array('GTextTable: Der Zellenbildbedingungstyp muss entweder TIMG_WIDTH oder TIMG_HEIGHT sein.',0),
+
+/*
+** jpgraph_windrose
+*/
+
+22001 => array('Die Gesamtsumme der prozentualen Anteile aller Windrosenarme darf 100%% nicht überschreiten!\n(Aktuell max: %d)',1),
+22002 => array('Das Bild ist zu klein für eine Skala. Bitte vergrößere das Bild.',0),
+22004 => array('Die Etikettendefinition für Windrosenrichtungen müssen 16 Werte haben (eine für jede Kompassrichtung).',0),
+22005 => array('Der Linientyp für radiale Linien muss einer von ("solid","dotted","dashed","longdashed") sein.',0),
+22006 => array('Es wurde ein ungültiger Windrosentyp angegeben.',0),
+22007 => array('Es wurden zu wenig Werte für die Bereichslegende angegeben.',0),
+22008 => array('Interner Fehler: Versuch, eine freie Windrose zu plotten, obwohl der Typ keine freie Windrose ist.',0),
+22009 => array('Du hast die gleiche Richtung zweimal angegeben, einmal mit einem Winkel und einmal mit einer Kompassrichtung (%f Grad).',0),
+22010 => array('Die Richtung muss entweder ein numerischer Wert sein oder eine der 16 Kompassrichtungen',0),
+22011 => array('Der Windrosenindex muss ein numerischer oder Richtungswert sein. Du hast angegeben Index=%d',1),
+22012 => array('Die radiale Achsendefinition für die Windrose enthält eine nicht aktivierte Richtung.',0),
+22013 => array('Du hast dasselbe Look&Feel für die gleiche Kompassrichtung zweimal engegeben, einmal mit Text und einmal mit einem Index (Index=%d)',1),
+22014 => array('Der Index für eine Kompassrichtung muss zwischen 0 und 15 sein.',0),
+22015 => array('Du hast einen unbekannten Windrosenplottyp angegeben.',0),
+22016 => array('Der Windrosenarmindex muss ein numerischer oder ein Richtungswert sein.',0),
+22017 => array('Die Windrosendaten enthalten eine Richtung, die nicht aktiviert ist. Bitte berichtige, welche Label angezeigt werden sollen.',0),
+22018 => array('Du hast für dieselbe Kompassrichtung zweimal Daten angegeben, einmal mit Text und einmal mit einem Index (Index=%d)',1),
+22019 => array('Der Index für eine Richtung muss zwischen 0 und 15 sein. Winkel dürfen nicht für einen regelmäßigen Windplot angegeben werden, sondern entweder ein Index oder eine Kompassrichtung.',0),
+22020 => array('Der Windrosenplot ist zu groß für die angegebene Bildgröße. Benutze entweder WindrosePlot::SetSize(), um den Plot kleiner zu machen oder vergrößere das Bild im ursprünglichen Aufruf von WindroseGraph().',0),
+22021 => array('It is only possible to add Text, IconPlot or WindrosePlot to a Windrose Graph',0),
+/*
+** jpgraph_odometer
+*/
+
+13001 => array('Unbekannter Nadeltypstil (%d).',1),
+13002 => array('Ein Wert für das Odometer (%f) ist außerhalb des angegebenen Bereichs [%f,%f]',3),
+
+/*
+** jpgraph_barcode
+*/
+
+1001 => array('Unbekannte Kodier-Specifikation: %s',1),
+1002 => array('datenvalidierung schlug fehl. [%s] kann nicht mittels der Kodierung "%s" kodiert werden',2),
+1003 => array('Interner Kodierfehler. Kodieren von %s ist nicht möglich in Code 128',1),
+1004 => array('Interner barcode Fehler. Unbekannter UPC-E Kodiertyp: %s',1),
+1005 => array('Interner Fehler. Das Textzeichen-Tupel (%s, %s) kann nicht im Code-128 Zeichensatz C kodiert werden.',2),
+1006 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, CTRL in CHARSET != A zu kodieren.',0),
+1007 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, DEL in CHARSET != B zu kodieren.',0),
+1008 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, kleine Buchstaben in CHARSET != B zu kodieren.',0),
+1009 => array('Kodieren mittels CODE 93 wird noch nicht unterstützt.',0),
+1010 => array('Kodieren mittels POSTNET wird noch nicht unterstützt.',0),
+1011 => array('Nicht untrstütztes Barcode-Backend für den Typ %s',1),
+
+/*
+** PDF417
+*/
+
+26001 => array('PDF417: Die Anzahl der Spalten muss zwischen 1 und 30 sein.',0),
+26002 => array('PDF417: Der Fehler-Level muss zwischen 0 und 8 sein.',0),
+26003 => array('PDF417: Ungültiges Format für Eingabedaten, um sie mit PDF417 zu kodieren.',0),
+26004 => array('PDF417: die eigebenen Daten können nicht mit Fehler-Level %d und %d spalten kodiert werden, weil daraus zu viele Symbole oder mehr als 90 Zeilen resultieren.',2),
+26005 => array('PDF417: Die Datei "%s" kann nicht zum Schreiben geöffnet werden.',1),
+26006 => array('PDF417: Interner Fehler. Die Eingabedatendatei für PDF417-Cluster %d ist fehlerhaft.',1),
+26007 => array('PDF417: Interner Fehler. GetPattern: Ungültiger Code-Wert %d (Zeile %d)',2),
+26008 => array('PDF417: Interner Fehler. Modus wurde nicht in der Modusliste!! Modus %d',1),
+26009 => array('PDF417: Kodierfehler: Ungültiges Zeichen. Zeichen kann nicht mit ASCII-Code %d kodiert werden.',1),
+26010 => array('PDF417: Interner Fehler: Keine Eingabedaten beim Dekodieren.',0),
+26011 => array('PDF417: Kodierfehler. Numerisches Kodieren bei nicht-numerischen Daten nicht möglich.',0),
+26012 => array('PDF417: Interner Fehler. Es wurden für den Binary-Kompressor keine Daten zum Dekodieren eingegeben.',0),
+26013 => array('PDF417: Interner Fehler. Checksum Fehler. Koeffiziententabellen sind fehlerhaft.',0),
+26014 => array('PDF417: Interner Fehler. Es wurden keine Daten zum Berechnen von Kodewörtern eingegeben.',0),
+26015 => array('PDF417: Interner Fehler. Ein Eintrag 0 in die Statusübertragungstabellen ist nicht NULL. Eintrag 1 = (%s)',1),
+26016 => array('PDF417: Interner Fehler: Nichtregistrierter Statusübertragungsmodus beim Dekodieren.',0),
+
+
+);
+
+?>
diff --git a/html/includes/jpgraph/src/lang/en.inc.php b/html/includes/jpgraph/src/lang/en.inc.php
new file mode 100644
index 0000000000..4844dc8681
--- /dev/null
+++ b/html/includes/jpgraph/src/lang/en.inc.php
@@ -0,0 +1,501 @@
+,JpGraph Fehler:
+HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zeile %d.Erklärung:
HTTP header wurden bereits zum Browser gesendet, wobei die Daten als Text gekennzeichnet wurden, bevor die Bibliothek die Chance hatte, seinen Bild-HTTP-Header zum Browser zu schicken. Dies verhindert, dass die Bibliothek Bilddaten zum Browser schicken kann (weil sie vom Browser als Text interpretiert würden und daher nur Mist dargestellt würde).
',2),
+
+/*
+** Setup errors
+*/
+11 => array('No path specified for CACHE_DIR. Please specify CACHE_DIR manually in jpg-config.inc',0),
+12 => array('No path specified for TTF_DIR and path can not be determined automatically. Please specify TTF_DIR manually (in jpg-config.inc).',0),
+13 => array('The installed PHP version (%s) is not compatible with this release of the library. The library requires at least PHP version %s',2),
+/*
+** jpgraph_bar
+*/
+
+2001 => array('Number of colors is not the same as the number of patterns in BarPlot::SetPattern()',0),
+2002 => array('Unknown pattern specified in call to BarPlot::SetPattern()',0),
+2003 => array('Number of X and Y points are not equal. Number of X-points: %d Number of Y-points: %d',2),
+2004 => array('All values for a barplot must be numeric. You have specified value nr [%d] == %s',2),
+2005 => array('You have specified an empty array for shadow colors in the bar plot.',0),
+2006 => array('Unknown position for values on bars : %s',1),
+2007 => array('Cannot create GroupBarPlot from empty plot array.',0),
+2008 => array('Group bar plot element nbr %d is undefined or empty.',0),
+2009 => array('One of the objects submitted to GroupBar is not a BarPlot. Make sure that you create the GroupBar plot from an array of BarPlot or AccBarPlot objects. (Class = %s)',1),
+2010 => array('Cannot create AccBarPlot from empty plot array.',0),
+2011 => array('Acc bar plot element nbr %d is undefined or empty.',1),
+2012 => array('One of the objects submitted to AccBar is not a BarPlot. Make sure that you create the AccBar plot from an array of BarPlot objects. (Class=%s)',1),
+2013 => array('You have specified an empty array for shadow colors in the bar plot.',0),
+2014 => array('Number of datapoints for each data set in accbarplot must be the same',0),
+
+
+/*
+** jpgraph_date
+*/
+
+3001 => array('It is only possible to use either SetDateAlign() or SetTimeAlign() but not both',0),
+
+/*
+** jpgraph_error
+*/
+
+4002 => array('Error in input data to LineErrorPlot. Number of data points must be a multiple of 3',0),
+
+/*
+** jpgraph_flags
+*/
+
+5001 => array('Unknown flag size (%d).',1),
+5002 => array('Flag index %s does not exist.',1),
+5003 => array('Invalid ordinal number (%d) specified for flag index.',1),
+5004 => array('The (partial) country name %s does not have a corresponding flag image. The flag may still exist but under another name, e.g. instead of "usa" try "united states".',1),
+
+
+/*
+** jpgraph_gantt
+*/
+
+6001 => array('Internal error. Height for ActivityTitles is < 0',0),
+6002 => array('You can\'t specify negative sizes for Gantt graph dimensions. Use 0 to indicate that you want the library to automatically determine a dimension.',0),
+6003 => array('Invalid format for Constrain parameter at index=%d in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Constrain-To,Constrain-Type)',1),
+6004 => array('Invalid format for Progress parameter at index=%d in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Progress)',1),
+6005 => array('SetScale() is not meaningful with Gantt charts.',0),
+6006 => array('Cannot autoscale Gantt chart. No dated activities exist. [GetBarMinMax() start >= n]',0),
+6007 => array('Sanity check for automatic Gantt chart size failed. Either the width (=%d) or height (=%d) is larger than MAX_GANTTIMG_SIZE. This could potentially be caused by a wrong date in one of the activities.',2),
+6008 => array('You have specified a constrain from row=%d to row=%d which does not have any activity',2),
+6009 => array('Unknown constrain type specified from row=%d to row=%d',2),
+6010 => array('Illegal icon index for Gantt builtin icon [%d]',1),
+6011 => array('Argument to IconImage must be string or integer',0),
+6012 => array('Unknown type in Gantt object title specification',0),
+6015 => array('Illegal vertical position %d',1),
+6016 => array('Date string (%s) specified for Gantt activity can not be interpretated. Please make sure it is a valid time string, e.g. 2005-04-23 13:30',1),
+6017 => array('Unknown date format in GanttScale (%s).',1),
+6018 => array('Interval for minutes must divide the hour evenly, e.g. 1,5,10,12,15,20,30 etc You have specified an interval of %d minutes.',1),
+6019 => array('The available width (%d) for minutes are to small for this scale to be displayed. Please use auto-sizing or increase the width of the graph.',1),
+6020 => array('Interval for hours must divide the day evenly, e.g. 0:30, 1:00, 1:30, 4:00 etc. You have specified an interval of %d',1),
+6021 => array('Unknown formatting style for week.',0),
+6022 => array('Gantt scale has not been specified.',0),
+6023 => array('If you display both hour and minutes the hour interval must be 1 (Otherwise it doesn\'t make sense to display minutes).',0),
+6024 => array('CSIM Target must be specified as a string. Start of target is: %d',1),
+6025 => array('CSIM Alt text must be specified as a string. Start of alt text is: %d',1),
+6027 => array('Progress value must in range [0, 1]',0),
+6028 => array('Specified height (%d) for gantt bar is out of range.',1),
+6029 => array('Offset for vertical line must be in range [0,1]',0),
+6030 => array('Unknown arrow direction for link.',0),
+6031 => array('Unknown arrow type for link.',0),
+6032 => array('Internal error: Unknown path type (=%d) specified for link.',1),
+
+/*
+** jpgraph_gradient
+*/
+
+7001 => array('Unknown gradient style (=%d).',1),
+
+/*
+** jpgraph_iconplot
+*/
+
+8001 => array('Mix value for icon must be between 0 and 100.',0),
+8002 => array('Anchor position for icons must be one of "top", "bottom", "left", "right" or "center"',0),
+8003 => array('It is not possible to specify both an image file and a country flag for the same icon.',0),
+8004 => array('In order to use Country flags as icons you must include the "jpgraph_flags.php" file.',0),
+
+/*
+** jpgraph_imgtrans
+*/
+
+9001 => array('Value for image transformation out of bounds. Vanishing point on horizon must be specified as a value between 0 and 1.',0),
+
+/*
+** jpgraph_lineplot
+*/
+
+10001 => array('LinePlot::SetFilled() is deprecated. Use SetFillColor()',0),
+10002 => array('Plot too complicated for fast line Stroke. Use standard Stroke()',0),
+10003 => array('Each plot in an accumulated lineplot must have the same number of data points.',0),
+/*
+** jpgraph_log
+*/
+
+11001 => array('Your data contains non-numeric values.',0),
+11002 => array('Negative data values can not be used in a log scale.',0),
+11003 => array('Your data contains non-numeric values.',0),
+11004 => array('Scale error for logarithmic scale. You have a problem with your data values. The max value must be greater than 0. It is mathematically impossible to have 0 in a logarithmic scale.',0),
+11005 => array('Specifying tick interval for a logarithmic scale is undefined. Remove any calls to SetTextLabelStart() or SetTextTickInterval() on the logarithmic scale.',0),
+
+/*
+** jpgraph_mgraph
+*/
+
+/* 12001 => array("You are using GD 2.x and are trying to use a background images on a non truecolor image. To use background images with GD 2.x it is necessary to enable truecolor by setting the USE_TRUECOLOR constant to TRUE. Due to a bug in GD 2.0.1 using any truetype fonts with truecolor images will result in very poor quality fonts.",0),*/
+
+12002 => array('Incorrect file name for MGraph::SetBackgroundImage() : %s Must have a valid image extension (jpg,gif,png) when using auto detection of image type',1),
+12003 => array('Unknown file extension (%s) in MGraph::SetBackgroundImage() for filename: %s',2),
+12004 => array('The image format of your background image (%s) is not supported in your system configuration. ',1),
+12005 => array('Can\'t read background image: %s',1),
+12006 => array('Illegal sizes specified for width or height when creating an image, (width=%d, height=%d)',2),
+12007 => array('Argument to MGraph::Add() is not a valid GD image handle.',0),
+12008 => array('Your PHP (and GD-lib) installation does not appear to support any known graphic formats.',0),
+12009 => array('Your PHP installation does not support the chosen graphic format: %s',1),
+12010 => array('Can\'t create or stream image to file %s Check that PHP has enough permission to write a file to the current directory.',1),
+12011 => array('Can\'t create truecolor image. Check that you really have GD2 library installed.',0),
+
+/*
+** jpgraph_pie3d
+*/
+
+14001 => array('Pie3D::ShowBorder() . Deprecated function. Use Pie3D::SetEdge() to control the edges around slices.',0),
+14002 => array('PiePlot3D::SetAngle() 3D Pie projection angle must be between 5 and 85 degrees.',0),
+14003 => array('Internal assertion failed. Pie3D::Pie3DSlice',0),
+14004 => array('Slice start angle must be between 0 and 360 degrees.',0),
+14005 => array('Pie3D Internal error: Trying to wrap twice when looking for start index',0,),
+14006 => array('Pie3D Internal Error: Z-Sorting algorithm for 3D Pies is not working properly (2). Trying to wrap twice while stroking.',0),
+14007 => array('Width for 3D Pie is 0. Specify a size > 0',0),
+
+/*
+** jpgraph_pie
+*/
+
+15001 => array('PiePLot::SetTheme() Unknown theme: %s',1),
+15002 => array('Argument to PiePlot::ExplodeSlice() must be an integer',0),
+15003 => array('Argument to PiePlot::Explode() must be an array with integer distances.',0),
+15004 => array('Slice start angle must be between 0 and 360 degrees.',0),
+15005 => array('PiePlot::SetFont() is deprecated. Use PiePlot->value->SetFont() instead.',0),
+15006 => array('PiePlot::SetSize() Radius for pie must either be specified as a fraction [0, 0.5] of the size of the image or as an absolute size in pixels in the range [10, 1000]',0),
+15007 => array('PiePlot::SetFontColor() is deprecated. Use PiePlot->value->SetColor() instead.',0),
+15008 => array('PiePlot::SetLabelType() Type for pie plots must be 0 or 1 (not %d).',1),
+15009 => array('Illegal pie plot. Sum of all data is zero for Pie Plot',0),
+15010 => array('Sum of all data is 0 for Pie.',0),
+15011 => array('In order to use image transformation you must include the file jpgraph_imgtrans.php in your script.',0),
+
+/*
+** jpgraph_plotband
+*/
+
+16001 => array('Density for pattern must be between 1 and 100. (You tried %f)',1),
+16002 => array('No positions specified for pattern.',0),
+16003 => array('Unknown pattern specification (%d)',0),
+16004 => array('Min value for plotband is larger than specified max value. Please correct.',0),
+
+
+/*
+** jpgraph_polar
+*/
+
+17001 => array('Polar plots must have an even number of data point. Each data point is a tuple (angle,radius).',0),
+17002 => array('Unknown alignment specified for X-axis title. (%s)',1),
+//17003 => array('Set90AndMargin() is not supported for polar graphs.',0),
+17004 => array('Unknown scale type for polar graph. Must be "lin" or "log"',0),
+
+/*
+** jpgraph_radar
+*/
+
+18001 => array('Client side image maps not supported for RadarPlots.',0),
+18002 => array('RadarGraph::SupressTickMarks() is deprecated. Use HideTickMarks() instead.',0),
+18003 => array('Illegal scale for radarplot (%s). Must be \'lin\' or \'log\'',1),
+18004 => array('Radar Plot size must be between 0.1 and 1. (Your value=%f)',1),
+18005 => array('RadarPlot Unsupported Tick density: %d',1),
+18006 => array('Minimum data %f (Radar plots should only be used when all data points > 0)',1),
+18007 => array('Number of titles does not match number of points in plot.',0),
+18008 => array('Each radar plot must have the same number of data points.',0),
+
+/*
+** jpgraph_regstat
+*/
+
+19001 => array('Spline: Number of X and Y coordinates must be the same',0),
+19002 => array('Invalid input data for spline. Two or more consecutive input X-values are equal. Each input X-value must differ since from a mathematical point of view it must be a one-to-one mapping, i.e. each X-value must correspond to exactly one Y-value.',0),
+19003 => array('Bezier: Number of X and Y coordinates must be the same',0),
+
+/*
+** jpgraph_scatter
+*/
+
+20001 => array('Fieldplots must have equal number of X and Y points.',0),
+20002 => array('Fieldplots must have an angle specified for each X and Y points.',0),
+20003 => array('Scatterplot must have equal number of X and Y points.',0),
+
+/*
+** jpgraph_stock
+*/
+
+21001 => array('Data values for Stock charts must contain an even multiple of %d data points.',1),
+
+/*
+** jpgraph_plotmark
+*/
+
+23001 => array('This marker "%s" does not exist in color with index: %d',2),
+23002 => array('Mark color index too large for marker "%s"',1),
+23003 => array('A filename must be specified if you set the mark type to MARK_IMG.',0),
+
+/*
+** jpgraph_utils
+*/
+
+24001 => array('FuncGenerator : No function specified. ',0),
+24002 => array('FuncGenerator : Syntax error in function specification ',0),
+24003 => array('DateScaleUtils: Unknown tick type specified in call to GetTicks()',0),
+/*
+** jpgraph
+*/
+
+25002 => array('Your PHP installation does not seem to have the required GD 2.x library enabled. Please see the PHP documentation, "Image" section. Make sure that "php_gd2.dll" statement is uncomment in the [modules] section in the php.ini file.',0),
+25003 => array('General PHP error : At %s:%d : %s',3),
+25004 => array('General PHP error : %s ',1),
+25005 => array('Can\'t access PHP_SELF, PHP global variable. You can\'t run PHP from command line if you want to use the \'auto\' naming of cache or image files.',0),
+25006 => array('Usage of FF_CHINESE (FF_BIG5) font family requires that your PHP setup has the iconv() function. By default this is not compiled into PHP (needs the "--width-iconv" when configured).',0),
+25007 => array('You are trying to use the locale (%s) which your PHP installation does not support. Hint: Use \'\' to indicate the default locale for this geographic region.',1),
+25008 => array('Image width/height argument in Graph::Graph() must be numeric',0),
+25009 => array('You must specify what scale to use with a call to Graph::SetScale()',0),
+
+25010 => array('Graph::Add() You tried to add a null plot to the graph.',0),
+25011 => array('Graph::AddY2() You tried to add a null plot to the graph.',0),
+25012 => array('Graph::AddYN() You tried to add a null plot to the graph.',0),
+25013 => array('You can only add standard plots to multiple Y-axis',0),
+25014 => array('Graph::AddText() You tried to add a null text to the graph.',0),
+25015 => array('Graph::AddLine() You tried to add a null line to the graph.',0),
+25016 => array('Graph::AddBand() You tried to add a null band to the graph.',0),
+25017 => array('You are using GD 2.x and are trying to use a background images on a non truecolor image. To use background images with GD 2.x it is necessary to enable truecolor by setting the USE_TRUECOLOR constant to TRUE. Due to a bug in GD 2.0.1 using any truetype fonts with truecolor images will result in very poor quality fonts.',0),
+25018 => array('Incorrect file name for Graph::SetBackgroundImage() : "%s" Must have a valid image extension (jpg,gif,png) when using auto detection of image type',1),
+25019 => array('Unknown file extension (%s) in Graph::SetBackgroundImage() for filename: "%s"',2),
+
+25020 => array('Graph::SetScale(): Specified Max value must be larger than the specified Min value.',0),
+25021 => array('Unknown scale specification for Y-scale. (%s)',1),
+25022 => array('Unknown scale specification for X-scale. (%s)',1),
+25023 => array('Unsupported Y2 axis type: "%s" Must be one of (lin,log,int)',1),
+25024 => array('Unsupported Y axis type: "%s" Must be one of (lin,log,int)',1),
+25025 => array('Unsupported Tick density: %d',1),
+25026 => array('Can\'t draw unspecified Y-scale. You have either: 1. Specified an Y axis for auto scaling but have not supplied any plots. 2. Specified a scale manually but have forgot to specify the tick steps',0),
+25027 => array('Can\'t open cached CSIM "%s" for reading.',1),
+25028 => array('Apache/PHP does not have permission to write to the CSIM cache directory (%s). Check permissions.',1),
+25029 => array('Can\'t write CSIM "%s" for writing. Check free space and permissions.',1),
+
+25030 => array('Missing script name in call to StrokeCSIM(). You must specify the name of the actual image script as the first parameter to StrokeCSIM().',0),
+25031 => array('You must specify what scale to use with a call to Graph::SetScale().',0),
+25032 => array('No plots for Y-axis nbr:%d',1),
+25033 => array('',0),
+25034 => array('Can\'t draw unspecified X-scale. No plots specified.',0),
+25035 => array('You have enabled clipping. Clipping is only supported for graphs at 0 or 90 degrees rotation. Please adjust you current angle (=%d degrees) or disable clipping.',1),
+25036 => array('Unknown AxisStyle() : %s',1),
+25037 => array('The image format of your background image (%s) is not supported in your system configuration. ',1),
+25038 => array('Background image seems to be of different type (has different file extension) than specified imagetype. Specified: %s File: %s',2),
+25039 => array('Can\'t read background image: "%s"',1),
+
+25040 => array('It is not possible to specify both a background image and a background country flag.',0),
+25041 => array('In order to use Country flags as backgrounds you must include the "jpgraph_flags.php" file.',0),
+25042 => array('Unknown background image layout',0),
+25043 => array('Unknown title background style.',0),
+25044 => array('Cannot use auto scaling since it is impossible to determine a valid min/max value of the Y-axis (only null values).',0),
+25045 => array('Font families FF_HANDWRT and FF_BOOK are no longer available due to copyright problem with these fonts. Fonts can no longer be distributed with JpGraph. Please download fonts from http://corefonts.sourceforge.net/',0),
+25046 => array('Specified TTF font family (id=%d) is unknown or does not exist. Please note that TTF fonts are not distributed with JpGraph for copyright reasons. You can find the MS TTF WEB-fonts (arial, courier etc) for download at http://corefonts.sourceforge.net/',1),
+25047 => array('Style %s is not available for font family %s',2),
+25048 => array('Unknown font style specification [%s].',1),
+25049 => array('Font file "%s" is not readable or does not exist.',1),
+
+25050 => array('First argument to Text::Text() must be a string.',0),
+25051 => array('Invalid direction specified for text.',0),
+25052 => array('PANIC: Internal error in SuperScript::Stroke(). Unknown vertical alignment for text',0),
+25053 => array('PANIC: Internal error in SuperScript::Stroke(). Unknown horizontal alignment for text',0),
+25054 => array('Internal error: Unknown grid axis %s',1),
+25055 => array('Axis::SetTickDirection() is deprecated. Use Axis::SetTickSide() instead',0),
+25056 => array('SetTickLabelMargin() is deprecated. Use Axis::SetLabelMargin() instead.',0),
+25057 => array('SetTextTicks() is deprecated. Use SetTextTickInterval() instead.',0),
+25058 => array('Text label interval must be specified >= 1.',0),
+25059 => array('SetLabelPos() is deprecated. Use Axis::SetLabelSide() instead.',0),
+
+25060 => array('Unknown alignment specified for X-axis title. (%s)',1),
+25061 => array('Unknown alignment specified for Y-axis title. (%s)',1),
+25062 => array('Labels at an angle are not supported on Y-axis',0),
+25063 => array('Ticks::SetPrecision() is deprecated. Use Ticks::SetLabelFormat() (or Ticks::SetFormatCallback()) instead',0),
+25064 => array('Minor or major step size is 0. Check that you haven\'t got an accidental SetTextTicks(0) in your code. If this is not the case you might have stumbled upon a bug in JpGraph. Please report this and if possible include the data that caused the problem',0),
+25065 => array('Tick positions must be specified as an array()',0),
+25066 => array('When manually specifying tick positions and labels the number of labels must be the same as the number of specified ticks.',0),
+25067 => array('Your manually specified scale and ticks is not correct. The scale seems to be too small to hold any of the specified tick marks.',0),
+25068 => array('A plot has an illegal scale. This could for example be that you are trying to use text auto scaling to draw a line plot with only one point or that the plot area is too small. It could also be that no input data value is numeric (perhaps only \'-\' or \'x\')',0),
+25069 => array('Grace must be larger then 0',0),
+25070 => array('Either X or Y data arrays contains non-numeric values. Check that the data is really specified as numeric data and not as strings. It is an error to specify data for example as \'-2345.2\' (using quotes).',0),
+25071 => array('You have specified a min value with SetAutoMin() which is larger than the maximum value used for the scale. This is not possible.',0),
+25072 => array('You have specified a max value with SetAutoMax() which is smaller than the minimum value used for the scale. This is not possible.',0),
+25073 => array('Internal error. Integer scale algorithm comparison out of bound (r=%f)',1),
+25074 => array('Internal error. The scale range is negative (%f) [for %s scale] This problem could potentially be caused by trying to use \"illegal\" values in the input data arrays (like trying to send in strings or only NULL values) which causes the auto scaling to fail.',2),
+25075 => array('Can\'t automatically determine ticks since min==max.',0),
+25077 => array('Adjustment factor for color must be > 0',0),
+25078 => array('Unknown color: %s',1),
+25079 => array('Unknown color specification: %s, size=%d',2),
+
+25080 => array('Alpha parameter for color must be between 0.0 and 1.0',0),
+25081 => array('Selected graphic format is either not supported or unknown [%s]',1),
+25082 => array('Illegal sizes specified for width or height when creating an image, (width=%d, height=%d)',2),
+25083 => array('Illegal image size when copying image. Size for copied to image is 1 pixel or less.',0),
+25084 => array('Failed to create temporary GD canvas. Possible Out of memory problem.',0),
+25085 => array('An image can not be created from the supplied string. It is either in a format not supported or the string is representing an corrupt image.',0),
+25086 => array('You only seem to have GD 1.x installed. To enable Alphablending requires GD 2.x or higher. Please install GD or make sure the constant USE_GD2 is specified correctly to reflect your installation. By default it tries to auto detect what version of GD you have installed. On some very rare occasions it may falsely detect GD2 where only GD1 is installed. You must then set USE_GD2 to false.',0),
+25087 => array('This PHP build has not been configured with TTF support. You need to recompile your PHP installation with FreeType support.',0),
+25088 => array('You have a misconfigured GD font support. The call to imagefontwidth() fails.',0),
+25089 => array('You have a misconfigured GD font support. The call to imagefontheight() fails.',0),
+
+25090 => array('Unknown direction specified in call to StrokeBoxedText() [%s]',1),
+25091 => array('Internal font does not support drawing text at arbitrary angle. Use TTF fonts instead.',0),
+25092 => array('There is either a configuration problem with TrueType or a problem reading font file "%s" Make sure file exists and is in a readable place for the HTTP process. (If \'basedir\' restriction is enabled in PHP then the font file must be located in the document root.). It might also be a wrongly installed FreeType library. Try upgrading to at least FreeType 2.1.13 and recompile GD with the correct setup so it can find the new FT library.',1),
+25093 => array('Can not read font file "%s" in call to Image::GetBBoxTTF. Please make sure that you have set a font before calling this method and that the font is installed in the TTF directory.',1),
+25094 => array('Direction for text most be given as an angle between 0 and 90.',0),
+25095 => array('Unknown font font family specification. ',0),
+25096 => array('Can\'t allocate any more colors.',0),
+25097 => array('Color specified as empty string in PushColor().',0),
+25098 => array('Negative Color stack index. Unmatched call to PopColor()',0),
+25099 => array('Parameters for brightness and Contrast out of range [-1,1]',0),
+
+25100 => array('Problem with color palette and your GD setup. Please disable anti-aliasing or use GD2 with true-color. If you have GD2 library installed please make sure that you have set the USE_GD2 constant to true and truecolor is enabled.',0),
+25101 => array('Illegal numeric argument to SetLineStyle(): (%d)',1),
+25102 => array('Illegal string argument to SetLineStyle(): %s',1),
+25103 => array('Illegal argument to SetLineStyle %s',1),
+25104 => array('Unknown line style: %s',1),
+25105 => array('NULL data specified for a filled polygon. Check that your data is not NULL.',0),
+25106 => array('Image::FillToBorder : Can not allocate more colors',0),
+25107 => array('Can\'t write to file "%s". Check that the process running PHP has enough permission.',1),
+25108 => array('Can\'t stream image. This is most likely due to a faulty PHP/GD setup. Try to recompile PHP and use the built-in GD library that comes with PHP.',0),
+25109 => array('Your PHP (and GD-lib) installation does not appear to support any known graphic formats. You need to first make sure GD is compiled as a module to PHP. If you also want to use JPEG images you must get the JPEG library. Please see the PHP docs for details.',0),
+
+25110 => array('Your PHP installation does not support the chosen graphic format: %s',1),
+25111 => array('Can\'t delete cached image %s. Permission problem?',1),
+25112 => array('Cached imagefile (%s) has file date in the future.',1),
+25113 => array('Can\'t delete cached image "%s". Permission problem?',1),
+25114 => array('PHP has not enough permissions to write to the cache file "%s". Please make sure that the user running PHP has write permission for this file if you wan to use the cache system with JpGraph.',1),
+25115 => array('Can\'t set permission for cached image "%s". Permission problem?',1),
+25116 => array('Cant open file from cache "%s"',1),
+25117 => array('Can\'t open cached image "%s" for reading.',1),
+25118 => array('Can\'t create directory "%s". Make sure PHP has write permission to this directory.',1),
+25119 => array('Can\'t set permissions for "%s". Permission problems?',1),
+
+25120 => array('Position for legend must be given as percentage in range 0-1',0),
+25121 => array('Empty input data array specified for plot. Must have at least one data point.',0),
+25122 => array('Stroke() must be implemented by concrete subclass to class Plot',0),
+25123 => array('You can\'t use a text X-scale with specified X-coords. Use a "int" or "lin" scale instead.',0),
+25124 => array('The input data array must have consecutive values from position 0 and forward. The given y-array starts with empty values (NULL)',0),
+25125 => array('Illegal direction for static line',0),
+25126 => array('Can\'t create truecolor image. Check that the GD2 library is properly setup with PHP.',0),
+25127 => array('The library has been configured for automatic encoding conversion of Japanese fonts. This requires that PHP has the mb_convert_encoding() function. Your PHP installation lacks this function (PHP needs the "--enable-mbstring" when compiled).',0),
+
+/*
+**---------------------------------------------------------------------------------------------
+** Pro-version strings
+**---------------------------------------------------------------------------------------------
+*/
+
+/*
+** jpgraph_table
+*/
+
+27001 => array('GTextTable: Invalid argument to Set(). Array argument must be 2 dimensional',0),
+27002 => array('GTextTable: Invalid argument to Set()',0),
+27003 => array('GTextTable: Wrong number of arguments to GTextTable::SetColor()',0),
+27004 => array('GTextTable: Specified cell range to be merged is not valid.',0),
+27005 => array('GTextTable: Cannot merge already merged cells in the range: (%d,%d) to (%d,%d)',4),
+27006 => array('GTextTable: Column argument = %d is outside specified table size.',1),
+27007 => array('GTextTable: Row argument = %d is outside specified table size.',1),
+27008 => array('GTextTable: Column and row size arrays must match the dimensions of the table',0),
+27009 => array('GTextTable: Number of table columns or rows are 0. Make sure Init() or Set() is called.',0),
+27010 => array('GTextTable: No alignment specified in call to SetAlign()',0),
+27011 => array('GTextTable: Unknown alignment specified in SetAlign(). Horizontal=%s, Vertical=%s',2),
+27012 => array('GTextTable: Internal error. Invalid alignment specified =%s',1),
+27013 => array('GTextTable: Argument to FormatNumber() must be a string.',0),
+27014 => array('GTextTable: Table is not initilaized with either a call to Set() or Init()',0),
+27015 => array('GTextTable: Cell image constrain type must be TIMG_WIDTH or TIMG_HEIGHT',0),
+
+/*
+** jpgraph_windrose
+*/
+
+22001 => array('Total percentage for all windrose legs in a windrose plot can not exceed 100%% !\n(Current max is: %d)',1),
+22002 => array('Graph is too small to have a scale. Please make the graph larger.',0),
+22004 => array('Label specification for windrose directions must have 16 values (one for each compass direction).',0),
+22005 => array('Line style for radial lines must be on of ("solid","dotted","dashed","longdashed") ',0),
+22006 => array('Illegal windrose type specified.',0),
+22007 => array('To few values for the range legend.',0),
+22008 => array('Internal error: Trying to plot free Windrose even though type is not a free windrose',0),
+22009 => array('You have specified the same direction twice, once with an angle and once with a compass direction (%f degrees)',0),
+22010 => array('Direction must either be a numeric value or one of the 16 compass directions',0),
+22011 => array('Windrose index must be numeric or direction label. You have specified index=%d',1),
+22012 => array('Windrose radial axis specification contains a direction which is not enabled.',0),
+22013 => array('You have specified the look&feel for the same compass direction twice, once with text and once with index (Index=%d)',1),
+22014 => array('Index for compass direction must be between 0 and 15.',0),
+22015 => array('You have specified an undefined Windrose plot type.',0),
+22016 => array('Windrose leg index must be numeric or direction label.',0),
+22017 => array('Windrose data contains a direction which is not enabled. Please adjust what labels are displayed.',0),
+22018 => array('You have specified data for the same compass direction twice, once with text and once with index (Index=%d)',1),
+22019 => array('Index for direction must be between 0 and 15. You can\'t specify angles for a Regular Windplot, only index and compass directions.',0),
+22020 => array('Windrose plot is too large to fit the specified Graph size. Please use WindrosePlot::SetSize() to make the plot smaller or increase the size of the Graph in the initial WindroseGraph() call.',0),
+22021 => array('It is only possible to add Text, IconPlot or WindrosePlot to a Windrose Graph',0),
+
+/*
+** jpgraph_odometer
+*/
+
+13001 => array('Unknown needle style (%d).',1),
+13002 => array('Value for odometer (%f) is outside specified scale [%f,%f]',3),
+
+/*
+** jpgraph_barcode
+*/
+
+1001 => array('Unknown encoder specification: %s',1),
+1002 => array('Data validation failed. Can\'t encode [%s] using encoding "%s"',2),
+1003 => array('Internal encoding error. Trying to encode %s is not possible in Code 128',1),
+1004 => array('Internal barcode error. Unknown UPC-E encoding type: %s',1),
+1005 => array('Internal error. Can\'t encode character tuple (%s, %s) in Code-128 charset C',2),
+1006 => array('Internal encoding error for CODE 128. Trying to encode control character in CHARSET != A',0),
+1007 => array('Internal encoding error for CODE 128. Trying to encode DEL in CHARSET != B',0),
+1008 => array('Internal encoding error for CODE 128. Trying to encode small letters in CHARSET != B',0),
+1009 => array('Encoding using CODE 93 is not yet supported.',0),
+1010 => array('Encoding using POSTNET is not yet supported.',0),
+1011 => array('Non supported barcode backend for type %s',1),
+
+/*
+** PDF417
+*/
+
+26001 => array('PDF417: Number of Columns must be >= 1 and <= 30',0),
+26002 => array('PDF417: Error level must be between 0 and 8',0),
+26003 => array('PDF417: Invalid format for input data to encode with PDF417',0),
+26004 => array('PDF417: Can\'t encode given data with error level %d and %d columns since it results in too many symbols or more than 90 rows.',2),
+26005 => array('PDF417: Can\'t open file "%s" for writing',1),
+26006 => array('PDF417: Internal error. Data files for PDF417 cluster %d is corrupted.',1),
+26007 => array('PDF417: Internal error. GetPattern: Illegal Code Value = %d (row=%d)',2),
+26008 => array('PDF417: Internal error. Mode not found in mode list!! mode=%d',1),
+26009 => array('PDF417: Encode error: Illegal character. Can\'t encode character with ASCII code=%d',1),
+26010 => array('PDF417: Internal error: No input data in decode.',0),
+26011 => array('PDF417: Encoding error. Can\'t use numeric encoding on non-numeric data.',0),
+26012 => array('PDF417: Internal error. No input data to decode for Binary compressor.',0),
+26013 => array('PDF417: Internal error. Checksum error. Coefficient tables corrupted.',0),
+26014 => array('PDF417: Internal error. No data to calculate codewords on.',0),
+26015 => array('PDF417: Internal error. State transition table entry 0 is NULL. Entry 1 = (%s)',1),
+26016 => array('PDF417: Internal error: Unrecognized state transition mode in decode.',0),
+
+
+);
+
+/*
+ ** EOF
+ */
+
+?>
diff --git a/html/includes/jpgraph/src/lang/prod.inc.php b/html/includes/jpgraph/src/lang/prod.inc.php
new file mode 100644
index 0000000000..4f2715d1eb
--- /dev/null
+++ b/html/includes/jpgraph/src/lang/prod.inc.php
@@ -0,0 +1,354 @@
+,JpGraph Error:
+HTTP headers have already been sent.
Caused by output from file %s at line %d.Explanation:
HTTP headers have already been sent back to the browser indicating the data as text before the library got a chance to send it\'s image HTTP header to this browser. This makes it impossible for the library to send back image data to the browser (since that would be interpretated as text by the browser and show up as junk text).
',2),
+
+
+11 => array(DEFAULT_ERROR_MESSAGE.'11',0),
+12 => array(DEFAULT_ERROR_MESSAGE.'12',0),
+13 => array(DEFAULT_ERROR_MESSAGE.'13',0),
+2001 => array(DEFAULT_ERROR_MESSAGE.'2001',0),
+2002 => array(DEFAULT_ERROR_MESSAGE.'2002',0),
+2003 => array(DEFAULT_ERROR_MESSAGE.'2003',0),
+2004 => array(DEFAULT_ERROR_MESSAGE.'2004',0),
+2005 => array(DEFAULT_ERROR_MESSAGE.'2005',0),
+2006 => array(DEFAULT_ERROR_MESSAGE.'2006',0),
+2007 => array(DEFAULT_ERROR_MESSAGE.'2007',0),
+2008 => array(DEFAULT_ERROR_MESSAGE.'2008',0),
+2009 => array(DEFAULT_ERROR_MESSAGE.'2009',0),
+2010 => array(DEFAULT_ERROR_MESSAGE.'2010',0),
+2011 => array(DEFAULT_ERROR_MESSAGE.'2011',0),
+2012 => array(DEFAULT_ERROR_MESSAGE.'2012',0),
+2013 => array(DEFAULT_ERROR_MESSAGE.'2013',0),
+2014 => array(DEFAULT_ERROR_MESSAGE.'2014',0),
+3001 => array(DEFAULT_ERROR_MESSAGE.'3001',0),
+4002 => array(DEFAULT_ERROR_MESSAGE.'4002',0),
+5001 => array(DEFAULT_ERROR_MESSAGE.'5001',0),
+5002 => array(DEFAULT_ERROR_MESSAGE.'5002',0),
+5003 => array(DEFAULT_ERROR_MESSAGE.'5003',0),
+5004 => array(DEFAULT_ERROR_MESSAGE.'5004',0),
+6001 => array(DEFAULT_ERROR_MESSAGE.'6001',0),
+6002 => array(DEFAULT_ERROR_MESSAGE.'6002',0),
+6003 => array(DEFAULT_ERROR_MESSAGE.'6003',0),
+6004 => array(DEFAULT_ERROR_MESSAGE.'6004',0),
+6005 => array(DEFAULT_ERROR_MESSAGE.'6005',0),
+6006 => array(DEFAULT_ERROR_MESSAGE.'6006',0),
+6007 => array(DEFAULT_ERROR_MESSAGE.'6007',0),
+6008 => array(DEFAULT_ERROR_MESSAGE.'6008',0),
+6009 => array(DEFAULT_ERROR_MESSAGE.'6009',0),
+6010 => array(DEFAULT_ERROR_MESSAGE.'6010',0),
+6011 => array(DEFAULT_ERROR_MESSAGE.'6011',0),
+6012 => array(DEFAULT_ERROR_MESSAGE.'6012',0),
+6015 => array(DEFAULT_ERROR_MESSAGE.'6015',0),
+6016 => array(DEFAULT_ERROR_MESSAGE.'6016',0),
+6017 => array(DEFAULT_ERROR_MESSAGE.'6017',0),
+6018 => array(DEFAULT_ERROR_MESSAGE.'6018',0),
+6019 => array(DEFAULT_ERROR_MESSAGE.'6019',0),
+6020 => array(DEFAULT_ERROR_MESSAGE.'6020',0),
+6021 => array(DEFAULT_ERROR_MESSAGE.'6021',0),
+6022 => array(DEFAULT_ERROR_MESSAGE.'6022',0),
+6023 => array(DEFAULT_ERROR_MESSAGE.'6023',0),
+6024 => array(DEFAULT_ERROR_MESSAGE.'6024',0),
+6025 => array(DEFAULT_ERROR_MESSAGE.'6025',0),
+6027 => array(DEFAULT_ERROR_MESSAGE.'6027',0),
+6028 => array(DEFAULT_ERROR_MESSAGE.'6028',0),
+6029 => array(DEFAULT_ERROR_MESSAGE.'6029',0),
+6030 => array(DEFAULT_ERROR_MESSAGE.'6030',0),
+6031 => array(DEFAULT_ERROR_MESSAGE.'6031',0),
+6032 => array(DEFAULT_ERROR_MESSAGE.'6032',0),
+7001 => array(DEFAULT_ERROR_MESSAGE.'7001',0),
+8001 => array(DEFAULT_ERROR_MESSAGE.'8001',0),
+8002 => array(DEFAULT_ERROR_MESSAGE.'8002',0),
+8003 => array(DEFAULT_ERROR_MESSAGE.'8003',0),
+8004 => array(DEFAULT_ERROR_MESSAGE.'8004',0),
+9001 => array(DEFAULT_ERROR_MESSAGE.'9001',0),
+10001 => array(DEFAULT_ERROR_MESSAGE.'10001',0),
+10002 => array(DEFAULT_ERROR_MESSAGE.'10002',0),
+11001 => array(DEFAULT_ERROR_MESSAGE.'11001',0),
+11002 => array(DEFAULT_ERROR_MESSAGE.'11002',0),
+11003 => array(DEFAULT_ERROR_MESSAGE.'11003',0),
+11004 => array(DEFAULT_ERROR_MESSAGE.'11004',0),
+11005 => array(DEFAULT_ERROR_MESSAGE.'11005',0),
+12001 => array(DEFAULT_ERROR_MESSAGE.'12001',0),
+12002 => array(DEFAULT_ERROR_MESSAGE.'12002',0),
+12003 => array(DEFAULT_ERROR_MESSAGE.'12003',0),
+12004 => array(DEFAULT_ERROR_MESSAGE.'12004',0),
+12005 => array(DEFAULT_ERROR_MESSAGE.'12005',0),
+12006 => array(DEFAULT_ERROR_MESSAGE.'12006',0),
+12007 => array(DEFAULT_ERROR_MESSAGE.'12007',0),
+12008 => array(DEFAULT_ERROR_MESSAGE.'12008',0),
+12009 => array(DEFAULT_ERROR_MESSAGE.'12009',0),
+12010 => array(DEFAULT_ERROR_MESSAGE.'12010',0),
+12011 => array(DEFAULT_ERROR_MESSAGE.'12011',0),
+12012 => array(DEFAULT_ERROR_MESSAGE.'12012',0),
+14001 => array(DEFAULT_ERROR_MESSAGE.'14001',0),
+14002 => array(DEFAULT_ERROR_MESSAGE.'14002',0),
+14003 => array(DEFAULT_ERROR_MESSAGE.'14003',0),
+14004 => array(DEFAULT_ERROR_MESSAGE.'14004',0),
+14005 => array(DEFAULT_ERROR_MESSAGE.'14005',0),
+14006 => array(DEFAULT_ERROR_MESSAGE.'14006',0),
+14007 => array(DEFAULT_ERROR_MESSAGE.'14007',0),
+15001 => array(DEFAULT_ERROR_MESSAGE.'15001',0),
+15002 => array(DEFAULT_ERROR_MESSAGE.'15002',0),
+15003 => array(DEFAULT_ERROR_MESSAGE.'15003',0),
+15004 => array(DEFAULT_ERROR_MESSAGE.'15004',0),
+15005 => array(DEFAULT_ERROR_MESSAGE.'15005',0),
+15006 => array(DEFAULT_ERROR_MESSAGE.'15006',0),
+15007 => array(DEFAULT_ERROR_MESSAGE.'15007',0),
+15008 => array(DEFAULT_ERROR_MESSAGE.'15008',0),
+15009 => array(DEFAULT_ERROR_MESSAGE.'15009',0),
+15010 => array(DEFAULT_ERROR_MESSAGE.'15010',0),
+15011 => array(DEFAULT_ERROR_MESSAGE.'15011',0),
+16001 => array(DEFAULT_ERROR_MESSAGE.'16001',0),
+16002 => array(DEFAULT_ERROR_MESSAGE.'16002',0),
+16003 => array(DEFAULT_ERROR_MESSAGE.'16003',0),
+16004 => array(DEFAULT_ERROR_MESSAGE.'16004',0),
+17001 => array(DEFAULT_ERROR_MESSAGE.'17001',0),
+17002 => array(DEFAULT_ERROR_MESSAGE.'17002',0),
+17004 => array(DEFAULT_ERROR_MESSAGE.'17004',0),
+18001 => array(DEFAULT_ERROR_MESSAGE.'18001',0),
+18002 => array(DEFAULT_ERROR_MESSAGE.'18002',0),
+18003 => array(DEFAULT_ERROR_MESSAGE.'18003',0),
+18004 => array(DEFAULT_ERROR_MESSAGE.'18004',0),
+18005 => array(DEFAULT_ERROR_MESSAGE.'18005',0),
+18006 => array(DEFAULT_ERROR_MESSAGE.'18006',0),
+18007 => array(DEFAULT_ERROR_MESSAGE.'18007',0),
+18008 => array(DEFAULT_ERROR_MESSAGE.'18008',0),
+19001 => array(DEFAULT_ERROR_MESSAGE.'19001',0),
+19002 => array(DEFAULT_ERROR_MESSAGE.'19002',0),
+19003 => array(DEFAULT_ERROR_MESSAGE.'19003',0),
+20001 => array(DEFAULT_ERROR_MESSAGE.'20001',0),
+20002 => array(DEFAULT_ERROR_MESSAGE.'20002',0),
+20003 => array(DEFAULT_ERROR_MESSAGE.'20003',0),
+21001 => array(DEFAULT_ERROR_MESSAGE.'21001',0),
+23001 => array(DEFAULT_ERROR_MESSAGE.'23001',0),
+23002 => array(DEFAULT_ERROR_MESSAGE.'23002',0),
+23003 => array(DEFAULT_ERROR_MESSAGE.'23003',0),
+24001 => array(DEFAULT_ERROR_MESSAGE.'24001',0),
+24002 => array(DEFAULT_ERROR_MESSAGE.'24002',0),
+24003 => array(DEFAULT_ERROR_MESSAGE.'24003',0),
+25001 => array(DEFAULT_ERROR_MESSAGE.'25001',0),
+25002 => array(DEFAULT_ERROR_MESSAGE.'25002',0),
+25003 => array(DEFAULT_ERROR_MESSAGE.'25003',0),
+25004 => array(DEFAULT_ERROR_MESSAGE.'25004',0),
+25005 => array(DEFAULT_ERROR_MESSAGE.'25005',0),
+25006 => array(DEFAULT_ERROR_MESSAGE.'25006',0),
+25007 => array(DEFAULT_ERROR_MESSAGE.'25007',0),
+25008 => array(DEFAULT_ERROR_MESSAGE.'25008',0),
+25009 => array(DEFAULT_ERROR_MESSAGE.'25009',0),
+25010 => array(DEFAULT_ERROR_MESSAGE.'25010',0),
+25011 => array(DEFAULT_ERROR_MESSAGE.'25011',0),
+25012 => array(DEFAULT_ERROR_MESSAGE.'25012',0),
+25013 => array(DEFAULT_ERROR_MESSAGE.'25013',0),
+25014 => array(DEFAULT_ERROR_MESSAGE.'25014',0),
+25015 => array(DEFAULT_ERROR_MESSAGE.'25015',0),
+25016 => array(DEFAULT_ERROR_MESSAGE.'25016',0),
+25017 => array(DEFAULT_ERROR_MESSAGE.'25017',0),
+25018 => array(DEFAULT_ERROR_MESSAGE.'25018',0),
+25019 => array(DEFAULT_ERROR_MESSAGE.'25019',0),
+25020 => array(DEFAULT_ERROR_MESSAGE.'25020',0),
+25021 => array(DEFAULT_ERROR_MESSAGE.'25021',0),
+25022 => array(DEFAULT_ERROR_MESSAGE.'25022',0),
+25023 => array(DEFAULT_ERROR_MESSAGE.'25023',0),
+25024 => array(DEFAULT_ERROR_MESSAGE.'25024',0),
+25025 => array(DEFAULT_ERROR_MESSAGE.'25025',0),
+25026 => array(DEFAULT_ERROR_MESSAGE.'25026',0),
+25027 => array(DEFAULT_ERROR_MESSAGE.'25027',0),
+25028 => array(DEFAULT_ERROR_MESSAGE.'25028',0),
+25029 => array(DEFAULT_ERROR_MESSAGE.'25029',0),
+25030 => array(DEFAULT_ERROR_MESSAGE.'25030',0),
+25031 => array(DEFAULT_ERROR_MESSAGE.'25031',0),
+25032 => array(DEFAULT_ERROR_MESSAGE.'25032',0),
+25033 => array(DEFAULT_ERROR_MESSAGE.'25033',0),
+25034 => array(DEFAULT_ERROR_MESSAGE.'25034',0),
+25035 => array(DEFAULT_ERROR_MESSAGE.'25035',0),
+25036 => array(DEFAULT_ERROR_MESSAGE.'25036',0),
+25037 => array(DEFAULT_ERROR_MESSAGE.'25037',0),
+25038 => array(DEFAULT_ERROR_MESSAGE.'25038',0),
+25039 => array(DEFAULT_ERROR_MESSAGE.'25039',0),
+25040 => array(DEFAULT_ERROR_MESSAGE.'25040',0),
+25041 => array(DEFAULT_ERROR_MESSAGE.'25041',0),
+25042 => array(DEFAULT_ERROR_MESSAGE.'25042',0),
+25043 => array(DEFAULT_ERROR_MESSAGE.'25043',0),
+25044 => array(DEFAULT_ERROR_MESSAGE.'25044',0),
+25045 => array(DEFAULT_ERROR_MESSAGE.'25045',0),
+25046 => array(DEFAULT_ERROR_MESSAGE.'25046',0),
+25047 => array(DEFAULT_ERROR_MESSAGE.'25047',0),
+25048 => array(DEFAULT_ERROR_MESSAGE.'25048',0),
+25049 => array(DEFAULT_ERROR_MESSAGE.'25049',0),
+25050 => array(DEFAULT_ERROR_MESSAGE.'25050',0),
+25051 => array(DEFAULT_ERROR_MESSAGE.'25051',0),
+25052 => array(DEFAULT_ERROR_MESSAGE.'25052',0),
+25053 => array(DEFAULT_ERROR_MESSAGE.'25053',0),
+25054 => array(DEFAULT_ERROR_MESSAGE.'25054',0),
+25055 => array(DEFAULT_ERROR_MESSAGE.'25055',0),
+25056 => array(DEFAULT_ERROR_MESSAGE.'25056',0),
+25057 => array(DEFAULT_ERROR_MESSAGE.'25057',0),
+25058 => array(DEFAULT_ERROR_MESSAGE.'25058',0),
+25059 => array(DEFAULT_ERROR_MESSAGE.'25059',0),
+25060 => array(DEFAULT_ERROR_MESSAGE.'25060',0),
+25061 => array(DEFAULT_ERROR_MESSAGE.'25061',0),
+25062 => array(DEFAULT_ERROR_MESSAGE.'25062',0),
+25063 => array(DEFAULT_ERROR_MESSAGE.'25063',0),
+25064 => array(DEFAULT_ERROR_MESSAGE.'25064',0),
+25065 => array(DEFAULT_ERROR_MESSAGE.'25065',0),
+25066 => array(DEFAULT_ERROR_MESSAGE.'25066',0),
+25067 => array(DEFAULT_ERROR_MESSAGE.'25067',0),
+25068 => array(DEFAULT_ERROR_MESSAGE.'25068',0),
+25069 => array(DEFAULT_ERROR_MESSAGE.'25069',0),
+25070 => array(DEFAULT_ERROR_MESSAGE.'25070',0),
+25071 => array(DEFAULT_ERROR_MESSAGE.'25071',0),
+25072 => array(DEFAULT_ERROR_MESSAGE.'25072',0),
+25073 => array(DEFAULT_ERROR_MESSAGE.'25073',0),
+25074 => array(DEFAULT_ERROR_MESSAGE.'25074',0),
+25075 => array(DEFAULT_ERROR_MESSAGE.'25075',0),
+25077 => array(DEFAULT_ERROR_MESSAGE.'25077',0),
+25078 => array(DEFAULT_ERROR_MESSAGE.'25078',0),
+25079 => array(DEFAULT_ERROR_MESSAGE.'25079',0),
+25080 => array(DEFAULT_ERROR_MESSAGE.'25080',0),
+25081 => array(DEFAULT_ERROR_MESSAGE.'25081',0),
+25082 => array(DEFAULT_ERROR_MESSAGE.'25082',0),
+25083 => array(DEFAULT_ERROR_MESSAGE.'25083',0),
+25084 => array(DEFAULT_ERROR_MESSAGE.'25084',0),
+25085 => array(DEFAULT_ERROR_MESSAGE.'25085',0),
+25086 => array(DEFAULT_ERROR_MESSAGE.'25086',0),
+25087 => array(DEFAULT_ERROR_MESSAGE.'25087',0),
+25088 => array(DEFAULT_ERROR_MESSAGE.'25088',0),
+25089 => array(DEFAULT_ERROR_MESSAGE.'25089',0),
+25090 => array(DEFAULT_ERROR_MESSAGE.'25090',0),
+25091 => array(DEFAULT_ERROR_MESSAGE.'25091',0),
+25092 => array(DEFAULT_ERROR_MESSAGE.'25092',0),
+25093 => array(DEFAULT_ERROR_MESSAGE.'25093',0),
+25094 => array(DEFAULT_ERROR_MESSAGE.'25094',0),
+25095 => array(DEFAULT_ERROR_MESSAGE.'25095',0),
+25096 => array(DEFAULT_ERROR_MESSAGE.'25096',0),
+25097 => array(DEFAULT_ERROR_MESSAGE.'25097',0),
+25098 => array(DEFAULT_ERROR_MESSAGE.'25098',0),
+25099 => array(DEFAULT_ERROR_MESSAGE.'25099',0),
+25100 => array(DEFAULT_ERROR_MESSAGE.'25100',0),
+25101 => array(DEFAULT_ERROR_MESSAGE.'25101',0),
+25102 => array(DEFAULT_ERROR_MESSAGE.'25102',0),
+25103 => array(DEFAULT_ERROR_MESSAGE.'25103',0),
+25104 => array(DEFAULT_ERROR_MESSAGE.'25104',0),
+25105 => array(DEFAULT_ERROR_MESSAGE.'25105',0),
+25106 => array(DEFAULT_ERROR_MESSAGE.'25106',0),
+25107 => array(DEFAULT_ERROR_MESSAGE.'25107',0),
+25108 => array(DEFAULT_ERROR_MESSAGE.'25108',0),
+25109 => array(DEFAULT_ERROR_MESSAGE.'25109',0),
+25110 => array(DEFAULT_ERROR_MESSAGE.'25110',0),
+25111 => array(DEFAULT_ERROR_MESSAGE.'25111',0),
+25112 => array(DEFAULT_ERROR_MESSAGE.'25112',0),
+25113 => array(DEFAULT_ERROR_MESSAGE.'25113',0),
+25114 => array(DEFAULT_ERROR_MESSAGE.'25114',0),
+25115 => array(DEFAULT_ERROR_MESSAGE.'25115',0),
+25116 => array(DEFAULT_ERROR_MESSAGE.'25116',0),
+25117 => array(DEFAULT_ERROR_MESSAGE.'25117',0),
+25118 => array(DEFAULT_ERROR_MESSAGE.'25118',0),
+25119 => array(DEFAULT_ERROR_MESSAGE.'25119',0),
+25120 => array(DEFAULT_ERROR_MESSAGE.'25120',0),
+25121 => array(DEFAULT_ERROR_MESSAGE.'25121',0),
+25122 => array(DEFAULT_ERROR_MESSAGE.'25122',0),
+25123 => array(DEFAULT_ERROR_MESSAGE.'25123',0),
+25124 => array(DEFAULT_ERROR_MESSAGE.'25124',0),
+25125 => array(DEFAULT_ERROR_MESSAGE.'25125',0),
+25126 => array(DEFAULT_ERROR_MESSAGE.'25126',0),
+25127 => array(DEFAULT_ERROR_MESSAGE.'25126',0),
+24003 => array(DEFAULT_ERROR_MESSAGE.'24003',0),
+24004 => array(DEFAULT_ERROR_MESSAGE.'24004',0),
+24005 => array(DEFAULT_ERROR_MESSAGE.'24005',0),
+24006 => array(DEFAULT_ERROR_MESSAGE.'24006',0),
+24007 => array(DEFAULT_ERROR_MESSAGE.'24007',0),
+24008 => array(DEFAULT_ERROR_MESSAGE.'24008',0),
+24009 => array(DEFAULT_ERROR_MESSAGE.'24009',0),
+24010 => array(DEFAULT_ERROR_MESSAGE.'24010',0),
+24011 => array(DEFAULT_ERROR_MESSAGE.'24011',0),
+24012 => array(DEFAULT_ERROR_MESSAGE.'24012',0),
+24013 => array(DEFAULT_ERROR_MESSAGE.'24013',0),
+24014 => array(DEFAULT_ERROR_MESSAGE.'24014',0),
+24015 => array(DEFAULT_ERROR_MESSAGE.'24015',0),
+22001 => array(DEFAULT_ERROR_MESSAGE.'22001',0),
+22002 => array(DEFAULT_ERROR_MESSAGE.'22002',0),
+22004 => array(DEFAULT_ERROR_MESSAGE.'22004',0),
+22005 => array(DEFAULT_ERROR_MESSAGE.'22005',0),
+22006 => array(DEFAULT_ERROR_MESSAGE.'22006',0),
+22007 => array(DEFAULT_ERROR_MESSAGE.'22007',0),
+22008 => array(DEFAULT_ERROR_MESSAGE.'22008',0),
+22009 => array(DEFAULT_ERROR_MESSAGE.'22009',0),
+22010 => array(DEFAULT_ERROR_MESSAGE.'22010',0),
+22011 => array(DEFAULT_ERROR_MESSAGE.'22011',0),
+22012 => array(DEFAULT_ERROR_MESSAGE.'22012',0),
+22013 => array(DEFAULT_ERROR_MESSAGE.'22013',0),
+22014 => array(DEFAULT_ERROR_MESSAGE.'22014',0),
+22015 => array(DEFAULT_ERROR_MESSAGE.'22015',0),
+22016 => array(DEFAULT_ERROR_MESSAGE.'22016',0),
+22017 => array(DEFAULT_ERROR_MESSAGE.'22017',0),
+22018 => array(DEFAULT_ERROR_MESSAGE.'22018',0),
+22019 => array(DEFAULT_ERROR_MESSAGE.'22019',0),
+22020 => array(DEFAULT_ERROR_MESSAGE.'22020',0),
+13001 => array(DEFAULT_ERROR_MESSAGE.'13001',0),
+13002 => array(DEFAULT_ERROR_MESSAGE.'13002',0),
+1001 => array(DEFAULT_ERROR_MESSAGE.'1001',0),
+1002 => array(DEFAULT_ERROR_MESSAGE.'1002',0),
+1003 => array(DEFAULT_ERROR_MESSAGE.'1003',0),
+1004 => array(DEFAULT_ERROR_MESSAGE.'1004',0),
+1005 => array(DEFAULT_ERROR_MESSAGE.'1005',0),
+1006 => array(DEFAULT_ERROR_MESSAGE.'1006',0),
+1007 => array(DEFAULT_ERROR_MESSAGE.'1007',0),
+1008 => array(DEFAULT_ERROR_MESSAGE.'1008',0),
+1009 => array(DEFAULT_ERROR_MESSAGE.'1009',0),
+1010 => array(DEFAULT_ERROR_MESSAGE.'1010',0),
+1011 => array(DEFAULT_ERROR_MESSAGE.'1011',0),
+26001 => array(DEFAULT_ERROR_MESSAGE.'26001',0),
+26002 => array(DEFAULT_ERROR_MESSAGE.'26002',0),
+26003 => array(DEFAULT_ERROR_MESSAGE.'26003',0),
+26004 => array(DEFAULT_ERROR_MESSAGE.'26004',0),
+26005 => array(DEFAULT_ERROR_MESSAGE.'26005',0),
+26006 => array(DEFAULT_ERROR_MESSAGE.'26006',0),
+26007 => array(DEFAULT_ERROR_MESSAGE.'26007',0),
+26008 => array(DEFAULT_ERROR_MESSAGE.'26008',0),
+26009 => array(DEFAULT_ERROR_MESSAGE.'26009',0),
+26010 => array(DEFAULT_ERROR_MESSAGE.'26010',0),
+26011 => array(DEFAULT_ERROR_MESSAGE.'26011',0),
+26012 => array(DEFAULT_ERROR_MESSAGE.'26012',0),
+26013 => array(DEFAULT_ERROR_MESSAGE.'26013',0),
+26014 => array(DEFAULT_ERROR_MESSAGE.'26014',0),
+26015 => array(DEFAULT_ERROR_MESSAGE.'26015',0),
+26016 => array(DEFAULT_ERROR_MESSAGE.'26016',0),
+
+27001 => array(DEFAULT_ERROR_MESSAGE.'27001',0),
+27002 => array(DEFAULT_ERROR_MESSAGE.'27002',0),
+27003 => array(DEFAULT_ERROR_MESSAGE.'27003',0),
+27004 => array(DEFAULT_ERROR_MESSAGE.'27004',0),
+27005 => array(DEFAULT_ERROR_MESSAGE.'27005',0),
+27006 => array(DEFAULT_ERROR_MESSAGE.'27006',0),
+27007 => array(DEFAULT_ERROR_MESSAGE.'27007',0),
+27008 => array(DEFAULT_ERROR_MESSAGE.'27008',0),
+27009 => array(DEFAULT_ERROR_MESSAGE.'27009',0),
+27010 => array(DEFAULT_ERROR_MESSAGE.'27010',0),
+27011 => array(DEFAULT_ERROR_MESSAGE.'27011',0),
+27012 => array(DEFAULT_ERROR_MESSAGE.'27012',0),
+27013 => array(DEFAULT_ERROR_MESSAGE.'27013',0),
+27014 => array(DEFAULT_ERROR_MESSAGE.'27014',0),
+27015 => array(DEFAULT_ERROR_MESSAGE.'27015',0),
+);
+
+?>
diff --git a/includes/billing.php b/includes/billing.php
index 0a2013c741..695730fb31 100644
--- a/includes/billing.php
+++ b/includes/billing.php
@@ -149,7 +149,7 @@ function getRates($bill_id,$datefrom,$dateto) {
$q_95_text = $q_95_text . " AND timestamp > $datefrom AND timestamp <= $dateto ORDER BY delta ASC";
$q_95th = mysql_query($q_95_text);
$m_95th = mysql_result($q_95th,$measurement_95th);
- $mt_q = mysql_query("SELECT sum(delta) FROM bill_data WHERE bill_id = $bill_id AND timestamp > $datefrom AND timestamp <= $dateto");
+ $mt_q = mysql_query("SELECT SUM(delta) FROM bill_data WHERE bill_id = '$bill_id' AND timestamp > '$datefrom' AND timestamp <= '$dateto'");
$mtot = mysql_result($mt_q,0);
$data['rate_95th_in'] = get95thIn($bill_id,$datefrom,$dateto);
$data['rate_95th_out'] = get95thOut($bill_id,$datefrom,$dateto);
JpGraph Error:
+HTTP headers have already been sent.
Caused by output from file %s at line %d.Explanation:
HTTP headers have already been sent back to the browser indicating the data as text before the library got a chance to send it\'s image HTTP header to this browser. This makes it impossible for the library to send back image data to the browser (since that would be interpretated as text by the browser and show up as junk text).