Heuristic ranking analysis
Heuristic ranking analysis

<?php <?php
include_once("./lib/common.inc.php"); include_once("./lib/common.inc.php");
include_header("Contract"); include_header("Contract");
$query = sprintf("SELECT * $query = sprintf("SELECT *
FROM `contractnotice` FROM `contractnotice`
WHERE CNID = '%d'", mysql_real_escape_string($_REQUEST['CNID'])); WHERE CNID = '%d'", mysql_real_escape_string($_REQUEST['CNID']));
$result = mysql_query($query); $result = mysql_query($query);
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
setlocale(LC_MONETARY, 'en_US'); setlocale(LC_MONETARY, 'en_US');
foreach (array_filter($row) as $key => $value) { foreach (array_filter($row) as $key => $value) {
echo "<b>$key</b>&nbsp;"; echo "<b>$key</b>&nbsp;";
switch ($key) { switch ($key) {
case "supplierName": case "supplierName":
case "supplierABN": case "supplierABN":
echo '<a href="displaySupplier.php?supplier='.$row['supplierABN'].'-'.urlencode($row['supplierName']).'">'.$value."</a>"; echo '<a href="displaySupplier.php?supplier='.$row['supplierABN'].'-'.urlencode($row['supplierName']).'">'.$value."</a>";
break; break;
case "agencyName": case "agencyName":
echo '<a href="displayAgency.php?agency='.urlencode($value).'">'.$value."</a>"; echo '<a href="displayAgency.php?agency='.urlencode($value).'">'.$value."</a>";
break; break;
case "value": case "value":
echo "$".number_format(doubleval($value),2); echo "$".number_format(doubleval($value),2);
break; break;
default: default:
echo str_replace(" ","<br>",$value); echo str_replace(" ","<br>",$value);
} }
echo "<br>"; echo "<br>";
} }
} }
echo '<a href="https://www.tenders.gov.au/?event=public.advancedsearch.keyword&keyword=CN'.$_REQUEST['CNID'].'"> View original record @ tenders.gov.au</a>'; echo '<br><a href="https://www.tenders.gov.au/?event=public.advancedsearch.keyword&keyword=CN'.$_REQUEST['CNID'].'"> View original record @ tenders.gov.au</a><br>';
mysql_free_result($result); mysql_free_result($result);
   
  $query = "SELECT * FROM `heuristic_results` where CNID = ".$_REQUEST['CNID'];
  $result = mysql_query($query);
  if (!$result) echo mysql_error().$query;
  while ($r = mysql_fetch_array($result, MYSQL_ASSOC)) {
  echo "<b>{$r['heuristic_name']}</b>: {$r['heuristic_value']} (raw value: {$r['raw_value']}, mean: {$r['mean']}, stddev: {$r['stddev']})<br>";
  }
   
include_footer(); include_footer();
?> ?>
   
file:a/heuristics/readme.txt (deleted)
heuristicResults  
heuristic = BY_DATE...  
value = 0.0  
cnPubDate =  
lastUpdated = 1/1/1970  
contractNotice =  
agency =  
supplier =  
 
work out total value by summing value  
 
<?php <?php
include_once("heuristics.inc.php"); include_once("heuristics.inc.php");
  $query = "SELECT *, agency.abn as agencyABN, IF(supplierABN != '',supplierABN,supplierName) as supplierID
  FROM contractnotice JOIN agency ON contractnotice.agencyName=agency.agencyName";
   
$query = "SELECT *, agency.abn as agencyABN, IF(supplierABN != '',supplierABN,supplierName) as supplierID $query = "SELECT *, agency.abn as agencyABN, IF(supplierABN != '',supplierABN,supplierName) as supplierID
FROM contractnotice JOIN agency ON contractnotice.agencyName=agency.agencyName FROM contractnotice JOIN agency ON contractnotice.agencyName=agency.agencyName
WHERE DATE(importDate) = (select * from (SELECT DATE(importDate) WHERE DATE(importDate) = (select * from (SELECT DATE(importDate)
FROM contractnotice ORDER BY importDate DESC limit 1) alias)"; FROM contractnotice ORDER BY importDate DESC limit 1) alias)";
$result = mysql_query($query); $result = mysql_query($lastimportquery);
if (!$result) echo mysql_error().$query; if (!$result) echo mysql_error().$query;
while ($cn = mysql_fetch_array($result, MYSQL_BOTH)) { while ($cn = mysql_fetch_array($result, MYSQL_BOTH)) {
//get each new CN from latest update //get each new CN from latest update
foreach ($heuristics as $heuristic => $description) { foreach ($heuristics as $heuristic => $description) {
// run all heuristics // run all heuristics
runHeuristic($heuristic, $cn); runHeuristic($heuristic, $cn);
} }
flush(); flush();
} }
/*foreach agency /*foreach agency
   
aggregate agency metrics aggregate agency metrics
   
foreach supplier foreach supplier
   
aggreate supplier metrics aggreate supplier metrics
   
foreach CN foreach CN
   
aggregate CN metrics */ aggregate CN metrics */
?> ?>
   
  <?php
  include_once("../lib/common.inc.php");
  // http://www.herethere.net/~samson/php/color_gradient/color_gradient_generator.php.txt
  // return the interpolated value between pBegin and pEnd
  function interpolate($pBegin, $pEnd, $pStep, $pMax)
  {
  if ($pBegin < $pEnd) {
  return (($pEnd - $pBegin) * ($pStep / $pMax)) + $pBegin;
  }
  else {
  return (($pBegin - $pEnd) * (1 - ($pStep / $pMax))) + $pEnd;
  }
  }
  function Gradient($HexFrom, $HexTo, $ColorSteps)
  {
  $theColorBegin = hexdec($HexFrom);
  $theColorEnd = hexdec($HexTo);
  $theNumSteps = intval($ColorSteps);
  $theR0 = ($theColorBegin & 0xff0000) >> 16;
  $theG0 = ($theColorBegin & 0x00ff00) >> 8;
  $theB0 = ($theColorBegin & 0x0000ff) >> 0;
  $theR1 = ($theColorEnd & 0xff0000) >> 16;
  $theG1 = ($theColorEnd & 0x00ff00) >> 8;
  $theB1 = ($theColorEnd & 0x0000ff) >> 0;
  $GradientColors = array();
  // generate gradient swathe now
  for ($i = 0; $i <= $theNumSteps; $i++) {
  $theR = interpolate($theR0, $theR1, $i, $theNumSteps);
  $theG = interpolate($theG0, $theG1, $i, $theNumSteps);
  $theB = interpolate($theB0, $theB1, $i, $theNumSteps);
  $theVal = ((($theR << 8) | $theG) << 8) | $theB;
  $GradientColors[] = sprintf("%06X", $theVal);
  }
  return $GradientColors;
  }
  $Gradients = Gradient("66FF00" , "FF0000" , 10);
 
  $query = "select max(sum) from (SELECT sum(heuristic_value)
  as sum FROM heuristic_results group by CNID) as a";
  $result = mysql_query($query);
  $r = mysql_fetch_array($result, MYSQL_BOTH);
  $maxVal = $r[0];
 
  $query = "SELECT sum(heuristic_value) as sum, CNID
  FROM `heuristic_results` group by CNID order by sum DESC LIMIT 30";
  $result = mysql_query($query);
  if (!$result) echo mysql_error().$query;
  while ($r = mysql_fetch_array($result, MYSQL_BOTH)) {
  echo '<span style="background: #'.$Gradients[floor(($r['sum']/$maxVal) * 10)].'; padding: 5px;">';
  echo '<a title="'.$r['sum'].'" href="../displayContract.php?CNID='.$r['CNID'].'">X</a>';
  echo "</span>";
  }
 
  ?>
  <?php
 
  /*// most interesting
  SELECT sum(heuristic_value) as sum, CNID
  FROM `heuristic_results` group by CNID order by sum DESC limit 30
 
  // spread of values
  select floor(sum) as val,count(*) from (SELECT sum(heuristic_value)
  as sum FROM heuristic_results group by CNID) as a group by val*/
 
  /* CAT:Spline chart */
 
  /* pChart library inclusions */
  include("../lib/pChart2.1.0/class/pData.class.php");
  include("../lib/pChart2.1.0/class/pDraw.class.php");
  include("../lib/pChart2.1.0/class/pImage.class.php");
  $labels = Array();
  $values = Array();
 
  include_once("../lib/common.inc.php");
  $query = "select floor(sum) as val,count(*) from (SELECT sum(heuristic_value)
  as sum FROM heuristic_results group by CNID) as a group by val";
  $result = mysql_query($query);
  if (!$result) echo mysql_error().$query;
  while ($r = mysql_fetch_array($result, MYSQL_BOTH)) {
  $labels[] = $r[0];
  $values[] = $r[1];
  }
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints($values,"Records");
  $MyData->setAxisName(0,"# of records");
  $MyData->addPoints($labels,"Labels");
  $MyData->setSerieDescription("Labels","Bins");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Turn of Antialiasing */
  $myPicture->Antialias = FALSE;
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the chart title */
  $myPicture->setFontProperties(array("FontName"=>"../lib/pChart2.1.0/fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(150,35,"Record distribution",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../lib/pChart2.1.0/fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Define the chart area */
  $myPicture->setGraphArea(60,40,650,200);
 
  /* Draw the scale */
  $scaleSettings = array("XMargin"=>10,"YMargin"=>0,"Floating"=>TRUE,"GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);
  $myPicture->drawScale($scaleSettings);
 
  /* Turn on Antialiasing */
  $myPicture->Antialias = TRUE;
 
  /* Draw the line chart */
  $myPicture->drawSplineChart();
 
  /* Write the chart legend */
  $myPicture->drawLegend(540,20,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawSplineChart.simple.png");
  ?>
  GNU GENERAL PUBLIC LICENSE
  Version 3, 29 June 2007
 
  Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
  Everyone is permitted to copy and distribute verbatim copies
  of this license document, but changing it is not allowed.
 
  Preamble
 
  The GNU General Public License is a free, copyleft license for
  software and other kinds of works.
 
  The licenses for most software and other practical works are designed
  to take away your freedom to share and change the works. By contrast,
  the GNU General Public License is intended to guarantee your freedom to
  share and change all versions of a program--to make sure it remains free
  software for all its users. We, the Free Software Foundation, use the
  GNU General Public License for most of our software; it applies also to
  any other work released this way by its authors. You can apply it to
  your programs, too.
 
  When we speak of free software, we are referring to freedom, not
  price. Our General Public Licenses are designed to make sure that you
  have the freedom to distribute copies of free software (and charge for
  them if you wish), that you receive source code or can get it if you
  want it, that you can change the software or use pieces of it in new
  free programs, and that you know you can do these things.
 
  To protect your rights, we need to prevent others from denying you
  these rights or asking you to surrender the rights. Therefore, you have
  certain responsibilities if you distribute copies of the software, or if
  you modify it: responsibilities to respect the freedom of others.
 
  For example, if you distribute copies of such a program, whether
  gratis or for a fee, you must pass on to the recipients the same
  freedoms that you received. You must make sure that they, too, receive
  or can get the source code. And you must show them these terms so they
  know their rights.
 
  Developers that use the GNU GPL protect your rights with two steps:
  (1) assert copyright on the software, and (2) offer you this License
  giving you legal permission to copy, distribute and/or modify it.
 
  For the developers' and authors' protection, the GPL clearly explains
  that there is no warranty for this free software. For both users' and
  authors' sake, the GPL requires that modified versions be marked as
  changed, so that their problems will not be attributed erroneously to
  authors of previous versions.
 
  Some devices are designed to deny users access to install or run
  modified versions of the software inside them, although the manufacturer
  can do so. This is fundamentally incompatible with the aim of
  protecting users' freedom to change the software. The systematic
  pattern of such abuse occurs in the area of products for individuals to
  use, which is precisely where it is most unacceptable. Therefore, we
  have designed this version of the GPL to prohibit the practice for those
  products. If such problems arise substantially in other domains, we
  stand ready to extend this provision to those domains in future versions
  of the GPL, as needed to protect the freedom of users.
 
  Finally, every program is threatened constantly by software patents.
  States should not allow patents to restrict development and use of
  software on general-purpose computers, but in those that do, we wish to
  avoid the special danger that patents applied to a free program could
  make it effectively proprietary. To prevent this, the GPL assures that
  patents cannot be used to render the program non-free.
 
  The precise terms and conditions for copying, distribution and
  modification follow.
 
  TERMS AND CONDITIONS
 
  0. Definitions.
 
  "This License" refers to version 3 of the GNU General Public License.
 
  "Copyright" also means copyright-like laws that apply to other kinds of
  works, such as semiconductor masks.
 
  "The Program" refers to any copyrightable work licensed under this
  License. Each licensee is addressed as "you". "Licensees" and
  "recipients" may be individuals or organizations.
 
  To "modify" a work means to copy from or adapt all or part of the work
  in a fashion requiring copyright permission, other than the making of an
  exact copy. The resulting work is called a "modified version" of the
  earlier work or a work "based on" the earlier work.
 
  A "covered work" means either the unmodified Program or a work based
  on the Program.
 
  To "propagate" a work means to do anything with it that, without
  permission, would make you directly or secondarily liable for
  infringement under applicable copyright law, except executing it on a
  computer or modifying a private copy. Propagation includes copying,
  distribution (with or without modification), making available to the
  public, and in some countries other activities as well.
 
  To "convey" a work means any kind of propagation that enables other
  parties to make or receive copies. Mere interaction with a user through
  a computer network, with no transfer of a copy, is not conveying.
 
  An interactive user interface displays "Appropriate Legal Notices"
  to the extent that it includes a convenient and prominently visible
  feature that (1) displays an appropriate copyright notice, and (2)
  tells the user that there is no warranty for the work (except to the
  extent that warranties are provided), that licensees may convey the
  work under this License, and how to view a copy of this License. If
  the interface presents a list of user commands or options, such as a
  menu, a prominent item in the list meets this criterion.
 
  1. Source Code.
 
  The "source code" for a work means the preferred form of the work
  for making modifications to it. "Object code" means any non-source
  form of a work.
 
  A "Standard Interface" means an interface that either is an official
  standard defined by a recognized standards body, or, in the case of
  interfaces specified for a particular programming language, one that
  is widely used among developers working in that language.
 
  The "System Libraries" of an executable work include anything, other
  than the work as a whole, that (a) is included in the normal form of
  packaging a Major Component, but which is not part of that Major
  Component, and (b) serves only to enable use of the work with that
  Major Component, or to implement a Standard Interface for which an
  implementation is available to the public in source code form. A
  "Major Component", in this context, means a major essential component
  (kernel, window system, and so on) of the specific operating system
  (if any) on which the executable work runs, or a compiler used to
  produce the work, or an object code interpreter used to run it.
 
  The "Corresponding Source" for a work in object code form means all
  the source code needed to generate, install, and (for an executable
  work) run the object code and to modify the work, including scripts to
  control those activities. However, it does not include the work's
  System Libraries, or general-purpose tools or generally available free
  programs which are used unmodified in performing those activities but
  which are not part of the work. For example, Corresponding Source
  includes interface definition files associated with source files for
  the work, and the source code for shared libraries and dynamically
  linked subprograms that the work is specifically designed to require,
  such as by intimate data communication or control flow between those
  subprograms and other parts of the work.
 
  The Corresponding Source need not include anything that users
  can regenerate automatically from other parts of the Corresponding
  Source.
 
  The Corresponding Source for a work in source code form is that
  same work.
 
  2. Basic Permissions.
 
  All rights granted under this License are granted for the term of
  copyright on the Program, and are irrevocable provided the stated
  conditions are met. This License explicitly affirms your unlimited
  permission to run the unmodified Program. The output from running a
  covered work is covered by this License only if the output, given its
  content, constitutes a covered work. This License acknowledges your
  rights of fair use or other equivalent, as provided by copyright law.
 
  You may make, run and propagate covered works that you do not
  convey, without conditions so long as your license otherwise remains
  in force. You may convey covered works to others for the sole purpose
  of having them make modifications exclusively for you, or provide you
  with facilities for running those works, provided that you comply with
  the terms of this License in conveying all material for which you do
  not control copyright. Those thus making or running the covered works
  for you must do so exclusively on your behalf, under your direction
  and control, on terms that prohibit them from making any copies of
  your copyrighted material outside their relationship with you.
 
  Conveying under any other circumstances is permitted solely under
  the conditions stated below. Sublicensing is not allowed; section 10
  makes it unnecessary.
 
  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
 
  No covered work shall be deemed part of an effective technological
  measure under any applicable law fulfilling obligations under article
  11 of the WIPO copyright treaty adopted on 20 December 1996, or
  similar laws prohibiting or restricting circumvention of such
  measures.
 
  When you convey a covered work, you waive any legal power to forbid
  circumvention of technological measures to the extent such circumvention
  is effected by exercising rights under this License with respect to
  the covered work, and you disclaim any intention to limit operation or
  modification of the work as a means of enforcing, against the work's
  users, your or third parties' legal rights to forbid circumvention of
  technological measures.
 
  4. Conveying Verbatim Copies.
 
  You may convey verbatim copies of the Program's source code as you
  receive it, in any medium, provided that you conspicuously and
  appropriately publish on each copy an appropriate copyright notice;
  keep intact all notices stating that this License and any
  non-permissive terms added in accord with section 7 apply to the code;
  keep intact all notices of the absence of any warranty; and give all
  recipients a copy of this License along with the Program.
 
  You may charge any price or no price for each copy that you convey,
  and you may offer support or warranty protection for a fee.
 
  5. Conveying Modified Source Versions.
 
  You may convey a work based on the Program, or the modifications to
  produce it from the Program, in the form of source code under the
  terms of section 4, provided that you also meet all of these conditions:
 
  a) The work must carry prominent notices stating that you modified
  it, and giving a relevant date.
 
  b) The work must carry prominent notices stating that it is
  released under this License and any conditions added under section
  7. This requirement modifies the requirement in section 4 to
  "keep intact all notices".
 
  c) You must license the entire work, as a whole, under this
  License to anyone who comes into possession of a copy. This
  License will therefore apply, along with any applicable section 7
  additional terms, to the whole of the work, and all its parts,
  regardless of how they are packaged. This License gives no
  permission to license the work in any other way, but it does not
  invalidate such permission if you have separately received it.
 
  d) If the work has interactive user interfaces, each must display
  Appropriate Legal Notices; however, if the Program has interactive
  interfaces that do not display Appropriate Legal Notices, your
  work need not make them do so.
 
  A compilation of a covered work with other separate and independent
  works, which are not by their nature extensions of the covered work,
  and which are not combined with it such as to form a larger program,
  in or on a volume of a storage or distribution medium, is called an
  "aggregate" if the compilation and its resulting copyright are not
  used to limit the access or legal rights of the compilation's users
  beyond what the individual works permit. Inclusion of a covered work
  in an aggregate does not cause this License to apply to the other
  parts of the aggregate.
 
  6. Conveying Non-Source Forms.
 
  You may convey a covered work in object code form under the terms
  of sections 4 and 5, provided that you also convey the
  machine-readable Corresponding Source under the terms of this License,
  in one of these ways:
 
  a) Convey the object code in, or embodied in, a physical product
  (including a physical distribution medium), accompanied by the
  Corresponding Source fixed on a durable physical medium
  customarily used for software interchange.
 
  b) Convey the object code in, or embodied in, a physical product
  (including a physical distribution medium), accompanied by a
  written offer, valid for at least three years and valid for as
  long as you offer spare parts or customer support for that product
  model, to give anyone who possesses the object code either (1) a
  copy of the Corresponding Source for all the software in the
  product that is covered by this License, on a durable physical
  medium customarily used for software interchange, for a price no
  more than your reasonable cost of physically performing this
  conveying of source, or (2) access to copy the
  Corresponding Source from a network server at no charge.
 
  c) Convey individual copies of the object code with a copy of the
  written offer to provide the Corresponding Source. This
  alternative is allowed only occasionally and noncommercially, and
  only if you received the object code with such an offer, in accord
  with subsection 6b.
 
  d) Convey the object code by offering access from a designated
  place (gratis or for a charge), and offer equivalent access to the
  Corresponding Source in the same way through the same place at no
  further charge. You need not require recipients to copy the
  Corresponding Source along with the object code. If the place to
  copy the object code is a network server, the Corresponding Source
  may be on a different server (operated by you or a third party)
  that supports equivalent copying facilities, provided you maintain
  clear directions next to the object code saying where to find the
  Corresponding Source. Regardless of what server hosts the
  Corresponding Source, you remain obligated to ensure that it is
  available for as long as needed to satisfy these requirements.
 
  e) Convey the object code using peer-to-peer transmission, provided
  you inform other peers where the object code and Corresponding
  Source of the work are being offered to the general public at no
  charge under subsection 6d.
 
  A separable portion of the object code, whose source code is excluded
  from the Corresponding Source as a System Library, need not be
  included in conveying the object code work.
 
  A "User Product" is either (1) a "consumer product", which means any
  tangible personal property which is normally used for personal, family,
  or household purposes, or (2) anything designed or sold for incorporation
  into a dwelling. In determining whether a product is a consumer product,
  doubtful cases shall be resolved in favor of coverage. For a particular
  product received by a particular user, "normally used" refers to a
  typical or common use of that class of product, regardless of the status
  of the particular user or of the way in which the particular user
  actually uses, or expects or is expected to use, the product. A product
  is a consumer product regardless of whether the product has substantial
  commercial, industrial or non-consumer uses, unless such uses represent
  the only significant mode of use of the product.
 
  "Installation Information" for a User Product means any methods,
  procedures, authorization keys, or other information required to install
  and execute modified versions of a covered work in that User Product from
  a modified version of its Corresponding Source. The information must
  suffice to ensure that the continued functioning of the modified object
  code is in no case prevented or interfered with solely because
  modification has been made.
 
  If you convey an object code work under this section in, or with, or
  specifically for use in, a User Product, and the conveying occurs as
  part of a transaction in which the right of possession and use of the
  User Product is transferred to the recipient in perpetuity or for a
  fixed term (regardless of how the transaction is characterized), the
  Corresponding Source conveyed under this section must be accompanied
  by the Installation Information. But this requirement does not apply
  if neither you nor any third party retains the ability to install
  modified object code on the User Product (for example, the work has
  been installed in ROM).
 
  The requirement to provide Installation Information does not include a
  requirement to continue to provide support service, warranty, or updates
  for a work that has been modified or installed by the recipient, or for
  the User Product in which it has been modified or installed. Access to a
  network may be denied when the modification itself materially and
  adversely affects the operation of the network or violates the rules and
  protocols for communication across the network.
 
  Corresponding Source conveyed, and Installation Information provided,
  in accord with this section must be in a format that is publicly
  documented (and with an implementation available to the public in
  source code form), and must require no special password or key for
  unpacking, reading or copying.
 
  7. Additional Terms.
 
  "Additional permissions" are terms that supplement the terms of this
  License by making exceptions from one or more of its conditions.
  Additional permissions that are applicable to the entire Program shall
  be treated as though they were included in this License, to the extent
  that they are valid under applicable law. If additional permissions
  apply only to part of the Program, that part may be used separately
  under those permissions, but the entire Program remains governed by
  this License without regard to the additional permissions.
 
  When you convey a copy of a covered work, you may at your option
  remove any additional permissions from that copy, or from any part of
  it. (Additional permissions may be written to require their own
  removal in certain cases when you modify the work.) You may place
  additional permissions on material, added by you to a covered work,
  for which you have or can give appropriate copyright permission.
 
  Notwithstanding any other provision of this License, for material you
  add to a covered work, you may (if authorized by the copyright holders of
  that material) supplement the terms of this License with terms:
 
  a) Disclaiming warranty or limiting liability differently from the
  terms of sections 15 and 16 of this License; or
 
  b) Requiring preservation of specified reasonable legal notices or
  author attributions in that material or in the Appropriate Legal
  Notices displayed by works containing it; or
 
  c) Prohibiting misrepresentation of the origin of that material, or
  requiring that modified versions of such material be marked in
  reasonable ways as different from the original version; or
 
  d) Limiting the use for publicity purposes of names of licensors or
  authors of the material; or
 
  e) Declining to grant rights under trademark law for use of some
  trade names, trademarks, or service marks; or
 
  f) Requiring indemnification of licensors and authors of that
  material by anyone who conveys the material (or modified versions of
  it) with contractual assumptions of liability to the recipient, for
  any liability that these contractual assumptions directly impose on
  those licensors and authors.
 
  All other non-permissive additional terms are considered "further
  restrictions" within the meaning of section 10. If the Program as you
  received it, or any part of it, contains a notice stating that it is
  governed by this License along with a term that is a further
  restriction, you may remove that term. If a license document contains
  a further restriction but permits relicensing or conveying under this
  License, you may add to a covered work material governed by the terms
  of that license document, provided that the further restriction does
  not survive such relicensing or conveying.
 
  If you add terms to a covered work in accord with this section, you
  must place, in the relevant source files, a statement of the
  additional terms that apply to those files, or a notice indicating
  where to find the applicable terms.
 
  Additional terms, permissive or non-permissive, may be stated in the
  form of a separately written license, or stated as exceptions;
  the above requirements apply either way.
 
  8. Termination.
 
  You may not propagate or modify a covered work except as expressly
  provided under this License. Any attempt otherwise to propagate or
  modify it is void, and will automatically terminate your rights under
  this License (including any patent licenses granted under the third
  paragraph of section 11).
 
  However, if you cease all violation of this License, then your
  license from a particular copyright holder is reinstated (a)
  provisionally, unless and until the copyright holder explicitly and
  finally terminates your license, and (b) permanently, if the copyright
  holder fails to notify you of the violation by some reasonable means
  prior to 60 days after the cessation.
 
  Moreover, your license from a particular copyright holder is
  reinstated permanently if the copyright holder notifies you of the
  violation by some reasonable means, this is the first time you have
  received notice of violation of this License (for any work) from that
  copyright holder, and you cure the violation prior to 30 days after
  your receipt of the notice.
 
  Termination of your rights under this section does not terminate the
  licenses of parties who have received copies or rights from you under
  this License. If your rights have been terminated and not permanently
  reinstated, you do not qualify to receive new licenses for the same
  material under section 10.
 
  9. Acceptance Not Required for Having Copies.
 
  You are not required to accept this License in order to receive or
  run a copy of the Program. Ancillary propagation of a covered work
  occurring solely as a consequence of using peer-to-peer transmission
  to receive a copy likewise does not require acceptance. However,
  nothing other than this License grants you permission to propagate or
  modify any covered work. These actions infringe copyright if you do
  not accept this License. Therefore, by modifying or propagating a
  covered work, you indicate your acceptance of this License to do so.
 
  10. Automatic Licensing of Downstream Recipients.
 
  Each time you convey a covered work, the recipient automatically
  receives a license from the original licensors, to run, modify and
  propagate that work, subject to this License. You are not responsible
  for enforcing compliance by third parties with this License.
 
  An "entity transaction" is a transaction transferring control of an
  organization, or substantially all assets of one, or subdividing an
  organization, or merging organizations. If propagation of a covered
  work results from an entity transaction, each party to that
  transaction who receives a copy of the work also receives whatever
  licenses to the work the party's predecessor in interest had or could
  give under the previous paragraph, plus a right to possession of the
  Corresponding Source of the work from the predecessor in interest, if
  the predecessor has it or can get it with reasonable efforts.
 
  You may not impose any further restrictions on the exercise of the
  rights granted or affirmed under this License. For example, you may
  not impose a license fee, royalty, or other charge for exercise of
  rights granted under this License, and you may not initiate litigation
  (including a cross-claim or counterclaim in a lawsuit) alleging that
  any patent claim is infringed by making, using, selling, offering for
  sale, or importing the Program or any portion of it.
 
  11. Patents.
 
  A "contributor" is a copyright holder who authorizes use under this
  License of the Program or a work on which the Program is based. The
  work thus licensed is called the contributor's "contributor version".
 
  A contributor's "essential patent claims" are all patent claims
  owned or controlled by the contributor, whether already acquired or
  hereafter acquired, that would be infringed by some manner, permitted
  by this License, of making, using, or selling its contributor version,
  but do not include claims that would be infringed only as a
  consequence of further modification of the contributor version. For
  purposes of this definition, "control" includes the right to grant
  patent sublicenses in a manner consistent with the requirements of
  this License.
 
  Each contributor grants you a non-exclusive, worldwide, royalty-free
  patent license under the contributor's essential patent claims, to
  make, use, sell, offer for sale, import and otherwise run, modify and
  propagate the contents of its contributor version.
 
  In the following three paragraphs, a "patent license" is any express
  agreement or commitment, however denominated, not to enforce a patent
  (such as an express permission to practice a patent or covenant not to
  sue for patent infringement). To "grant" such a patent license to a
  party means to make such an agreement or commitment not to enforce a
  patent against the party.
 
  If you convey a covered work, knowingly relying on a patent license,
  and the Corresponding Source of the work is not available for anyone
  to copy, free of charge and under the terms of this License, through a
  publicly available network server or other readily accessible means,
  then you must either (1) cause the Corresponding Source to be so
  available, or (2) arrange to deprive yourself of the benefit of the
  patent license for this particular work, or (3) arrange, in a manner
  consistent with the requirements of this License, to extend the patent
  license to downstream recipients. "Knowingly relying" means you have
  actual knowledge that, but for the patent license, your conveying the
  covered work in a country, or your recipient's use of the covered work
  in a country, would infringe one or more identifiable patents in that
  country that you have reason to believe are valid.
 
  If, pursuant to or in connection with a single transaction or
  arrangement, you convey, or propagate by procuring conveyance of, a
  covered work, and grant a patent license to some of the parties
  receiving the covered work authorizing them to use, propagate, modify
  or convey a specific copy of the covered work, then the patent license
  you grant is automatically extended to all recipients of the covered
  work and works based on it.
 
  A patent license is "discriminatory" if it does not include within
  the scope of its coverage, prohibits the exercise of, or is
  conditioned on the non-exercise of one or more of the rights that are
  specifically granted under this License. You may not convey a covered
  work if you are a party to an arrangement with a third party that is
  in the business of distributing software, under which you make payment
  to the third party based on the extent of your activity of conveying
  the work, and under which the third party grants, to any of the
  parties who would receive the covered work from you, a discriminatory
  patent license (a) in connection with copies of the covered work
  conveyed by you (or copies made from those copies), or (b) primarily
  for and in connection with specific products or compilations that
  contain the covered work, unless you entered into that arrangement,
  or that patent license was granted, prior to 28 March 2007.
 
  Nothing in this License shall be construed as excluding or limiting
  any implied license or other defenses to infringement that may
  otherwise be available to you under applicable patent law.
 
  12. No Surrender of Others' Freedom.
 
  If conditions are imposed on you (whether by court order, agreement or
  otherwise) that contradict the conditions of this License, they do not
  excuse you from the conditions of this License. If you cannot convey a
  covered work so as to satisfy simultaneously your obligations under this
  License and any other pertinent obligations, then as a consequence you may
  not convey it at all. For example, if you agree to terms that obligate you
  to collect a royalty for further conveying from those to whom you convey
  the Program, the only way you could satisfy both those terms and this
  License would be to refrain entirely from conveying the Program.
 
  13. Use with the GNU Affero General Public License.
 
  Notwithstanding any other provision of this License, you have
  permission to link or combine any covered work with a work licensed
  under version 3 of the GNU Affero General Public License into a single
  combined work, and to convey the resulting work. The terms of this
  License will continue to apply to the part which is the covered work,
  but the special requirements of the GNU Affero General Public License,
  section 13, concerning interaction through a network will apply to the
  combination as such.
 
  14. Revised Versions of this License.
 
  The Free Software Foundation may publish revised and/or new versions of
  the GNU General Public License from time to time. Such new versions will
  be similar in spirit to the present version, but may differ in detail to
  address new problems or concerns.
 
  Each version is given a distinguishing version number. If the
  Program specifies that a certain numbered version of the GNU General
  Public License "or any later version" applies to it, you have the
  option of following the terms and conditions either of that numbered
  version or of any later version published by the Free Software
  Foundation. If the Program does not specify a version number of the
  GNU General Public License, you may choose any version ever published
  by the Free Software Foundation.
 
  If the Program specifies that a proxy can decide which future
  versions of the GNU General Public License can be used, that proxy's
  public statement of acceptance of a version permanently authorizes you
  to choose that version for the Program.
 
  Later license versions may give you additional or different
  permissions. However, no additional obligations are imposed on any
  author or copyright holder as a result of your choosing to follow a
  later version.
 
  15. Disclaimer of Warranty.
 
  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
  APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
  HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
  OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
  IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
  ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
 
  16. Limitation of Liability.
 
  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
  WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
  THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
  GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
  USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
  DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
  PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
  EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
  SUCH DAMAGES.
 
  17. Interpretation of Sections 15 and 16.
 
  If the disclaimer of warranty and limitation of liability provided
  above cannot be given local legal effect according to their terms,
  reviewing courts shall apply local law that most closely approximates
  an absolute waiver of all civil liability in connection with the
  Program, unless a warranty or assumption of liability accompanies a
  copy of the Program in return for a fee.
 
  END OF TERMS AND CONDITIONS
 
  How to Apply These Terms to Your New Programs
 
  If you develop a new program, and you want it to be of the greatest
  possible use to the public, the best way to achieve this is to make it
  free software which everyone can redistribute and change under these terms.
 
  To do so, attach the following notices to the program. It is safest
  to attach them to the start of each source file to most effectively
  state the exclusion of warranty; and each file should have at least
  the "copyright" line and a pointer to where the full notice is found.
 
  <one line to give the program's name and a brief idea of what it does.>
  Copyright (C) <year> <name of author>
 
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.
 
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  GNU General Public License for more details.
 
  You should have received a copy of the GNU General Public License
  along with this program. If not, see <http://www.gnu.org/licenses/>.
 
  Also add information on how to contact you by electronic and paper mail.
 
  If the program does terminal interaction, make it output a short
  notice like this when it starts in an interactive mode:
 
  <program> Copyright (C) <year> <name of author>
  This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
  This is free software, and you are welcome to redistribute it
  under certain conditions; type `show c' for details.
 
  The hypothetical commands `show w' and `show c' should show the appropriate
  parts of the General Public License. Of course, your program's commands
  might be different; for a GUI interface, you would use an "about box".
 
  You should also get your employer (if you work as a programmer) or school,
  if any, to sign a "copyright disclaimer" for the program, if necessary.
  For more information on this, and how to apply and follow the GNU GPL, see
  <http://www.gnu.org/licenses/>.
 
  The GNU General Public License does not permit incorporating your program
  into proprietary programs. If your program is a subroutine library, you
  may consider it more useful to permit linking proprietary applications with
  the library. If this is what you want to do, use the GNU Lesser General
  Public License instead of this License. But first, please read
  <http://www.gnu.org/philosophy/why-not-lgpl.html>.
 
 
 Binary files /dev/null and b/lib/pChart2.1.0/change.log differ
  <?php
  /*
  pBarcode128 - class to create barcodes (128B)
 
  Version : 2.1.0
  Made by : Jean-Damien POGOLOTTI
  Last Update : 26/01/11
 
  This file can be distributed under the license you can find at :
 
  http://www.pchart.net/license
 
  You can find the whole class documentation on the pChart web site.
  */
 
  /* pData class definition */
  class pBarcode128
  {
  var $Codes;
  var $Reverse;
  var $Result;
  var $pChartObject;
  var $CRC;
 
  /* Class creator */
  function pBarcode128($BasePath="")
  {
  $this->Codes = "";
  $this->Reverse = "";
 
  $FileHandle = @fopen($BasePath."data/128B.db", "r");
 
  if (!$FileHandle) { die("Cannot find barcode database (".$BasePath."128B.db)."); }
 
  while (!feof($FileHandle))
  {
  $Buffer = fgets($FileHandle,4096);
  $Buffer = str_replace(chr(10),"",$Buffer);
  $Buffer = str_replace(chr(13),"",$Buffer);
  $Values = preg_split("/;/",$Buffer);
 
  $this->Codes[$Values[1]]["ID"] = $Values[0];
  $this->Codes[$Values[1]]["Code"] = $Values[2];
  $this->Reverse[$Values[0]]["Code"] = $Values[2];
  $this->Reverse[$Values[0]]["Asc"] = $Values[1];
  }
  fclose($FileHandle);
  }
 
  /* Return the projected size of a barcode */
  function getSize($TextString,$Format="")
  {
  $Angle = isset($Format["Angle"]) ? $Format["Angle"] : 0;
  $ShowLegend = isset($Format["ShowLegend"]) ? $Format["ShowLegend"] : FALSE;
  $LegendOffset = isset($Format["LegendOffset"]) ? $Format["LegendOffset"] : 5;
  $DrawArea = isset($Format["DrawArea"]) ? $Format["DrawArea"] : FALSE;
  $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : 12;
  $Height = isset($Format["Height"]) ? $Format["Height"] : 30;
 
  $TextString = $this->encode128($TextString);
  $BarcodeLength = strlen($this->Result);
 
  if ( $DrawArea ) { $WOffset = 20; } else { $WOffset = 0; }
  if ( $ShowLegend ) { $HOffset = $FontSize+$LegendOffset+$WOffset; } else { $HOffset = 0; }
 
  $X1 = cos($Angle * PI / 180) * ($WOffset+$BarcodeLength);
  $Y1 = sin($Angle * PI / 180) * ($WOffset+$BarcodeLength);
 
  $X2 = $X1 + cos(($Angle+90) * PI / 180) * ($HOffset+$Height);
  $Y2 = $Y1 + sin(($Angle+90) * PI / 180) * ($HOffset+$Height);
 
 
  $AreaWidth = max(abs($X1),abs($X2));
  $AreaHeight = max(abs($Y1),abs($Y2));
 
  return(array("Width"=>$AreaWidth,"Height"=>$AreaHeight));
  }
 
  function encode128($Value,$Format="")
  {
  $this->Result = "11010010000";
  $this->CRC = 104;
  $TextString = "";
 
  for($i=1;$i<=strlen($Value);$i++)
  {
  $CharCode = ord($this->mid($Value,$i,1));
  if ( isset($this->Codes[$CharCode]) )
  {
  $this->Result = $this->Result.$this->Codes[$CharCode]["Code"];
  $this->CRC = $this->CRC + $i*$this->Codes[$CharCode]["ID"];
  $TextString = $TextString.chr($CharCode);
  }
  }
  $this->CRC = $this->CRC - floor($this->CRC/103)*103;
 
  $this->Result = $this->Result.$this->Reverse[$this->CRC]["Code"];
  $this->Result = $this->Result."1100011101011";
 
  return($TextString);
  }
 
  /* Create the encoded string */
  function draw($Object,$Value,$X,$Y,$Format="")
  {
  $this->pChartObject = $Object;
 
  $R = isset($Format["R"]) ? $Format["R"] : 0;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
  $Height = isset($Format["Height"]) ? $Format["Height"] : 30;
  $Angle = isset($Format["Angle"]) ? $Format["Angle"] : 0;
  $ShowLegend = isset($Format["ShowLegend"]) ? $Format["ShowLegend"] : FALSE;
  $LegendOffset = isset($Format["LegendOffset"]) ? $Format["LegendOffset"] : 5;
  $DrawArea = isset($Format["DrawArea"]) ? $Format["DrawArea"] : FALSE;
  $AreaR = isset($Format["AreaR"]) ? $Format["AreaR"] : 255;
  $AreaG = isset($Format["AreaG"]) ? $Format["AreaG"] : 255;
  $AreaB = isset($Format["AreaB"]) ? $Format["AreaB"] : 255;
  $AreaBorderR = isset($Format["AreaBorderR"]) ? $Format["AreaBorderR"] : $AreaR;
  $AreaBorderG = isset($Format["AreaBorderG"]) ? $Format["AreaBorderG"] : $AreaG;
  $AreaBorderB = isset($Format["AreaBorderB"]) ? $Format["AreaBorderB"] : $AreaB;
 
  $TextString = $this->encode128($Value);
 
  if ( $DrawArea )
  {
  $X1 = $X + cos(($Angle-135) * PI / 180) * 10;
  $Y1 = $Y + sin(($Angle-135) * PI / 180) * 10;
 
  $X2 = $X1 + cos($Angle * PI / 180) * (strlen($this->Result)+20);
  $Y2 = $Y1 + sin($Angle * PI / 180) * (strlen($this->Result)+20);
 
  if ( $ShowLegend )
  {
  $X3 = $X2 + cos(($Angle+90) * PI / 180) * ($Height+$LegendOffset+$this->pChartObject->FontSize+10);
  $Y3 = $Y2 + sin(($Angle+90) * PI / 180) * ($Height+$LegendOffset+$this->pChartObject->FontSize+10);
  }
  else
  {
  $X3 = $X2 + cos(($Angle+90) * PI / 180) * ($Height+20);
  $Y3 = $Y2 + sin(($Angle+90) * PI / 180) * ($Height+20);
  }
 
  $X4 = $X3 + cos(($Angle+180) * PI / 180) * (strlen($this->Result)+20);
  $Y4 = $Y3 + sin(($Angle+180) * PI / 180) * (strlen($this->Result)+20);
 
  $Polygon = array($X1,$Y1,$X2,$Y2,$X3,$Y3,$X4,$Y4);
  $Settings = array("R"=>$AreaR,"G"=>$AreaG,"B"=>$AreaB,"BorderR"=>$AreaBorderR,"BorderG"=>$AreaBorderG,"BorderB"=>$AreaBorderB);
  $this->pChartObject->drawPolygon($Polygon,$Settings);
  }
 
  for($i=1;$i<=strlen($this->Result);$i++)
  {
  if ( $this->mid($this->Result,$i,1) == 1 )
  {
  $X1 = $X + cos($Angle * PI / 180) * $i;
  $Y1 = $Y + sin($Angle * PI / 180) * $i;
  $X2 = $X1 + cos(($Angle+90) * PI / 180) * $Height;
  $Y2 = $Y1 + sin(($Angle+90) * PI / 180) * $Height;
 
  $Settings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha);
  $this->pChartObject->drawLine($X1,$Y1,$X2,$Y2,$Settings);
  }
  }
 
  if ( $ShowLegend )
  {
  $X1 = $X + cos($Angle * PI / 180) * (strlen($this->Result)/2);
  $Y1 = $Y + sin($Angle * PI / 180) * (strlen($this->Result)/2);
 
  $LegendX = $X1 + cos(($Angle+90) * PI / 180) * ($Height+$LegendOffset);
  $LegendY = $Y1 + sin(($Angle+90) * PI / 180) * ($Height+$LegendOffset);
 
  $Settings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Angle"=>-$Angle,"Align"=>TEXT_ALIGN_TOPMIDDLE);
  $this->pChartObject->drawText($LegendX,$LegendY,$TextString,$Settings);
  }
  }
 
  function left($value,$NbChar) { return substr($value,0,$NbChar); }
  function right($value,$NbChar) { return substr($value,strlen($value)-$NbChar,$NbChar); }
  function mid($value,$Depart,$NbChar) { return substr($value,$Depart-1,$NbChar); }
  }
  ?>
  <?php
  /*
  pBarcode39 - class to create barcodes (39B)
 
  Version : 2.1.0
  Made by : Jean-Damien POGOLOTTI
  Last Update : 26/01/11
 
  This file can be distributed under the license you can find at :
 
  http://www.pchart.net/license
 
  You can find the whole class documentation on the pChart web site.
  */
 
  /* pData class definition */
  class pBarcode39
  {
  var $Codes;
  var $Reverse;
  var $Result;
  var $pChartObject;
  var $CRC;
  var $MOD43;
 
  /* Class creator */
  function pBarcode39($BasePath="",$EnableMOD43=FALSE)
  {
  $this->MOD43 = $EnableMOD43;
  $this->Codes = "";
  $this->Reverse = "";
 
  $FileHandle = @fopen($BasePath."data/39.db", "r");
 
  if (!$FileHandle) { die("Cannot find barcode database (".$BasePath."data/39.db)."); }
 
  while (!feof($FileHandle))
  {
  $Buffer = fgets($FileHandle,4096);
  $Buffer = str_replace(chr(10),"",$Buffer);
  $Buffer = str_replace(chr(13),"",$Buffer);
  $Values = preg_split("/;/",$Buffer);
 
  $this->Codes[$Values[0]] = $Values[1];
  }
  fclose($FileHandle);
  }
 
  /* Return the projected size of a barcode */
  function getSize($TextString,$Format="")
  {
  $Angle = isset($Format["Angle"]) ? $Format["Angle"] : 0;
  $ShowLegend = isset($Format["ShowLegend"]) ? $Format["ShowLegend"] : FALSE;
  $LegendOffset = isset($Format["LegendOffset"]) ? $Format["LegendOffset"] : 5;
  $DrawArea = isset($Format["DrawArea"]) ? $Format["DrawArea"] : FALSE;
  $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : 12;
  $Height = isset($Format["Height"]) ? $Format["Height"] : 30;
 
  $TextString = $this->encode39($TextString);
  $BarcodeLength = strlen($this->Result);
 
  if ( $DrawArea ) { $WOffset = 20; } else { $WOffset = 0; }
  if ( $ShowLegend ) { $HOffset = $FontSize+$LegendOffset+$WOffset; } else { $HOffset = 0; }
 
  $X1 = cos($Angle * PI / 180) * ($WOffset+$BarcodeLength);
  $Y1 = sin($Angle * PI / 180) * ($WOffset+$BarcodeLength);
 
  $X2 = $X1 + cos(($Angle+90) * PI / 180) * ($HOffset+$Height);
  $Y2 = $Y1 + sin(($Angle+90) * PI / 180) * ($HOffset+$Height);
 
 
  $AreaWidth = max(abs($X1),abs($X2));
  $AreaHeight = max(abs($Y1),abs($Y2));
 
  return(array("Width"=>$AreaWidth,"Height"=>$AreaHeight));
  }
 
  /* Create the encoded string */
  function encode39($Value)
  {
  $this->Result = "100101101101"."0";
  $TextString = "";
  for($i=1;$i<=strlen($Value);$i++)
  {
  $CharCode = ord($this->mid($Value,$i,1));
  if ( $CharCode >= 97 && $CharCode <= 122 ) { $CharCode = $CharCode - 32; }
 
  if ( isset($this->Codes[chr($CharCode)]) )
  {
  $this->Result = $this->Result.$this->Codes[chr($CharCode)]."0";
  $TextString = $TextString.chr($CharCode);
  }
  }
 
  if ( $this->MOD43 )
  {
  $Checksum = $this->checksum($TextString);
  $this->Result = $this->Result.$this->Codes[$Checksum]."0";
  }
 
  $this->Result = $this->Result."100101101101";
  $TextString = "*".$TextString."*";
 
  return($TextString);
  }
 
  /* Create the encoded string */
  function draw($Object,$Value,$X,$Y,$Format="")
  {
  $this->pChartObject = $Object;
 
  $R = isset($Format["R"]) ? $Format["R"] : 0;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
  $Height = isset($Format["Height"]) ? $Format["Height"] : 30;
  $Angle = isset($Format["Angle"]) ? $Format["Angle"] : 0;
  $ShowLegend = isset($Format["ShowLegend"]) ? $Format["ShowLegend"] : FALSE;
  $LegendOffset = isset($Format["LegendOffset"]) ? $Format["LegendOffset"] : 5;
  $DrawArea = isset($Format["DrawArea"]) ? $Format["DrawArea"] : FALSE;
  $AreaR = isset($Format["AreaR"]) ? $Format["AreaR"] : 255;
  $AreaG = isset($Format["AreaG"]) ? $Format["AreaG"] : 255;
  $AreaB = isset($Format["AreaB"]) ? $Format["AreaB"] : 255;
  $AreaBorderR = isset($Format["AreaBorderR"]) ? $Format["AreaBorderR"] : $AreaR;
  $AreaBorderG = isset($Format["AreaBorderG"]) ? $Format["AreaBorderG"] : $AreaG;
  $AreaBorderB = isset($Format["AreaBorderB"]) ? $Format["AreaBorderB"] : $AreaB;
 
  $TextString = $this->encode39($Value);
 
  if ( $DrawArea )
  {
  $X1 = $X + cos(($Angle-135) * PI / 180) * 10;
  $Y1 = $Y + sin(($Angle-135) * PI / 180) * 10;
 
  $X2 = $X1 + cos($Angle * PI / 180) * (strlen($this->Result)+20);
  $Y2 = $Y1 + sin($Angle * PI / 180) * (strlen($this->Result)+20);
 
  if ( $ShowLegend )
  {
  $X3 = $X2 + cos(($Angle+90) * PI / 180) * ($Height+$LegendOffset+$this->pChartObject->FontSize+10);
  $Y3 = $Y2 + sin(($Angle+90) * PI / 180) * ($Height+$LegendOffset+$this->pChartObject->FontSize+10);
  }
  else
  {
  $X3 = $X2 + cos(($Angle+90) * PI / 180) * ($Height+20);
  $Y3 = $Y2 + sin(($Angle+90) * PI / 180) * ($Height+20);
  }
 
  $X4 = $X3 + cos(($Angle+180) * PI / 180) * (strlen($this->Result)+20);
  $Y4 = $Y3 + sin(($Angle+180) * PI / 180) * (strlen($this->Result)+20);
 
  $Polygon = array($X1,$Y1,$X2,$Y2,$X3,$Y3,$X4,$Y4);
  $Settings = array("R"=>$AreaR,"G"=>$AreaG,"B"=>$AreaB,"BorderR"=>$AreaBorderR,"BorderG"=>$AreaBorderG,"BorderB"=>$AreaBorderB);
  $this->pChartObject->drawPolygon($Polygon,$Settings);
  }
 
  for($i=1;$i<=strlen($this->Result);$i++)
  {
  if ( $this->mid($this->Result,$i,1) == 1 )
  {
  $X1 = $X + cos($Angle * PI / 180) * $i;
  $Y1 = $Y + sin($Angle * PI / 180) * $i;
  $X2 = $X1 + cos(($Angle+90) * PI / 180) * $Height;
  $Y2 = $Y1 + sin(($Angle+90) * PI / 180) * $Height;
 
  $Settings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha);
  $this->pChartObject->drawLine($X1,$Y1,$X2,$Y2,$Settings);
  }
  }
 
  if ( $ShowLegend )
  {
  $X1 = $X + cos($Angle * PI / 180) * (strlen($this->Result)/2);
  $Y1 = $Y + sin($Angle * PI / 180) * (strlen($this->Result)/2);
 
  $LegendX = $X1 + cos(($Angle+90) * PI / 180) * ($Height+$LegendOffset);
  $LegendY = $Y1 + sin(($Angle+90) * PI / 180) * ($Height+$LegendOffset);
 
  $Settings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Angle"=>-$Angle,"Align"=>TEXT_ALIGN_TOPMIDDLE);
  $this->pChartObject->drawText($LegendX,$LegendY,$TextString,$Settings);
  }
  }
 
  function checksum( $string )
  {
  $checksum = 0;
  $length = strlen( $string );
  $charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%';
 
  for( $i=0; $i < $length; ++$i )
  $checksum += strpos( $charset, $string[$i] );
 
  return substr( $charset, ($checksum % 43), 1 );
  }
 
  function left($value,$NbChar) { return substr($value,0,$NbChar); }
  function right($value,$NbChar) { return substr($value,strlen($value)-$NbChar,$NbChar); }
  function mid($value,$Depart,$NbChar) { return substr($value,$Depart-1,$NbChar); }
  }
  ?>
  <?php
  /*
  pBubble - class to draw bubble charts
 
  Version : 2.1.0
  Made by : Jean-Damien POGOLOTTI
  Last Update : 26/01/11
 
  This file can be distributed under the license you can find at :
 
  http://www.pchart.net/license
 
  You can find the whole class documentation on the pChart web site.
  */
 
  /* pBubble class definition */
  class pBubble
  {
  var $pChartObject;
  var $pDataObject;
 
  /* Class creator */
  function pBubble($pChartObject,$pDataObject)
  {
  $this->pChartObject = $pChartObject;
  $this->pDataObject = $pDataObject;
  }
 
  /* Prepare the scale */
  function bubbleScale($DataSeries,$WeightSeries)
  {
  if ( !is_array($DataSeries) ) { $DataSeries = array($DataSeries); }
  if ( !is_array($WeightSeries) ) { $WeightSeries = array($WeightSeries); }
 
  /* Parse each data series to find the new min & max boundaries to scale */
  $NewPositiveSerie = ""; $NewNegativeSerie = ""; $MaxValues = 0; $LastPositive = 0; $LastNegative = 0;
  foreach($DataSeries as $Key => $SerieName)
  {
  $SerieWeightName = $WeightSeries[$Key];
 
  $this->pDataObject->setSerieDrawable($SerieWeightName,FALSE);
 
  if ( count($this->pDataObject->Data["Series"][$SerieName]["Data"]) > $MaxValues ) { $MaxValues = count($this->pDataObject->Data["Series"][$SerieName]["Data"]); }
 
  foreach($this->pDataObject->Data["Series"][$SerieName]["Data"] as $Key => $Value)
  {
  if ( $Value >= 0 )
  {
  $BubbleBounds = $Value + $this->pDataObject->Data["Series"][$SerieWeightName]["Data"][$Key];
 
  if ( !isset($NewPositiveSerie[$Key]) )
  { $NewPositiveSerie[$Key] = $BubbleBounds; }
  elseif ( $NewPositiveSerie[$Key] < $BubbleBounds )
  { $NewPositiveSerie[$Key] = $BubbleBounds; }
 
  $LastPositive = $BubbleBounds;
  }
  else
  {
  $BubbleBounds = $Value - $this->pDataObject->Data["Series"][$SerieWeightName]["Data"][$Key];
 
  if ( !isset($NewNegativeSerie[$Key]) )
  { $NewNegativeSerie[$Key] = $BubbleBounds; }
  elseif ( $NewNegativeSerie[$Key] > $BubbleBounds )
  { $NewNegativeSerie[$Key] = $BubbleBounds; }
 
  $LastNegative = $BubbleBounds;
  }
  }
  }
 
  /* Check for missing values and all the fake positive serie */
  if ( $NewPositiveSerie != "" )
  {
  for ($i=0; $i<$MaxValues; $i++) { if (!isset($NewPositiveSerie[$i])) { $NewPositiveSerie[$i] = $LastPositive; } }
 
  $this->pDataObject->addPoints($NewPositiveSerie,"BubbleFakePositiveSerie");
  }
 
  /* Check for missing values and all the fake negative serie */
  if ( $NewNegativeSerie != "" )
  {
  for ($i=0; $i<$MaxValues; $i++) { if (!isset($NewNegativeSerie[$i])) { $NewNegativeSerie[$i] = $LastNegative; } }
 
  $this->pDataObject->addPoints($NewNegativeSerie,"BubbleFakeNegativeSerie");
  }
  }
 
  function resetSeriesColors()
  {
  $Data = $this->pDataObject->getData();
  $Palette = $this->pDataObject->getPalette();
 
  $ID = 0;
  foreach($Data["Series"] as $SerieName => $SeriesParameters)
  {
  if ( $SeriesParameters["isDrawable"] )
  {
  $this->pDataObject->Data["Series"][$SerieName]["Color"]["R"] = $Palette[$ID]["R"];
  $this->pDataObject->Data["Series"][$SerieName]["Color"]["G"] = $Palette[$ID]["G"];
  $this->pDataObject->Data["Series"][$SerieName]["Color"]["B"] = $Palette[$ID]["B"];
  $this->pDataObject->Data["Series"][$SerieName]["Color"]["Alpha"] = $Palette[$ID]["Alpha"];
  $ID++;
  }
  }
  }
 
  /* Prepare the scale */
  function drawBubbleChart($DataSeries,$WeightSeries,$Format="")
  {
  $DrawBorder = isset($Format["DrawBorder"]) ? $Format["DrawBorder"] : TRUE;
  $DrawSquare = isset($Format["DrawSquare"]) ? $Format["DrawSquare"] : FALSE;
  $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 0;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 0;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 0;
  $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : 30;
 
  if ( !is_array($DataSeries) ) { $DataSeries = array($DataSeries); }
  if ( !is_array($WeightSeries) ) { $WeightSeries = array($WeightSeries); }
 
  $Data = $this->pDataObject->getData();
  $Palette = $this->pDataObject->getPalette();
 
  if ( isset($Data["Series"]["BubbleFakePositiveSerie"] ) ) { $this->pDataObject->setSerieDrawable("BubbleFakePositiveSerie",FALSE); }
  if ( isset($Data["Series"]["BubbleFakeNegativeSerie"] ) ) { $this->pDataObject->setSerieDrawable("BubbleFakeNegativeSerie",FALSE); }
 
  $this->resetSeriesColors();
 
  list($XMargin,$XDivs) = $this->pChartObject->scaleGetXSettings();
 
  foreach($DataSeries as $Key => $SerieName)
  {
  $AxisID = $Data["Series"][$SerieName]["Axis"];
  $Mode = $Data["Axis"][$AxisID]["Display"];
  $Format = $Data["Axis"][$AxisID]["Format"];
  $Unit = $Data["Axis"][$AxisID]["Unit"];
 
  $XStep = ($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1-$XMargin*2)/$XDivs;
 
  $X = $this->pChartObject->GraphAreaX1 + $XMargin;
  $Y = $this->pChartObject->GraphAreaY1 + $XMargin;
 
  $Color = array("R"=>$Palette[$Key]["R"],"G"=>$Palette[$Key]["G"],"B"=>$Palette[$Key]["B"],"Alpha"=>$Palette[$Key]["Alpha"]);
 
  if ( $DrawBorder )
  {
  $Color["BorderAlpha"] = $BorderAlpha;
 
  if ( $Surrounding != NULL )
  { $Color["BorderR"] = $Palette[$Key]["R"]+$Surrounding; $Color["BorderG"] = $Palette[$Key]["G"]+$Surrounding; $Color["BorderB"] = $Palette[$Key]["B"]+$Surrounding; }
  else
  { $Color["BorderR"] = $BorderR; $Color["BorderG"] = $BorderG; $Color["BorderB"] = $BorderB; }
  }
 
  foreach($Data["Series"][$SerieName]["Data"] as $iKey => $Point)
  {
  $Weight = $Point + $Data["Series"][$WeightSeries[$Key]]["Data"][$iKey];
 
  $PosArray = $this->pChartObject->scaleComputeY($Point,array("AxisID"=>$AxisID));
  $WeightArray = $this->pChartObject->scaleComputeY($Weight,array("AxisID"=>$AxisID));
 
  if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )
  {
  if ( $XDivs == 0 ) { $XStep = 0; } else { $XStep = ($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1-$XMargin*2)/$XDivs; }
  $Y = floor($PosArray); $CircleRadius = floor(abs($PosArray - $WeightArray)/2);
 
  if ( $DrawSquare )
  $this->pChartObject->drawFilledRectangle($X-$CircleRadius,$Y-$CircleRadius,$X+$CircleRadius,$Y+$CircleRadius,$Color);
  else
  $this->pChartObject->drawFilledCircle($X,$Y,$CircleRadius,$Color);
 
  $X = $X + $XStep;
  }
  elseif ( $Data["Orientation"] == SCALE_POS_TOPBOTTOM )
  {
  if ( $XDivs == 0 ) { $XStep = 0; } else { $XStep = ($this->pChartObject->GraphAreaY2-$this->pChartObject->GraphAreaY1-$XMargin*2)/$XDivs; }
  $X = floor($PosArray); $CircleRadius = floor(abs($PosArray - $WeightArray)/2);
 
  if ( $DrawSquare )
  $this->pChartObject->drawFilledRectangle($X-$CircleRadius,$Y-$CircleRadius,$X+$CircleRadius,$Y+$CircleRadius,$Color);
  else
  $this->pChartObject->drawFilledCircle($X,$Y,$CircleRadius,$Color);
 
  $Y = $Y + $XStep;
  }
  }
  }
  }
  }
  ?>
  <?php
  /*
  pCache - speed up the rendering by caching up the pictures
 
  Version : 2.1.0
  Made by : Jean-Damien POGOLOTTI
  Last Update : 26/01/11
 
  This file can be distributed under the license you can find at :
 
  http://www.pchart.net/license
 
  You can find the whole class documentation on the pChart web site.
  */
 
  /* pData class definition */
  class pCache
  {
  var $CacheFolder;
  var $CacheIndex;
  var $CacheDB;
 
  /* Class creator */
  function pCache($Settings="")
  {
  $CacheFolder = isset($Settings["CacheFolder"]) ? $Settings["CacheFolder"] : "cache";
  $CacheIndex = isset($Settings["CacheIndex"]) ? $Settings["CacheIndex"] : "index.db";
  $CacheDB = isset($Settings["CacheDB"]) ? $Settings["CacheDB"] : "cache.db";
 
  $this->CacheFolder = $CacheFolder;
  $this->CacheIndex = $CacheIndex;
  $this->CacheDB = $CacheDB;
 
  if (!file_exists($this->CacheFolder."/".$this->CacheIndex)) { touch($this->CacheFolder."/".$this->CacheIndex); }
  if (!file_exists($this->CacheFolder."/".$this->CacheDB)) { touch($this->CacheFolder."/".$this->CacheDB); }
  }
 
  /* Flush the cache contents */
  function flush()
  {
  if (file_exists($this->CacheFolder."/".$this->CacheIndex)) { unlink($this->CacheFolder."/".$this->CacheIndex); touch($this->CacheFolder."/".$this->CacheIndex); }
  if (file_exists($this->CacheFolder."/".$this->CacheDB)) { unlink($this->CacheFolder."/".$this->CacheDB); touch($this->CacheFolder."/".$this->CacheDB); }
  }
 
  /* Return the MD5 of the data array to clearly identify the chart */
  function getHash($Data,$Marker="")
  { return(md5($Marker.serialize($Data->Data))); }
 
  /* Write the generated picture to the cache */
  function writeToCache($ID,$pChartObject)
  {
  /* Compute the paths */
  $TemporaryFile = $this->CacheFolder."/tmp_".rand(0,1000).".png";
  $Database = $this->CacheFolder."/".$this->CacheDB;
  $Index = $this->CacheFolder."/".$this->CacheIndex;
 
  /* Flush the picture to a temporary file */
  imagepng($pChartObject->Picture ,$TemporaryFile);
 
  /* Retrieve the files size */
  $PictureSize = filesize($TemporaryFile);
  $DBSize = filesize($Database);
 
  /* Save the index */
  $Handle = fopen($Index,"a");
  fwrite($Handle, $ID.",".$DBSize.",".$PictureSize.",".time().",0 \r\n");
  fclose($Handle);
 
  /* Get the picture raw contents */
  $Handle = fopen($TemporaryFile,"r");
  $Raw = fread($Handle,$PictureSize);
  fclose($Handle);
 
  /* Save the picture in the solid database file */
  $Handle = fopen($Database,"a");
  fwrite($Handle, $Raw);
  fclose($Handle);
 
  /* Remove temporary file */
  unlink($TemporaryFile);
  }
 
  /* Remove object older than the specified TS */
  function removeOlderThan($Expiry)
  { $this->dbRemoval(array("Expiry"=>$Expiry)); }
 
  /* Remove an object from the cache */
  function remove($ID)
  { $this->dbRemoval(array("Name"=>$ID)); }
 
  /* Remove with specified criterias */
  function dbRemoval($Settings)
  {
  $ID = isset($Settings["Name"]) ? $Settings["Name"] : NULL;
  $Expiry = isset($Settings["Expiry"]) ? $Settings["Expiry"] : -(24*60*60);
  $TS = time()-$Expiry;
 
  /* Compute the paths */
  $Database = $this->CacheFolder."/".$this->CacheDB;
  $Index = $this->CacheFolder."/".$this->CacheIndex;
  $DatabaseTemp = $this->CacheFolder."/".$this->CacheDB.".tmp";
  $IndexTemp = $this->CacheFolder."/".$this->CacheIndex.".tmp";
 
  /* Single file removal */
  if ( $ID != NULL )
  {
  /* Retrieve object informations */
  $Object = $this->isInCache($ID,TRUE);
 
  /* If it's not in the cache DB, go away */
  if ( !$Object ) { return(0); }
  }
 
  /* Create the temporary files */
  if (!file_exists($DatabaseTemp)) { touch($DatabaseTemp); }
  if (!file_exists($IndexTemp)) { touch($IndexTemp); }
 
  /* Open the file handles */
  $IndexHandle = @fopen($Index, "r");
  $IndexTempHandle = @fopen($IndexTemp, "w");
  $DBHandle = @fopen($Database, "r");
  $DBTempHandle = @fopen($DatabaseTemp, "w");
 
  /* Remove the selected ID from the database */
  while (!feof($IndexHandle))
  {
  $Entry = fgets($IndexHandle, 4096);
  $Entry = str_replace("\r","",$Entry);
  $Entry = str_replace("\n","",$Entry);
  $Settings = preg_split("/,/",$Entry);
 
  if ( $Entry != "" )
  {
  $PicID = $Settings[0];
  $DBPos = $Settings[1];
  $PicSize = $Settings[2];
  $GeneratedTS = $Settings[3];
  $Hits = $Settings[4];
 
  if ( $Settings[0] != $ID && $GeneratedTS > $TS)
  {
  $CurrentPos = ftell($DBTempHandle);
  fwrite($IndexTempHandle, $PicID.",".$CurrentPos.",".$PicSize.",".$GeneratedTS.",".$Hits."\r\n");
 
  fseek($DBHandle,$DBPos);
  $Picture = fread($DBHandle,$PicSize);
  fwrite($DBTempHandle,$Picture);
  }
  }
  }
 
  /* Close the handles */
  fclose($IndexHandle);
  fclose($IndexTempHandle);
  fclose($DBHandle);
  fclose($DBTempHandle);
 
  /* Remove the prod files */
  unlink($Database);
  unlink($Index);
 
  /* Swap the temp & prod DB */
  rename($DatabaseTemp,$Database);
  rename($IndexTemp,$Index);
  }
 
  function isInCache($ID,$Verbose=FALSE,$UpdateHitsCount=FALSE)
  {
  /* Compute the paths */
  $Index = $this->CacheFolder."/".$this->CacheIndex;
 
  /* Search the picture in the index file */
  $Handle = @fopen($Index, "r");
  while (!feof($Handle))
  {
  $IndexPos = ftell($Handle);
  $Entry = fgets($Handle, 4096);
  if ( $Entry != "" )
  {
  $Settings = preg_split("/,/",$Entry);
  $PicID = $Settings[0];
  if ( $PicID == $ID )
  {
  fclose($Handle);
 
  $DBPos = $Settings[1];
  $PicSize = $Settings[2];
  $GeneratedTS = $Settings[3];
  $Hits = intval($Settings[4]);
 
  if ( $UpdateHitsCount )
  {
  $Hits++;
  if ( strlen($Hits) < 7 ) { $Hits = $Hits.str_repeat(" ",7-strlen($Hits)); }
 
  $Handle = @fopen($Index, "r+");
  fseek($Handle,$IndexPos);
  fwrite($Handle, $PicID.",".$DBPos.",".$PicSize.",".$GeneratedTS.",".$Hits."\r\n");
  fclose($Handle);
  }
 
  if ($Verbose)
  { return(array("DBPos"=>$DBPos,"PicSize"=>$PicSize,"GeneratedTS"=>$GeneratedTS,"Hits"=>$Hits)); }
  else
  { return(TRUE); }
  }
  }
  }
  fclose($Handle);
 
  /* Picture isn't in the cache */
  return(FALSE);
  }
 
  function strokeFromCache($ID)
  {
  /* Get the raw picture from the cache */
  $Picture = $this->getFromCache($ID);
 
  /* Do we have a hit? */
  if ( $Picture == NULL ) { return(FALSE); }
 
  header('Content-type: image/png');
  echo $Picture;
 
  return(TRUE);
  }
 
  function saveFromCache($ID,$Destination)
  {
  /* Get the raw picture from the cache */
  $Picture = $this->getFromCache($ID);
 
  /* Do we have a hit? */
  if ( $Picture == NULL ) { return(FALSE); }
 
  /* Flush the picture to a file */
  $Handle = fopen($Destination,"w");
  fwrite($Handle,$Picture);
  fclose($Handle);
 
  /* All went fine */
  return(TRUE);
  }
 
  function getFromCache($ID)
  {
  /* Compute the path */
  $Database = $this->CacheFolder."/".$this->CacheDB;
 
  /* Lookup for the picture in the cache */
  $CacheInfo = $this->isInCache($ID,TRUE,TRUE);
 
  /* Not in the cache */
  if (!$CacheInfo) { return(NULL); }
 
  /* Get the database extended information */
  $DBPos = $CacheInfo["DBPos"];
  $PicSize = $CacheInfo["PicSize"];
 
  /* Extract the picture from the solid cache file */
  $Handle = @fopen($Database, "r");
  fseek($Handle,$DBPos);
  $Picture = fread($Handle,$PicSize);
  fclose($Handle);
 
  /* Return back the raw picture data */
  return($Picture);
  }
  }
  ?>
  <?php
  /*
  pDraw - class to manipulate data arrays
 
  Version : 2.1.0
  Made by : Jean-Damien POGOLOTTI
  Last Update : 26/01/11
 
  This file can be distributed under the license you can find at :
 
  http://www.pchart.net/license
 
  You can find the whole class documentation on the pChart web site.
  */
 
  /* Axis configuration */
  define("AXIS_FORMAT_DEFAULT" , 680001);
  define("AXIS_FORMAT_TIME" , 680002);
  define("AXIS_FORMAT_DATE" , 680003);
  define("AXIS_FORMAT_METRIC" , 680004);
  define("AXIS_FORMAT_CURRENCY" , 680005);
 
  /* Axis position */
  define("AXIS_POSITION_LEFT" , 681001);
  define("AXIS_POSITION_RIGHT" , 681002);
  define("AXIS_POSITION_TOP" , 681001);
  define("AXIS_POSITION_BOTTOM" , 681002);
 
  /* Axis position */
  define("AXIS_X" , 682001);
  define("AXIS_Y" , 682002);
 
  /* Define value limits */
  define("ABSOLUTE_MIN" , -10000000000000);
  define("ABSOLUTE_MAX" , 10000000000000);
 
  /* Replacement to the PHP NULL keyword */
  define("VOID" , 0.12345);
 
  /* pData class definition */
  class pData
  {
  var $Data;
 
  var $Palette = array("0"=>array("R"=>188,"G"=>224,"B"=>46,"Alpha"=>100),
  "1"=>array("R"=>224,"G"=>100,"B"=>46,"Alpha"=>100),
  "2"=>array("R"=>224,"G"=>214,"B"=>46,"Alpha"=>100),
  "3"=>array("R"=>46,"G"=>151,"B"=>224,"Alpha"=>100),
  "4"=>array("R"=>176,"G"=>46,"B"=>224,"Alpha"=>100),
  "5"=>array("R"=>224,"G"=>46,"B"=>117,"Alpha"=>100),
  "6"=>array("R"=>92,"G"=>224,"B"=>46,"Alpha"=>100),
  "7"=>array("R"=>224,"G"=>176,"B"=>46,"Alpha"=>100));
 
  /* Class creator */
  function pData()
  {
  $this->Data = "";
  $this->Data["XAxisDisplay"] = AXIS_FORMAT_DEFAULT;
  $this->Data["XAxisFormat"] = NULL;
  $this->Data["XAxisName"] = NULL;
  $this->Data["XAxisUnit"] = NULL;
  $this->Data["Abscissa"] = NULL;
  $this->Data["Axis"][0]["Display"] = AXIS_FORMAT_DEFAULT;
  $this->Data["Axis"][0]["Position"] = AXIS_POSITION_LEFT;
  $this->Data["Axis"][0]["Identity"] = AXIS_Y;
  }
 
  /* Add a single point or an array to the given serie */
  function addPoints($Values,$SerieName="Serie1")
  {
  if (!isset($this->Data["Series"][$SerieName]))
  $this->initialise($SerieName);
 
  if ( is_array($Values) )
  {
  foreach($Values as $Key => $Value)
  { $this->Data["Series"][$SerieName]["Data"][] = $Value; }
  }
  else
  $this->Data["Series"][$SerieName]["Data"][] = $Values;
 
  if ( $Values != VOID )
  {
  $this->Data["Series"][$SerieName]["Max"] = max($this->stripVOID($this->Data["Series"][$SerieName]["Data"]));
  $this->Data["Series"][$SerieName]["Min"] = min($this->stripVOID($this->Data["Series"][$SerieName]["Data"]));
  }
  }
 
  /* Strip VOID values */
  function stripVOID($Values)
  { $Result = ""; foreach($Values as $Key => $Value) { if ( $Value != VOID ) { $Result[] = $Value; } } return($Result); }
 
  /* Return the number of values contained in a given serie */
  function getSerieCount($Serie=NULL)
  { if (isset($this->Data["Series"][$Serie]["Data"])) { return(sizeof($this->Data["Series"][$Serie]["Data"])); } else { return(0); } }
 
  /* Remove a serie from the pData object */
  function removeSerie($Serie=NULL)
  { if (isset($this->Data["Series"][$Serie])) { unset($this->Data["Series"][$Serie]); } }
 
  /* Return a value from given serie & index */
  function getValueAt($Serie,$Index=0)
  { if (isset($this->Data["Series"][$Serie]["Data"][$Index])) { return($this->Data["Series"][$Serie]["Data"][$Index]); } else { return(NULL); } }
 
  /* Return the values array */
  function getValues($Serie=NULL)
  { if (isset($this->Data["Series"][$Serie]["Data"])) { return($this->Data["Series"][$Serie]["Data"]); } else { return(NULL); } }
 
  /* Reverse the values in the given serie */
  function reverseSerie($Serie=NULL)
  { if (isset($this->Data["Series"][$Serie]["Data"])) { $this->Data["Series"][$Serie]["Data"] = array_reverse($this->Data["Series"][$Serie]["Data"]); } }
 
  /* Return the sum of the serie values */
  function getSum($Serie)
  { if (isset($this->Data["Series"][$Serie])) { return(array_sum($this->Data["Series"][$Serie]["Data"])); } else { return(NULL); } }
 
  /* Return the max value of a given serie */
  function getMax($Serie)
  { if (isset($this->Data["Series"][$Serie]["Max"])) { return($this->Data["Series"][$Serie]["Max"]); } else { return(NULL); } }
 
  /* Return the min value of a given serie */
  function getMin($Serie)
  { if (isset($this->Data["Series"][$Serie]["Min"])) { return($this->Data["Series"][$Serie]["Min"]); } else { return(NULL); } }
 
  /* Set the description of a given serie */
  function setSerieDescription($Serie=NULL,$Description="My serie")
  { if (isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Description"] = $Description; } }
 
  /* Set a serie as "drawable" while calling a rendering function */
  function setSerieDrawable($Serie=NULL ,$Drawable=TRUE)
  { if (isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["isDrawable"] = $Drawable; } }
 
  /* Set the icon associated to a given serie */
  function setSeriePicture($Serie=NULL,$Picture=NULL)
  { if (isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Picture"] = $Picture; } }
 
  /* Set the name of the X Axis */
  function setXAxisName($Name=NULL)
  { $this->Data["XAxisName"] = $Name; }
 
  /* Set the display mode of the X Axis */
  function setXAxisDisplay($Mode,$Format=NULL)
  { $this->Data["XAxisDisplay"] = $Mode; $this->Data["XAxisFormat"] = $Format; }
 
  /* Set the unit that will be displayed on the X axis */
  function setXAxisUnit($Unit)
  { $this->Data["XAxisUnit"] = $Unit; }
 
  /* Set the serie that will be used as abscissa */
  function setAbscissa($Serie)
  { if (isset($this->Data["Series"][$Serie])) { $this->Data["Abscissa"] = $Serie; } }
 
  /* Create a scatter group specifyin X and Y data series */
  function setScatterSerie($SerieX,$SerieY,$ID=0)
  { if (isset($this->Data["Series"][$SerieX]) && isset($this->Data["Series"][$SerieY]) ) { $this->initScatterSerie($ID); $this->Data["ScatterSeries"][$ID]["X"] = $SerieX; $this->Data["ScatterSeries"][$ID]["Y"] = $SerieY; } }
 
  /* Set the description of a given scatter serie */
  function setScatterSerieDescription($ID,$Description="My serie")
  { if (isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Description"] = $Description; } }
 
  /* Set the icon associated to a given scatter serie */
  function setScatterSeriePicture($ID,$Picture=NULL)
  { if (isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Picture"] = $Picture; } }
 
  /* Set a scatter serie as "drawable" while calling a rendering function */
  function setScatterSerieDrawable($ID ,$Drawable=TRUE)
  { if (isset($this->Data["ScatterSeries"][ID]) ) { $this->Data["ScatterSeries"][ID]["isDrawable"] = $Drawable; } }
 
  /* Define if a scatter serie should be draw with ticks */
  function setScatterSerieTicks($ID,$Width=0)
  { if ( isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Ticks"] = $Width; } }
 
  /* Define if a scatter serie should be draw with a special weight */
  function setScatterSerieWeight($ID,$Weight=0)
  { if ( isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Weight"] = $Weight; } }
 
  /* Associate a color to a scatter serie */
  function setScatterSerieColor($ID,$Format)
  {
  $R = isset($Format["R"]) ? $Format["R"] : 0;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
 
  if ( isset($this->Data["ScatterSeries"][$ID]) )
  {
  $this->Data["ScatterSeries"][$ID]["Color"]["R"] = $R;
  $this->Data["ScatterSeries"][$ID]["Color"]["G"] = $G;
  $this->Data["ScatterSeries"][$ID]["Color"]["B"] = $B;
  $this->Data["ScatterSeries"][$ID]["Color"]["Alpha"] = $Alpha;
  }
  }
 
  /* Compute the series limits for an individual and global point of view */
  function limits()
  {
  $GlobalMin = ABSOLUTE_MAX;
  $GlobalMax = ABSOLUTE_MIN;
 
  foreach($this->Data["Series"] as $Key => $Value)
  {
  if ( $this->Data["Abscissa"] != $Key && $this->Data["Series"][$Key]["isDrawable"] == TRUE)
  {
  if ( $GlobalMin > $this->Data["Series"][$Key]["Min"] ) { $GlobalMin = $this->Data["Series"][$Key]["Min"]; }
  if ( $GlobalMax < $this->Data["Series"][$Key]["Max"] ) { $GlobalMax = $this->Data["Series"][$Key]["Max"]; }
  }
  }
  $this->Data["Min"] = $GlobalMin;
  $this->Data["Max"] = $GlobalMax;
 
  return(array($GlobalMin,$GlobalMax));
  }
 
  /* Mark all series as drawable */
  function drawAll()
  { foreach($this->Data["Series"] as $Key => $Value) { if ( $this->Data["Abscissa"] != $Key ) { $this->Data["Series"][$Key]["isDrawable"]=TRUE; } } }
 
  /* Return the average value of the given serie */
  function getSerieAverage($Serie)
  {
  if ( isset($this->Data["Series"][$Serie]) )
  return(array_sum($this->Data["Series"][$Serie]["Data"])/sizeof($this->Data["Series"][$Serie]["Data"]));
  else
  return(NULL);
  }
 
  /* Return the x th percentil of the given serie */
  function getSeriePercentile($Serie="Serie1",$Percentil=95)
  {
  if (!isset($this->Data["Series"][$Serie]["Data"])) { return(NULL); }
 
  $Values = count($this->Data["Series"][$Serie]["Data"])-1;
  if ( $Values < 0 ) { $Values = 0; }
 
  $PercentilID = floor(($Values/100)*$Percentil+.5);
  $SortedValues = $this->Data["Series"][$Serie]["Data"];
  sort($SortedValues);
 
  if ( is_numeric($SortedValues[$PercentilID]) )
  return($SortedValues[$PercentilID]);
  else
  return(NULL);
  }
 
  /* Add random values to a given serie */
  function addRandomValues($SerieName="Serie1",$Options="")
  {
  $Values = isset($Options["Values"]) ? $Options["Values"] : 20;
  $Min = isset($Options["Min"]) ? $Options["Min"] : 0;
  $Max = isset($Options["Max"]) ? $Options["Max"] : 100;
  $withFloat = isset($Options["withFloat"]) ? $Options["withFloat"] : FALSE;
 
  for ($i=0;$i<=$Values;$i++)
  {
  if ( $withFloat ) { $Value = rand($Min*100,$Max*100)/100; } else { $Value = rand($Min,$Max); }
  $this->addPoints($Value,$SerieName);
  }
  }
 
  /* Test if we have valid data */
  function containsData()
  {
  if (!isset($this->Data["Series"])) { return(FALSE); }
 
  $Result = FALSE;
  foreach($this->Data["Series"] as $Key => $Value)
  { if ( $this->Data["Abscissa"] != $Key && $this->Data["Series"][$Key]["isDrawable"]==TRUE) { $Result=TRUE; } }
  return($Result);
  }
 
  /* Set the display mode of an Axis */
  function setAxisDisplay($AxisID,$Mode=AXIS_FORMAT_DEFAULT,$Format=NULL)
  {
  if ( isset($this->Data["Axis"][$AxisID] ) )
  {
  $this->Data["Axis"][$AxisID]["Display"] = $Mode;
  if ( $Format != NULL ) { $this->Data["Axis"][$AxisID]["Format"] = $Format; }
  }
  }
 
  /* Set the position of an Axis */
  function setAxisPosition($AxisID,$Position=AXIS_POSITION_LEFT)
  { if ( isset($this->Data["Axis"][$AxisID] ) ) { $this->Data["Axis"][$AxisID]["Position"] = $Position; } }
 
  /* Associate an unit to an axis */
  function setAxisUnit($AxisID,$Unit)
  { if ( isset($this->Data["Axis"][$AxisID] ) ) { $this->Data["Axis"][$AxisID]["Unit"] = $Unit; } }
 
  /* Associate a name to an axis */
  function setAxisName($AxisID,$Name)
  { if ( isset($this->Data["Axis"][$AxisID] ) ) { $this->Data["Axis"][$AxisID]["Name"] = $Name; } }
 
  /* Associate a color to an axis */
  function setAxisColor($AxisID,$Format)
  {
  $R = isset($Format["R"]) ? $Format["R"] : 0;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
 
  if ( isset($this->Data["Axis"][$AxisID] ) )
  {
  $this->Data["Axis"][$AxisID]["Color"]["R"] = $R;
  $this->Data["Axis"][$AxisID]["Color"]["G"] = $G;
  $this->Data["Axis"][$AxisID]["Color"]["B"] = $B;
  $this->Data["Axis"][$AxisID]["Color"]["Alpha"] = $Alpha;
  }
  }
 
 
  /* Design an axis as X or Y member */
  function setAxisXY($AxisID,$Identity=AXIS_Y)
  { if ( isset($this->Data["Axis"][$AxisID] ) ) { $this->Data["Axis"][$AxisID]["Identity"] = $Identity; } }
 
  /* Associate one data serie with one axis */
  function setSerieOnAxis($Serie,$AxisID)
  {
  $PreviousAxis = $this->Data["Series"][$Serie]["Axis"];
 
  /* Create missing axis */
  if ( !isset($this->Data["Axis"][$AxisID] ) )
  { $this->Data["Axis"][$AxisID]["Position"] = AXIS_POSITION_LEFT; $this->Data["Axis"][$AxisID]["Identity"] = AXIS_Y;}
 
  $this->Data["Series"][$Serie]["Axis"] = $AxisID;
 
  /* Cleanup unused axis */
  $Found = FALSE;
  foreach($this->Data["Series"] as $SerieName => $Values) { if ( $Values["Axis"] == $PreviousAxis ) { $Found = TRUE; } }
  if (!$Found) { unset($this->Data["Axis"][$PreviousAxis]); }
  }
 
  /* Define if a serie should be draw with ticks */
  function setSerieTicks($Serie,$Width=0)
  { if ( isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Ticks"] = $Width; } }
 
  /* Define if a serie should be draw with a special weight */
  function setSerieWeight($Serie,$Weight=0)
  { if ( isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Weight"] = $Weight; } }
 
  /* Set the color of one serie */
  function setPalette($Serie,$Format=NULL)
  {
  $R = isset($Format["R"]) ? $Format["R"] : 0;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
 
  if ( isset($this->Data["Series"][$Serie]) )
  {
  $OldR = $this->Data["Series"][$Serie]["Color"]["R"]; $OldG = $this->Data["Series"][$Serie]["Color"]["G"]; $OldB = $this->Data["Series"][$Serie]["Color"]["B"];
  $this->Data["Series"][$Serie]["Color"]["R"] = $R;
  $this->Data["Series"][$Serie]["Color"]["G"] = $G;
  $this->Data["Series"][$Serie]["Color"]["B"] = $B;
  $this->Data["Series"][$Serie]["Color"]["Alpha"] = $Alpha;
 
  /* Do reverse processing on the internal palette array */
  foreach ($this->Palette as $Key => $Value)
  { if ($Value["R"] == $OldR && $Value["G"] == $OldG && $Value["B"] == $OldB) { $this->Palette[$Key]["R"] = $R; $this->Palette[$Key]["G"] = $G; $this->Palette[$Key]["B"] = $B; $this->Palette[$Key]["Alpha"] = $Alpha;} }
  }
  }
 
  /* Load a palette file */
  function loadPalette($FileName,$Overwrite=FALSE)
  {
  if ( !file_exists($FileName) ) { return(-1); }
  if ( $Overwrite ) { $this->Palette = ""; }
 
  $fileHandle = @fopen($FileName, "r");
  if (!$fileHandle) { return(-1); }
  while (!feof($fileHandle))
  {
  $buffer = fgets($fileHandle, 4096);
  if ( preg_match("/,/",$buffer) )
  {
  list($R,$G,$B,$Alpha) = preg_split("/,/",$buffer);
  if ( $this->Palette == "" ) { $ID = 0; } else { $ID = count($this->Palette); }
  $this->Palette[$ID] = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha);
  }
  }
  fclose($fileHandle);
 
  /* Apply changes to current series */
  $ID = 0;
  if ( isset($this->Data["Series"]))
  {
  foreach($this->Data["Series"] as $Key => $Value)
  {
  if ( !isset($this->Palette[$ID]) )
  $this->Data["Series"][$Key]["Color"] = array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>0);
  else
  $this->Data["Series"][$Key]["Color"] = $this->Palette[$ID];
  $ID++;
  }
  }
  }
 
  /* Initialise a given scatter serie */
  function initScatterSerie($ID)
  {
  if ( isset($this->Data["ScatterSeries"][$ID]) ) { return(0); }
 
  $this->Data["ScatterSeries"][$ID]["Description"] = "Scatter ".$ID;
  $this->Data["ScatterSeries"][$ID]["isDrawable"] = TRUE;
  $this->Data["ScatterSeries"][$ID]["Picture"] = NULL;
  $this->Data["ScatterSeries"][$ID]["Ticks"] = 0;
  $this->Data["ScatterSeries"][$ID]["Weight"] = 0;
 
  if ( isset($this->Palette[$ID]) )
  $this->Data["ScatterSeries"][$ID]["Color"] = $this->Palette[$ID];
  else
  {
  $this->Data["ScatterSeries"][$ID]["Color"]["R"] = rand(0,255);
  $this->Data["ScatterSeries"][$ID]["Color"]["G"] = rand(0,255);
  $this->Data["ScatterSeries"][$ID]["Color"]["B"] = rand(0,255);
  $this->Data["ScatterSeries"][$ID]["Color"]["Alpha"] = 100;
  }
  }
 
  /* Initialise a given serie */
  function initialise($Serie)
  {
  if ( isset($this->Data["Series"]) ) { $ID = count($this->Data["Series"]); } else { $ID = 0; }
 
  $this->Data["Series"][$Serie]["Description"] = $Serie;
  $this->Data["Series"][$Serie]["isDrawable"] = TRUE;
  $this->Data["Series"][$Serie]["Picture"] = NULL;
  $this->Data["Series"][$Serie]["Max"] = NULL;
  $this->Data["Series"][$Serie]["Min"] = NULL;
  $this->Data["Series"][$Serie]["Axis"] = 0;
  $this->Data["Series"][$Serie]["Ticks"] = 0;
  $this->Data["Series"][$Serie]["Weight"] = 0;
 
  if ( isset($this->Palette[$ID]) )
  $this->Data["Series"][$Serie]["Color"] = $this->Palette[$ID];
  else
  {
  $this->Data["Series"][$Serie]["Color"]["R"] = rand(0,255);
  $this->Data["Series"][$Serie]["Color"]["G"] = rand(0,255);
  $this->Data["Series"][$Serie]["Color"]["B"] = rand(0,255);
  $this->Data["Series"][$Serie]["Color"]["Alpha"] = 100;
  }
  }
 
  function normalize($NormalizationFactor=100,$UnitChange=NULL,$Round=1)
  {
  $Abscissa = $this->Data["Abscissa"];
 
  $SelectedSeries = "";
  $MaxVal = 0;
  foreach($this->Data["Axis"] as $AxisID => $Axis)
  {
  if ( $UnitChange != NULL ) { $this->Data["Axis"][$AxisID]["Unit"] = $UnitChange; }
 
  foreach($this->Data["Series"] as $SerieName => $Serie)
  {
  if ($Serie["Axis"] == $AxisID && $Serie["isDrawable"] == TRUE && $SerieName != $Abscissa)
  {
  $SelectedSeries[$SerieName] = $SerieName;
 
  if ( count($Serie["Data"] ) > $MaxVal ) { $MaxVal = count($Serie["Data"]); }
  }
  }
  }
 
  for($i=0;$i<=$MaxVal-1;$i++)
  {
  $Factor = 0;
  foreach ($SelectedSeries as $Key => $SerieName )
  {
  $Value = $this->Data["Series"][$SerieName]["Data"][$i];
  if ( $Value != VOID )
  $Factor = $Factor + abs($Value);
  }
 
  if ( $Factor != 0 )
  {
  $Factor = $NormalizationFactor / $Factor;
 
  foreach ($SelectedSeries as $Key => $SerieName )
  {
  $Value = $this->Data["Series"][$SerieName]["Data"][$i];
 
  if ( $Value != VOID && $Factor != $NormalizationFactor )
  $this->Data["Series"][$SerieName]["Data"][$i] = round(abs($Value)*$Factor,$Round);
  elseif ( $Value == VOID || $Value == 0 )
  $this->Data["Series"][$SerieName]["Data"][$i] = VOID;
  elseif ( $Factor == $NormalizationFactor )
  $this->Data["Series"][$SerieName]["Data"][$i] = $NormalizationFactor;
  }
  }
  }
 
  foreach ($SelectedSeries as $Key => $SerieName )
  {
  $this->Data["Series"][$SerieName]["Max"] = max($this->stripVOID($this->Data["Series"][$SerieName]["Data"]));
  $this->Data["Series"][$SerieName]["Min"] = min($this->stripVOID($this->Data["Series"][$SerieName]["Data"]));
  }
  }
 
  /* Load data from a CSV (or similar) data source */
  function importFromCSV($FileName,$Options="")
  {
  $Delimiter = isset($Options["Delimiter"]) ? $Options["Delimiter"] : ",";
  $GotHeader = isset($Options["GotHeader"]) ? $Options["GotHeader"] : FALSE;
  $SkipColumns = isset($Options["SkipColumns"]) ? $Options["SkipColumns"] : array(-1);
  $DefaultSerieName = isset($Options["DefaultSerieName"]) ? $Options["DefaultSerieName"] : "Serie";
 
  $Handle = @fopen($FileName,"r");
  if ($Handle)
  {
  $HeaderParsed = FALSE; $SerieNames = "";
  while (!feof($Handle))
  {
  $Buffer = fgets($Handle, 4096);
  $Buffer = str_replace(chr(10),"",$Buffer);
  $Buffer = str_replace(chr(13),"",$Buffer);
  $Values = preg_split("/".$Delimiter."/",$Buffer);
 
  if ( $Buffer != "" )
  {
  if ( $GotHeader && !$HeaderParsed )
  {
  foreach($Values as $Key => $Name) { if ( !in_array($Key,$SkipColumns) ) { $SerieNames[$Key] = $Name; } }
  $HeaderParsed = TRUE;
  }
  else
  {
  if ($SerieNames == "" ) { foreach($Values as $Key => $Name) { if ( !in_array($Key,$SkipColumns) ) { $SerieNames[$Key] = $DefaultSerieName.$Key; } } }
  foreach($Values as $Key => $Value) { if ( !in_array($Key,$SkipColumns) ) { $this->addPoints($Value,$SerieNames[$Key]); } }
  }
  }
  }
  fclose($Handle);
  }
  }
 
  /* Return the data & configuration of the series */
  function getData()
  { return($this->Data); }
 
  /* Return the palette of the series */
  function getPalette()
  { return($this->Palette); }
 
  /* Called by the scaling algorithm to save the config */
  function saveAxisConfig($Axis) { $this->Data["Axis"]=$Axis; }
 
  /* Called by the scaling algorithm to save the orientation of the scale */
  function saveOrientation($Orientation) { $this->Data["Orientation"]=$Orientation; }
 
  /* Class string wrapper */
  function __toString()
  { return("pData object."); }
  }
  ?>
  <?php
  /*
  pDraw - class extension with drawing methods
 
  Version : 2.1.0
  Made by : Jean-Damien POGOLOTTI
  Last Update : 26/01/11
 
  This file can be distributed under the license you can find at :
 
  http://www.pchart.net/license
 
  You can find the whole class documentation on the pChart web site.
  */
 
  define("DIRECTION_VERTICAL" , 690001);
  define("DIRECTION_HORIZONTAL" , 690002);
 
  define("SCALE_POS_LEFTRIGHT" , 690101);
  define("SCALE_POS_TOPBOTTOM" , 690102);
 
  define("SCALE_MODE_FLOATING" , 690201);
  define("SCALE_MODE_START0" , 690202);
  define("SCALE_MODE_ADDALL" , 690203);
  define("SCALE_MODE_ADDALL_START0" , 690204);
  define("SCALE_MODE_MANUAL" , 690205);
 
  define("SCALE_SKIP_NONE" , 690301);
  define("SCALE_SKIP_SAME" , 690302);
  define("SCALE_SKIP_NUMBERS" , 690303);
 
  define("TEXT_ALIGN_TOPLEFT" , 690401);
  define("TEXT_ALIGN_TOPMIDDLE" , 690402);
  define("TEXT_ALIGN_TOPRIGHT" , 690403);
  define("TEXT_ALIGN_MIDDLELEFT" , 690404);
  define("TEXT_ALIGN_MIDDLEMIDDLE" , 690405);
  define("TEXT_ALIGN_MIDDLERIGHT" , 690406);
  define("TEXT_ALIGN_BOTTOMLEFT" , 690407);
  define("TEXT_ALIGN_BOTTOMMIDDLE" , 690408);
  define("TEXT_ALIGN_BOTTOMRIGHT" , 690409);
 
  define("POSITION_TOP" , 690501);
  define("POSITION_BOTTOM" , 690502);
 
  define("LABEL_POS_LEFT" , 690601);
  define("LABEL_POS_CENTER" , 690602);
  define("LABEL_POS_RIGHT" , 690603);
  define("LABEL_POS_TOP" , 690604);
  define("LABEL_POS_BOTTOM" , 690605);
  define("LABEL_POS_INSIDE" , 690606);
  define("LABEL_POS_OUTSIDE" , 690607);
 
  define("ORIENTATION_HORIZONTAL" , 690701);
  define("ORIENTATION_VERTICAL" , 690702);
 
  define("LEGEND_NOBORDER" , 690800);
  define("LEGEND_BOX" , 690801);
  define("LEGEND_ROUND" , 690802);
 
  define("LEGEND_VERTICAL" , 690901);
  define("LEGEND_HORIZONTAL" , 690902);
 
  define("LEGEND_FAMILY_BOX" , 691051);
  define("LEGEND_FAMILY_CIRCLE" , 691052);
  define("LEGEND_FAMILY_LINE" , 691053);
 
  define("DISPLAY_AUTO" , 691001);
  define("DISPLAY_MANUAL" , 691002);
 
  define("LABELING_ALL" , 691011);
  define("LABELING_DIFFERENT" , 691012);
 
  define("BOUND_MIN" , 691021);
  define("BOUND_MAX" , 691022);
  define("BOUND_BOTH" , 691023);
 
  define("BOUND_LABEL_POS_TOP" , 691031);
  define("BOUND_LABEL_POS_BOTTOM" , 691032);
  define("BOUND_LABEL_POS_AUTO" , 691033);
 
  define("CAPTION_LEFT_TOP" , 691041);
  define("CAPTION_RIGHT_BOTTOM" , 691042);
 
  define("GRADIENT_SIMPLE" , 691051);
  define("GRADIENT_EFFECT_CAN" , 691052);
 
  define("PI" , 3.14159265);
  define("ALL" , 69);
  define("NONE" , 31);
  define("AUTO" , 690000);
  define("OUT_OF_SIGHT" , -10000000000000);
 
  class pDraw
  {
  /* Returns the number of drawable series */
  function countDrawableSeries()
  {
  $Results = 0;
  $Data = $this->DataSet->getData();
 
  foreach($Data["Series"] as $SerieName => $Serie)
  { if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) { $Results++; } }
 
  return($Results);
  }
 
  /* Fix box coordinates */
  function fixBoxCoordinates($Xa,$Ya,$Xb,$Yb)
  {
  $X1 = min($Xa,$Xb); $Y1 = min($Ya,$Yb);
  $X2 = max($Xa,$Xb); $Y2 = max($Ya,$Yb);
 
  return(array($X1,$Y1,$X2,$Y2));
  }
 
  /* Draw a polygon */
  function drawPolygon($Points,$Format="")
  {
  $R = isset($Format["R"]) ? $Format["R"] : 0;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
  $NoBorder = isset($Format["NoBorder"]) ? $Format["NoBorder"] : FALSE;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : $R;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : $G;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : $B;
  $BorderAlpha = isset($Format["Alpha"]) ? $Format["Alpha"] : $Alpha / 2;
  $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;
  $SkipX = isset($Format["SkipX"]) ? $Format["SkipX"] : OUT_OF_SIGHT;
  $SkipY = isset($Format["SkipY"]) ? $Format["SkipY"] : OUT_OF_SIGHT;
 
  /* Calling the ImageFilledPolygon() function over the $Points array will round it */
  $Backup = $Points;
 
  if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; }
 
  if ( $SkipX != OUT_OF_SIGHT ) { $SkipX = floor($SkipX); }
  if ( $SkipY != OUT_OF_SIGHT ) { $SkipY = floor($SkipY); }
 
  $RestoreShadow = $this->Shadow;
  if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )
  {
  $this->Shadow = FALSE;
  for($i=0;$i<=count($Points)-1;$i=$i+2)
  { $Shadow[] = $Points[$i] + $this->ShadowX; $Shadow[] = $Points[$i+1] + $this->ShadowY; }
  $this->drawPolygon($Shadow,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa,"NoBorder"=>TRUE));
  }
 
  $FillColor = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha);
 
  if ( count($Points) >= 6 )
  { ImageFilledPolygon($this->Picture,$Points,count($Points)/2,$FillColor); }
 
  if ( !$NoBorder )
  {
  $Points = $Backup;
 
  $BorderSettings = array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha);
  for($i=0;$i<=count($Points)-1;$i=$i+2)
  {
  if ( isset($Points[$i+2]) )
  {
  if ( !($Points[$i] == $Points[$i+2] && $Points[$i] == $SkipX ) && !($Points[$i+1] == $Points[$i+3] && $Points[$i+1] == $SkipY ) )
  $this->drawLine($Points[$i],$Points[$i+1],$Points[$i+2],$Points[$i+3],$BorderSettings);
  }
  else
  {
  if ( !($Points[$i] == $Points[0] && $Points[$i] == $SkipX ) && !($Points[$i+1] == $Points[1] && $Points[$i+1] == $SkipY ) )
  $this->drawLine($Points[$i],$Points[$i+1],$Points[0],$Points[1],$BorderSettings);
  }
  }
  }
 
  $this->Shadow = $RestoreShadow;
  }
 
  /* Apply AALias correction to the rounded box boundaries */
  function offsetCorrection($Value,$Mode)
  {
  $Value = round($Value,1);
 
  if ( $Value == 0 && $Mode == 1 ) { return(.9); }
  if ( $Value == 0 ) { return(0); }
 
  if ( $Mode == 1)
  { if ( $Value == 1 ) { return(.9); }; if ( $Value == .1 ) { return(.9); }; if ( $Value == .2 ) { return(.8); }; if ( $Value == .3 ) { return(.8); }; if ( $Value == .4 ) { return(.7); }; if ( $Value == .5 ) { return(.5); }; if ( $Value == .6 ) { return(.8); }; if ( $Value == .7 ) { return(.7); }; if ( $Value == .8 ) { return(.6); }; if ( $Value == .9 ) { return(.9); }; }
 
  if ( $Mode == 2)
  { if ( $Value == 1 ) { return(.9); }; if ( $Value == .1 ) { return(.1); }; if ( $Value == .2 ) { return(.2); }; if ( $Value == .3 ) { return(.3); }; if ( $Value == .4 ) { return(.4); }; if ( $Value == .5 ) { return(.5); }; if ( $Value == .6 ) { return(.8); }; if ( $Value == .7 ) { return(.7); }; if ( $Value == .8 ) { return(.8); }; if ( $Value == .9 ) { return(.9); }; }
 
  if ( $Mode == 3)
  { if ( $Value == 1 ) { return(.1); }; if ( $Value == .1 ) { return(.1); }; if ( $Value == .2 ) { return(.2); }; if ( $Value == .3 ) { return(.3); }; if ( $Value == .4 ) { return(.4); }; if ( $Value == .5 ) { return(.9); }; if ( $Value == .6 ) { return(.6); }; if ( $Value == .7 ) { return(.7); }; if ( $Value == .8 ) { return(.4); }; if ( $Value == .9 ) { return(.5); }; }
 
  if ( $Mode == 4)
  { if ( $Value == 1 ) { return(-1); }; if ( $Value == .1 ) { return(.1); }; if ( $Value == .2 ) { return(.2); }; if ( $Value == .3 ) { return(.3); }; if ( $Value == .4 ) { return(.1); }; if ( $Value == .5 ) { return(-.1); }; if ( $Value == .6 ) { return(.8); }; if ( $Value == .7 ) { return(.1); }; if ( $Value == .8 ) { return(.1); }; if ( $Value == .9 ) { return(.1); }; }
  }
 
  /* Draw a rectangle with rounded corners */
  function drawRoundedRectangle($X1,$Y1,$X2,$Y2,$Radius,$Format="")
  {
  $R = isset($Format["R"]) ? $Format["R"] : 0;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
 
  list($X1,$Y1,$X2,$Y2) = $this->fixBoxCoordinates($X1,$Y1,$X2,$Y2);
 
  if ( $X2 - $X1 < $Radius ) { $Radius = floor((($X2-$X1))/2); }
  if ( $Y2 - $Y1 < $Radius ) { $Radius = floor((($Y2-$Y1))/2); }
 
  $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"NoBorder"=>TRUE);
 
  if ( $Radius <= 0 ) { $this->drawRectangle($X1,$Y1,$X2,$Y2,$Color); return(0); }
 
  if ( $this->Antialias )
  {
  $this->drawLine($X1+$Radius,$Y1,$X2-$Radius,$Y1,$Color);
  $this->drawLine($X2,$Y1+$Radius,$X2,$Y2-$Radius,$Color);
  $this->drawLine($X2-$Radius,$Y2,$X1+$Radius,$Y2,$Color);
  $this->drawLine($X1,$Y1+$Radius,$X1,$Y2-$Radius,$Color);
  }
  else
  {
  $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha);
  imageline($this->Picture,$X1+$Radius,$Y1,$X2-$Radius,$Y1,$Color);
  imageline($this->Picture,$X2,$Y1+$Radius,$X2,$Y2-$Radius,$Color);
  imageline($this->Picture,$X2-$Radius,$Y2,$X1+$Radius,$Y2,$Color);
  imageline($this->Picture,$X1,$Y1+$Radius,$X1,$Y2-$Radius,$Color);
  }
 
  $Step = 360 / (2 * PI * $Radius);
  for($i=0;$i<=90;$i=$i+$Step)
  {
  $X = cos(($i+180)*PI/180) * $Radius + $X1 + $Radius;
  $Y = sin(($i+180)*PI/180) * $Radius + $Y1 + $Radius;
  $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha));
 
  $X = cos(($i+90)*PI/180) * $Radius + $X1 + $Radius;
  $Y = sin(($i+90)*PI/180) * $Radius + $Y2 - $Radius;
  $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha));
 
  $X = cos($i*PI/180) * $Radius + $X2 - $Radius;
  $Y = sin($i*PI/180) * $Radius + $Y2 - $Radius;
  $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha));
 
  $X = cos(($i+270)*PI/180) * $Radius + $X2 - $Radius;
  $Y = sin(($i+270)*PI/180) * $Radius + $Y1 + $Radius;
  $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha));
  }
  }
 
  /* Draw a rectangle with rounded corners */
  function drawRoundedFilledRectangle($X1,$Y1,$X2,$Y2,$Radius,$Format="")
  {
  $R = isset($Format["R"]) ? $Format["R"] : 0;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : -1;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : -1;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : -1;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
  $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;
 
  if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; }
  if ( $BorderR == -1 ) { $BorderR = $R; $BorderG = $G; $BorderB = $B; }
 
  list($X1,$Y1,$X2,$Y2) = $this->fixBoxCoordinates($X1,$Y1,$X2,$Y2);
 
  if ( $X2 - $X1 < $Radius ) { $Radius = floor((($X2-$X1))/2); }
  if ( $Y2 - $Y1 < $Radius ) { $Radius = floor((($Y2-$Y1))/2); }
 
  $RestoreShadow = $this->Shadow;
  if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )
  {
  $this->Shadow = FALSE;
  $this->drawRoundedFilledRectangle($X1+$this->ShadowX,$Y1+$this->ShadowY,$X2+$this->ShadowX,$Y2+$this->ShadowY,$Radius,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa));
  }
 
  $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"NoBorder"=>TRUE);
 
  if ( $Radius <= 0 ) { $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,$Color); return(0); }
 
  $YTop = $Y1+$Radius;
  $YBottom = $Y2-$Radius;
 
  $Step = 360 / (2 * PI * $Radius);
  $Positions = ""; $Radius--; $MinY = ""; $MaxY = "";
  for($i=0;$i<=90;$i=$i+$Step)
  {
  $Xp1 = cos(($i+180)*PI/180) * $Radius + $X1 + $Radius;
  $Xp2 = cos(((90-$i)+270)*PI/180) * $Radius + $X2 - $Radius;
  $Yp = floor(sin(($i+180)*PI/180) * $Radius + $YTop);
  if ( $MinY == "" || $Yp > $MinY ) { $MinY = $Yp; }
 
  if ( !isset($Positions[$Yp]) )
  { $Positions[$Yp]["X1"] = $Xp1; $Positions[$Yp]["X2"] = $Xp2; }
  else
  { $Positions[$Yp]["X1"] = min($Positions[$Yp]["X1"],$Xp1); $Positions[$Yp]["X2"] = max($Positions[$Yp]["X2"],$Xp2); }
 
  $Xp1 = cos(($i+90)*PI/180) * $Radius + $X1 + $Radius;
  $Xp2 = cos((90-$i)*PI/180) * $Radius + $X2 - $Radius;
  $Yp = floor(sin(($i+90)*PI/180) * $Radius + $YBottom);
  if ( $MaxY == "" || $Yp < $MaxY ) { $MaxY = $Yp; }
 
  if ( !isset($Positions[$Yp]["Bottom"]) )
  { $Positions[$Yp]["X1"] = $Xp1; $Positions[$Yp]["X2"] = $Xp2; }
  else
  { $Positions[$Yp]["X1"] = min($Positions[$Yp]["X1"],$Xp1); $Positions[$Yp]["X2"] = max($Positions[$Yp]["X2"],$Xp2); }
  }
 
  $ManualColor = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha);
  foreach($Positions as $Yp => $Bounds)
  {
  $X1 = $Bounds["X1"]; $X1Dec = $this->getFirstDecimal($X1); if ( $X1Dec != 0 ) { $X1 = floor($X1)+1; }
  $X2 = $Bounds["X2"]; $X2Dec = $this->getFirstDecimal($X2); if ( $X2Dec != 0 ) { $X2 = floor($X2)-1; }
 
  imageline($this->Picture,$X1,$Yp,$X2,$Yp,$ManualColor);
  }
  $this->drawFilledRectangle($X1,$MinY+1,floor($X2),$MaxY-1,$Color);
 
  $Radius++;
  $this->drawRoundedRectangle($X1,$Y1,$X2+1,$Y2-1,$Radius,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha));
 
  $this->Shadow = $RestoreShadow;
  }
 
  /* Draw a rectangle with rounded corners */
  function drawRoundedFilledRectangle_deprecated($X1,$Y1,$X2,$Y2,$Radius,$Format="")
  {
  $R = isset($Format["R"]) ? $Format["R"] : 0;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : -1;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : -1;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : -1;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
  $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;
 
  if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; }
  if ( $BorderR == -1 ) { $BorderR = $R; $BorderG = $G; $BorderB = $B; }
 
  list($X1,$Y1,$X2,$Y2) = $this->fixBoxCoordinates($X1,$Y1,$X2,$Y2);
 
  if ( $X2 - $X1 < $Radius ) { $Radius = floor((($X2-$X1)+2)/2); }
  if ( $Y2 - $Y1 < $Radius ) { $Radius = floor((($Y2-$Y1)+2)/2); }
 
  $RestoreShadow = $this->Shadow;
  if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )
  {
  $this->Shadow = FALSE;
  $this->drawRoundedFilledRectangle($X1+$this->ShadowX,$Y1+$this->ShadowY,$X2+$this->ShadowX,$Y2+$this->ShadowY,$Radius,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa));
  }
 
  if ( $this->getFirstDecimal($X2) >= 5 ) { $XOffset2 = 1; } else { $XOffset2 = 0; }
  if ( $this->getFirstDecimal($X1) <= 5 ) { $XOffset1 = 1; } else { $XOffset1 = 0; }
 
  if ( !$this->Antialias ) { $XOffset1 = 1; $XOffset2 = 1; }
 
  $YTop = floor($Y1+$Radius);
  $YBottom = floor($Y2-$Radius);
 
  $this->drawFilledRectangle($X1-$XOffset1,$YTop,$X2+$XOffset2,$YBottom,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"NoBorder"=>TRUE));
 
  $Step = 360 / (2 * PI * $Radius);
  $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha);
  $Color2 = $this->allocateColor($this->Picture,255,0,0,$Alpha);
  $Drawn = "";
 
  if ( $Alpha < 100 ) { $Drawn[$YTop] = FALSE; }
  if ( $Alpha < 100 ) { $Drawn[$YBottom] = TRUE; }
 
  for($i=0;$i<=90;$i=$i+$Step)
  {
  $Xp1 = cos(($i+180)*PI/180) * $Radius + $X1 + $Radius;
  $Xp2 = cos(((90-$i)+270)*PI/180) * $Radius + $X2 - $Radius;
  $Yp = sin(($i+180)*PI/180) * $Radius + $YTop;
 
  if ( $this->getFirstDecimal($Xp1) > 5 ) { $XOffset1 = 1; } else { $XOffset1 = 0; }
  if ( $this->getFirstDecimal($Xp2) > 5 ) { $XOffset2 = 1; } else { $XOffset2 = 0; }
  if ( $this->getFirstDecimal($Yp) > 5 ) { $YOffset = 1; } else { $YOffset = 0; }
 
  if ( !isset($Drawn[$Yp+$YOffset]) || $Alpha == 100 )
  imageline($this->Picture,$Xp1+$XOffset1,$Yp+$YOffset,$Xp2+$XOffset2,$Yp+$YOffset,$Color);
 
  $Drawn[$Yp+$YOffset] = $Xp2;
 
  $Xp1 = cos(($i+90)*PI/180) * $Radius + $X1 + $Radius;
  $Xp2 = cos((90-$i)*PI/180) * $Radius + $X2 - $Radius;
  $Yp = sin(($i+90)*PI/180) * $Radius + $YBottom;
 
  if ( $this->getFirstDecimal($Xp1) > 7 ) { $XOffset1 = 1; } else { $XOffset1 = 0; }
  if ( $this->getFirstDecimal($Xp2) > 7 ) { $XOffset2 = 1; } else { $XOffset2 = 0; }
  if ( $this->getFirstDecimal($Yp) > 5 ) { $YOffset = 1; } else { $YOffset = 0; }
 
  if ( !isset($Drawn[$Yp+$YOffset]) || $Alpha == 100 )
  imageline($this->Picture,$Xp1+$XOffset1,$Yp+$YOffset,$Xp2+$XOffset2,$Yp+$YOffset,$Color);
 
  $Drawn[$Yp+$YOffset] = $Xp2;
  }
 
  $this->drawRoundedRectangle($X1,$Y1,$X2,$Y2,$Radius,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha));
 
  $this->Shadow = $RestoreShadow;
  }
 
  /* Draw a rectangle */
  function drawRectangle($X1,$Y1,$X2,$Y2,$Format="")
  {
  $R = isset($Format["R"]) ? $Format["R"] : 0;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
  $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL;
  $NoAngle = isset($Format["NoAngle"]) ? $Format["NoAngle"] : FALSE;
 
  if ($X1 > $X2) { list($X1, $X2) = array($X2, $X1); }
  if ($Y1 > $Y2) { list($Y1, $Y2) = array($Y2, $Y1); }
 
  if ( $this->Antialias )
  {
  if ( $NoAngle )
  {
  $this->drawLine($X1+1,$Y1,$X2-1,$Y1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));
  $this->drawLine($X2,$Y1+1,$X2,$Y2-1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));
  $this->drawLine($X2-1,$Y2,$X1+1,$Y2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));
  $this->drawLine($X1,$Y1+1,$X1,$Y2-1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));
  }
  else
  {
  $this->drawLine($X1+1,$Y1,$X2-1,$Y1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));
  $this->drawLine($X2,$Y1,$X2,$Y2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));
  $this->drawLine($X2-1,$Y2,$X1+1,$Y2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));
  $this->drawLine($X1,$Y1,$X1,$Y2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));
  }
  }
  else
  {
  $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha);
  imagerectangle($this->Picture,$X1,$Y1,$X2,$Y2,$Color);
  }
  }
 
  /* Draw a filled rectangle */
  function drawFilledRectangle($X1,$Y1,$X2,$Y2,$Format="")
  {
  $R = isset($Format["R"]) ? $Format["R"] : 0;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : -1;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : -1;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : -1;
  $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : $Alpha;
  $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;
  $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL;
  $NoAngle = isset($Format["NoAngle"]) ? $Format["NoAngle"] : NULL;
  $Dash = isset($Format["Dash"]) ? $Format["Dash"] : FALSE;
  $DashStep = isset($Format["DashStep"]) ? $Format["DashStep"] : 4;
  $DashR = isset($Format["DashR"]) ? $Format["DashR"] : 0;
  $DashG = isset($Format["DashG"]) ? $Format["DashG"] : 0;
  $DashB = isset($Format["DashB"]) ? $Format["DashB"] : 0;
  $NoBorder = isset($Format["NoBorder"]) ? $Format["NoBorder"] : FALSE;
 
  if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; }
 
  if ($X1 > $X2) { list($X1, $X2) = array($X2, $X1); }
  if ($Y1 > $Y2) { list($Y1, $Y2) = array($Y2, $Y1); }
 
  $RestoreShadow = $this->Shadow;
  if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )
  {
  $this->Shadow = FALSE;
  $this->drawFilledRectangle($X1+$this->ShadowX,$Y1+$this->ShadowY,$X2+$this->ShadowX,$Y2+$this->ShadowY,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa,"Ticks"=>$Ticks,"NoAngle"=>$NoAngle));
  }
 
  $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha);
  if ( $NoAngle )
  {
  imagefilledrectangle($this->Picture,ceil($X1)+1,ceil($Y1),floor($X2)-1,floor($Y2),$Color);
  imageline($this->Picture,ceil($X1),ceil($Y1)+1,ceil($X1),floor($Y2)-1,$Color);
  imageline($this->Picture,floor($X2),ceil($Y1)+1,floor($X2),floor($Y2)-1,$Color);
  }
  else
  imagefilledrectangle($this->Picture,ceil($X1),ceil($Y1),floor($X2),floor($Y2),$Color);
 
  if ( $Dash )
  {
  if ( $BorderR != -1 ) { $iX1=$X1+1; $iY1=$Y1+1; $iX2=$X2-1; $iY2=$Y2-1; } else { $iX1=$X1; $iY1=$Y1; $iX2=$X2; $iY2=$Y2; }
 
  $Color = $this->allocateColor($this->Picture,$DashR,$DashG,$DashB,$Alpha);
  $Y=$iY1-$DashStep;
  for($X=$iX1; $X<=$iX2+($iY2-$iY1); $X=$X+$DashStep)
  {
  $Y=$Y+$DashStep;
  if ( $X > $iX2 ) { $Xa = $X-($X-$iX2); $Ya = $iY1+($X-$iX2); } else { $Xa = $X; $Ya = $iY1; }
  if ( $Y > $iY2 ) { $Xb = $iX1+($Y-$iY2); $Yb = $Y-($Y-$iY2); } else { $Xb = $iX1; $Yb = $Y; }
  imageline($this->Picture,$Xa,$Ya,$Xb,$Yb,$Color);
  }
  }
 
  if ( $this->Antialias && !$NoBorder )
  {
  if ( $X1 < ceil($X1) )
  {
  $AlphaA = $Alpha * (ceil($X1) - $X1);
  $Color = $this->allocateColor($this->Picture,$R,$G,$B,$AlphaA);
  imageline($this->Picture,ceil($X1)-1,ceil($Y1),ceil($X1)-1,floor($Y2),$Color);
  }
 
  if ( $Y1 < ceil($Y1) )
  {
  $AlphaA = $Alpha * (ceil($Y1) - $Y1);
  $Color = $this->allocateColor($this->Picture,$R,$G,$B,$AlphaA);
  imageline($this->Picture,ceil($X1),ceil($Y1)-1,floor($X2),ceil($Y1)-1,$Color);
  }
 
  if ( $X2 > floor($X2) )
  {
  $AlphaA = $Alpha * (.5-($X2 - floor($X2)));
  $Color = $this->allocateColor($this->Picture,$R,$G,$B,$AlphaA);
  imageline($this->Picture,floor($X2)+1,ceil($Y1),floor($X2)+1,floor($Y2),$Color);
  }
 
  if ( $Y2 > floor($Y2) )
  {
  $AlphaA = $Alpha * (.5-($Y2 - floor($Y2)));
  $Color = $this->allocateColor($this->Picture,$R,$G,$B,$AlphaA);
  imageline($this->Picture,ceil($X1),floor($Y2)+1,floor($X2),floor($Y2)+1,$Color);
  }
  }
 
  if ( $BorderR != -1 )
  $this->drawRectangle($X1,$Y1,$X2,$Y2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$Ticks,"NoAngle"=>$NoAngle));
 
  $this->Shadow = $RestoreShadow;
  }
 
  /* Draw a rectangular marker of the specified size */
  function drawRectangleMarker($X,$Y,$Format="")
  {
  $Size = isset($Format["Size"]) ? $Format["Size"] : 4;
 
  $HalfSize = floor($Size/2);
  $this->drawFilledRectangle($X-$HalfSize,$Y-$HalfSize,$X+$HalfSize,$Y+$HalfSize,$Format);
  }
 
  /* Drawn a spline based on the bezier function */
  function drawSpline($Coordinates,$Format="")
  {
  $R = isset($Format["R"]) ? $Format["R"] : 0;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
  $Force = isset($Format["Force"]) ? $Format["Force"] : 30;
  $Forces = isset($Format["Forces"]) ? $Format["Forces"] : NULL;
  $ShowC = isset($Format["ShowControl"]) ? $Format["ShowControl"] : FALSE;
  $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL;
  $PathOnly = isset($Format["PathOnly"]) ? $Format["PathOnly"] : FALSE;
  $Weight = isset($Format["Weight"]) ? $Format["Weight"] : NULL;
 
  $Cpt = NULL; $Mode = NULL; $Result = "";
  for($i=1;$i<=count($Coordinates)-1;$i++)
  {
  $X1 = $Coordinates[$i-1][0]; $Y1 = $Coordinates[$i-1][1];
  $X2 = $Coordinates[$i][0]; $Y2 = $Coordinates[$i][1];
 
  if ( $Forces != NULL ) { $Force = $Forces[$i]; }
 
  /* First segment */
  if ( $i == 1 )
  { $Xv1 = $X1; $Yv1 = $Y1; }
  else
  {
  $Angle1 = $this->getAngle($XLast,$YLast,$X1,$Y1);
  $Angle2 = $this->getAngle($X1,$Y1,$X2,$Y2);
  $XOff = cos($Angle2 * PI / 180) * $Force + $X1;
  $YOff = sin($Angle2 * PI / 180) * $Force + $Y1;
 
  $Xv1 = cos($Angle1 * PI / 180) * $Force + $XOff;
  $Yv1 = sin($Angle1 * PI / 180) * $Force + $YOff;
  }
 
  /* Last segment */
  if ( $i == count($Coordinates)-1 )
  { $Xv2 = $X2; $Yv2 = $Y2; }
  else
  {
  $Angle1 = $this->getAngle($X2,$Y2,$Coordinates[$i+1][0],$Coordinates[$i+1][1]);
  $Angle2 = $this->getAngle($X1,$Y1,$X2,$Y2);
  $XOff = cos(($Angle2+180) * PI / 180) * $Force + $X2;
  $YOff = sin(($Angle2+180) * PI / 180) * $Force + $Y2;
 
  $Xv2 = cos(($Angle1+180) * PI / 180) * $Force + $XOff;
  $Yv2 = sin(($Angle1+180) * PI / 180) * $Force + $YOff;
  }
 
  $Path = $this->drawBezier($X1,$Y1,$X2,$Y2,$Xv1,$Yv1,$Xv2,$Yv2,$Format);
  if ($PathOnly) { $Result[] = $Path; }
 
  $XLast = $X1; $YLast = $Y1;
  }
 
  return($Result);
  }
 
  /* Draw a bezier curve with two controls points */
  function drawBezier($X1,$Y1,$X2,$Y2,$Xv1,$Yv1,$Xv2,$Yv2,$Format="")
  {
  $R = isset($Format["R"]) ? $Format["R"] : 0;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
  $ShowC = isset($Format["ShowControl"]) ? $Format["ShowControl"] : FALSE;
  $Segments = isset($Format["Segments"]) ? $Format["Segments"] : NULL;
  $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL;
  $NoDraw = isset($Format["NoDraw"]) ? $Format["NoDraw"] : FALSE;
  $PathOnly = isset($Format["PathOnly"]) ? $Format["PathOnly"] : FALSE;
  $Weight = isset($Format["Weight"]) ? $Format["Weight"] : NULL;
  $DrawArrow = isset($Format["DrawArrow"]) ? $Format["DrawArrow"] : FALSE;
  $ArrowSize = isset($Format["ArrowSize"]) ? $Format["ArrowSize"] : 10;
  $ArrowRatio = isset($Format["ArrowRatio"]) ? $Format["ArrowRatio"] : .5;
  $ArrowTwoHeads = isset($Format["ArrowTwoHeads"]) ? $Format["ArrowTwoHeads"] : FALSE;
 
  if ( $Segments == NULL )
  {
  $Length = $this->getLength($X1,$Y1,$X2,$Y2);
  $Precision = ($Length*125)/1000;
  }
  else
  $Precision = $Segments;
 
  $P[0]["X"] = $X1; $P[0]["Y"] = $Y1;
  $P[1]["X"] = $Xv1; $P[1]["Y"] = $Yv1;
  $P[2]["X"] = $Xv2; $P[2]["Y"] = $Yv2;
  $P[3]["X"] = $X2; $P[3]["Y"] = $Y2;
 
  /* Compute the bezier points */
  $Q = ""; $ID = 0; $Path = "";
  for($i=0;$i<=$Precision;$i=$i+1)
  {
  $u = $i / $Precision;
 
  $C = "";
  $C[0] = (1 - $u) * (1 - $u) * (1 - $u);
  $C[1] = ($u * 3) * (1 - $u) * (1 - $u);
  $C[2] = 3 * $u * $u * (1 - $u);
  $C[3] = $u * $u * $u;
 
  for($j=0;$j<=3;$j++)
  {
  if ( !isset($Q[$ID]) ) { $Q[$ID] = ""; }
  if ( !isset($Q[$ID]["X"]) ) { $Q[$ID]["X"] = 0; }
  if ( !isset($Q[$ID]["Y"]) ) { $Q[$ID]["Y"] = 0; }
 
  $Q[$ID]["X"] = $Q[$ID]["X"] + $P[$j]["X"] * $C[$j];
  $Q[$ID]["Y"] = $Q[$ID]["Y"] + $P[$j]["Y"] * $C[$j];
  }
  $ID++;
  }
  $Q[$ID]["X"] = $X2; $Q[$ID]["Y"] = $Y2;
 
  if ( !$NoDraw )
  {
  /* Display the control points */
  if ( $ShowC && !$PathOnly )
  {
  $Xv1 = floor($Xv1); $Yv1 = floor($Yv1); $Xv2 = floor($Xv2); $Yv2 = floor($Yv2);
 
  $this->drawLine($X1,$Y1,$X2,$Y2,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>30));
 
  $MyMarkerSettings = array("R"=>255,"G"=>0,"B"=>0,"BorderR"=>255,"BorderB"=>255,"BorderG"=>255,"Size"=>4);
  $this->drawRectangleMarker($Xv1,$Yv1,$MyMarkerSettings);
  $this->drawText($Xv1+4,$Yv1,"v1");
  $MyMarkerSettings = array("R"=>0,"G"=>0,"B"=>255,"BorderR"=>255,"BorderB"=>255,"BorderG"=>255,"Size"=>4);
  $this->drawRectangleMarker($Xv2,$Yv2,$MyMarkerSettings);
  $this->drawText($Xv2+4,$Yv2,"v2");
  }
 
  /* Draw the bezier */
  $LastX = NULL; $LastY = NULL; $Cpt = NULL; $Mode = NULL; $ArrowS = NULL;
  foreach ($Q as $Key => $Point)
  {
  $X = $Point["X"]; $Y = $Point["Y"];
 
  /* Get the first segment */
  if ( $ArrowS == NULL && $LastX != NULL && $LastY != NULL )
  { $ArrowS["X2"] = $LastX; $ArrowS["Y2"] = $LastY; $ArrowS["X1"] = $X; $ArrowS["Y1"] = $Y; }
 
  if ( $LastX != NULL && $LastY != NULL && !$PathOnly)
  list($Cpt,$Mode) = $this->drawLine($LastX,$LastY,$X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Cpt"=>$Cpt,"Mode"=>$Mode,"Weight"=>$Weight));
 
  /* Get the last segment */
  $ArrowE["X1"] = $LastX; $ArrowE["Y1"] = $LastY; $ArrowE["X2"] = $X; $ArrowE["Y2"] = $Y;
 
  $LastX = $X; $LastY = $Y;
  }
 
  if ( $DrawArrow && !$PathOnly )
  {
  $ArrowSettings = array("FillR"=>$R,"FillG"=>$G,"FillB"=>$B,"Alpha"=>$Alpha,"Size"=>$ArrowSize,"Ratio"=>$ArrowRatio);
  if ( $ArrowTwoHeads )
  $this->drawArrow($ArrowS["X1"],$ArrowS["Y1"],$ArrowS["X2"],$ArrowS["Y2"],$ArrowSettings);
 
  $this->drawArrow($ArrowE["X1"],$ArrowE["Y1"],$ArrowE["X2"],$ArrowE["Y2"],$ArrowSettings);
  }
  }
  return($Q);
  }
 
  /* Draw a line between two points */
  function drawLine($X1,$Y1,$X2,$Y2,$Format="")
  {
  $R = isset($Format["R"]) ? $Format["R"] : 0;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
  $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL;
  $Cpt = isset($Format["Cpt"]) ? $Format["Cpt"] : 1;
  $Mode = isset($Format["Mode"]) ? $Format["Mode"] : 1;
  $Weight = isset($Format["Weight"]) ? $Format["Weight"] : NULL;
 
  if ( $this->Antialias == FALSE && $Ticks == NULL )
  {
  if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )
  {
  $ShadowColor = $this->allocateColor($this->Picture,$this->ShadowR,$this->ShadowG,$this->ShadowB,$this->Shadowa);
  imageline($this->Picture,$X1+$this->ShadowX,$Y1+$this->ShadowY,$X2+$this->ShadowX,$Y2+$this->ShadowY,$ShadowColor);
  }
 
  $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha);
  imageline($this->Picture,$X1,$Y1,$X2,$Y2,$Color);
  return(0);
  }
 
  $Distance = sqrt(($X2-$X1)*($X2-$X1)+($Y2-$Y1)*($Y2-$Y1));
  if ( $Distance == 0 ) { return(-1); }
 
  /* Derivative algorithm for overweighted lines, re-route to polygons primitives */
  if ( $Weight != NULL )
  {
  $Angle = $this->getAngle($X1,$Y1,$X2,$Y2);
  $PolySettings = array ("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderAlpha"=>$Alpha);
 
  if ( $Ticks == NULL )
  {
  $Points = "";
  $Points[] = cos(deg2rad($Angle-90)) * $Weight + $X1; $Points[] = sin(deg2rad($Angle-90)) * $Weight + $Y1;
  $Points[] = cos(deg2rad($Angle+90)) * $Weight + $X1; $Points[] = sin(deg2rad($Angle+90)) * $Weight + $Y1;
  $Points[] = cos(deg2rad($Angle+90)) * $Weight + $X2; $Points[] = sin(deg2rad($Angle+90)) * $Weight + $Y2;
  $Points[] = cos(deg2rad($Angle-90)) * $Weight + $X2; $Points[] = sin(deg2rad($Angle-90)) * $Weight + $Y2;
 
  $this->drawPolygon($Points,$PolySettings);
  }
  else
  {
  for($i=0;$i<=$Distance;$i=$i+$Ticks*2)
  {
  $Xa = (($X2-$X1)/$Distance) * $i + $X1; $Ya = (($Y2-$Y1)/$Distance) * $i + $Y1;
  $Xb = (($X2-$X1)/$Distance) * ($i+$Ticks) + $X1; $Yb = (($Y2-$Y1)/$Distance) * ($i+$Ticks) + $Y1;
 
  $Points = "";
  $Points[] = cos(deg2rad($Angle-90)) * $Weight + $Xa; $Points[] = sin(deg2rad($Angle-90)) * $Weight + $Ya;
  $Points[] = cos(deg2rad($Angle+90)) * $Weight + $Xa; $Points[] = sin(deg2rad($Angle+90)) * $Weight + $Ya;
  $Points[] = cos(deg2rad($Angle+90)) * $Weight + $Xb; $Points[] = sin(deg2rad($Angle+90)) * $Weight + $Yb;
  $Points[] = cos(deg2rad($Angle-90)) * $Weight + $Xb; $Points[] = sin(deg2rad($Angle-90)) * $Weight + $Yb;
 
  $this->drawPolygon($Points,$PolySettings);
  }
  }
 
  return(1);
  }
 
  $XStep = ($X2-$X1) / $Distance;
  $YStep = ($Y2-$Y1) / $Distance;
 
  for($i=0;$i<=$Distance;$i++)
  {
  $X = $i * $XStep + $X1;
  $Y = $i * $YStep + $Y1;
 
  if ( $Ticks != NULL )
  {
  if ( $Cpt % $Ticks == 0 )
  { $Cpt = 0; if ( $Mode == 1 ) { $Mode = 0; } else { $Mode = 1; } }
 
  if ( $Mode == 1 )
  $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha));
 
  $Cpt++;
  }
  else
  $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha));
  }
  return(array($Cpt,$Mode));
  }
 
  /* Draw a circle */
  function drawCircle($Xc,$Yc,$Height,$Width,$Format="")
  {
  $R = isset($Format["R"]) ? $Format["R"] : 0;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
  $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL;
 
  $Height = abs($Height);
  $Width = abs($Width);
 
  if ( $Height == 0 ) { $Height = 1; }
  if ( $Width == 0 ) { $Width = 1; }
  $Xc = floor($Xc); $Yc = floor($Yc);
 
  $RestoreShadow = $this->Shadow;
  if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )
  {
  $this->Shadow = FALSE;
  $this->drawCircle($Xc+$this->ShadowX,$Yc+$this->ShadowY,$Height,$Width,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa,"Ticks"=>$Ticks));
  }
 
  if ( $Width == 0 ) { $Width = $Height; }
  if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; }
  if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; }
  if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; }
 
  $Step = 360 / (2 * PI * max($Width,$Height));
  $Mode = 1; $Cpt = 1;
  for($i=0;$i<=360;$i=$i+$Step)
  {
  $X = cos($i*PI/180) * $Height + $Xc;
  $Y = sin($i*PI/180) * $Width + $Yc;
 
  if ( $Ticks != NULL )
  {
  if ( $Cpt % $Ticks == 0 )
  { $Cpt = 0; if ( $Mode == 1 ) { $Mode = 0; } else { $Mode = 1; } }
 
  if ( $Mode == 1 )
  $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha));
 
  $Cpt++;
  }
  else
  $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha));
 
  }
  $this->Shadow = $RestoreShadow;
  }
 
  /* Draw a filled circle */
  function drawFilledCircle($X,$Y,$Radius,$Format="")
  {
  $R = isset($Format["R"]) ? $Format["R"] : 0;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : -1;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : -1;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : -1;
  $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : $Alpha;
  $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL;
  $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;
 
  if ( $Radius == 0 ) { $Radius = 1; }
  if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; }
  $X = floor($X); $Y = floor($Y);
 
  $Radius = abs($Radius);
 
  $RestoreShadow = $this->Shadow;
  if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )
  {
  $this->Shadow = FALSE;
  $this->drawFilledCircle($X+$this->ShadowX,$Y+$this->ShadowY,$Radius,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa,"Ticks"=>$Ticks));
  }
 
  $this->Mask = "";
  $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha);
  for ($i=0; $i<=$Radius*2; $i++)
  {
  $Slice = sqrt($Radius * $Radius - ($Radius - $i) * ($Radius - $i));
  $XPos = floor($Slice);
  $YPos = $Y + $i - $Radius;
  $AAlias = $Slice - floor($Slice);
 
  $this->Mask[$X-$XPos][$YPos] = TRUE;
  $this->Mask[$X+$XPos][$YPos] = TRUE;
  imageline($this->Picture,$X-$XPos,$YPos,$X+$XPos,$YPos,$Color);
  }
  if ( $this->Antialias )
  $this->drawCircle($X,$Y,$Radius,$Radius,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));
 
  $this->Mask = "";
 
  if ( $BorderR != -1 )
  $this->drawCircle($X,$Y,$Radius,$Radius,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$Ticks));
 
  $this->Shadow = $RestoreShadow;
  }
 
  /* Write text */
  function drawText($X,$Y,$Text,$Format="")
  {
  $R = isset($Format["R"]) ? $Format["R"] : $this->FontColorR;
  $G = isset($Format["G"]) ? $Format["G"] : $this->FontColorG;
  $B = isset($Format["B"]) ? $Format["B"] : $this->FontColorB;
  $Angle = isset($Format["Angle"]) ? $Format["Angle"] : 0;
  $Align = isset($Format["Align"]) ? $Format["Align"] : TEXT_ALIGN_BOTTOMLEFT;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : $this->FontColorA;
  $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->FontName;
  $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->FontSize;
  $ShowOrigine = isset($Format["ShowOrigine"]) ? $Format["ShowOrigine"] : FALSE;
  $TOffset = isset($Format["TOffset"]) ? $Format["TOffset"] : 2;
  $DrawBox = isset($Format["DrawBox"]) ? $Format["DrawBox"] : FALSE;
  $DrawBoxBorder = isset($Format["DrawBoxBorder"]) ? $Format["DrawBoxBorder"] : TRUE;
  $BorderOffset = isset($Format["BorderOffset"]) ? $Format["BorderOffset"] : 6;
  $BoxRounded = isset($Format["BoxRounded"]) ? $Format["BoxRounded"] : FALSE;
  $RoundedRadius = isset($Format["RoundedRadius"]) ? $Format["RoundedRadius"] : 6;
  $BoxR = isset($Format["BoxR"]) ? $Format["BoxR"] : 255;
  $BoxG = isset($Format["BoxG"]) ? $Format["BoxG"] : 255;
  $BoxB = isset($Format["BoxB"]) ? $Format["BoxB"] : 255;
  $BoxAlpha = isset($Format["BoxAlpha"]) ? $Format["BoxAlpha"] : 50;
  $BoxSurrounding = isset($Format["BoxSurrounding"]) ? $Format["BoxSurrounding"] : "";
  $BoxBorderR = isset($Format["BoxR"]) ? $Format["BoxR"] : 0;
  $BoxBorderG = isset($Format["BoxG"]) ? $Format["BoxG"] : 0;
  $BoxBorderB = isset($Format["BoxB"]) ? $Format["BoxB"] : 0;
  $BoxBorderAlpha = isset($Format["BoxAlpha"]) ? $Format["BoxAlpha"] : 50;
  $NoShadow = isset($Format["NoShadow"]) ? $Format["NoShadow"] : FALSE;
 
  $Shadow = $this->Shadow;
  if ( $NoShadow ) { $this->Shadow = FALSE; }
 
  if ( $BoxSurrounding != "" ) { $BoxBorderR = $BoxR - $BoxSurrounding; $BoxBorderG = $BoxG - $BoxSurrounding; $BoxBorderB = $BoxB - $BoxSurrounding; $BoxBorderAlpha = $Boxalpha; }
 
  if ( $ShowOrigine )
  {
  $MyMarkerSettings = array("R"=>255,"G"=>0,"B"=>0,"BorderR"=>255,"BorderB"=>255,"BorderG"=>255,"Size"=>4);
  $this->drawRectangleMarker($X,$Y,$MyMarkerSettings);
  }
 
  $TxtPos = $this->getTextBox($X,$Y,$FontName,$FontSize,$Angle,$Text);
 
  if ( $DrawBox && ($Angle == 0 || $Angle == 90 || $Angle == 180 || $Angle == 270))
  {
  $T[0]["X"]=0;$T[0]["Y"]=0;$T[1]["X"]=0;$T[1]["Y"]=0;$T[2]["X"]=0;$T[2]["Y"]=0;$T[3]["X"]=0;$T[3]["Y"]=0;
  if ( $Angle == 0 ) { $T[0]["X"]=-$TOffset;$T[0]["Y"]=$TOffset;$T[1]["X"]=$TOffset;$T[1]["Y"]=$TOffset;$T[2]["X"]=$TOffset;$T[2]["Y"]=-$TOffset;$T[3]["X"]=-$TOffset;$T[3]["Y"]=-$TOffset; }
 
  $X1 = min($TxtPos[0]["X"],$TxtPos[1]["X"],$TxtPos[2]["X"],$TxtPos[3]["X"]) - $BorderOffset + 3;
  $Y1 = min($TxtPos[0]["Y"],$TxtPos[1]["Y"],$TxtPos[2]["Y"],$TxtPos[3]["Y"]) - $BorderOffset;
  $X2 = max($TxtPos[0]["X"],$TxtPos[1]["X"],$TxtPos[2]["X"],$TxtPos[3]["X"]) + $BorderOffset + 3;
  $Y2 = max($TxtPos[0]["Y"],$TxtPos[1]["Y"],$TxtPos[2]["Y"],$TxtPos[3]["Y"]) + $BorderOffset - 3;
 
  $X1 = $X1 - $TxtPos[$Align]["X"] + $X + $T[0]["X"];
  $Y1 = $Y1 - $TxtPos[$Align]["Y"] + $Y + $T[0]["Y"];
  $X2 = $X2 - $TxtPos[$Align]["X"] + $X + $T[0]["X"];
  $Y2 = $Y2 - $TxtPos[$Align]["Y"] + $Y + $T[0]["Y"];
 
  $Settings = array("R"=>$BoxR,"G"=>$BoxG,"B"=>$BoxB,"Alpha"=>$BoxAlpha,"BorderR"=>$BoxBorderR,"BorderG"=>$BoxBorderG,"BorderB"=>$BoxBorderB,"BorderAlpha"=>$BoxBorderAlpha);
 
  if ( $BoxRounded )
  { $this->drawRoundedFilledRectangle($X1,$Y1,$X2,$Y2,$RoundedRadius,$Settings); }
  else
  { $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,$Settings); }
  }
 
  $X = $X - $TxtPos[$Align]["X"] + $X;
  $Y = $Y - $TxtPos[$Align]["Y"] + $Y;
 
  if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )
  {
  $C_ShadowColor = $this->allocateColor($this->Picture,$this->ShadowR,$this->ShadowG,$this->ShadowB,$this->Shadowa);
  imagettftext($this->Picture,$FontSize,$Angle,$X+$this->ShadowX,$Y+$this->ShadowY,$C_ShadowColor,$FontName,$Text);
  }
 
  $C_TextColor = $this->AllocateColor($this->Picture,$R,$G,$B,$Alpha);
  imagettftext($this->Picture,$FontSize,$Angle,$X,$Y,$C_TextColor,$FontName,$Text);
 
  $this->Shadow = $Shadow;
 
  return($TxtPos);
  }
 
  /* Draw a gradient within a defined area */
  function drawGradientArea($X1,$Y1,$X2,$Y2,$Direction,$Format="")
  {
  $StartR = isset($Format["StartR"]) ? $Format["StartR"] : 90;
  $StartG = isset($Format["StartG"]) ? $Format["StartG"] : 90;
  $StartB = isset($Format["StartB"]) ? $Format["StartB"] : 90;
  $EndR = isset($Format["EndR"]) ? $Format["EndR"] : 0;
  $EndG = isset($Format["EndG"]) ? $Format["EndG"] : 0;
  $EndB = isset($Format["EndB"]) ? $Format["EndB"] : 0;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
  $Levels = isset($Format["Levels"]) ? $Format["Levels"] : NULL;
 
  $Shadow = $this->Shadow;
  $this->Shadow = FALSE;
 
  if ( $StartR == $EndR && $StartG == $EndG && $StartB == $EndB )
  {
  $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,array("R"=>$StartR,"G"=>$StartG,"B"=>$StartB,"Alpha"=>$Alpha));
  return(0);
  }
 
  if ( $Levels != NULL )
  { $EndR=$StartR+$Levels; $EndG=$StartG+$Levels; $EndB=$StartB+$Levels; }
 
  if ($X1 > $X2) { list($X1, $X2) = array($X2, $X1); }
  if ($Y1 > $Y2) { list($Y1, $Y2) = array($Y2, $Y1); }
 
  if ( $Direction == DIRECTION_VERTICAL ) { $Width = abs($Y2-$Y1); }
  if ( $Direction == DIRECTION_HORIZONTAL ) { $Width = abs($X2-$X1); }
 
  $Step = max(abs($EndR-$StartR),abs($EndG-$StartG),abs($EndB-$StartB));
  $StepSize = $Width/$Step;
  $RStep = ($EndR-$StartR)/$Step;
  $GStep = ($EndG-$StartG)/$Step;
  $BStep = ($EndB-$StartB)/$Step;
 
  $R=$StartR;$G=$StartG;$B=$StartB;
  switch($Direction)
  {
  case DIRECTION_VERTICAL:
  $StartY = $Y1; $EndY = floor($Y2)+1; $LastY2 = $StartY;
  for($i=0;$i<=$Step;$i++)
  {
  $Y2 = floor($StartY + ($i * $StepSize));
 
  if ($Y2 > $EndY) { $Y2 = $EndY; }
  if (($Y1 != $Y2 && $Y1 < $Y2) || $Y2 == $EndY)
  {
  $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha);
  $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,$Color);
  $LastY2 = max($LastY2,$Y2);
  $Y1 = $Y2+1;
  }
  $R = $R + $RStep; $G = $G + $GStep; $B = $B + $BStep;
  }
  if ( $LastY2 < $EndY && isset($Color)) { for ($i=$LastY2+1;$i<=$EndY;$i++) { $this->drawLine($X1,$i,$X2,$i,$Color); } }
  break;
 
  case DIRECTION_HORIZONTAL:
  $StartX = $X1; $EndX = $X2;
  for($i=0;$i<=$Step;$i++)
  {
  $X2 = floor($StartX + ($i * $StepSize));
 
  if ($X2 > $EndX) { $X2 = $EndX; }
  if (($X1 != $X2 && $X1 < $X2) || $X2 == $EndX)
  {
  $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha);
  $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,$Color);
  $X1 = $X2+1;
  }
  $R = $R + $RStep; $G = $G + $GStep; $B = $B + $BStep;
  }
  if ( $X2 < $EndX && isset($Color)) { $this->drawFilledRectangle($X2,$Y1,$EndX,$Y2,$Color); }
  break;
  }
 
  $this->Shadow = $Shadow;
 
  }
 
  /* Draw an aliased pixel */
  function drawAntialiasPixel($X,$Y,$Format="")
  {
  $R = isset($Format["R"]) ? $Format["R"] : 0;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
 
  if ( $X < 0 || $Y < 0 || $X >= $this->XSize || $Y >= $this->YSize )
  return(-1);
 
  if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; }
  if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; }
  if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; }
 
  if ( !$this->Antialias )
  {
  if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )
  {
  $ShadowColor = $this->allocateColor($this->Picture,$this->ShadowR,$this->ShadowG,$this->ShadowB,$this->Shadowa);
  imagesetpixel($this->Picture,$X+$this->ShadowX,$Y+$this->ShadowY,$ShadowColor);
  }
 
  $PlotColor = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha);
  imagesetpixel($this->Picture,$X,$Y,$PlotColor);
 
  return(0);
  }
 
  $Plot = "";
  $Xi = floor($X);
  $Yi = floor($Y);
 
  if ( $Xi == $X && $Yi == $Y)
  {
  if ( $Alpha == 100 )
  $this->drawAlphaPixel($X,$Y,100,$R,$G,$B);
  else
  $this->drawAlphaPixel($X,$Y,$Alpha,$R,$G,$B);
  }
  else
  {
  $Alpha1 = (((1 - ($X - floor($X))) * (1 - ($Y - floor($Y))) * 100) / 100) * $Alpha;
  if ( $Alpha1 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi,$Yi,$Alpha1,$R,$G,$B); }
 
  $Alpha2 = ((($X - floor($X)) * (1 - ($Y - floor($Y))) * 100) / 100) * $Alpha;
  if ( $Alpha2 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi+1,$Yi,$Alpha2,$R,$G,$B); }
 
  $Alpha3 = (((1 - ($X - floor($X))) * ($Y - floor($Y)) * 100) / 100) * $Alpha;
  if ( $Alpha3 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi,$Yi+1,$Alpha3,$R,$G,$B); }
 
  $Alpha4 = ((($X - floor($X)) * ($Y - floor($Y)) * 100) / 100) * $Alpha;
  if ( $Alpha4 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi+1,$Yi+1,$Alpha4,$R,$G,$B); }
  }
  }
 
  /* Draw a semi-transparent pixel */
  function drawAlphaPixel($X,$Y,$Alpha,$R,$G,$B)
  {
  if ( isset($this->Mask[$X])) { if ( isset($this->Mask[$X][$Y]) ) { return(0); } }
 
  if ( $X < 0 || $Y < 0 || $X >= $this->XSize || $Y >= $this->YSize )
  return(-1);
 
  if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; }
  if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; }
  if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; }
 
  if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )
  {
  $AlphaFactor = floor(($Alpha / 100) * $this->Shadowa);
  $ShadowColor = $this->allocateColor($this->Picture,$this->ShadowR,$this->ShadowG,$this->ShadowB,$AlphaFactor);
  imagesetpixel($this->Picture,$X+$this->ShadowX,$Y+$this->ShadowY,$ShadowColor);
  }
 
  $C_Aliased = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha);
  imagesetpixel($this->Picture,$X,$Y,$C_Aliased);
  }
 
  /* Convert apha to base 10 */
  function convertAlpha($AlphaValue)
  { return((127/100)*(100-$AlphaValue)); }
 
  /* Allocate a color with transparency */
  function allocateColor($Picture,$R,$G,$B,$Alpha=100)
  {
  if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; }
  if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; }
  if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; }
  if ( $Alpha < 0 ) { $Alpha = 0; }
  if ( $Alpha > 100) { $Alpha = 100; }
 
  $Alpha = $this->convertAlpha($Alpha);
  return(imagecolorallocatealpha($Picture,$R,$G,$B,$Alpha));
  }
 
  /* Load a PNG file and draw it over the chart */
  function drawFromPNG($X,$Y,$FileName)
  { $this->drawFromPicture(1,$FileName,$X,$Y); }
 
  /* Load a GIF file and draw it over the chart */
  function drawFromGIF($X,$Y,$FileName)
  { $this->drawFromPicture(2,$FileName,$X,$Y); }
 
  /* Load a JPEG file and draw it over the chart */
  function drawFromJPG($X,$Y,$FileName)
  { $this->drawFromPicture(3,$FileName,$X,$Y); }
 
  function getPicInfo($FileName)
  {
  $Infos = getimagesize($FileName);
  $Width = $Infos[0];
  $Height = $Infos[1];
  $Type = $Infos["mime"];
 
  if ( $Type == "image/png") { $Type = 1; }
  if ( $Type == "image/gif") { $Type = 2; }
  if ( $Type == "image/jpeg ") { $Type = 3; }
 
  return(array($Width,$Height,$Type));
  }
 
  /* Generic loader function for external pictures */
  function drawFromPicture($PicType,$FileName,$X,$Y)
  {
  if ( file_exists($FileName))
  {
  list($Width,$Height) = $this->getPicInfo($FileName);
 
  if ( $PicType == 1 )
  { $Raster = imagecreatefrompng($FileName); }
  elseif ( $PicType == 2 )
  { $Raster = imagecreatefromgif($FileName); }
  elseif ( $PicType == 3 )
  { $Raster = imagecreatefromjpeg($FileName); }
  else
  { return(0); }
 
 
  $RestoreShadow = $this->Shadow;
  if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )
  {
  $this->Shadow = FALSE;
  if ( $PicType == 3 )
  $this->drawFilledRectangle($X+$this->ShadowX,$Y+$this->ShadowY,$X+$Width+$this->ShadowX,$Y+$Height+$this->ShadowY,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa));
  else
  {
  $TranparentID = imagecolortransparent($Raster);
  for ($Xc=0;$Xc<=$Width-1;$Xc++)
  {
  for ($Yc=0;$Yc<=$Height-1;$Yc++)
  {
  $RGBa = imagecolorat($Raster,$Xc,$Yc);
  $Values = imagecolorsforindex($Raster,$RGBa);
  if ( $Values["alpha"] < 120 )
  {
  $AlphaFactor = floor(($this->Shadowa / 100) * ((100 / 127) * (127-$Values["alpha"])));
  $this->drawAlphaPixel($X+$Xc+$this->ShadowX,$Y+$Yc+$this->ShadowY,$AlphaFactor,$this->ShadowR,$this->ShadowG,$this->ShadowB);
  }
  }
  }
  }
  }
  $this->Shadow = $RestoreShadow;
 
  imagecopy($this->Picture,$Raster,$X,$Y,0,0,$Width,$Height);
  imagedestroy($Raster);
  }
  }
 
  /* Draw an arrow */
  function drawArrow($X1,$Y1,$X2,$Y2,$Format="")
  {
  $FillR = isset($Format["FillR"]) ? $Format["FillR"] : 0;
  $FillG = isset($Format["FillG"]) ? $Format["FillG"] : 0;
  $FillB = isset($Format["FillB"]) ? $Format["FillB"] : 0;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : $FillR;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : $FillG;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : $FillB;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
  $Size = isset($Format["Size"]) ? $Format["Size"] : 10;
  $Ratio = isset($Format["Ratio"]) ? $Format["Ratio"] : .5;
  $TwoHeads = isset($Format["TwoHeads"]) ? $Format["TwoHeads"] : FALSE;
  $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : FALSE;
 
  /* Calculate the line angle */
  $Angle = $this->getAngle($X1,$Y1,$X2,$Y2);
 
  /* Override Shadow support, this will be managed internally */
  $RestoreShadow = $this->Shadow;
  if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 )
  {
  $this->Shadow = FALSE;
  $this->drawArrow($X1+$this->ShadowX,$Y1+$this->ShadowY,$X2+$this->ShadowX,$Y2+$this->ShadowY,array("FillR"=>$this->ShadowR,"FillG"=>$this->ShadowG,"FillB"=>$this->ShadowB,"Alpha"=>$this->Shadowa,"Size"=>$Size,"Ratio"=>$Ratio,"TwoHeads"=>$TwoHeads,"Ticks"=>$Ticks));
  }
 
  /* Draw the 1st Head */
  $TailX = cos(($Angle-180)*PI/180)*$Size+$X2;
  $TailY = sin(($Angle-180)*PI/180)*$Size+$Y2;
 
  $Points = "";
  $Points[] = $X2; $Points[] = $Y2;
  $Points[] = cos(($Angle-90)*PI/180)*$Size*$Ratio+$TailX; $Points[] = sin(($Angle-90)*PI/180)*$Size*$Ratio+$TailY;
  $Points[] = cos(($Angle-270)*PI/180)*$Size*$Ratio+$TailX; $Points[] = sin(($Angle-270)*PI/180)*$Size*$Ratio+$TailY;
  $Points[] = $X2; $Points[] = $Y2;
 
  /* Visual correction */
  if ($Angle == 180 || $Angle == 360 ) { $Points[4] = $Points[2]; }
  if ($Angle == 90 || $Angle == 270 ) { $Points[5] = $Points[3]; }
 
  $ArrowColor = $this->allocateColor($this->Picture,$FillR,$FillG,$FillB,$Alpha);
  ImageFilledPolygon($this->Picture,$Points,4,$ArrowColor);
 
  $this->drawLine($Points[0],$Points[1],$Points[2],$Points[3],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha));
  $this->drawLine($Points[2],$Points[3],$Points[4],$Points[5],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha));
  $this->drawLine($Points[0],$Points[1],$Points[4],$Points[5],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha));
 
  /* Draw the second head */
  if ( $TwoHeads )
  {
  $Angle = $this->getAngle($X2,$Y2,$X1,$Y1);
 
  $TailX2 = cos(($Angle-180)*PI/180)*$Size+$X1;
  $TailY2 = sin(($Angle-180)*PI/180)*$Size+$Y1;
 
  $Points = "";
  $Points[] = $X1; $Points[] = $Y1;
  $Points[] = cos(($Angle-90)*PI/180)*$Size*$Ratio+$TailX2; $Points[] = sin(($Angle-90)*PI/180)*$Size*$Ratio+$TailY2;
  $Points[] = cos(($Angle-270)*PI/180)*$Size*$Ratio+$TailX2; $Points[] = sin(($Angle-270)*PI/180)*$Size*$Ratio+$TailY2;
  $Points[] = $X1; $Points[] = $Y1;
 
  /* Visual correction */
  if ($Angle == 180 || $Angle == 360 ) { $Points[4] = $Points[2]; }
  if ($Angle == 90 || $Angle == 270 ) { $Points[5] = $Points[3]; }
 
  $ArrowColor = $this->allocateColor($this->Picture,$FillR,$FillG,$FillB,$Alpha);
  ImageFilledPolygon($this->Picture,$Points,4,$ArrowColor);
 
  $this->drawLine($Points[0],$Points[1],$Points[2],$Points[3],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha));
  $this->drawLine($Points[2],$Points[3],$Points[4],$Points[5],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha));
  $this->drawLine($Points[0],$Points[1],$Points[4],$Points[5],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha));
 
  $this->drawLine($TailX,$TailY,$TailX2,$TailY2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Ticks"=>$Ticks));
  }
  else
  $this->drawLine($X1,$Y1,$TailX,$TailY,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Ticks"=>$Ticks));
 
  /* Re-enable shadows */
  $this->Shadow = $RestoreShadow;
  }
 
  /* Draw a label with associated arrow */
  function drawArrowLabel($X1,$Y1,$Text,$Format="")
  {
  $FillR = isset($Format["FillR"]) ? $Format["FillR"] : 0;
  $FillG = isset($Format["FillG"]) ? $Format["FillG"] : 0;
  $FillB = isset($Format["FillB"]) ? $Format["FillB"] : 0;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : $FillR;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : $FillG;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : $FillB;
  $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->FontName;
  $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->FontSize;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
  $Length = isset($Format["Length"]) ? $Format["Length"] : 50;
  $Angle = isset($Format["Angle"]) ? $Format["Angle"] : 315;
  $Size = isset($Format["Size"]) ? $Format["Size"] : 10;
  $Position = isset($Format["Position"]) ? $Format["Position"] : POSITION_TOP;
  $RoundPos = isset($Format["RoundPos"]) ? $Format["RoundPos"] : FALSE;
  $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL;
 
  $Angle = $Angle % 360;
 
  $X2 = sin(($Angle+180)*PI/180)*$Length+$X1;
  $Y2 = cos(($Angle+180)*PI/180)*$Length+$Y1;
 
  if ( $RoundPos && $Angle > 0 && $Angle < 180 ) { $Y2 = ceil($Y2); }
  if ( $RoundPos && $Angle > 180 ) { $Y2 = floor($Y2); }
 
  $this->drawArrow($X2,$Y2,$X1,$Y1,$Format);
 
  $Size = imagettfbbox($FontSize,0,$FontName,$Text);
  $TxtWidth = max(abs($Size[2]-$Size[0]),abs($Size[0]-$Size[6]));
  $TxtHeight = max(abs($Size[1]-$Size[7]),abs($Size[3]-$Size[1]));
 
  if ( $Angle > 0 && $Angle < 180 )
  {
  $this->drawLine($X2,$Y2,$X2-$TxtWidth,$Y2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Ticks"=>$Ticks));
  if ( $Position == POSITION_TOP )
  $this->drawText($X2,$Y2-2,$Text,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Align"=>TEXT_ALIGN_BOTTOMRIGHT));
  else
  $this->drawText($X2,$Y2+4,$Text,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Align"=>TEXT_ALIGN_TOPRIGHT));
  }
  else
  {
  $this->drawLine($X2,$Y2,$X2+$TxtWidth,$Y2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Ticks"=>$Ticks));
  if ( $Position == POSITION_TOP )
  $this->drawText($X2,$Y2-2,$Text,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha));
  else
  $this->drawText($X2,$Y2+4,$Text,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Align"=>TEXT_ALIGN_TOPLEFT));
  }
  }
 
  /* Draw a progress bar filled with specified % */
  function drawProgress($X,$Y,$Percent,$Format="")
  {
  if ( $Percent > 100 ) { $Percent = 100; }
  if ( $Percent < 0 ) { $Percent = 0; }
 
  $Width = isset($Format["Width"]) ? $Format["Width"] : 200;
  $Height = isset($Format["Height"]) ? $Format["Height"] : 20;
  $Orientation = isset($Format["Orientation"]) ? $Format["Orientation"] : ORIENTATION_HORIZONTAL;
  $ShowLabel = isset($Format["ShowLabel"]) ? $Format["ShowLabel"] : FALSE;
  $LabelPos = isset($Format["LabelPos"]) ? $Format["LabelPos"] : LABEL_POS_INSIDE;
  $Margin = isset($Format["Margin"]) ? $Format["Margin"] : 10;
  $R = isset($Format["R"]) ? $Format["R"] : 130;
  $G = isset($Format["G"]) ? $Format["G"] : 130;
  $B = isset($Format["B"]) ? $Format["B"] : 130;
  $RFade = isset($Format["RFade"]) ? $Format["RFade"] : -1;
  $GFade = isset($Format["GFade"]) ? $Format["GFade"] : -1;
  $BFade = isset($Format["BFade"]) ? $Format["BFade"] : -1;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : $R;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : $G;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : $B;
  $BoxBorderR = isset($Format["BoxBorderR"]) ? $Format["BoxBorderR"] : 0;
  $BoxBorderG = isset($Format["BoxBorderG"]) ? $Format["BoxBorderG"] : 0;
  $BoxBorderB = isset($Format["BoxBorderB"]) ? $Format["BoxBorderB"] : 0;
  $BoxBackR = isset($Format["BoxBackR"]) ? $Format["BoxBackR"] : 255;
  $BoxBackG = isset($Format["BoxBackG"]) ? $Format["BoxBackG"] : 255;
  $BoxBackB = isset($Format["BoxBackB"]) ? $Format["BoxBackB"] : 255;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
  $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;
  $BoxSurrounding = isset($Format["BoxSurrounding"]) ? $Format["BoxSurrounding"] : NULL;
  $NoAngle = isset($Format["NoAngle"]) ? $Format["NoAngle"] : FALSE;
 
  if ( $RFade != -1 && $GFade != -1 && $BFade != -1 )
  {
  $RFade = (($RFade-$R)/100)*$Percent+$R;
  $GFade = (($GFade-$G)/100)*$Percent+$G;
  $BFade = (($BFade-$B)/100)*$Percent+$B;
  }
 
  if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; }
  if ( $BoxSurrounding != NULL ) { $BoxBorderR = $BoxBackR + $Surrounding; $BoxBorderG = $BoxBackG + $Surrounding; $BoxBorderB = $BoxBackB + $Surrounding; }
 
  if ( $Orientation == ORIENTATION_VERTICAL )
  {
  $InnerHeight = (($Height-2)/100)*$Percent;
  $this->drawFilledRectangle($X,$Y,$X+$Width,$Y-$Height,array("R"=>$BoxBackR,"G"=>$BoxBackG,"B"=>$BoxBackB,"BorderR"=>$BoxBorderR,"BorderG"=>$BoxBorderG,"BorderB"=>$BoxBorderB,"NoAngle"=>$NoAngle));
 
  $RestoreShadow = $this->Shadow; $this->Shadow = FALSE;
  if ( $RFade != -1 && $GFade != -1 && $BFade != -1 )
  {
  $GradientOptions = array("StartR"=>$RFade,"StartG"=>$GFade,"StartB"=>$BFade,"EndR"=>$R,"EndG"=>$G,"EndB"=>$B);
  $this->drawGradientArea($X+1,$Y-1,$X+$Width-1,$Y-$InnerHeight,DIRECTION_VERTICAL,$GradientOptions);
 
  if ( $Surrounding )
  $this->drawRectangle($X+1,$Y-1,$X+$Width-1,$Y-$InnerHeight,array("R"=>255,"G"=>255,"B"=>255,"Alpha"=>$Surrounding));
  }
  else
  $this->drawFilledRectangle($X+1,$Y-1,$X+$Width-1,$Y-$InnerHeight,array("R"=>$R,"G"=>$G,"B"=>$B,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB));
 
  $this->Shadow = $RestoreShadow;
 
  if ( $ShowLabel && $LabelPos == LABEL_POS_BOTTOM ) { $this->drawText($X+($Width/2),$Y+$Margin,$Percent."%",array("Align"=>TEXT_ALIGN_TOPMIDDLE)); }
  if ( $ShowLabel && $LabelPos == LABEL_POS_TOP ) { $this->drawText($X+($Width/2),$Y-$Height-$Margin,$Percent."%",array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); }
  if ( $ShowLabel && $LabelPos == LABEL_POS_INSIDE ) { $this->drawText($X+($Width/2),$Y-$InnerHeight-$Margin,$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLELEFT,"Angle"=>90)); }
  if ( $ShowLabel && $LabelPos == LABEL_POS_CENTER ) { $this->drawText($X+($Width/2),$Y-($Height/2),$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"Angle"=>90)); }
  }
  else
  {
  if ( $Percent == 100 )
  $InnerWidth = $Width-1;
  else
  $InnerWidth = (($Width-2)/100)*$Percent;
 
  $this->drawFilledRectangle($X,$Y,$X+$Width,$Y+$Height,array("R"=>$BoxBackR,"G"=>$BoxBackG,"B"=>$BoxBackB,"BorderR"=>$BoxBorderR,"BorderG"=>$BoxBorderG,"BorderB"=>$BoxBorderB,"NoAngle"=>$NoAngle));
 
  $RestoreShadow = $this->Shadow; $this->Shadow = FALSE;
  if ( $RFade != -1 && $GFade != -1 && $BFade != -1 )
  {
  $GradientOptions = array("StartR"=>$R,"StartG"=>$G,"StartB"=>$B,"EndR"=>$RFade,"EndG"=>$GFade,"EndB"=>$BFade);
  $this->drawGradientArea($X+1,$Y+1,$X+$InnerWidth,$Y+$Height-1,DIRECTION_HORIZONTAL,$GradientOptions);
 
  if ( $Surrounding )
  $this->drawRectangle($X+1,$Y+1,$X+$InnerWidth,$Y+$Height-1,array("R"=>255,"G"=>255,"B"=>255,"Alpha"=>$Surrounding));
  }
  else
  $this->drawFilledRectangle($X+1,$Y+1,$X+$InnerWidth,$Y+$Height-1,array("R"=>$R,"G"=>$G,"B"=>$B,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB));
 
  $this->Shadow = $RestoreShadow;
 
  if ( $ShowLabel && $LabelPos == LABEL_POS_LEFT ) { $this->drawText($X-$Margin,$Y+($Height/2),$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLERIGHT)); }
  if ( $ShowLabel && $LabelPos == LABEL_POS_RIGHT ) { $this->drawText($X+$Width+$Margin,$Y+($Height/2),$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLELEFT)); }
  if ( $ShowLabel && $LabelPos == LABEL_POS_CENTER ) { $this->drawText($X+($Width/2),$Y+($Height/2),$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE)); }
  if ( $ShowLabel && $LabelPos == LABEL_POS_INSIDE ) { $this->drawText($X+$InnerWidth+$Margin,$Y+($Height/2),$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLELEFT)); }
  }
  }
 
  /* Get the legend box size */
  function getLegendSize($Format="")
  {
  $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->FontName;
  $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->FontSize;
  $BoxSize = isset($Format["BoxSize"]) ? $Format["BoxSize"] : 5;
  $Margin = isset($Format["Margin"]) ? $Format["Margin"] : 5;
  $Style = isset($Format["Style"]) ? $Format["Style"] : LEGEND_ROUND;
  $Mode = isset($Format["Mode"]) ? $Format["Mode"] : LEGEND_VERTICAL;
  $BoxWidth = isset($Format["BoxWidth"]) ? $Format["BoxWidth"] : 5;
  $BoxHeight = isset($Format["BoxHeight"]) ? $Format["BoxHeight"] : 5;
  $IconAreaWidth = isset($Format["IconAreaWidth"]) ? $Format["IconAreaWidth"] : $BoxWidth;
  $IconAreaHeight = isset($Format["IconAreaHeight"]) ? $Format["IconAreaHeight"] : $BoxHeight;
  $XSpacing = isset($Format["XSpacing"]) ? $Format["XSpacing"] : 5;
 
  $Data = $this->DataSet->getData();
 
  foreach($Data["Series"] as $SerieName => $Serie)
  {
  if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] && isset($Serie["Picture"]))
  {
  list($PicWidth,$PicHeight) = $this->getPicInfo($Serie["Picture"]);
  if ( $IconAreaWidth < $PicWidth ) { $IconAreaWidth = $PicWidth; }
  if ( $IconAreaHeight < $PicHeight ) { $IconAreaHeight = $PicHeight; }
  }
  }
 
  $YStep = max($this->FontSize,$IconAreaHeight) + 5;
  $XStep = $IconAreaWidth + 5;
  $XStep = $XSpacing;
 
  $X=100; $Y=100;
 
  $Boundaries = ""; $Boundaries["L"] = $X; $Boundaries["T"] = $Y; $Boundaries["R"] = 0; $Boundaries["B"] = 0; $vY = $Y; $vX = $X;
  foreach($Data["Series"] as $SerieName => $Serie)
  {
  if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )
  {
  if ( $Mode == LEGEND_VERTICAL )
  {
  $BoxArray = $this->getTextBox($vX+$IconAreaWidth+4,$vY+$IconAreaHeight/2,$FontName,$FontSize,0,$Serie["Description"]);
 
  if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; }
  if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; }
  if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; }
 
  $Lines = preg_split("/\n/",$Serie["Description"]);
  $vY = $vY + max($this->FontSize*count($Lines),$IconAreaHeight) + 5;
  }
  elseif ( $Mode == LEGEND_HORIZONTAL )
  {
  $Lines = preg_split("/\n/",$Serie["Description"]);
  $Width = "";
  foreach($Lines as $Key => $Value)
  {
  $BoxArray = $this->getTextBox($vX+$IconAreaWidth+6,$Y+$IconAreaHeight/2+(($this->FontSize+3)*$Key),$FontName,$FontSize,0,$Value);
 
  if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; }
  if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; }
  if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; }
 
  $Width[] = $BoxArray[1]["X"];
  }
 
  $vX=max($Width)+$XStep;
  }
  }
  }
  $vY=$vY-$YStep; $vX=$vX-$XStep;
 
  $TopOffset = $Y - $Boundaries["T"];
  if ( $Boundaries["B"]-($vY+$IconAreaHeight) < $TopOffset ) { $Boundaries["B"] = $vY+$IconAreaHeight+$TopOffset; }
 
  $Width = ($Boundaries["R"]+$Margin) - ($Boundaries["L"]-$Margin);
  $Height = ($Boundaries["B"]+$Margin) - ($Boundaries["T"]-$Margin);
 
  return(array("Width"=>$Width,"Height"=>$Height));
  }
 
  /* Draw the legend of the active series */
  function drawLegend($X,$Y,$Format="")
  {
  $Family = isset($Format["Family"]) ? $Format["Family"] : LEGEND_FAMILY_BOX;
  $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->FontName;
  $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->FontSize;
  $FontR = isset($Format["FontR"]) ? $Format["FontR"] : $this->FontColorR;
  $FontG = isset($Format["FontG"]) ? $Format["FontG"] : $this->FontColorG;
  $FontB = isset($Format["FontB"]) ? $Format["FontB"] : $this->FontColorB;
  $BoxWidth = isset($Format["BoxWidth"]) ? $Format["BoxWidth"] : 5;
  $BoxHeight = isset($Format["BoxHeight"]) ? $Format["BoxHeight"] : 5;
  $IconAreaWidth = isset($Format["IconAreaWidth"]) ? $Format["IconAreaWidth"] : $BoxWidth;
  $IconAreaHeight = isset($Format["IconAreaHeight"]) ? $Format["IconAreaHeight"] : $BoxHeight;
  $XSpacing = isset($Format["XSpacing"]) ? $Format["XSpacing"] : 5;
  $Margin = isset($Format["Margin"]) ? $Format["Margin"] : 5;
  $R = isset($Format["R"]) ? $Format["R"] : 200;
  $G = isset($Format["G"]) ? $Format["G"] : 200;
  $B = isset($Format["B"]) ? $Format["B"] : 200;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 255;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 255;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 255;
  $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;
  $Style = isset($Format["Style"]) ? $Format["Style"] : LEGEND_ROUND;
  $Mode = isset($Format["Mode"]) ? $Format["Mode"] : LEGEND_VERTICAL;
 
  if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; }
 
  $Data = $this->DataSet->getData();
 
  foreach($Data["Series"] as $SerieName => $Serie)
  {
  if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] && isset($Serie["Picture"]))
  {
  list($PicWidth,$PicHeight) = $this->getPicInfo($Serie["Picture"]);
  if ( $IconAreaWidth < $PicWidth ) { $IconAreaWidth = $PicWidth; }
  if ( $IconAreaHeight < $PicHeight ) { $IconAreaHeight = $PicHeight; }
  }
  }
 
 
  $YStep = max($this->FontSize,$IconAreaHeight) + 5;
  $XStep = $IconAreaWidth + 5;
  $XStep = $XSpacing;
 
  $Boundaries = ""; $Boundaries["L"] = $X; $Boundaries["T"] = $Y; $Boundaries["R"] = 0; $Boundaries["B"] = 0; $vY = $Y; $vX = $X;
  foreach($Data["Series"] as $SerieName => $Serie)
  {
  if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )
  {
  if ( $Mode == LEGEND_VERTICAL )
  {
  $BoxArray = $this->getTextBox($vX+$IconAreaWidth+4,$vY+$IconAreaHeight/2,$FontName,$FontSize,0,$Serie["Description"]);
 
  if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; }
  if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; }
  if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; }
 
  $Lines = preg_split("/\n/",$Serie["Description"]);
  $vY = $vY + max($this->FontSize*count($Lines),$IconAreaHeight) + 5;
  }
  elseif ( $Mode == LEGEND_HORIZONTAL )
  {
  $Lines = preg_split("/\n/",$Serie["Description"]);
  $Width = "";
  foreach($Lines as $Key => $Value)
  {
  $BoxArray = $this->getTextBox($vX+$IconAreaWidth+6,$Y+$IconAreaHeight/2+(($this->FontSize+3)*$Key),$FontName,$FontSize,0,$Value);
 
  if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; }
  if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; }
  if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; }
 
  $Width[] = $BoxArray[1]["X"];
  }
 
  $vX=max($Width)+$XStep;
  }
  }
  }
  $vY=$vY-$YStep; $vX=$vX-$XStep;
 
  $TopOffset = $Y - $Boundaries["T"];
  if ( $Boundaries["B"]-($vY+$IconAreaHeight) < $TopOffset ) { $Boundaries["B"] = $vY+$IconAreaHeight+$TopOffset; }
 
  if ( $Style == LEGEND_ROUND )
  $this->drawRoundedFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB));
  elseif ( $Style == LEGEND_BOX )
  $this->drawFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB));
 
  $RestoreShadow = $this->Shadow; $this->Shadow = FALSE;
  foreach($Data["Series"] as $SerieName => $Serie)
  {
  if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )
  {
  $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"];
  $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"];
 
  if ( isset($Serie["Picture"]) )
  {
  $Picture = $Serie["Picture"];
  list($PicWidth,$PicHeight) = $this->getPicInfo($Picture);
  $PicX = $X+$IconAreaWidth/2; $PicY = $Y+$IconAreaHeight/2;
 
  $this->drawFromPNG($PicX-$PicWidth/2,$PicY-$PicHeight/2,$Picture);
  }
  else
  {
  if ( $Family == LEGEND_FAMILY_BOX )
  {
  if ( $BoxWidth != $IconAreaWidth ) { $XOffset = floor(($IconAreaWidth-$BoxWidth)/2); } else { $XOffset = 0; }
  if ( $BoxHeight != $IconAreaHeight ) { $YOffset = floor(($IconAreaHeight-$BoxHeight)/2); } else { $YOffset = 0; }
 
  $this->drawFilledRectangle($X+1+$XOffset,$Y+1+$YOffset,$X+$BoxWidth+$XOffset+1,$Y+$BoxHeight+1+$YOffset,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
  $this->drawFilledRectangle($X+$XOffset,$Y+$YOffset,$X+$BoxWidth+$XOffset,$Y+$BoxHeight+$YOffset,array("R"=>$R,"G"=>$G,"B"=>$B,"Surrounding"=>20));
  }
  elseif ( $Family == LEGEND_FAMILY_CIRCLE )
  {
  $this->drawFilledCircle($X+1+$IconAreaWidth/2,$Y+1+$IconAreaHeight/2,min($IconAreaHeight/2,$IconAreaWidth/2),array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
  $this->drawFilledCircle($X+$IconAreaWidth/2,$Y+$IconAreaHeight/2,min($IconAreaHeight/2,$IconAreaWidth/2),array("R"=>$R,"G"=>$G,"B"=>$B,"Surrounding"=>20));
  }
  elseif ( $Family == LEGEND_FAMILY_LINE )
  {
  $this->drawLine($X+1,$Y+1+$IconAreaHeight/2,$X+1+$IconAreaWidth,$Y+1+$IconAreaHeight/2,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20,"Ticks"=>$Ticks,"Weight"=>$Weight));
  $this->drawLine($X,$Y+$IconAreaHeight/2,$X+$IconAreaWidth,$Y+$IconAreaHeight/2,array("R"=>$R,"G"=>$G,"B"=>$B,"Ticks"=>$Ticks,"Weight"=>$Weight));
  }
  }
 
  if ( $Mode == LEGEND_VERTICAL )
  {
  $Lines = preg_split("/\n/",$Serie["Description"]);
  foreach($Lines as $Key => $Value)
  $this->drawText($X+$IconAreaWidth+4,$Y+$IconAreaHeight/2+(($this->FontSize+3)*$Key),$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT));
 
  $Y=$Y+max($this->FontSize*count($Lines),$IconAreaHeight) + 5;
  }
  elseif ( $Mode == LEGEND_HORIZONTAL )
  {
  $Lines = preg_split("/\n/",$Serie["Description"]);
  $Width = "";
  foreach($Lines as $Key => $Value)
  {
  $BoxArray = $this->drawText($X+$IconAreaWidth+4,$Y+$IconAreaHeight/2+(($this->FontSize+3)*$Key),$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT));
  $Width[] = $BoxArray[1]["X"];
  }
  $X=max($Width)+2+$XStep;
  }
  }
  }
 
 
  $this->Shadow = $RestoreShadow;
  }
 
  function drawScale($Format="")
  {
  $Pos = isset($Format["Pos"]) ? $Format["Pos"] : SCALE_POS_LEFTRIGHT;
  $Floating = isset($Format["Floating"]) ? $Format["Floating"] : FALSE;
  $Mode = isset($Format["Mode"]) ? $Format["Mode"] : SCALE_MODE_FLOATING;
  $MinDivHeight = isset($Format["MinDivHeight"]) ? $Format["MinDivHeight"] : 20;
  $Factors = isset($Format["Factors"]) ? $Format["Factors"] : array(1,2,5);
  $ManualScale = isset($Format["ManualScale"]) ? $Format["ManualScale"] : array("0"=>array("Min"=>-100,"Max"=>100));
  $XMargin = isset($Format["XMargin"]) ? $Format["XMargin"] : AUTO;
  $YMargin = isset($Format["YMargin"]) ? $Format["YMargin"] : 0;
  $ScaleSpacing = isset($Format["ScaleSpacing"]) ? $Format["ScaleSpacing"] : 15;
  $InnerTickWidth = isset($Format["InnerTickWidth"]) ? $Format["InnerTickWidth"] : 2;
  $OuterTickWidth = isset($Format["OuterTickWidth"]) ? $Format["OuterTickWidth"] : 2;
  $DrawXLines = isset($Format["DrawXLines"]) ? $Format["DrawXLines"] : TRUE;
  $DrawYLines = isset($Format["DrawYLines"]) ? $Format["DrawYLines"] : ALL;
  $GridTicks = isset($Format["GridTicks"]) ? $Format["GridTicks"] : 4;
  $GridR = isset($Format["GridR"]) ? $Format["GridR"] : 255;
  $GridG = isset($Format["GridG"]) ? $Format["GridG"] : 255;
  $GridB = isset($Format["GridB"]) ? $Format["GridB"] : 255;
  $GridAlpha = isset($Format["GridAlpha"]) ? $Format["GridAlpha"] : 40;
  $AxisRo = isset($Format["AxisR"]) ? $Format["AxisR"] : 0;
  $AxisGo = isset($Format["AxisG"]) ? $Format["AxisG"] : 0;
  $AxisBo = isset($Format["AxisB"]) ? $Format["AxisB"] : 0;
  $AxisAlpha = isset($Format["AxisAlpha"]) ? $Format["AxisAlpha"] : 100;
  $TickRo = isset($Format["TickR"]) ? $Format["TickR"] : 0;
  $TickGo = isset($Format["TickG"]) ? $Format["TickG"] : 0;
  $TickBo = isset($Format["TickB"]) ? $Format["TickB"] : 0;
  $TickAlpha = isset($Format["TickAlpha"]) ? $Format["TickAlpha"] : 100;
  $DrawSubTicks = isset($Format["DrawSubTicks"]) ? $Format["DrawSubTicks"] : FALSE;
  $InnerSubTickWidth = isset($Format["InnerSubTickWidth"]) ? $Format["InnerSubTickWidth"] : 0;
  $OuterSubTickWidth = isset($Format["OuterSubTickWidth"]) ? $Format["OuterSubTickWidth"] : 2;
  $SubTickR = isset($Format["SubTickR"]) ? $Format["SubTickR"] : 255;
  $SubTickG = isset($Format["SubTickG"]) ? $Format["SubTickG"] : 0;
  $SubTickB = isset($Format["SubTickB"]) ? $Format["SubTickB"] : 0;
  $SubTickAlpha = isset($Format["SubTickAlpha"]) ? $Format["SubTickAlpha"] : 100;
  $AutoAxisLabels = isset($Format["AutoAxisLabels"]) ? $Format["AutoAxisLabels"] : TRUE;
  $XReleasePercent = isset($Format["XReleasePercent"]) ? $Format["XReleasePercent"] : 1;
  $DrawArrows = isset($Format["DrawArrows"]) ? $Format["DrawArrows"] : FALSE;
  $ArrowSize = isset($Format["ArrowSize"]) ? $Format["ArrowSize"] : 8;
  $CycleBackground = isset($Format["CycleBackground"]) ? $Format["CycleBackground"] : FALSE;
  $BackgroundR1 = isset($Format["BackgroundR1"]) ? $Format["BackgroundR1"] : 255;
  $BackgroundG1 = isset($Format["BackgroundG1"]) ? $Format["BackgroundG1"] : 255;
  $BackgroundB1 = isset($Format["BackgroundB1"]) ? $Format["BackgroundB1"] : 255;
  $BackgroundAlpha1 = isset($Format["BackgroundAlpha1"]) ? $Format["BackgroundAlpha1"] : 20;
  $BackgroundR2 = isset($Format["BackgroundR2"]) ? $Format["BackgroundR2"] : 230;
  $BackgroundG2 = isset($Format["BackgroundG2"]) ? $Format["BackgroundG2"] : 230;
  $BackgroundB2 = isset($Format["BackgroundB2"]) ? $Format["BackgroundB2"] : 230;
  $BackgroundAlpha2 = isset($Format["BackgroundAlpha2"]) ? $Format["BackgroundAlpha2"] : 20;
  $LabelingMethod = isset($Format["LabelingMethod"]) ? $Format["LabelingMethod"] : LABELING_ALL;
  $LabelSkip = isset($Format["LabelSkip"]) ? $Format["LabelSkip"] : 1;
  $LabelRotation = isset($Format["LabelRotation"]) ? $Format["LabelRotation"] : 0;
  $SkippedAxisTicks = isset($Format["SkippedAxisTicks"]) ? $Format["SkippedAxisTicks"] : $GridTicks+2;
  $SkippedAxisR = isset($Format["SkippedAxisR"]) ? $Format["SkippedAxisR"] : $GridR;
  $SkippedAxisG = isset($Format["SkippedAxisG"]) ? $Format["SkippedAxisG"] : $GridG;
  $SkippedAxisB = isset($Format["SkippedAxisB"]) ? $Format["SkippedAxisB"] : $GridB;
  $SkippedAxisAlpha = isset($Format["SkippedAxisAlpha"]) ? $Format["SkippedAxisAlpha"] : $GridAlpha-30;
  $SkippedTickR = isset($Format["SkippedTickR"]) ? $Format["SkippedTickR"] : $TickRo;
  $SkippedTickG = isset($Format["SkippedTickG"]) ? $Format["SkippedTickG"] : $TickGo;
  $SkippedTickB = isset($Format["SkippedTicksB"]) ? $Format["SkippedTickB"] : $TickBo;
  $SkippedTickAlpha = isset($Format["SkippedTickAlpha"]) ? $Format["SkippedTickAlpha"] : $TickAlpha-80;
  $SkippedInnerTickWidth = isset($Format["SkippedInnerTickWidth"]) ? $Format["SkippedInnerTickWidth"] : 0;
  $SkippedOuterTickWidth = isset($Format["SkippedOuterTickWidth"]) ? $Format["SkippedOuterTickWidth"] : 2;
 
  /* Floating scale require X & Y margins to be set manually */
  if ( $Floating && ( $XMargin == AUTO || $YMargin == 0 ) ) { $Floating = FALSE; }
 
  /* Skip a NOTICE event in case of an empty array */
  if ( $DrawYLines == NONE || $DrawYLines == FALSE ) { $DrawYLines = array("zarma"=>"31"); }
 
  /* Define the color for the skipped elements */
  $SkippedAxisColor = array("R"=>$SkippedAxisR,"G"=>$SkippedAxisG,"B"=>$SkippedAxisB,"Alpha"=>$SkippedAxisAlpha,"Ticks"=>$SkippedAxisTicks);
  $SkippedTickColor = array("R"=>$SkippedTickR,"G"=>$SkippedTickG,"B"=>$SkippedTickB,"Alpha"=>$SkippedTickAlpha);
 
  $Data = $this->DataSet->getData();
  if ( isset($Data["Abscissa"]) ) { $Abscissa = $Data["Abscissa"]; } else { $Abscissa = NULL; }
 
  /* Unset the abscissa axis, needed if we display multiple charts on the same picture */
  if ( $Abscissa != NULL )
  {
  foreach($Data["Axis"] as $AxisID => $Parameters)
  { if ($Parameters["Identity"] == AXIS_X) { unset($Data["Axis"][$AxisID]); } }
  }
 
  /* Build the scale settings */
  $GotXAxis = FALSE;
  foreach($Data["Axis"] as $AxisID => $AxisParameter)
  {
  if ( $AxisParameter["Identity"] == AXIS_X ) { $GotXAxis = TRUE; }
 
  if ( $Pos == SCALE_POS_LEFTRIGHT && $AxisParameter["Identity"] == AXIS_Y)
  { $Height = $this->GraphAreaY2-$this->GraphAreaY1 - $YMargin*2; }
  elseif ( $Pos == SCALE_POS_LEFTRIGHT && $AxisParameter["Identity"] == AXIS_X)
  { $Height = $this->GraphAreaX2-$this->GraphAreaX1; }
  elseif ( $Pos == SCALE_POS_TOPBOTTOM && $AxisParameter["Identity"] == AXIS_Y)
  { $Height = $this->GraphAreaX2-$this->GraphAreaX1 - $YMargin*2;; }
  else
  { $Height = $this->GraphAreaY2-$this->GraphAreaY1; }
 
  $AxisMin = ABSOLUTE_MAX; $AxisMax = OUT_OF_SIGHT;
  if ( $Mode == SCALE_MODE_FLOATING || $Mode == SCALE_MODE_START0 )
  {
  foreach($Data["Series"] as $SerieID => $SerieParameter)
  {
  if ( $SerieParameter["Axis"] == $AxisID && $Data["Series"][$SerieID]["isDrawable"] && $Data["Abscissa"] != $SerieID)
  {
  $AxisMax = max($AxisMax,$Data["Series"][$SerieID]["Max"]);
  $AxisMin = min($AxisMin,$Data["Series"][$SerieID]["Min"]);
  }
  }
  $AutoMargin = (($AxisMax-$AxisMin)/100)*$XReleasePercent;
 
  $Data["Axis"][$AxisID]["Min"] = $AxisMin-$AutoMargin; $Data["Axis"][$AxisID]["Max"] = $AxisMax+$AutoMargin;
  if ( $Mode == SCALE_MODE_START0 ) { $Data["Axis"][$AxisID]["Min"] = 0; }
  }
  elseif ( $Mode == SCALE_MODE_MANUAL )
  {
  if ( isset($ManualScale[$AxisID]["Min"]) && isset($ManualScale[$AxisID]["Max"]) )
  {
  $Data["Axis"][$AxisID]["Min"] = $ManualScale[$AxisID]["Min"];
  $Data["Axis"][$AxisID]["Max"] = $ManualScale[$AxisID]["Max"];
  }
  else
  { echo "Manual scale boundaries not set."; exit(); }
  }
  elseif ( $Mode == SCALE_MODE_ADDALL || $Mode == SCALE_MODE_ADDALL_START0 )
  {
  $Series = "";
  foreach($Data["Series"] as $SerieID => $SerieParameter)
  { if ( $SerieParameter["Axis"] == $AxisID && $SerieParameter["isDrawable"] && $Data["Abscissa"] != $SerieID ) { $Series[$SerieID] = count($Data["Series"][$SerieID]["Data"]); } }
 
  for ($ID=0;$ID<=max($Series)-1;$ID++)
  {
  $PointMin = 0; $PointMax = 0;
  foreach($Series as $SerieID => $ValuesCount )
  {
  if (isset($Data["Series"][$SerieID]["Data"][$ID]) && $Data["Series"][$SerieID]["Data"][$ID] != NULL )
  {
  $Value = $Data["Series"][$SerieID]["Data"][$ID];
  if ( $Value > 0 ) { $PointMax = $PointMax + $Value; } else { $PointMin = $PointMin + $Value; }
  }
  }
  $AxisMax = max($AxisMax,$PointMax);
  $AxisMin = min($AxisMin,$PointMin);
  }
  $AutoMargin = (($AxisMax-$AxisMin)/100)*$XReleasePercent;
  $Data["Axis"][$AxisID]["Min"] = $AxisMin-$AutoMargin; $Data["Axis"][$AxisID]["Max"] = $AxisMax+$AutoMargin;
  }
  $MaxDivs = floor($Height/$MinDivHeight);
 
  if ( $Mode == SCALE_MODE_ADDALL_START0 ) { $Data["Axis"][$AxisID]["Min"] = 0; }
 
  $Scale = $this->computeScale($Data["Axis"][$AxisID]["Min"],$Data["Axis"][$AxisID]["Max"],$MaxDivs,$Factors,$AxisID);
 
  $Data["Axis"][$AxisID]["Margin"] = $AxisParameter["Identity"] == AXIS_X ? $XMargin : $YMargin;
  $Data["Axis"][$AxisID]["ScaleMin"] = $Scale["XMin"];
  $Data["Axis"][$AxisID]["ScaleMax"] = $Scale["XMax"];
  $Data["Axis"][$AxisID]["Rows"] = $Scale["Rows"];
  $Data["Axis"][$AxisID]["RowHeight"] = $Scale["RowHeight"];
 
  if ( isset($Scale["Format"]) ) { $Data["Axis"][$AxisID]["Format"] = $Scale["Format"]; }
 
  if ( !isset($Data["Axis"][$AxisID]["Display"]) ) { $Data["Axis"][$AxisID]["Display"] = NULL; }
  if ( !isset($Data["Axis"][$AxisID]["Format"]) ) { $Data["Axis"][$AxisID]["Format"] = NULL; }
  if ( !isset($Data["Axis"][$AxisID]["Unit"]) ) { $Data["Axis"][$AxisID]["Unit"] = NULL; }
  }
 
  /* Still no X axis */
  if ( $GotXAxis == FALSE )
  {
  if ( $Abscissa != NULL )
  {
  $Points = count($Data["Series"][$Abscissa]["Data"]);
  if ( $AutoAxisLabels )
  $AxisName = isset($Data["Series"][$Abscissa]["Description"]) ? $Data["Series"][$Abscissa]["Description"] : NULL;
  else
  $AxisName = NULL;
  }
  else
  {
  $Points = 0;
  $AxisName = isset($Data["XAxisName"]) ? $Data["XAxisName"] : NULL;
  foreach($Data["Series"] as $SerieID => $SerieParameter)
  { if ( $SerieParameter["isDrawable"] ) { $Points = max($Points,count($SerieParameter["Data"])); } }
  }
 
  $AxisID = count($Data["Axis"]);
  $Data["Axis"][$AxisID]["Identity"] = AXIS_X;
  if ( $Pos == SCALE_POS_LEFTRIGHT ) { $Data["Axis"][$AxisID]["Position"] = AXIS_POSITION_BOTTOM; } else { $Data["Axis"][$AxisID]["Position"] = AXIS_POSITION_LEFT; }
  if ( $AxisName != NULL ) { $Data["Axis"][$AxisID]["Name"] = $AxisName; }
  if ( $XMargin == AUTO )
  {
  if ( $Pos == SCALE_POS_LEFTRIGHT )
  { $Height = $this->GraphAreaX2-$this->GraphAreaX1; }
  else
  { $Height = $this->GraphAreaY2-$this->GraphAreaY1; }
 
  if ( $Points == 1 )
  $Data["Axis"][$AxisID]["Margin"] = $Height / 2;
  else
  $Data["Axis"][$AxisID]["Margin"] = ($Height/$Points) / 2;
  }
  else
  { $Data["Axis"][$AxisID]["Margin"] = $XMargin; }
  $Data["Axis"][$AxisID]["Rows"] = $Points-1;
  if ( !isset($Data["Axis"][$AxisID]["Display"]) ) { $Data["Axis"][$AxisID]["Display"] = NULL; }
  if ( !isset($Data["Axis"][$AxisID]["Format"]) ) { $Data["Axis"][$AxisID]["Format"] = NULL; }
  if ( !isset($Data["Axis"][$AxisID]["Unit"]) ) { $Data["Axis"][$AxisID]["Unit"] = NULL; }
  }
 
  $this->DataSet->saveOrientation($Pos);
  $this->DataSet->saveAxisConfig($Data["Axis"]);
 
  $FontColorRo = $this->FontColorR; $FontColorGo = $this->FontColorG; $FontColorBo = $this->FontColorB;
 
  $AxisPos["L"] = $this->GraphAreaX1; $AxisPos["R"] = $this->GraphAreaX2; $AxisPos["T"] = $this->GraphAreaY1; $AxisPos["B"] = $this->GraphAreaY2;
  foreach($Data["Axis"] as $AxisID => $Parameters)
  {
  if ( isset($Parameters["Color"]) )
  {
  $AxisR = $Parameters["Color"]["R"]; $AxisG = $Parameters["Color"]["G"]; $AxisB = $Parameters["Color"]["B"];
  $TickR = $Parameters["Color"]["R"]; $TickG = $Parameters["Color"]["G"]; $TickB = $Parameters["Color"]["B"];
  $this->setFontProperties(array("R"=>$Parameters["Color"]["R"],"G"=>$Parameters["Color"]["G"],"B"=>$Parameters["Color"]["B"]));
  }
  else
  {
  $AxisR = $AxisRo; $AxisG = $AxisGo; $AxisB = $AxisBo;
  $TickR = $TickRo; $TickG = $TickGo; $TickB = $TickBo;
  $this->setFontProperties(array("R"=>$FontColorRo,"G"=>$FontColorGo,"B"=>$FontColorBo));
  }
 
  $LastValue = "w00t"; $ID = 1;
  if ( $Parameters["Identity"] == AXIS_X )
  {
  if ( $Pos == SCALE_POS_LEFTRIGHT )
  {
  if ( $Parameters["Position"] == AXIS_POSITION_BOTTOM )
  {
  if ( $LabelRotation == 0 ) { $LabelAlign = TEXT_ALIGN_TOPMIDDLE; $YLabelOffset = 2; }
  if ( $LabelRotation > 0 && $LabelRotation < 190 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $YLabelOffset = 5; }
  if ( $LabelRotation == 180 ) { $LabelAlign = TEXT_ALIGN_BOTTOMMIDDLE; $YLabelOffset = 5; }
  if ( $LabelRotation > 180 && $LabelRotation < 360 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $YLabelOffset = 2; }
 
  if ( $Floating )
  { $FloatingOffset = $YMargin; $this->drawLine($this->GraphAreaX1+$Parameters["Margin"],$AxisPos["B"],$this->GraphAreaX2-$Parameters["Margin"],$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
  else
  { $FloatingOffset = 0; $this->drawLine($this->GraphAreaX1,$AxisPos["B"],$this->GraphAreaX2,$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
 
  if ( $DrawArrows ) { $this->drawArrow($this->GraphAreaX2-$Parameters["Margin"],$AxisPos["B"],$this->GraphAreaX2+($ArrowSize*2),$AxisPos["B"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }
 
  $Width = ($this->GraphAreaX2 - $this->GraphAreaX1) - $Parameters["Margin"]*2;
 
  if ($Parameters["Rows"] == 0 ) { $Step = $Width; } else { $Step = $Width / ($Parameters["Rows"]); }
 
  $MaxBottom = $AxisPos["B"];
  for($i=0;$i<=$Parameters["Rows"];$i++)
  {
  $XPos = $this->GraphAreaX1 + $Parameters["Margin"] + $Step*$i;
  $YPos = $AxisPos["B"];
 
  if ( $Abscissa != NULL )
  { if ( isset($Data["Series"][$Abscissa]["Data"][$i]) ) { $Value = $this->scaleFormat($Data["Series"][$Abscissa]["Data"][$i],$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); } else { $Value = ""; } }
  else
  {
  if ( isset($Parameters["ScaleMin"]) && isset ($Parameters["RowHeight"]) )
  $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]);
  else
  $Value = $i;
  }
 
  $ID++; $Skipped = TRUE;
  if ( $this->isValidLabel($Value,$LastValue,$LabelingMethod,$ID,$LabelSkip) )
  {
  $Bounds = $this->drawText($XPos,$YPos+$OuterTickWidth+$YLabelOffset,$Value,array("Angle"=>$LabelRotation,"Align"=>$LabelAlign));
  $TxtBottom = $YPos+$OuterTickWidth+2+($Bounds[0]["Y"]-$Bounds[2]["Y"]);
  $MaxBottom = max($MaxBottom,$TxtBottom);
  $LastValue = $Value;
  $Skipped = FALSE;
  }
 
  if ( $Skipped )
  {
  if ( $DrawXLines ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,$SkippedAxisColor); }
  if ( $SkippedInnerTickWidth !=0 || $SkippedOuterTickWidth != 0 ) { $this->drawLine($XPos,$YPos-$SkippedInnerTickWidth,$XPos,$YPos+$SkippedOuterTickWidth,$SkippedTickColor); }
  }
  else
  {
  if ( $DrawXLines && ($XPos != $this->GraphAreaX1 && $XPos != $this->GraphAreaX2) ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }
  if ( $InnerTickWidth !=0 || $OuterTickWidth != 0 ) { $this->drawLine($XPos,$YPos-$InnerTickWidth,$XPos,$YPos+$OuterTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); }
  }
 
  }
  if ( isset($Parameters["Name"]) )
  {
  $YPos = $MaxBottom+2;
  $XPos = $this->GraphAreaX1+($this->GraphAreaX2-$this->GraphAreaX1)/2;
  $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_TOPMIDDLE));
  $MaxBottom = $Bounds[0]["Y"];
 
  $this->DataSet->Data["GraphArea"]["Y2"] = $MaxBottom + $this->FontSize;
  }
 
  $AxisPos["B"] = $MaxBottom + $ScaleSpacing;
  }
  elseif ( $Parameters["Position"] == AXIS_POSITION_TOP )
  {
  if ( $LabelRotation == 0 ) { $LabelAlign = TEXT_ALIGN_BOTTOMMIDDLE; $YLabelOffset = 2; }
  if ( $LabelRotation > 0 && $LabelRotation < 190 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $YLabelOffset = 2; }
  if ( $LabelRotation == 180 ) { $LabelAlign = TEXT_ALIGN_TOPMIDDLE; $YLabelOffset = 5; }
  if ( $LabelRotation > 180 && $LabelRotation < 360 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $YLabelOffset = 5; }
 
  if ( $Floating )
  { $FloatingOffset = $YMargin; $this->drawLine($this->GraphAreaX1+$Parameters["Margin"],$AxisPos["T"],$this->GraphAreaX2-$Parameters["Margin"],$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
  else
  { $FloatingOffset = 0; $this->drawLine($this->GraphAreaX1,$AxisPos["T"],$this->GraphAreaX2,$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
 
  if ( $DrawArrows ) { $this->drawArrow($this->GraphAreaX2-$Parameters["Margin"],$AxisPos["T"],$this->GraphAreaX2+($ArrowSize*2),$AxisPos["T"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }
 
  $Width = ($this->GraphAreaX2 - $this->GraphAreaX1) - $Parameters["Margin"]*2;
 
  if ($Parameters["Rows"] == 0 ) { $Step = $Width; } else { $Step = $Width / $Parameters["Rows"]; }
 
  $MinTop = $AxisPos["T"];
  for($i=0;$i<=$Parameters["Rows"];$i++)
  {
  $XPos = $this->GraphAreaX1 + $Parameters["Margin"] + $Step*$i;
  $YPos = $AxisPos["T"];
 
  if ( $Abscissa != NULL )
  { if ( isset($Data["Series"][$Abscissa]["Data"][$i]) ) { $Value = $this->scaleFormat($Data["Series"][$Abscissa]["Data"][$i],$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); } else { $Value = ""; } }
  else
  {
  if ( isset($Parameters["ScaleMin"]) && isset ($Parameters["RowHeight"]) )
  $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]);
  else
  $Value = $i;
  }
 
  $ID++; $Skipped = TRUE;
  if ( $this->isValidLabel($Value,$LastValue,$LabelingMethod,$ID,$LabelSkip) )
  {
  $Bounds = $this->drawText($XPos,$YPos-$OuterTickWidth-$YLabelOffset,$Value,array("Angle"=>$LabelRotation,"Align"=>$LabelAlign));
  $TxtBox = $YPos-$OuterTickWidth-2-($Bounds[0]["Y"]-$Bounds[2]["Y"]);
  $MinTop = min($MinTop,$TxtBox);
  $LastValue = $Value;
  $Skipped = FALSE;
  }
 
  if ( $Skipped )
  {
  if ( $DrawXLines ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,$SkippedAxisColor); }
  if ( $SkippedInnerTickWidth !=0 || $SkippedOuterTickWidth != 0 ) { $this->drawLine($XPos,$YPos+$SkippedInnerTickWidth,$XPos,$YPos-$SkippedOuterTickWidth,$SkippedTickColor); }
  }
  else
  {
  if ( $DrawXLines ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }
  if ( $InnerTickWidth !=0 || $OuterTickWidth != 0 ) { $this->drawLine($XPos,$YPos+$InnerTickWidth,$XPos,$YPos-$OuterTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); }
  }
 
  }
  if ( isset($Parameters["Name"]) )
  {
  $YPos = $MinTop-2;
  $XPos = $this->GraphAreaX1+($this->GraphAreaX2-$this->GraphAreaX1)/2;
  $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
  $MinTop = $Bounds[2]["Y"];
 
  $this->DataSet->Data["GraphArea"]["Y1"] = $MinTop;
  }
 
  $AxisPos["T"] = $MinTop - $ScaleSpacing;
  }
  }
  elseif ( $Pos == SCALE_POS_TOPBOTTOM )
  {
  if ( $Parameters["Position"] == AXIS_POSITION_LEFT )
  {
  if ( $LabelRotation == 0 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $XLabelOffset = -2; }
  if ( $LabelRotation > 0 && $LabelRotation < 190 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $XLabelOffset = -6; }
  if ( $LabelRotation == 180 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $XLabelOffset = -2; }
  if ( $LabelRotation > 180 && $LabelRotation < 360 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $XLabelOffset = -5; }
 
  if ( $Floating )
  { $FloatingOffset = $YMargin; $this->drawLine($AxisPos["L"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["L"],$this->GraphAreaY2-$Parameters["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
  else
  { $FloatingOffset = 0; $this->drawLine($AxisPos["L"],$this->GraphAreaY1,$AxisPos["L"],$this->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
 
  if ( $DrawArrows ) { $this->drawArrow($AxisPos["L"],$this->GraphAreaY2-$Parameters["Margin"],$AxisPos["L"],$this->GraphAreaY2+($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }
 
  $Height = ($this->GraphAreaY2 - $this->GraphAreaY1) - $Parameters["Margin"]*2;
 
  if ($Parameters["Rows"] == 0 ) { $Step = $Height; } else { $Step = $Height / $Parameters["Rows"]; }
 
  $MinLeft = $AxisPos["L"];
  for($i=0;$i<=$Parameters["Rows"];$i++)
  {
  $YPos = $this->GraphAreaY1 + $Parameters["Margin"] + $Step*$i;
  $XPos = $AxisPos["L"];
 
  if ( $Abscissa != NULL )
  { if ( isset($Data["Series"][$Abscissa]["Data"][$i]) ) { $Value = $this->scaleFormat($Data["Series"][$Abscissa]["Data"][$i],$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); } else { $Value = ""; } }
  else
  {
  if ( isset($Parameters["ScaleMin"]) && isset ($Parameters["RowHeight"]) )
  $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]);
  else
  $Value = $i;
  }
 
  $ID++; $Skipped = TRUE;
  if ( $this->isValidLabel($Value,$LastValue,$LabelingMethod,$ID,$LabelSkip) )
  {
  $Bounds = $this->drawText($XPos-$OuterTickWidth+$XLabelOffset,$YPos,$Value,array("Angle"=>$LabelRotation,"Align"=>$LabelAlign));
  $TxtBox = $XPos-$OuterTickWidth-2-($Bounds[1]["X"]-$Bounds[0]["X"]);
  $MinLeft = min($MinLeft,$TxtBox);
  $LastValue = $Value;
  $Skipped = FALSE;
  }
 
  if ( $Skipped )
  {
  if ( $DrawXLines ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,$SkippedAxisColor); }
  if ( $SkippedInnerTickWidth !=0 || $SkippedOuterTickWidth != 0 ) { $this->drawLine($XPos-$SkippedOuterTickWidth,$YPos,$XPos+$SkippedInnerTickWidth,$YPos,$SkippedTickColor); }
  }
  else
  {
  if ( $DrawXLines && ($YPos != $this->GraphAreaY1 && $YPos != $this->GraphAreaY2) ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }
  if ( $InnerTickWidth !=0 || $OuterTickWidth != 0 ) { $this->drawLine($XPos-$OuterTickWidth,$YPos,$XPos+$InnerTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); }
  }
 
  }
  if ( isset($Parameters["Name"]) )
  {
  $XPos = $MinLeft-2;
  $YPos = $this->GraphAreaY1+($this->GraphAreaY2-$this->GraphAreaY1)/2;
  $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>90));
  $MinLeft = $Bounds[0]["X"];
 
  $this->DataSet->Data["GraphArea"]["X1"] = $MinLeft;
  }
 
  $AxisPos["L"] = $MinLeft - $ScaleSpacing;
  }
  elseif ( $Parameters["Position"] == AXIS_POSITION_RIGHT )
  {
  if ( $LabelRotation == 0 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $XLabelOffset = 2; }
  if ( $LabelRotation > 0 && $LabelRotation < 190 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $XLabelOffset = 6; }
  if ( $LabelRotation == 180 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $XLabelOffset = 5; }
  if ( $LabelRotation > 180 && $LabelRotation < 360 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $XLabelOffset = 7; }
 
  if ( $Floating )
  { $FloatingOffset = $YMargin; $this->drawLine($AxisPos["R"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["R"],$this->GraphAreaY2-$Parameters["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
  else
  { $FloatingOffset = 0; $this->drawLine($AxisPos["R"],$this->GraphAreaY1,$AxisPos["R"],$this->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
 
  if ( $DrawArrows ) { $this->drawArrow($AxisPos["R"],$this->GraphAreaY2-$Parameters["Margin"],$AxisPos["R"],$this->GraphAreaY2+($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }
 
  $Height = ($this->GraphAreaY2 - $this->GraphAreaY1) - $Parameters["Margin"]*2;
 
  if ($Parameters["Rows"] == 0 ) { $Step = $Height; } else { $Step = $Height / $Parameters["Rows"]; }
 
  $MaxRight = $AxisPos["R"];
  for($i=0;$i<=$Parameters["Rows"];$i++)
  {
  $YPos = $this->GraphAreaY1 + $Parameters["Margin"] + $Step*$i;
  $XPos = $AxisPos["R"];
 
  if ( $Abscissa != NULL )
  { if ( isset($Data["Series"][$Abscissa]["Data"][$i]) ) { $Value = $this->scaleFormat($Data["Series"][$Abscissa]["Data"][$i],$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); } else { $Value = ""; } }
  else
  {
  if ( isset($Parameters["ScaleMin"]) && isset ($Parameters["RowHeight"]) )
  $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]);
  else
  $Value = $i;
  }
 
  $ID++; $Skipped = TRUE;
  if ( $this->isValidLabel($Value,$LastValue,$LabelingMethod,$ID,$LabelSkip) )
  {
  $Bounds = $this->drawText($XPos+$OuterTickWidth+$XLabelOffset,$YPos,$Value,array("Angle"=>$LabelRotation,"Align"=>$LabelAlign));
  $TxtBox = $XPos+$OuterTickWidth+2+($Bounds[1]["X"]-$Bounds[0]["X"]);
  $MaxRight = max($MaxRight,$TxtBox);
  $LastValue = $Value;
  $Skipped = FALSE;
  }
 
  if ( $Skipped )
  {
  if ( $DrawXLines ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,$SkippedAxisColor); }
  if ( $SkippedInnerTickWidth !=0 || $SkippedOuterTickWidth != 0 ) { $this->drawLine($XPos+$SkippedOuterTickWidth,$YPos,$XPos-$SkippedInnerTickWidth,$YPos,$SkippedTickColor); }
  }
  else
  {
  if ( $DrawXLines ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }
  if ( $InnerTickWidth !=0 || $OuterTickWidth != 0 ) { $this->drawLine($XPos+$OuterTickWidth,$YPos,$XPos-$InnerTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); }
  }
 
  }
  if ( isset($Parameters["Name"]) )
  {
  $XPos = $MaxRight+4;
  $YPos = $this->GraphAreaY1+($this->GraphAreaY2-$this->GraphAreaY1)/2;
  $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>270));
  $MaxRight = $Bounds[1]["X"];
 
  $this->DataSet->Data["GraphArea"]["X2"] = $MaxRight + $this->FontSize;
  }
 
  $AxisPos["R"] = $MaxRight + $ScaleSpacing;
  }
  }
  }
 
 
 
  if ( $Parameters["Identity"] == AXIS_Y )
  {
  if ( $Pos == SCALE_POS_LEFTRIGHT )
  {
  if ( $Parameters["Position"] == AXIS_POSITION_LEFT )
  {
 
  if ( $Floating )
  { $FloatingOffset = $XMargin; $this->drawLine($AxisPos["L"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["L"],$this->GraphAreaY2-$Parameters["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
  else
  { $FloatingOffset = 0; $this->drawLine($AxisPos["L"],$this->GraphAreaY1,$AxisPos["L"],$this->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
 
  if ( $DrawArrows ) { $this->drawArrow($AxisPos["L"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["L"],$this->GraphAreaY1-($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }
 
  $Height = ($this->GraphAreaY2 - $this->GraphAreaY1) - $Parameters["Margin"]*2;
  $Step = $Height / $Parameters["Rows"]; $SubTicksSize = $Step /2; $MinLeft = $AxisPos["L"];
  $LastY = NULL;
  for($i=0;$i<=$Parameters["Rows"];$i++)
  {
  $YPos = $this->GraphAreaY2 - $Parameters["Margin"] - $Step*$i;
  $XPos = $AxisPos["L"];
  $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Parameters["Display"],$Parameters["Format"],$Parameters["Unit"]);
 
  if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); }
  if ( $LastY != NULL && $CycleBackground && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->drawFilledRectangle($this->GraphAreaX1+$FloatingOffset,$LastY,$this->GraphAreaX2-$FloatingOffset,$YPos,$BGColor); }
 
  if ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }
 
  if ( $DrawSubTicks && $i != $Parameters["Rows"] )
  $this->drawLine($XPos-$OuterSubTickWidth,$YPos-$SubTicksSize,$XPos+$InnerSubTickWidth,$YPos-$SubTicksSize,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha));
 
  $this->drawLine($XPos-$OuterTickWidth,$YPos,$XPos+$InnerTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha));
  $Bounds = $this->drawText($XPos-$OuterTickWidth-2,$YPos,$Value,array("Align"=>TEXT_ALIGN_MIDDLERIGHT));
  $TxtLeft = $XPos-$OuterTickWidth-2-($Bounds[1]["X"]-$Bounds[0]["X"]);
  $MinLeft = min($MinLeft,$TxtLeft);
 
  $LastY = $YPos;
  }
 
  if ( isset($Parameters["Name"]) )
  {
  $XPos = $MinLeft-2;
  $YPos = $this->GraphAreaY1+($this->GraphAreaY2-$this->GraphAreaY1)/2;
  $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>90));
  $MinLeft = $Bounds[2]["X"];
 
  $this->DataSet->Data["GraphArea"]["X1"] = $MinLeft;
  }
 
  $AxisPos["L"] = $MinLeft - $ScaleSpacing;
  }
  elseif ( $Parameters["Position"] == AXIS_POSITION_RIGHT )
  {
  if ( $Floating )
  { $FloatingOffset = $XMargin; $this->drawLine($AxisPos["R"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["R"],$this->GraphAreaY2-$Parameters["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
  else
  { $FloatingOffset = 0; $this->drawLine($AxisPos["R"],$this->GraphAreaY1,$AxisPos["R"],$this->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
 
  if ( $DrawArrows ) { $this->drawArrow($AxisPos["R"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["R"],$this->GraphAreaY1-($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }
 
  $Height = ($this->GraphAreaY2 - $this->GraphAreaY1) - $Parameters["Margin"]*2;
  $Step = $Height / $Parameters["Rows"]; $SubTicksSize = $Step /2; $MaxLeft = $AxisPos["R"];
  $LastY = NULL;
  for($i=0;$i<=$Parameters["Rows"];$i++)
  {
  $YPos = $this->GraphAreaY2 - $Parameters["Margin"] - $Step*$i;
  $XPos = $AxisPos["R"];
  $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Parameters["Display"],$Parameters["Format"],$Parameters["Unit"]);
 
  if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); }
  if ( $LastY != NULL && $CycleBackground && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->drawFilledRectangle($this->GraphAreaX1+$FloatingOffset,$LastY,$this->GraphAreaX2-$FloatingOffset,$YPos,$BGColor); }
 
  if ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }
 
  if ( $DrawSubTicks && $i != $Parameters["Rows"] )
  $this->drawLine($XPos-$OuterSubTickWidth,$YPos-$SubTicksSize,$XPos+$InnerSubTickWidth,$YPos-$SubTicksSize,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha));
 
  $this->drawLine($XPos-$InnerTickWidth,$YPos,$XPos+$OuterTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha));
  $Bounds = $this->drawText($XPos+$OuterTickWidth+2,$YPos,$Value,array("Align"=>TEXT_ALIGN_MIDDLELEFT));
  $TxtLeft = $XPos+$OuterTickWidth+2+($Bounds[1]["X"]-$Bounds[0]["X"]);
  $MaxLeft = max($MaxLeft,$TxtLeft);
 
  $LastY = $YPos;
  }
 
  if ( isset($Parameters["Name"]) )
  {
  $XPos = $MaxLeft+6;
  $YPos = $this->GraphAreaY1+($this->GraphAreaY2-$this->GraphAreaY1)/2;
  $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>270));
  $MaxLeft = $Bounds[2]["X"];
 
  $this->DataSet->Data["GraphArea"]["X2"] = $MaxLeft + $this->FontSize;
  }
  $AxisPos["R"] = $MaxLeft + $ScaleSpacing;
  }
  }
  elseif ( $Pos == SCALE_POS_TOPBOTTOM )
  {
  if ( $Parameters["Position"] == AXIS_POSITION_TOP )
  {
  if ( $Floating )
  { $FloatingOffset = $XMargin; $this->drawLine($this->GraphAreaX1+$Parameters["Margin"],$AxisPos["T"],$this->GraphAreaX2-$Parameters["Margin"],$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
  else
  { $FloatingOffset = 0; $this->drawLine($this->GraphAreaX1,$AxisPos["T"],$this->GraphAreaX2,$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
 
  if ( $DrawArrows ) { $this->drawArrow($this->GraphAreaX2-$Parameters["Margin"],$AxisPos["T"],$this->GraphAreaX2+($ArrowSize*2),$AxisPos["T"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }
 
  $Width = ($this->GraphAreaX2 - $this->GraphAreaX1) - $Parameters["Margin"]*2;
  $Step = $Width / $Parameters["Rows"]; $SubTicksSize = $Step /2; $MinTop = $AxisPos["T"];
  $LastX = NULL;
  for($i=0;$i<=$Parameters["Rows"];$i++)
  {
  $XPos = $this->GraphAreaX1 + $Parameters["Margin"] + $Step*$i;
  $YPos = $AxisPos["T"];
  $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Parameters["Display"],$Parameters["Format"],$Parameters["Unit"]);
 
  if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); }
  if ( $LastX != NULL && $CycleBackground && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->drawFilledRectangle($LastX,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,$BGColor); }
 
  if ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }
 
  if ( $DrawSubTicks && $i != $Parameters["Rows"] )
  $this->drawLine($XPos+$SubTicksSize,$YPos-$OuterSubTickWidth,$XPos+$SubTicksSize,$YPos+$InnerSubTickWidth,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha));
 
  $this->drawLine($XPos,$YPos-$OuterTickWidth,$XPos,$YPos+$InnerTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha));
  $Bounds = $this->drawText($XPos,$YPos-$OuterTickWidth-2,$Value,array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
  $TxtHeight = $YPos-$OuterTickWidth-2-($Bounds[1]["Y"]-$Bounds[2]["Y"]);
  $MinTop = min($MinTop,$TxtHeight);
 
  $LastX = $XPos;
  }
 
  if ( isset($Parameters["Name"]) )
  {
  $YPos = $MinTop-2;
  $XPos = $this->GraphAreaX1+($this->GraphAreaX2-$this->GraphAreaX1)/2;
  $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
  $MinTop = $Bounds[2]["Y"];
 
  $this->DataSet->Data["GraphArea"]["Y1"] = $MinTop;
  }
 
  $AxisPos["T"] = $MinTop - $ScaleSpacing;
  }
  elseif ( $Parameters["Position"] == AXIS_POSITION_BOTTOM )
  {
  if ( $Floating )
  { $FloatingOffset = $XMargin; $this->drawLine($this->GraphAreaX1+$Parameters["Margin"],$AxisPos["B"],$this->GraphAreaX2-$Parameters["Margin"],$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
  else
  { $FloatingOffset = 0; $this->drawLine($this->GraphAreaX1,$AxisPos["B"],$this->GraphAreaX2,$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
 
  if ( $DrawArrows ) { $this->drawArrow($this->GraphAreaX2-$Parameters["Margin"],$AxisPos["B"],$this->GraphAreaX2+($ArrowSize*2),$AxisPos["B"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }
 
  $Width = ($this->GraphAreaX2 - $this->GraphAreaX1) - $Parameters["Margin"]*2;
  $Step = $Width / $Parameters["Rows"]; $SubTicksSize = $Step /2; $MaxBottom = $AxisPos["B"];
  $LastX = NULL;
  for($i=0;$i<=$Parameters["Rows"];$i++)
  {
  $XPos = $this->GraphAreaX1 + $Parameters["Margin"] + $Step*$i;
  $YPos = $AxisPos["B"];
  $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Parameters["Display"],$Parameters["Format"],$Parameters["Unit"]);
 
  if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); }
  if ( $LastX != NULL && $CycleBackground && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->drawFilledRectangle($LastX,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,$BGColor); }
 
  if ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }
 
  if ( $DrawSubTicks && $i != $Parameters["Rows"] )
  $this->drawLine($XPos+$SubTicksSize,$YPos-$OuterSubTickWidth,$XPos+$SubTicksSize,$YPos+$InnerSubTickWidth,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha));
 
  $this->drawLine($XPos,$YPos-$OuterTickWidth,$XPos,$YPos+$InnerTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha));
  $Bounds = $this->drawText($XPos,$YPos+$OuterTickWidth+2,$Value,array("Align"=>TEXT_ALIGN_TOPMIDDLE));
  $TxtHeight = $YPos+$OuterTickWidth+2+($Bounds[1]["Y"]-$Bounds[2]["Y"]);
  $MaxBottom = max($MaxBottom,$TxtHeight);
 
  $LastX = $XPos;
  }
 
  if ( isset($Parameters["Name"]) )
  {
  $YPos = $MaxBottom+2;
  $XPos = $this->GraphAreaX1+($this->GraphAreaX2-$this->GraphAreaX1)/2;
  $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_TOPMIDDLE));
  $MaxBottom = $Bounds[0]["Y"];
 
  $this->DataSet->Data["GraphArea"]["Y2"] = $MaxBottom + $this->FontSize;
  }
 
  $AxisPos["B"] = $MaxBottom + $ScaleSpacing;
  }
  }
  }
  }
  }
 
  function isValidLabel($Value,$LastValue,$LabelingMethod,$ID,$LabelSkip)
  {
  if ( $LabelingMethod == LABELING_DIFFERENT && $Value != $LastValue ) { return(TRUE); }
  if ( $LabelingMethod == LABELING_DIFFERENT && $Value == $LastValue ) { return(FALSE); }
  if ( $LabelingMethod == LABELING_ALL && $LabelSkip == 1 ) { return(TRUE); }
  if ( $LabelingMethod == LABELING_ALL && ($ID+$LabelSkip) % ($LabelSkip+1) != 1 ) { return(FALSE); }
 
  return(TRUE);
  }
 
  /* Compute the scale, check for the best visual factors */
  function computeScale($XMin,$XMax,$MaxDivs,$Factors,$AxisID=0)
  {
  /* Compute each factors */
  $Results = "";
  foreach ($Factors as $Key => $Factor)
  $Results[$Factor] = $this->processScale($XMin,$XMax,$MaxDivs,array($Factor),$AxisID);
 
  /* Remove scales that are creating to much decimals */
  $GoodScaleFactors = "";
  foreach ($Results as $Key => $Result)
  {
  $Decimals = preg_split("/\./",$Result["RowHeight"]);
  if ( (!isset($Decimals[1])) || (strlen($Decimals[1]) < 6) ) { $GoodScaleFactors[] = $Key; }
  }
 
  /* Found no correct scale, shame,... returns the 1st one as default */
  if ( $GoodScaleFactors == "" ) { return($Results[$Factors[0]]); }
 
  /* Find the factor that cause the maximum number of Rows */
  $MaxRows = 0; $BestFactor = 0;
  foreach($GoodScaleFactors as $Key => $Factor)
  { if ( $Results[$Factor]["Rows"] > $MaxRows ) { $MaxRows = $Results[$Factor]["Rows"]; $BestFactor = $Factor; } }
 
  /* Return the best visual scale */
  return($Results[$BestFactor]);
  }
 
  /* Compute the best matching scale based on size & factors */
  function processScale($XMin,$XMax,$MaxDivs,$Factors,$AxisID)
  {
  $ScaleHeight = abs(ceil($XMax)-floor($XMin));
 
  if ( isset($this->DataSet->Data["Axis"][$AxisID]["Display"]) )
  $Mode = $this->DataSet->Data["Axis"][$AxisID]["Display"];
  else
  $Mode = AXIS_FORMAT_DEFAULT;
 
  $Scale = "";
  if ( $XMin != $XMax )
  {
  $Found = FALSE; $Rescaled = FALSE; $Scaled10Factor = .0001; $Result = 0;
  while(!$Found)
  {
  foreach($Factors as $Key => $Factor)
  {
  if ( !$Found )
  {
  if ( !($this->modulo($XMin,$Factor*$Scaled10Factor) == 0) || ($XMin != floor($XMin))) { $XMinRescaled = floor($XMin/($Factor*$Scaled10Factor))*$Factor*$Scaled10Factor; } else { $XMinRescaled = $XMin; }
  if ( !($this->modulo($XMax,$Factor*$Scaled10Factor) == 0) || ($XMax != floor($XMax))) { $XMaxRescaled = floor($XMax/($Factor*$Scaled10Factor))*$Factor*$Scaled10Factor+($Factor*$Scaled10Factor); } else { $XMaxRescaled = $XMax; }
  $ScaleHeightRescaled = abs($XMaxRescaled-$XMinRescaled);
 
  if ( !$Found && floor($ScaleHeightRescaled/($Factor*$Scaled10Factor)) <= $MaxDivs ) { $Found = TRUE; $Rescaled = TRUE; $Result = $Factor * $Scaled10Factor; }
  }
  }
  $Scaled10Factor = $Scaled10Factor * 10;
  }
 
  /* ReCall Min / Max / Height */
  if ( $Rescaled ) { $XMin = $XMinRescaled; $XMax = $XMaxRescaled; $ScaleHeight = $ScaleHeightRescaled; }
 
  /* Compute rows size */
  $Rows = floor($ScaleHeight / $Result);
  $RowHeight = $ScaleHeight / $Rows;
 
  /* Return the results */
  $Scale["Rows"] = $Rows; $Scale["RowHeight"] = $RowHeight; $Scale["XMin"] = $XMin; $Scale["XMax"] = $XMax;
 
  /* Compute the needed decimals for the metric view to avoid repetition of the same X Axis labels */
  if ( $Mode == AXIS_FORMAT_METRIC )
  {
  $Done = FALSE; $GoodDecimals = 0;
  for($Decimals=0;$Decimals<=10;$Decimals++)
  {
  if ( !$Done )
  {
  $LastLabel = "zob"; $ScaleOK = TRUE;
  for($i=0;$i<=$Rows;$i++)
  {
  $Value = $XMin + $i*$RowHeight;
  $Label = $this->scaleFormat($Value,AXIS_FORMAT_METRIC,$Decimals);
 
  if ( $LastLabel == $Label ) { $ScaleOK = FALSE; }
  $LastLabel = $Label;
  }
  if ( $ScaleOK ) { $Done = TRUE; $GoodDecimals = $Decimals; }
  }
  }
 
  $Scale["Format"] = $GoodDecimals;
  }
  }
  else
  {
  /* If all values are the same we keep a +1/-1 scale */
  $Rows = 2; $XMin = $XMax-1; $XMax = $XMax+1; $RowHeight = 1;
 
  /* Return the results */
  $Scale["Rows"] = $Rows; $Scale["RowHeight"] = $RowHeight; $Scale["XMin"] = $XMin; $Scale["XMax"] = $XMax;
  }
 
  return($Scale);
  }
 
  function modulo($Value1,$Value2)
  {
  if (floor($Value2) == 0) { return(0); }
  if (floor($Value2) != 0) { return($Value1 % $Value2); }
 
  $MinValue = min($Value1,$Value2); $Factor = 10;
  while ( floor($MinValue*$Factor) == 0 )
  { $Factor = $Factor * 10; }
 
  return(($Value1*$Factor) % ($Value2*$Factor));
  }
 
  /* Draw a threshold with the computed scale */
  function drawThreshold($Value,$Format="")
  {
  $AxisID = isset($Format["AxisID"]) ? $Format["AxisID"] : 0;
  $R = isset($Format["R"]) ? $Format["R"] : 255;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 50;
  $Weight = isset($Format["Weight"]) ? $Format["Weight"] : NULL;
  $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : 6;
  $Wide = isset($Format["Wide"]) ? $Format["Wide"] : FALSE;
  $WideFactor = isset($Format["WideFactor"]) ? $Format["WideFactor"] : 5;
  $WriteCaption = isset($Format["WriteCaption"]) ? $Format["WriteCaption"] : FALSE;
  $Caption = isset($Format["Caption"]) ? $Format["Caption"] : NULL;
  $CaptionAlign = isset($Format["CaptionAlign"]) ? $Format["CaptionAlign"] : CAPTION_LEFT_TOP;
  $CaptionOffset = isset($Format["CaptionOffset"]) ? $Format["CaptionOffset"] : 10;
  $CaptionR = isset($Format["CaptionR"]) ? $Format["CaptionR"] : 255;
  $CaptionG = isset($Format["CaptionG"]) ? $Format["CaptionG"] : 255;
  $CaptionB = isset($Format["CaptionB"]) ? $Format["CaptionB"] : 255;
  $CaptionAlpha = isset($Format["CaptionAlpha"]) ? $Format["CaptionAlpha"] : 100;
  $DrawBox = isset($Format["DrawBox"]) ? $Format["DrawBox"] : TRUE;
  $DrawBoxBorder = isset($Format["DrawBoxBorder"]) ? $Format["DrawBoxBorder"] : FALSE;
  $BorderOffset = isset($Format["BorderOffset"]) ? $Format["BorderOffset"] : 3;
  $BoxRounded = isset($Format["BoxRounded"]) ? $Format["BoxRounded"] : TRUE;
  $RoundedRadius = isset($Format["RoundedRadius"]) ? $Format["RoundedRadius"] : 3;
  $BoxR = isset($Format["BoxR"]) ? $Format["BoxR"] : 0;
  $BoxG = isset($Format["BoxG"]) ? $Format["BoxG"] : 0;
  $BoxB = isset($Format["BoxB"]) ? $Format["BoxB"] : 0;
  $BoxAlpha = isset($Format["BoxAlpha"]) ? $Format["BoxAlpha"] : 30;
  $BoxSurrounding = isset($Format["BoxSurrounding"]) ? $Format["BoxSurrounding"] : "";
  $BoxBorderR = isset($Format["BoxBorderR"]) ? $Format["BoxBorderR"] : 255;
  $BoxBorderG = isset($Format["BoxBorderG"]) ? $Format["BoxBorderG"] : 255;
  $BoxBorderB = isset($Format["BoxBorderB"]) ? $Format["BoxBorderB"] : 255;
  $BoxBorderAlpha = isset($Format["BoxBorderAlpha"]) ? $Format["BoxBorderAlpha"] : 100;
 
  $CaptionSettings = array("DrawBox"=>$DrawBox,"DrawBoxBorder"=>$DrawBoxBorder,"BorderOffset"=>$BorderOffset,"BoxRounded"=>$BoxRounded,"RoundedRadius"=>$RoundedRadius,
  "BoxR"=>$BoxR,"BoxG"=>$BoxG,"BoxB"=>$BoxB,"BoxAlpha"=>$BoxAlpha,"BoxSurrounding"=>$BoxSurrounding,
  "BoxBorderR"=>$BoxBorderR,"BoxBorderG"=>$BoxBorderG,"BoxBorderB"=>$BoxBorderB,"BoxBorderAlpha"=>$BoxBorderAlpha,
  "R"=>$CaptionR,"G"=>$CaptionG,"B"=>$CaptionB,"Alpha"=>$CaptionAlpha);
 
  if ( $Caption == NULL ) { $Caption = $Value; }
 
  $Data = $this->DataSet->getData();
  if ( !isset($Data["Axis"][$AxisID]) ) { return(-1); }
 
  if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )
  {
  $YPos = $this->scaleComputeY($Value,array("AxisID"=>$AxisID));
  if ( $YPos >= $this->GraphAreaY1 && $YPos <= $this->GraphAreaY2 )
  {
  $this->drawLine($this->GraphAreaX1,$YPos,$this->GraphAreaX2,$YPos,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight));
 
  if ( $Wide )
  {
  $this->drawLine($this->GraphAreaX1,$YPos-1,$this->GraphAreaX2,$YPos-1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/$WideFactor,"Ticks"=>$Ticks));
  $this->drawLine($this->GraphAreaX1,$YPos+1,$this->GraphAreaX2,$YPos+1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/$WideFactor,"Ticks"=>$Ticks));
  }
 
  if ( $WriteCaption )
  {
  if ( $CaptionAlign == CAPTION_LEFT_TOP )
  { $X = $this->GraphAreaX1 + $CaptionOffset; $CaptionSettings["Align"] = TEXT_ALIGN_MIDDLELEFT; }
  else
  { $X = $this->GraphAreaX2 - $CaptionOffset; $CaptionSettings["Align"] = TEXT_ALIGN_MIDDLERIGHT; }
 
  $this->drawText($X,$YPos,$Caption,$CaptionSettings);
  }
  }
 
  return(array("Y"=>$YPos));
  }
 
  if ( $Data["Orientation"] == SCALE_POS_TOPBOTTOM )
  {
  $XPos = $this->scaleComputeY($Value,array("AxisID"=>$AxisID));
  if ( $XPos >= $this->GraphAreaX1 && $XPos <= $this->GraphAreaX2 )
  {
  $this->drawLine($XPos,$this->GraphAreaY1,$XPos,$this->GraphAreaY2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight));
 
  if ( $Wide )
  {
  $this->drawLine($XPos-1,$this->GraphAreaY1,$XPos-1,$this->GraphAreaY2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/$WideFactor,"Ticks"=>$Ticks));
  $this->drawLine($XPos+1,$this->GraphAreaY1,$XPos+1,$this->GraphAreaY2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/$WideFactor,"Ticks"=>$Ticks));
  }
 
  if ( $WriteCaption )
  {
  if ( $CaptionAlign == CAPTION_LEFT_TOP )
  { $Y = $this->GraphAreaY1 + $CaptionOffset; $CaptionSettings["Align"] = TEXT_ALIGN_TOPMIDDLE; }
  else
  { $Y = $this->GraphAreaY2 - $CaptionOffset; $CaptionSettings["Align"] = TEXT_ALIGN_BOTTOMMIDDLE; }
 
  $CaptionSettings["Align"] = TEXT_ALIGN_TOPMIDDLE;
  $this->drawText($XPos,$Y,$Caption,$CaptionSettings);
  }
  }
 
  return(array("Y"=>$XPos));
  }
  }
 
  /* Draw a threshold with the computed scale */
  function drawThresholdArea($Value1,$Value2,$Format="")
  {
  $AxisID = isset($Format["AxisID"]) ? $Format["AxisID"] : 0;
  $R = isset($Format["R"]) ? $Format["R"] : 255;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 20;
  $Border = isset($Format["Border"]) ? $Format["Border"] : TRUE;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : $R;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : $G;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : $B;
  $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : $Alpha + 20;
  $BorderTicks = isset($Format["BorderTicks"]) ? $Format["BorderTicks"] : 2;
 
  if ($BorderAlpha >100) { $BorderAlpha = 100;}
 
  $Data = $this->DataSet->getData();
  if ( !isset($Data["Axis"][$AxisID]) ) { return(-1); }
 
  if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )
  {
  $YPos1 = $this->scaleComputeY($Value1,array("AxisID"=>$AxisID));
  $YPos2 = $this->scaleComputeY($Value2,array("AxisID"=>$AxisID));
 
  if ( $YPos1 > $this->GraphAreaY2 ) { $YPos1 = $this->GraphAreaY2; } if ( $YPos1 < $this->GraphAreaY1 ) { $YPos1 = $this->GraphAreaY1; }
  if ( $YPos2 > $this->GraphAreaY2 ) { $YPos2 = $this->GraphAreaY2; } if ( $YPos2 < $this->GraphAreaY1 ) { $YPos2 = $this->GraphAreaY1; }
 
  $this->drawFilledRectangle($this->GraphAreaX1+1,$YPos1,$this->GraphAreaX2-1,$YPos2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha));
  if ( $Border )
  {
  $this->drawLine($this->GraphAreaX1+1,$YPos1,$this->GraphAreaX2-1,$YPos1,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$BorderTicks));
  $this->drawLine($this->GraphAreaX1+1,$YPos2,$this->GraphAreaX2-1,$YPos2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$BorderTicks));
  }
  return(array("Y1"=>$YPos1,"Y2"=>$YPos2));
  }
 
  if ( $Data["Orientation"] == SCALE_POS_TOPBOTTOM )
  {
  $XPos1 = $this->scaleComputeY($Value1,array("AxisID"=>$AxisID));
  $XPos2 = $this->scaleComputeY($Value2,array("AxisID"=>$AxisID));
 
  if ( $XPos1 > $this->GraphAreaX2 ) { $XPos1 = $this->GraphAreaX2; } if ( $XPos1 < $this->GraphAreaX1 ) { $XPos1 = $this->GraphAreaX1; }
  if ( $XPos2 > $this->GraphAreaX2 ) { $XPos2 = $this->GraphAreaX2; } if ( $XPos2 < $this->GraphAreaX1 ) { $XPos2 = $this->GraphAreaX1; }
 
  $this->drawFilledRectangle($XPos1,$this->GraphAreaY1+1,$XPos2,$this->GraphAreaY2-1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha));
  if ( $Border )
  {
  $this->drawLine($XPos1,$this->GraphAreaY1+1,$XPos1,$this->GraphAreaY2-1,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$BorderTicks));
  $this->drawLine($XPos2,$this->GraphAreaY1+1,$XPos2,$this->GraphAreaY2-1,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$BorderTicks));
  }
  return(array("Y1"=>$XPos1,"Y2"=>$XPos2));
  }
  }
 
  function scaleGetXSettings()
  {
  $Data = $this->DataSet->getData();
  foreach($Data["Axis"] as $AxisID => $Settings)
  {
  if ( $Settings["Identity"] == AXIS_X )
  {
  $Rows = $Settings["Rows"];
 
  return(array($Settings["Margin"],$Rows));
  }
  }
  }
 
  function scaleComputeY($Values,$Option="",$ReturnOnly0Height=FALSE)
  {
  $AxisID = isset($Option["AxisID"]) ? $Option["AxisID"] : 0;
  $SerieName = isset($Option["SerieName"]) ? $Option["SerieName"] : NULL;
 
  $Data = $this->DataSet->getData();
  if ( !isset($Data["Axis"][$AxisID]) ) { return(-1); }
 
  if ( $SerieName != NULL ) { $AxisID = $Data["Series"][$SerieName]["Axis"]; }
  if ( !is_array($Values) ) { $tmp = $Values; $Values = ""; $Values[0] = $tmp; }
 
  $Result = "";
  if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )
  {
  $Height = ($this->GraphAreaY2 - $this->GraphAreaY1) - $Data["Axis"][$AxisID]["Margin"]*2;
  $ScaleHeight = $Data["Axis"][$AxisID]["ScaleMax"] - $Data["Axis"][$AxisID]["ScaleMin"];
  $Step = $Height / $ScaleHeight;
 
  if ( $ReturnOnly0Height )
  { foreach($Values as $Key => $Value) { if ( $Value == VOID ) { $Result[] = VOID; } else { $Result[] = $Step * $Value; } } }
  else
  { foreach($Values as $Key => $Value) { if ( $Value == VOID ) { $Result[] = VOID; } else { $Result[] = $this->GraphAreaY2 - $Data["Axis"][$AxisID]["Margin"] - ($Step * ($Value-$Data["Axis"][$AxisID]["ScaleMin"])); } } }
  }
  else
  {
  $Width = ($this->GraphAreaX2 - $this->GraphAreaX1) - $Data["Axis"][$AxisID]["Margin"]*2;
  $ScaleWidth = $Data["Axis"][$AxisID]["ScaleMax"] - $Data["Axis"][$AxisID]["ScaleMin"];
  $Step = $Width / $ScaleWidth;
 
  if ( $ReturnOnly0Height )
  { foreach($Values as $Key => $Value) { if ( $Value == VOID ) { $Result[] = VOID; } else { $Result[] = $Step * $Value; } } }
  else
  { foreach($Values as $Key => $Value) { if ( $Value == VOID ) { $Result[] = VOID; } else { $Result[] = $this->GraphAreaX1 + $Data["Axis"][$AxisID]["Margin"] + ($Step * ($Value-$Data["Axis"][$AxisID]["ScaleMin"])); } } }
  }
 
  if ( count($Result) == 1 )
  return($Result[0]);
  else
  return($Result);
  }
 
  /* Format the axis values */
  function scaleFormat($Value,$Mode=NULL,$Format=NULL,$Unit=NULL)
  {
  if ( $Mode == AXIS_FORMAT_DATE )
  { if ( $Format == NULL ) { $Pattern = "d/m/Y"; } else { $Pattern = $Format; } return(date($Pattern,$Value)); }
 
  if ( $Mode == AXIS_FORMAT_TIME )
  { if ( $Format == NULL ) { $Pattern = "H:i:s"; } else { $Pattern = $Format; } return(date($Pattern,$Value)); }
 
  if ( $Mode == AXIS_FORMAT_CURRENCY )
  { return($Format.number_format($Value,2)); }
 
  if ( $Mode == AXIS_FORMAT_METRIC )
  {
  if (abs($Value) > 1000000000)
  return(round($Value/1000000000,$Format)."g".$Unit);
  if (abs($Value) > 1000000)
  return(round($Value/1000000,$Format)."m".$Unit);
  elseif (abs($Value) >= 1000)
  return(round($Value/1000,$Format)."k".$Unit);
 
  }
  return($Value.$Unit);
  }
 
  /* Write Max value on a chart */
  function writeBounds($Type=BOUND_BOTH,$Format=NULL)
  {
  $MaxLabelTxt = isset($Format["MaxLabelTxt"]) ? $Format["MaxLabelTxt"] : "max=";
  $MinLabelTxt = isset($Format["MinLabelTxt"]) ? $Format["MinLabelTxt"] : "min=";
  $Decimals = isset($Format["Decimals"]) ? $Format["Decimals"] : 1;
  $ExcludedSeries = isset($Format["ExcludedSeries"]) ? $Format["ExcludedSeries"] : "";
  $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 4;
  $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;
  $MaxDisplayR = isset($Format["MaxDisplayR"]) ? $Format["MaxDisplayR"] : 0;
  $MaxDisplayG = isset($Format["MaxDisplayG"]) ? $Format["MaxDisplayG"] : 0;
  $MaxDisplayB = isset($Format["MaxDisplayB"]) ? $Format["MaxDisplayB"] : 0;
  $MinDisplayR = isset($Format["MinDisplayR"]) ? $Format["MinDisplayR"] : 255;
  $MinDisplayG = isset($Format["MinDisplayG"]) ? $Format["MinDisplayG"] : 255;
  $MinDisplayB = isset($Format["MinDisplayB"]) ? $Format["MinDisplayB"] : 255;
  $MinLabelPos = isset($Format["MinLabelPos"]) ? $Format["MinLabelPos"] : BOUND_LABEL_POS_AUTO;
  $MaxLabelPos = isset($Format["MaxLabelPos"]) ? $Format["MaxLabelPos"] : BOUND_LABEL_POS_AUTO;
  $DrawBox = isset($Format["DrawBox"]) ? $Format["DrawBox"] : TRUE;
  $DrawBoxBorder = isset($Format["DrawBoxBorder"]) ? $Format["DrawBoxBorder"] : FALSE;
  $BorderOffset = isset($Format["BorderOffset"]) ? $Format["BorderOffset"] : 3;
  $BoxRounded = isset($Format["BoxRounded"]) ? $Format["BoxRounded"] : TRUE;
  $RoundedRadius = isset($Format["RoundedRadius"]) ? $Format["RoundedRadius"] : 3;
  $BoxR = isset($Format["BoxR"]) ? $Format["BoxR"] : 0;
  $BoxG = isset($Format["BoxG"]) ? $Format["BoxG"] : 0;
  $BoxB = isset($Format["BoxB"]) ? $Format["BoxB"] : 0;
  $BoxAlpha = isset($Format["BoxAlpha"]) ? $Format["BoxAlpha"] : 20;
  $BoxSurrounding = isset($Format["BoxSurrounding"]) ? $Format["BoxSurrounding"] : "";
  $BoxBorderR = isset($Format["BoxBorderR"]) ? $Format["BoxBorderR"] : 255;
  $BoxBorderG = isset($Format["BoxBorderG"]) ? $Format["BoxBorderG"] : 255;
  $BoxBorderB = isset($Format["BoxBorderB"]) ? $Format["BoxBorderB"] : 255;
  $BoxBorderAlpha = isset($Format["BoxBorderAlpha"]) ? $Format["BoxBorderAlpha"] : 100;
 
  $CaptionSettings = array("DrawBox"=>$DrawBox,"DrawBoxBorder"=>$DrawBoxBorder,"BorderOffset"=>$BorderOffset,"BoxRounded"=>$BoxRounded,"RoundedRadius"=>$RoundedRadius,
  "BoxR"=>$BoxR,"BoxG"=>$BoxG,"BoxB"=>$BoxB,"BoxAlpha"=>$BoxAlpha,"BoxSurrounding"=>$BoxSurrounding,
  "BoxBorderR"=>$BoxBorderR,"BoxBorderG"=>$BoxBorderG,"BoxBorderB"=>$BoxBorderB,"BoxBorderAlpha"=>$BoxBorderAlpha);
 
  list($XMargin,$XDivs) = $this->scaleGetXSettings();
 
  $Data = $this->DataSet->getData();
  foreach($Data["Series"] as $SerieName => $Serie)
  {
  if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] && !isset($ExcludedSeries[$SerieName]))
  {
  $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"];
  if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; }
 
  $MinValue = $this->DataSet->getMin($SerieName);
  $MaxValue = $this->DataSet->getMax($SerieName);
 
  $MinPos = VOID; $MaxPos = VOID;
  foreach($Serie["Data"] as $Key => $Value)
  {
  if ( $Value == $MinValue && $MinPos == VOID ) { $MinPos = $Key; }
  if ( $Value == $MaxValue ) { $MaxPos = $Key; }
  }
 
  $AxisID = $Serie["Axis"];
  $Mode = $Data["Axis"][$AxisID]["Display"];
  $Format = $Data["Axis"][$AxisID]["Format"];
  $Unit = $Data["Axis"][$AxisID]["Unit"];
 
  $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));
 
  if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )
  {
  $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs;
  $X = $this->GraphAreaX1 + $XMargin;
  $SerieOffset = isset($Serie["XOffset"]) ? $Serie["XOffset"] : 0;
 
  if ( $Type == BOUND_MAX || $Type == BOUND_BOTH )
  {
  if ( $MaxLabelPos == BOUND_LABEL_POS_TOP || ( $MaxLabelPos == BOUND_LABEL_POS_AUTO && $MaxValue >= 0) ) { $YPos = $PosArray[$MaxPos] - $DisplayOffset + 2; $Align = TEXT_ALIGN_BOTTOMMIDDLE; }
  if ( $MaxLabelPos == BOUND_LABEL_POS_BOTTOM || ( $MaxLabelPos == BOUND_LABEL_POS_AUTO && $MaxValue < 0) ) { $YPos = $PosArray[$MaxPos] + $DisplayOffset + 2; $Align = TEXT_ALIGN_TOPMIDDLE; }
 
  $XPos = $X + $MaxPos*$XStep + $SerieOffset;
  $Label = $MaxLabelTxt.$this->scaleFormat(round($MaxValue,$Decimals),$Mode,$Format,$Unit);
 
  $TxtPos = $this->getTextBox($XPos,$YPos,$this->FontName,$this->FontSize,0,$Label);
  $XOffset = 0; $YOffset = 0;
  if ( $TxtPos[0]["X"] < $this->GraphAreaX1 ) { $XOffset = (($this->GraphAreaX1 - $TxtPos[0]["X"])/2); }
  if ( $TxtPos[1]["X"] > $this->GraphAreaX2 ) { $XOffset = -(($TxtPos[1]["X"] - $this->GraphAreaX2)/2); }
  if ( $TxtPos[2]["Y"] < $this->GraphAreaY1 ) { $YOffset = $this->GraphAreaY1 - $TxtPos[2]["Y"]; }
  if ( $TxtPos[0]["Y"] > $this->GraphAreaY2 ) { $YOffset = -($TxtPos[0]["Y"] - $this->GraphAreaY2); }
 
  $CaptionSettings["R"] = $MaxDisplayR; $CaptionSettings["G"] = $MaxDisplayG;
  $CaptionSettings["B"] = $MaxDisplayB; $CaptionSettings["Align"] = $Align;
 
  $this->drawText($XPos+$XOffset,$YPos+$YOffset,$Label,$CaptionSettings);
  }
 
  if ( $Type == BOUND_MIN || $Type == BOUND_BOTH )
  {
  if ( $MinLabelPos == BOUND_LABEL_POS_TOP || ( $MinLabelPos == BOUND_LABEL_POS_AUTO && $MinValue >= 0) ) { $YPos = $PosArray[$MinPos] - $DisplayOffset + 2; $Align = TEXT_ALIGN_BOTTOMMIDDLE; }
  if ( $MinLabelPos == BOUND_LABEL_POS_BOTTOM || ( $MinLabelPos == BOUND_LABEL_POS_AUTO && $MinValue < 0) ) { $YPos = $PosArray[$MinPos] + $DisplayOffset + 2; $Align = TEXT_ALIGN_TOPMIDDLE; }
 
  $XPos = $X + $MinPos*$XStep + $SerieOffset;
  $Label = $MinLabelTxt.$this->scaleFormat(round($MinValue,$Decimals),$Mode,$Format,$Unit);
 
  $TxtPos = $this->getTextBox($XPos,$YPos,$this->FontName,$this->FontSize,0,$Label);
  $XOffset = 0; $YOffset = 0;
  if ( $TxtPos[0]["X"] < $this->GraphAreaX1 ) { $XOffset = (($this->GraphAreaX1 - $TxtPos[0]["X"])/2); }
  if ( $TxtPos[1]["X"] > $this->GraphAreaX2 ) { $XOffset = -(($TxtPos[1]["X"] - $this->GraphAreaX2)/2); }
  if ( $TxtPos[2]["Y"] < $this->GraphAreaY1 ) { $YOffset = $this->GraphAreaY1 - $TxtPos[2]["Y"]; }
  if ( $TxtPos[0]["Y"] > $this->GraphAreaY2 ) { $YOffset = -($TxtPos[0]["Y"] - $this->GraphAreaY2); }
 
  $CaptionSettings["R"] = $MinDisplayR; $CaptionSettings["G"] = $MinDisplayG;
  $CaptionSettings["B"] = $MinDisplayB; $CaptionSettings["Align"] = $Align;
 
  $this->drawText($XPos+$XOffset,$YPos-$DisplayOffset+$YOffset,$Label,$CaptionSettings);
  }
  }
  else
  {
  $XStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs;
  $X = $this->GraphAreaY1 + $XMargin;
  $SerieOffset = isset($Serie["XOffset"]) ? $Serie["XOffset"] : 0;
 
  if ( $Type == BOUND_MAX || $Type == BOUND_BOTH )
  {
  if ( $MaxLabelPos == BOUND_LABEL_POS_TOP || ( $MaxLabelPos == BOUND_LABEL_POS_AUTO && $MaxValue >= 0) ) { $YPos = $PosArray[$MaxPos] + $DisplayOffset + 2; $Align = TEXT_ALIGN_MIDDLELEFT; }
  if ( $MaxLabelPos == BOUND_LABEL_POS_BOTTOM || ( $MaxLabelPos == BOUND_LABEL_POS_AUTO && $MaxValue < 0) ) { $YPos = $PosArray[$MaxPos] - $DisplayOffset + 2; $Align = TEXT_ALIGN_MIDDLERIGHT; }
 
  $XPos = $X + $MaxPos*$XStep + $SerieOffset;
  $Label = $MaxLabelTxt.$this->scaleFormat($MaxValue,$Mode,$Format,$Unit);
 
  $TxtPos = $this->getTextBox($YPos,$XPos,$this->FontName,$this->FontSize,0,$Label);
  $XOffset = 0; $YOffset = 0;
  if ( $TxtPos[0]["X"] < $this->GraphAreaX1 ) { $XOffset = $this->GraphAreaX1 - $TxtPos[0]["X"]; }
  if ( $TxtPos[1]["X"] > $this->GraphAreaX2 ) { $XOffset = -($TxtPos[1]["X"] - $this->GraphAreaX2); }
  if ( $TxtPos[2]["Y"] < $this->GraphAreaY1 ) { $YOffset = ($this->GraphAreaY1 - $TxtPos[2]["Y"])/2; }
  if ( $TxtPos[0]["Y"] > $this->GraphAreaY2 ) { $YOffset = -(($TxtPos[0]["Y"] - $this->GraphAreaY2)/2);}
 
  $CaptionSettings["R"] = $MaxDisplayR; $CaptionSettings["G"] = $MaxDisplayG;
  $CaptionSettings["B"] = $MaxDisplayB; $CaptionSettings["Align"] = $Align;
 
  $this->drawText($YPos+$XOffset,$XPos+$YOffset,$Label,$CaptionSettings);
  }
 
  if ( $Type == BOUND_MIN || $Type == BOUND_BOTH )
  {
  if ( $MinLabelPos == BOUND_LABEL_POS_TOP || ( $MinLabelPos == BOUND_LABEL_POS_AUTO && $MinValue >= 0) ) { $YPos = $PosArray[$MinPos] + $DisplayOffset + 2; $Align = TEXT_ALIGN_MIDDLELEFT; }
  if ( $MinLabelPos == BOUND_LABEL_POS_BOTTOM || ( $MinLabelPos == BOUND_LABEL_POS_AUTO && $MinValue < 0) ) { $YPos = $PosArray[$MinPos] - $DisplayOffset + 2; $Align = TEXT_ALIGN_MIDDLERIGHT; }
 
  $XPos = $X + $MinPos*$XStep + $SerieOffset;
  $Label = $MinLabelTxt.$this->scaleFormat($MinValue,$Mode,$Format,$Unit);
 
  $TxtPos = $this->getTextBox($YPos,$XPos,$this->FontName,$this->FontSize,0,$Label);
  $XOffset = 0; $YOffset = 0;
  if ( $TxtPos[0]["X"] < $this->GraphAreaX1 ) { $XOffset = $this->GraphAreaX1 - $TxtPos[0]["X"]; }
  if ( $TxtPos[1]["X"] > $this->GraphAreaX2 ) { $XOffset = -($TxtPos[1]["X"] - $this->GraphAreaX2); }
  if ( $TxtPos[2]["Y"] < $this->GraphAreaY1 ) { $YOffset = ($this->GraphAreaY1 - $TxtPos[2]["Y"])/2; }
  if ( $TxtPos[0]["Y"] > $this->GraphAreaY2 ) { $YOffset = -(($TxtPos[0]["Y"] - $this->GraphAreaY2)/2);}
 
  $CaptionSettings["R"] = $MinDisplayR; $CaptionSettings["G"] = $MinDisplayG;
  $CaptionSettings["B"] = $MinDisplayB; $CaptionSettings["Align"] = $Align;
 
  $this->drawText($YPos+$XOffset,$XPos+$YOffset,$Label,$CaptionSettings);
  }
  }
  }
  }
  }
 
  /* Draw a plot chart */
  function drawPlotChart($Format=NULL)
  {
  $PlotSize = isset($Format["PlotSize"]) ? $Format["PlotSize"] : 3;
  $PlotBorder = isset($Format["PlotBorder"]) ? $Format["PlotBorder"] : FALSE;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 50;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 50;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 50;
  $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : 30;
  $BorderSize = isset($Format["BorderSize"]) ? $Format["BorderSize"] : 2;
  $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;
  $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE;
  $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 4;
  $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;
  $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0;
  $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0;
  $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0;
 
  $Data = $this->DataSet->getData();
  list($XMargin,$XDivs) = $this->scaleGetXSettings();
 
  foreach($Data["Series"] as $SerieName => $Serie)
  {
  if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )
  {
  $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"];
  if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; }
  if ( isset($Serie["Picture"]) )
  { $Picture = $Serie["Picture"]; list($PicWidth,$PicHeight,$PicType) = $this->getPicInfo($Picture); }
  else { $Picture = NULL; $PicOffset = 0; }
 
  if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; }
 
  $AxisID = $Serie["Axis"];
  $Mode = $Data["Axis"][$AxisID]["Display"];
  $Format = $Data["Axis"][$AxisID]["Format"];
  $Unit = $Data["Axis"][$AxisID]["Unit"];
 
  $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));
 
  $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0;
 
  if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )
  {
  if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }
  if ( $Picture != NULL ) { $PicOffset = $PicHeight / 2; $PlotSize = 0; }
  $X = $this->GraphAreaX1 + $XMargin;
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
  foreach($PosArray as $Key => $Y)
  {
  if ( $DisplayValues )
  $this->drawText($X,$Y-$DisplayOffset-$PlotSize-$BorderSize-$PicOffset,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  if ( $Y != VOID )
  {
  if ( $Picture != NULL )
  { $this->drawFromPicture($PicType,$Picture,$X-$PicWidth/2,$Y-$PicHeight/2); }
  else
  {
  if ( $PlotBorder ) { $this->drawFilledCircle($X,$Y,$PlotSize+$BorderSize,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha)); }
  $this->drawFilledCircle($X,$Y,$PlotSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));
  }
  }
  $X = $X + $XStep;
  }
  }
  else
  {
  if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }
  if ( $Picture != NULL ) { $PicOffset = $PicWidth / 2; $PlotSize = 0; }
  $Y = $this->GraphAreaY1 + $XMargin;
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
  foreach($PosArray as $Key => $X)
  {
  if ( $DisplayValues )
  $this->drawText($X+$DisplayOffset+$PlotSize+$BorderSize+$PicOffset,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("Angle"=>270,"R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  if ( $X != VOID )
  {
  if ( $Picture != NULL )
  { $this->drawFromPicture($PicType,$Picture,$X-$PicWidth/2,$Y-$PicHeight/2); }
  else
  {
  if ( $PlotBorder ) { $this->drawFilledCircle($X,$Y,$PlotSize+$BorderSize,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha)); }
  $this->drawFilledCircle($X,$Y,$PlotSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));
  }
  }
  $Y = $Y + $YStep;
  }
  }
  }
  }
  }
 
  /* Draw a spline chart */
  function drawSplineChart($Format=NULL)
  {
  $BreakVoid = isset($Format["BreakVoid"]) ? $Format["BreakVoid"] : TRUE;
  $VoidTicks = isset($Format["VoidTicks"]) ? $Format["VoidTicks"] : 4;
  $BreakR = isset($Format["BreakR"]) ? $Format["BreakR"] : NULL; // 234
  $BreakG = isset($Format["BreakG"]) ? $Format["BreakG"] : NULL; // 55
  $BreakB = isset($Format["BreakB"]) ? $Format["BreakB"] : NULL; // 26
  $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE;
  $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2;
  $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;
  $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0;
  $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0;
  $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0;
 
  $Data = $this->DataSet->getData();
  list($XMargin,$XDivs) = $this->scaleGetXSettings();
  foreach($Data["Series"] as $SerieName => $Serie)
  {
  if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )
  {
  $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"];
 
  if ( $BreakR == NULL )
  $BreakSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks);
  else
  $BreakSettings = array("R"=>$BreakR,"G"=>$BreakG,"B"=>$BreakB,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks,"Weight"=>$Weight);
 
  if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; }
 
  $AxisID = $Serie["Axis"];
  $Mode = $Data["Axis"][$AxisID]["Display"];
  $Format = $Data["Axis"][$AxisID]["Format"];
  $Unit = $Data["Axis"][$AxisID]["Unit"];
 
  $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));
 
  $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0;
 
  if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )
  {
  if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }
  $X = $this->GraphAreaX1 + $XMargin; $WayPoints = "";
  $Force = $XStep / 5;
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
  $LastGoodY = NULL; $LastGoodX = NULL; $LastX = 1; $LastY = 1;
  foreach($PosArray as $Key => $Y)
  {
  if ( $DisplayValues )
  $this->drawText($X,$Y-$DisplayOffset,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  if ( $Y == VOID && $LastY != NULL )
  { $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); $WayPoints = ""; }
 
  if ( $Y != VOID && $LastY == NULL && $LastGoodY != NULL && !$BreakVoid )
  { $this->drawLine($LastGoodX,$LastGoodY,$X,$Y,$BreakSettings); }
 
  if ( $Y != VOID )
  $WayPoints[] = array($X,$Y);
 
  if ( $Y != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; }
  if ( $Y == VOID ) { $Y = NULL; }
 
  $LastX = $X; $LastY = $Y;
  $X = $X + $XStep;
  }
  $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight));
  }
  else
  {
  if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }
  $Y = $this->GraphAreaY1 + $XMargin; $WayPoints = "";
  $Force = $YStep / 5;
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
  $LastGoodY = NULL; $LastGoodX = NULL; $LastX = 1; $LastY = 1;
  foreach($PosArray as $Key => $X)
  {
  if ( $DisplayValues )
  $this->drawText($X+$DisplayOffset,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("Angle"=>270,"R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  if ( $X == VOID && $LastX != NULL )
  { $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); $WayPoints = ""; }
 
  if ( $X != VOID && $LastX == NULL && $LastGoodX != NULL && !$BreakVoid )
  { $this->drawLine($LastGoodX,$LastGoodY,$X,$Y,$BreakSettings); }
 
  if ( $X != VOID )
  $WayPoints[] = array($X,$Y);
 
  if ( $X != VOID ) { $LastGoodX = $X; $LastGoodY = $Y; }
  if ( $X == VOID ) { $X = NULL; }
 
  $LastX = $X; $LastY = $Y;
  $Y = $Y + $YStep;
  }
  $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight));
  }
  }
  }
  }
 
  /* Draw a filled spline chart */
  function drawFilledSplineChart($Format=NULL)
  {
  $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE;
  $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2;
  $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;
  $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0;
  $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0;
  $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0;
  $AroundZero = isset($Format["AroundZero"]) ? $Format["AroundZero"] : TRUE;
 
  $Data = $this->DataSet->getData();
  list($XMargin,$XDivs) = $this->scaleGetXSettings();
  foreach($Data["Series"] as $SerieName => $Serie)
  {
  if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )
  {
  $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"];
  if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; }
 
  $AxisID = $Serie["Axis"];
  $Mode = $Data["Axis"][$AxisID]["Display"];
  $Format = $Data["Axis"][$AxisID]["Format"];
  $Unit = $Data["Axis"][$AxisID]["Unit"];
 
  $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));
  if ( $AroundZero ) { $YZero = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"])); }
 
  $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0;
 
  if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )
  {
  if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }
  $X = $this->GraphAreaX1 + $XMargin; $WayPoints = "";
  $Force = $XStep / 5;
 
  if ( !$AroundZero ) { $YZero = $this->GraphAreaY2-1; }
  if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; }
  if ( $YZero < $this->GraphAreaY1+1 ) { $YZero = $this->GraphAreaY1+1; }
 
  $LastX = ""; $LastY = "";
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
  foreach($PosArray as $Key => $Y)
  {
  if ( $DisplayValues )
  $this->drawText($X,$Y-$DisplayOffset,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  if ( $Y == VOID )
  {
  $Area = $this->drawSpline($WayPoints,array("Force"=>$Force,"PathOnly"=>TRUE));
 
  if ( $Area != "" )
  {
  foreach ($Area as $key => $Points)
  {
  $Corners = ""; $Corners[] = $Area[$key][0]["X"]; $Corners[] = $YZero;
  foreach($Points as $subKey => $Point)
  {
  if ( $subKey == count($Points)-1) { $Corners[] = $Point["X"]-1; } else { $Corners[] = $Point["X"]; }
  $Corners[] = $Point["Y"]+1;
  }
  $Corners[] = $Points[$subKey]["X"]-1; $Corners[] = $YZero;
 
  $this->drawPolygon($Corners,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/2,"NoBorder"=>TRUE));
  }
  $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));
  }
 
  $WayPoints = "";
  }
  else
  $WayPoints[] = array($X,$Y-.5); /* -.5 for AA visual fix */
 
  $X = $X + $XStep;
  }
  $Area = $this->drawSpline($WayPoints,array("Force"=>$Force,"PathOnly"=>TRUE));
 
  if ( $Area != "" )
  {
  foreach ($Area as $key => $Points)
  {
  $Corners = ""; $Corners[] = $Area[$key][0]["X"]; $Corners[] = $YZero;
  foreach($Points as $subKey => $Point)
  {
  if ( $subKey == count($Points)-1) { $Corners[] = $Point["X"]-1; } else { $Corners[] = $Point["X"]; }
  $Corners[] = $Point["Y"]+1;
  }
  $Corners[] = $Points[$subKey]["X"]-1; $Corners[] = $YZero;
 
  $this->drawPolygon($Corners,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/2,"NoBorder"=>TRUE));
  }
  $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));
  }
  }
  else
  {
  if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }
  $Y = $this->GraphAreaY1 + $XMargin; $WayPoints = "";
  $Force = $YStep / 5;
 
  if ( !$AroundZero ) { $YZero = $this->GraphAreaX1+1; }
  if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; }
  if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; }
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
  foreach($PosArray as $Key => $X)
  {
  if ( $DisplayValues )
  $this->drawText($X+$DisplayOffset,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("Angle"=>270,"R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  if ( $X == VOID )
  {
  $Area = $this->drawSpline($WayPoints,array("Force"=>$Force,"PathOnly"=>TRUE));
 
  if ( $Area != "" )
  {
  foreach ($Area as $key => $Points)
  {
  $Corners = ""; $Corners[] = $YZero; $Corners[] = $Area[$key][0]["Y"];
  foreach($Points as $subKey => $Point)
  {
  if ( $subKey == count($Points)-1) { $Corners[] = $Point["X"]-1; } else { $Corners[] = $Point["X"]; }
  $Corners[] = $Point["Y"];
  }
  $Corners[] = $YZero; $Corners[] = $Points[$subKey]["Y"]-1;
 
  $this->drawPolygon($Corners,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/2,"NoBorder"=>TRUE));
  }
  $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));
  }
 
  $WayPoints = "";
  }
  else
  $WayPoints[] = array($X,$Y);
 
  $Y = $Y + $YStep;
  }
  $Area = $this->drawSpline($WayPoints,array("Force"=>$Force,"PathOnly"=>TRUE));
 
  if ( $Area != "" )
  {
  foreach ($Area as $key => $Points)
  {
  $Corners = ""; $Corners[] = $YZero; $Corners[] = $Area[$key][0]["Y"];
  foreach($Points as $subKey => $Point)
  {
  if ( $subKey == count($Points)-1) { $Corners[] = $Point["X"]-1; } else { $Corners[] = $Point["X"]; }
  $Corners[] = $Point["Y"];
  }
  $Corners[] = $YZero; $Corners[] = $Points[$subKey]["Y"]-1;
 
  $this->drawPolygon($Corners,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/2,"NoBorder"=>TRUE));
  }
  $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks));
  }
 
  }
  }
  }
  }
 
  /* Draw a line chart */
  function drawLineChart($Format=NULL)
  {
  $BreakVoid = isset($Format["BreakVoid"]) ? $Format["BreakVoid"] : TRUE;
  $VoidTicks = isset($Format["VoidTicks"]) ? $Format["VoidTicks"] : 4;
  $BreakR = isset($Format["BreakR"]) ? $Format["BreakR"] : NULL;
  $BreakG = isset($Format["BreakG"]) ? $Format["BreakG"] : NULL;
  $BreakB = isset($Format["BreakB"]) ? $Format["BreakB"] : NULL;
  $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE;
  $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2;
  $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;
  $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0;
  $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0;
  $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0;
 
  $Data = $this->DataSet->getData();
  list($XMargin,$XDivs) = $this->scaleGetXSettings();
  foreach($Data["Series"] as $SerieName => $Serie)
  {
  if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )
  {
  $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"];
 
  if ( $BreakR == NULL )
  $BreakSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks,"Weight"=>$Weight);
  else
  $BreakSettings = array("R"=>$BreakR,"G"=>$BreakG,"B"=>$BreakB,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks,"Weight"=>$Weight);
 
  if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; }
 
  $AxisID = $Serie["Axis"];
  $Mode = $Data["Axis"][$AxisID]["Display"];
  $Format = $Data["Axis"][$AxisID]["Format"];
  $Unit = $Data["Axis"][$AxisID]["Unit"];
 
  $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));
 
  $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0;
 
  if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )
  {
  if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }
  $X = $this->GraphAreaX1 + $XMargin; $LastX = NULL; $LastY = NULL;
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
  $LastGoodY = NULL; $LastGoodX = NULL;
  foreach($PosArray as $Key => $Y)
  {
  if ( $DisplayValues && $Serie["Data"][$Key] != VOID )
  {
  if ( $Serie["Data"][$Key] > 0 ) { $Align = TEXT_ALIGN_BOTTOMMIDDLE; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_TOPMIDDLE; $Offset = -$DisplayOffset; }
  $this->drawText($X,$Y-$Offset-$Weight,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align));
  }
 
  if ( $Y != VOID && $LastX != NULL && $LastY != NULL )
  $this->drawLine($LastX,$LastY,$X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight));
 
  if ( $Y != VOID && $LastY == NULL && $LastGoodY != NULL && !$BreakVoid )
  { $this->drawLine($LastGoodX,$LastGoodY,$X,$Y,$BreakSettings); $LastGoodY = NULL; }
 
  if ( $Y != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; }
  if ( $Y == VOID ) { $Y = NULL; }
 
  $LastX = $X; $LastY = $Y;
  $X = $X + $XStep;
  }
  }
  else
  {
  if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }
  $Y = $this->GraphAreaY1 + $XMargin; $LastX = NULL; $LastY = NULL;
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
  $LastGoodY = NULL; $LastGoodX = NULL;
  foreach($PosArray as $Key => $X)
  {
  if ( $DisplayValues && $Serie["Data"][$Key] != VOID )
  { $this->drawText($X+$DisplayOffset+$Weight,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("Angle"=>270,"R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); }
 
  if ( $X != VOID && $LastX != NULL && $LastY != NULL )
  $this->drawLine($LastX,$LastY,$X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight));
 
  if ( $X != VOID && $LastX == NULL && $LastGoodY != NULL && !$BreakVoid )
  { $this->drawLine($LastGoodX,$LastGoodY,$X,$Y,$BreakSettings); $LastGoodY = NULL; }
 
  if ( $X != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; }
  if ( $X == VOID ) { $X = NULL; }
 
  $LastX = $X; $LastY = $Y;
  $Y = $Y + $YStep;
  }
  }
  }
  }
  }
 
  /* Draw a step chart */
  function drawStepChart($Format=NULL)
  {
  $BreakVoid = isset($Format["BreakVoid"]) ? $Format["BreakVoid"] : FALSE;
  $ReCenter = isset($Format["ReCenter"]) ? $Format["ReCenter"] : TRUE;
  $VoidTicks = isset($Format["VoidTicks"]) ? $Format["VoidTicks"] : 4;
  $BreakR = isset($Format["BreakR"]) ? $Format["BreakR"] : NULL;
  $BreakG = isset($Format["BreakG"]) ? $Format["BreakG"] : NULL;
  $BreakB = isset($Format["BreakB"]) ? $Format["BreakB"] : NULL;
  $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] :FALSE;
  $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2;
  $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;
  $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0;
  $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0;
  $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0;
 
  $Data = $this->DataSet->getData();
  list($XMargin,$XDivs) = $this->scaleGetXSettings();
  foreach($Data["Series"] as $SerieName => $Serie)
  {
  if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )
  {
  $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"];
 
  if ( $BreakR == NULL )
  $BreakSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks,"Weight"=>$Weight);
  else
  $BreakSettings = array("R"=>$BreakR,"G"=>$BreakG,"B"=>$BreakB,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks,"Weight"=>$Weight);
 
  if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; }
 
  $AxisID = $Serie["Axis"];
  $Mode = $Data["Axis"][$AxisID]["Display"];
  $Format = $Data["Axis"][$AxisID]["Format"];
  $Unit = $Data["Axis"][$AxisID]["Unit"];
  $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight);
 
  $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));
 
  $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0;
 
  if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )
  {
  if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }
  $X = $this->GraphAreaX1 + $XMargin; $LastX = NULL; $LastY = NULL;
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
  $LastGoodY = NULL; $LastGoodX = NULL; $Init = FALSE;
  foreach($PosArray as $Key => $Y)
  {
  if ( $DisplayValues && $Serie["Data"][$Key] != VOID )
  {
  if ( $Y <= $LastY ) { $Align = TEXT_ALIGN_BOTTOMMIDDLE; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_TOPMIDDLE; $Offset = -$DisplayOffset; }
  $this->drawText($X,$Y-$Offset-$Weight,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align));
  }
 
  if ( $Y != VOID && $LastX != NULL && $LastY != NULL )
  {
  $this->drawLine($LastX,$LastY,$X,$LastY,$Color);
  $this->drawLine($X,$LastY,$X,$Y,$Color);
  if ( $ReCenter && $X+$XStep < $this->GraphAreaX2 - $XMargin ) { $this->drawLine($X,$Y,$X+$XStep,$Y,$Color); }
  }
 
  if ( $Y != VOID && $LastY == NULL && $LastGoodY != NULL && !$BreakVoid )
  {
  if ( $ReCenter )
  $this->drawLine($LastGoodX+$XStep,$LastGoodY,$X,$LastGoodY,$BreakSettings);
  else
  $this->drawLine($LastGoodX,$LastGoodY,$X,$LastGoodY,$BreakSettings);
 
  $this->drawLine($X,$LastGoodY,$X,$Y,$BreakSettings);
  $LastGoodY = NULL;
  }
  elseif( !$BreakVoid && $LastGoodY == NULL && $Y != VOID )
  $this->drawLine($this->GraphAreaX1 + $XMargin,$Y,$X,$Y,$BreakSettings);
 
  if ( $Y != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; }
  if ( $Y == VOID ) { $Y = NULL; }
 
  if ( !$Init && $ReCenter ) { $X = $X - $XStep/2; $Init = TRUE; }
  $LastX = $X; $LastY = $Y;
  if ( $LastX < $this->GraphAreaX1 + $XMargin ) { $LastX = $this->GraphAreaX1 + $XMargin; }
  $X = $X + $XStep;
  }
  if ( $ReCenter ) { $this->drawLine($LastX,$LastY,$this->GraphAreaX2 - $XMargin,$LastY,$Color); }
  }
  else
  {
  if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }
  $Y = $this->GraphAreaY1 + $XMargin; $LastX = NULL; $LastY = NULL;
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
  $LastGoodY = NULL; $LastGoodX = NULL; $Init = FALSE;
  foreach($PosArray as $Key => $X)
  {
  if ( $DisplayValues && $Serie["Data"][$Key] != VOID )
  {
  if ( $X >= $LastX ) { $Align = TEXT_ALIGN_MIDDLELEFT; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_MIDDLERIGHT; $Offset = -$DisplayOffset; }
  $this->drawText($X+$Offset+$Weight,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align));
  }
 
  if ( $X != VOID && $LastX != NULL && $LastY != NULL )
  {
  $this->drawLine($LastX,$LastY,$LastX,$Y,$Color);
  $this->drawLine($LastX,$Y,$X,$Y,$Color);
  }
 
  if ( $X != VOID && $LastX == NULL && $LastGoodY != NULL && !$BreakVoid )
  {
  $this->drawLine($LastGoodX,$LastGoodY,$LastGoodX,$LastGoodY+$YStep,$Color);
 
  $this->drawLine($LastGoodX,$LastGoodY+$YStep,$LastGoodX,$Y,$BreakSettings);
  $this->drawLine($LastGoodX,$Y,$X,$Y,$BreakSettings);
  $LastGoodY = NULL;
  }
  elseif ( $X != VOID && $LastGoodY == NULL && !$BreakVoid )
  $this->drawLine($X,$this->GraphAreaY1 + $XMargin,$X,$Y,$BreakSettings);
 
  if ( $X != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; }
  if ( $X == VOID ) { $X = NULL; }
 
  if ( !$Init && $ReCenter ) { $Y = $Y - $YStep/2; $Init = TRUE; }
  $LastX = $X; $LastY = $Y;
  if ( $LastY < $this->GraphAreaY1 + $XMargin ) { $LastY = $this->GraphAreaY1 + $XMargin; }
  $Y = $Y + $YStep;
  }
  if ( $ReCenter ) { $this->drawLine($LastX,$LastY,$LastX,$this->GraphAreaY2 - $XMargin,$Color); }
  }
  }
  }
  }
 
  /* Draw a step chart */
  function drawFilledStepChart($Format=NULL)
  {
  $ReCenter = isset($Format["ReCenter"]) ? $Format["ReCenter"] : TRUE;
  $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] :FALSE;
  $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2;
  $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;
  $ForceTransparency = isset($Format["ForceTransparency"]) ? $Format["ForceTransparency"] : NULL;
  $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0;
  $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0;
  $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0;
  $AroundZero = isset($Format["AroundZero"]) ? $Format["AroundZero"] : TRUE;
 
  $Data = $this->DataSet->getData();
  list($XMargin,$XDivs) = $this->scaleGetXSettings();
  foreach($Data["Series"] as $SerieName => $Serie)
  {
  if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )
  {
  $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"];
 
  if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; }
 
  $AxisID = $Serie["Axis"];
  $Mode = $Data["Axis"][$AxisID]["Display"];
  $Format = $Data["Axis"][$AxisID]["Format"];
  $Unit = $Data["Axis"][$AxisID]["Unit"];
 
  $Color = array("R"=>$R,"G"=>$G,"B"=>$B);
  if ( $ForceTransparency != NULL ) { $Color["Alpha"] = $ForceTransparency; } else { $Color["Alpha"] = $Alpha; }
 
  $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));
  $YZero = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"]));
 
  $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0;
 
  if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )
  {
  if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; }
  if ( $YZero < $this->GraphAreaY1+1 ) { $YZero = $this->GraphAreaY1+1; }
 
  if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }
  $X = $this->GraphAreaX1 + $XMargin; $LastX = NULL; $LastY = NULL;
 
  if ( !$AroundZero ) { $YZero = $this->GraphAreaY2-1; }
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
  $LastGoodY = NULL; $LastGoodX = NULL; $Points = ""; $Init = FALSE;
  foreach($PosArray as $Key => $Y)
  {
  if ( $Y == VOID && $LastX != NULL && $LastY != NULL && $Points !="" )
  {
  $Points[] = $LastX; $Points[] = $LastY;
  $Points[] = $X; $Points[] = $LastY;
  $Points[] = $X; $Points[] = $YZero;
  $this->drawPolygon($Points,$Color);
  $Points = "";
  }
 
  if ( $Y != VOID && $LastX != NULL && $LastY != NULL )
  {
  if ( $Points == "") { $Points[] = $LastX; $Points[] = $YZero; }
  $Points[] = $LastX; $Points[] = $LastY;
  $Points[] = $X; $Points[] = $LastY;
  $Points[] = $X; $Points[] = $Y;
  }
 
  if ( $Y != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; }
  if ( $Y == VOID ) { $Y = NULL; }
 
  if ( !$Init && $ReCenter ) { $X = $X - $XStep/2; $Init = TRUE; }
  $LastX = $X; $LastY = $Y;
  if ( $LastX < $this->GraphAreaX1 + $XMargin ) { $LastX = $this->GraphAreaX1 + $XMargin; }
  $X = $X + $XStep;
  }
 
  if ( $ReCenter )
  {
  $Points[] = $LastX+$XStep/2; $Points[] = $LastY;
  $Points[] = $LastX+$XStep/2; $Points[] = $YZero;
  }
  else
  { $Points[] = $LastX; $Points[] = $YZero; }
 
  $this->drawPolygon($Points,$Color);
  }
  else
  {
  if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; }
  if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; }
 
  if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }
  $Y = $this->GraphAreaY1 + $XMargin; $LastX = NULL; $LastY = NULL;
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
  $LastGoodY = NULL; $LastGoodX = NULL; $Points = "";
  foreach($PosArray as $Key => $X)
  {
  if ( $X == VOID && $LastX != NULL && $LastY != NULL && $Points !="" )
  {
  $Points[] = $LastX; $Points[] = $LastY;
  $Points[] = $LastX; $Points[] = $Y;
  $Points[] = $YZero; $Points[] = $Y;
  $this->drawPolygon($Points,$Color);
  $Points = "";
  }
 
  if ( $X != VOID && $LastX != NULL && $LastY != NULL )
  {
  if ( $Points == "") { $Points[] = $YZero; $Points[] = $LastY; }
  $Points[] = $LastX; $Points[] = $LastY;
  $Points[] = $LastX; $Points[] = $Y;
  $Points[] = $X; $Points[] = $Y;
  }
 
  if ( $X != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; }
  if ( $X == VOID ) { $X = NULL; }
 
  if ( $LastX == NULL && $ReCenter ) { $Y = $Y - $YStep/2; }
  $LastX = $X; $LastY = $Y;
  if ( $LastY < $this->GraphAreaY1 + $XMargin ) { $LastY = $this->GraphAreaY1 + $XMargin; }
  $Y = $Y + $YStep;
  }
 
  if ( $ReCenter )
  {
  $Points[] = $LastX; $Points[] = $LastY+$YStep/2;
  $Points[] = $YZero; $Points[] = $LastY+$YStep/2;
  }
  else
  { $Points[] = $YZero; $Points[] = $LastY; }
 
  $this->drawPolygon($Points,$Color);
  }
  }
  }
  }
 
  /* Draw an area chart */
  function drawAreaChart($Format=NULL)
  {
  $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE;
  $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2;
  $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;
  $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0;
  $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0;
  $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0;
  $ForceTransparency = isset($Format["ForceTransparency"]) ? $Format["ForceTransparency"] : 50;
  $AroundZero = isset($Format["AroundZero"]) ? $Format["AroundZero"] : TRUE;
 
  $Data = $this->DataSet->getData();
  list($XMargin,$XDivs) = $this->scaleGetXSettings();
 
  foreach($Data["Series"] as $SerieName => $Serie)
  {
  if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )
  {
  $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"];
  if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; }
 
  $AxisID = $Serie["Axis"];
  $Mode = $Data["Axis"][$AxisID]["Display"];
  $Format = $Data["Axis"][$AxisID]["Format"];
  $Unit = $Data["Axis"][$AxisID]["Unit"];
 
  $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));
  $YZero = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"]));
 
  $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0;
 
  if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )
  {
  if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; }
 
  $Areas = ""; $AreaID = 0;
  $Areas[$AreaID][] = $this->GraphAreaX1 + $XMargin;
  if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaY2-1; }
 
  if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }
  $X = $this->GraphAreaX1 + $XMargin; $LastX = NULL; $LastY = NULL;
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
  foreach($PosArray as $Key => $Y)
  {
  if ( $DisplayValues && $Serie["Data"][$Key] != VOID )
  {
  if ( $Serie["Data"][$Key] > 0 ) { $Align = TEXT_ALIGN_BOTTOMMIDDLE; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_TOPMIDDLE; $Offset = -$DisplayOffset; }
  $this->drawText($X,$Y-$Offset,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align));
  }
 
  if ( $Y == VOID && isset($Areas[$AreaID]) )
  {
  $Areas[$AreaID][] = $LastX;
  if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaY2-1; }
 
  $AreaID++;
  }
  elseif ($Y != VOID)
  {
  if ( !isset($Areas[$AreaID]) )
  {
  $Areas[$AreaID][] = $X;
  if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaY2-1; }
  }
 
  $Areas[$AreaID][] = $X;
  $Areas[$AreaID][] = $Y;
  }
 
  $LastX = $X;
  $X = $X + $XStep;
  }
  $Areas[$AreaID][] = $LastX;
  if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaY2-1; }
 
  $Alpha = $ForceTransparency != NULL ? $ForceTransparency : $Alpha;
  $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha);
  foreach($Areas as $Key => $Points)
  $this->drawPolygon($Points,$Color);
  }
  else
  {
  if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; }
  if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; }
 
  $Areas = ""; $AreaID = 0;
  if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaX1+1; }
  $Areas[$AreaID][] = $this->GraphAreaY1 + $XMargin;
 
  if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }
  $Y = $this->GraphAreaY1 + $XMargin; $LastX = NULL; $LastY = NULL;
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
  foreach($PosArray as $Key => $X)
  {
  if ( $DisplayValues && $Serie["Data"][$Key] != VOID )
  {
  if ( $Serie["Data"][$Key] > 0 ) { $Align = TEXT_ALIGN_BOTTOMMIDDLE; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_TOPMIDDLE; $Offset = -$DisplayOffset; }
  $this->drawText($X+$Offset,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("Angle"=>270,"R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align));
  }
 
 
  if ( $X == VOID && isset($Areas[$AreaID]) )
  {
  if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaX1+1; }
  $Areas[$AreaID][] = $LastY;
 
  $AreaID++;
  }
  elseif ($X != VOID)
  {
  if ( !isset($Areas[$AreaID]) )
  {
  if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaX1+1; }
  $Areas[$AreaID][] = $Y;
  }
 
  $Areas[$AreaID][] = $X;
  $Areas[$AreaID][] = $Y;
  }
 
  $LastX = $X; $LastY = $Y;
  $Y = $Y + $YStep;
  }
  if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaX1+1; }
  $Areas[$AreaID][] = $LastY;
 
  $Alpha = $ForceTransparency != NULL ? $ForceTransparency : $Alpha;
  $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha);
  foreach($Areas as $Key => $Points)
  $this->drawPolygon($Points,$Color);
  }
  }
  }
  }
 
 
  /* Draw a bar chart */
  function drawBarChart($Format=NULL)
  {
  $Floating0Serie = isset($Format["Floating0Serie"]) ? $Format["Floating0Serie"] : NULL;
  $Floating0Value = isset($Format["Floating0Value"]) ? $Format["Floating0Value"] : NULL;
  $Draw0Line = isset($Format["Draw0Line"]) ? $Format["Draw0Line"] : FALSE;
  $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE;
  $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2;
  $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;
  $DisplayFont = isset($Format["DisplaySize"]) ? $Format["DisplaySize"] : $this->FontName;
  $DisplaySize = isset($Format["DisplaySize"]) ? $Format["DisplaySize"] : $this->FontSize;
  $DisplayPos = isset($Format["DisplayPos"]) ? $Format["DisplayPos"] : LABEL_POS_OUTSIDE;
  $DisplayShadow = isset($Format["DisplayShadow"]) ? $Format["DisplayShadow"] : TRUE;
  $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0;
  $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0;
  $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0;
  $AroundZero = isset($Format["AroundZero"]) ? $Format["AroundZero"] : TRUE;
  $Interleave = isset($Format["Interleave"]) ? $Format["Interleave"] : .5;
  $Rounded = isset($Format["Rounded"]) ? $Format["Rounded"] : FALSE;
  $RoundRadius = isset($Format["RoundRadius"]) ? $Format["RoundRadius"] : 4;
  $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : -1;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : -1;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : -1;
  $Gradient = isset($Format["Gradient"]) ? $Format["Gradient"] : FALSE;
  $GradientMode = isset($Format["GradientMode"]) ? $Format["GradientMode"] : GRADIENT_SIMPLE;
  $GradientAlpha = isset($Format["GradientAlpha"]) ? $Format["GradientAlpha"] : 20;
  $GradientStartR = isset($Format["GradientStartR"]) ? $Format["GradientStartR"] : 255;
  $GradientStartG = isset($Format["GradientStartG"]) ? $Format["GradientStartG"] : 255;
  $GradientStartB = isset($Format["GradientStartB"]) ? $Format["GradientStartB"] : 255;
  $GradientEndR = isset($Format["GradientEndR"]) ? $Format["GradientEndR"] : 0;
  $GradientEndG = isset($Format["GradientEndG"]) ? $Format["GradientEndG"] : 0;
  $GradientEndB = isset($Format["GradientEndB"]) ? $Format["GradientEndB"] : 0;
  $TxtMargin = isset($Format["TxtMargin"]) ? $Format["TxtMargin"] : 6;
  $OverrideColors = isset($Format["OverrideColors"]) ? $Format["OverrideColors"] : NULL;
  $OverrideSurrounding = isset($Format["OverrideSurrounding"]) ? $Format["OverrideSurrounding"] : 30;
 
  if ( $OverrideColors != NULL ) { $OverrideColors = $this->validatePalette($OverrideColors,$OverrideSurrounding); }
 
  $Data = $this->DataSet->getData();
  list($XMargin,$XDivs) = $this->scaleGetXSettings();
 
  $RestoreShadow = $this->Shadow;
 
  $SeriesCount = $this->countDrawableSeries();
  $CurrentSerie = 0;
  foreach($Data["Series"] as $SerieName => $Serie)
  {
  if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )
  {
  $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"];
  if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; }
  if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; }
 
  $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB);
 
  $AxisID = $Serie["Axis"];
  $Mode = $Data["Axis"][$AxisID]["Display"];
  $Format = $Data["Axis"][$AxisID]["Format"];
  $Unit = $Data["Axis"][$AxisID]["Unit"];
 
  $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));
 
  if ( $Floating0Value != NULL )
  { $YZero = $this->scaleComputeY($Floating0Value,array("AxisID"=>$Serie["Axis"])); }
  else
  { $YZero = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"])); }
 
  if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )
  {
  if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; }
  if ( $YZero < $this->GraphAreaY1+1 ) { $YZero = $this->GraphAreaY1+1; }
 
  if ( $XDivs == 0 ) { $XStep = 0; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }
  $X = $this->GraphAreaX1 + $XMargin;
 
  if ( $AroundZero ) { $Y1 = $YZero; } else { $Y1 = $this->GraphAreaY2-1; }
  if ( $XDivs == 0 ) { $XSize = ($this->GraphAreaX2-$this->GraphAreaX1)/($SeriesCount+$Interleave); } else { $XSize = ($XStep / ($SeriesCount+$Interleave) ); }
 
  $XOffset = -($XSize*$SeriesCount)/2 + $CurrentSerie * $XSize;
  $this->DataSet->Data["Series"][$SerieName]["XOffset"] = $XOffset + $XSize / 2;
 
 
  if ( $Rounded || $BorderR != -1) { $XSpace = 1; } else { $XSpace = 0; }
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
 
  $ID = 0;
  foreach($PosArray as $Key => $Y2)
  {
  if ( $Floating0Serie != NULL )
  {
  if ( isset($Data["Series"][$Floating0Serie]["Data"][$Key]) )
  $Value = $Data["Series"][$Floating0Serie]["Data"][$Key];
  else { $Value = 0; }
 
  $YZero = $this->scaleComputeY($Value,array("AxisID"=>$Serie["Axis"]));
  if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; }
  if ( $YZero < $this->GraphAreaY1+1 ) { $YZero = $this->GraphAreaY1+1; }
 
  if ( $AroundZero ) { $Y1 = $YZero; } else { $Y1 = $this->GraphAreaY2-1; }
  }
 
  if ( $OverrideColors != NULL )
  { if ( isset($OverrideColors[$ID]) ) { $Color = array("R"=>$OverrideColors[$ID]["R"],"G"=>$OverrideColors[$ID]["G"],"B"=>$OverrideColors[$ID]["B"],"Alpha"=>$OverrideColors[$ID]["Alpha"],"BorderR"=>$OverrideColors[$ID]["BorderR"],"BorderG"=>$OverrideColors[$ID]["BorderG"],"BorderB"=>$OverrideColors[$ID]["BorderB"]); } else { $Color = $this->getRandomColor(); } }
 
  if ( $Y2 != VOID )
  {
  $BarHeight = $Y1 - $Y2;
 
  if ( $Serie["Data"][$Key] == 0 )
  $this->drawLine($X+$XOffset+$XSpace,$Y1,$X+$XOffset+$XSize-$XSpace,$Y1,$Color);
  else
  {
  if ( $Rounded )
  $this->drawRoundedFilledRectangle($X+$XOffset+$XSpace,$Y1,$X+$XOffset+$XSize-$XSpace,$Y2,$RoundRadius,$Color);
  else
  {
  $this->drawFilledRectangle($X+$XOffset+$XSpace,$Y1,$X+$XOffset+$XSize-$XSpace,$Y2,$Color);
 
  if ( $Gradient )
  {
  $this->Shadow = FALSE;
 
  if ( $GradientMode == GRADIENT_SIMPLE )
  {
  if ( $Serie["Data"][$Key] >= 0 )
  $GradienColor = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha);
  else
  $GradienColor = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha);
 
  $this->drawGradientArea($X+$XOffset+$XSpace,$Y1,$X+$XOffset+$XSize-$XSpace,$Y2,DIRECTION_VERTICAL,$GradienColor);
  }
  elseif ( $GradientMode == GRADIENT_EFFECT_CAN )
  {
  $GradienColor1 = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha);
  $GradienColor2 = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha);
  $XSpan = floor($XSize / 3);
 
  $this->drawGradientArea($X+$XOffset+$XSpace,$Y1,$X+$XOffset+$XSpan-$XSpace,$Y2,DIRECTION_HORIZONTAL,$GradienColor1);
  $this->drawGradientArea($X+$XOffset+$XSpan+$XSpace,$Y1,$X+$XOffset+$XSize-$XSpace,$Y2,DIRECTION_HORIZONTAL,$GradienColor2);
  }
  $this->Shadow = $RestoreShadow;
  }
  }
 
  if ( $Draw0Line )
  {
  $Line0Color = array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20);
 
  if ( abs($Y1 - $Y2) > 3 ) { $Line0Width = 3; } else { $Line0Width = 1; }
  if ( $Y1 - $Y2 < 0 ) { $Line0Width = -$Line0Width; }
 
  $this->drawFilledRectangle($X+$XOffset+$XSpace,floor($Y1),$X+$XOffset+$XSize-$XSpace,floor($Y1)-$Line0Width,$Line0Color);
  $this->drawLine($X+$XOffset+$XSpace,floor($Y1),$X+$XOffset+$XSize-$XSpace,floor($Y1),$Line0Color);
  }
  }
 
  if ( $DisplayValues && $Serie["Data"][$Key] != VOID )
  {
  if ( $DisplayShadow ) { $this->Shadow = TRUE; }
 
  $Caption = $this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit);
  $TxtPos = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,90,$Caption);
  $TxtHeight = $TxtPos[0]["Y"] - $TxtPos[1]["Y"] + $TxtMargin;
 
  if ( $DisplayPos == LABEL_POS_INSIDE && abs($TxtHeight) < abs($BarHeight) )
  {
  $CenterX = (($X+$XOffset+$XSize-$XSpace)-($X+$XOffset+$XSpace))/2 + $X+$XOffset+$XSpace;
  $CenterY = ($Y2-$Y1)/2 + $Y1;
 
  $this->drawText($CenterX,$CenterY,$Caption,array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"Angle"=>90));
  }
  else
  {
  if ( $Serie["Data"][$Key] >= 0 ) { $Align = TEXT_ALIGN_BOTTOMMIDDLE; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_TOPMIDDLE; $Offset = -$DisplayOffset; }
  $this->drawText($X+$XOffset+$XSize/2,$Y2-$Offset,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align,"FontSize"=>$DisplaySize));
  }
 
  $this->Shadow = $RestoreShadow;
  }
  }
 
  $X = $X + $XStep;
  $ID++;
  }
  }
  else
  {
  if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; }
  if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; }
 
  if ( $XDivs == 0 ) { $YStep = 0; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }
 
  $Y = $this->GraphAreaY1 + $XMargin;
 
  if ( $AroundZero ) { $X1 = $YZero; } else { $X1 = $this->GraphAreaX1+1; }
  if ( $XDivs == 0 ) { $YSize = ($this->GraphAreaY2-$this->GraphAreaY1)/($SeriesCount+$Interleave); } else { $YSize = ($YStep / ($SeriesCount+$Interleave) ); }
 
  $YOffset = -($YSize*$SeriesCount)/2 + $CurrentSerie * $YSize;
  $this->DataSet->Data["Series"][$SerieName]["XOffset"] = $YOffset + $YSize / 2;
 
  if ( $Rounded || $BorderR != -1 ) { $YSpace = 1; } else { $YSpace = 0; }
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
 
  $ID = 0 ;
  foreach($PosArray as $Key => $X2)
  {
  if ( $Floating0Serie != NULL )
  {
  if ( isset($Data["Series"][$Floating0Serie]["Data"][$Key]) )
  $Value = $Data["Series"][$Floating0Serie]["Data"][$Key];
  else { $Value = 0; }
 
  $YZero = $this->scaleComputeY($Value,array("AxisID"=>$Serie["Axis"]));
  if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; }
  if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; }
  if ( $AroundZero ) { $X1 = $YZero; } else { $X1 = $this->GraphAreaX1+1; }
  }
 
  if ( $OverrideColors != NULL )
  { if ( isset($OverrideColors[$ID]) ) { $Color = array("R"=>$OverrideColors[$ID]["R"],"G"=>$OverrideColors[$ID]["G"],"B"=>$OverrideColors[$ID]["B"],"Alpha"=>$OverrideColors[$ID]["Alpha"],"BorderR"=>$OverrideColors[$ID]["BorderR"],"BorderG"=>$OverrideColors[$ID]["BorderG"],"BorderB"=>$OverrideColors[$ID]["BorderB"]); } else { $Color = $this->getRandomColor(); } }
 
  if ( $X2 != VOID )
  {
  $BarWidth = $X2 - $X1;
 
  if ( $Serie["Data"][$Key] == 0 )
  $this->drawLine($X1,$Y+$YOffset+$YSpace,$X1,$Y+$YOffset+$YSize-$YSpace,$Color);
  else
  {
  if ( $Rounded )
  $this->drawRoundedFilledRectangle($X1+1,$Y+$YOffset+$YSpace,$X2,$Y+$YOffset+$YSize-$YSpace,$RoundRadius,$Color);
  else
  {
  $this->drawFilledRectangle($X1,$Y+$YOffset+$YSpace,$X2,$Y+$YOffset+$YSize-$YSpace,$Color);
 
  if ( $Gradient )
  {
  $this->Shadow = FALSE;
 
  if ( $GradientMode == GRADIENT_SIMPLE )
  {
  if ( $Serie["Data"][$Key] >= 0 )
  $GradienColor = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha);
  else
  $GradienColor = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha);
 
  $this->drawGradientArea($X1,$Y+$YOffset+$YSpace,$X2,$Y+$YOffset+$YSize-$YSpace,DIRECTION_HORIZONTAL,$GradienColor);
  }
  elseif ( $GradientMode == GRADIENT_EFFECT_CAN )
  {
  $GradienColor1 = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha);
  $GradienColor2 = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha);
  $YSpan = floor($YSize / 3);
 
  $this->drawGradientArea($X1,$Y+$YOffset+$YSpace,$X2,$Y+$YOffset+$YSpan-$YSpace,DIRECTION_VERTICAL,$GradienColor1);
  $this->drawGradientArea($X1,$Y+$YOffset+$YSpan,$X2,$Y+$YOffset+$YSize-$YSpace,DIRECTION_VERTICAL,$GradienColor2);
  }
  $this->Shadow = $RestoreShadow;
  }
  }
 
  if ( $Draw0Line )
  {
  $Line0Color = array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20);
 
  if ( abs($X1 - $X2) > 3 ) { $Line0Width = 3; } else { $Line0Width = 1; }
  if ( $X2 - $X1 < 0 ) { $Line0Width = -$Line0Width; }
 
  $this->drawFilledRectangle(floor($X1),$Y+$YOffset+$YSpace,floor($X1)+$Line0Width,$Y+$YOffset+$YSize-$YSpace,$Line0Color);
  $this->drawLine(floor($X1),$Y+$YOffset+$YSpace,floor($X1),$Y+$YOffset+$YSize-$YSpace,$Line0Color);
  }
  }
 
  if ( $DisplayValues && $Serie["Data"][$Key] != VOID )
  {
  if ( $DisplayShadow ) { $this->Shadow = TRUE; }
 
  $Caption = $this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit);
  $TxtPos = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption);
  $TxtWidth = $TxtPos[1]["X"] - $TxtPos[0]["X"] + $TxtMargin;
 
  if ( $DisplayPos == LABEL_POS_INSIDE && abs($TxtWidth) < abs($BarWidth) )
  {
  $CenterX = ($X2-$X1)/2 + $X1;
  $CenterY = (($Y+$YOffset+$YSize-$YSpace)-($Y+$YOffset+$YSpace))/2 + ($Y+$YOffset+$YSpace);
 
  $this->drawText($CenterX,$CenterY,$Caption,array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize));
  }
  else
  {
  if ( $Serie["Data"][$Key] > 0 ) { $Align = TEXT_ALIGN_MIDDLELEFT; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_MIDDLERIGHT; $Offset = -$DisplayOffset; }
  $this->drawText($X2+$Offset,$Y+$YOffset+$YSize/2,$Caption,array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align,"FontSize"=>$DisplaySize));
  }
 
  $this->Shadow = $RestoreShadow;
  }
  }
  $Y = $Y + $YStep;
  $ID++;
  }
  }
  $CurrentSerie++;
  }
  }
  }
 
  /* Draw a bar chart */
  function drawStackedBarChart($Format=NULL)
  {
  $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE;
  $DisplayRound = isset($Format["DisplayRound"]) ? $Format["DisplayRound"] : 0;
  $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;
  $DisplayFont = isset($Format["DisplayFont"]) ? $Format["DisplayFont"] : $this->FontName;
  $DisplaySize = isset($Format["DisplaySize"]) ? $Format["DisplaySize"] : $this->FontSize;
  $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0;
  $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0;
  $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0;
  $Interleave = isset($Format["Interleave"]) ? $Format["Interleave"] : .5;
  $Rounded = isset($Format["Rounded"]) ? $Format["Rounded"] : FALSE;
  $RoundRadius = isset($Format["RoundRadius"]) ? $Format["RoundRadius"] : 4;
  $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : -1;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : -1;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : -1;
  $Gradient = isset($Format["Gradient"]) ? $Format["Gradient"] : FALSE;
  $GradientMode = isset($Format["GradientMode"]) ? $Format["GradientMode"] : GRADIENT_SIMPLE;
  $GradientAlpha = isset($Format["GradientAlpha"]) ? $Format["GradientAlpha"] : 20;
  $GradientStartR = isset($Format["GradientStartR"]) ? $Format["GradientStartR"] : 255;
  $GradientStartG = isset($Format["GradientStartG"]) ? $Format["GradientStartG"] : 255;
  $GradientStartB = isset($Format["GradientStartB"]) ? $Format["GradientStartB"] : 255;
  $GradientEndR = isset($Format["GradientEndR"]) ? $Format["GradientEndR"] : 0;
  $GradientEndG = isset($Format["GradientEndG"]) ? $Format["GradientEndG"] : 0;
  $GradientEndB = isset($Format["GradientEndB"]) ? $Format["GradientEndB"] : 0;
 
  $Data = $this->DataSet->getData();
  list($XMargin,$XDivs) = $this->scaleGetXSettings();
 
  $RestoreShadow = $this->Shadow;
 
  $LastX = ""; $LastY = "";
  foreach($Data["Series"] as $SerieName => $Serie)
  {
  if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )
  {
  $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"];
  if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = 255; $DisplayG = 255; $DisplayB = 255; }
  if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; }
 
  $AxisID = $Serie["Axis"];
  $Mode = $Data["Axis"][$AxisID]["Display"];
  $Format = $Data["Axis"][$AxisID]["Format"];
  $Unit = $Data["Axis"][$AxisID]["Unit"];
 
  $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]),TRUE);
  $YZero = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"]));
 
  $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0;
 
  $Color = array("TransCorner"=>TRUE,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB);
 
  if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )
  {
  if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; }
  if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; }
 
  if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }
  $X = $this->GraphAreaX1 + $XMargin;
 
  $XSize = ($XStep / (1+$Interleave) );
  $XOffset = -($XSize/2);
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
  foreach($PosArray as $Key => $Height)
  {
  if ( $Height != VOID && $Serie["Data"][$Key] != 0 )
  {
  if ( $Serie["Data"][$Key] > 0 ) { $Pos = "+"; } else { $Pos = "-"; }
 
  if ( !isset($LastY[$Key] ) ) { $LastY[$Key] = ""; }
  if ( !isset($LastY[$Key][$Pos] ) ) { $LastY[$Key][$Pos] = $YZero; }
 
  $Y1 = $LastY[$Key][$Pos];
  $Y2 = $Y1 - $Height;
 
  if ( ($Rounded || $BorderR != -1) && ($Pos == "+" && $Y1 != $YZero) ) { $YSpaceUp = 1; } else { $YSpaceUp = 0; }
  if ( ($Rounded || $BorderR != -1) && ($Pos == "-" && $Y1 != $YZero) ) { $YSpaceDown = 1; } else { $YSpaceDown = 0; }
 
  if ( $Rounded )
  $this->drawRoundedFilledRectangle($X+$XOffset,$Y1-$YSpaceUp+$YSpaceDown,$X+$XOffset+$XSize,$Y2,$RoundRadius,$Color);
  else
  {
  $this->drawFilledRectangle($X+$XOffset,$Y1-$YSpaceUp+$YSpaceDown,$X+$XOffset+$XSize,$Y2,$Color);
 
  if ( $Gradient )
  {
  $this->Shadow = FALSE;
 
  if ( $GradientMode == GRADIENT_SIMPLE )
  {
  $GradientColor = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha);
  $this->drawGradientArea($X+$XOffset-.5,$Y1-.5-$YSpaceUp+$YSpaceDown,$X+$XOffset+$XSize,$Y2+.5,DIRECTION_VERTICAL,$GradientColor);
  }
  elseif ( $GradientMode == GRADIENT_EFFECT_CAN )
  {
  $GradientColor1 = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha);
  $GradientColor2 = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha);
  $XSpan = floor($XSize / 3);
 
  $this->drawGradientArea($X+$XOffset-.5,$Y1-.5-$YSpaceUp+$YSpaceDown,$X+$XOffset+$XSpan,$Y2+.5,DIRECTION_HORIZONTAL,$GradientColor1);
  $this->drawGradientArea($X+$XSpan+$XOffset-.5,$Y1-.5-$YSpaceUp+$YSpaceDown,$X+$XOffset+$XSize,$Y2+.5,DIRECTION_HORIZONTAL,$GradientColor2);
  }
  $this->Shadow = $RestoreShadow;
  }
  }
 
  if ( $DisplayValues )
  {
  $BarHeight = abs($Y2-$Y1);
 
  $Caption = $this->scaleFormat(round($Serie["Data"][$Key],$DisplayRound),$Mode,$Format,$Unit);
  $TxtPos = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption);
  $TxtHeight = abs($TxtPos[2]["Y"] - $TxtPos[0]["Y"]);
 
  if ( $BarHeight > $TxtHeight )
  {
  $XCenter = ( ($X+$XOffset+$XSize) - ($X+$XOffset) ) / 2 + $X+$XOffset;
  $YCenter = ( ($Y2) - ($Y1-$YSpaceUp+$YSpaceDown) ) / 2 + $Y1-$YSpaceUp+$YSpaceDown;
 
  $this->drawText($XCenter,$YCenter,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont));
  }
  }
 
  $LastY[$Key][$Pos] = $Y2;
  }
 
  $X = $X + $XStep;
  }
  }
  else
  {
  if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; }
  if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; }
 
  if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }
  $Y = $this->GraphAreaY1 + $XMargin;
 
  $YSize = $YStep / (1+$Interleave);
  $YOffset = -($YSize/2);
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
  foreach($PosArray as $Key => $Width)
  {
  if ( $Width != VOID && $Serie["Data"][$Key] != 0 )
  {
  if ( $Serie["Data"][$Key] > 0 ) { $Pos = "+"; } else { $Pos = "-"; }
 
  if ( !isset($LastX[$Key] ) ) { $LastX[$Key] = ""; }
  if ( !isset($LastX[$Key][$Pos] ) ) { $LastX[$Key][$Pos] = $YZero; }
 
  $X1 = $LastX[$Key][$Pos];
  $X2 = $X1 + $Width;
 
  if ( ($Rounded || $BorderR != -1) && ($Pos == "+" && $X1 != $YZero) ) { $XSpaceLeft = 2; } else { $XSpaceLeft = 0; }
  if ( ($Rounded || $BorderR != -1) && ($Pos == "-" && $X1 != $YZero) ) { $XSpaceRight = 2; } else { $XSpaceRight = 0; }
 
  if ( $Rounded )
  $this->drawRoundedFilledRectangle($X1+$XSpaceLeft,$Y+$YOffset,$X2-$XSpaceRight,$Y+$YOffset+$YSize,$RoundRadius,$Color);
  else
  {
  $this->drawFilledRectangle($X1+$XSpaceLeft,$Y+$YOffset,$X2-$XSpaceRight,$Y+$YOffset+$YSize,$Color);
 
  if ( $Gradient )
  {
  $this->Shadow = FALSE;
 
  if ( $GradientMode == GRADIENT_SIMPLE )
  {
  $GradientColor = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha);
  $this->drawGradientArea($X1+$XSpaceLeft,$Y+$YOffset,$X2-$XSpaceRight,$Y+$YOffset+$YSize,DIRECTION_HORIZONTAL,$GradientColor);
  }
  elseif ( $GradientMode == GRADIENT_EFFECT_CAN )
  {
  $GradientColor1 = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha);
  $GradientColor2 = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha);
  $YSpan = floor($YSize / 3);
 
  $this->drawGradientArea($X1+$XSpaceLeft,$Y+$YOffset,$X2-$XSpaceRight,$Y+$YOffset+$YSpan,DIRECTION_VERTICAL,$GradientColor1);
  $this->drawGradientArea($X1+$XSpaceLeft,$Y+$YOffset+$YSpan,$X2-$XSpaceRight,$Y+$YOffset+$YSize,DIRECTION_VERTICAL,$GradientColor2);
  }
  $this->Shadow = $RestoreShadow;
  }
  }
 
  if ( $DisplayValues )
  {
  $BarWidth = abs($X2-$X1);
 
  $Caption = $this->scaleFormat(round($Serie["Data"][$Key],$DisplayRound),$Mode,$Format,$Unit);
  $TxtPos = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption);
  $TxtWidth = abs($TxtPos[1]["X"] - $TxtPos[0]["X"]);
 
  if ( $BarWidth > $TxtWidth )
  {
  $XCenter = ( $X2 - $X1 ) / 2 + $X1;
  $YCenter = ( ($Y+$YOffset+$YSize) - ($Y+$YOffset) ) / 2 + $Y+$YOffset;
 
  $this->drawText($XCenter,$YCenter,$Caption,array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont));
  }
  }
 
  $LastX[$Key][$Pos] = $X2;
  }
 
  $Y = $Y + $YStep;
  }
  }
  }
  }
  }
 
  /* Draw a bar chart */
  function drawStackedAreaChart($Format=NULL)
  {
  $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE;
  $DisplayRound = isset($Format["DisplayRound"]) ? $Format["DisplayRound"] : 0;
  $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL;
  $DisplayFont = isset($Format["DisplayFont"]) ? $Format["DisplayFont"] : $this->FontName;
  $DisplaySize = isset($Format["DisplaySize"]) ? $Format["DisplaySize"] : $this->FontSize;
  $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0;
  $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0;
  $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0;
  $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : -1;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : -1;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : -1;
  $ForceTransparency = isset($Format["ForceTransparency"]) ? $Format["ForceTransparency"] : 80;
 
  $Data = $this->DataSet->getData();
  list($XMargin,$XDivs) = $this->scaleGetXSettings();
 
  $RestoreShadow = $this->Shadow;
 
  /* Determine if we only have positive or negatives values */
  $Sign["+"] = 0; $Sign["-"] = 0;
  foreach($Data["Series"] as $SerieName => $Serie)
  {
  if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )
  { foreach($Serie["Data"] as $Key => $Value) { if ($Value > 0) { $Sign["+"]++; } elseif ($Value < 0) { $Sign["-"]++; } } }
  }
  if ( $Sign["+"] == 0 || $Sign["-"] == 0 ) { $SingleWay = TRUE; } else { $SingleWay = FALSE; }
 
  $LastX = ""; $LastY = "";
  foreach($Data["Series"] as $SerieName => $Serie)
  {
  if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )
  {
  $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"];
 
  if ( $ForceTransparency != NULL ) { $Alpha = $ForceTransparency; }
  if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = 255; $DisplayG = 255; $DisplayB = 255; }
  if ( $Surrounding != NULL )
  { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; }
  else
  { $BorderR = $R; $BorderG = $G; $BorderB = $B; }
 
  $AxisID = $Serie["Axis"];
  $Mode = $Data["Axis"][$AxisID]["Display"];
  $Format = $Data["Axis"][$AxisID]["Format"];
  $Unit = $Data["Axis"][$AxisID]["Unit"];
 
  $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]),TRUE);
  $YZero = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"]));
 
  $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0;
 
  if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )
  {
  if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; }
  if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; }
 
  $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB,"SkipY"=>$YZero);
 
  if ( $SingleWay ) { unset($Color["SkipY"]); }
 
  if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }
  $X = $this->GraphAreaX1 + $XMargin;
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
 
  $PointsTop = ""; $PointsBottom = ""; $Labels = ""; $Pos = "+";
  foreach($PosArray as $Key => $Height)
  {
  if ( !isset($LastY[$Key] ) ) { $LastY[$Key] = ""; }
  if ( !isset($LastY[$Key][$Pos] ) ) { $LastY[$Key][$Pos] = $YZero; }
 
  if ( $Height != VOID && $Serie["Data"][$Key] >= 0)
  {
  $Y1 = $LastY[$Key][$Pos];
  $Y2 = $Y1 - $Height;
 
  $PointsTop[] = $X; $PointsTop[] = $Y2;
  $PointsBottom[] = $X; $PointsBottom[] = $Y1;
 
  if ( $DisplayValues )
  {
  $BarHeight = abs($Y2-$Y1);
 
  $Caption = $this->scaleFormat(round($Serie["Data"][$Key],$DisplayRound),$Mode,$Format,$Unit);
  $TxtPos = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption);
  $TxtHeight = abs($TxtPos[2]["Y"] - $TxtPos[0]["Y"]);
 
  if ( $BarHeight > $TxtHeight )
  {
  $XCenter = $X;
  $YCenter = $Y1- $BarHeight / 2;
 
  $Labels[] = array($XCenter,$YCenter,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont));
  }
  }
 
  $LastY[$Key][$Pos] = $Y2;
  }
  else
  { $PointsTop[] = $X; $PointsTop[] = $LastY[$Key][$Pos]; $PointsBottom[] = $X; $PointsBottom[] = $LastY[$Key][$Pos]; }
 
  $X = $X + $XStep;
  }
  $Points = $PointsTop;
  for($i=count($PointsBottom)-2;$i>=0;$i-=2) { $Points[] = $PointsBottom[$i]; $Points[] = $PointsBottom[$i+1]; }
  $this->drawPolygon($Points,$Color);
 
  /* Reset the X axis parser for the negative values pass */
  $X = $this->GraphAreaX1 + $XMargin;
 
  $PointsTop = ""; $PointsBottom = ""; $Pos = "-";
  foreach($PosArray as $Key => $Height)
  {
  if ( !isset($LastY[$Key] ) ) { $LastY[$Key] = ""; }
  if ( !isset($LastY[$Key][$Pos] ) ) { $LastY[$Key][$Pos] = $YZero; }
 
  if ( $Height != VOID && $Serie["Data"][$Key] < 0)
  {
  $Y1 = $LastY[$Key][$Pos];
  $Y2 = $Y1 - $Height;
 
  $PointsTop[] = $X; $PointsTop[] = $Y2;
  $PointsBottom[] = $X; $PointsBottom[] = $Y1;
 
  if ( $DisplayValues )
  {
  $BarHeight = abs($Y2-$Y1);
 
  $Caption = $this->scaleFormat(round($Serie["Data"][$Key],$DisplayRound),$Mode,$Format,$Unit);
  $TxtPos = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption);
  $TxtHeight = abs($TxtPos[2]["Y"] - $TxtPos[0]["Y"]);
 
  if ( $BarHeight > $TxtHeight )
  {
  $XCenter = $X;
  $YCenter = $BarHeight / 2 + $Y1;
 
  $Labels[] = array($XCenter,$YCenter,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont));
  }
  }
 
  $LastY[$Key][$Pos] = $Y2;
  }
  else
  { $PointsTop[] = $X; $PointsTop[] = $LastY[$Key][$Pos]; $PointsBottom[] = $X; $PointsBottom[] = $LastY[$Key][$Pos]; }
 
  $X = $X + $XStep;
  }
  $Points = $PointsTop;
  for($i=count($PointsBottom)-2;$i>=0;$i-=2) { $Points[] = $PointsBottom[$i]; $Points[] = $PointsBottom[$i+1]; }
  $this->drawPolygon($Points,$Color);
 
  if ( $DisplayValues ) { foreach($Labels as $Key => $Value) { $this->drawText($Value[0],$Value[1],$Value[2],$Value[3]);} }
  }
  else
  {
  if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; }
  if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; }
 
  $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB,"SkipX"=>$YZero);
 
  if ( $SingleWay ) { unset($Color["SkipX"]); }
 
  if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }
  $Y = $this->GraphAreaY1 + $XMargin;
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
 
  $PointsTop = ""; $PointsBottom = ""; $Labels = ""; $Pos = "+";
  foreach($PosArray as $Key => $Width)
  {
  if ( !isset($LastX[$Key] ) ) { $LastX[$Key] = ""; }
  if ( !isset($LastX[$Key][$Pos] ) ) { $LastX[$Key][$Pos] = $YZero; }
 
  if ( $Width != VOID && $Serie["Data"][$Key] >= 0)
  {
  $X1 = $LastX[$Key][$Pos];
  $X2 = $X1 + $Width;
 
  $PointsTop[] = $X1; $PointsTop[] = $Y;
  $PointsBottom[] = $X2; $PointsBottom[] = $Y;
 
  if ( $DisplayValues )
  {
  $BarWidth = abs($X2-$X1);
 
  $Caption = $this->scaleFormat(round($Serie["Data"][$Key],$DisplayRound),$Mode,$Format,$Unit);
  $TxtPos = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption);
  $TxtWidth = abs($TxtPos[1]["X"] - $TxtPos[0]["X"]);
 
  if ( $BarWidth > $TxtWidth )
  {
  $XCenter = $X1 + $BarWidth / 2;
  $YCenter = $Y;
 
  $Labels[] = array($XCenter,$YCenter,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont));
  }
  }
 
  $LastX[$Key][$Pos] = $X2;
  }
  else
  { $PointsTop[] = $LastX[$Key][$Pos]; $PointsTop[] = $Y; $PointsBottom[] = $LastX[$Key][$Pos]; $PointsBottom[] = $Y; }
 
  $Y = $Y + $YStep;
  }
  $Points = $PointsTop;
  for($i=count($PointsBottom)-2;$i>=0;$i-=2) { $Points[] = $PointsBottom[$i]; $Points[] = $PointsBottom[$i+1]; }
  $this->drawPolygon($Points,$Color);
 
 
  /* Reset the X axis parser for the negative values pass */
  $Y = $this->GraphAreaY1 + $XMargin;
 
 
  $PointsTop = ""; $PointsBottom = ""; $Pos = "-";
  foreach($PosArray as $Key => $Width)
  {
  if ( !isset($LastX[$Key] ) ) { $LastX[$Key] = ""; }
  if ( !isset($LastX[$Key][$Pos] ) ) { $LastX[$Key][$Pos] = $YZero; }
 
  if ( $Width != VOID && $Serie["Data"][$Key] < 0)
  {
  $X1 = $LastX[$Key][$Pos];
  $X2 = $X1 + $Width;
 
  $PointsTop[] = $X1; $PointsTop[] = $Y;
  $PointsBottom[] = $X2; $PointsBottom[] = $Y;
 
  if ( $DisplayValues )
  {
  $BarWidth = abs($X2-$X1);
 
  $Caption = $this->scaleFormat(round($Serie["Data"][$Key],$DisplayRound),$Mode,$Format,$Unit);
  $TxtPos = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption);
  $TxtWidth = abs($TxtPos[1]["X"] - $TxtPos[0]["X"]);
 
  if ( $BarWidth > $TxtWidth )
  {
  $XCenter = $X1 - $BarWidth / 2;
  $YCenter = $Y;
 
  $Labels[] = array($XCenter,$YCenter,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont));
  }
  }
 
  $LastX[$Key][$Pos] = $X2;
  }
  else
  { $PointsTop[] = $LastX[$Key][$Pos]; $PointsTop[] = $Y; $PointsBottom[] = $LastX[$Key][$Pos]; $PointsBottom[] = $Y; }
 
  $Y = $Y + $YStep;
  }
  $Points = $PointsTop;
  for($i=count($PointsBottom)-2;$i>=0;$i-=2) { $Points[] = $PointsBottom[$i]; $Points[] = $PointsBottom[$i+1]; }
  $this->drawPolygon($Points,$Color);
 
  if ( $DisplayValues ) { foreach($Labels as $Key => $Value) { $this->drawText($Value[0],$Value[1],$Value[2],$Value[3]);} }
  }
  }
  }
  }
 
  /* Returns a random color */
  function getRandomColor($Alpha=100)
  { return(array("R"=>rand(0,255),"G"=>rand(0,255),"B"=>rand(0,255),"Alpha"=>$Alpha)); }
 
  /* Validate a palette */
  function validatePalette($Colors,$Surrounding=NULL)
  {
  $Result = "";
 
  if ( !is_array($Colors) ) { return($this->getRandomColor()); }
 
  foreach($Colors as $Key => $Values)
  {
  if ( isset($Values["R"]) ) { $Result[$Key]["R"] = $Values["R"]; } else { $Result[$Key]["R"] = rand(0,255); }
  if ( isset($Values["G"]) ) { $Result[$Key]["G"] = $Values["G"]; } else { $Result[$Key]["G"] = rand(0,255); }
  if ( isset($Values["B"]) ) { $Result[$Key]["B"] = $Values["B"]; } else { $Result[$Key]["B"] = rand(0,255); }
  if ( isset($Values["Alpha"]) ) { $Result[$Key]["Alpha"] = $Values["Alpha"]; } else { $Result[$Key]["Alpha"] = 100; }
 
  if ( $Surrounding != NULL )
  {
  $Result[$Key]["BorderR"] = $Result[$Key]["R"] + $Surrounding;
  $Result[$Key]["BorderG"] = $Result[$Key]["G"] + $Surrounding;
  $Result[$Key]["BorderB"] = $Result[$Key]["B"] + $Surrounding;
  }
  else
  {
  if ( isset($Values["BorderR"]) ) { $Result[$Key]["BorderR"] = $Values["BorderR"]; } else { $Result[$Key]["BorderR"] = $Result[$Key]["R"]; }
  if ( isset($Values["BorderG"]) ) { $Result[$Key]["BorderG"] = $Values["BorderG"]; } else { $Result[$Key]["BorderG"] = $Result[$Key]["G"]; }
  if ( isset($Values["BorderB"]) ) { $Result[$Key]["BorderB"] = $Values["BorderB"]; } else { $Result[$Key]["BorderB"] = $Result[$Key]["B"]; }
  if ( isset($Values["BorderAlpha"]) ) { $Result[$Key]["BorderAlpha"] = $Values["BorderAlpha"]; } else { $Result[$Key]["BorderAlpha"] = $Result[$Key]["Alpha"]; }
  }
  }
 
  return($Result);
  }
 
  /* Draw the derivative chart associated to the data series */
  function drawDerivative($Format=NULL)
  {
  $Offset = isset($Format["Offset"]) ? $Format["Offset"] : 10;
  $SerieSpacing = isset($Format["SerieSpacing"]) ? $Format["SerieSpacing"] : 3;
  $DerivativeHeight = isset($Format["DerivativeHeight"]) ? $Format["DerivativeHeight"] : 4;
  $ShadedSlopeBox = isset($Format["ShadedSlopeBox"]) ? $Format["ShadedSlopeBox"] : FALSE;
  $DrawBackground = isset($Format["DrawBackground"]) ? $Format["DrawBackground"] : TRUE;
  $BackgroundR = isset($Format["BackgroundR"]) ? $Format["BackgroundR"] : 255;
  $BackgroundG = isset($Format["BackgroundG"]) ? $Format["BackgroundG"] : 255;
  $BackgroundB = isset($Format["BackgroundB"]) ? $Format["BackgroundB"] : 255;
  $BackgroundAlpha = isset($Format["BackgroundAlpha"]) ? $Format["BackgroundAlpha"] : 20;
  $DrawBorder = isset($Format["DrawBorder"]) ? $Format["DrawBorder"] : TRUE;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 0;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 0;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 0;
  $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : 100;
  $Caption = isset($Format["Caption"]) ? $Format["Caption"] : TRUE;
  $CaptionHeight = isset($Format["CaptionHeight"]) ? $Format["CaptionHeight"] : 10;
  $CaptionWidth = isset($Format["CaptionWidth"]) ? $Format["CaptionWidth"] : 20;
  $CaptionMargin = isset($Format["CaptionMargin"]) ? $Format["CaptionMargin"] : 4;
  $CaptionLine = isset($Format["CaptionLine"]) ? $Format["CaptionLine"] : FALSE;
  $CaptionBox = isset($Format["CaptionBox"]) ? $Format["CaptionBox"] : FALSE;
  $CaptionBorderR = isset($Format["CaptionBorderR"]) ? $Format["CaptionBorderR"] : 0;
  $CaptionBorderG = isset($Format["CaptionBorderG"]) ? $Format["CaptionBorderG"] : 0;
  $CaptionBorderB = isset($Format["CaptionBorderB"]) ? $Format["CaptionBorderB"] : 0;
  $CaptionFillR = isset($Format["CaptionFillR"]) ? $Format["CaptionFillR"] : 255;
  $CaptionFillG = isset($Format["CaptionFillG"]) ? $Format["CaptionFillG"] : 255;
  $CaptionFillB = isset($Format["CaptionFillB"]) ? $Format["CaptionFillB"] : 255;
  $CaptionFillAlpha = isset($Format["CaptionFillAlpha"]) ? $Format["CaptionFillAlpha"] : 80;
  $PositiveSlopeStartR = isset($Format["PositiveSlopeStartR"]) ? $Format["PositiveSlopeStartR"] : 184;
  $PositiveSlopeStartG = isset($Format["PositiveSlopeStartG"]) ? $Format["PositiveSlopeStartG"] : 234;
  $PositiveSlopeStartB = isset($Format["PositiveSlopeStartB"]) ? $Format["PositiveSlopeStartB"] : 88;
  $PositiveSlopeEndR = isset($Format["PositiveSlopeStartR"]) ? $Format["PositiveSlopeStartR"] : 239;
  $PositiveSlopeEndG = isset($Format["PositiveSlopeStartG"]) ? $Format["PositiveSlopeStartG"] : 31;
  $PositiveSlopeEndB = isset($Format["PositiveSlopeStartB"]) ? $Format["PositiveSlopeStartB"] : 36;
  $NegativeSlopeStartR = isset($Format["NegativeSlopeStartR"]) ? $Format["NegativeSlopeStartR"] : 184;
  $NegativeSlopeStartG = isset($Format["NegativeSlopeStartG"]) ? $Format["NegativeSlopeStartG"] : 234;
  $NegativeSlopeStartB = isset($Format["NegativeSlopeStartB"]) ? $Format["NegativeSlopeStartB"] : 88;
  $NegativeSlopeEndR = isset($Format["NegativeSlopeStartR"]) ? $Format["NegativeSlopeStartR"] : 67;
  $NegativeSlopeEndG = isset($Format["NegativeSlopeStartG"]) ? $Format["NegativeSlopeStartG"] : 124;
  $NegativeSlopeEndB = isset($Format["NegativeSlopeStartB"]) ? $Format["NegativeSlopeStartB"] : 227;
 
  $Data = $this->DataSet->getData();
 
  list($XMargin,$XDivs) = $this->scaleGetXSettings();
 
  if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )
  $YPos = $this->DataSet->Data["GraphArea"]["Y2"] + $Offset;
  else
  $XPos = $this->DataSet->Data["GraphArea"]["X2"] + $Offset;
 
  foreach($Data["Series"] as $SerieName => $Serie)
  {
  if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )
  {
  $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"];
 
  $AxisID = $Serie["Axis"];
  $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));
 
  if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )
  {
  if ( $Caption )
  {
  if ( $CaptionLine )
  {
  $StartX = floor($this->GraphAreaX1-$CaptionWidth+$XMargin-$CaptionMargin);
  $EndX = floor($this->GraphAreaX1-$CaptionMargin+$XMargin);
 
  $CaptionSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight);
  if ( $CaptionBox ) { $this->drawFilledRectangle($StartX,$YPos,$EndX,$YPos+$CaptionHeight,array("R"=>$CaptionFillR,"G"=>$CaptionFillG,"B"=>$CaptionFillB,"BorderR"=>$CaptionBorderR,"BorderG"=>$CaptionBorderG,"BorderB"=>$CaptionBorderB,"Alpha"=>$CaptionFillAlpha)); }
  $this->drawLine($StartX+2,$YPos+($CaptionHeight/2),$EndX-2,$YPos+($CaptionHeight/2),$CaptionSettings);
  }
  else
  $this->drawFilledRectangle($this->GraphAreaX1-$CaptionWidth+$XMargin-$CaptionMargin,$YPos,$this->GraphAreaX1-$CaptionMargin+$XMargin,$YPos+$CaptionHeight,array("R"=>$R,"G"=>$G,"B"=>$B,"BorderR"=>$CaptionBorderR,"BorderG"=>$CaptionBorderG,"BorderB"=>$CaptionBorderB));
  }
 
  if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }
  $X = $this->GraphAreaX1 + $XMargin;
 
  $TopY = $YPos + ($CaptionHeight/2) - ($DerivativeHeight/2);
  $BottomY = $YPos + ($CaptionHeight/2) + ($DerivativeHeight/2);
 
  $StartX = floor($this->GraphAreaX1+$XMargin);
  $EndX = floor($this->GraphAreaX2-$XMargin);
 
  if ( $DrawBackground ) { $this->drawFilledRectangle($StartX-1,$TopY-1,$EndX+1,$BottomY+1,array("R"=>$BackgroundR,"G"=>$BackgroundG,"B"=>$BackgroundB,"Alpha"=>$BackgroundAlpha)); }
  if ( $DrawBorder ) { $this->drawRectangle($StartX-1,$TopY-1,$EndX+1,$BottomY+1,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha)); }
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
 
  $RestoreShadow = $this->Shadow;
  $this->Shadow = FALSE;
 
  /* Determine the Max slope index */
  $LastX = NULL; $LastY = NULL; $MinSlope = 0; $MaxSlope = 1;
  foreach($PosArray as $Key => $Y)
  {
  if ( $Y != VOID && $LastX != NULL )
  { $Slope = ($LastY - $Y); if ( $Slope > $MaxSlope ) { $MaxSlope = $Slope; } if ( $Slope < $MinSlope ) { $MinSlope = $Slope; } }
 
  if ( $Y == VOID )
  { $LastX = NULL; $LastY = NULL; }
  else
  { $LastX = $X; $LastY = $Y; }
  }
 
  $LastX = NULL; $LastY = NULL; $LastColor = NULL;
  foreach($PosArray as $Key => $Y)
  {
  if ( $Y != VOID && $LastY != NULL )
  {
  $Slope = ($LastY - $Y);
 
  if ( $Slope >= 0 )
  {
  $SlopeIndex = (100 / $MaxSlope) * $Slope;
  $R = (($PositiveSlopeEndR - $PositiveSlopeStartR)/100)*$SlopeIndex+$PositiveSlopeStartR;
  $G = (($PositiveSlopeEndG - $PositiveSlopeStartG)/100)*$SlopeIndex+$PositiveSlopeStartG;
  $B = (($PositiveSlopeEndB - $PositiveSlopeStartB)/100)*$SlopeIndex+$PositiveSlopeStartB;
  }
  elseif ( $Slope < 0 )
  {
  $SlopeIndex = (100 / abs($MinSlope)) * abs($Slope);
  $R = (($NegativeSlopeEndR - $NegativeSlopeStartR)/100)*$SlopeIndex+$NegativeSlopeStartR;
  $G = (($NegativeSlopeEndG - $NegativeSlopeStartG)/100)*$SlopeIndex+$NegativeSlopeStartG;
  $B = (($NegativeSlopeEndB - $NegativeSlopeStartB)/100)*$SlopeIndex+$NegativeSlopeStartB;
  }
 
  $Color = array("R"=>$R,"G"=>$G,"B"=>$B);
 
  if ( $ShadedSlopeBox && $LastColor != NULL ) // && $Slope != 0
  {
  $GradientSettings = array("StartR"=>$LastColor["R"],"StartG"=>$LastColor["G"],"StartB"=>$LastColor["B"],"EndR"=>$R,"EndG"=>$G,"EndB"=>$B);
  $this->drawGradientArea($LastX,$TopY,$X,$BottomY,DIRECTION_HORIZONTAL,$GradientSettings);
  }
  elseif ( !$ShadedSlopeBox || $LastColor == NULL ) // || $Slope == 0
  $this->drawFilledRectangle(floor($LastX),$TopY,floor($X),$BottomY,$Color);
 
  $LastColor = $Color;
  }
 
  if ( $Y == VOID )
  { $LastY = NULL; }
  else
  { $LastX = $X; $LastY = $Y; }
 
  $X = $X + $XStep;
  }
 
  $YPos = $YPos + $CaptionHeight + $SerieSpacing;
  }
  else
  {
  if ( $Caption )
  {
  $StartY = floor($this->GraphAreaY1-$CaptionWidth+$XMargin-$CaptionMargin);
  $EndY = floor($this->GraphAreaY1-$CaptionMargin+$XMargin);
  if ( $CaptionLine )
  {
  $CaptionSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight);
  if ( $CaptionBox ) { $this->drawFilledRectangle($XPos,$StartY,$XPos+$CaptionHeight,$EndY,array("R"=>$CaptionFillR,"G"=>$CaptionFillG,"B"=>$CaptionFillB,"BorderR"=>$CaptionBorderR,"BorderG"=>$CaptionBorderG,"BorderB"=>$CaptionBorderB,"Alpha"=>$CaptionFillAlpha)); }
  $this->drawLine($XPos+($CaptionHeight/2),$StartY+2,$XPos+($CaptionHeight/2),$EndY-2,$CaptionSettings);
  }
  else
  $this->drawFilledRectangle($XPos,$StartY,$XPos+$CaptionHeight,$EndY,array("R"=>$R,"G"=>$G,"B"=>$B,"BorderR"=>$CaptionBorderR,"BorderG"=>$CaptionBorderG,"BorderB"=>$CaptionBorderB));
  }
 
 
  if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $XStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }
  $Y = $this->GraphAreaY1 + $XMargin;
 
  $TopX = $XPos + ($CaptionHeight/2) - ($DerivativeHeight/2);
  $BottomX = $XPos + ($CaptionHeight/2) + ($DerivativeHeight/2);
 
  $StartY = floor($this->GraphAreaY1+$XMargin);
  $EndY = floor($this->GraphAreaY2-$XMargin);
 
  if ( $DrawBackground ) { $this->drawFilledRectangle($TopX-1,$StartY-1,$BottomX+1,$EndY+1,array("R"=>$BackgroundR,"G"=>$BackgroundG,"B"=>$BackgroundB,"Alpha"=>$BackgroundAlpha)); }
  if ( $DrawBorder ) { $this->drawRectangle($TopX-1,$StartY-1,$BottomX+1,$EndY+1,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha)); }
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
 
  $RestoreShadow = $this->Shadow;
  $this->Shadow = FALSE;
 
  /* Determine the Max slope index */
  $LastX = NULL; $LastY = NULL; $MinSlope = 0; $MaxSlope = 1;
  foreach($PosArray as $Key => $X)
  {
  if ( $X != VOID && $LastX != NULL )
  { $Slope = ($X - $LastX); if ( $Slope > $MaxSlope ) { $MaxSlope = $Slope; } if ( $Slope < $MinSlope ) { $MinSlope = $Slope; } }
 
  if ( $X == VOID )
  { $LastX = NULL; }
  else
  { $LastX = $X; }
  }
 
  $LastX = NULL; $LastY = NULL; $LastColor = NULL;
  foreach($PosArray as $Key => $X)
  {
  if ( $X != VOID && $LastX != NULL )
  {
  $Slope = ($X - $LastX);
 
  if ( $Slope >= 0 )
  {
  $SlopeIndex = (100 / $MaxSlope) * $Slope;
  $R = (($PositiveSlopeEndR - $PositiveSlopeStartR)/100)*$SlopeIndex+$PositiveSlopeStartR;
  $G = (($PositiveSlopeEndG - $PositiveSlopeStartG)/100)*$SlopeIndex+$PositiveSlopeStartG;
  $B = (($PositiveSlopeEndB - $PositiveSlopeStartB)/100)*$SlopeIndex+$PositiveSlopeStartB;
  }
  elseif ( $Slope < 0 )
  {
  $SlopeIndex = (100 / abs($MinSlope)) * abs($Slope);
  $R = (($NegativeSlopeEndR - $NegativeSlopeStartR)/100)*$SlopeIndex+$NegativeSlopeStartR;
  $G = (($NegativeSlopeEndG - $NegativeSlopeStartG)/100)*$SlopeIndex+$NegativeSlopeStartG;
  $B = (($NegativeSlopeEndB - $NegativeSlopeStartB)/100)*$SlopeIndex+$NegativeSlopeStartB;
  }
 
  $Color = array("R"=>$R,"G"=>$G,"B"=>$B);
 
  if ( $ShadedSlopeBox && $LastColor != NULL )
  {
  $GradientSettings = array("StartR"=>$LastColor["R"],"StartG"=>$LastColor["G"],"StartB"=>$LastColor["B"],"EndR"=>$R,"EndG"=>$G,"EndB"=>$B);
 
  $this->drawGradientArea($TopX,$LastY,$BottomX,$Y,DIRECTION_VERTICAL,$GradientSettings);
  }
  elseif ( !$ShadedSlopeBox || $LastColor == NULL )
  $this->drawFilledRectangle($TopX,floor($LastY),$BottomX,floor($Y),$Color);
 
  $LastColor = $Color;
  }
 
  if ( $X == VOID )
  { $LastX = NULL; }
  else
  { $LastX = $X; $LastY = $Y; }
 
  $Y = $Y + $XStep;
  }
 
  $XPos = $XPos + $CaptionHeight + $SerieSpacing;
  }
 
  $this->Shadow = $RestoreShadow;
  }
  }
  }
 
  /* Draw the line of best fit */
  function drawBestFit($Format="")
  {
  $Data = $this->DataSet->getData();
  list($XMargin,$XDivs) = $this->scaleGetXSettings();
 
  foreach($Data["Series"] as $SerieName => $Serie)
  {
  if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] )
  {
  $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"];
 
  $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight);
 
  $AxisID = $Serie["Axis"];
  $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]));
 
  if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )
  {
  if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; }
  $X = $this->GraphAreaX1 + $XMargin;
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
  $Sxy = 0; $Sx = 0; $Sy = 0; $Sxx = 0;
  foreach($PosArray as $Key => $Y)
  {
  $Sxy = $Sxy + $X*$Y;
  $Sx = $Sx + $X;
  $Sy = $Sy + $Y;
  $Sxx = $Sxx + $X*$X;
 
  $X = $X + $XStep;
  }
  $n = count($PosArray);
  $M = (($n*$Sxy)-($Sx*$Sy)) / (($n*$Sxx)-($Sx*$Sx));
  $B = (($Sy)-($M*$Sx))/($n);
 
  $X1 = $this->GraphAreaX1 + $XMargin;
  $Y1 = $M * $X1 + $B;
  $X2 = $this->GraphAreaX2 - $XMargin;
  $Y2 = $M * $X2 + $B;
 
  if ( $Y1 < $this->GraphAreaY1 ) { $X1 = $X1 + ($this->GraphAreaY1-$Y1); $Y1 = $this->GraphAreaY1; }
  if ( $Y1 > $this->GraphAreaY2 ) { $X1 = $X1 + ($Y1-$this->GraphAreaY2); $Y1 = $this->GraphAreaY2; }
  if ( $Y2 < $this->GraphAreaY1 ) { $X2 = $X2 - ($this->GraphAreaY1-$Y2); $Y2 = $this->GraphAreaY1; }
  if ( $Y2 > $this->GraphAreaY2 ) { $X2 = $X2 - ($Y2-$this->GraphAreaY2); $Y2 = $this->GraphAreaY2; }
 
  $this->drawLine($X1,$Y1,$X2,$Y2,$Color);
  }
  else
  {
  if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; }
  $Y = $this->GraphAreaY1 + $XMargin;
 
  if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; }
  $Sxy = 0; $Sx = 0; $Sy = 0; $Sxx = 0;
  foreach($PosArray as $Key => $X)
  {
  $Sxy = $Sxy + $X*$Y;
  $Sx = $Sx + $Y;
  $Sy = $Sy + $X;
  $Sxx = $Sxx + $Y*$Y;
 
  $Y = $Y + $YStep;
  }
  $n = count($PosArray);
  $M = (($n*$Sxy)-($Sx*$Sy)) / (($n*$Sxx)-($Sx*$Sx));
  $B = (($Sy)-($M*$Sx))/($n);
 
  $Y1 = $this->GraphAreaY1 + $XMargin;
  $X1 = $M * $Y1 + $B;
  $Y2 = $this->GraphAreaY2 - $XMargin;
  $X2 = $M * $Y2 + $B;
 
  if ( $X1 < $this->GraphAreaX1 ) { $Y1 = $Y1 + ($this->GraphAreaX1-$X1); $X1 = $this->GraphAreaX1; }
  if ( $X1 > $this->GraphAreaX2 ) { $Y1 = $Y1 + ($X1-$this->GraphAreaX2); $X1 = $this->GraphAreaX2; }
  if ( $X2 < $this->GraphAreaX1 ) { $Y2 = $Y2 - ($this->GraphAreaY1-$X2); $X2 = $this->GraphAreaX1; }
  if ( $X2 > $this->GraphAreaX2 ) { $Y2 = $Y2 - ($X2-$this->GraphAreaX2); $X2 = $this->GraphAreaX2; }
 
  $this->drawLine($X1,$Y1,$X2,$Y2,$Color);
  }
  }
  }
  }
  }
  ?>
  <?php
  /*
  pDraw - pChart core class
 
  Version : 2.1.0
  Made by : Jean-Damien POGOLOTTI
  Last Update : 26/01/11
 
  This file can be distributed under the license you can find at :
 
  http://www.pchart.net/license
 
  You can find the whole class documentation on the pChart web site.
  */
 
  /* The GD extension is mandatory */
  if (!extension_loaded('gd') && !extension_loaded('gd2'))
  {
  echo "GD extension must be loaded. \r\n";
  exit();
  }
 
  class pImage extends pDraw
  {
  /* Image settings, size, quality, .. */
  var $XSize = NULL; // Width of the picture
  var $YSize = NULL; // Height of the picture
  var $Picture = NULL; // GD picture object
  var $Antialias = TRUE; // Turn antialias on or off
  var $AntialiasQuality = 0; // Quality of the antialiasing implementation (0-1)
  var $Mask = ""; // Already drawn pixels mask (Filled circle implementation)
  var $TransparentBackground = FALSE; // Just to know if we need to flush the alpha channels when rendering
 
  /* Graph area settings */
  var $GraphAreaX1 = NULL; // Graph area X origin
  var $GraphAreaY1 = NULL; // Graph area Y origin
  var $GraphAreaX2 = NULL; // Graph area bottom right X position
  var $GraphAreaY2 = NULL; // Graph area bottom right Y position
 
  /* Scale settings */
  var $ScaleMinDivHeight = 20; // Minimum height for scame divs
 
  /* Font properties */
  var $FontName = "fonts/GeosansLight.ttf"; // Default font file
  var $FontSize = 12; // Default font size
  var $FontBox = NULL; // Return the bounding box of the last written string
  var $FontColorR = 0; // Default color settings
  var $FontColorG = 0; // Default color settings
  var $FontColorB = 0; // Default color settings
  var $FontColorA = 100; // Default transparency
 
  /* Shadow properties */
  var $Shadow = TRUE; // Turn shadows on or off
  var $ShadowX = NULL; // X Offset of the shadow
  var $ShadowY = NULL; // Y Offset of the shadow
  var $ShadowR = NULL; // R component of the shadow
  var $ShadowG = NULL; // G component of the shadow
  var $ShadowB = NULL; // B component of the shadow
  var $Shadowa = NULL; // Alpha level of the shadow
 
  /* Data Set */
  var $DataSet = NULL; // Attached dataset
 
  /* Class constructor */
  function pImage($XSize,$YSize,$DataSet=NULL,$TransparentBackground=FALSE)
  {
  $this->TransparentBackground = $TransparentBackground;
 
  if ( $DataSet != NULL ) { $this->DataSet = $DataSet; }
 
  $this->XSize = $XSize;
  $this->YSize = $YSize;
  $this->Picture = imagecreatetruecolor($XSize,$YSize);
 
  if ( $this->TransparentBackground )
  {
  imagealphablending($this->Picture,FALSE);
  imagefilledrectangle($this->Picture, 0,0,$XSize, $YSize, imagecolorallocatealpha($this->Picture, 255, 255, 255, 127));
  imagealphablending($this->Picture,TRUE);
  imagesavealpha($this->Picture,true);
  }
  else
  {
  $C_White = $this->AllocateColor($this->Picture,255,255,255);
  imagefilledrectangle($this->Picture,0,0,$XSize,$YSize,$C_White);
  }
  }
 
  /* Enable / Disable and set shadow properties */
  function setShadow($Enabled=TRUE,$Format="")
  {
  $X = isset($Format["X"]) ? $Format["X"] : 2;
  $Y = isset($Format["Y"]) ? $Format["Y"] : 2;
  $R = isset($Format["R"]) ? $Format["R"] : 0;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 10;
 
  $this->Shadow = $Enabled;
  $this->ShadowX = $X;
  $this->ShadowY = $Y;
  $this->ShadowR = $R;
  $this->ShadowG = $G;
  $this->ShadowB = $B;
  $this->Shadowa = $Alpha;
  }
 
  /* Set the graph area position */
  function setGraphArea($X1,$Y1,$X2,$Y2)
  {
  if ( $X2 < $X1 || $X1 == $X2 || $Y2 < $Y1 || $Y1 == $Y2 ) { return(-1); }
 
  $this->GraphAreaX1 = $X1; $this->DataSet->Data["GraphArea"]["X1"] = $X1;
  $this->GraphAreaY1 = $Y1; $this->DataSet->Data["GraphArea"]["Y1"] = $Y1;
  $this->GraphAreaX2 = $X2; $this->DataSet->Data["GraphArea"]["X2"] = $X2;
  $this->GraphAreaY2 = $Y2; $this->DataSet->Data["GraphArea"]["Y2"] = $Y2;
  }
 
  /* Return the width of the picture */
  function getWidth()
  { return($this->XSize); }
 
  /* Return the heigth of the picture */
  function getHeight()
  { return($this->YSize); }
 
  /* Render the picture to a file */
  function render($FileName)
  {
  if ( $this->TransparentBackground ) { imagealphablending($this->Picture,false); imagesavealpha($this->Picture,true); }
  imagepng($this->Picture,$FileName);
  }
 
  /* Render the picture to a web browser stream */
  function stroke()
  {
  if ( $this->TransparentBackground ) { imagealphablending($this->Picture,false); imagesavealpha($this->Picture,true); }
 
  header('Content-type: image/png');
  imagepng($this->Picture);
  }
 
  /* Automatic output method based on the calling interface */
  function autoOutput($FileName="output.png")
  {
  if (php_sapi_name() == "cli")
  $this->Render($FileName);
  else
  $this->Stroke();
  }
 
  /* Return the length between two points */
  function getLength($X1,$Y1,$X2,$Y2)
  { return(sqrt(pow(max($X1,$X2)-min($X1,$X2),2)+pow(max($Y1,$Y2)-min($Y1,$Y2),2))); }
 
  /* Return the orientation of a line */
  function getAngle($X1,$Y1,$X2,$Y2)
  {
  $Opposite = $Y2 - $Y1; $Adjacent = $X2 - $X1;$Angle = rad2deg(atan2($Opposite,$Adjacent));
  if ($Angle > 0) { return($Angle); } else { return(360-abs($Angle)); }
  }
 
  /* Return the surrounding box of text area */
  function getTextBox_deprecated($X,$Y,$FontName,$FontSize,$Angle,$Text)
  {
  $Size = imagettfbbox($FontSize,$Angle,$FontName,$Text);
  $Width = $this->getLength($Size[0],$Size[1],$Size[2],$Size[3])+1;
  $Height = $this->getLength($Size[2],$Size[3],$Size[4],$Size[5])+1;
 
  $RealPos[0]["X"] = $X; $RealPos[0]["Y"] = $Y;
  $RealPos[1]["X"] = cos((360-$Angle)*PI/180)*$Width + $RealPos[0]["X"]; $RealPos[1]["Y"] = sin((360-$Angle)*PI/180)*$Width + $RealPos[0]["Y"];
  $RealPos[2]["X"] = cos((270-$Angle)*PI/180)*$Height + $RealPos[1]["X"]; $RealPos[2]["Y"] = sin((270-$Angle)*PI/180)*$Height + $RealPos[1]["Y"];
  $RealPos[3]["X"] = cos((180-$Angle)*PI/180)*$Width + $RealPos[2]["X"]; $RealPos[3]["Y"] = sin((180-$Angle)*PI/180)*$Width + $RealPos[2]["Y"];
 
  $RealPos[TEXT_ALIGN_BOTTOMLEFT]["X"] = $RealPos[0]["X"]; $RealPos[TEXT_ALIGN_BOTTOMLEFT]["Y"] = $RealPos[0]["Y"];
  $RealPos[TEXT_ALIGN_BOTTOMRIGHT]["X"] = $RealPos[1]["X"]; $RealPos[TEXT_ALIGN_BOTTOMRIGHT]["Y"] = $RealPos[1]["Y"];
 
  return($RealPos);
  }
 
  /* Return the surrounding box of text area */
  function getTextBox($X,$Y,$FontName,$FontSize,$Angle,$Text)
  {
  $coords = imagettfbbox($FontSize, 0, $FontName, $Text);
 
  $a = deg2rad($Angle); $ca = cos($a); $sa = sin($a); $RealPos = array();
  for($i = 0; $i < 7; $i += 2)
  {
  $RealPos[$i/2]["X"] = $X + round($coords[$i] * $ca + $coords[$i+1] * $sa);
  $RealPos[$i/2]["Y"] = $Y + round($coords[$i+1] * $ca - $coords[$i] * $sa);
  }
 
  $RealPos[TEXT_ALIGN_BOTTOMLEFT]["X"] = $RealPos[0]["X"]; $RealPos[TEXT_ALIGN_BOTTOMLEFT]["Y"] = $RealPos[0]["Y"];
  $RealPos[TEXT_ALIGN_BOTTOMRIGHT]["X"] = $RealPos[1]["X"]; $RealPos[TEXT_ALIGN_BOTTOMRIGHT]["Y"] = $RealPos[1]["Y"];
  $RealPos[TEXT_ALIGN_TOPLEFT]["X"] = $RealPos[3]["X"]; $RealPos[TEXT_ALIGN_TOPLEFT]["Y"] = $RealPos[3]["Y"];
  $RealPos[TEXT_ALIGN_TOPRIGHT]["X"] = $RealPos[2]["X"]; $RealPos[TEXT_ALIGN_TOPRIGHT]["Y"] = $RealPos[2]["Y"];
  $RealPos[TEXT_ALIGN_BOTTOMMIDDLE]["X"] = ($RealPos[1]["X"]-$RealPos[0]["X"])/2+$RealPos[0]["X"]; $RealPos[TEXT_ALIGN_BOTTOMMIDDLE]["Y"] = ($RealPos[0]["Y"]-$RealPos[1]["Y"])/2+$RealPos[1]["Y"];
  $RealPos[TEXT_ALIGN_TOPMIDDLE]["X"] = ($RealPos[2]["X"]-$RealPos[3]["X"])/2+$RealPos[3]["X"]; $RealPos[TEXT_ALIGN_TOPMIDDLE]["Y"] = ($RealPos[3]["Y"]-$RealPos[2]["Y"])/2+$RealPos[2]["Y"];
  $RealPos[TEXT_ALIGN_MIDDLELEFT]["X"] = ($RealPos[0]["X"]-$RealPos[3]["X"])/2+$RealPos[3]["X"]; $RealPos[TEXT_ALIGN_MIDDLELEFT]["Y"] = ($RealPos[0]["Y"]-$RealPos[3]["Y"])/2+$RealPos[3]["Y"];
  $RealPos[TEXT_ALIGN_MIDDLERIGHT]["X"] = ($RealPos[1]["X"]-$RealPos[2]["X"])/2+$RealPos[2]["X"]; $RealPos[TEXT_ALIGN_MIDDLERIGHT]["Y"] = ($RealPos[1]["Y"]-$RealPos[2]["Y"])/2+$RealPos[2]["Y"];
  $RealPos[TEXT_ALIGN_MIDDLEMIDDLE]["X"] = ($RealPos[1]["X"]-$RealPos[3]["X"])/2+$RealPos[3]["X"]; $RealPos[TEXT_ALIGN_MIDDLEMIDDLE]["Y"] = ($RealPos[0]["Y"]-$RealPos[2]["Y"])/2+$RealPos[2]["Y"];
 
  return($RealPos);
  }
 
  /* Set current font properties */
  function setFontProperties($Format="")
  {
  $R = isset($Format["R"]) ? $Format["R"] : -1;
  $G = isset($Format["G"]) ? $Format["G"] : -1;
  $B = isset($Format["B"]) ? $Format["B"] : -1;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
  $FontName = isset($Format["FontName"]) ? $Format["FontName"] : NULL;
  $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : NULL;
 
  if ( $R != -1) { $this->FontColorR = $R; }
  if ( $G != -1) { $this->FontColorG = $G; }
  if ( $B != -1) { $this->FontColorB = $B; }
  if ( $Alpha != NULL) { $this->FontColorA = $Alpha; }
 
  if ( $FontName != NULL )
  $this->FontName = $FontName;
 
  if ( $FontSize != NULL )
  $this->FontSize = $FontSize;
  }
 
  /* Returns the 1st decimal values (used to correct AA bugs) */
  function getFirstDecimal($Value)
  {
  $Values = preg_split("/\./",$Value);
  if ( isset($Values[1]) ) { return(substr($Values[1],0,1)); } else { return(0); }
  }
 
  /* Attach a dataset to your pChart Object */
  function setDataSet(&$DataSet)
  { $this->DataSet = $DataSet; }
 
  /* Print attached dataset contents to STDOUT */
  function printDataSet()
  { print_r($this->DataSet); }
  }
  ?>
  <?php
  /*
  pPie - class to draw pie charts
 
  Version : 2.1.0
  Made by : Jean-Damien POGOLOTTI
  Last Update : 26/01/11
 
  This file can be distributed under the license you can find at :
 
  http://www.pchart.net/license
 
  You can find the whole class documentation on the pChart web site.
  */
 
  /* Class return codes */
  define("PIE_NO_ABSCISSA" , 140001);
  define("PIE_NO_DATASERIE" , 140002);
  define("PIE_SUMISNULL" , 140003);
  define("PIE_RENDERED" , 140000);
 
  define("PIE_LABEL_COLOR_AUTO" , 140010);
  define("PIE_LABEL_COLOR_MANUAL", 140011);
 
  define("PIE_VALUE_NATURAL" , 140020);
  define("PIE_VALUE_PERCENTAGE" , 140021);
 
  /* pPie class definition */
  class pPie
  {
  var $pChartObject;
  var $pDataObject;
 
  /* Class creator */
  function pPie($Object,$pDataObject)
  {
  /* Cache the pChart object reference */
  $this->pChartObject = $Object;
 
  /* Cache the pData object reference */
  $this->pDataObject = $pDataObject;
  }
 
  /* Draw a pie chart */
  function draw2DPie($X,$Y,$Format="")
  {
  /* Rendering layout */
  $Radius = isset($Format["Radius"]) ? $Format["Radius"] : 60;
  $DataGapAngle = isset($Format["DataGapAngle"]) ? $Format["DataGapAngle"] : 0;
  $DataGapRadius = isset($Format["DataGapRadius"]) ? $Format["DataGapRadius"] : 0;
  $SecondPass = isset($Format["SecondPass"]) ? $Format["SecondPass"] : TRUE;
  $Border = isset($Format["Border"]) ? $Format["Border"] : FALSE;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 255;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 255;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 255;
  $Shadow = isset($Format["Shadow"]) ? $Format["Shadow"] : FALSE;
  $DrawLabels = isset($Format["DrawLabels"]) ? $Format["DrawLabels"] : FALSE;
  $LabelColor = isset($Format["LabelColor"]) ? $Format["LabelColor"] : PIE_LABEL_COLOR_MANUAL;
  $LabelR = isset($Format["LabelR"]) ? $Format["LabelR"] : 0;
  $LabelG = isset($Format["LabelG"]) ? $Format["LabelG"] : 0;
  $LabelB = isset($Format["LabelB"]) ? $Format["LabelB"] : 0;
  $LabelAlpha = isset($Format["LabelAlpha"]) ? $Format["LabelAlpha"] : 100;
 
  /* Data Processing */
  $Data = $this->pDataObject->getData();
  $Palette = $this->pDataObject->getPalette();
 
  /* Do we have an abscissa serie defined? */
  if ( $Data["Abscissa"] == "" ) { return(PIE_NO_ABSCISSA); }
 
  /* Try to find the data serie */
  $DataSerie = "";
  foreach ($Data["Series"] as $SerieName => $SerieData)
  { if ( $SerieName != $Data["Abscissa"]) { $DataSerie = $SerieName; } }
 
  /* Do we have data to compute? */
  if ( $DataSerie == "" ) { return(PIE_NO_DATASERIE); }
 
  /* Compute the pie sum */
  $SerieSum = $this->pDataObject->getSum($DataSerie);
 
  /* Do we have data to draw? */
  if ( $SerieSum == 0 ) { return(PIE_SUMISNULL); }
 
  /* Dump the real number of data to draw */
  $Values = "";
  foreach ($Data["Series"][$DataSerie]["Data"] as $Key => $Value)
  { if ($Value != 0) { $Values[] = $Value; } }
 
  /* Compute the wasted angular space between series */
  if (count($Values)==1) { $WastedAngular = 0; } else { $WastedAngular = count($Values) * $DataGapAngle; }
 
  /* Compute the scale */
  $ScaleFactor = (360 - $WastedAngular) / $SerieSum;
 
  $RestoreShadow = $this->pChartObject->Shadow;
  if ( $this->pChartObject->Shadow )
  {
  $this->pChartObject->Shadow = FALSE;
 
  $ShadowFormat = $Format; $ShadowFormat["Shadow"] = TRUE;
  $this->draw2DPie($X+$this->pChartObject->ShadowX,$Y+$this->pChartObject->ShadowY,$ShadowFormat);
  }
 
  /* Draw the polygon pie elements */
  $Step = 360 / (2 * PI * $Radius);
  $Offset = 0; $ID = 0;
  foreach($Values as $Key => $Value)
  {
  if ( $Shadow )
  $Settings = array("R"=>$this->pChartObject->ShadowR,"G"=>$this->pChartObject->ShadowG,"B"=>$this->pChartObject->ShadowB,"Alpha"=>$this->pChartObject->Shadowa);
  else
  $Settings = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);
 
  if ( !$SecondPass && !$Shadow )
  {
  if ( !$Border )
  $Settings["Surrounding"] = 10;
  else
  { $Settings["BorderR"] = $BorderR; $Settings["BorderG"] = $BorderG; $Settings["BorderB"] = $BorderB; }
  }
 
  $Plots = "";
  $EndAngle = $Offset+($Value*$ScaleFactor); if ( $EndAngle > 360 ) { $EndAngle = 360; }
 
  $Angle = ($EndAngle - $Offset)/2 + $Offset;
  if ($DataGapAngle == 0)
  { $X0 = $X; $Y0 = $Y; }
  else
  {
  $X0 = cos(($Angle-90)*PI/180) * $DataGapRadius + $X;
  $Y0 = sin(($Angle-90)*PI/180) * $DataGapRadius + $Y;
  }
 
  $Plots[] = $X0; $Plots[] = $Y0;
 
 
  for($i=$Offset;$i<=$EndAngle;$i=$i+$Step)
  {
  $Xc = cos(($i-90)*PI/180) * $Radius + $X;
  $Yc = sin(($i-90)*PI/180) * $Radius + $Y;
 
  if ( $SecondPass && ( $i<90 )) { $Yc++; }
  if ( $SecondPass && ( $i>180 && $i<270 )) { $Xc++; }
  if ( $SecondPass && ( $i>=270 )) { $Xc++; $Yc++; }
 
  $Plots[] = $Xc; $Plots[] = $Yc;
  }
 
  $this->pChartObject->drawPolygon($Plots,$Settings);
 
  if ( $DrawLabels && !$Shadow && !$SecondPass )
  {
  if ( $LabelColor == PIE_LABEL_COLOR_AUTO )
  { $Settings = array("FillR"=>$Palette[$ID]["R"],"FillG"=>$Palette[$ID]["G"],"FillB"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);}
  else
  { $Settings = array("FillR"=>$LabelR,"FillG"=>$LabelG,"FillB"=>$LabelB,"Alpha"=>$LabelAlpha); }
 
  $Angle = ($EndAngle - $Offset)/2 + $Offset;
  $Xc = cos(($Angle-90)*PI/180) * $Radius + $X;
  $Yc = sin(($Angle-90)*PI/180) * $Radius + $Y;
 
  $Label = $Data["Series"][$Data["Abscissa"]]["Data"][$Key];
 
  $Settings["Angle"] = 360-$Angle;
  $Settings["Length"] = 25;
  $Settings["Size"] = 8;
  $this->pChartObject->drawArrowLabel($Xc,$Yc," ".$Label." ",$Settings);
  }
 
  $Offset = $i + $DataGapAngle; $ID++;
  }
 
  /* Second pass to smooth the angles */
  if ( $SecondPass )
  {
  $Step = 360 / (2 * PI * $Radius);
  $Offset = 0; $ID = 0;
  foreach($Values as $Key => $Value)
  {
  $FirstPoint = TRUE;
  if ( $Shadow )
  $Settings = array("R"=>$this->pChartObject->ShadowR,"G"=>$this->pChartObject->ShadowG,"B"=>$this->pChartObject->ShadowB,"Alpha"=>$this->pChartObject->Shadowa);
  else
  {
  if ( $Border )
  $Settings = array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB);
  else
  $Settings = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);
  }
 
  $EndAngle = $Offset+($Value*$ScaleFactor); if ( $EndAngle > 360 ) { $EndAngle = 360; }
 
  if ($DataGapAngle == 0)
  { $X0 = $X; $Y0 = $Y; }
  else
  {
  $Angle = ($EndAngle - $Offset)/2 + $Offset;
  $X0 = cos(($Angle-90)*PI/180) * $DataGapRadius + $X;
  $Y0 = sin(($Angle-90)*PI/180) * $DataGapRadius + $Y;
  }
  $Plots[] = $X0; $Plots[] = $Y0;
 
  for($i=$Offset;$i<=$EndAngle;$i=$i+$Step)
  {
  $Xc = cos(($i-90)*PI/180) * $Radius + $X;
  $Yc = sin(($i-90)*PI/180) * $Radius + $Y;
 
  if ( $FirstPoint ) { $this->pChartObject->drawLine($Xc,$Yc,$X0,$Y0,$Settings); } { $FirstPoint = FALSE; }
 
  $this->pChartObject->drawAntialiasPixel($Xc,$Yc,$Settings);
  }
  $this->pChartObject->drawLine($Xc,$Yc,$X0,$Y0,$Settings);
 
  if ( $DrawLabels && !$Shadow )
  {
  if ( $LabelColor == PIE_LABEL_COLOR_AUTO )
  { $Settings = array("FillR"=>$Palette[$ID]["R"],"FillG"=>$Palette[$ID]["G"],"FillB"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);}
  else
  { $Settings = array("FillR"=>$LabelR,"FillG"=>$LabelG,"FillB"=>$LabelB,"Alpha"=>$LabelAlpha); }
 
  $Angle = ($EndAngle - $Offset)/2 + $Offset;
  $Xc = cos(($Angle-90)*PI/180) * $Radius + $X;
  $Yc = sin(($Angle-90)*PI/180) * $Radius + $Y;
 
  $Label = $Data["Series"][$Data["Abscissa"]]["Data"][$Key];
 
  $Settings["Angle"] = 360-$Angle;
  $Settings["Length"] = 25;
  $Settings["Size"] = 8;
 
  $this->pChartObject->drawArrowLabel($Xc,$Yc," ".$Label." ",$Settings);
  }
 
  $Offset = $i + $DataGapAngle; $ID++;
  }
  }
 
  $this->pChartObject->Shadow = $RestoreShadow;
 
  return(PIE_RENDERED);
  }
 
  /* Draw a 3D pie chart */
  function draw3DPie($X,$Y,$Format="")
  {
  /* Rendering layout */
  $Radius = isset($Format["Radius"]) ? $Format["Radius"] : 80;
  $SkewFactor = isset($Format["SkewFactor"]) ? $Format["SkewFactor"] : .5;
  $SliceHeight = isset($Format["SliceHeight"]) ? $Format["SliceHeight"] : 20;
  $DataGapAngle = isset($Format["DataGapAngle"]) ? $Format["DataGapAngle"] : 0;
  $DataGapRadius = isset($Format["DataGapRadius"]) ? $Format["DataGapRadius"] : 0;
  $SecondPass = isset($Format["SecondPass"]) ? $Format["SecondPass"] : TRUE;
  $Border = isset($Format["Border"]) ? $Format["Border"] : FALSE;
  $Shadow = isset($Format["Shadow"]) ? $Format["Shadow"] : FALSE;
  $DrawLabels = isset($Format["DrawLabels"]) ? $Format["DrawLabels"] : FALSE;
  $LabelColor = isset($Format["LabelColor"]) ? $Format["LabelColor"] : PIE_LABEL_COLOR_MANUAL;
  $LabelR = isset($Format["LabelR"]) ? $Format["LabelR"] : 0;
  $LabelG = isset($Format["LabelG"]) ? $Format["LabelG"] : 0;
  $LabelB = isset($Format["LabelB"]) ? $Format["LabelB"] : 0;
  $LabelAlpha = isset($Format["LabelAlpha"]) ? $Format["LabelAlpha"] : 100;
  $WriteValues = isset($Format["WriteValues"]) ? $Format["WriteValues"] : PIE_VALUE_PERCENTAGE;
  $ValueSuffix = isset($Format["ValueSuffix"]) ? $Format["ValueSuffix"] : "";
  $ValueR = isset($Format["ValueR"]) ? $Format["ValueR"] : 255;
  $ValueG = isset($Format["ValueG"]) ? $Format["ValueG"] : 255;
  $ValueB = isset($Format["ValueB"]) ? $Format["ValueB"] : 255;
  $ValueAlpha = isset($Format["ValueAlpha"]) ? $Format["ValueAlpha"] : 100;
 
  /* Error correction for overlaying rounded corners */
  if ( $SkewFactor < .5 ) { $SkewFactor = .5; }
 
  /* Data Processing */
  $Data = $this->pDataObject->getData();
  $Palette = $this->pDataObject->getPalette();
 
  /* Do we have an abscissa serie defined? */
  if ( $Data["Abscissa"] == "" ) { return(PIE_NO_ABSCISSA); }
 
  /* Try to find the data serie */
  $DataSerie = "";
  foreach ($Data["Series"] as $SerieName => $SerieData)
  { if ( $SerieName != $Data["Abscissa"]) { $DataSerie = $SerieName; } }
 
  /* Do we have data to compute? */
  if ( $DataSerie == "" ) { return(PIE_NO_DATASERIE); }
 
  /* Compute the pie sum */
  $SerieSum = $this->pDataObject->getSum($DataSerie);
 
  /* Do we have data to draw? */
  if ( $SerieSum == 0 ) { return(PIE_SUMISNULL); }
 
  /* Dump the real number of data to draw */
  $Values = "";
  foreach ($Data["Series"][$DataSerie]["Data"] as $Key => $Value)
  { if ($Value != 0) { $Values[] = $Value; } }
 
  /* Compute the wasted angular space between series */
  if (count($Values)==1) { $WastedAngular = 0; } else { $WastedAngular = count($Values) * $DataGapAngle; }
 
  /* Compute the scale */
  $ScaleFactor = (360 - $WastedAngular) / $SerieSum;
 
  $RestoreShadow = $this->pChartObject->Shadow;
  if ( $this->pChartObject->Shadow ) { $this->pChartObject->Shadow = FALSE; }
 
  /* Draw the polygon pie elements */
  $Step = 360 / (2 * PI * $Radius);
  $Offset = 360; $ID = count($Values)-1;
  $Values = array_reverse($Values);
  $Slice = 0; $Slices = ""; $SliceColors = ""; $Visible = ""; $SliceAngle = "";
  foreach($Values as $Key => $Value)
  {
  $Settings = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);
  $SliceColors[$Slice] = $Settings;
 
  $StartAngle = $Offset;
  $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; }
 
  if ( $StartAngle > 180 ) { $Visible[$Slice]["Start"] = TRUE; } else { $Visible[$Slice]["Start"] = TRUE; }
  if ( $EndAngle < 180 ) { $Visible[$Slice]["End"] = FALSE; } else { $Visible[$Slice]["End"] = TRUE; }
 
  if ($DataGapAngle == 0)
  { $X0 = $X; $Y0 = $Y; }
  else
  {
  $Angle = ($EndAngle - $Offset)/2 + $Offset;
  $X0 = cos(($Angle-90)*PI/180) * $DataGapRadius + $X;
  $Y0 = sin(($Angle-90)*PI/180) * $DataGapRadius*$SkewFactor + $Y;
  }
  $Slices[$Slice][] = $X0; $Slices[$Slice][] = $Y0; $SliceAngle[$Slice][] = 0;
 
  for($i=$Offset;$i>=$EndAngle;$i=$i-$Step)
  {
  $Xc = cos(($i-90)*PI/180) * $Radius + $X;
  $Yc = sin(($i-90)*PI/180) * $Radius*$SkewFactor + $Y;
 
  if ( ($SecondPass || $RestoreShadow ) && ( $i<90 )) { $Yc++; }
  if ( ($SecondPass || $RestoreShadow ) && ( $i>90 && $i<180 )) { $Xc++; }
  if ( ($SecondPass || $RestoreShadow ) && ( $i>180 && $i<270 )) { $Xc++; }
  if ( ($SecondPass || $RestoreShadow ) && ( $i>=270 )) { $Xc++; $Yc++; }
 
  $Slices[$Slice][] = $Xc; $Slices[$Slice][] = $Yc; $SliceAngle[$Slice][] = $i;
  }
 
  $Offset = $i - $DataGapAngle; $ID--; $Slice++;
  }
 
  /* Draw the bottom shadow if needed */
  if ( $RestoreShadow && ($this->pChartObject->ShadowX != 0 || $this->pChartObject->ShadowY !=0 ))
  {
  foreach($Slices as $SliceID => $Plots)
  {
  $ShadowPie = "";
  for($i=0;$i<count($Plots);$i=$i+2)
  { $ShadowPie[] = $Plots[$i]+$this->pChartObject->ShadowX; $ShadowPie[] = $Plots[$i+1]+$this->pChartObject->ShadowY; }
 
  $Settings = array("R"=>$this->pChartObject->ShadowR,"G"=>$this->pChartObject->ShadowG,"B"=>$this->pChartObject->ShadowB,"Alpha"=>$this->pChartObject->Shadowa,"NoBorder"=>TRUE);
  $this->pChartObject->drawPolygon($ShadowPie,$Settings);
  }
 
  $Step = 360 / (2 * PI * $Radius);
  $Offset = 360;
  foreach($Values as $Key => $Value)
  {
  $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; }
 
  for($i=$Offset;$i>=$EndAngle;$i=$i-$Step)
  {
  $Xc = cos(($i-90)*PI/180) * $Radius + $X + $this->pChartObject->ShadowX;
  $Yc = sin(($i-90)*PI/180) * $Radius*$SkewFactor + $Y + $this->pChartObject->ShadowY;
 
  $this->pChartObject->drawAntialiasPixel($Xc,$Yc,$Settings);
  }
 
  $Offset = $i - $DataGapAngle; $ID--;
  }
  }
 
  /* Draw the bottom pie splice */
  foreach($Slices as $SliceID => $Plots)
  {
  $Settings = $SliceColors[$SliceID]; $Settings["NoBorder"] = TRUE;
  $this->pChartObject->drawPolygon($Plots,$Settings);
 
  if ( $SecondPass )
  {
  $Settings = $SliceColors[$SliceID];
  if ( $Border )
  { $Settings["R"]+= 30; $Settings["G"]+= 30; $Settings["B"]+= 30;; }
 
  $Angle = $SliceAngle[$SliceID][1];
  $Xc = cos(($Angle-90)*PI/180) * $Radius + $X;
  $Yc = sin(($Angle-90)*PI/180) * $Radius*$SkewFactor + $Y;
  $this->pChartObject->drawLine($Plots[0],$Plots[1],$Xc,$Yc,$Settings);
 
  $Angle = $SliceAngle[$SliceID][count($SliceAngle[$SliceID])-1];
  $Xc = cos(($Angle-90)*PI/180) * $Radius + $X;
  $Yc = sin(($Angle-90)*PI/180) * $Radius*$SkewFactor + $Y;
  $this->pChartObject->drawLine($Plots[0],$Plots[1],$Xc,$Yc,$Settings);
  }
  }
 
  /* Draw the two vertical edges */
  $Slices = array_reverse($Slices);
  $SliceColors = array_reverse($SliceColors);
  foreach($Slices as $SliceID => $Plots)
  {
  $Settings = $SliceColors[$SliceID];
  $Settings["R"]+= 10; $Settings["G"]+= 10; $Settings["B"]+= 10; $Settings["NoBorder"] = TRUE;
 
  if ( $Visible[$SliceID]["Start"] )
  {
  $this->pChartObject->drawLine($Plots[2],$Plots[3],$Plots[2],$Plots[3]- $SliceHeight,array("R"=>255,"G"=>255,"B"=>255));
  $Border = "";
  $Border[] = $Plots[0]; $Border[] = $Plots[1]; $Border[] = $Plots[0]; $Border[] = $Plots[1] - $SliceHeight;
  $Border[] = $Plots[2]; $Border[] = $Plots[3] - $SliceHeight; $Border[] = $Plots[2]; $Border[] = $Plots[3];
  $this->pChartObject->drawPolygon($Border,$Settings);
  }
  }
 
  $Slices = array_reverse($Slices);
  $SliceColors = array_reverse($SliceColors);
  foreach($Slices as $SliceID => $Plots)
  {
  $Settings = $SliceColors[$SliceID];
  $Settings["R"]+= 10; $Settings["G"]+= 10; $Settings["B"]+= 10; $Settings["NoBorder"] = TRUE;
  if ( $Visible[$SliceID]["End"] )
  {
  $this->pChartObject->drawLine($Plots[count($Plots)-2],$Plots[count($Plots)-1],$Plots[count($Plots)-2],$Plots[count($Plots)-1]- $SliceHeight,array("R"=>255,"G"=>255,"B"=>255));
 
  $Border = "";
  $Border[] = $Plots[0]; $Border[] = $Plots[1]; $Border[] = $Plots[0]; $Border[] = $Plots[1] - $SliceHeight;
  $Border[] = $Plots[count($Plots)-2]; $Border[] = $Plots[count($Plots)-1] - $SliceHeight; $Border[] = $Plots[count($Plots)-2]; $Border[] = $Plots[count($Plots)-1];
  $this->pChartObject->drawPolygon($Border,$Settings);
  }
  }
 
  /* Draw the rounded edges */
  foreach($Slices as $SliceID => $Plots)
  {
  $Settings = $SliceColors[$SliceID];
  $Settings["R"]+= 10; $Settings["G"]+= 10; $Settings["B"]+= 10; $Settings["NoBorder"] = TRUE;
 
  for ($j=2;$j<count($Plots)-2;$j=$j+2)
  {
  $Angle = $SliceAngle[$SliceID][$j/2];
  if ( $Angle < 270 && $Angle > 90 )
  {
  $Border = "";
  $Border[] = $Plots[$j]; $Border[] = $Plots[$j+1];
  $Border[] = $Plots[$j+2]; $Border[] = $Plots[$j+3];
  $Border[] = $Plots[$j+2]; $Border[] = $Plots[$j+3] - $SliceHeight;
  $Border[] = $Plots[$j]; $Border[] = $Plots[$j+1] - $SliceHeight;
  $this->pChartObject->drawPolygon($Border,$Settings);
  }
  }
 
  if ( $SecondPass )
  {
  $Settings = $SliceColors[$SliceID];
  if ( $Border )
  { $Settings["R"]+= 30; $Settings["G"]+= 30; $Settings["B"]+= 30; }
 
  $Angle = $SliceAngle[$SliceID][1];
  if ( $Angle < 270 && $Angle > 90 )
  {
  $Xc = cos(($Angle-90)*PI/180) * $Radius + $X;
  $Yc = sin(($Angle-90)*PI/180) * $Radius*$SkewFactor + $Y;
  $this->pChartObject->drawLine($Xc,$Yc,$Xc,$Yc-$SliceHeight,$Settings);
  }
 
  $Angle = $SliceAngle[$SliceID][count($SliceAngle[$SliceID])-1];
  if ( $Angle < 270 && $Angle > 90 )
  {
  $Xc = cos(($Angle-90)*PI/180) * $Radius + $X;
  $Yc = sin(($Angle-90)*PI/180) * $Radius*$SkewFactor + $Y;
  $this->pChartObject->drawLine($Xc,$Yc,$Xc,$Yc-$SliceHeight,$Settings);
  }
 
  if ( $SliceAngle[$SliceID][1] > 270 && $SliceAngle[$SliceID][count($SliceAngle[$SliceID])-1] < 270 )
  {
  $Xc = cos((270-90)*PI/180) * $Radius + $X;
  $Yc = sin((270-90)*PI/180) * $Radius*$SkewFactor + $Y;
  $this->pChartObject->drawLine($Xc,$Yc,$Xc,$Yc-$SliceHeight,$Settings);
  }
 
  if ( $SliceAngle[$SliceID][1] > 90 && $SliceAngle[$SliceID][count($SliceAngle[$SliceID])-1] < 90 )
  {
  $Xc = cos((0)*PI/180) * $Radius + $X;
  $Yc = sin((0)*PI/180) * $Radius*$SkewFactor + $Y;
  $this->pChartObject->drawLine($Xc,$Yc,$Xc,$Yc-$SliceHeight,$Settings);
  }
 
  }
  }
 
  /* Draw the top splice */
  foreach($Slices as $SliceID => $Plots)
  {
  $Settings = $SliceColors[$SliceID];
  $Settings["R"]+= 20; $Settings["G"]+= 20; $Settings["B"]+= 20;
 
  $Top = "";
  for($j=0;$j<count($Plots);$j=$j+2) { $Top[] = $Plots[$j]; $Top[] = $Plots[$j+1]- $SliceHeight; }
  $this->pChartObject->drawPolygon($Top,$Settings);
  }
 
 
  /* Second pass to smooth the angles */
  if ( $SecondPass )
  {
  $Step = 360 / (2 * PI * $Radius);
  $Offset = 360; $ID = count($Values)-1;
  foreach($Values as $Key => $Value)
  {
  $FirstPoint = TRUE;
  if ( $Shadow )
  $Settings = array("R"=>$this->pChartObject->ShadowR,"G"=>$this->pChartObject->ShadowG,"B"=>$this->pChartObject->ShadowB,"Alpha"=>$this->pChartObject->Shadowa);
  else
  {
  if ( $Border )
  { $Settings = array("R"=>$Palette[$ID]["R"]+30,"G"=>$Palette[$ID]["G"]+30,"B"=>$Palette[$ID]["B"]+30,"Alpha"=>$Palette[$ID]["Alpha"]); }
  else
  $Settings = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);
  }
 
  $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; }
 
  if ($DataGapAngle == 0)
  { $X0 = $X; $Y0 = $Y- $SliceHeight; }
  else
  {
  $Angle = ($EndAngle - $Offset)/2 + $Offset;
  $X0 = cos(($Angle-90)*PI/180) * $DataGapRadius + $X;
  $Y0 = sin(($Angle-90)*PI/180) * $DataGapRadius*$SkewFactor + $Y - $SliceHeight;
  }
  $Plots[] = $X0; $Plots[] = $Y0;
 
  for($i=$Offset;$i>=$EndAngle;$i=$i-$Step)
  {
  $Xc = cos(($i-90)*PI/180) * $Radius + $X;
  $Yc = sin(($i-90)*PI/180) * $Radius*$SkewFactor + $Y - $SliceHeight;
 
  if ( $FirstPoint ) { $this->pChartObject->drawLine($Xc,$Yc,$X0,$Y0,$Settings); } { $FirstPoint = FALSE; }
 
  $this->pChartObject->drawAntialiasPixel($Xc,$Yc,$Settings);
  if ($i < 270 && $i > 90 ) { $this->pChartObject->drawAntialiasPixel($Xc,$Yc+$SliceHeight,$Settings); }
  }
  $this->pChartObject->drawLine($Xc,$Yc,$X0,$Y0,$Settings);
 
  $Offset = $i - $DataGapAngle; $ID--;
  }
  }
 
  if ( $WriteValues != NULL )
  {
  $Step = 360 / (2 * PI * $Radius);
  $Offset = 360; $ID = count($Values)-1;
  $Settings = array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"R"=>$ValueR,"G"=>$ValueG,"B"=>$ValueB,"Alpha"=>$ValueAlpha);
  foreach($Values as $Key => $Value)
  {
  $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; }
 
  $Angle = ($EndAngle - $Offset)/2 + $Offset;
  $Xc = cos(($Angle-90)*PI/180) * ($Radius)/2 + $X;
  $Yc = sin(($Angle-90)*PI/180) * ($Radius*$SkewFactor)/2 + $Y - $SliceHeight;
 
  if ( $WriteValues == PIE_VALUE_PERCENTAGE )
  $Display = round(( 100 / $SerieSum ) * $Value)."%";
  elseif ( $WriteValues == PIE_VALUE_NATURAL )
  $Display = $Value.$ValueSuffix;
 
  $this->pChartObject->drawText($Xc,$Yc,$Display,$Settings);
 
  $Offset = $EndAngle - $DataGapAngle; $ID--;
  }
  }
 
  if ( $DrawLabels )
  {
  $Step = 360 / (2 * PI * $Radius);
  $Offset = 360; $ID = count($Values)-1;
  foreach($Values as $Key => $Value)
  {
  if ( $LabelColor == PIE_LABEL_COLOR_AUTO )
  { $Settings = array("FillR"=>$Palette[$ID]["R"],"FillG"=>$Palette[$ID]["G"],"FillB"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);}
  else
  { $Settings = array("FillR"=>$LabelR,"FillG"=>$LabelG,"FillB"=>$LabelB,"Alpha"=>$LabelAlpha); }
 
  $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; }
 
  $Angle = ($EndAngle - $Offset)/2 + $Offset;
  $Xc = cos(($Angle-90)*PI/180) * $Radius + $X;
  $Yc = sin(($Angle-90)*PI/180) * $Radius*$SkewFactor + $Y - $SliceHeight;
 
  if ( isset($Data["Series"][$Data["Abscissa"]]["Data"][$ID]) )
  {
  $Label = $Data["Series"][$Data["Abscissa"]]["Data"][$ID];
 
  $Settings["Angle"] = 360-$Angle;
  $Settings["Length"] = 25;
  $Settings["Size"] = 8;
  $this->pChartObject->drawArrowLabel($Xc,$Yc," ".$Label." ",$Settings);
  }
 
  $Offset = $EndAngle - $DataGapAngle; $ID--;
  }
  }
 
  $this->pChartObject->Shadow = $RestoreShadow;
 
  return(PIE_RENDERED);
  }
 
  /* Draw the legend of pie chart */
  function drawPieLegend($X,$Y,$Format="")
  {
  $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->pChartObject->FontName;
  $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->pChartObject->FontSize;
  $FontR = isset($Format["FontR"]) ? $Format["FontR"] : $this->pChartObject->FontColorR;
  $FontG = isset($Format["FontG"]) ? $Format["FontG"] : $this->pChartObject->FontColorG;
  $FontB = isset($Format["FontB"]) ? $Format["FontB"] : $this->pChartObject->FontColorB;
  $BoxSize = isset($Format["BoxSize"]) ? $Format["BoxSize"] : 5;
  $Margin = isset($Format["Margin"]) ? $Format["Margin"] : 5;
  $R = isset($Format["R"]) ? $Format["R"] : 200;
  $G = isset($Format["G"]) ? $Format["G"] : 200;
  $B = isset($Format["B"]) ? $Format["B"] : 200;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 255;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 255;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 255;
  $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;
  $Style = isset($Format["Style"]) ? $Format["Style"] : LEGEND_ROUND;
  $Mode = isset($Format["Mode"]) ? $Format["Mode"] : LEGEND_VERTICAL;
 
  if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; }
 
  $YStep = max($this->pChartObject->FontSize,$BoxSize) + 5;
  $XStep = $BoxSize + 5;
 
  /* Data Processing */
  $Data = $this->pDataObject->getData();
  $Palette = $this->pDataObject->getPalette();
 
  /* Do we have an abscissa serie defined? */
  if ( $Data["Abscissa"] == "" ) { return(PIE_NO_ABSCISSA); }
 
  $Boundaries = ""; $Boundaries["L"] = $X; $Boundaries["T"] = $Y; $Boundaries["R"] = 0; $Boundaries["B"] = 0; $vY = $Y; $vX = $X;
  foreach($Data["Series"][$Data["Abscissa"]]["Data"] as $Key => $Value)
  {
  $BoxArray = $this->pChartObject->getTextBox($vX+$BoxSize+4,$vY+$BoxSize/2,$FontName,$FontSize,0,$Value);
 
  if ( $Mode == LEGEND_VERTICAL )
  {
  if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$BoxSize/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$BoxSize/2; }
  if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; }
  if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$BoxSize/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$BoxSize/2; }
  $vY=$vY+$YStep;
  }
  elseif ( $Mode == LEGEND_HORIZONTAL )
  {
  if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$BoxSize/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$BoxSize/2; }
  if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; }
  if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$BoxSize/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$BoxSize/2; }
  $vX=$Boundaries["R"]+$XStep;
  }
  }
  $vY=$vY-$YStep; $vX=$vX-$XStep;
 
  $TopOffset = $Y - $Boundaries["T"];
  if ( $Boundaries["B"]-($vY+$BoxSize) < $TopOffset ) { $Boundaries["B"] = $vY+$BoxSize+$TopOffset; }
 
  if ( $Style == LEGEND_ROUND )
  $this->pChartObject->drawRoundedFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB));
  elseif ( $Style == LEGEND_BOX )
  $this->pChartObject->drawFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB));
 
  $RestoreShadow = $this->pChartObject->Shadow; $this->pChartObject->Shadow = FALSE;
  foreach($Data["Series"][$Data["Abscissa"]]["Data"] as $Key => $Value)
  {
  $R = $Palette[$Key]["R"]; $G = $Palette[$Key]["G"]; $B = $Palette[$Key]["B"];
 
  $this->pChartObject->drawFilledRectangle($X+1,$Y+1,$X+$BoxSize+1,$Y+$BoxSize+1,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
  $this->pChartObject->drawFilledRectangle($X,$Y,$X+$BoxSize,$Y+$BoxSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Surrounding"=>20));
  if ( $Mode == LEGEND_VERTICAL )
  {
  $this->pChartObject->drawText($X+$BoxSize+4,$Y+$BoxSize/2,$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT));
  $Y=$Y+$YStep;
  }
  elseif ( $Mode == LEGEND_HORIZONTAL )
  {
  $BoxArray = $this->pChartObject->drawText($X+$BoxSize+4,$Y+$BoxSize/2,$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT));
  $X=$BoxArray[1]["X"]+2+$XStep;
  }
  }
 
  $this->Shadow = $RestoreShadow;
  }
 
  /* Set the color of the specified slice */
  function setSliceColor($SliceID,$Format="")
  {
  $R = isset($Format["R"]) ? $Format["R"] : 0;
  $G = isset($Format["G"]) ? $Format["G"] : 0;
  $B = isset($Format["B"]) ? $Format["B"] : 0;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
 
  $this->pDataObject->Palette[$SliceID]["R"] = $R;
  $this->pDataObject->Palette[$SliceID]["G"] = $G;
  $this->pDataObject->Palette[$SliceID]["B"] = $B;
  $this->pDataObject->Palette[$SliceID]["Alpha"] = $Alpha;
  }
  }
  ?>
  <?php
  /*
  pRadar - class to draw radar charts
 
  Version : 2.1.0
  Made by : Jean-Damien POGOLOTTI
  Last Update : 26/01/11
 
  This file can be distributed under the license you can find at :
 
  http://www.pchart.net/license
 
  You can find the whole class documentation on the pChart web site.
  */
 
  define("SEGMENT_HEIGHT_AUTO" , 690001);
 
  define("RADAR_LAYOUT_STAR" , 690011);
  define("RADAR_LAYOUT_CIRCLE" , 690012);
 
  define("RADAR_LABELS_ROTATED" , 690021);
  define("RADAR_LABELS_HORIZONTAL" , 690022);
 
  /* pRadar class definition */
  class pRadar
  {
  var $pChartObject;
 
  /* Class creator */
  function pRadar()
  { }
 
  /* Draw a radar chart */
  function drawRadar($Object,$Values,$Format="")
  {
  $this->pChartObject = $Object;
 
  $AxisR = isset($Format["AxisR"]) ? $Format["AxisR"] : 60;
  $AxisG = isset($Format["AxisG"]) ? $Format["AxisG"] : 60;
  $AxisB = isset($Format["AxisB"]) ? $Format["AxisB"] : 60;
  $AxisAlpha = isset($Format["AxisAlpha"]) ? $Format["AxisAlpha"] : 50;
  $AxisRotation = isset($Format["AxisRotation"]) ? $Format["AxisRotation"] : 0;
  $DrawTicks = isset($Format["DrawTicks"]) ? $Format["DrawTicks"] : TRUE;
  $TicksLength = isset($Format["TicksLength"]) ? $Format["TicksLength"] : 2;
  $DrawAxisValues = isset($Format["DrawAxisValues"]) ? $Format["DrawAxisValues"] : TRUE;
  $AxisBoxRounded = isset($Format["AxisBoxRounded"]) ? $Format["AxisBoxRounded"] : TRUE;
  $AxisFontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->pChartObject->FontName;
  $AxisFontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->pChartObject->FontSize;
  $DrawBackground = isset($Format["DrawBackground"]) ? $Format["DrawBackground"] : TRUE;
  $BackgroundR = isset($Format["BackgroundR"]) ? $Format["BackgroundR"] : 255;
  $BackgroundG = isset($Format["BackgroundG"]) ? $Format["BackgroundG"] : 255;
  $BackgroundB = isset($Format["BackgroundB"]) ? $Format["BackgroundB"] : 255;
  $BackgroundAlpha = isset($Format["BackgroundAlpha"]) ? $Format["BackgroundAlpha"] : 50;
  $BackgroundGradient= isset($Format["BackgroundGradient"]) ? $Format["BackgroundGradient"] : NULL;
  $Layout = isset($Format["Layout"]) ? $Format["Layout"] : RADAR_LAYOUT_STAR;
  $SegmentHeight = isset($Format["SegmentHeight"]) ? $Format["SegmentHeight"] : SEGMENT_HEIGHT_AUTO;
  $Segments = isset($Format["Segments"]) ? $Format["Segments"] : 4;
  $WriteLabels = isset($Format["WriteLabels"]) ? $Format["WriteLabels"] : TRUE;
  $SkipLabels = isset($Format["SkipLabels"]) ? $Format["SkipLabels"] : 1;
  $LabelMiddle = isset($Format["LabelMiddle"]) ? $Format["LabelMiddle"] : FALSE;
  $LabelsBackground = isset($Format["LabelsBackground"]) ? $Format["LabelsBackground"] : TRUE;
  $LabelsBGR = isset($Format["LabelsBGR"]) ? $Format["LabelsBGR"] : 255;
  $LabelsBGG = isset($Format["LabelsBGR"]) ? $Format["LabelsBGG"] : 255;
  $LabelsBGB = isset($Format["LabelsBGR"]) ? $Format["LabelsBGB"] : 255;
  $LabelsBGAlpha = isset($Format["LabelsBGAlpha"]) ? $Format["LabelsBGAlpha"] : 50;
  $LabelPos = isset($Format["LabelPos"]) ? $Format["LabelPos"] : RADAR_LABELS_ROTATED;
  $LabelPadding = isset($Format["LabelPadding"]) ? $Format["LabelPadding"] : 4;
  $DrawPoints = isset($Format["DrawPoints"]) ? $Format["DrawPoints"] : TRUE;
  $PointRadius = isset($Format["PointRadius"]) ? $Format["PointRadius"] : 4;
  $PointSurrounding = isset($Format["PointRadius"]) ? $Format["PointRadius"] : -30;
  $DrawLines = isset($Format["DrawLines"]) ? $Format["DrawLines"] : TRUE;
  $LineLoopStart = isset($Format["LineLoopStart"]) ? $Format["LineLoopStart"] : TRUE;
  $DrawPoly = isset($Format["DrawPoly"]) ? $Format["DrawPoly"] : FALSE;
  $PolyAlpha = isset($Format["PolyAlpha"]) ? $Format["PolyAlpha"] : 40;
  $FontSize = $Object->FontSize;
  $X1 = $Object->GraphAreaX1;
  $Y1 = $Object->GraphAreaY1;
  $X2 = $Object->GraphAreaX2;
  $Y2 = $Object->GraphAreaY2;
 
  // if ( $AxisBoxRounded ) { $DrawAxisValues = TRUE; }
 
  /* Cancel default tick length if ticks not enabled */
  if ( $DrawTicks == FALSE ) { $TicksLength = 0; }
 
  /* Data Processing */
  $Data = $Values->getData();
  $Palette = $Values->getPalette();
 
  /* Catch the number of required axis */
  $LabelSerie = $Data["Abscissa"];
  if ( $LabelSerie != "" )
  { $Points = count($Data["Series"][$LabelSerie]["Data"]); }
  else
  {
  $Points = 0;
  foreach($Data["Series"] as $SerieName => $DataArray)
  { if ( count($DataArray["Data"]) > $Points ) { $Points = count($DataArray["Data"]); } }
  }
 
  /* Draw the axis */
  $CenterX = ($X2-$X1)/2 + $X1;
  $CenterY = ($Y2-$Y1)/2 + $Y1;
 
  $EdgeHeight = min(($X2-$X1)/2,($Y2-$Y1)/2);
  if ( $WriteLabels )
  $EdgeHeight = $EdgeHeight - $FontSize - $LabelPadding - $TicksLength;
 
  /* Determine the scale if set to automatic */
  if ( $SegmentHeight == SEGMENT_HEIGHT_AUTO)
  {
  $Max = 0;
  foreach($Data["Series"] as $SerieName => $DataArray)
  {
  if ( $SerieName != $LabelSerie )
  {
  if ( max($DataArray["Data"]) > $Max ) { $Max = max($DataArray["Data"]); }
  }
  }
  $MaxSegments = $EdgeHeight/20;
  $Scale = $Object->computeScale(0,$Max,$MaxSegments,array(1,2,5));
 
  $Segments = $Scale["Rows"];
  $SegmentHeight = $Scale["RowHeight"];
  }
 
  if ( $LabelMiddle && $SkipLabels == 1 )
  { $Axisoffset = (360/$Points)/2; }
  elseif ( $LabelMiddle && $SkipLabels != 1 )
  { $Axisoffset = (360/($Points/$SkipLabels))/2; }
  elseif ( !$LabelMiddle )
  { $Axisoffset = 0; }
 
  /* Background processing */
  if ( $DrawBackground )
  {
  $RestoreShadow = $Object->Shadow;
  $Object->Shadow = FALSE;
 
  if ($BackgroundGradient == NULL)
  {
  if ( $Layout == RADAR_LAYOUT_STAR )
  {
  $Color = array("R"=>$BackgroundR,"G"=>$BackgroundG,"B"=>$BackgroundB,"Alpha"=>$BackgroundAlpha);
  $PointArray = "";
  for($i=0;$i<=360;$i=$i+(360/$Points))
  {
  $PointArray[] = cos(deg2rad($i+$AxisRotation)) * $EdgeHeight + $CenterX;
  $PointArray[] = sin(deg2rad($i+$AxisRotation)) * $EdgeHeight + $CenterY;
  }
  $Object->drawPolygon($PointArray,$Color);
  }
  elseif ( $Layout == RADAR_LAYOUT_CIRCLE )
  {
  $Color = array("R"=>$BackgroundR,"G"=>$BackgroundG,"B"=>$BackgroundB,"Alpha"=>$BackgroundAlpha);
  $Object->drawFilledCircle($CenterX,$CenterY,$EdgeHeight,$Color);
  }
  }
  else
  {
  $GradientROffset = ($BackgroundGradient["EndR"] - $BackgroundGradient["StartR"]) / $Segments;
  $GradientGOffset = ($BackgroundGradient["EndG"] - $BackgroundGradient["StartG"]) / $Segments;
  $GradientBOffset = ($BackgroundGradient["EndB"] - $BackgroundGradient["StartB"]) / $Segments;
  $GradientAlphaOffset = ($BackgroundGradient["EndAlpha"] - $BackgroundGradient["StartAlpha"]) / $Segments;
 
  if ( $Layout == RADAR_LAYOUT_STAR )
  {
  for($j=$Segments;$j>=1;$j--)
  {
  $Color = array("R"=>$BackgroundGradient["StartR"]+$GradientROffset*$j,"G"=>$BackgroundGradient["StartG"]+$GradientGOffset*$j,"B"=>$BackgroundGradient["StartB"]+$GradientBOffset*$j,"Alpha"=>$BackgroundGradient["StartAlpha"]+$GradientAlphaOffset*$j);
  $PointArray = "";
 
  for($i=0;$i<=360;$i=$i+(360/$Points))
  {
  $PointArray[] = cos(deg2rad($i+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterX;
  $PointArray[] = sin(deg2rad($i+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterY;
  }
  $Object->drawPolygon($PointArray,$Color);
  }
  }
  elseif ( $Layout == RADAR_LAYOUT_CIRCLE )
  {
  for($j=$Segments;$j>=1;$j--)
  {
  $Color = array("R"=>$BackgroundGradient["StartR"]+$GradientROffset*$j,"G"=>$BackgroundGradient["StartG"]+$GradientGOffset*$j,"B"=>$BackgroundGradient["StartB"]+$GradientBOffset*$j,"Alpha"=>$BackgroundGradient["StartAlpha"]+$GradientAlphaOffset*$j);
  $Object->drawFilledCircle($CenterX,$CenterY,($EdgeHeight/$Segments)*$j,$Color);
  }
  }
  }
  $Object->Shadow = $RestoreShadow;
  }
 
  /* Axis to axis lines */
  $Color = array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha);
  $ColorDotted = array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha*.8, "Ticks"=>2);
  if ( $Layout == RADAR_LAYOUT_STAR )
  {
  for($j=1;$j<=$Segments;$j++)
  {
  for($i=0;$i<360;$i=$i+(360/$Points))
  {
  $EdgeX1 = cos(deg2rad($i+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterX;
  $EdgeY1 = sin(deg2rad($i+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterY;
  $EdgeX2 = cos(deg2rad($i+$AxisRotation+(360/$Points))) * ($EdgeHeight/$Segments)*$j + $CenterX;
  $EdgeY2 = sin(deg2rad($i+$AxisRotation+(360/$Points))) * ($EdgeHeight/$Segments)*$j + $CenterY;
 
  $Object->drawLine($EdgeX1,$EdgeY1,$EdgeX2,$EdgeY2,$Color);
  }
  }
  }
  elseif ( $Layout == RADAR_LAYOUT_CIRCLE )
  {
  for($j=1;$j<=$Segments;$j++)
  {
  $Radius = ($EdgeHeight/$Segments)*$j;
  $Object->drawCircle($CenterX,$CenterY,$Radius,$Radius,$Color);
  }
  }
 
  if ( $DrawAxisValues )
  {
  if ( $LabelsBackground )
  $Options = array("DrawBox"=>TRUE, "Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"BoxR"=>$LabelsBGR,"BoxG"=>$LabelsBGG,"BoxB"=>$LabelsBGB,"BoxAlpha"=>$LabelsBGAlpha);
  else
  $Options = array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE);
 
  if ( $AxisBoxRounded ) { $Options["BoxRounded"] = TRUE; }
 
  $Options["FontName"] = $AxisFontName;
  $Options["FontSize"] = $AxisFontSize;
 
  $Angle = 360 / ($Points*2);
  for($j=1;$j<=$Segments;$j++)
  {
  $Label = $j * $SegmentHeight;
 
  if ( $Layout == RADAR_LAYOUT_CIRCLE )
  {
  $EdgeX1 = cos(deg2rad($Angle+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterX;
  $EdgeY1 = sin(deg2rad($Angle+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterY;
  }
  elseif ( $Layout == RADAR_LAYOUT_STAR )
  {
  $EdgeX1 = cos(deg2rad($AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterX;
  $EdgeY1 = sin(deg2rad($AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterY;
  $EdgeX2 = cos(deg2rad((360 / $Points) + $AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterX;
  $EdgeY2 = sin(deg2rad((360 / $Points) + $AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterY;
 
  $EdgeX1 = ($EdgeX2 - $EdgeX1)/2 + $EdgeX1;
  $EdgeY1 = ($EdgeY2 - $EdgeY1)/2 + $EdgeY1;
  }
 
  $Object->drawText($EdgeX1,$EdgeY1,$Label,$Options);
  }
  }
 
  /* Axis lines */
  $ID = 0;
  for($i=0;$i<360;$i=$i+(360/$Points))
  {
  $EdgeX = cos(deg2rad($i+$AxisRotation)) * ($EdgeHeight+$TicksLength) + $CenterX;
  $EdgeY = sin(deg2rad($i+$AxisRotation)) * ($EdgeHeight+$TicksLength) + $CenterY;
 
  if ($ID % $SkipLabels == 0)
  { $Object->drawLine($CenterX,$CenterY,$EdgeX,$EdgeY,$Color); }
  else
  { $Object->drawLine($CenterX,$CenterY,$EdgeX,$EdgeY,$ColorDotted); }
 
  if ( $WriteLabels )
  {
  $LabelX = cos(deg2rad($i+$AxisRotation+$Axisoffset)) * ($EdgeHeight+$LabelPadding+$TicksLength) + $CenterX;
  $LabelY = sin(deg2rad($i+$AxisRotation+$Axisoffset)) * ($EdgeHeight+$LabelPadding+$TicksLength) + $CenterY;
 
  if ( $LabelSerie != "" )
  { $Label = isset($Data["Series"][$LabelSerie]["Data"][$ID]) ? $Data["Series"][$LabelSerie]["Data"][$ID] : ""; }
  else
  $Label = $ID;
 
  if ($ID % $SkipLabels == 0)
  {
  if ( $LabelPos == RADAR_LABELS_ROTATED )
  $Object->drawText($LabelX,$LabelY,$Label,array("Angle"=>(360-($i+$AxisRotation+$Axisoffset))-90,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
  else
  {
  if ( (floor($LabelX) == floor($CenterX)) && (floor($LabelY) < floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); }
  if ( (floor($LabelX) > floor($CenterX)) && (floor($LabelY) < floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_BOTTOMLEFT)); }
  if ( (floor($LabelX) > floor($CenterX)) && (floor($LabelY) == floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_MIDDLELEFT)); }
  if ( (floor($LabelX) > floor($CenterX)) && (floor($LabelY) > floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_TOPLEFT)); }
  if ( (floor($LabelX) < floor($CenterX)) && (floor($LabelY) < floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_BOTTOMRIGHT)); }
  if ( (floor($LabelX) < floor($CenterX)) && (floor($LabelY) == floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_MIDDLERIGHT)); }
  if ( (floor($LabelX) < floor($CenterX)) && (floor($LabelY) > floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_TOPRIGHT)); }
  if ( (floor($LabelX) == floor($CenterX)) && (floor($LabelY) > floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_TOPMIDDLE)); }
  }
  }
  }
  $ID++;
  }
 
  /* Compute the plots position */
  $ID = 0; $Plot = "";
  foreach($Data["Series"] as $SerieName => $Data)
  {
  if ( $SerieName != $LabelSerie )
  {
  $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"],"Surrounding"=>$PointSurrounding);
  foreach($Data["Data"] as $Key => $Value)
  {
  $Angle = (360/$Points) * $Key;
  $Length = ($EdgeHeight/($Segments*$SegmentHeight))*$Value;
 
  $X = cos(deg2rad($Angle+$AxisRotation)) * $Length + $CenterX;
  $Y = sin(deg2rad($Angle+$AxisRotation)) * $Length + $CenterY;
 
  $Plot[$ID][] = array($X,$Y);
  }
  $ID++;
  }
  }
 
  /* Draw all that stuff! */
  foreach($Plot as $ID => $Points)
  {
  $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"],"Surrounding"=>$PointSurrounding);
 
  /* Draw the polygons */
  if ( $DrawPoly )
  {
  if ($PolyAlpha != NULL)
  $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$PolyAlpha,"Surrounding"=>$PointSurrounding);
 
  $PointsArray = "";
  for($i=0; $i<count($Points);$i++)
  { $PointsArray[] = $Points[$i][0]; $PointsArray[] = $Points[$i][1]; }
  $Object->drawPolygon($PointsArray,$Color);
  }
 
  $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"],"Surrounding"=>$PointSurrounding);
 
  /* Draw the lines & points */
  for($i=0; $i<count($Points);$i++)
  {
  if ( $DrawLines && $i < count($Points)-1)
  $Object->drawLine($Points[$i][0],$Points[$i][1],$Points[$i+1][0],$Points[$i+1][1],$Color);
 
  if ( $DrawPoints )
  $Object->drawFilledCircle($Points[$i][0],$Points[$i][1],$PointRadius,$Color);
  }
 
  /* Loop to the starting points if asked */
  if ( $LineLoopStart && $DrawLines )
  $Object->drawLine($Points[$i-1][0],$Points[$i-1][1],$Points[0][0],$Points[0][1],$Color);
 
  }
  }
 
 
 
  /* Draw a radar chart */
  function drawPolar($Object,$Values,$Format="")
  {
  $this->pChartObject = $Object;
 
  $AxisR = isset($Format["AxisR"]) ? $Format["AxisR"] : 60;
  $AxisG = isset($Format["AxisG"]) ? $Format["AxisG"] : 60;
  $AxisB = isset($Format["AxisB"]) ? $Format["AxisB"] : 60;
  $AxisAlpha = isset($Format["AxisAlpha"]) ? $Format["AxisAlpha"] : 50;
  $AxisRotation = isset($Format["AxisRotation"]) ? $Format["AxisRotation"] : -90;
  $DrawTicks = isset($Format["DrawTicks"]) ? $Format["DrawTicks"] : TRUE;
  $TicksLength = isset($Format["TicksLength"]) ? $Format["TicksLength"] : 2;
  $DrawAxisValues = isset($Format["DrawAxisValues"]) ? $Format["DrawAxisValues"] : TRUE;
  $AxisBoxRounded = isset($Format["AxisBoxRounded"]) ? $Format["AxisBoxRounded"] : TRUE;
  $AxisFontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->pChartObject->FontName;
  $AxisFontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->pChartObject->FontSize;
  $DrawBackground = isset($Format["DrawBackground"]) ? $Format["DrawBackground"] : TRUE;
  $BackgroundR = isset($Format["BackgroundR"]) ? $Format["BackgroundR"] : 255;
  $BackgroundG = isset($Format["BackgroundG"]) ? $Format["BackgroundG"] : 255;
  $BackgroundB = isset($Format["BackgroundB"]) ? $Format["BackgroundB"] : 255;
  $BackgroundAlpha = isset($Format["BackgroundAlpha"]) ? $Format["BackgroundAlpha"] : 50;
  $BackgroundGradient= isset($Format["BackgroundGradient"]) ? $Format["BackgroundGradient"] : NULL;
  $AxisSteps = isset($Format["AxisSteps"]) ? $Format["AxisSteps"] : 20;
  $SegmentHeight = isset($Format["SegmentHeight"]) ? $Format["SegmentHeight"] : SEGMENT_HEIGHT_AUTO;
  $Segments = isset($Format["Segments"]) ? $Format["Segments"] : 4;
  $WriteLabels = isset($Format["WriteLabels"]) ? $Format["WriteLabels"] : TRUE;
  $LabelsBackground = isset($Format["LabelsBackground"]) ? $Format["LabelsBackground"] : TRUE;
  $LabelsBGR = isset($Format["LabelsBGR"]) ? $Format["LabelsBGR"] : 255;
  $LabelsBGG = isset($Format["LabelsBGR"]) ? $Format["LabelsBGG"] : 255;
  $LabelsBGB = isset($Format["LabelsBGR"]) ? $Format["LabelsBGB"] : 255;
  $LabelsBGAlpha = isset($Format["LabelsBGAlpha"]) ? $Format["LabelsBGAlpha"] : 50;
  $LabelPos = isset($Format["LabelPos"]) ? $Format["LabelPos"] : RADAR_LABELS_ROTATED;
  $LabelPadding = isset($Format["LabelPadding"]) ? $Format["LabelPadding"] : 4;
  $DrawPoints = isset($Format["DrawPoints"]) ? $Format["DrawPoints"] : TRUE;
  $PointRadius = isset($Format["PointRadius"]) ? $Format["PointRadius"] : 4;
  $PointSurrounding = isset($Format["PointRadius"]) ? $Format["PointRadius"] : -30;
  $DrawLines = isset($Format["DrawLines"]) ? $Format["DrawLines"] : TRUE;
  $LineLoopStart = isset($Format["LineLoopStart"]) ? $Format["LineLoopStart"] : FALSE;
  $DrawPoly = isset($Format["DrawPoly"]) ? $Format["DrawPoly"] : FALSE;
  $PolyAlpha = isset($Format["PolyAlpha"]) ? $Format["PolyAlpha"] : NULL;
  $FontSize = $Object->FontSize;
  $X1 = $Object->GraphAreaX1;
  $Y1 = $Object->GraphAreaY1;
  $X2 = $Object->GraphAreaX2;
  $Y2 = $Object->GraphAreaY2;
 
  if ( $AxisBoxRounded ) { $DrawAxisValues = TRUE; }
 
  /* Cancel default tick length if ticks not enabled */
  if ( $DrawTicks == FALSE ) { $TicksLength = 0; }
 
  /* Data Processing */
  $Data = $Values->getData();
  $Palette = $Values->getPalette();
 
  /* Catch the number of required axis */
  $LabelSerie = $Data["Abscissa"];
  if ( $LabelSerie != "" )
  { $Points = count($Data["Series"][$LabelSerie]["Data"]); }
  else
  {
  $Points = 0;
  foreach($Data["Series"] as $SerieName => $DataArray)
  { if ( count($DataArray["Data"]) > $Points ) { $Points = count($DataArray["Data"]); } }
  }
 
  /* Draw the axis */
  $CenterX = ($X2-$X1)/2 + $X1;
  $CenterY = ($Y2-$Y1)/2 + $Y1;
 
  $EdgeHeight = min(($X2-$X1)/2,($Y2-$Y1)/2);
  if ( $WriteLabels )
  $EdgeHeight = $EdgeHeight - $FontSize - $LabelPadding - $TicksLength;
 
  /* Determine the scale if set to automatic */
  if ( $SegmentHeight == SEGMENT_HEIGHT_AUTO)
  {
  $Max = 0;
  foreach($Data["Series"] as $SerieName => $DataArray)
  {
  if ( $SerieName != $LabelSerie )
  {
  if ( max($DataArray["Data"]) > $Max ) { $Max = max($DataArray["Data"]); }
  }
  }
  $MaxSegments = $EdgeHeight/20;
  $Scale = $Object->computeScale(0,$Max,$MaxSegments,array(1,2,5));
 
  $Segments = $Scale["Rows"];
  $SegmentHeight = $Scale["RowHeight"];
  }
 
 
  /* Background processing */
  if ( $DrawBackground )
  {
  $RestoreShadow = $Object->Shadow;
  $Object->Shadow = FALSE;
 
  if ($BackgroundGradient == NULL)
  {
  $Color = array("R"=>$BackgroundR,"G"=>$BackgroundG,"B"=>$BackgroundB,"Alpha"=>$BackgroundAlpha);
  $Object->drawFilledCircle($CenterX,$CenterY,$EdgeHeight,$Color);
  }
  else
  {
  $GradientROffset = ($BackgroundGradient["EndR"] - $BackgroundGradient["StartR"]) / $Segments;
  $GradientGOffset = ($BackgroundGradient["EndG"] - $BackgroundGradient["StartG"]) / $Segments;
  $GradientBOffset = ($BackgroundGradient["EndB"] - $BackgroundGradient["StartB"]) / $Segments;
  $GradientAlphaOffset = ($BackgroundGradient["EndAlpha"] - $BackgroundGradient["StartAlpha"]) / $Segments;
 
  for($j=$Segments;$j>=1;$j--)
  {
  $Color = array("R"=>$BackgroundGradient["StartR"]+$GradientROffset*$j,"G"=>$BackgroundGradient["StartG"]+$GradientGOffset*$j,"B"=>$BackgroundGradient["StartB"]+$GradientBOffset*$j,"Alpha"=>$BackgroundGradient["StartAlpha"]+$GradientAlphaOffset*$j);
  $Object->drawFilledCircle($CenterX,$CenterY,($EdgeHeight/$Segments)*$j,$Color);
  }
  }
  $Object->Shadow = $RestoreShadow;
  }
 
  /* Axis to axis lines */
  $Color = array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha);
  for($j=1;$j<=$Segments;$j++)
  {
  $Radius = ($EdgeHeight/$Segments)*$j;
  $Object->drawCircle($CenterX,$CenterY,$Radius,$Radius,$Color);
  }
 
  if ( $DrawAxisValues )
  {
  if ( $LabelsBackground )
  $Options = array("DrawBox"=>TRUE, "Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"BoxR"=>$LabelsBGR,"BoxG"=>$LabelsBGG,"BoxB"=>$LabelsBGB,"BoxAlpha"=>$LabelsBGAlpha);
  else
  $Options = array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE);
 
  if ( $AxisBoxRounded ) { $Options["BoxRounded"] = TRUE; }
 
  $Options["FontName"] = $AxisFontName;
  $Options["FontSize"] = $AxisFontSize;
 
  $Angle = 360 / ($Points*2);
  for($j=1;$j<=$Segments;$j++)
  {
  $EdgeX1 = cos(deg2rad($Angle+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterX;
  $EdgeY1 = sin(deg2rad($Angle+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterY;
  $Label = $j*$SegmentHeight;
 
  $Object->drawText($EdgeX1,$EdgeY1,$Label,$Options);
  }
  }
 
  /* Axis lines */
  $ID = 0;
  for($i=0;$i<=359;$i=$i+$AxisSteps)
  {
  $EdgeX = cos(deg2rad($i+$AxisRotation)) * ($EdgeHeight+$TicksLength) + $CenterX;
  $EdgeY = sin(deg2rad($i+$AxisRotation)) * ($EdgeHeight+$TicksLength) + $CenterY;
 
  $Object->drawLine($CenterX,$CenterY,$EdgeX,$EdgeY,$Color);
 
  if ( $WriteLabels )
  {
  $LabelX = cos(deg2rad($i+$AxisRotation)) * ($EdgeHeight+$LabelPadding+$TicksLength) + $CenterX;
  $LabelY = sin(deg2rad($i+$AxisRotation)) * ($EdgeHeight+$LabelPadding+$TicksLength) + $CenterY;
 
 
  if ( $LabelPos == RADAR_LABELS_ROTATED )
  $Object->drawText($LabelX,$LabelY,$Label,array("Angle"=>(360-$i),"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
  else
  {
  if ( (floor($LabelX) == floor($CenterX)) && (floor($LabelY) < floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); }
  if ( (floor($LabelX) > floor($CenterX)) && (floor($LabelY) < floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_BOTTOMLEFT)); }
  if ( (floor($LabelX) > floor($CenterX)) && (floor($LabelY) == floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_MIDDLELEFT)); }
  if ( (floor($LabelX) > floor($CenterX)) && (floor($LabelY) > floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_TOPLEFT)); }
  if ( (floor($LabelX) < floor($CenterX)) && (floor($LabelY) < floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_BOTTOMRIGHT)); }
  if ( (floor($LabelX) < floor($CenterX)) && (floor($LabelY) == floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_MIDDLERIGHT)); }
  if ( (floor($LabelX) < floor($CenterX)) && (floor($LabelY) > floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_TOPRIGHT)); }
  if ( (floor($LabelX) == floor($CenterX)) && (floor($LabelY) > floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_TOPMIDDLE)); }
  }
  }
  $ID++;
  }
 
  /* Compute the plots position */
  $ID = 0; $Plot = "";
  foreach($Data["Series"] as $SerieName => $DataSet)
  {
  if ( $SerieName != $LabelSerie )
  {
  $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"],"Surrounding"=>$PointSurrounding);
  foreach($DataSet["Data"] as $Key => $Value)
  {
  $Angle = $Data["Series"][$LabelSerie]["Data"][$Key];
  $Length = ($EdgeHeight/($Segments*$SegmentHeight))*$Value;
 
  $X = cos(deg2rad($Angle+$AxisRotation)) * $Length + $CenterX;
  $Y = sin(deg2rad($Angle+$AxisRotation)) * $Length + $CenterY;
 
  $Plot[$ID][] = array($X,$Y);
  }
  $ID++;
  }
  }
 
  /* Draw all that stuff! */
  foreach($Plot as $ID => $Points)
  {
  $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"],"Surrounding"=>$PointSurrounding);
 
  /* Draw the polygons */
  if ( $DrawPoly )
  {
  if ($PolyAlpha != NULL)
  $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$PolyAlpha,"Surrounding"=>$PointSurrounding);
 
  $PointsArray = "";
  for($i=0; $i<count($Points);$i++)
  { $PointsArray[] = $Points[$i][0]; $PointsArray[] = $Points[$i][1]; }
 
  $Object->drawPolygon($PointsArray,$Color);
  }
 
  $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"],"Surrounding"=>$PointSurrounding);
 
  /* Draw the lines & points */
  for($i=0; $i<count($Points);$i++)
  {
  if ( $DrawLines && $i < count($Points)-1)
  $Object->drawLine($Points[$i][0],$Points[$i][1],$Points[$i+1][0],$Points[$i+1][1],$Color);
 
  if ( $DrawPoints )
  $Object->drawFilledCircle($Points[$i][0],$Points[$i][1],$PointRadius,$Color);
  }
 
  /* Loop to the starting points if asked */
  if ( $LineLoopStart && $DrawLines )
  $Object->drawLine($Points[$i-1][0],$Points[$i-1][1],$Points[0][0],$Points[0][1],$Color);
  }
  }
  }
  ?>
  <?php
  /*
  pScatter - class to draw scatter charts
 
  Version : 2.1.0
  Made by : Jean-Damien POGOLOTTI
  Last Update : 26/01/11
 
  This file can be distributed under the license you can find at :
 
  http://www.pchart.net/license
 
  You can find the whole class documentation on the pChart web site.
  */
 
  define("SCATTER_MISSING_X_SERIE" , 190001);
  define("SCATTER_MISSING_Y_SERIE" , 190002);
 
  /* pScatter class definition */
  class pScatter
  {
  var $pChartObject;
  var $pDataObject;
 
  /* Class creator */
  function pScatter($pChartObject,$pDataObject)
  {
  $this->pChartObject = $pChartObject;
  $this->pDataObject = $pDataObject;
  }
 
  /* Prepare the scale */
  function drawScatterScale($Format="")
  {
  $Mode = isset($Format["Mode"]) ? $Format["Mode"] : SCALE_MODE_FLOATING;
  $Floating = isset($Format["Floating"]) ? $Format["Floating"] : FALSE;
  $XLabelsRotation = isset($Format["XLabelsRotation"]) ? $Format["XLabelsRotation"] : 90;
  $MinDivHeight = isset($Format["MinDivHeight"]) ? $Format["MinDivHeight"] : 20;
  $Factors = isset($Format["Factors"]) ? $Format["Factors"] : array(1,2,5);
  $ManualScale = isset($Format["ManualScale"]) ? $Format["ManualScale"] : array("0"=>array("Min"=>-100,"Max"=>100));
  $XMargin = isset($Format["XMargin"]) ? $Format["XMargin"] : 0;
  $YMargin = isset($Format["YMargin"]) ? $Format["YMargin"] : 0;
  $ScaleSpacing = isset($Format["ScaleSpacing"]) ? $Format["ScaleSpacing"] : 15;
  $InnerTickWidth = isset($Format["InnerTickWidth"]) ? $Format["InnerTickWidth"] : 2;
  $OuterTickWidth = isset($Format["OuterTickWidth"]) ? $Format["OuterTickWidth"] : 2;
  $DrawXLines = isset($Format["DrawXLines"]) ? $Format["DrawXLines"] : ALL;
  $DrawYLines = isset($Format["DrawYLines"]) ? $Format["DrawYLines"] : ALL;
  $GridTicks = isset($Format["GridTicks"]) ? $Format["GridTicks"] : 4;
  $GridR = isset($Format["GridR"]) ? $Format["GridR"] : 255;
  $GridG = isset($Format["GridG"]) ? $Format["GridG"] : 255;
  $GridB = isset($Format["GridB"]) ? $Format["GridB"] : 255;
  $GridAlpha = isset($Format["GridAlpha"]) ? $Format["GridAlpha"] : 40;
  $AxisRo = isset($Format["AxisR"]) ? $Format["AxisR"] : 0;
  $AxisGo = isset($Format["AxisG"]) ? $Format["AxisG"] : 0;
  $AxisBo = isset($Format["AxisB"]) ? $Format["AxisB"] : 0;
  $AxisAlpha = isset($Format["AxisAlpha"]) ? $Format["AxisAlpha"] : 100;
  $TickRo = isset($Format["TickR"]) ? $Format["TickR"] : 0;
  $TickGo = isset($Format["TickG"]) ? $Format["TickG"] : 0;
  $TickBo = isset($Format["TickB"]) ? $Format["TickB"] : 0;
  $TickAlpha = isset($Format["TickAlpha"]) ? $Format["TickAlpha"] : 100;
  $DrawSubTicks = isset($Format["DrawSubTicks"]) ? $Format["DrawSubTicks"] : FALSE;
  $InnerSubTickWidth = isset($Format["InnerSubTickWidth"]) ? $Format["InnerSubTickWidth"] : 0;
  $OuterSubTickWidth = isset($Format["OuterSubTickWidth"]) ? $Format["OuterSubTickWidth"] : 2;
  $SubTickR = isset($Format["SubTickR"]) ? $Format["SubTickR"] : 255;
  $SubTickG = isset($Format["SubTickG"]) ? $Format["SubTickG"] : 0;
  $SubTickB = isset($Format["SubTickB"]) ? $Format["SubTickB"] : 0;
  $SubTickAlpha = isset($Format["SubTickAlpha"]) ? $Format["SubTickAlpha"] : 100;
  $XReleasePercent = isset($Format["XReleasePercent"]) ? $Format["XReleasePercent"] : 1;
  $DrawArrows = isset($Format["DrawArrows"]) ? $Format["DrawArrows"] : FALSE;
  $ArrowSize = isset($Format["ArrowSize"]) ? $Format["ArrowSize"] : 8;
  $CycleBackground = isset($Format["CycleBackground"]) ? $Format["CycleBackground"] : FALSE;
  $BackgroundR1 = isset($Format["BackgroundR1"]) ? $Format["BackgroundR1"] : 255;
  $BackgroundG1 = isset($Format["BackgroundG1"]) ? $Format["BackgroundG1"] : 255;
  $BackgroundB1 = isset($Format["BackgroundB1"]) ? $Format["BackgroundB1"] : 255;
  $BackgroundAlpha1 = isset($Format["BackgroundAlpha1"]) ? $Format["BackgroundAlpha1"] : 10;
  $BackgroundR2 = isset($Format["BackgroundR2"]) ? $Format["BackgroundR2"] : 230;
  $BackgroundG2 = isset($Format["BackgroundG2"]) ? $Format["BackgroundG2"] : 230;
  $BackgroundB2 = isset($Format["BackgroundB2"]) ? $Format["BackgroundB2"] : 230;
  $BackgroundAlpha2 = isset($Format["BackgroundAlpha2"]) ? $Format["BackgroundAlpha2"] : 10;
 
  /* Check if we have at least both one X and Y axis */
  $GotXAxis = FALSE; $GotYAxis = FALSE;
  foreach($this->pDataObject->Data["Axis"] as $AxisID => $AxisSettings)
  {
  if ( $AxisSettings["Identity"] == AXIS_X ) { $GotXAxis = TRUE; }
  if ( $AxisSettings["Identity"] == AXIS_Y ) { $GotYAxis = TRUE; }
  }
  if ( !$GotXAxis ) { return(SCATTER_MISSING_X_SERIE); }
  if ( !$GotYAxis ) { return(SCATTER_MISSING_Y_SERIE); }
 
  /* Skip a NOTICE event in case of an empty array */
  if ( $DrawYLines == NONE ) { $DrawYLines = array("zarma"=>"31"); }
 
  $Data = $this->pDataObject->getData();
 
  foreach($Data["Axis"] as $AxisID => $AxisSettings)
  {
  if ( $AxisSettings["Identity"] == AXIS_X)
  { $Width = $this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1 - $XMargin*2; }
  else
  { $Width = $this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1 - $YMargin*2; }
 
  $AxisMin = ABSOLUTE_MAX; $AxisMax = OUT_OF_SIGHT;
  if ( $Mode == SCALE_MODE_FLOATING )
  {
  foreach($Data["Series"] as $SerieID => $SerieParameter)
  {
  if ( $SerieParameter["Axis"] == $AxisID && $Data["Series"][$SerieID]["isDrawable"] )
  {
  $AxisMax = max($AxisMax,$Data["Series"][$SerieID]["Max"]);
  $AxisMin = min($AxisMin,$Data["Series"][$SerieID]["Min"]);
  }
  }
  $AutoMargin = (($AxisMax-$AxisMin)/100)*$XReleasePercent;
 
  $Data["Axis"][$AxisID]["Min"] = $AxisMin-$AutoMargin; $Data["Axis"][$AxisID]["Max"] = $AxisMax+$AutoMargin;
  }
  elseif ( $Mode == SCALE_MODE_MANUAL )
  {
  if ( isset($ManualScale[$AxisID]["Min"]) && isset($ManualScale[$AxisID]["Max"]) )
  {
  $Data["Axis"][$AxisID]["Min"] = $ManualScale[$AxisID]["Min"];
  $Data["Axis"][$AxisID]["Max"] = $ManualScale[$AxisID]["Max"];
  }
  else
  { echo "Manual scale boundaries not set."; exit(); }
  }
 
  /* Full manual scale */
  if ( isset($ManualScale[$AxisID]["Rows"]) && isset($ManualScale[$AxisID]["RowHeight"]) )
  $Scale = array("Rows"=>$ManualScale[$AxisID]["Rows"],"RowHeight"=>$ManualScale[$AxisID]["RowHeight"],"XMin"=>$ManualScale[$AxisID]["Min"],"XMax"=>$ManualScale[$AxisID]["Max"]);
  else
  {
  $MaxDivs = floor($Width/$MinDivHeight);
  $Scale = $this->pChartObject->computeScale($Data["Axis"][$AxisID]["Min"],$Data["Axis"][$AxisID]["Max"],$MaxDivs,$Factors,$AxisID);
  }
 
  $Data["Axis"][$AxisID]["Margin"] = $AxisSettings["Identity"] == AXIS_X ? $XMargin : $YMargin;
  $Data["Axis"][$AxisID]["ScaleMin"] = $Scale["XMin"];
  $Data["Axis"][$AxisID]["ScaleMax"] = $Scale["XMax"];
  $Data["Axis"][$AxisID]["Rows"] = $Scale["Rows"];
  $Data["Axis"][$AxisID]["RowHeight"] = $Scale["RowHeight"];
 
  if ( isset($Scale["Format"]) ) { $Data["Axis"][$AxisID]["Format"] = $Scale["Format"]; }
 
  if ( !isset($Data["Axis"][$AxisID]["Display"]) ) { $Data["Axis"][$AxisID]["Display"] = NULL; }
  if ( !isset($Data["Axis"][$AxisID]["Format"]) ) { $Data["Axis"][$AxisID]["Format"] = NULL; }
  if ( !isset($Data["Axis"][$AxisID]["Unit"]) ) { $Data["Axis"][$AxisID]["Unit"] = NULL; }
  }
 
  /* Get the default font color */
  $FontColorRo = $this->pChartObject->FontColorR; $FontColorGo = $this->pChartObject->FontColorG; $FontColorBo = $this->pChartObject->FontColorB;
 
  /* Set the original boundaries */
  $AxisPos["L"] = $this->pChartObject->GraphAreaX1; $AxisPos["R"] = $this->pChartObject->GraphAreaX2; $AxisPos["T"] = $this->pChartObject->GraphAreaY1; $AxisPos["B"] = $this->pChartObject->GraphAreaY2;
 
  foreach($Data["Axis"] as $AxisID => $AxisSettings)
  {
  if ( isset($AxisSettings["Color"]) )
  {
  $AxisR = $AxisSettings["Color"]["R"]; $AxisG = $AxisSettings["Color"]["G"]; $AxisB = $AxisSettings["Color"]["B"];
  $TickR = $AxisSettings["Color"]["R"]; $TickG = $AxisSettings["Color"]["G"]; $TickB = $AxisSettings["Color"]["B"];
  $this->pChartObject->setFontProperties(array("R"=>$AxisSettings["Color"]["R"],"G"=>$AxisSettings["Color"]["G"],"B"=>$AxisSettings["Color"]["B"]));
  }
  else
  {
  $AxisR = $AxisRo; $AxisG = $AxisGo; $AxisB = $AxisBo;
  $TickR = $TickRo; $TickG = $TickGo; $TickB = $TickBo;
  $this->pChartObject->setFontProperties(array("R"=>$FontColorRo,"G"=>$FontColorGo,"B"=>$FontColorBo));
  }
 
  $LastValue = "w00t"; $ID = 1;
  if ( $AxisSettings["Identity"] == AXIS_X )
  {
  if ( $AxisSettings["Position"] == AXIS_POSITION_BOTTOM )
  {
  if ( $XLabelsRotation == 0 ) { $LabelAlign = TEXT_ALIGN_TOPMIDDLE; $LabelOffset = 2; }
  if ( $XLabelsRotation > 0 && $XLabelsRotation < 190 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $LabelOffset = 5; }
  if ( $XLabelsRotation == 180 ) { $LabelAlign = TEXT_ALIGN_BOTTOMMIDDLE; $LabelOffset = 5; }
  if ( $XLabelsRotation > 180 && $XLabelsRotation < 360 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $LabelOffset = 2; }
 
  if ( $Floating )
  { $FloatingOffset = $YMargin; $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1+$AxisSettings["Margin"],$AxisPos["B"],$this->pChartObject->GraphAreaX2-$AxisSettings["Margin"],$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
  else
  { $FloatingOffset = 0; $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1,$AxisPos["B"],$this->pChartObject->GraphAreaX2,$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
 
  if ( $DrawArrows ) { $this->pChartObject->drawArrow($this->pChartObject->GraphAreaX2-$AxisSettings["Margin"],$AxisPos["B"],$this->pChartObject->GraphAreaX2+($ArrowSize*2),$AxisPos["B"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }
 
  $Width = ($this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1) - $AxisSettings["Margin"]*2;
  $Step = $Width / $AxisSettings["Rows"]; $SubTicksSize = $Step /2; $MaxBottom = $AxisPos["B"];
  $LastX = NULL;
  for($i=0;$i<=$AxisSettings["Rows"];$i++)
  {
  $XPos = $this->pChartObject->GraphAreaX1 + $AxisSettings["Margin"] + $Step*$i;
  $YPos = $AxisPos["B"];
  $Value = $this->pChartObject->scaleFormat($AxisSettings["ScaleMin"] + $AxisSettings["RowHeight"]*$i,$AxisSettings["Display"],$AxisSettings["Format"],$AxisSettings["Unit"]);
 
  if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); }
  if ( $LastX != NULL && $CycleBackground && ( $DrawXLines == ALL || in_array($AxisID,$DrawXLines) )) { $this->pChartObject->drawFilledRectangle($LastX,$this->pChartObject->GraphAreaY1+$FloatingOffset,$XPos,$this->pChartObject->GraphAreaY2-$FloatingOffset,$BGColor); }
 
  if ( $DrawXLines == ALL || in_array($AxisID,$DrawXLines) ) { $this->pChartObject->drawLine($XPos,$this->pChartObject->GraphAreaY1+$FloatingOffset,$XPos,$this->pChartObject->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }
  if ( $DrawSubTicks && $i != $AxisSettings["Rows"] )
  $this->pChartObject->drawLine($XPos+$SubTicksSize,$YPos-$InnerSubTickWidth,$XPos+$SubTicksSize,$YPos+$OuterSubTickWidth,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha));
 
  $this->pChartObject->drawLine($XPos,$YPos-$InnerTickWidth,$XPos,$YPos+$OuterTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha));
  $Bounds = $this->pChartObject->drawText($XPos,$YPos+$OuterTickWidth+$LabelOffset,$Value,array("Angle"=>$XLabelsRotation,"Align"=>$LabelAlign));
  $TxtBottom = $YPos+2+$OuterTickWidth+2+($Bounds[0]["Y"]-$Bounds[2]["Y"]);
  $MaxBottom = max($MaxBottom,$TxtBottom);
 
  $LastX = $XPos;
  }
 
  if ( isset($AxisSettings["Name"]) )
  {
  $YPos = $MaxBottom+2;
  $XPos = $this->pChartObject->GraphAreaX1+($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1)/2;
  $Bounds = $this->pChartObject->drawText($XPos,$YPos,$AxisSettings["Name"],array("Align"=>TEXT_ALIGN_TOPMIDDLE));
  $MaxBottom = $Bounds[0]["Y"];
 
  $this->pDataObject->Data["GraphArea"]["Y2"] = $MaxBottom + $this->pChartObject->FontSize;
  }
 
  $AxisPos["B"] = $MaxBottom + $ScaleSpacing;
  }
  elseif ( $AxisSettings["Position"] == AXIS_POSITION_TOP )
  {
  if ( $XLabelsRotation == 0 ) { $LabelAlign = TEXT_ALIGN_BOTTOMMIDDLE; $LabelOffset = 2; }
  if ( $XLabelsRotation > 0 && $XLabelsRotation < 190 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $LabelOffset = 2; }
  if ( $XLabelsRotation == 180 ) { $LabelAlign = TEXT_ALIGN_TOPMIDDLE; $LabelOffset = 5; }
  if ( $XLabelsRotation > 180 && $SLabelxRotation < 360 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $LabelOffset = 5; }
 
  if ( $Floating )
  { $FloatingOffset = $YMargin; $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1+$AxisSettings["Margin"],$AxisPos["T"],$this->pChartObject->GraphAreaX2-$AxisSettings["Margin"],$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
  else
  { $FloatingOffset = 0; $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1,$AxisPos["T"],$this->pChartObject->GraphAreaX2,$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
 
  if ( $DrawArrows ) { $this->pChartObject->drawArrow($this->pChartObject->GraphAreaX2-$AxisSettings["Margin"],$AxisPos["T"],$this->pChartObject->GraphAreaX2+($ArrowSize*2),$AxisPos["T"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }
 
  $Width = ($this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1) - $AxisSettings["Margin"]*2;
  $Step = $Width / $AxisSettings["Rows"]; $SubTicksSize = $Step /2; $MinTop = $AxisPos["T"];
  $LastX = NULL;
  for($i=0;$i<=$AxisSettings["Rows"];$i++)
  {
  $XPos = $this->pChartObject->GraphAreaX1 + $AxisSettings["Margin"] + $Step*$i;
  $YPos = $AxisPos["T"];
  $Value = $this->pChartObject->scaleFormat($AxisSettings["ScaleMin"] + $AxisSettings["RowHeight"]*$i,$AxisSettings["Display"],$AxisSettings["Format"],$AxisSettings["Unit"]);
 
  if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); }
  if ( $LastX != NULL && $CycleBackground && ( $DrawXLines == ALL || in_array($AxisID,$DrawXLines) )) { $this->pChartObject->drawFilledRectangle($LastX,$this->pChartObject->GraphAreaY1+$FloatingOffset,$XPos,$this->pChartObject->GraphAreaY2-$FloatingOffset,$BGColor); }
 
  if ( $DrawXLines == ALL || in_array($AxisID,$DrawXLines) ) { $this->pChartObject->drawLine($XPos,$this->pChartObject->GraphAreaY1+$FloatingOffset,$XPos,$this->pChartObject->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }
 
  if ( $DrawSubTicks && $i != $AxisSettings["Rows"] )
  $this->pChartObject->drawLine($XPos+$SubTicksSize,$YPos-$OuterSubTickWidth,$XPos+$SubTicksSize,$YPos+$InnerSubTickWidth,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha));
 
  $this->pChartObject->drawLine($XPos,$YPos-$OuterTickWidth,$XPos,$YPos+$InnerTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha));
  $Bounds = $this->pChartObject->drawText($XPos,$YPos-$OuterTickWidth-$LabelOffset,$Value,array("Angle"=>$XLabelsRotation,"Align"=>$LabelAlign));
  $TxtBox = $YPos-$OuterTickWidth-4-($Bounds[0]["Y"]-$Bounds[2]["Y"]);
  $MinTop = min($MinTop,$TxtBox);
 
  $LastX = $XPos;
  }
 
  if ( isset($AxisSettings["Name"]) )
  {
  $YPos = $MinTop-2;
  $XPos = $this->pChartObject->GraphAreaX1+($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1)/2;
  $Bounds = $this->pChartObject->drawText($XPos,$YPos,$AxisSettings["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
  $MinTop = $Bounds[2]["Y"];
 
  $this->pDataObject->Data["GraphArea"]["Y1"] = $MinTop;
  }
 
  $AxisPos["T"] = $MinTop - $ScaleSpacing;
  }
  }
  elseif ( $AxisSettings["Identity"] == AXIS_Y )
  {
  if ( $AxisSettings["Position"] == AXIS_POSITION_LEFT )
  {
 
  if ( $Floating )
  { $FloatingOffset = $XMargin; $this->pChartObject->drawLine($AxisPos["L"],$this->pChartObject->GraphAreaY1+$AxisSettings["Margin"],$AxisPos["L"],$this->pChartObject->GraphAreaY2-$AxisSettings["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
  else
  { $FloatingOffset = 0; $this->pChartObject->drawLine($AxisPos["L"],$this->pChartObject->GraphAreaY1,$AxisPos["L"],$this->pChartObject->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
 
  if ( $DrawArrows ) { $this->pChartObject->drawArrow($AxisPos["L"],$this->pChartObject->GraphAreaY1+$AxisSettings["Margin"],$AxisPos["L"],$this->pChartObject->GraphAreaY1-($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }
 
  $Height = ($this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1) - $AxisSettings["Margin"]*2;
  $Step = $Height / $AxisSettings["Rows"]; $SubTicksSize = $Step /2; $MinLeft = $AxisPos["L"];
  $LastY = NULL;
  for($i=0;$i<=$AxisSettings["Rows"];$i++)
  {
  $YPos = $this->pChartObject->GraphAreaY2 - $AxisSettings["Margin"] - $Step*$i;
  $XPos = $AxisPos["L"];
  $Value = $this->pChartObject->scaleFormat($AxisSettings["ScaleMin"] + $AxisSettings["RowHeight"]*$i,$AxisSettings["Display"],$AxisSettings["Format"],$AxisSettings["Unit"]);
 
  if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); }
  if ( $LastY != NULL && $CycleBackground && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->pChartObject->drawFilledRectangle($this->pChartObject->GraphAreaX1+$FloatingOffset,$LastY,$this->pChartObject->GraphAreaX2-$FloatingOffset,$YPos,$BGColor); }
 
  if ( ($YPos != $this->pChartObject->GraphAreaY1 && $YPos != $this->pChartObject->GraphAreaY2) && ($DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1+$FloatingOffset,$YPos,$this->pChartObject->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }
 
  if ( $DrawSubTicks && $i != $AxisSettings["Rows"] )
  $this->pChartObject->drawLine($XPos-$OuterSubTickWidth,$YPos-$SubTicksSize,$XPos+$InnerSubTickWidth,$YPos-$SubTicksSize,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha));
 
  $this->pChartObject->drawLine($XPos-$OuterTickWidth,$YPos,$XPos+$InnerTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha));
  $Bounds = $this->pChartObject->drawText($XPos-$OuterTickWidth-2,$YPos,$Value,array("Align"=>TEXT_ALIGN_MIDDLERIGHT));
  $TxtLeft = $XPos-$OuterTickWidth-2-($Bounds[1]["X"]-$Bounds[0]["X"]);
  $MinLeft = min($MinLeft,$TxtLeft);
 
  $LastY = $YPos;
  }
 
  if ( isset($AxisSettings["Name"]) )
  {
  $XPos = $MinLeft-2;
  $YPos = $this->pChartObject->GraphAreaY1+($this->pChartObject->GraphAreaY2-$this->pChartObject->GraphAreaY1)/2;
  $Bounds = $this->pChartObject->drawText($XPos,$YPos,$AxisSettings["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>90));
  $MinLeft = $Bounds[2]["X"];
 
  $this->pDataObject->Data["GraphArea"]["X1"] = $MinLeft;
  }
 
  $AxisPos["L"] = $MinLeft - $ScaleSpacing;
  }
  elseif ( $AxisSettings["Position"] == AXIS_POSITION_RIGHT )
  {
 
  if ( $Floating )
  { $FloatingOffset = $XMargin; $this->pChartObject->drawLine($AxisPos["R"],$this->pChartObject->GraphAreaY1+$AxisSettings["Margin"],$AxisPos["R"],$this->pChartObject->GraphAreaY2-$AxisSettings["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
  else
  { $FloatingOffset = 0; $this->pChartObject->drawLine($AxisPos["R"],$this->pChartObject->GraphAreaY1,$AxisPos["R"],$this->pChartObject->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }
 
  if ( $DrawArrows ) { $this->pChartObject->drawArrow($AxisPos["R"],$this->pChartObject->GraphAreaY1+$AxisSettings["Margin"],$AxisPos["R"],$this->pChartObject->GraphAreaY1-($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }
 
  $Height = ($this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1) - $AxisSettings["Margin"]*2;
  $Step = $Height / $AxisSettings["Rows"]; $SubTicksSize = $Step /2; $MaxLeft = $AxisPos["R"];
  $LastY = NULL;
  for($i=0;$i<=$AxisSettings["Rows"];$i++)
  {
  $YPos = $this->pChartObject->GraphAreaY2 - $AxisSettings["Margin"] - $Step*$i;
  $XPos = $AxisPos["R"];
  $Value = $this->pChartObject->scaleFormat($AxisSettings["ScaleMin"] + $AxisSettings["RowHeight"]*$i,$AxisSettings["Display"],$AxisSettings["Format"],$AxisSettings["Unit"]);
 
  if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); }
  if ( $LastY != NULL && $CycleBackground && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->pChartObject->drawFilledRectangle($this->pChartObject->GraphAreaX1+$FloatingOffset,$LastY,$this->pChartObject->GraphAreaX2-$FloatingOffset,$YPos,$BGColor); }
 
  if ( ($YPos != $this->pChartObject->GraphAreaY1 && $YPos != $this->pChartObject->GraphAreaY2) && ($DrawYLines == ALL || in_array($AxisID,$DrawYLines)) ) { $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1+$FloatingOffset,$YPos,$this->pChartObject->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }
 
  if ( $DrawSubTicks && $i != $AxisSettings["Rows"] )
  $this->pChartObject->drawLine($XPos-$InnerSubTickWidth,$YPos-$SubTicksSize,$XPos+$OuterSubTickWidth,$YPos-$SubTicksSize,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha));
 
  $this->pChartObject->drawLine($XPos-$InnerTickWidth,$YPos,$XPos+$OuterTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha));
  $Bounds = $this->pChartObject->drawText($XPos+$OuterTickWidth+2,$YPos,$Value,array("Align"=>TEXT_ALIGN_MIDDLELEFT));
  $TxtLeft = $XPos+$OuterTickWidth+2+($Bounds[1]["X"]-$Bounds[0]["X"]);
  $MaxLeft = max($MaxLeft,$TxtLeft);
 
  $LastY = $YPos;
  }
 
  if ( isset($AxisSettings["Name"]) )
  {
  $XPos = $MaxLeft+6;
  $YPos = $this->pChartObject->GraphAreaY1+($this->pChartObject->GraphAreaY2-$this->pChartObject->GraphAreaY1)/2;
  $Bounds = $this->pChartObject->drawText($XPos,$YPos,$AxisSettings["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>270));
  $MaxLeft = $Bounds[2]["X"];
 
  $this->pDataObject->Data["GraphArea"]["X2"] = $MaxLeft + $this->pChartObject->FontSize;
  }
 
  $AxisPos["R"] = $MaxLeft + $ScaleSpacing;
  }
  }
  }
 
  $this->pDataObject->saveAxisConfig($Data["Axis"]);
  }
 
  /* Draw a scatter plot chart */
  function drawScatterPlotChart($Format=NULL)
  {
  $PlotSize = isset($Format["PlotSize"]) ? $Format["PlotSize"] : 3;
  $PlotBorder = isset($Format["PlotBorder"]) ? $Format["PlotBorder"] : FALSE;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 250;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 250;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 250;
  $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : 30;
  $BorderSize = isset($Format["BorderSize"]) ? $Format["BorderSize"] : 1;
  $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;
 
  $Data = $this->pDataObject->getData();
  $Palette = $this->pDataObject->getPalette();
 
  $BorderColor = array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha);
 
  foreach($Data["ScatterSeries"] as $Key => $Series)
  {
  $SerieX = $Series["X"]; $SerieValuesX = $Data["Series"][$SerieX]["Data"]; $SerieXAxis = $Data["Series"][$SerieX]["Axis"];
  $SerieY = $Series["Y"]; $SerieValuesY = $Data["Series"][$SerieY]["Data"]; $SerieYAxis = $Data["Series"][$SerieY]["Axis"];
 
  if ( isset($Series["Picture"]) && $Series["Picture"] != "" )
  { $Picture = $Series["Picture"]; list($PicWidth,$PicHeight,$PicType) = $this->pChartObject->getPicInfo($Picture); }
  else
  { $Picture = NULL; }
 
  $PosArrayX = $this->getPosArray($SerieValuesX,$SerieXAxis);
  if ( !is_array($PosArrayX) ) { $Value = $PosArrayX; $PosArrayX = ""; $PosArrayX[0] = $Value; }
  $PosArrayY = $this->getPosArray($SerieValuesY,$SerieYAxis);
  if ( !is_array($PosArrayY) ) { $Value = $PosArrayY; $PosArrayY = ""; $PosArrayY[0] = $Value; }
 
  $Color = array("R"=>$Series["Color"]["R"],"G"=>$Series["Color"]["G"],"B"=>$Series["Color"]["B"],"Alpha"=>$Series["Color"]["Alpha"]);
 
  foreach($PosArrayX as $Key => $Value)
  {
  $X = $Value; $Y = $PosArrayY[$Key];
 
  if ( $X != VOID && $Y != VOID )
  {
  if ( $Picture == NULL )
  {
  if ( $PlotBorder ) { $this->pChartObject->drawFilledCircle($X,$Y,$PlotSize+$BorderSize,$BorderColor); }
  $this->pChartObject->drawFilledCircle($X,$Y,$PlotSize,$Color);
  }
  else
  { $this->pChartObject->drawFromPicture($PicType,$Picture,$X-$PicWidth/2,$Y-$PicHeight/2); }
  }
  }
  }
  }
 
  /* Draw a scatter line chart */
  function drawScatterLineChart($Format=NULL)
  {
  $Data = $this->pDataObject->getData();
  $Palette = $this->pDataObject->getPalette();
 
  /* Parse all the series to draw */
  foreach($Data["ScatterSeries"] as $Key => $Series)
  {
  $SerieX = $Series["X"]; $SerieValuesX = $Data["Series"][$SerieX]["Data"]; $SerieXAxis = $Data["Series"][$SerieX]["Axis"];
  $SerieY = $Series["Y"]; $SerieValuesY = $Data["Series"][$SerieY]["Data"]; $SerieYAxis = $Data["Series"][$SerieY]["Axis"];
  $Ticks = $Series["Ticks"];
  $Weight = $Series["Weight"];
 
  $PosArrayX = $this->getPosArray($SerieValuesX,$SerieXAxis);
  if ( !is_array($PosArrayX) ) { $Value = $PosArrayX; $PosArrayX = ""; $PosArrayX[0] = $Value; }
  $PosArrayY = $this->getPosArray($SerieValuesY,$SerieYAxis);
  if ( !is_array($PosArrayY) ) { $Value = $PosArrayY; $PosArrayY = ""; $PosArrayY[0] = $Value; }
 
  $Color = array("R"=>$Series["Color"]["R"],"G"=>$Series["Color"]["G"],"B"=>$Series["Color"]["B"],"Alpha"=>$Series["Color"]["Alpha"]);
  if ( $Ticks != 0 ) { $Color["Ticks"] = $Ticks; }
  if ( $Weight != 0 ) { $Color["Weight"] = $Weight; }
 
  $LastX = VOID; $LastY = VOID;
  foreach($PosArrayX as $Key => $Value)
  {
  $X = $Value; $Y = $PosArrayY[$Key];
 
  if ( $X != VOID && $Y != VOID && $LastX != VOID && $LastY != VOID)
  $this->pChartObject->drawLine($LastX,$LastY,$X,$Y,$Color);
 
  $LastX = $X; $LastY = $Y;
  }
  }
  }
 
  /* Draw a scatter spline chart */
  function drawScatterSplineChart($Format=NULL)
  {
  $Data = $this->pDataObject->getData();
  $Palette = $this->pDataObject->getPalette();
 
  foreach($Data["ScatterSeries"] as $Key => $Series)
  {
  $SerieX = $Series["X"]; $SerieValuesX = $Data["Series"][$SerieX]["Data"]; $SerieXAxis = $Data["Series"][$SerieX]["Axis"];
  $SerieY = $Series["Y"]; $SerieValuesY = $Data["Series"][$SerieY]["Data"]; $SerieYAxis = $Data["Series"][$SerieY]["Axis"];
  $Ticks = $Series["Ticks"];
  $Weight = $Series["Weight"];
 
  $PosArrayX = $this->getPosArray($SerieValuesX,$SerieXAxis);
  if ( !is_array($PosArrayX) ) { $Value = $PosArrayX; $PosArrayX = ""; $PosArrayX[0] = $Value; }
  $PosArrayY = $this->getPosArray($SerieValuesY,$SerieYAxis);
  if ( !is_array($PosArrayY) ) { $Value = $PosArrayY; $PosArrayY = ""; $PosArrayY[0] = $Value; }
 
  $SplineSettings = array("R"=>$Series["Color"]["R"],"G"=>$Series["Color"]["G"],"B"=>$Series["Color"]["B"],"Alpha"=>$Series["Color"]["Alpha"]);
  if ( $Ticks != 0 ) { $SplineSettings["Ticks"] = $Ticks; }
  if ( $Weight != 0 ) { $SplineSettings["Weight"] = $Weight; }
 
  $LastX = VOID; $LastY = VOID; $WayPoints = ""; $Forces = "";
  foreach($PosArrayX as $Key => $Value)
  {
  $X = $Value; $Y = $PosArrayY[$Key];
 
  $Force = $this->pChartObject->getLength($LastX,$LastY,$X,$Y)/5;
 
  if ( $X != VOID && $Y != VOID )
  { $WayPoints[] = array($X,$Y); $Forces[] = $Force; }
 
  if ( $Y == VOID && $LastY != NULL )
  { $SplineSettings["Forces"] = $Forces; $this->pChartObject->drawSpline($WayPoints,$SplineSettings); $WayPoints = ""; $Forces = "";}
 
  $LastX = $X; $LastY = $Y;
  }
  $SplineSettings["Forces"] = $Forces;
  $this->pChartObject->drawSpline($WayPoints,$SplineSettings);
  }
  }
 
  /* Return the scaled plot position */
  function getPosArray($Values,$AxisID)
  {
  $Data = $this->pDataObject->getData();
 
  if ( !is_array($Values) ) { $Values = array($Values); }
 
  if ( $Data["Axis"][$AxisID]["Identity"] == AXIS_X )
  {
  $Height = ($this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1) - $Data["Axis"][$AxisID]["Margin"]*2;
  $ScaleHeight = $Data["Axis"][$AxisID]["ScaleMax"] - $Data["Axis"][$AxisID]["ScaleMin"];
  $Step = $Height / $ScaleHeight;
 
  $Result = "";
  foreach($Values as $Key => $Value)
  {
  if ( $Value == VOID )
  $Result[] = VOID;
  else
  $Result[] = $this->pChartObject->GraphAreaX1 + $Data["Axis"][$AxisID]["Margin"] + ($Step * ($Value-$Data["Axis"][$AxisID]["ScaleMin"]));
  }
 
  if ( count($Result) == 1 ) { return($Result[0]); } else { return($Result); }
  }
  else
  {
  $Height = ($this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1) - $Data["Axis"][$AxisID]["Margin"]*2;
  $ScaleHeight = $Data["Axis"][$AxisID]["ScaleMax"] - $Data["Axis"][$AxisID]["ScaleMin"];
  $Step = $Height / $ScaleHeight;
 
  $Result = "";
  foreach($Values as $Key => $Value)
  {
  if ( $Value == VOID )
  $Result[] = VOID;
  else
  $Result[] = $this->pChartObject->GraphAreaY2 - $Data["Axis"][$AxisID]["Margin"] - ($Step * ($Value-$Data["Axis"][$AxisID]["ScaleMin"]));
  }
 
  if ( count($Result) == 1 ) { return($Result[0]); } else { return($Result); }
  }
  }
 
  /* Draw the legend of the active series */
  function drawScatterLegend($X,$Y,$Format="")
  {
  $Family = isset($Format["Family"]) ? $Format["Family"] : LEGEND_FAMILY_BOX;
  $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->pChartObject->FontName;
  $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->pChartObject->FontSize;
  $FontR = isset($Format["FontR"]) ? $Format["FontR"] : $this->pChartObject->FontColorR;
  $FontG = isset($Format["FontG"]) ? $Format["FontG"] : $this->pChartObject->FontColorG;
  $FontB = isset($Format["FontB"]) ? $Format["FontB"] : $this->pChartObject->FontColorB;
  $BoxWidth = isset($Format["BoxWidth"]) ? $Format["BoxWidth"] : 5;
  $BoxHeight = isset($Format["BoxHeight"]) ? $Format["BoxHeight"] : 5;
  $IconAreaWidth = isset($Format["IconAreaWidth"]) ? $Format["IconAreaWidth"] : $BoxWidth;
  $IconAreaHeight = isset($Format["IconAreaHeight"]) ? $Format["IconAreaHeight"] : $BoxHeight;
  $XSpacing = isset($Format["XSpacing"]) ? $Format["XSpacing"] : 5;
  $Margin = isset($Format["Margin"]) ? $Format["Margin"] : 5;
  $R = isset($Format["R"]) ? $Format["R"] : 200;
  $G = isset($Format["G"]) ? $Format["G"] : 200;
  $B = isset($Format["B"]) ? $Format["B"] : 200;
  $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 255;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 255;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 255;
  $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;
  $Style = isset($Format["Style"]) ? $Format["Style"] : LEGEND_ROUND;
  $Mode = isset($Format["Mode"]) ? $Format["Mode"] : LEGEND_VERTICAL;
 
  if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; }
 
  $Data = $this->pDataObject->getData();
 
  foreach($Data["ScatterSeries"] as $Key => $Series)
  {
  if ( $Series["isDrawable"] == TRUE && isset($Series["Picture"]))
  {
  list($PicWidth,$PicHeight) = $this->pChartObject->getPicInfo($Series["Picture"]);
  if ( $IconAreaWidth < $PicWidth ) { $IconAreaWidth = $PicWidth; }
  if ( $IconAreaHeight < $PicHeight ) { $IconAreaHeight = $PicHeight; }
  }
  }
 
  $YStep = max($this->pChartObject->FontSize,$IconAreaHeight) + 5;
  $XStep = $IconAreaWidth + 5;
  $XStep = $XSpacing;
 
  $Boundaries = ""; $Boundaries["L"] = $X; $Boundaries["T"] = $Y; $Boundaries["R"] = 0; $Boundaries["B"] = 0; $vY = $Y; $vX = $X;
  foreach($Data["ScatterSeries"] as $Key => $Series)
  {
  if ( $Series["isDrawable"] == TRUE )
  {
  if ( $Mode == LEGEND_VERTICAL )
  {
  $BoxArray = $this->pChartObject->getTextBox($vX+$IconAreaWidth+4,$vY+$IconAreaHeight/2,$FontName,$FontSize,0,$Series["Description"]);
 
  if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; }
  if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; }
  if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; }
 
  $Lines = preg_split("/\n/",$Series["Description"]);
  $vY = $vY + max($this->pChartObject->FontSize*count($Lines),$IconAreaHeight) + 5;
  }
  elseif ( $Mode == LEGEND_HORIZONTAL )
  {
  $Lines = preg_split("/\n/",$Series["Description"]);
  $Width = "";
  foreach($Lines as $Key => $Value)
  {
  $BoxArray = $this->pChartObject->getTextBox($vX+$IconAreaWidth+6,$Y+$IconAreaHeight/2+(($this->pChartObject->FontSize+3)*$Key),$FontName,$FontSize,0,$Value);
 
  if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; }
  if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; }
  if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; }
 
  $Width[] = $BoxArray[1]["X"];
  }
 
  $vX=max($Width)+$XStep;
  }
  }
  }
  $vY=$vY-$YStep; $vX=$vX-$XStep;
 
  $TopOffset = $Y - $Boundaries["T"];
  if ( $Boundaries["B"]-($vY+$IconAreaHeight) < $TopOffset ) { $Boundaries["B"] = $vY+$IconAreaHeight+$TopOffset; }
 
  if ( $Style == LEGEND_ROUND )
  $this->pChartObject->drawRoundedFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB));
  elseif ( $Style == LEGEND_BOX )
  $this->pChartObject->drawFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB));
 
  $RestoreShadow = $this->pChartObject->Shadow; $this->Shadow = FALSE;
  foreach($Data["ScatterSeries"] as $Key => $Series)
  {
  if ( $Series["isDrawable"] == TRUE )
  {
  $R = $Series["Color"]["R"]; $G = $Series["Color"]["G"]; $B = $Series["Color"]["B"];
  $Ticks = $Series["Ticks"]; $Weight = $Series["Weight"];
 
  if ( isset($Series["Picture"]) )
  {
  $Picture = $Series["Picture"];
  list($PicWidth,$PicHeight) = $this->pChartObject->getPicInfo($Picture);
  $PicX = $X+$IconAreaWidth/2; $PicY = $Y+$IconAreaHeight/2;
 
  $this->pChartObject->drawFromPNG($PicX-$PicWidth/2,$PicY-$PicHeight/2,$Picture);
  }
  else
  {
  if ( $Family == LEGEND_FAMILY_BOX )
  {
  if ( $BoxWidth != $IconAreaWidth ) { $XOffset = floor(($IconAreaWidth-$BoxWidth)/2); } else { $XOffset = 0; }
  if ( $BoxHeight != $IconAreaHeight ) { $YOffset = floor(($IconAreaHeight-$BoxHeight)/2); } else { $YOffset = 0; }
 
  $this->pChartObject->drawFilledRectangle($X+1+$XOffset,$Y+1+$YOffset,$X+$BoxWidth+$XOffset+1,$Y+$BoxHeight+1+$YOffset,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
  $this->pChartObject->drawFilledRectangle($X+$XOffset,$Y+$YOffset,$X+$BoxWidth+$XOffset,$Y+$BoxHeight+$YOffset,array("R"=>$R,"G"=>$G,"B"=>$B,"Surrounding"=>20));
  }
  elseif ( $Family == LEGEND_FAMILY_CIRCLE )
  {
  $this->pChartObject->drawFilledCircle($X+1+$IconAreaWidth/2,$Y+1+$IconAreaHeight/2,min($IconAreaHeight/2,$IconAreaWidth/2),array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
  $this->pChartObject->drawFilledCircle($X+$IconAreaWidth/2,$Y+$IconAreaHeight/2,min($IconAreaHeight/2,$IconAreaWidth/2),array("R"=>$R,"G"=>$G,"B"=>$B,"Surrounding"=>20));
  }
  elseif ( $Family == LEGEND_FAMILY_LINE )
  {
  $this->pChartObject->drawLine($X+1,$Y+1+$IconAreaHeight/2,$X+1+$IconAreaWidth,$Y+1+$IconAreaHeight/2,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20,"Ticks"=>$Ticks,"Weight"=>$Weight));
  $this->pChartObject->drawLine($X,$Y+$IconAreaHeight/2,$X+$IconAreaWidth,$Y+$IconAreaHeight/2,array("R"=>$R,"G"=>$G,"B"=>$B,"Ticks"=>$Ticks,"Weight"=>$Weight));
  }
  }
 
  if ( $Mode == LEGEND_VERTICAL )
  {
  $Lines = preg_split("/\n/",$Series["Description"]);
  foreach($Lines as $Key => $Value)
  $this->pChartObject->drawText($X+$IconAreaWidth+4,$Y+$IconAreaHeight/2+(($this->pChartObject->FontSize+3)*$Key),$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT));
 
  $Y=$Y+max($this->pChartObject->FontSize*count($Lines),$IconAreaHeight) + 5;
  }
  elseif ( $Mode == LEGEND_HORIZONTAL )
  {
  $Lines = preg_split("/\n/",$Series["Description"]);
  $Width = "";
  foreach($Lines as $Key => $Value)
  {
  $BoxArray = $this->pChartObject->drawText($X+$IconAreaWidth+4,$Y+$IconAreaHeight/2+(($this->pChartObject->FontSize+3)*$Key),$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT));
  $Width[] = $BoxArray[1]["X"];
  }
  $X=max($Width)+2+$XStep;
  }
  }
  }
 
  $this->Shadow = $RestoreShadow;
  }
 
  /* Get the legend box size */
  function getScatterLegendSize($Format="")
  {
  $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->pChartObject->FontName;
  $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->pChartObject->FontSize;
  $BoxSize = isset($Format["BoxSize"]) ? $Format["BoxSize"] : 5;
  $Margin = isset($Format["Margin"]) ? $Format["Margin"] : 5;
  $Style = isset($Format["Style"]) ? $Format["Style"] : LEGEND_ROUND;
  $Mode = isset($Format["Mode"]) ? $Format["Mode"] : LEGEND_VERTICAL;
 
  $YStep = max($this->pChartObject->FontSize,$BoxSize) + 5;
  $XStep = $BoxSize + 5;
 
  $X=100; $Y=100;
 
  $Data = $this->pDataObject->getData();
 
  foreach($Data["ScatterSeries"] as $Key => $Series)
  {
  if ( $Series["isDrawable"] == TRUE && isset($Series["Picture"]))
  {
  list($PicWidth,$PicHeight) = $this->pChartObject->getPicInfo($Series["Picture"]);
  if ( $IconAreaWidth < $PicWidth ) { $IconAreaWidth = $PicWidth; }
  if ( $IconAreaHeight < $PicHeight ) { $IconAreaHeight = $PicHeight; }
  }
  }
 
  $YStep = max($this->pChartObject->FontSize,$IconAreaHeight) + 5;
  $XStep = $IconAreaWidth + 5;
  $XStep = $XSpacing;
 
  $Boundaries = ""; $Boundaries["L"] = $X; $Boundaries["T"] = $Y; $Boundaries["R"] = 0; $Boundaries["B"] = 0; $vY = $Y; $vX = $X;
  foreach($Data["ScatterSeries"] as $Key => $Series)
  {
  if ( $Series["isDrawable"] == TRUE )
  {
  if ( $Mode == LEGEND_VERTICAL )
  {
  $BoxArray = $this->pChartObject->getTextBox($vX+$IconAreaWidth+4,$vY+$IconAreaHeight/2,$FontName,$FontSize,0,$Series["Description"]);
 
  if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; }
  if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; }
  if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; }
 
  $Lines = preg_split("/\n/",$Series["Description"]);
  $vY = $vY + max($this->pChartObject->FontSize*count($Lines),$IconAreaHeight) + 5;
  }
  elseif ( $Mode == LEGEND_HORIZONTAL )
  {
  $Lines = preg_split("/\n/",$Series["Description"]);
  $Width = "";
  foreach($Lines as $Key => $Value)
  {
  $BoxArray = $this->pChartObject->getTextBox($vX+$IconAreaWidth+6,$Y+$IconAreaHeight/2+(($this->pChartObject->FontSize+3)*$Key),$FontName,$FontSize,0,$Value);
 
  if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; }
  if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; }
  if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; }
 
  $Width[] = $BoxArray[1]["X"];
  }
 
  $vX=max($Width)+$XStep;
  }
  }
  }
  $vY=$vY-$YStep; $vX=$vX-$XStep;
 
  $TopOffset = $Y - $Boundaries["T"];
  if ( $Boundaries["B"]-($vY+$BoxSize) < $TopOffset ) { $Boundaries["B"] = $vY+$BoxSize+$TopOffset; }
 
  $Width = ($Boundaries["R"]+$Margin) - ($Boundaries["L"]-$Margin);
  $Height = ($Boundaries["B"]+$Margin) - ($Boundaries["T"]-$Margin);
 
  return(array("Width"=>$Width,"Height"=>$Height));
  }
 
  /* Draw the line of best fit */
  function drawScatterBestFit($Format="")
  {
  $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : 0;
 
  $Data = $this->pDataObject->getData();
 
  foreach($Data["ScatterSeries"] as $Key => $Series)
  {
  $SerieX = $Series["X"]; $SerieValuesX = $Data["Series"][$SerieX]["Data"]; $SerieXAxis = $Data["Series"][$SerieX]["Axis"];
  $SerieY = $Series["Y"]; $SerieValuesY = $Data["Series"][$SerieY]["Data"]; $SerieYAxis = $Data["Series"][$SerieY]["Axis"];
 
  $Color = array("R"=>$Series["Color"]["R"],"G"=>$Series["Color"]["G"],"B"=>$Series["Color"]["B"],"Alpha"=>$Series["Color"]["Alpha"]);
  $Color["Ticks"] = $Ticks;
 
  $PosArrayX = $Data["Series"][$Series["X"]]["Data"];
  $PosArrayY = $Data["Series"][$Series["Y"]]["Data"];
 
  $Sxy = 0; $Sx = 0; $Sy = 0; $Sxx = 0;
  foreach($PosArrayX as $Key => $Value)
  {
  $X = $Value; $Y = $PosArrayY[$Key];
 
  $Sxy = $Sxy + $X*$Y;
  $Sx = $Sx + $X;
  $Sy = $Sy + $Y;
  $Sxx = $Sxx + $X*$X;
  }
 
  $n = count($PosArrayX);
  $M = (($n*$Sxy)-($Sx*$Sy)) / (($n*$Sxx)-($Sx*$Sx));
  $B = (($Sy)-($M*$Sx))/($n);
 
  $X1 = $this->getPosArray($Data["Axis"][$SerieXAxis]["ScaleMin"],$SerieXAxis);
  $Y1 = $this->getPosArray($M * $Data["Axis"][$SerieXAxis]["ScaleMin"] + $B,$SerieYAxis);
  $X2 = $this->getPosArray($Data["Axis"][$SerieXAxis]["ScaleMax"],$SerieXAxis);
  $Y2 = $this->getPosArray($M * $Data["Axis"][$SerieXAxis]["ScaleMax"] + $B,$SerieYAxis);
 
  if ( $Y1 < $this->pChartObject->GraphAreaY1 ) { $X1 = $X1 + ($this->pChartObject->GraphAreaY1-$Y1); $Y1 = $this->pChartObject->GraphAreaY1; }
  if ( $Y1 > $this->pChartObject->GraphAreaY2 ) { $X1 = $X1 + ($Y1-$this->pChartObject->GraphAreaY2); $Y1 = $this->pChartObject->GraphAreaY2; }
  if ( $Y2 < $this->pChartObject->GraphAreaY1 ) { $X2 = $X2 - ($this->pChartObject->GraphAreaY1-$Y2); $Y2 = $this->pChartObject->GraphAreaY1; }
  if ( $Y2 > $this->pChartObject->GraphAreaY2 ) { $X2 = $X2 - ($Y2-$this->pChartObject->GraphAreaY2); $Y2 = $this->pChartObject->GraphAreaY2; }
 
  $this->pChartObject->drawLine($X1,$Y1,$X2,$Y2,$Color);
  }
  }
  }
  ?>
  <?php
  /*
  pSplit - class to draw spline splitted charts
 
  Version : 2.1.0
  Made by : Jean-Damien POGOLOTTI
  Last Update : 26/01/11
 
  This file can be distributed under the license you can find at :
 
  http://www.pchart.net/license
 
  You can find the whole class documentation on the pChart web site.
  */
 
  define("TEXT_POS_TOP" , 690001);
  define("TEXT_POS_RIGHT" , 690002);
 
  /* pSplit class definition */
  class pSplit
  {
  var $pChartObject;
 
  /* Class creator */
  function pSplit()
  { }
 
  /* Create the encoded string */
  function drawSplitPath($Object,$Values,$Format="")
  {
  $this->pChartObject = $Object;
 
  $Spacing = isset($Format["Spacing"]) ? $Format["Spacing"] : 20;
  $TextPadding = isset($Format["TextPadding"]) ? $Format["TextPadding"] : 2;
  $TextPos = isset($Format["TextPos"]) ? $Format["TextPos"] : TEXT_POS_TOP;
  $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;
  $Force = isset($Format["Force"]) ? $Format["Force"] : 70;
  $Segments = isset($Format["Segments"]) ? $Format["Segments"] : 15;
  $FontSize = $Object->FontSize;
  $X1 = $Object->GraphAreaX1;
  $Y1 = $Object->GraphAreaY1;
  $X2 = $Object->GraphAreaX2;
  $Y2 = $Object->GraphAreaY2;
 
  /* Data Processing */
  $Data = $Values->getData();
  $Palette = $Values->getPalette();
 
  $LabelSerie = $Data["Abscissa"];
  $DataSerie = "";
 
  foreach($Data["Series"] as $SerieName => $Value)
  { if ( $SerieName != $LabelSerie && $DataSerie == "" ) { $DataSerie = $SerieName; } }
 
  $DataSerieSum = array_sum($Data["Series"][$DataSerie]["Data"]);
  $DataSerieCount = count($Data["Series"][$DataSerie]["Data"]);
 
  /* Scale Processing */
  if ( $TextPos == TEXT_POS_RIGHT )
  $YScale = (($Y2-$Y1) - (($DataSerieCount+1)*$Spacing)) / $DataSerieSum;
  else
  $YScale = (($Y2-$Y1) - ($DataSerieCount*$Spacing)) / $DataSerieSum;
  $LeftHeight = $DataSerieSum * $YScale;
 
  /* Re-compute graph width depending of the text mode choosen */
  if ( $TextPos == TEXT_POS_RIGHT )
  {
  $MaxWidth = 0;
  foreach($Data["Series"][$LabelSerie]["Data"] as $Key => $Label)
  {
  $Boundardies = $Object->getTextBox(0,0,$Object->FontName,$Object->FontSize,0,$Label);
  if ( $Boundardies[1]["X"] > $MaxWidth ) { $MaxWidth = $Boundardies[1]["X"] + $TextPadding*2; }
  }
  $X2 = $X2 - $MaxWidth;
  }
 
  /* Drawing */
  $LeftY = ((($Y2-$Y1) / 2) + $Y1) - ($LeftHeight/2);
  $RightY = $Y1;
  $VectorX = (($X2-$X1) / 2);
 
  foreach($Data["Series"][$DataSerie]["Data"] as $Key => $Value)
  {
  if ( isset($Data["Series"][$LabelSerie]["Data"][$Key]) )
  $Label = $Data["Series"][$LabelSerie]["Data"][$Key];
  else
  $Label = "-";
 
  $LeftY1 = $LeftY;
  $LeftY2 = $LeftY + $Value * $YScale;
 
  $RightY1 = $RightY + $Spacing;
  $RightY2 = $RightY + $Spacing + $Value * $YScale;;
 
  $Settings = array("R"=>$Palette[$Key]["R"],"G"=>$Palette[$Key]["G"],"B"=>$Palette[$Key]["B"],"Alpha"=>$Palette[$Key]["Alpha"],"NoDraw"=>TRUE,"Segments"=>$Segments,"Surrounding"=>$Surrounding);
 
  $PolyGon = "";
 
  $Angle = $Object->getAngle($X2,$RightY1,$X1,$LeftY1);
  $VectorX1 = cos(deg2rad($Angle+90)) * $Force + ($X2-$X1)/2 + $X1;
  $VectorY1 = sin(deg2rad($Angle+90)) * $Force + ($RightY1-$LeftY1)/2 + $LeftY1;
  $VectorX2 = cos(deg2rad($Angle-90)) * $Force + ($X2-$X1)/2 + $X1;
  $VectorY2 = sin(deg2rad($Angle-90)) * $Force + ($RightY1-$LeftY1)/2 + $LeftY1;
 
  $Points = $Object->drawBezier($X1,$LeftY1,$X2,$RightY1,$VectorX1,$VectorY1,$VectorX2,$VectorY2,$Settings);
  foreach($Points as $Key => $Pos) { $PolyGon[] = $Pos["X"]; $PolyGon[] = $Pos["Y"]; }
 
 
  $Angle = $Object->getAngle($X2,$RightY2,$X1,$LeftY2);
  $VectorX1 = cos(deg2rad($Angle+90)) * $Force + ($X2-$X1)/2 +$X1;
  $VectorY1 = sin(deg2rad($Angle+90)) * $Force + ($RightY2-$LeftY2)/2 + $LeftY2;
  $VectorX2 = cos(deg2rad($Angle-90)) * $Force + ($X2-$X1)/2 +$X1;
  $VectorY2 = sin(deg2rad($Angle-90)) * $Force + ($RightY2-$LeftY2)/2 + $LeftY2;
 
  $Points = $Object->drawBezier($X1,$LeftY2,$X2,$RightY2,$VectorX1,$VectorY1,$VectorX2,$VectorY2,$Settings);
  $Points = array_reverse($Points);
  foreach($Points as $Key => $Pos) { $PolyGon[] = $Pos["X"]; $PolyGon[] = $Pos["Y"]; }
 
  $Object->drawPolygon($PolyGon,$Settings);
 
  if ( $TextPos == TEXT_POS_RIGHT )
  $Object->drawText($X2+$TextPadding,($RightY2-$RightY1)/2+$RightY1,$Label,array("Align"=>TEXT_ALIGN_MIDDLELEFT));
  else
  $Object->drawText($X2,$RightY1-$TextPadding,$Label,array("Align"=>TEXT_ALIGN_BOTTOMRIGHT));
 
  $LeftY = $LeftY2;
  $RightY = $RightY2;
  }
  }
  }
  ?>
  <?php
  /*
  pSpring - class to draw spring graphs
 
  Version : 2.1.0
  Made by : Jean-Damien POGOLOTTI
  Last Update : 26/01/11
 
  This file can be distributed under the license you can find at :
 
  http://www.pchart.net/license
 
  You can find the whole class documentation on the pChart web site.
  */
 
  define("NODE_TYPE_FREE" , 690001);
  define("NODE_TYPE_CENTRAL" , 690002);
 
  define("NODE_SHAPE_CIRCLE" , 690011);
  define("NODE_SHAPE_TRIANGLE" , 690012);
  define("NODE_SHAPE_SQUARE" , 690013);
 
  define("ALGORITHM_RANDOM" , 690021);
  define("ALGORITHM_WEIGHTED" , 690022);
  define("ALGORITHM_CIRCULAR" , 690023);
  define("ALGORITHM_CENTRAL" , 690024);
 
  define("LABEL_CLASSIC" , 690031);
  define("LABEL_LIGHT" , 690032);
 
  /* pSpring class definition */
  class pSpring
  {
  var $History;
  var $pChartObject;
  var $Data;
  var $Links;
  var $X1;
  var $Y1;
  var $X2;
  var $Y2;
  var $AutoComputeFreeZone;
  var $Labels;
 
  /* Class creator */
  function pSpring()
  {
  /* Initialise data arrays */
  $this->Data = "";
  $this->Links = "";
 
  /* Set nodes defaults */
  $this->Default["R"] = 255;
  $this->Default["G"] = 255;
  $this->Default["B"] = 255;
  $this->Default["Alpha"] = 100;
  $this->Default["BorderR"] = 0;
  $this->Default["BorderG"] = 0;
  $this->Default["BorderB"] = 0;
  $this->Default["BorderAlpha"] = 100;
  $this->Default["Surrounding"] = NULL;
  $this->Default["BackgroundR"] = 255;
  $this->Default["BackgroundG"] = 255;
  $this->Default["BackgroundB"] = 255;
  $this->Default["BackgroundAlpha"] = 0;
  $this->Default["Force"] = 1;
  $this->Default["NodeType"] = NODE_TYPE_FREE;
  $this->Default["Size"] = 5;
  $this->Default["Shape"] = NODE_SHAPE_CIRCLE;
  $this->Default["FreeZone"] = 40;
  $this->Default["LinkR"] = 0;
  $this->Default["LinkG"] = 0;
  $this->Default["LinkB"] = 0;
  $this->Default["LinkAlpha"] = 0;
 
  $this->Labels["Type"] = LABEL_CLASSIC;
  $this->Labels["R"] = 0;
  $this->Labels["G"] = 0;
  $this->Labels["B"] = 0;
  $this->Labels["Alpha"] = 100;
 
  $this->AutoComputeFreeZone = FALSE;
  }
 
  /* Set default links options */
  function setLinkDefaults($Settings="")
  {
  if ( isset($Settings["R"]) ) { $this->Default["LinkR"] = $Settings["R"]; }
  if ( isset($Settings["G"]) ) { $this->Default["LinkG"] = $Settings["G"]; }
  if ( isset($Settings["B"]) ) { $this->Default["LinkB"] = $Settings["B"]; }
  if ( isset($Settings["Alpha"]) ) { $this->Default["LinkAlpha"] = $Settings["Alpha"]; }
  }
 
  /* Set default links options */
  function setLabelsSettings($Settings="")
  {
  if ( isset($Settings["Type"]) ) { $this->Labels["Type"] = $Settings["Type"]; }
  if ( isset($Settings["R"]) ) { $this->Labels["R"] = $Settings["R"]; }
  if ( isset($Settings["G"]) ) { $this->Labels["G"] = $Settings["G"]; }
  if ( isset($Settings["B"]) ) { $this->Labels["B"] = $Settings["B"]; }
  if ( isset($Settings["Alpha"]) ) { $this->Labels["Alpha"] = $Settings["Alpha"]; }
  }
 
  /* Auto compute the FreeZone size based on the number of connections */
  function autoFreeZone()
  {
  /* Check connections reciprocity */
  foreach($this->Data as $Key => $Settings)
  {
  if ( isset($Settings["Connections"]) )
  { $this->Data[$Key]["FreeZone"] = count($Settings["Connections"])*10 + 20; }
  else
  { $this->Data[$Key]["FreeZone"] = 20; }
  }
 
  }
 
  /* Set link properties */
  function linkProperties($FromNode,$ToNode,$Settings)
  {
  if ( !isset($this->Data[$FromNode]) ) { return(0); }
  if ( !isset($this->Data[$ToNode]) ) { return(0); }
 
  $R = isset($Settings["R"]) ? $Settings["R"] : 0;
  $G = isset($Settings["G"]) ? $Settings["G"] : 0;
  $B = isset($Settings["B"]) ? $Settings["B"] : 0;
  $Alpha = isset($Settings["Alpha"]) ? $Settings["Alpha"] : 100;
  $Name = isset($Settings["Name"]) ? $Settings["Name"] : NULL;
  $Ticks = isset($Settings["Ticks"]) ? $Settings["Ticks"] : NULL;
 
  $this->Links[$FromNode][$ToNode]["R"] = $R; $this->Links[$ToNode][$FromNode]["R"] = $R;
  $this->Links[$FromNode][$ToNode]["G"] = $G; $this->Links[$ToNode][$FromNode]["G"] = $G;
  $this->Links[$FromNode][$ToNode]["B"] = $B; $this->Links[$ToNode][$FromNode]["B"] = $B;
  $this->Links[$FromNode][$ToNode]["Alpha"] = $Alpha; $this->Links[$ToNode][$FromNode]["Alpha"] = $Alpha;
  $this->Links[$FromNode][$ToNode]["Name"] = $Name; $this->Links[$ToNode][$FromNode]["Name"] = $Name;
  $this->Links[$FromNode][$ToNode]["Ticks"] = $Ticks; $this->Links[$ToNode][$FromNode]["Ticks"] = $Ticks;
  }
 
  function setNodeDefaults($Settings="")
  {
  if ( isset($Settings["R"]) ) { $this->Default["R"] = $Settings["R"]; }
  if ( isset($Settings["G"]) ) { $this->Default["G"] = $Settings["G"]; }
  if ( isset($Settings["B"]) ) { $this->Default["B"] = $Settings["B"]; }
  if ( isset($Settings["Alpha"]) ) { $this->Default["Alpha"] = $Settings["Alpha"]; }
  if ( isset($Settings["BorderR"]) ) { $this->Default["BorderR"] = $Settings["BorderR"]; }
  if ( isset($Settings["BorderG"]) ) { $this->Default["BorderG"] = $Settings["BorderG"]; }
  if ( isset($Settings["BorderB"]) ) { $this->Default["BorderB"] = $Settings["BorderB"]; }
  if ( isset($Settings["BorderAlpha"]) ) { $this->Default["BorderAlpha"] = $Settings["BorderAlpha"]; }
  if ( isset($Settings["Surrounding"]) ) { $this->Default["Surrounding"] = $Settings["Surrounding"]; }
  if ( isset($Settings["BackgroundR"]) ) { $this->Default["BackgroundR"] = $Settings["BackgroundR"]; }
  if ( isset($Settings["BackgroundG"]) ) { $this->Default["BackgroundG"] = $Settings["BackgroundG"]; }
  if ( isset($Settings["BackgroundB"]) ) { $this->Default["BackgroundB"] = $Settings["BackgroundB"]; }
  if ( isset($Settings["BackgroundAlpha"]) ) { $this->Default["BackgroundAlpha"] = $Settings["BackgroundAlpha"]; }
  if ( isset($Settings["NodeType"]) ) { $this->Default["NodeType"] = $Settings["NodeType"]; }
  if ( isset($Settings["Size"]) ) { $this->Default["Size"] = $Settings["Size"]; }
  if ( isset($Settings["Shape"]) ) { $this->Default["Shape"] = $Settings["Shape"]; }
  if ( isset($Settings["FreeZone"]) ) { $this->Default["FreeZone"] = $Settings["FreeZone"]; }
  }
 
  /* Add a node */
  function addNode($NodeID,$Settings="")
  {
  /* if the node already exists, ignore */
  if (isset($this->Data[$NodeID])) { return(0); }
 
  $Name = isset($Settings["Name"]) ? $Settings["Name"] : "Node ".$NodeID;
  $Connections = isset($Settings["Connections"]) ? $Settings["Connections"] : NULL;
 
  $R = isset($Settings["R"]) ? $Settings["R"] : $this->Default["R"];
  $G = isset($Settings["G"]) ? $Settings["G"] : $this->Default["G"];
  $B = isset($Settings["B"]) ? $Settings["B"] : $this->Default["B"];
  $Alpha = isset($Settings["Alpha"]) ? $Settings["Alpha"] : $this->Default["Alpha"];
  $BorderR = isset($Settings["BorderR"]) ? $Settings["BorderR"] : $this->Default["BorderR"];
  $BorderG = isset($Settings["BorderG"]) ? $Settings["BorderG"] : $this->Default["BorderG"];
  $BorderB = isset($Settings["BorderB"]) ? $Settings["BorderB"] : $this->Default["BorderB"];
  $BorderAlpha = isset($Settings["BorderAlpha"]) ? $Settings["BorderAlpha"] : $this->Default["BorderAlpha"];
  $Surrounding = isset($Settings["Surrounding"]) ? $Settings["Surrounding"] : $this->Default["Surrounding"];
  $BackgroundR = isset($Settings["BackgroundR"]) ? $Settings["BackgroundR"] : $this->Default["BackgroundR"];
  $BackgroundG = isset($Settings["BackgroundG"]) ? $Settings["BackgroundG"] : $this->Default["BackgroundG"];
  $BackgroundB = isset($Settings["BackgroundB"]) ? $Settings["BackgroundB"] : $this->Default["BackgroundB"];
  $BackgroundAlpha = isset($Settings["BackgroundAlpha"]) ? $Settings["BackgroundAlpha"] : $this->Default["BackgroundAlpha"];
  $Force = isset($Settings["Force"]) ? $Settings["Force"] : $this->Default["Force"];
  $NodeType = isset($Settings["NodeType"]) ? $Settings["NodeType"] : $this->Default["NodeType"];
  $Size = isset($Settings["Size"]) ? $Settings["Size"] : $this->Default["Size"];
  $Shape = isset($Settings["Shape"]) ? $Settings["Shape"] : $this->Default["Shape"];
  $FreeZone = isset($Settings["FreeZone"]) ? $Settings["FreeZone"] : $this->Default["FreeZone"];
 
  if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; }
 
  $this->Data[$NodeID]["R"] = $R; $this->Data[$NodeID]["G"] = $G; $this->Data[$NodeID]["B"] = $B; $this->Data[$NodeID]["Alpha"] = $Alpha;
  $this->Data[$NodeID]["BorderR"] = $BorderR; $this->Data[$NodeID]["BorderG"] = $BorderG; $this->Data[$NodeID]["BorderB"] = $BorderB; $this->Data[$NodeID]["BorderAlpha"] = $BorderAlpha;
  $this->Data[$NodeID]["BackgroundR"] = $BackgroundR; $this->Data[$NodeID]["BackgroundG"] = $BackgroundG; $this->Data[$NodeID]["BackgroundB"] = $BackgroundB; $this->Data[$NodeID]["BackgroundAlpha"] = $BackgroundAlpha;
  $this->Data[$NodeID]["Name"] = $Name;
  $this->Data[$NodeID]["Force"] = $Force;
  $this->Data[$NodeID]["Type"] = $NodeType;
  $this->Data[$NodeID]["Size"] = $Size;
  $this->Data[$NodeID]["Shape"] = $Shape;
  $this->Data[$NodeID]["FreeZone"] = $FreeZone;
  if ( $Connections != NULL )
  {
  if ( is_array($Connections ) )
  {
  foreach($Connections as $Key => $Value)
  $this->Data[$NodeID]["Connections"][] = $Value;
  }
  else
  $this->Data[$NodeID]["Connections"][] = $Connections;
  }
  }
 
  /* Set color attribute for a list of nodes */
  function setNodesColor($Nodes,$Settings="")
  {
  if ( is_array($Nodes) )
  {
  foreach ($Nodes as $Key => $NodeID)
  {
  if (isset($this->Data[$NodeID]) )
  {
  if ( isset($Settings["R"]) ) { $this->Data[$NodeID]["R"] = $Settings["R"]; }
  if ( isset($Settings["G"]) ) { $this->Data[$NodeID]["G"] = $Settings["G"]; }
  if ( isset($Settings["B"]) ) { $this->Data[$NodeID]["B"] = $Settings["B"]; }
  if ( isset($Settings["Alpha"]) ) { $this->Data[$NodeID]["Alpha"] = $Settings["Alpha"]; }
  if ( isset($Settings["BorderR"]) ) { $this->Data[$NodeID]["BorderR"] = $Settings["BorderR"]; }
  if ( isset($Settings["BorderG"]) ) { $this->Data[$NodeID]["BorderG"] = $Settings["BorderG"]; }
  if ( isset($Settings["BorderB"]) ) { $this->Data[$NodeID]["BorderB"] = $Settings["BorderB"]; }
  if ( isset($Settings["BorderAlpha"]) ) { $this->Data[$NodeID]["BorderAlpha"] = $Settings["BorderAlpha"]; }
  if ( isset($Settings["Surrounding"]) ) { $this->Data[$NodeID]["BorderR"] = $this->Data[$NodeID]["R"] + $Settings["Surrounding"]; $this->Data[$NodeID]["BorderG"] = $this->Data[$NodeID]["G"] + $Settings["Surrounding"]; $this->Data[$NodeID]["BorderB"] = $this->Data[$NodeID]["B"] + $Settings["Surrounding"]; }
  }
  }
  }
  else
  {
  if ( isset($Settings["R"]) ) { $this->Data[$Nodes]["R"] = $Settings["R"]; }
  if ( isset($Settings["G"]) ) { $this->Data[$Nodes]["G"] = $Settings["G"]; }
  if ( isset($Settings["B"]) ) { $this->Data[$Nodes]["B"] = $Settings["B"]; }
  if ( isset($Settings["Alpha"]) ) { $this->Data[$Nodes]["Alpha"] = $Settings["Alpha"]; }
  if ( isset($Settings["BorderR"]) ) { $this->Data[$Nodes]["BorderR"] = $Settings["BorderR"]; }
  if ( isset($Settings["BorderG"]) ) { $this->Data[$Nodes]["BorderG"] = $Settings["BorderG"]; }
  if ( isset($Settings["BorderB"]) ) { $this->Data[$Nodes]["BorderB"] = $Settings["BorderB"]; }
  if ( isset($Settings["BorderAlpha"]) ) { $this->Data[$Nodes]["BorderAlpha"] = $Settings["BorderAlpha"]; }
  if ( isset($Settings["Surrounding"]) ) { $this->Data[$Nodes]["BorderR"] = $this->Data[$NodeID]["R"] + $Settings["Surrounding"]; $this->Data[$NodeID]["BorderG"] = $this->Data[$NodeID]["G"] + $Settings["Surrounding"]; $this->Data[$NodeID]["BorderB"] = $this->Data[$NodeID]["B"] + $Settings["Surrounding"]; }
  }
  }
 
  /* Returns all the nodes details */
  function dumpNodes()
  { return($this->Data); }
 
  /* Check if a connection exists and create it if required */
  function checkConnection($SourceID, $TargetID)
  {
  if ( isset($this->Data[$SourceID]["Connections"]) )
  {
  foreach ($this->Data[$SourceID]["Connections"] as $Key => $ConnectionID)
  { if ( $TargetID == $ConnectionID ) { return(TRUE); } }
  }
  $this->Data[$SourceID]["Connections"][] = $TargetID;
  }
  /* Get the median linked nodes position */
  function getMedianOffset($Key,$X,$Y)
  {
  $Cpt = 1;
  if ( isset($this->Data[$Key]["Connections"]) )
  {
  foreach($this->Data[$Key]["Connections"] as $ID => $NodeID)
  {
  if ( isset($this->Data[$NodeID]["X"]) && isset($this->Data[$NodeID]["Y"]) )
  {
  $X = $X + $this->Data[$NodeID]["X"];
  $Y = $Y + $this->Data[$NodeID]["Y"];
  $Cpt++;
  }
  }
  }
  return(array("X"=>$X/$Cpt,"Y"=>$Y/$Cpt));
  }
 
  /* Return the ID of the attached partner with the biggest weight */
  function getBiggestPartner($Key)
  {
  if ( !isset($this->Data[$Key]["Connections"]) ) { return(""); }
 
  $MaxWeight = 0; $Result = "";
  foreach($this->Data[$Key]["Connections"] as $Key => $PeerID)
  {
  if ( $this->Data[$PeerID]["Weight"] > $MaxWeight )
  { $MaxWeight = $this->Data[$PeerID]["Weight"]; $Result = $PeerID; }
  }
  return($Result);
  }
 
  /* Do the initial node positions computing pass */
  function firstPass($Algorithm)
  {
  $CenterX = ($this->X2 - $this->X1) / 2 + $this->X1;
  $CenterY = ($this->Y2 - $this->Y1) / 2 + $this->Y1;
 
  /* Check connections reciprocity */
  foreach($this->Data as $Key => $Settings)
  {
  if ( isset($Settings["Connections"]) )
  {
  foreach($Settings["Connections"] as $ID => $ConnectionID)
  $this->checkConnection($ConnectionID,$Key);
  }
  }
 
  if ( $this->AutoComputeFreeZone ) { $this->autoFreeZone(); }
 
  /* Get the max number of connections */
  $MaxConnections = 0;
  foreach($this->Data as $Key => $Settings)
  { if ( isset($Settings["Connections"]) ) { if ( $MaxConnections < count($Settings["Connections"] ) ) { $MaxConnections = count($Settings["Connections"]); } } }
 
  if ( $Algorithm == ALGORITHM_WEIGHTED )
  {
  foreach($this->Data as $Key => $Settings)
  {
  if ( $Settings["Type"] == NODE_TYPE_CENTRAL ) { $this->Data[$Key]["X"] = $CenterX; $this->Data[$Key]["Y"] = $CenterY; }
  if ( $Settings["Type"] == NODE_TYPE_FREE )
  {
  if ( isset($Settings["Connections"]) )
  { $Connections = count($Settings["Connections"]); }
  else
  { $Connections = 0; }
 
  $Ring = $MaxConnections - $Connections;
  $Angle = rand(0,360);
 
  $this->Data[$Key]["X"] = cos(deg2rad($Angle)) * ($Ring*$this->RingSize) + $CenterX;
  $this->Data[$Key]["Y"] = sin(deg2rad($Angle)) * ($Ring*$this->RingSize) + $CenterY;
  }
  }
  }
  elseif ( $Algorithm == ALGORITHM_CENTRAL )
  {
  /* Put a weight on each nodes */
  foreach($this->Data as $Key => $Settings)
  {
  if ( isset($Settings["Connections"]) )
  $this->Data[$Key]["Weight"] = count($Settings["Connections"]);
  else
  $this->Data[$Key]["Weight"] = 0;
  }
 
  $MaxConnections = $MaxConnections + 1;
  for($i=$MaxConnections;$i>=0;$i--)
  {
  foreach($this->Data as $Key => $Settings)
  {
  if ( $Settings["Type"] == NODE_TYPE_CENTRAL ) { $this->Data[$Key]["X"] = $CenterX; $this->Data[$Key]["Y"] = $CenterY; }
  if ( $Settings["Type"] == NODE_TYPE_FREE )
  {
  if ( isset($Settings["Connections"]) )
  { $Connections = count($Settings["Connections"]); }
  else
  { $Connections = 0; }
 
  if ( $Connections == $i )
  {
  $BiggestPartner = $this->getBiggestPartner($Key);
  if ( $BiggestPartner != "" )
  {
  $Ring = $this->Data[$BiggestPartner]["FreeZone"];
  $Weight = $this->Data[$BiggestPartner]["Weight"];
  $AngleDivision = 360 / $this->Data[$BiggestPartner]["Weight"];
  $Done = FALSE; $Tries = 0;
  while (!$Done && $Tries <= $Weight*2)
  {
  $Tries++;
  $Angle = floor(rand(0,$Weight)*$AngleDivision);
  if ( !isset($this->Data[$BiggestPartner]["Angular"][$Angle]) || !isset($this->Data[$BiggestPartner]["Angular"]) )
  {
  $this->Data[$BiggestPartner]["Angular"][$Angle] = $Angle;
  $Done = TRUE;
  }
  }
  if ( !$Done )
  { $Angle = rand(0,360); $this->Data[$BiggestPartner]["Angular"][$Angle] = $Angle; }
 
  $X = cos(deg2rad($Angle)) * ($Ring) + $this->Data[$BiggestPartner]["X"];
  $Y = sin(deg2rad($Angle)) * ($Ring) + $this->Data[$BiggestPartner]["Y"];
 
  $this->Data[$Key]["X"] = $X;
  $this->Data[$Key]["Y"] = $Y;
  }
  }
  }
  }
  }
  }
  elseif ( $Algorithm == ALGORITHM_CIRCULAR )
  {
  $MaxConnections = $MaxConnections + 1;
  for($i=$MaxConnections;$i>=0;$i--)
  {
  foreach($this->Data as $Key => $Settings)
  {
  if ( $Settings["Type"] == NODE_TYPE_CENTRAL ) { $this->Data[$Key]["X"] = $CenterX; $this->Data[$Key]["Y"] = $CenterY; }
  if ( $Settings["Type"] == NODE_TYPE_FREE )
  {
  if ( isset($Settings["Connections"]) )
  { $Connections = count($Settings["Connections"]); }
  else
  { $Connections = 0; }
 
  if ( $Connections == $i )
  {
  $Ring = $MaxConnections - $Connections;
  $Angle = rand(0,360);
 
  $X = cos(deg2rad($Angle)) * ($Ring*$this->RingSize) + $CenterX;
  $Y = sin(deg2rad($Angle)) * ($Ring*$this->RingSize) + $CenterY;
 
  $MedianOffset = $this->getMedianOffset($Key,$X,$Y);
 
  $this->Data[$Key]["X"] = $MedianOffset["X"];
  $this->Data[$Key]["Y"] = $MedianOffset["Y"];
  }
  }
  }
  }
  }
  elseif ( $Algorithm == ALGORITHM_RANDOM )
  {
  foreach($this->Data as $Key => $Settings)
  {
  if ( $Settings["Type"] == NODE_TYPE_FREE )
  {
  $this->Data[$Key]["X"] = $CenterX + rand(-20,20);
  $this->Data[$Key]["Y"] = $CenterY + rand(-20,20);
  }
  if ( $Settings["Type"] == NODE_TYPE_CENTRAL ) { $this->Data[$Key]["X"] = $CenterX; $this->Data[$Key]["Y"] = $CenterY; }
  }
  }
  }
 
  /* Compute one pass */
  function doPass()
  {
  /* Compute vectors */
  foreach($this->Data as $Key => $Settings)
  {
  if ( $Settings["Type"] != NODE_TYPE_CENTRAL )
  {
  unset($this->Data[$Key]["Vectors"]);
 
  $X1 = $Settings["X"];
  $Y1 = $Settings["Y"];
 
  /* Repulsion vectors */
  foreach($this->Data as $Key2 => $Settings2)
  {
  if ( $Key != $Key2 )
  {
  $X2 = $this->Data[$Key2]["X"];
  $Y2 = $this->Data[$Key2]["Y"];
  $FreeZone = $this->Data[$Key2]["FreeZone"];
 
  $Distance = $this->getDistance($X1,$Y1,$X2,$Y2);
  $Angle = $this->getAngle($X1,$Y1,$X2,$Y2) + 180;
 
  /* Nodes too close, repulsion occurs */
  if ( $Distance < $FreeZone )
  {
  $Force = log(pow(2,$FreeZone-$Distance));
  if ( $Force > 1 )
  { $this->Data[$Key]["Vectors"][] = array("Type"=>"R","Angle"=>$Angle % 360,"Force"=>$Force); }
  }
  }
  }
 
  /* Attraction vectors */
  if ( isset($Settings["Connections"]) )
  {
  foreach($Settings["Connections"] as $ID => $NodeID)
  {
  if ( isset($this->Data[$NodeID]) )
  {
  $X2 = $this->Data[$NodeID]["X"];
  $Y2 = $this->Data[$NodeID]["Y"];
  $FreeZone = $this->Data[$Key2]["FreeZone"];
 
  $Distance = $this->getDistance($X1,$Y1,$X2,$Y2);
  $Angle = $this->getAngle($X1,$Y1,$X2,$Y2);
 
  if ( $Distance > $FreeZone )
  $Force = log(($Distance-$FreeZone)+1);
  else
  { $Force = log(($FreeZone-$Distance)+1); ($Angle = $Angle + 180); }
 
  if ( $Force > 1 )
  $this->Data[$Key]["Vectors"][] = array("Type"=>"A","Angle"=>$Angle % 360,"Force"=>$Force);
  }
  }
  }
  }
  }
 
  /* Move the nodes accoding to the vectors */
  foreach($this->Data as $Key => $Settings)
  {
  $X = $Settings["X"];
  $Y = $Settings["Y"];
 
  if ( isset($Settings["Vectors"]) && $Settings["Type"] != NODE_TYPE_CENTRAL )
  {
  foreach($Settings["Vectors"] as $ID => $Vector)
  {
  $Type = $Vector["Type"];
  $Force = $Vector["Force"];
  $Angle = $Vector["Angle"];
  $Factor = $Type == "A" ? $this->MagneticForceA : $this->MagneticForceR;
 
  $X = cos(deg2rad($Angle)) * $Force * $Factor + $X;
  $Y = sin(deg2rad($Angle)) * $Force * $Factor + $Y;
  }
  }
 
  $this->Data[$Key]["X"] = $X;
  $this->Data[$Key]["Y"] = $Y;
  }
  }
 
  function lastPass()
  {
  /* Put everything inside the graph area */
  foreach($this->Data as $Key => $Settings)
  {
  $X = $Settings["X"];
  $Y = $Settings["Y"];
 
  if ( $X < $this->X1 ) { $X = $this->X1; }
  if ( $X > $this->X2 ) { $X = $this->X2; }
  if ( $Y < $this->Y1 ) { $Y = $this->Y1; }
  if ( $Y > $this->Y2 ) { $Y = $this->Y2; }
 
  $this->Data[$Key]["X"] = $X;
  $this->Data[$Key]["Y"] = $Y;
  }
 
  /* Dump all links */
  $Links = "";
  foreach($this->Data as $Key => $Settings)
  {
  $X1 = $Settings["X"];
  $Y1 = $Settings["Y"];
 
  if ( isset($Settings["Connections"]) )
  {
  foreach ($Settings["Connections"] as $ID => $NodeID)
  {
  if ( isset($this->Data[$NodeID]) )
  {
  $X2 = $this->Data[$NodeID]["X"];
  $Y2 = $this->Data[$NodeID]["Y"];
 
  $Links[] = array("X1"=>$X1,"Y1"=>$Y1,"X2"=>$X2,"Y2"=>$Y2,"Source"=>$Settings["Name"],"Destination"=>$this->Data[$NodeID]["Name"]);
  }
  }
  }
  }
 
  /* Check collisions */
  $Conflicts = 0;
  foreach($this->Data as $Key => $Settings)
  {
  $X1 = $Settings["X"];
  $Y1 = $Settings["Y"];
 
  if ( isset($Settings["Connections"]) )
  {
  foreach ($Settings["Connections"] as $ID => $NodeID)
  {
  if ( isset($this->Data[$NodeID]) )
  {
  $X2 = $this->Data[$NodeID]["X"];
  $Y2 = $this->Data[$NodeID]["Y"];
 
  foreach($Links as $IDLinks => $Link)
  {
  $X3 = $Link["X1"]; $Y3 = $Link["Y1"]; $X4 = $Link["X2"]; $Y4 = $Link["Y2"];
 
  if ( !($X1 == $X3 && $X2 == $X4 && $Y1 == $Y3 && $Y2 == $Y4 ) )
  {
  if ( $this->intersect($X1,$Y1,$X2,$Y2,$X3,$Y3,$X4,$Y4) )
  {
  if ( $Link["Source"] != $Settings["Name"] && $Link["Source"] != $this->Data[$NodeID]["Name"] && $Link["Destination"] != $Settings["Name"] && $Link["Destination"] != $this->Data[$NodeID]["Name"] )
  { $Conflicts++; }
  }
  }
  }
  }
  }
  }
  }
  return($Conflicts/2);
  }
 
  /* Center the graph */
  function center()
  {
  /* Determine the real center */
  $TargetCenterX = ($this->X2 - $this->X1) / 2 + $this->X1;
  $TargetCenterY = ($this->Y2 - $this->Y1) / 2 + $this->Y1;
 
  /* Get current boundaries */
  $XMin = $this->X2; $XMax = $this->X1;
  $YMin = $this->Y2; $YMax = $this->Y1;
  foreach($this->Data as $Key => $Settings)
  {
  $X = $Settings["X"];
  $Y = $Settings["Y"];
 
  if ( $X < $XMin) { $XMin = $X; }
  if ( $X > $XMax) { $XMax = $X; }
  if ( $Y < $YMin) { $YMin = $Y; }
  if ( $Y > $YMax) { $YMax = $Y; }
  }
  $CurrentCenterX = ($XMax - $XMin) / 2 + $XMin;
  $CurrentCenterY = ($YMax - $YMin) / 2 + $YMin;
 
  /* Compute the offset to apply */
  $XOffset = $TargetCenterX - $CurrentCenterX;
  $YOffset = $TargetCenterY - $CurrentCenterY;
 
  /* Correct the points position */
  foreach($this->Data as $Key => $Settings)
  {
  $this->Data[$Key]["X"] = $Settings["X"] + $XOffset;
  $this->Data[$Key]["Y"] = $Settings["Y"] + $YOffset;
  }
  }
 
  /* Create the encoded string */
  function drawSpring($Object,$Settings="")
  {
  $this->pChartObject = $Object;
 
  $Pass = isset($Settings["Pass"]) ? $Settings["Pass"] : 50;
  $Retries = isset($Settings["Retry"]) ? $Settings["Retry"] : 10;
  $this->MagneticForceA = isset($Settings["MagneticForceA"]) ? $Settings["MagneticForceA"] : 1.5;
  $this->MagneticForceR = isset($Settings["MagneticForceR"]) ? $Settings["MagneticForceR"] : 2;
  $this->RingSize = isset($Settings["RingSize"]) ? $Settings["RingSize"] : 40;
  $DrawVectors = isset($Settings["DrawVectors"]) ? $Settings["DrawVectors"] : FALSE;
  $DrawQuietZone = isset($Settings["DrawQuietZone"]) ? $Settings["DrawQuietZone"] : FALSE;
  $CenterGraph = isset($Settings["CenterGraph"]) ? $Settings["CenterGraph"] : TRUE;
  $TextPadding = isset($Settings["TextPadding"]) ? $Settings["TextPadding"] : 4;
  $Algorithm = isset($Settings["Algorithm"]) ? $Settings["Algorithm"] : ALGORITHM_WEIGHTED;
 
  $FontSize = $Object->FontSize;
  $this->X1 = $Object->GraphAreaX1;
  $this->Y1 = $Object->GraphAreaY1;
  $this->X2 = $Object->GraphAreaX2;
  $this->Y2 = $Object->GraphAreaY2;
 
  $Conflicts = 1; $Jobs = 0; $this->History["MinimumConflicts"] = -1;
  while ($Conflicts != 0 && $Jobs < $Retries )
  {
  $Jobs++;
 
  /* Compute the initial settings */
  $this->firstPass($Algorithm);
 
  /* Apply the vectors */
  if ( $Pass > 0 )
  {
  for ($i=0; $i<=$Pass; $i++) { $this->doPass(); }
  }
 
  $Conflicts = $this->lastPass();
  if ( $this->History["MinimumConflicts"] == -1 || $Conflicts < $this->History["MinimumConflicts"] )
  { $this->History["MinimumConflicts"] = $Conflicts; $this->History["Result"] = $this->Data; }
  }
 
  $Conflicts = $this->History["MinimumConflicts"];
  $this->Data = $this->History["Result"];
 
  if ( $CenterGraph ) { $this->center(); }
 
  /* Draw the connections */
  $Drawn = "";
  foreach($this->Data as $Key => $Settings)
  {
  $X = $Settings["X"];
  $Y = $Settings["Y"];
 
  if ( isset($Settings["Connections"]) )
  {
  foreach ($Settings["Connections"] as $ID => $NodeID)
  {
  if ( !isset($Drawn[$Key]) ) { $Drawn[$Key] = ""; }
  if ( !isset($Drawn[$NodeID]) ) { $Drawn[$NodeID] = ""; }
 
  if ( isset($this->Data[$NodeID]) && !isset($Drawn[$Key][$NodeID]) && !isset($Drawn[$NodeID][$Key]) )
  {
  $Color = array("R"=>$this->Default["LinkR"],"G"=>$this->Default["LinkG"],"B"=>$this->Default["LinkB"],"Alpha"=>$this->Default["Alpha"]);
 
  if ( $this->Links != "" )
  {
  if ( isset($this->Links[$Key][$NodeID]["R"]) )
  { $Color = array("R"=>$this->Links[$Key][$NodeID]["R"],"G"=>$this->Links[$Key][$NodeID]["G"],"B"=>$this->Links[$Key][$NodeID]["B"],"Alpha"=>$this->Links[$Key][$NodeID]["Alpha"]); }
 
  if ( isset($this->Links[$Key][$NodeID]["Ticks"]) )
  { $Color["Ticks"] = $this->Links[$Key][$NodeID]["Ticks"]; }
  }
 
  $X2 = $this->Data[$NodeID]["X"];
  $Y2 = $this->Data[$NodeID]["Y"];
  $this->pChartObject->drawLine($X,$Y,$X2,$Y2,$Color);
  $Drawn[$Key][$NodeID] = TRUE;
 
  if ( isset($this->Links) && $this->Links != "" )
  {
  if ( isset($this->Links[$Key][$NodeID]["Name"]) || isset($this->Links[$NodeID][$Key]["Name"]) )
  {
  $Name = isset($this->Links[$Key][$NodeID]["Name"]) ? $this->Links[$Key][$NodeID]["Name"] : $this->Links[$NodeID][$Key]["Name"];
  $TxtX = ($X2 - $X)/2 + $X;
  $TxtY = ($Y2 - $Y)/2 + $Y;
 
  if ( $X <= $X2 )
  $Angle = (360-$this->getAngle($X,$Y,$X2,$Y2)) % 360;
  else
  $Angle = (360-$this->getAngle($X2,$Y2,$X,$Y)) % 360;
 
  $Settings = $Color;
  $Settings["Angle"] = $Angle;
  $Settings["Align"] = TEXT_ALIGN_BOTTOMMIDDLE;
  $this->pChartObject->drawText($TxtX,$TxtY,$Name,$Settings);
  }
  }
  }
  }
  }
  }
 
  /* Draw the quiet zones */
  if ( $DrawQuietZone )
  {
  foreach($this->Data as $Key => $Settings)
  {
  $X = $Settings["X"];
  $Y = $Settings["Y"];
  $FreeZone = $Settings["FreeZone"];
 
  $this->pChartObject->drawFilledCircle($X,$Y,$FreeZone,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>2));
  }
  }
 
 
  /* Draw the nodes */
  foreach($this->Data as $Key => $Settings)
  {
  $X = $Settings["X"];
  $Y = $Settings["Y"];
  $Name = $Settings["Name"];
  $FreeZone = $Settings["FreeZone"];
  $Shape = $Settings["Shape"];
  $Size = $Settings["Size"];
 
  $Color = array("R"=>$Settings["R"],"G"=>$Settings["G"],"B"=>$Settings["B"],"Alpha"=>$Settings["Alpha"],"BorderR"=>$Settings["BorderR"],"BorderG"=>$Settings["BorderG"],"BorderB"=>$Settings["BorderB"],"BorderApha"=>$Settings["BorderAlpha"]);
 
  if ( $Shape == NODE_SHAPE_CIRCLE )
  {
  $this->pChartObject->drawFilledCircle($X,$Y,$Size,$Color);
  }
  elseif ( $Shape == NODE_SHAPE_TRIANGLE )
  {
  $Points = "";
  $Points[] = cos(deg2rad(270)) * $Size + $X; $Points[] = sin(deg2rad(270)) * $Size + $Y;
  $Points[] = cos(deg2rad(45)) * $Size + $X; $Points[] = sin(deg2rad(45)) * $Size + $Y;
  $Points[] = cos(deg2rad(135)) * $Size + $X; $Points[] = sin(deg2rad(135)) * $Size + $Y;
  $this->pChartObject->drawPolygon($Points,$Color);
  }
  elseif ( $Shape == NODE_SHAPE_SQUARE )
  {
  $Offset = $Size/2; $Size = $Size / 2;
  $this->pChartObject->drawFilledRectangle($X-$Offset,$Y-$Offset,$X+$Offset,$Y+$Offset,$Color);
  }
 
  if ( $Name != "" )
  {
  $LabelOptions = array("R"=>$this->Labels["R"],"G"=>$this->Labels["G"],"B"=>$this->Labels["B"],"Alpha"=>$this->Labels["Alpha"]);
 
  if ( $this->Labels["Type"] == LABEL_LIGHT )
  {
  $LabelOptions["Align"] = TEXT_ALIGN_BOTTOMLEFT;
  $this->pChartObject->drawText($X,$Y,$Name,$LabelOptions);
  }
  elseif ( $this->Labels["Type"] == LABEL_CLASSIC )
  {
  $LabelOptions["Align"] = TEXT_ALIGN_TOPMIDDLE;
  $LabelOptions["DrawBox"] = TRUE;
  $LabelOptions["BoxAlpha"] = 50;
  $LabelOptions["BorderOffset"] = 4;
  $LabelOptions["RoundedRadius"] = 3;
  $LabelOptions["BoxRounded"] = TRUE;
  $LabelOptions["NoShadow"] = TRUE;
 
  $this->pChartObject->drawText($X,$Y+$Size+$TextPadding,$Name,$LabelOptions);
  }
  }
  }
 
  /* Draw the vectors */
  if ( $DrawVectors )
  {
  foreach($this->Data as $Key => $Settings)
  {
  $X1 = $Settings["X"];
  $Y1 = $Settings["Y"];
 
  if ( isset($Settings["Vectors"]) && $Settings["Type"] != NODE_TYPE_CENTRAL )
  {
  foreach($Settings["Vectors"] as $ID => $Vector)
  {
  $Type = $Vector["Type"];
  $Force = $Vector["Force"];
  $Angle = $Vector["Angle"];
  $Factor = $Type == "A" ? $this->MagneticForceA : $this->MagneticForceR;
  $Color = $Type == "A" ? array("FillR"=>255,"FillG"=>0,"FillB"=>0) : array("FillR"=>0,"FillG"=>255,"FillB"=>0);
 
  $X2 = cos(deg2rad($Angle)) * $Force * $Factor + $X1;
  $Y2 = sin(deg2rad($Angle)) * $Force * $Factor + $Y1;
 
  $this->pChartObject->drawArrow($X1,$Y1,$X2,$Y2,$Color);
  }
  }
  }
  }
 
  return(array("Pass"=>$Jobs,"Conflicts"=>$Conflicts));
  }
 
  /* Return the distance between two points */
  function getDistance($X1,$Y1,$X2,$Y2)
  { return (sqrt(($X2-$X1)*($X2-$X1)+($Y2-$Y1)*($Y2-$Y1))); }
 
  /* Return the angle made by a line and the X axis */
  function getAngle($X1,$Y1,$X2,$Y2)
  {
  $Opposite = $Y2 - $Y1; $Adjacent = $X2 - $X1;$Angle = rad2deg(atan2($Opposite,$Adjacent));
  if ($Angle > 0) { return($Angle); } else { return(360-abs($Angle)); }
  }
 
  function intersect($X1,$Y1,$X2,$Y2,$X3,$Y3,$X4,$Y4)
  {
  $A = (($X3 * $Y4 - $X4 * $Y3) * ($X1 - $X2) - ($X1 * $Y2 - $X2 * $Y1) * ($X3 - $X4));
  $B = (($Y1 - $Y2) * ($X3 - $X4) - ($Y3 - $Y4) * ($X1 - $X2));
 
  if ( $B == 0 ) { return(FALSE); }
  $Xi = $A / $B;
 
  $C = ($X1 - $X2);
  if ( $C == 0 ) { return(FALSE); }
  $Yi = $Xi * (($Y1 - $Y2)/$C) + (($X1 * $Y2 - $X2 * $Y1)/$C);
 
  if ( $Xi >= min($X1,$X2) && $Xi >= min($X3,$X4) && $Xi <= max($X1,$X2) && $Xi <= max($X3,$X4))
  {
  if ( $Yi >= min($Y1,$Y2) && $Yi >= min($Y3,$Y4) && $Yi <= max($Y1,$Y2) && $Yi <= max($Y3,$Y4))
  { return(TRUE); }
  }
 
  return(FALSE);
  }
  }
  ?>
  <?php
  /*
  pStock - class to draw stock charts
 
  Version : 2.1.0
  Made by : Jean-Damien POGOLOTTI
  Last Update : 26/01/11
 
  This file can be distributed under the license you can find at :
 
  http://www.pchart.net/license
 
  You can find the whole class documentation on the pChart web site.
  */
 
  define("STOCK_MISSING_SERIE" , 180001);
 
  /* pStock class definition */
  class pStock
  {
  var $pChartObject;
  var $pDataObject;
 
  /* Class creator */
  function pStock($pChartObject,$pDataObject)
  {
  $this->pChartObject = $pChartObject;
  $this->pDataObject = $pDataObject;
  }
 
  /* Draw a stock chart */
  function drawStockChart($Format="")
  {
  $SerieOpen = isset($Format["SerieOpen"]) ? $Format["SerieOpen"] : "Open";
  $SerieClose = isset($Format["SerieClose"]) ? $Format["SerieClose"] : "Close";
  $SerieMin = isset($Format["SerieMin"]) ? $Format["SerieMin"] : "Min";
  $SerieMax = isset($Format["SerieMax"]) ? $Format["SerieMax"] : "Max";
  $LineWidth = isset($Format["LineWidth"]) ? $Format["LineWidth"] : 1;
  $LineR = isset($Format["LineR"]) ? $Format["LineR"] : 0;
  $LineG = isset($Format["LineG"]) ? $Format["LineG"] : 0;
  $LineB = isset($Format["LineB"]) ? $Format["LineB"] : 0;
  $LineAlpha = isset($Format["LineAlpha"]) ? $Format["LineAlpha"] : 100;
  $ExtremityWidth = isset($Format["ExtremityWidth"]) ? $Format["ExtremityWidth"] : 1;
  $ExtremityLength = isset($Format["ExtremityLength"]) ? $Format["ExtremityLength"] : 3;
  $ExtremityR = isset($Format["ExtremityR"]) ? $Format["ExtremityR"] : 0;
  $ExtremityG = isset($Format["ExtremityG"]) ? $Format["ExtremityG"] : 0;
  $ExtremityB = isset($Format["ExtremityB"]) ? $Format["ExtremityB"] : 0;
  $ExtremityAlpha = isset($Format["ExtremityAlpha"]) ? $Format["ExtremityAlpha"] : 100;
  $BoxWidth = isset($Format["BoxWidth"]) ? $Format["BoxWidth"] : 8;
  $BoxUpR = isset($Format["BoxUpR"]) ? $Format["BoxUpR"] : 188;
  $BoxUpG = isset($Format["BoxUpG"]) ? $Format["BoxUpG"] : 224;
  $BoxUpB = isset($Format["BoxUpB"]) ? $Format["BoxUpB"] : 46;
  $BoxUpAlpha = isset($Format["BoxUpAlpha"]) ? $Format["BoxUpAlpha"] : 100;
  $BoxUpSurrounding = isset($Format["BoxUpSurrounding"]) ? $Format["BoxUpSurrounding"] : NULL;
  $BoxUpBorderR = isset($Format["BoxUpBorderR"]) ? $Format["BoxUpBorderR"] : $BoxUpR-20;
  $BoxUpBorderG = isset($Format["BoxUpBorderG"]) ? $Format["BoxUpBorderG"] : $BoxUpG-20;
  $BoxUpBorderB = isset($Format["BoxUpBorderB"]) ? $Format["BoxUpBorderB"] : $BoxUpB-20;
  $BoxUpBorderAlpha = isset($Format["BoxUpBorderAlpha"]) ? $Format["BoxUpBorderAlpha"] : 100;
  $BoxDownR = isset($Format["BoxDownR"]) ? $Format["BoxDownR"] : 224;
  $BoxDownG = isset($Format["BoxDownG"]) ? $Format["BoxDownG"] : 100;
  $BoxDownB = isset($Format["BoxDownB"]) ? $Format["BoxDownB"] : 46;
  $BoxDownAlpha = isset($Format["BoxDownAlpha"]) ? $Format["BoxDownAlpha"] : 100;
  $BoxDownSurrounding= isset($Format["BoxDownSurrounding"]) ? $Format["BoxDownSurrounding"] : NULL;
  $BoxDownBorderR = isset($Format["BoxDownBorderR"]) ? $Format["BoxDownBorderR"] : $BoxDownR-20;
  $BoxDownBorderG = isset($Format["BoxDownBorderG"]) ? $Format["BoxDownBorderG"] : $BoxDownG-20;
  $BoxDownBorderB = isset($Format["BoxDownBorderB"]) ? $Format["BoxDownBorderB"] : $BoxDownB-20;
  $BoxDownBorderAlpha= isset($Format["BoxDownBorderAlpha"]) ? $Format["BoxDownBorderAlpha"] : 100;
  $ShadowOnBoxesOnly = isset($Format["ShadowOnBoxesOnly"]) ? $Format["ShadowOnBoxesOnly"] : TRUE;
 
  /* Data Processing */
  $Data = $this->pDataObject->getData();
  $Palette = $this->pDataObject->getPalette();
 
  if ( $BoxUpSurrounding != NULL ) { $BoxUpBorderR = $BoxUpR + $BoxUpSurrounding; $BoxUpBorderG = $BoxUpG + $BoxUpSurrounding; $BoxUpBorderB = $BoxUpB + $BoxUpSurrounding; }
  if ( $BoxDownSurrounding != NULL ) { $BoxDownBorderR = $BoxDownR + $BoxDownSurrounding; $BoxDownBorderG = $BoxDownG + $BoxDownSurrounding; $BoxDownBorderB = $BoxDownB + $BoxDownSurrounding; }
 
  if ( $LineWidth != 1 ) { $LineOffset = $LineWidth / 2; }
  $BoxOffset = $BoxWidth / 2;
 
  $Data = $this->pChartObject->DataSet->getData();
  list($XMargin,$XDivs) = $this->pChartObject->scaleGetXSettings();
 
  if ( !isset($Data["Series"][$SerieOpen]) || !isset($Data["Series"][$SerieClose]) || !isset($Data["Series"][$SerieMin]) || !isset($Data["Series"][$SerieMax]) )
  return(STOCK_MISSING_SERIE);
 
  $Plots = "";
  foreach($Data["Series"][$SerieOpen]["Data"] as $Key => $Value)
  {
  if ( isset($Data["Series"][$SerieClose]["Data"][$Key]) || isset($Data["Series"][$SerieMin]["Data"][$Key]) || isset($Data["Series"][$SerieMax]["Data"][$Key]) )
  $Plots[] = array($Value,$Data["Series"][$SerieClose]["Data"][$Key],$Data["Series"][$SerieMin]["Data"][$Key],$Data["Series"][$SerieMax]["Data"][$Key]);
  }
 
  $AxisID = $Data["Series"][$SerieOpen]["Axis"];
  $Mode = $Data["Axis"][$AxisID]["Display"];
  $Format = $Data["Axis"][$AxisID]["Format"];
  $Unit = $Data["Axis"][$AxisID]["Unit"];
 
  $YZero = $this->pChartObject->scaleComputeY(0,array("AxisID"=>$AxisID));
  $XStep = ($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1-$XMargin*2)/$XDivs;
 
  $X = $this->pChartObject->GraphAreaX1 + $XMargin;
  $Y = $this->pChartObject->GraphAreaY1 + $XMargin;
 
  $LineSettings = array("R"=>$LineR,"G"=>$LineG,"B"=>$LineB,"Alpha"=>$LineAlpha);
  $ExtremitySettings = array("R"=>$ExtremityR,"G"=>$ExtremityG,"B"=>$ExtremityB,"Alpha"=>$ExtremityAlpha);
  $BoxUpSettings = array("R"=>$BoxUpR,"G"=>$BoxUpG,"B"=>$BoxUpB,"Alpha"=>$BoxUpAlpha,"BorderR"=>$BoxUpBorderR,"BorderG"=>$BoxUpBorderG,"BorderB"=>$BoxUpBorderB,"BorderAlpha"=>$BoxUpBorderAlpha);
  $BoxDownSettings = array("R"=>$BoxDownR,"G"=>$BoxDownG,"B"=>$BoxDownB,"Alpha"=>$BoxDownAlpha,"BorderR"=>$BoxDownBorderR,"BorderG"=>$BoxDownBorderG,"BorderB"=>$BoxDownBorderB,"BorderAlpha"=>$BoxDownBorderAlpha);
 
  foreach($Plots as $Key =>$Points)
  {
  $PosArray = $this->pChartObject->scaleComputeY($Points,array("AxisID"=>$AxisID));
 
  if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )
  {
  if ( $YZero > $this->pChartObject->GraphAreaY2-1 ) { $YZero = $this->pChartObject->GraphAreaY2-1; }
  if ( $YZero < $this->pChartObject->GraphAreaY1+1 ) { $YZero = $this->pChartObject->GraphAreaY1+1; }
 
  if ( $XDivs == 0 ) { $XStep = 0; } else { $XStep = ($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1-$XMargin*2)/$XDivs; }
 
  if ( $ShadowOnBoxesOnly ) { $RestoreShadow = $this->pChartObject->Shadow; $this->pChartObject->Shadow = FALSE; }
 
  if ( $LineWidth == 1 )
  $this->pChartObject->drawLine($X,$PosArray[2],$X,$PosArray[3],$LineSettings);
  else
  $this->pChartObject->drawFilledRectangle($X-$LineOffset,$PosArray[2],$X+$LineOffset,$PosArray[3],$LineSettings);
 
  if ( $ExtremityWidth == 1 )
  {
  $this->pChartObject->drawLine($X-$ExtremityLength,$PosArray[2],$X+$ExtremityLength,$PosArray[2],$ExtremitySettings);
  $this->pChartObject->drawLine($X-$ExtremityLength,$PosArray[3],$X+$ExtremityLength,$PosArray[3],$ExtremitySettings);
  }
  else
  {
  $this->pChartObject->drawFilledRectangle($X-$ExtremityLength,$PosArray[2],$X+$ExtremityLength,$PosArray[2]-$ExtremityWidth,$ExtremitySettings);
  $this->pChartObject->drawFilledRectangle($X-$ExtremityLength,$PosArray[3],$X+$ExtremityLength,$PosArray[3]+$ExtremityWidth,$ExtremitySettings);
  }
 
  if ( $ShadowOnBoxesOnly ) { $this->pChartObject->Shadow = $RestoreShadow; }
 
  if ( $PosArray[0] > $PosArray[1] )
  $this->pChartObject->drawFilledRectangle($X-$BoxOffset,$PosArray[0],$X+$BoxOffset,$PosArray[1],$BoxUpSettings);
  else
  $this->pChartObject->drawFilledRectangle($X-$BoxOffset,$PosArray[0],$X+$BoxOffset,$PosArray[1],$BoxDownSettings);
 
  $X = $X + $XStep;
  }
  elseif ( $Data["Orientation"] == SCALE_POS_TOPBOTTOM )
  {
  if ( $YZero > $this->pChartObject->GraphAreaX2-1 ) { $YZero = $this->pChartObject->GraphAreaX2-1; }
  if ( $YZero < $this->pChartObject->GraphAreaX1+1 ) { $YZero = $this->pChartObject->GraphAreaX1+1; }
 
  if ( $XDivs == 0 ) { $XStep = 0; } else { $XStep = ($this->pChartObject->GraphAreaY2-$this->pChartObject->GraphAreaY1-$XMargin*2)/$XDivs; }
 
  if ( $LineWidth == 1 )
  $this->pChartObject->drawLine($PosArray[2],$Y,$PosArray[3],$Y,$LineSettings);
  else
  $this->pChartObject->drawFilledRectangle($PosArray[2],$Y-$LineOffset,$PosArray[3],$Y+$LineOffset,$LineSettings);
 
  if ( $ShadowOnBoxesOnly ) { $RestoreShadow = $this->pChartObject->Shadow; $this->pChartObject->Shadow = FALSE; }
 
  if ( $ExtremityWidth == 1 )
  {
  $this->pChartObject->drawLine($PosArray[2],$Y-$ExtremityLength,$PosArray[2],$Y+$ExtremityLength,$ExtremitySettings);
  $this->pChartObject->drawLine($PosArray[3],$Y-$ExtremityLength,$PosArray[3],$Y+$ExtremityLength,$ExtremitySettings);
  }
  else
  {
  $this->pChartObject->drawFilledRectangle($PosArray[2],$Y-$ExtremityLength,$PosArray[2]-$ExtremityWidth,$Y+$ExtremityLength,$ExtremitySettings);
  $this->pChartObject->drawFilledRectangle($PosArray[3],$Y-$ExtremityLength,$PosArray[3]+$ExtremityWidth,$Y+$ExtremityLength,$ExtremitySettings);
  }
 
  if ( $ShadowOnBoxesOnly ) { $this->pChartObject->Shadow = $RestoreShadow; }
 
  if ( $PosArray[0] < $PosArray[1] )
  $this->pChartObject->drawFilledRectangle($PosArray[0],$Y-$BoxOffset,$PosArray[1],$Y+$BoxOffset,$BoxUpSettings);
  else
  $this->pChartObject->drawFilledRectangle($PosArray[0],$Y-$BoxOffset,$PosArray[1],$Y+$BoxOffset,$BoxDownSettings);
 
  $Y = $Y + $XStep;
  }
  }
  }
  }
  ?>
  0;32;11011001100
  1;33;11001101100
  2;34;11001100110
  3;35;10010011000
  4;36;10010001100
  5;37;10001001100
  6;38;10011001000
  7;39;10011000100
  8;40;10001100100
  9;41;11001001000
  10;42;11001000100
  11;43;11000100100
  12;44;10110011100
  13;45;10011011100
  14;46;10011001110
  15;47;10111001100
  16;48;10011101100
  17;49;10011100110
  18;50;11001110010
  19;51;11001011100
  20;52;11001001110
  21;53;11011100100
  22;54;11001110100
  23;55;11101101110
  24;56;11101001100
  25;57;11100101100
  26;58;11100100110
  27;59;11101100100
  28;60;11100110100
  29;61;11100110010
  30;62;11011011000
  31;63;11011000110
  32;64;11000110110
  33;65;10100011000
  34;66;10001011000
  35;67;10001000110
  36;68;10110001000
  37;69;10001101000
  38;70;10001100010
  39;71;11010001000
  40;72;11000101000
  41;73;11000100010
  42;74;10110111000
  43;75;10110001110
  44;76;10001101110
  45;77;10111011000
  46;78;10111000110
  47;79;10001110110
  48;80;11101110110
  49;81;11010001110
  50;82;11000101110
  51;83;11011101000
  52;84;11011100010
  53;85;11011101110
  54;86;11101011000
  55;87;11101000110
  56;88;11100010110
  57;89;11101101000
  58;90;11101100010
  59;91;11100011010
  60;92;11101111010
  61;93;11001000010
  62;94;11110001010
  63;95;10100110000
  64;96;10100001100
  65;97;10010110000
  66;98;10010000110
  67;99;10000101100
  68;100;10000100110
  69;101;10110010000
  70;102;10110000100
  71;103;10011010000
  72;104;10011000010
  73;105;10000110100
  74;106;10000110010
  75;107;11000010010
  76;108;11001010000
  77;109;11110111010
  78;110;11000010100
  79;111;10001111010
  80;112;10100111100
  81;113;10010111100
  82;114;10010011110
  83;115;10111100100
  84;116;10011110100
  85;117;10011110010
  86;118;11110100100
  87;119;11110010100
  88;120;11110010010
  89;121;11011011110
  90;122;11011110110
  91;123;11110110110
  92;124;10101111000
  93;125;10100011110
  94;126;10001011110
  95;200;10111101000
  96;201;10111100010
  97;202;11110101000
  98;203;11110100010
  99;204;10111011110
  100;205;10111101110
  101;206;11101011110
  102;207;11110101110
  103;208;11010000100
  104;209;11010010000
  105;210;11010011100
  106;211;1100011101011
  0;101001101101
  1;110100101011
  2;101100101011
  3;110110010101
  4;101001101011
  5;110100110101
  6;101100110101
  7;101001011011
  8;110100101101
  9;101100101101
  A;110101001011
  B;101101001011
  C;110110100101
  D;101011001011
  E;110101100101
  F;101101100101
  G;101010011011
  H;110101001101
  I;101101001101
  J;101011001101
  K;110101010011
  L;101101010011
  M;110110101001
  N;101011010011
  O;110101101001
  P;101101101001
  Q;101010110011
  R;110101011001
  S;101101011001
  T;101011011001
  U;110010101011
  V;100110101011
  W;110011010101
  X;100101101011
  Y;110010110101
  Z;100110110101
  -;100101011011
  .;110010101101
  ;100110101101
  $;100100100101
  /;100100101001
  +;100101001001
  %;101001001001
  *;100101101101
  ECHO OFF
  setlocal ENABLEDELAYEDEXPANSION
 
  CLS
  ECHO.
 
 
 
 
 
  ECHO.
 
  php -v 1>NUL 2>NUL
  IF %ERRORLEVEL% == 0 GOTO getVersion
  GOTO noPHP
 
  :getVersion
  FOR /F "tokens=1,2 delims= " %%G IN ('php -v') DO (
  IF %%G==PHP SET PHPVersion=%%H
  )
 
  :render
  ECHO The PHP binaries (%PHPVersion%) have been located in your system PATH
  ECHO.
  ECHO. >resources\errors.log
 
  REM SET /P Var=" Progress : "<NUL
 
  FOR %%f IN (*.*) DO (
  set t=%%f
  if !t:~-3! == php (
 
  php -q "%~dp0%%f" 1>NUL 2>>resources\errors.log
  )
  )
 
  ECHO.
  ECHO.
  ECHO All the example have been rendered in the following folder :
  ECHO.
  ECHO %~dp0pictures\
  GOTO end
 
  :noPHP
 
  ECHO The PHP binaries can't be found. We strongly advise you to put it in
  ECHO the system path variable.
  ECHO.
  ECHO Examples rendering has been aborded.
  :end
  PAUSE >NUL
  /*
  delayedLoader - JS to delay out of sight pictures rendering
 
  Version : 2.0.2
  Made by : Jean-Damien POGOLOTTI
  Last Update : 10/12/10
 
  This file can be distributed under the license you can find at :
 
  http://www.pchart.net/license
 
  You can find the whole class documentation on the pChart web site.
  */
 
  var PictureCache = new Array();
  var PictureCount = 0;
  var WaitPicture = "wait.gif";
  var DivClassName = "pChart";
  var DefaultWidth = 70;
  var DefaultHeight = 230;
  var DefaultAlt = "pChart rendered picture";
 
 
  /* Do the DOM document processing */
  function loaderInit()
  {
  WindowSize = getWindowSize();
  WindowHeight = WindowSize[1];
  Offset = getScrollXY();
  HeightOffset = Offset[1];
 
  /* Enumerate the tags */
  Links = document.getElementsByTagName("a");
  for (i = 0; i < Links.length; i++)
  {
  className = Links[i].className;
 
  if ( className == DivClassName )
  {
  ObjectWidth = Links[i].getAttribute("data-pchart-width");
  ObjectHeight = Links[i].getAttribute("data-pchart-height");
  ObjectID = Links[i].id;
  ObjectTop = Links[i].offsetTop;
  ObjectURL = Links[i].href;
  ObjectAlt = Links[i].getAttribute("data-pchart-alt");
 
  if ( ObjectWidth == null ) { ObjectWidth = DefaultWidth; }
  if ( ObjectHeight == null ) { ObjectHeight = DefaultHeight; }
  if ( ObjectAlt == null ) { ObjectAlt = DefaultAlt; }
 
  if (ObjectID == "") { ObjectID = "pChart-"+i; Links[i].id = ObjectID; }
 
  PictureCache[PictureCount] = new Array();
  PictureCache[PictureCount][0] = ObjectID;
  PictureCache[PictureCount][1] = ObjectTop;
  PictureCache[PictureCount][2] = ObjectURL;
  PictureCache[PictureCount][3] = ObjectAlt;
  PictureCache[PictureCount][4] = ObjectWidth;
  PictureCache[PictureCount][5] = ObjectHeight;
 
  PictureCount++;
  }
  }
 
  /* Replace the <A> tags by <DIV> ones and attach the loader */
  for(i=0;i<PictureCount;i++)
  {
  ATag = document.getElementById(PictureCache[i][0]);
  DivTag = document.createElement("div");
  DivID = "pChart-Div"+i; PictureCache[i][0] = DivID;
 
  DivTag.setAttribute("id", DivID);
  DivTag.style.width = PictureCache[i][4];
  DivTag.style.height = PictureCache[i][5];
  DivTag.style.backgroundColor = "#E0E0E0";
 
  DivTag2 = ATag.parentNode.replaceChild(DivTag, ATag);
 
  DivTop = DivTag.offsetTop;
  PictureCache[i][1] = DivTop;
 
  changeOpac(50, i);
  changeContent("<img src='"+WaitPicture+"' width=24 height=24 alt=''/>",i);
 
  if ( HeightOffset + WindowHeight > PictureCache[i][1] ) { triggerVisible(i); }
  }
  }
 
  /* Replace the contents of the delayed loading DIV */
  function changeContent(html, id)
  { DivID = PictureCache[id][0]; document.getElementById(DivID).innerHTML = html; }
 
  /* Trigger the picture rendering when the pChart DIV became visible */
  function triggerVisible(PictureID)
  {
  if ( !PictureCache[PictureID][6] == true )
  {
  PictureCache[PictureID][6] = true;
  ajaxRender(PictureCache[PictureID][2],PictureID);
  }
  }
 
  /* Catch the navigator window scrolling event */
  function scrollEvent()
  {
  WindowSize = getWindowSize();
  WindowHeight = WindowSize[1];
  Offset = getScrollXY();
  HeightOffset = Offset[1];
 
  for(i=0;i<=PictureCount-1;i++) { if ( HeightOffset + WindowHeight > PictureCache[i][1] ) { triggerVisible(i); } }
  }
 
  /* Cross browser X/Y window offset gatherer */
  function getScrollXY()
  {
  var scrOfX = 0, scrOfY = 0;
 
  if( typeof( window.pageYOffset ) == 'number' )
  { scrOfY = window.pageYOffset; scrOfX = window.pageXOffset; }
  else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) )
  { scrOfY = document.body.scrollTop; scrOfX = document.body.scrollLeft; }
  else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) )
  { scrOfY = document.documentElement.scrollTop; scrOfX = document.documentElement.scrollLeft; }
 
  return [ scrOfX, scrOfY ];
  }
 
  /* Cross browser X/Y window size gatherer */
  function getWindowSize()
  {
  var myWidth = 0, myHeight = 0;
 
  if( typeof( window.innerWidth ) == 'number' )
  { myWidth = window.innerWidth; myHeight = window.innerHeight; }
  else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
  { myWidth = document.documentElement.clientWidth; myHeight = document.documentElement.clientHeight; }
  else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) )
  { myWidth = document.body.clientWidth; myHeight = document.body.clientHeight; }
 
  return [ myWidth, myHeight ];
  }
 
  /* Cross browser alpha transparency changer */
  function changeOpac(opacity, id)
  {
  DivID = PictureCache[id][0];
 
  var object = document.getElementById(DivID).style;
  object.opacity = (opacity / 100);
  object.MozOpacity = (opacity / 100);
  object.KhtmlOpacity = (opacity / 100);
  object.filter = "alpha(opacity=" + opacity + ")";
  }
 
  /* Shade in-out function */
  function opacity(id, opacStart, opacEnd, millisec)
  {
  var speed = Math.round(millisec / 100);
  var timer = 0;
 
  if(opacStart > opacEnd)
  {
  for(i = opacStart; i >= opacEnd; i--)
  {
  setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
  timer++;
  }
  }
  else if(opacStart < opacEnd)
  {
  for(i = opacStart; i <= opacEnd; i++)
  {
  setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
  timer++;
  }
  }
  }
 
  /* Start the loader */
  function StartFade(PictureID)
  {
  Loader = new Image();
  URL = PictureCache[PictureID][2];
  Loader.src = URL;
  setTimeout("CheckLoadingStatus("+PictureID+")", 200);
  }
 
  /* check the picture loading status */
  function CheckLoadingStatus(PictureID)
  {
  DivID = PictureCache[PictureID][0];
  URL = PictureCache[PictureID][2];
  Alt = PictureCache[PictureID][3];
 
  if ( Loader.complete == true )
  {
  changeOpac(0, PictureID);
  HTMLResult = "<center><img src='" + URL + "' alt='"+Alt+"'/></center>";
  document.getElementById(DivID).innerHTML = HTMLResult;
 
  opacity(PictureID,0,100,100);
  }
  else
  setTimeout("CheckLoadingStatus("+PictureID+")", 200);
  }
 
  /* Compute the pChart picture in background */
  function ajaxRender(URL,PictureID)
  {
  var xmlhttp=false;
  /*@cc_on @*/
  /*@if (@_jscript_version >= 5)
  try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } }
  @end @*/
 
  if (!xmlhttp && typeof XMLHttpRequest!='undefined')
  { try { xmlhttp = new XMLHttpRequest(); } catch (e) { xmlhttp=false; } }
 
  if (!xmlhttp && window.createRequest)
  { try { xmlhttp = window.createRequest(); } catch (e) { xmlhttp=false; } }
 
  xmlhttp.open("GET", URL,true);
 
  xmlhttp.onreadystatechange=function()
  { if (xmlhttp.readyState==4) { StartFade(PictureID); } }
  xmlhttp.send(null)
  }
 
  <?php
  if ( !isset($_GET["Seed"]) )
  { $Seed = "Unknown"; }
  else
  { $Seed = $_GET["Seed"]; }
 
  /* pChart library inclusions */
  include("../../class/pDraw.class.php");
  include("../../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>220,"StartG"=>220,"StartB"=>220,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100));
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>220,"StartG"=>220,"StartB"=>220,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>50));
  $RectangleSettings = array("R"=>180,"G"=>180,"B"=>180,"Alpha"=>100);
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>150,"G"=>150,"B"=>150));
 
  /* Write the title */
  $myPicture->setFontProperties(array("FontName"=>"../../fonts/advent_light.ttf","FontSize"=>40));
  $myPicture->drawText(130,130,"Delayed loading script",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Write the seed # */
  $myPicture->setFontProperties(array("FontName"=>"../../fonts/advent_light.ttf","FontSize"=>10));
  $myPicture->drawText(130,140,"Seed # : ".$Seed,array("R"=>255,"G"=>255,"B"=>255));
 
  /* Draw a bezier curve */
  $BezierSettings = array("R"=>255,"G"=>255,"B"=>255,"Ticks"=>4,"DrawArrow"=>TRUE,"ArrowTwoHeads"=>TRUE);
  $myPicture->drawBezier(360,170,670,120,430,100,560,190,$BezierSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("draw.png");
  ?>
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
  <script src='delayedLoading.js' type="text/javascript"></script>
  <title>pChart 2.x - Delayed loading</title>
  <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>
  <style>
  html { height: 100%; }
  body { background-color: #F0F0F0; font-family: tahoma; font-size: 14px; height: 100%;}
  td { font-family: tahoma; font-size: 11px; }
  div.txt { font-family: tahoma; font-size: 11px; width: 660px; padding: 15px; }
  a.smallLink:link { text-decoration: none; color: #6A6A6A; }
  a.smallLink:visited { text-decoration: none; color: #6A6A6A; }
  a.smallLink:hover { text-decoration: underline; color: #6A6A6A; }
  a.pChart { text-decoration: none; color: #6A6A6A; }
  </style>
  </head>
  <body onscroll="scrollEvent();" onload="loaderInit();">
 
  <table style='border: 2px solid #FFFFFF;'><tr><td>
  <div style='font-size: 11px; padding: 2px; color: #FFFFFF; background-color: #666666; border-bottom: 3px solid #484848; width: 361px;'>&nbsp;Navigation</div>
  <table style='padding: 1px; background-color: #E0E0E0; border: 1px solid #D0D0D0; border-top: 1px solid #FFFFFF;'><tr>
  <td width=16><img src='../resources/application_view_tile.png' width=16 height=16 alt=''/></td>
  <td width=95>&nbsp;<a class=smallLink href='../'>Examples</a></td>
  <td width=16><img src='../resources/application_view_list.png' width=16 height=16 alt=''/></td>
  <td width=95>&nbsp;<a class=smallLink href='../sandbox/'>Sandbox</a></td>
  <td width=16><img src='../resources/application_view_list.png' width=16 height=16 alt=''/></td>
  <td width=95>&nbsp;<b>Delayed loader</b></td>
  </tr></table>
  </td></tr></table>
 
  <br/>
 
  <div class=txt>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
  aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
  occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  </div>
  <a class='pChart' href='draw.php?Seed=1' data-pchart-alt='Picture1' data-pchart-width='700' data-pchart-height='230'>Picture 1</a>
  <div class=txt>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
  aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
  occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  </div>
  <a class='pChart' href='draw.php?Seed=2' data-pchart-alt='Picture2'>Picture 2</a>
  <div class=txt>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
  aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
  occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  </div>
  <a class='pChart' href='draw.php?Seed=3' data-pchart-alt='Picture3'>Picture 3</a>
  <div class=txt>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
  aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
  occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  </div>
  <a class='pChart' href='draw.php?Seed=4' data-pchart-alt='Picture4'>Picture 4</a>
  <div class=txt>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
  aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
  occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  </div>
  <a class='pChart' href='draw.php?Seed=5' data-pchart-alt='Picture5'>Picture 5</a>
  <div class=txt>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
  aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
  occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  </div>
  <a class='pChart' href='draw.php?Seed=6' data-pchart-alt='Picture6'>Picture 6</a>
  <div class=txt>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
  aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
  occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  </div>
  <a class='pChart' href='draw.php?Seed=7' data-pchart-alt='Picture7'>Picture 7</a>
  <div class=txt>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
  aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
  occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  </div>
  </body>
 Binary files /dev/null and b/lib/pChart2.1.0/examples/delayedLoader/wait.gif differ
  <?php
  /* CAT:Misc */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pData object with some random values*/
  $MyData = new pData();
  $MyData->addRandomValues("Probe 1",array("Values"=>30,"Min"=>0,"Max"=>4));
  $MyData->addRandomValues("Probe 2",array("Values"=>30,"Min"=>6,"Max"=>10));
  $MyData->addRandomValues("Probe 3",array("Values"=>30,"Min"=>12,"Max"=>16));
  $MyData->addRandomValues("Probe 4",array("Values"=>30,"Min"=>18,"Max"=>22));
  $MyData->setAxisName(0,"Probes");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Create a solid background */
  $Settings = array("R"=>179, "G"=>217, "B"=>91, "Dash"=>1, "DashR"=>199, "DashG"=>237, "DashB"=>111);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Do a gradient overlay */
  $Settings = array("StartR"=>194, "StartG"=>231, "StartB"=>44, "EndR"=>43, "EndG"=>107, "EndB"=>58, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"addRandomValues() :: assess your scales",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Draw the scale */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->setGraphArea(50,60,670,190);
  $myPicture->drawFilledRectangle(50,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("CycleBackground"=>TRUE,"LabelSkip"=>4,"DrawSubTicks"=>TRUE));
 
  /* Graph title */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->drawText(50,52,"Magnetic noise",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMLEFT));
 
  /* Draw the data series */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->drawSplineChart();
  $myPicture->setShadow(FALSE);
 
  /* Write the legend */
  $myPicture->drawLegend(475,50,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.addRandomValues.png");
  ?>
  <?php
  /* CAT:Barcode */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pBarcode39.class.php");
  include("../class/pBarcode128.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(600,310);
  $myPicture->drawFilledRectangle(0,0,600,310,array("R"=>240,"G"=>240,"B"=>240));
 
  /* Draw the rounded box */
  $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>30));
  $Settings = array("R"=>255,"G"=>255,"B"=>255,"BorderR"=>0,"BorderG"=>0,"BorderB"=>0);
  $myPicture->drawRoundedFilledRectangle(10,10,590,300,10,$Settings);
 
  /* Draw the cell divisions */
  $myPicture->setShadow(FALSE);
  $Settings = array("R"=>0,"G"=>0,"B"=>0);
  $myPicture->drawLine(10,110,590,110,$Settings);
  $myPicture->drawLine(200,10,200,110,$Settings);
  $myPicture->drawLine(400,10,400,110,$Settings);
  $myPicture->drawLine(10,160,590,160,$Settings);
  $myPicture->drawLine(220,160,220,200,$Settings);
  $myPicture->drawLine(320,160,320,200,$Settings);
  $myPicture->drawLine(10,200,590,200,$Settings);
  $myPicture->drawLine(400,220,400,300,$Settings);
 
  /* Write the fields labels */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>10));
  $Settings = array("R"=>0,"G"=>0,"B"=>0,"Align"=>TEXT_ALIGN_TOPLEFT);
  $myPicture->drawText(20,20,"FROM",$Settings);
  $myPicture->drawText(210,20,"TO",$Settings);
  $myPicture->drawText(20,120,"ACCT.\r\nNUMBER",$Settings);
  $myPicture->drawText(20,166,"QUANTITY",$Settings);
  $myPicture->drawText(230,166,"SHIPMENT CODE",$Settings);
  $myPicture->drawText(330,166,"SENDER CODE",$Settings);
  $myPicture->drawText(410,220,"MFG DATE",$Settings);
  $myPicture->drawText(410,260,"NET WEIGTH",$Settings);
 
  /* Filling the fields values */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>16));
  $myPicture->drawText(70,20,"BEBEER INC\r\n342, MAIN STREET\r\n33000 BORDEAUX\r\nFRANCE",$Settings);
  $myPicture->drawText(250,20,"MUSTAFA'S BAR\r\n18, CAPITOL STREET\r\n31000 TOULOUSE\r\nFRANCE",$Settings);
 
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>35));
  $myPicture->drawText(100,120,"2342355552340",$Settings);
 
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>20));
  $Settings = array("R"=>0,"G"=>0,"B"=>0,"Align"=>TEXT_ALIGN_TOPRIGHT);
  $myPicture->drawText(210,180,"75 CANS",$Settings);
  $myPicture->drawText(310,180,"TLSE",$Settings);
  $myPicture->drawText(580,180,"WAREHOUSE#SLOT#B15",$Settings);
 
  $Settings = array("R"=>0,"G"=>0,"B"=>0,"Align"=>TEXT_ALIGN_TOPLEFT);
  $myPicture->drawText(410,236,"06/06/2010",$Settings);
  $myPicture->drawText(410,276,"12.340 Kg",$Settings);
 
  /* Create the barcode 39 object */
  $Barcode39 = new pBarcode39("../");
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $Settings = array("ShowLegend"=>TRUE,"Height"=>55,"DrawArea"=>TRUE,"DrawArea"=>FALSE);
  $Barcode39->draw($myPicture,"12250000234502",30,220,$Settings);
 
  $Settings = array("ShowLegend"=>TRUE,"Height"=>14,"DrawArea"=>TRUE,"DrawArea"=>FALSE);
  $Barcode39->draw($myPicture,"75 cans",260,220,$Settings);
  $Barcode39->draw($myPicture,"06062010",260,260,$Settings);
 
  /* Create the barcode 128 object */
  $Barcode128 = new pBarcode128("../");
  $Settings = array("ShowLegend"=>TRUE,"Height"=>65,"DrawArea"=>TRUE,"DrawArea"=>FALSE);
  $Barcode128->draw($myPicture,"TLSE",450,25,$Settings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.barcode.png");
  ?>
  <?php
  /* CAT:Barcode */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pBarcode128.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Draw the border */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"Barcode 128 - Add barcode to your pictures",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Create the barcode 128 object */
  $Barcode = new pBarcode128("../");
 
  /* Draw a simple barcode */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $Settings = array("ShowLegend"=>TRUE,"DrawArea"=>TRUE);
  $Barcode->draw($myPicture,"pChart Rocks!",50,50,$Settings);
 
  /* Draw a rotated barcode */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>12));
  $Settings = array("ShowLegend"=>TRUE,"DrawArea"=>TRUE,"Angle"=>90);
  $Barcode->draw($myPicture,"Turn me on",650,50,$Settings);
 
  /* Draw a rotated barcode */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>12));
  $Settings = array("R"=>255,"G"=>255,"B"=>255,"AreaR"=>150,"AreaG"=>30,"AreaB"=>27,"ShowLegend"=>TRUE,"DrawArea"=>TRUE,"Angle"=>350,"AreaBorderR"=>70,"AreaBorderG"=>20,"AreaBorderB"=>20);
  $Barcode->draw($myPicture,"Do what you want !",290,140,$Settings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawbarcode128.png");
  ?>
  <?php
  /* CAT:Barcode */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pBarcode39.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Draw the picture border */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"Barcode 39 - Add barcode to your pictures",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Create the barcode 39 object */
  $Barcode = new pBarcode39("../");
 
  /* Draw a simple barcode */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $Settings = array("ShowLegend"=>TRUE,"DrawArea"=>TRUE);
  $Barcode->draw($myPicture,"pChart Rocks!",50,50,$Settings);
 
  /* Draw a rotated barcode */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>12));
  $Settings = array("ShowLegend"=>TRUE,"DrawArea"=>TRUE,"Angle"=>90);
  $Barcode->draw($myPicture,"Turn me on",650,50,$Settings);
 
  /* Draw a rotated barcode */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>12));
  $Settings = array("R"=>255,"G"=>255,"B"=>255,"AreaR"=>150,"AreaG"=>30,"AreaB"=>27,"ShowLegend"=>TRUE,"DrawArea"=>TRUE,"Angle"=>350,"AreaBorderR"=>70,"AreaBorderG"=>20,"AreaBorderB"=>20);
  $Barcode->draw($myPicture,"Do what you want !",290,140,$Settings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.barcode39.png");
  ?>
  <?php
  /* CAT:Misc */
 
  /* Include all the classes */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
  include("../class/pData.class.php");
 
  /* Create your dataset object */
  $myData = new pData();
 
  /* Add data in your dataset */
  $myData->addPoints(array(1,3,4,3,5));
 
  /* Create a pChart object and associate your dataset */
  $myPicture = new pImage(700,230,$myData);
 
  /* Choose a nice font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
 
  /* Define the boundaries of the graph area */
  $myPicture->setGraphArea(60,40,670,190);
 
  /* Draw the scale, keep everything automatic */
  $myPicture->drawScale();
 
  /* Draw the scale, keep everything automatic */
  $myPicture->drawSplineChart();
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.basic.png");
  ?>
  <?php
  /* CAT:Misc */
 
  /* Include all the classes */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
  include("../class/pData.class.php");
  include("../class/pCache.class.php");
 
  /* Create your dataset object */
  $myData = new pData();
 
  /* Add data in your dataset */
  $myData->addPoints(array(1,3,4,3,5));
 
  /* Create the cache object */
  $myCache = new pCache(array("CacheFolder"=>"../cache"));
 
  /* Compute the hash linked to the chart data */
  $ChartHash = $myCache->getHash($myData);
 
  /* Test if we got this hash in our cache already */
  if ( $myCache->isInCache($ChartHash))
  {
  /* If we have it, get the picture from the cache! */
  $myCache->saveFromCache($ChartHash,"pictures/example.cache.png");
  }
  else
  {
  /* Create a pChart object and associate your dataset */
  $myPicture = new pImage(700,230,$myData);
 
  /* Choose a nice font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
 
  /* Define the boundaries of the graph area */
  $myPicture->setGraphArea(60,40,670,190);
 
  /* Draw the scale, keep everything automatic */
  $myPicture->drawScale();
 
  /* Draw the scale, keep everything automatic */
  $myPicture->drawSplineChart();
 
  /* Do some cosmetics */
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"Test of the pCache class",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Push the rendered picture to the cache */
  $myCache->writeToCache($ChartHash,$myPicture);
 
  /* Render the picture */
  $myPicture->render("pictures/example.cache.png");
  }
  ?>
  <?php
  /* CAT:Misc */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pData object with some random values*/
  $MyData = new pData();
  $MyData->addPoints(array(30,24,32),"This year");
  $MyData->addPoints(array(28,20,27),"Last year");
  $MyData->addPoints(array("Year","Month","Day"),"Labels");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Create a solid background */
  $Settings = array("R"=>179, "G"=>217, "B"=>91, "Dash"=>1, "DashR"=>199, "DashG"=>237, "DashB"=>111);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Do a gradient overlay */
  $Settings = array("StartR"=>194, "StartG"=>231, "StartB"=>44, "EndR"=>43, "EndG"=>107, "EndB"=>58, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"Chart title",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Draw the scale */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->setGraphArea(50,60,670,190);
  $myPicture->drawFilledRectangle(50,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("CycleBackground"=>TRUE));
 
  /* Graph title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->drawText(50,52,"Chart subtitle",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMLEFT));
 
  /* Draw the bar chart chart */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $MyData->setSerieDrawable("Last year",FALSE);
  $myPicture->drawBarChart();
 
  /* Draw the line and plot chart */
  $MyData->setSerieDrawable("Last year",TRUE);
  $MyData->setSerieDrawable("This year",FALSE);
  $myPicture->drawSplineChart();
  $myPicture->drawPlotChart();
 
  /* Make sure all series are drawable before writing the scale */
  $MyData->drawAll();
 
  /* Write the legend */
  $myPicture->drawLegend(580,35,array("Style"=>LEGEND_ROUND,"Alpha"=>20,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.combo.png");
  ?>
  <?php
  /* CAT:Pie charts */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pPie.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(40,60,15,10,6,4),"ScoreA");
  $MyData->setSerieDescription("ScoreA","Application A");
 
  /* Define the absissa serie */
  $MyData->addPoints(array("<10","10<>20","20<>40","40<>60","60<>80",">80"),"Labels");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw a solid background */
  $Settings = array("R"=>173, "G"=>152, "B"=>217, "Dash"=>1, "DashR"=>193, "DashG"=>172, "DashB"=>237);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Draw a gradient overlay */
  $Settings = array("StartR"=>209, "StartG"=>150, "StartB"=>231, "EndR"=>111, "EndG"=>3, "EndB"=>138, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"pPie - Draw 2D pie charts",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Set the default font properties */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>10,"R"=>80,"G"=>80,"B"=>80));
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>50));
 
  /* Create the pPie object */
  $PieChart = new pPie($myPicture,$MyData);
 
  /* Draw a simple pie chart */
  $PieChart->draw2DPie(120,125,array("SecondPass"=>FALSE));
 
  /* Draw an AA pie chart */
  $PieChart->draw2DPie(340,125,array("DrawLabels"=>TRUE,"Border"=>TRUE));
 
  /* Draw a splitted pie chart */
  $PieChart->draw2DPie(560,125,array("DataGapAngle"=>10,"DataGapRadius"=>6,"Border"=>TRUE,"BorderR"=>255,"BorderG"=>255,"BorderB"=>255));
 
  /* Write the legend */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
  $myPicture->drawText(120,200,"Single AA pass",array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Align"=>TEXT_ALIGN_TOPMIDDLE));
  $myPicture->drawText(440,200,"Extended AA pass / Splitted",array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Align"=>TEXT_ALIGN_TOPMIDDLE));
 
  /* Write the legend box */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6,"R"=>255,"G"=>255,"B"=>255));
  $PieChart->drawPieLegend(380,8,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.draw2DPie.png");
  ?>
  <?php
  /* CAT:Pie charts */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pPie.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(40,30,20),"ScoreA");
  $MyData->setSerieDescription("ScoreA","Application A");
 
  /* Define the absissa serie */
  $MyData->addPoints(array("A","B","C"),"Labels");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData,TRUE);
 
  /* Draw a solid background */
  $Settings = array("R"=>173, "G"=>152, "B"=>217, "Dash"=>1, "DashR"=>193, "DashG"=>172, "DashB"=>237);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Draw a gradient overlay */
  $Settings = array("StartR"=>209, "StartG"=>150, "StartB"=>231, "EndR"=>111, "EndG"=>3, "EndB"=>138, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"pPie - Draw 3D pie charts",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Set the default font properties */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>10,"R"=>80,"G"=>80,"B"=>80));
 
  /* Create the pPie object */
  $PieChart = new pPie($myPicture,$MyData);
 
  /* Define the slice color */
  $PieChart->setSliceColor(0,array("R"=>143,"G"=>197,"B"=>0));
  $PieChart->setSliceColor(1,array("R"=>97,"G"=>77,"B"=>63));
  $PieChart->setSliceColor(2,array("R"=>97,"G"=>113,"B"=>63));
 
  /* Draw a simple pie chart */
  $PieChart->draw3DPie(120,125,array("SecondPass"=>FALSE));
 
  /* Draw an AA pie chart */
  $PieChart->draw3DPie(340,125,array("DrawLabels"=>TRUE,"Border"=>TRUE));
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>3,"Y"=>3,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Draw a splitted pie chart */
  $PieChart->draw3DPie(560,125,array("DataGapAngle"=>10,"DataGapRadius"=>6,"Border"=>TRUE));
 
  /* Write the legend */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
  $myPicture->drawText(120,200,"Single AA pass",array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Align"=>TEXT_ALIGN_TOPMIDDLE));
  $myPicture->drawText(440,200,"Extended AA pass / Splitted",array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Align"=>TEXT_ALIGN_TOPMIDDLE));
 
  /* Write the legend box */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6,"R"=>255,"G"=>255,"B"=>255));
  $PieChart->drawPieLegend(600,8,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.draw3DPie.png");
  ?>
  <?php
  /* CAT:Pie charts */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pPie.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(40,30,20),"ScoreA");
  $MyData->setSerieDescription("ScoreA","Application A");
 
  /* Define the absissa serie */
  $MyData->addPoints(array("A","B","C"),"Labels");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(240,180,$MyData,TRUE);
 
  /* Set the default font properties */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>10,"R"=>80,"G"=>80,"B"=>80));
 
  /* Create the pPie object */
  $PieChart = new pPie($myPicture,$MyData);
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>3,"Y"=>3,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Draw a splitted pie chart */
  $PieChart->draw3DPie(120,90,array("Radius"=>100,"DataGapAngle"=>10,"DataGapRadius"=>6,"Border"=>TRUE));
 
  /* Write the legend box */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6,"R"=>0,"G"=>0,"B"=>0));
  $PieChart->drawPieLegend(140,160,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.draw3DPie.transparent.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>180,"StartG"=>193,"StartB"=>91,"EndR"=>120,"EndG"=>137,"EndB"=>72,"Alpha"=>100));
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>180,"StartG"=>193,"StartB"=>91,"EndR"=>120,"EndG"=>137,"EndB"=>72,"Alpha"=>20));
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawAntialiasPixel() - Drawing antialiased pixel with transparency",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Draw some alpha pixels */
  for($X=0;$X<=160;$X++)
  {
  for($Y=0;$Y<=160;$Y++)
  {
  $PixelSettings = array("R"=>128,"G"=>255-$Y,"B"=>$X,"Alpha"=>cos(deg2rad($X*2))*50+50);
 
  $myPicture->drawAntialiasPixel($X*2+20.4,$Y+45,$PixelSettings);
  $myPicture->drawAntialiasPixel($X+400,$Y+45,$PixelSettings);
  }
  }
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawantialiaspixel.png");
  ?>
  <?php
  /* CAT:Area Chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");
  $MyData->addPoints(array(3,12,15,8,5,-5),"Probe 2");
  $MyData->addPoints(array(2,7,5,18,19,22),"Probe 3");
  $MyData->setSerieTicks("Probe 2",4);
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawAreaChart() - draw an area chart",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Write the chart title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(250,55,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Draw the scale and the 1st chart */
  $myPicture->setGraphArea(60,60,450,190);
  $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("DrawSubTicks"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->drawAreaChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO));
  $myPicture->setShadow(FALSE);
 
  /* Draw the scale and the 2nd chart */
  $myPicture->setGraphArea(500,60,670,190);
  $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->drawAreaChart();
  $myPicture->setShadow(FALSE);
 
  /* Write the chart legend */
  $myPicture->drawLegend(510,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawAreaChart.png");
  ?>
  <?php
  /* CAT:Area Chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(4,2,10,12,8,3),"Probe 1");
  $MyData->addPoints(array(3,12,15,8,5,5),"Probe 2");
  $MyData->addPoints(array(2,7,5,18,15,22),"Probe 3");
  $MyData->setSerieTicks("Probe 2",4);
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Turn of Antialiasing */
  $myPicture->Antialias = FALSE;
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the chart title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(150,35,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Define the chart area */
  $myPicture->setGraphArea(60,40,650,200);
 
  /* Draw the scale */
  $scaleSettings = array("XMargin"=>10,"YMargin"=>10,"Floating"=>TRUE,"GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);
  $myPicture->drawScale($scaleSettings);
 
  /* Write the chart legend */
  $myPicture->drawLegend(540,20,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Turn on Antialiasing */
  $myPicture->Antialias = TRUE;
 
  /* Draw the area chart */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->drawAreaChart();
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawAreaChart.simple.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawArrow() - Arrows on your charts",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Draw some arrows */
  for($i=1;$i<=100;$i=$i+8)
  {
  $arrowSettings = array("FillR"=>$i*2.5,"FillG"=>$i*2.5,"FillB"=>$i*2.5,"Ticks"=>$i % 5);
 
  $myPicture->drawArrow($i+5,215,$i*7+5,30,$arrowSettings);
  }
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawArrow.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawArrowLabel() - Adaptative label positionning",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Draw an arrow with a 45 degree angle */
  $ArrowSettings = array("FillR"=>37,"FillG"=>78,"FillB"=>117,"Length"=>40,"Angle"=>45);
  $myPicture->drawArrowLabel(348,113,"Blue",$ArrowSettings);
 
  /* Draw an arrow with a 135 degree angle */
  $ArrowSettings = array("FillR"=>188,"FillG"=>49,"FillB"=>42,"Length"=>40,"Angle"=>135,"Position"=>POSITION_BOTTOM,"Ticks"=>2);
  $myPicture->drawArrowLabel(348,117,"Red",$ArrowSettings);
 
  /* Draw an arrow with a 225 degree angle */
  $ArrowSettings = array("FillR"=>51,"FillG"=>119,"FillB"=>35,"Length"=>40,"Angle"=>225,"Position"=>POSITION_BOTTOM,"Ticks"=>3);
  $myPicture->drawArrowLabel(352,117,"Green",$ArrowSettings);
 
  /* Draw an arrow with a 315 degree angle */
  $ArrowSettings = array("FillR"=>239,"FillG"=>231,"FillB"=>97,"Length"=>40,"Angle"=>315,"Ticks"=>4);
  $myPicture->drawArrowLabel(352,113,"Yellow",$ArrowSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawArrowLabel.png");
  ?>
  <?php
  /* CAT:Bar Chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(150,220,300,-250,-420,-200,300,200,100),"Server A");
  $MyData->addPoints(array(140,0,340,-300,-320,-300,200,100,50),"Server B");
  $MyData->setAxisName(0,"Hits");
  $MyData->addPoints(array("January","February","March","April","May","Juin","July","August","September"),"Months");
  $MyData->setSerieDescription("Months","Month");
  $MyData->setAbscissa("Months");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100));
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>20));
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Draw the scale */
  $myPicture->setGraphArea(50,30,680,200);
  $myPicture->drawScale(array("CycleBackground"=>TRUE,"DrawSubTicks"=>TRUE,"GridR"=>0,"GridG"=>0,"GridB"=>0,"GridAlpha"=>10));
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Draw the chart */
  $settings = array("Gradient"=>TRUE,"GradientMode"=>GRADIENT_EFFECT_CAN,"DisplayPos"=>LABEL_POS_INSIDE,"DisplayValues"=>TRUE,"DisplayR"=>255,"DisplayG"=>255,"DisplayB"=>255,"DisplayShadow"=>TRUE,"Surrounding"=>10);
  $myPicture->drawBarChart($settings);
 
  /* Write the chart legend */
  $myPicture->drawLegend(580,12,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawBarChart.can.png");
  ?>
  <?php
  /* CAT:Bar Chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(150,220,300,250,420,200,300,200,100),"Server A");
  $MyData->addPoints(array(140,0,340,300,320,300,200,100,50),"Server B");
  $MyData->setAxisName(0,"Hits");
  $MyData->addPoints(array("January","February","March","April","May","Juin","July","August","September"),"Months");
  $MyData->setSerieDescription("Months","Month");
  $MyData->setAbscissa("Months");
 
  /* Create the floating 0 data serie */
  $MyData->addPoints(array(60,80,20,40,0,50,90,30,100),"Floating 0");
  $MyData->setSerieDrawable("Floating 0",FALSE);
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100));
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>20));
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Draw the scale */
  $myPicture->setGraphArea(50,30,680,200);
  $myPicture->drawScale(array("CycleBackground"=>TRUE,"DrawSubTicks"=>TRUE,"GridR"=>0,"GridG"=>0,"GridB"=>0,"GridAlpha"=>10));
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Draw the chart */
  $settings = array("Floating0Serie"=>"Floating 0","Draw0Line"=>TRUE,"Gradient"=>TRUE,"DisplayPos"=>LABEL_POS_INSIDE,"DisplayValues"=>TRUE,"DisplayR"=>255,"DisplayG"=>255,"DisplayB"=>255,"DisplayShadow"=>TRUE,"Surrounding"=>10);
  $myPicture->drawBarChart($settings);
 
  /* Write the chart legend */
  $myPicture->drawLegend(580,12,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawBarChart.floating.png");
  ?>
  <?php
  /* CAT:Bar Chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(13251,4118,3087,1460,1248,156,26,9,8),"Hits");
  $MyData->setAxisName(0,"Hits");
  $MyData->addPoints(array("Firefox","Chrome","Internet Explorer","Opera","Safari","Mozilla","SeaMonkey","Camino","Lunascape"),"Browsers");
  $MyData->setSerieDescription("Browsers","Browsers");
  $MyData->setAbscissa("Browsers");
 
  /* Create the pChart object */
  $myPicture = new pImage(500,500,$MyData);
  $myPicture->drawGradientArea(0,0,500,500,DIRECTION_VERTICAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100));
  $myPicture->drawGradientArea(0,0,500,500,DIRECTION_HORIZONTAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>20));
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Draw the chart scale */
  $myPicture->setGraphArea(100,30,480,480);
  $myPicture->drawScale(array("CycleBackground"=>TRUE,"DrawSubTicks"=>TRUE,"GridR"=>0,"GridG"=>0,"GridB"=>0,"GridAlpha"=>10,"Pos"=>SCALE_POS_TOPBOTTOM)); //
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Create the per bar palette */
  $Palette = array("0"=>array("R"=>188,"G"=>224,"B"=>46,"Alpha"=>100),
  "1"=>array("R"=>224,"G"=>100,"B"=>46,"Alpha"=>100),
  "2"=>array("R"=>224,"G"=>214,"B"=>46,"Alpha"=>100),
  "3"=>array("R"=>46,"G"=>151,"B"=>224,"Alpha"=>100),
  "4"=>array("R"=>176,"G"=>46,"B"=>224,"Alpha"=>100),
  "5"=>array("R"=>224,"G"=>46,"B"=>117,"Alpha"=>100),
  "6"=>array("R"=>92,"G"=>224,"B"=>46,"Alpha"=>100),
  "7"=>array("R"=>224,"G"=>176,"B"=>46,"Alpha"=>100));
 
  /* Draw the chart */
  $myPicture->drawBarChart(array("DisplayPos"=>LABEL_POS_INSIDE,"DisplayValues"=>TRUE,"Rounded"=>TRUE,"Surrounding"=>30,"OverrideColors"=>$Palette));
 
  /* Write the legend */
  $myPicture->drawLegend(570,215,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawBarChart.palette.png");
  ?>
  <?php
  /* CAT:Bar Chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");
  $MyData->addPoints(array(3,12,15,8,5,-5),"Probe 2");
  $MyData->addPoints(array(2,0,5,18,19,22),"Probe 3");
  $MyData->setSerieTicks("Probe 2",4);
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawBarChart() - draw a bar chart",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Write the chart title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(250,55,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Draw the scale and the 1st chart */
  $myPicture->setGraphArea(60,60,450,190);
  $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("DrawSubTicks"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->drawBarChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO,"Rounded"=>TRUE,"Surrounding"=>60));
  $myPicture->setShadow(FALSE);
 
  /* Draw the scale and the 2nd chart */
  $myPicture->setGraphArea(500,60,670,190);
  $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->drawBarChart();
  $myPicture->setShadow(FALSE);
 
  /* Write the chart legend */
  $myPicture->drawLegend(510,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawBarChart.png");
  ?>
  <?php
  /* CAT:Bar Chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(150,220,300,-250,-420,-200,300,200,100),"Server A");
  $MyData->addPoints(array(140,0,340,-300,-320,-300,200,100,50),"Server B");
  $MyData->setAxisName(0,"Hits");
  $MyData->addPoints(array("January","February","March","April","May","Juin","July","August","September"),"Months");
  $MyData->setSerieDescription("Months","Month");
  $MyData->setAbscissa("Months");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100));
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>20));
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Draw the scale */
  $myPicture->setGraphArea(50,30,680,200);
  $myPicture->drawScale(array("CycleBackground"=>TRUE,"DrawSubTicks"=>TRUE,"GridR"=>0,"GridG"=>0,"GridB"=>0,"GridAlpha"=>10));
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Draw the chart */
  $settings = array("Gradient"=>TRUE,"DisplayPos"=>LABEL_POS_INSIDE,"DisplayValues"=>TRUE,"DisplayR"=>255,"DisplayG"=>255,"DisplayB"=>255,"DisplayShadow"=>TRUE,"Surrounding"=>10);
  $myPicture->drawBarChart($settings);
 
  /* Write the chart legend */
  $myPicture->drawLegend(580,12,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawBarChart.shaded.png");
  ?>
  <?php
  /* CAT:Bar Chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(150,220,300,-250,-420,-200,300,200,100),"Server A");
  $MyData->addPoints(array(140,0,340,-300,-320,-300,200,100,50),"Server B");
  $MyData->setAxisName(0,"Hits");
  $MyData->addPoints(array("January","February","March","April","May","Juin","July","August","September"),"Months");
  $MyData->setSerieDescription("Months","Month");
  $MyData->setAbscissa("Months");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Turn of Antialiasing */
  $myPicture->Antialias = FALSE;
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Define the chart area */
  $myPicture->setGraphArea(60,40,650,200);
 
  /* Draw the scale */
  $scaleSettings = array("GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);
  $myPicture->drawScale($scaleSettings);
 
  /* Write the chart legend */
  $myPicture->drawLegend(580,12,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Draw the chart */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $settings = array("Gradient"=>TRUE,"GradientMode"=>GRADIENT_EFFECT_CAN,"DisplayPos"=>LABEL_POS_INSIDE,"DisplayValues"=>TRUE,"DisplayR"=>255,"DisplayG"=>255,"DisplayB"=>255,"DisplayShadow"=>TRUE,"Surrounding"=>10);
  $myPicture->drawBarChart();
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawBarChart.simple.png");
  ?>
  <?php
  /* CAT:Bar Chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(13251,4118,3087,1460,1248,156,26,9,8),"Hits");
  $MyData->setAxisName(0,"Hits");
  $MyData->addPoints(array("Firefox","Chrome","Internet Explorer","Opera","Safari","Mozilla","SeaMonkey","Camino","Lunascape"),"Browsers");
  $MyData->setSerieDescription("Browsers","Browsers");
  $MyData->setAbscissa("Browsers");
 
  /* Create the pChart object */
  $myPicture = new pImage(500,500,$MyData);
  $myPicture->drawGradientArea(0,0,500,500,DIRECTION_VERTICAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100));
  $myPicture->drawGradientArea(0,0,500,500,DIRECTION_HORIZONTAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>20));
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Draw the chart scale */
  $myPicture->setGraphArea(100,30,480,480);
  $myPicture->drawScale(array("CycleBackground"=>TRUE,"DrawSubTicks"=>TRUE,"GridR"=>0,"GridG"=>0,"GridB"=>0,"GridAlpha"=>10,"Pos"=>SCALE_POS_TOPBOTTOM)); //
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Draw the chart */
  $myPicture->drawBarChart(array("DisplayPos"=>LABEL_POS_INSIDE,"DisplayValues"=>TRUE,"Rounded"=>TRUE,"Surrounding"=>30));
 
  /* Write the legend */
  $myPicture->drawLegend(570,215,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawBarChart.vertical.png");
  ?>
  <?php
  /* CAT:Mathematical */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  for($i=0;$i<=20;$i++) { $MyData->addPoints(rand(10,30)+$i,"Probe 1"); }
  for($i=0;$i<=20;$i++) { $MyData->addPoints(rand(0,10)+$i,"Probe 2"); }
  $MyData->setAxisName(0,"Temperatures");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Turn of Antialiasing */
  $myPicture->Antialias = FALSE;
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the chart title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(150,35,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Define the chart area */
  $myPicture->setGraphArea(60,40,650,200);
 
  /* Draw the scale */
  $scaleSettings = array("XMargin"=>10,"YMargin"=>10,"Floating"=>TRUE,"GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);
  $myPicture->drawScale($scaleSettings);
 
  /* Turn on Antialiasing */
  $myPicture->Antialias = TRUE;
 
  /* Draw the line of best fit */
  $myPicture->drawBestFit();
 
  /* Turn on shadows */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Draw the line chart */
  $myPicture->drawPlotChart();
 
  /* Write the chart legend */
  $myPicture->drawLegend(580,20,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawBestFit.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawBezier() - some cubic curves",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Draw one bezier curve */
  $BezierSettings = array("R"=>255,"G"=>255,"B"=>255,"ShowControl"=>TRUE);
  $myPicture->drawBezier(20,40,280,170,130,160,160,60,$BezierSettings);
 
  /* Draw one bezier curve */
  $BezierSettings = array("R"=>255,"G"=>255,"B"=>255,"ShowControl"=>TRUE,"Ticks"=>4,"DrawArrow"=>TRUE,"ArrowTwoHeads"=>TRUE);
  $myPicture->drawBezier(360,120,630,120,430,50,560,190,$BezierSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawBezier.png");
  ?>
  <?php
  /* CAT:Bubble chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
  include("../class/pBubble.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(34,55,15,62,38,42),"Probe1");
  $MyData->addPoints(array(5,10,8,9,15,10),"Probe1Weight");
  $MyData->addPoints(array(5,10,-5,-1,0,-10),"Probe2");
  $MyData->addPoints(array(6,10,14,10,14,6),"Probe2Weight");
  $MyData->setSerieDescription("Probe1","This year");
  $MyData->setSerieDescription("Probe2","Last year");
  $MyData->setAxisName(0,"Current stock");
  $MyData->addPoints(array("Apple","Banana","Orange","Lemon","Peach","Strawberry"),"Product");
  $MyData->setAbscissa("Product");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawBubbleChart() - draw a linear bubble chart",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Write the title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(40,55,"Current Stock / Needs chart",array("FontSize"=>14,"Align"=>TEXT_ALIGN_BOTTOMLEFT));
 
  /* Change the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Create the Bubble chart object and scale up */
  $myBubbleChart = new pBubble($myPicture,$MyData);
 
  /* Scale up for the bubble chart */
  $bubbleDataSeries = array("Probe1","Probe2");
  $bubbleWeightSeries = array("Probe1Weight","Probe2Weight");
  $myBubbleChart->bubbleScale($bubbleDataSeries,$bubbleWeightSeries);
 
  /* Draw the 1st chart */
  $myPicture->setGraphArea(40,60,430,190);
  $myPicture->drawFilledRectangle(40,60,430,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-50,"Alpha"=>10));
  $myPicture->drawScale(array("DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>30));
  $myBubbleChart->drawBubbleChart($bubbleDataSeries,$bubbleWeightSeries);
 
  /* Draw the 2nd scale */
  $myPicture->setShadow(FALSE);
  $myPicture->setGraphArea(500,60,670,190);
  $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));
 
  /* Draw the 2nd stock chart */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>30));
  $myBubbleChart->drawbubbleChart($bubbleDataSeries,$bubbleWeightSeries,array("DrawBorder"=>TRUE,"Surrounding"=>60,"BorderAlpha"=>100));
 
  /* Write the chart legend */
  $myPicture->drawLegend(550,215,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawBubbleChart.png");
  ?>
  <?php
  /* CAT:Bubble chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
  include("../class/pBubble.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(34,55,15,62,38,42),"Probe1");
  $MyData->addPoints(array(5,10,8,9,15,10),"Probe1Weight");
  $MyData->addPoints(array(5,10,-5,-1,0,-10),"Probe2");
  $MyData->addPoints(array(6,10,14,10,14,6),"Probe2Weight");
  $MyData->setSerieDescription("Probe1","This year");
  $MyData->setSerieDescription("Probe2","Last year");
  $MyData->setAxisName(0,"Current stock");
  $MyData->addPoints(array("Apple","Banana","Orange","Lemon","Peach","Strawberry"),"Product");
  $MyData->setAbscissa("Product");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Turn of AAliasing */
  $myPicture->Antialias = FALSE;
 
  /* Draw the border */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Define the chart area */
  $myPicture->setGraphArea(60,30,650,190);
 
  /* Draw the scale */
  $scaleSettings = array("GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);
  $myPicture->drawScale($scaleSettings);
 
  /* Create the Bubble chart object and scale up */
  $myPicture->Antialias = TRUE;
  $myBubbleChart = new pBubble($myPicture,$MyData);
 
  /* Scale up for the bubble chart */
  $bubbleDataSeries = array("Probe1","Probe2");
  $bubbleWeightSeries = array("Probe1Weight","Probe2Weight");
  $myBubbleChart->bubbleScale($bubbleDataSeries,$bubbleWeightSeries);
 
  /* Draw the bubble chart */
  $myBubbleChart->drawBubbleChart($bubbleDataSeries,$bubbleWeightSeries);
 
  /* Write the chart legend */
  $myPicture->drawLegend(570,13,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawBubbleChart.simple.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawCircle() - Transparency & colors",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Draw some circles */
  $myPicture->drawCircle(100,125,50,50,array("R"=>213,"G"=>226,"B"=>0,"Alpha"=>100));
  $myPicture->drawCircle(140,125,50,50,array("R"=>213,"G"=>226,"B"=>0,"Alpha"=>70));
  $myPicture->drawCircle(180,125,50,50,array("R"=>213,"G"=>226,"B"=>0,"Alpha"=>40));
  $myPicture->drawCircle(220,125,50,50,array("R"=>213,"G"=>226,"B"=>0,"Alpha"=>20));
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Draw a customized circles */
  $CircleSettings = array("R"=>209,"G"=>31,"B"=>27,"Alpha"=>100);
  $myPicture->drawCircle(480,60,20,20,$CircleSettings);
 
  /* Draw a customized circles */
  $CircleSettings = array("R"=>209,"G"=>125,"B"=>27,"Alpha"=>100);
  $myPicture->drawCircle(480,100,30,20,$CircleSettings);
 
  /* Draw a customized circles */
  $CircleSettings = array("R"=>209,"G"=>198,"B"=>27,"Alpha"=>100,"Ticks"=>4);
  $myPicture->drawCircle(480,140,40,20,$CircleSettings);
 
  /* Draw a customized circles */
  $CircleSettings = array("R"=>134,"G"=>209,"B"=>27,"Alpha"=>100,"Ticks"=>4);
  $myPicture->drawCircle(480,180,50,20,$CircleSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawCircle.png");
  ?>
  <?php
  /* CAT:Mathematical */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(-4,VOID,VOID,12,8,3,4,5,0,4,6,10),"Probe 1");
  $MyData->addPoints(array(3,12,15,8,5,-5,5,-5,-3,4,5,10),"Probe 2");
  $MyData->addPoints(array(2,7,5,18,19,22,10,2,6,10,5,6),"Probe 3");
  $MyData->setSerieTicks("Probe 2",4);
  $MyData->setSerieWeight("Probe 3",2);
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawDerivative() - draw the series slope",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Draw the scale and the 1st chart */
  $myPicture->setGraphArea(60,40,680,150);
  $myPicture->drawFilledRectangle(60,40,680,150,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("DrawSubTicks"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->drawLineChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO));
 
  /* Draw the series derivative graph */
  $myPicture->drawDerivative(array("ShadedSlopeBox"=>TRUE,"CaptionLine"=>TRUE));
 
  /* Write the chart legend */
  $myPicture->setFontProperties(array("R"=>255,"G"=>255,"B"=>255));
  $myPicture->drawLegend(560,8,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawDerivative.png");
  ?>
  <?php
  /* CAT:Mathematical */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(3,12,15,8,5,-5,5,-5,-3,4,5,10),"Probe");
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Turn of AAliasing */
  $myPicture->Antialias = FALSE;
 
  /* Set the default font */
  $myPicture->setFontProperties(array("R"=>0,"G"=>0,"B"=>0,"FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Define the chart area */
  $myPicture->setGraphArea(50,40,680,170);
 
  /* Draw the scale */
  $scaleSettings = array("XMargin"=>10,"YMargin"=>10,"Floating"=>TRUE,"DrawSubTicks"=>TRUE,"GridR"=>100,"GridG"=>100,"GridB"=>100,"GridAlpha"=>15);
  $myPicture->drawScale($scaleSettings);
 
  /* Draw the chart */
  $myPicture->Antialias = TRUE;
  $myPicture->drawSplineChart();
  $myPicture->Antialias = FALSE;
 
  /* Draw the series derivative graph */
  $myPicture->drawDerivative(array("Caption"=>FALSE));
 
  /* Write the chart legend */
  $myPicture->drawLegend(640,20,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawDerivative.simple.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawCircle() - Transparency & colors",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Draw some filled circles */
  $myPicture->drawFilledCircle(100,125,50,array("R"=>213,"G"=>226,"B"=>0,"Alpha"=>100));
  $myPicture->drawFilledCircle(140,125,50,array("R"=>213,"G"=>226,"B"=>0,"Alpha"=>70));
  $myPicture->drawFilledCircle(180,125,50,array("R"=>213,"G"=>226,"B"=>0,"Alpha"=>40));
  $myPicture->drawFilledCircle(220,125,50,array("R"=>213,"G"=>226,"B"=>0,"Alpha"=>20));
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Draw a customized filled circles */
  $CircleSettings = array("R"=>209,"G"=>31,"B"=>27,"Alpha"=>100,"Surrounding"=>30);
  $myPicture->drawFilledCircle(480,60,19,$CircleSettings);
 
  /* Draw a customized filled circles */
  $CircleSettings = array("R"=>209,"G"=>125,"B"=>27,"Alpha"=>100,"Surrounding"=>30);
  $myPicture->drawFilledCircle(480,100,19,$CircleSettings);
 
  /* Draw a customized filled circles */
  $CircleSettings = array("R"=>209,"G"=>198,"B"=>27,"Alpha"=>100,"Surrounding"=>30,"Ticks"=>4);
  $myPicture->drawFilledCircle(480,140,19,$CircleSettings);
 
  /* Draw a customized filled circles */
  $CircleSettings = array("R"=>134,"G"=>209,"B"=>27,"Alpha"=>100,"Surrounding"=>30,"Ticks"=>4);
  $myPicture->drawFilledCircle(480,180,19,$CircleSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawFilledCircle.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawFilledRectangle() - Transparency & colors",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Draw a customized filled rectangle */
  $RectangleSettings = array("R"=>150,"G"=>200,"B"=>170,"Dash"=>TRUE,"DashR"=>170,"DashG"=>220,"DashB"=>190,"BorderR"=>255,"BorderG"=>255,"BorderB"=>255);
  $myPicture->drawFilledRectangle(20,60,400,170,$RectangleSettings);
 
  /* Draw a customized filled rectangle */
  $RectangleSettings = array("R"=>209,"G"=>134,"B"=>27,"Alpha"=>30);
  $myPicture->drawFilledRectangle(30,30,200,200,$RectangleSettings);
 
  /* Draw a customized filled rectangle */
  $RectangleSettings = array("R"=>209,"G"=>31,"B"=>27,"Alpha"=>100,"Surrounding"=>30);
  $myPicture->drawFilledRectangle(480,50,650,80,$RectangleSettings);
 
  /* Draw a customized filled rectangle */
  $RectangleSettings = array("R"=>209,"G"=>125,"B"=>27,"Alpha"=>100,"Surrounding"=>30);
  $myPicture->drawFilledRectangle(480,90,650,120,$RectangleSettings);
 
  /* Draw a customized filled rectangle */
  $RectangleSettings = array("R"=>209,"G"=>198,"B"=>27,"Alpha"=>100,"Surrounding"=>30,"Ticks"=>2);
  $myPicture->drawFilledRectangle(480,130,650,160,$RectangleSettings);
 
  /* Draw a customized filled rectangle */
  $RectangleSettings = array("R"=>134,"G"=>209,"B"=>27,"Alpha"=>100,"Surrounding"=>30,"Ticks"=>2);
  $myPicture->drawFilledRectangle(480,170,650,200,$RectangleSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawFilledRectangle.png");
  ?>
  <?php
  /* CAT:Spline chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->setAxisName(0,"Strength");
  for($i=0;$i<=720;$i=$i+20)
  {
  $MyData->addPoints(cos(deg2rad($i))*100,"Probe 1");
  $MyData->addPoints(cos(deg2rad($i+90))*60,"Probe 2");
  }
 
  /* Create the pChart object */
  $myPicture = new pImage(847,304,$MyData);
  $myPicture->drawGradientArea(0,0,847,304,DIRECTION_VERTICAL,array("StartR"=>47,"StartG"=>47,"StartB"=>47,"EndR"=>17,"EndG"=>17,"EndB"=>17,"Alpha"=>100));
  $myPicture->drawGradientArea(0,250,847,304,DIRECTION_VERTICAL,array("StartR"=>47,"StartG"=>47,"StartB"=>47,"EndR"=>27,"EndG"=>27,"EndB"=>27,"Alpha"=>100));
  $myPicture->drawLine(0,249,847,249,array("R"=>0,"G"=>0,"B"=>0));
  $myPicture->drawLine(0,250,847,250,array("R"=>70,"G"=>70,"B"=>70));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,846,303,array("R"=>204,"G"=>204,"B"=>204));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->drawText(423,14,"Cyclic magnetic field strength",array("R"=>255,"G"=>255,"B"=>255,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE));
 
  /* Define the chart area */
  $myPicture->setGraphArea(58,27,816,228);
 
  /* Draw a rectangle */
  $myPicture->drawFilledRectangle(58,27,816,228,array("R"=>0,"G"=>0,"B"=>0,"Dash"=>TRUE,"DashR"=>0,"DashG"=>51,"DashB"=>51,"BorderR"=>0,"BorderG"=>0,"BorderB"=>0));
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Draw the scale */
  $myPicture->setFontProperties(array("R"=>255,"G"=>255,"B"=>255));
  $ScaleSettings = array("XMargin"=>4,"DrawSubTicks"=>TRUE,"GridR"=>255,"GridG"=>255,"GridB"=>255,"AxisR"=>255,"AxisG"=>255,"AxisB"=>255,"GridAlpha"=>30,"CycleBackground"=>TRUE);
  $myPicture->drawScale($ScaleSettings);
 
  /* Draw the spline chart */
  $myPicture->drawFilledSplineChart();
 
  /* Write the chart boundaries */
  $BoundsSettings = array("MaxDisplayR"=>237,"MaxDisplayG"=>23,"MaxDisplayB"=>48,"MinDisplayR"=>23,"MinDisplayG"=>144,"MinDisplayB"=>237);
  $myPicture->writeBounds(BOUND_BOTH,$BoundsSettings);
 
  /* Write the 0 line */
  $myPicture->drawThreshold(0,array("WriteCaption"=>TRUE));
 
  /* Write the chart legend */
  $myPicture->setFontProperties(array("R"=>255,"G"=>255,"B"=>255));
  $myPicture->drawLegend(560,266,array("Style"=>LEGEND_NOBORDER));
 
  /* Write the 1st data series statistics */
  $Settings = array("R"=>188,"G"=>224,"B"=>46,"Align"=>TEXT_ALIGN_BOTTOMLEFT);
  $myPicture->drawText(620,270,"Max : ".ceil($MyData->getMax("Probe 1")),$Settings);
  $myPicture->drawText(680,270,"Min : ".ceil($MyData->getMin("Probe 1")),$Settings);
  $myPicture->drawText(740,270,"Avg : ".ceil($MyData->getSerieAverage("Probe 1")),$Settings);
 
  /* Write the 2nd data series statistics */
  $Settings = array("R"=>224,"G"=>100,"B"=>46,"Align"=>TEXT_ALIGN_BOTTOMLEFT);
  $myPicture->drawText(620,283,"Max : ".ceil($MyData->getMax("Probe 2")),$Settings);
  $myPicture->drawText(680,283,"Min : ".ceil($MyData->getMin("Probe 2")),$Settings);
  $myPicture->drawText(740,283,"Avg : ".ceil($MyData->getSerieAverage("Probe 2")),$Settings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawFilledSplineChart.png");
  ?>
  <?php
  /* CAT:Step chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(-4,2,VOID,12,8,3),"Probe 1");
  $MyData->addPoints(array(3,12,15,8,5,-5),"Probe 2");
  $MyData->addPoints(array(2,7,5,18,19,22),"Probe 3");
  $MyData->setSerieTicks("Probe 2",4);
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawFilledStepChart() - draw a filled step chart",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Write the chart title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(250,55,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Draw the scale and the 1st chart */
  $myPicture->setGraphArea(60,60,450,190);
  $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("DrawSubTicks"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->drawFilledStepChart(array("ForceTransparency"=>40,"DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO));
  $myPicture->setShadow(FALSE);
 
  /* Draw the scale and the 2nd chart */
  $myPicture->setGraphArea(500,60,670,190);
  $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>-1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->drawFilledStepChart(array("ForceTransparency"=>40));
  $myPicture->setShadow(FALSE);
 
  /* Write the chart legend */
  $myPicture->drawLegend(510,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawFilledStepChart.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawFromGIF() - add pictures to your charts",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Turn off shadow computing */
  $myPicture->setShadow(FALSE);
 
  /* Draw a GIF object */
  $myPicture->drawFromGIF(180,50,"resources/computer.gif");
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Draw a GIF object */
  $myPicture->drawFromGIF(400,50,"resources/computer.gif");
 
  /* Write the legend */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
  $TextSettings = array("R"=>255,"G"=>255,"B"=>255,"FontSize"=>10,"FontName"=>"../fonts/calibri.ttf","Align"=>TEXT_ALIGN_BOTTOMMIDDLE);
  $myPicture->drawText(240,200,"Without shadow",$TextSettings);
  $myPicture->drawText(460,200,"With enhanced shadow",$TextSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawFromGIF.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawFromJPG() - add pictures to your charts",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Turn off shadow computing */
  $myPicture->setShadow(FALSE);
 
  /* Draw a JPG object */
  $myPicture->drawFromJPG(100,45,"resources/landscape1.jpg");
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Draw a JPG object */
  $myPicture->drawFromJPG(380,45,"resources/landscape2.jpg");
 
  /* Write the legend */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
  $TextSettings = array("R"=>255,"G"=>255,"B"=>255,"FontSize"=>10,"FontName"=>"../fonts/calibri.ttf","Align"=>TEXT_ALIGN_BOTTOMMIDDLE);
  $myPicture->drawText(220,210,"Without shadow",$TextSettings);
  $myPicture->drawText(490,210,"With enhanced shadow",$TextSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawFromJPG.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawFromPNG() - add pictures to your charts",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Turn off shadow computing */
  $myPicture->setShadow(FALSE);
 
  /* Draw a PNG object */
  $myPicture->drawFromPNG(180,50,"resources/hologram.png");
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Draw a PNG object */
  $myPicture->drawFromPNG(400,50,"resources/blocnote.png");
 
  /* Write the legend */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
  $TextSettings = array("R"=>255,"G"=>255,"B"=>255,"FontSize"=>10,"FontName"=>"../fonts/calibri.ttf","Align"=>TEXT_ALIGN_BOTTOMMIDDLE);
  $myPicture->drawText(240,190," Without shadow\r\n(only PNG alpha channels)",$TextSettings);
  $myPicture->drawText(460,200,"With enhanced shadow",$TextSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawFromPNG.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawGradientArea() - Transparency & colors",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Draw a gradient area */
  $GradientSettings = array("StartR"=>181,"StartG"=>209,"StartB"=>27,"Alpha"=>100,"Levels"=>-50);
  $myPicture->drawGradientArea(20,60,400,170,DIRECTION_HORIZONTAL,$GradientSettings);
 
  /* Draw a gradient area */
  $GradientSettings = array("StartR"=>209,"StartG"=>134,"StartB"=>27,"Alpha"=>30,"Levels"=>-50);
  $myPicture->drawGradientArea(30,30,200,200,DIRECTION_VERTICAL,$GradientSettings);
 
  /* Draw a gradient area */
  $GradientSettings = array("StartR"=>209,"StartG"=>31,"StartB"=>27,"Alpha"=>100,"Levels"=>50);
  $myPicture->drawGradientArea(480,50,650,80,DIRECTION_HORIZONTAL,$GradientSettings);
 
  /* Draw a gradient area */
  $GradientSettings = array("StartR"=>209,"StartG"=>125,"StartB"=>27,"Alpha"=>100,"Levels"=>50);
  $myPicture->drawGradientArea(480,90,650,120,DIRECTION_VERTICAL,$GradientSettings);
 
  /* Draw a gradient area */
  $GradientSettings = array("StartR"=>209,"StartG"=>198,"StartB"=>27,"Alpha"=>100,"Levels"=>50);
  $myPicture->drawGradientArea(480,130,650,160,DIRECTION_HORIZONTAL,$GradientSettings);
 
  /* Draw a gradient area */
  $GradientSettings = array("StartR"=>134,"StartG"=>209,"StartB"=>27,"Alpha"=>100,"Levels"=>50);
  $myPicture->drawGradientArea(480,170,650,200,DIRECTION_HORIZONTAL,$GradientSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawGradientArea.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(24,25,26,25,25),"My Serie 1");
  $MyData->addPoints(array(80,85,84,81,82),"My Serie 2");
  $MyData->addPoints(array(17,16,18,18,15),"My Serie 3");
  $MyData->setSerieTicks("My Serie 1",4);
  $MyData->setSerieWeight("My Serie 2",2);
  $MyData->setSerieDescription("My Serie 1","Temperature");
  $MyData->setSerieDescription("My Serie 2","Humidity\n(in percentage)");
  $MyData->setSerieDescription("My Serie 3","Pressure");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Draw the picture border */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawLegend() - Write your chart legend",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Write a legend box */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->drawLegend(70,60);
 
  /* Write a legend box */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/MankSans.ttf","FontSize"=>10,"R"=>30,"G"=>30,"B"=>30));
  $myPicture->drawLegend(230,60,array("BoxSize"=>4,"R"=>173,"G"=>163,"B"=>83,"Surrounding"=>20,"Family"=>LEGEND_FAMILY_CIRCLE));
 
  /* Write a legend box */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>9,"R"=>80,"G"=>80,"B"=>80));
  $myPicture->drawLegend(400,60,array("Style"=>LEGEND_BOX,"BoxSize"=>4,"R"=>200,"G"=>200,"B"=>200,"Surrounding"=>20,"Alpha"=>30));
 
  /* Write a legend box */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawLegend(70,150,array("Mode"=>LEGEND_HORIZONTAL, "Family"=>LEGEND_FAMILY_CIRCLE));
 
  /* Write a legend box */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->drawLegend(400,150,array("Style"=>LEGEND_BOX,"Mode"=>LEGEND_HORIZONTAL, "BoxWidth"=>30,"Family"=>LEGEND_FAMILY_LINE));
 
  /* Write a legend box */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawFilledRectangle(1,200,698,228,array("Alpha"=>30,"R"=>255,"G"=>255,"B"=>255));
  $myPicture->drawLegend(10,208,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Define series icons */
  $MyData->setSeriePicture("My Serie 1","resources/application_view_list.png");
  $MyData->setSeriePicture("My Serie 2","resources/application_view_tile.png");
  $MyData->setSeriePicture("My Serie 3","resources/chart_bar.png");
 
  /* Write a legend box */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->drawLegend(540,50,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_VERTICAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawLegend.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Draw the picture border */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawLine() - Basis",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Draw some lines */
  for($i=1;$i<=100;$i=$i+4)
  $myPicture->drawLine($i+5,215,$i*7+5,30,array("R"=>rand(0,255),"G"=>rand(0,255),"B"=>rand(0,255),"Ticks"=>rand(0,4)));
 
  /* Draw an horizontal dashed line with extra weight */
  $myPicture->drawLine(370,160,650,160,array("R"=>0,"G"=>0,"B"=>0,"Ticks"=>4,"Weight"=>3));
 
  /* Another example of extra weight */
  $myPicture->drawLine(370,180,650,200,array("R"=>255,"G"=>255,"B"=>255,"Ticks"=>15,"Weight"=>1));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawLine.png");
  ?>
  <?php
  /* CAT:Line chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");
  $MyData->addPoints(array(3,12,15,8,5,-5),"Probe 2");
  $MyData->addPoints(array(2,7,5,18,19,22),"Probe 3");
  $MyData->setSerieTicks("Probe 2",4);
  $MyData->setSerieWeight("Probe 3",2);
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawPlotChart() - draw a plot chart",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Write the chart title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(250,55,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Draw the scale and the 1st chart */
  $myPicture->setGraphArea(60,60,450,190);
  $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("DrawSubTicks"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->drawLineChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO));
  $myPicture->setShadow(FALSE);
 
  /* Draw the scale and the 2nd chart */
  $myPicture->setGraphArea(500,60,670,190);
  $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>-1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->drawLineChart();
  $myPicture->setShadow(FALSE);
 
  /* Write the chart legend */
  $myPicture->drawLegend(510,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawLineChart.png");
  ?>
  <?php
  /* CAT:Line chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");
  $MyData->addPoints(array(3,12,15,8,5,-5),"Probe 2");
  $MyData->addPoints(array(2,7,5,18,19,22),"Probe 3");
  $MyData->setSerieTicks("Probe 2",4);
  $MyData->setSerieWeight("Probe 3",2);
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Turn of Antialiasing */
  $myPicture->Antialias = FALSE;
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the chart title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(150,35,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Define the chart area */
  $myPicture->setGraphArea(60,40,650,200);
 
  /* Draw the scale */
  $scaleSettings = array("XMargin"=>10,"YMargin"=>10,"Floating"=>TRUE,"GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);
  $myPicture->drawScale($scaleSettings);
 
  /* Turn on Antialiasing */
  $myPicture->Antialias = TRUE;
 
  /* Draw the line chart */
  $myPicture->drawLineChart();
 
  /* Write the chart legend */
  $myPicture->drawLegend(540,20,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawLineChart.simple.png");
  ?>
  <?php
  /* CAT:Pie charts */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pPie.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(40,60,15,10,6,4),"ScoreA");
  $MyData->setSerieDescription("ScoreA","Application A");
 
  /* Define the absissa serie */
  $MyData->addPoints(array("<10","10<>20","20<>40","40<>60","60<>80",">80"),"Labels");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawPieLegend - Draw pie charts legend",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Set the default font properties */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>10,"R"=>80,"G"=>80,"B"=>80));
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>150,"G"=>150,"B"=>150,"Alpha"=>100));
 
  /* Create the pPie object */
  $PieChart = new pPie($myPicture,$MyData);
 
  /* Draw two AA pie chart */
  $PieChart->draw2DPie(200,100,array("Border"=>TRUE));
  $PieChart->draw2DPie(440,115,array("Border"=>TRUE));
 
  /* Write down the legend next to the 2nd chart*/
  $PieChart->drawPieLegend(550,70);
 
  /* Write a legend box under the 1st chart */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $PieChart->drawPieLegend(90,176,array("Style"=>LEGEND_BOX,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Write the bottom legend box */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawGradientArea(1,200,698,228,DIRECTION_VERTICAL,array("StartR"=>247,"StartG"=>247,"StartB"=>247,"EndR"=>217,"EndG"=>217,"EndB"=>217,"Alpha"=>20));
  $myPicture->drawLine(1,199,698,199,array("R"=>100,"G"=>100,"B"=>100,"Alpha"=>20));
  $myPicture->drawLine(1,200,698,200,array("R"=>255,"G"=>255,"B"=>255,"Alpha"=>20));
  $PieChart->drawPieLegend(10,210,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawPieLegend.png");
  ?>
  <?php
  /* CAT:Plot chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(3,4,7,4,2,5),"User");
  $MyData->addPoints(array(12,17,15,18,19,22),"Group");
  $MyData->setSeriePicture("User","resources/serie1.png");
  $MyData->setSeriePicture("Group","resources/serie2.png");
  $MyData->setSerieWeight("Group",1);
  $MyData->setSerieTicks("Group",4);
 
  $MyData->setAxisName(0,"Hours");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawPlotChart() - draw a plot chart",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Write the chart title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(250,55,"Average time spent on projects",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Draw the scale and the 1st chart */
  $myPicture->setGraphArea(60,60,450,190);
  $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("DrawSubTicks"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->drawSplineChart();
  $myPicture->drawPlotChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO));
  $myPicture->setShadow(FALSE);
 
  /* Draw the scale and the 2nd chart */
  $myPicture->setGraphArea(500,60,670,190);
  $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->drawPlotChart();
  $myPicture->setShadow(FALSE);
 
  /* Write the chart legend */
  $myPicture->drawLegend(590,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawPlotChart.icon.png");
  ?>
  <?php
  /* CAT:Plot chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");
  $MyData->addPoints(array(3,12,15,4,2,-5),"Probe 2");
  $MyData->addPoints(array(2,7,5,18,19,22),"Probe 3");
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawPlotChart() - draw a plot chart",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Write the chart title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(250,55,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Draw the scale and the 1st chart */
  $myPicture->setGraphArea(60,60,450,190);
  $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("DrawSubTicks"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->drawPlotChart(array("BorderSize"=>1,"Surrounding"=>40,"BorderAlpha"=>100,"PlotSize"=>2,"PlotBorder"=>TRUE,"DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO));
  $myPicture->setShadow(FALSE);
 
  /* Draw the scale and the 2nd chart */
  $myPicture->setGraphArea(500,60,670,190);
  $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->drawPlotChart(array("PlotSize"=>1,"PlotBorder"=>TRUE,"BorderSize"=>1));
  $myPicture->setShadow(FALSE);
 
  /* Write the chart legend */
  $myPicture->drawLegend(510,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawPlotChart.png");
  ?>
  <?php
  /* CAT:Plot chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  for($i=0;$i<=20;$i++) { $MyData->addPoints(rand(0,20),"Probe 1"); }
  for($i=0;$i<=20;$i++) { $MyData->addPoints(rand(0,20),"Probe 2"); }
  $MyData->setAxisName(0,"Temperatures");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Turn of Antialiasing */
  $myPicture->Antialias = FALSE;
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the chart title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(150,35,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Define the chart area */
  $myPicture->setGraphArea(60,40,650,200);
 
  /* Draw the scale */
  $scaleSettings = array("XMargin"=>10,"YMargin"=>10,"Floating"=>TRUE,"GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);
  $myPicture->drawScale($scaleSettings);
 
  /* Turn on Antialiasing */
  $myPicture->Antialias = TRUE;
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Draw the line chart */
  $myPicture->drawPlotChart();
 
  /* Write the chart legend */
  $myPicture->drawLegend(580,20,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawPlotChart.simple.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawPolygon - Draw polygons",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Draw some polygons */
  $Step = 8;
  $White = array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200);
  for($i=1;$i<=4;$i++)
  {
  $Points = "";
  for($j=0;$j<=360;$j=$j+(360/$Step))
  {
  $Points[] = cos(deg2rad($j))*50+($i*140);
  $Points[] = sin(deg2rad($j))*50+120;
  }
  $myPicture->drawPolygon($Points,$White);
  $Step = $Step * 2;
  }
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawPolygon.png");
  ?>
  <?php
  /* CAT:Progress bars */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0, "G"=>0, "B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf", "FontSize"=>6));
  $myPicture->drawText(10,13, "drawProgress() - Simple progress bars",array("R"=>255, "G"=>255, "B"=>255));
 
  /* Set the font & shadow options */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf", "FontSize"=>10));
  $myPicture->setShadow(TRUE,array("X"=>1, "Y"=>1, "R"=>0, "G"=>0, "B"=>0, "Alpha"=>20));
 
  /* Draw a progress bar */
  $progressOptions = array("R"=>209, "G"=>31, "B"=>27, "Surrounding"=>20, "BoxBorderR"=>0, "BoxBorderG"=>0, "BoxBorderB"=>0, "BoxBackR"=>255, "BoxBackG"=>255, "BoxBackB"=>255, "RFade"=>206, "GFade"=>133, "BFade"=>30, "ShowLabel"=>TRUE);
  $myPicture->drawProgress(40,60,77,$progressOptions);
 
  /* Draw a progress bar */
  $progressOptions = array("Width"=>165, "R"=>209, "G"=>125, "B"=>27, "Surrounding"=>20, "BoxBorderR"=>0, "BoxBorderG"=>0, "BoxBorderB"=>0, "BoxBackR"=>255, "BoxBackG"=>255, "BoxBackB"=>255,"NoAngle"=>TRUE, "ShowLabel"=>TRUE, "LabelPos"=>LABEL_POS_RIGHT);
  $myPicture->drawProgress(40,100,50,$progressOptions);
 
  /* Draw a progress bar */
  $progressOptions = array("Width"=>165, "R"=>209, "G"=>198, "B"=>27, "Surrounding"=>20, "BoxBorderR"=>0, "BoxBorderG"=>0, "BoxBorderB"=>0, "BoxBackR"=>255, "BoxBackG"=>255, "BoxBackB"=>255, "ShowLabel"=>TRUE, "LabelPos"=>LABEL_POS_LEFT);
  $myPicture->drawProgress(75,140,25,$progressOptions);
 
  /* Draw a progress bar */
  $progressOptions = array("Width"=>400, "R"=>134, "G"=>209, "B"=>27, "Surrounding"=>20, "BoxBorderR"=>0, "BoxBorderG"=>0, "BoxBorderB"=>0, "BoxBackR"=>255, "BoxBackG"=>255, "BoxBackB"=>255, "RFade"=>206, "GFade"=>133, "BFade"=>30, "ShowLabel"=>TRUE, "LabelPos"=>LABEL_POS_CENTER);
  $myPicture->drawProgress(40,180,80,$progressOptions);
 
  /* Draw a progress bar */
  $progressOptions = array("Width"=>20, "Height"=>150, "R"=>209, "G"=>31, "B"=>27, "Surrounding"=>20, "BoxBorderR"=>0, "BoxBorderG"=>0, "BoxBorderB"=>0, "BoxBackR"=>255, "BoxBackG"=>255, "BoxBackB"=>255, "RFade"=>206, "GFade"=>133, "BFade"=>30, "ShowLabel"=>TRUE, "Orientation"=>ORIENTATION_VERTICAL, "LabelPos"=>LABEL_POS_BOTTOM);
  $myPicture->drawProgress(500,200,77,$progressOptions);
 
  /* Draw a progress bar */
  $progressOptions = array("Width"=>20, "Height"=>150, "R"=>209, "G"=>125, "B"=>27, "Surrounding"=>20, "BoxBorderR"=>0, "BoxBorderG"=>0, "BoxBorderB"=>0, "BoxBackR"=>255, "BoxBackG"=>255, "BoxBackB"=>255,"NoAngle"=>TRUE, "ShowLabel"=>TRUE, "Orientation"=>ORIENTATION_VERTICAL, "LabelPos"=>LABEL_POS_TOP);
  $myPicture->drawProgress(540,200,50,$progressOptions);
 
  /* Draw a progress bar */
  $progressOptions = array("Width"=>20, "Height"=>150, "R"=>209, "G"=>198, "B"=>27, "Surrounding"=>20, "BoxBorderR"=>0, "BoxBorderG"=>0, "BoxBorderB"=>0, "BoxBackR"=>255, "BoxBackG"=>255, "BoxBackB"=>255, "ShowLabel"=>TRUE, "Orientation"=>ORIENTATION_VERTICAL, "LabelPos"=>LABEL_POS_INSIDE);
  $myPicture->drawProgress(580,200,25,$progressOptions);
 
  /* Draw a progress bar */
  $progressOptions = array("Width"=>20, "Height"=>150, "R"=>134, "G"=>209, "B"=>27, "Surrounding"=>20, "BoxBorderR"=>0, "BoxBorderG"=>0, "BoxBorderB"=>0, "BoxBackR"=>255, "BoxBackG"=>255, "BoxBackB"=>255, "RFade"=>206, "GFade"=>133, "BFade"=>30, "ShowLabel"=>TRUE, "Orientation"=>ORIENTATION_VERTICAL, "LabelPos"=>LABEL_POS_CENTER);
  $myPicture->drawProgress(620,200,80,$progressOptions);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawProgress.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawRectangle() - Transparency & colors",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Draw a rectangle */
  $RectangleSettings = array("R"=>181,"G"=>209,"B"=>27,"Alpha"=>100);
  $myPicture->drawRectangle(20,60,400,170,$RectangleSettings);
 
  /* Draw a rectangle */
  $RectangleSettings = array("R"=>209,"G"=>134,"B"=>27,"Alpha"=>30);
  $myPicture->drawRectangle(30,30,200,200,$RectangleSettings);
 
  /* Draw a rectangle */
  $RectangleSettings = array("R"=>209,"G"=>31,"B"=>27,"Alpha"=>100);
  $myPicture->drawRectangle(480,50,650,80,$RectangleSettings);
 
  /* Draw a rectangle */
  $RectangleSettings = array("R"=>209,"G"=>125,"B"=>27,"Alpha"=>100);
  $myPicture->drawRectangle(480,90,650,120,$RectangleSettings);
 
  /* Draw a rectangle */
  $RectangleSettings = array("R"=>209,"G"=>198,"B"=>27,"Alpha"=>100,"Ticks"=>2);
  $myPicture->drawRectangle(480,130,650,160,$RectangleSettings);
 
  /* Draw a rectangle */
  $RectangleSettings = array("R"=>134,"G"=>209,"B"=>27,"Alpha"=>100,"Ticks"=>2);
  $myPicture->drawRectangle(480,170,650,200,$RectangleSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawRectangle.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawRoundedFilledRectangle() - Transparency & colors",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Draw a rounded filled rectangle */
  $RectangleSettings = array("R"=>181,"G"=>209,"B"=>27,"Alpha"=>100);
  $myPicture->drawRoundedFilledRectangle(20,60,400,170,10,$RectangleSettings);
 
  /* Enable shadow computing */
  $myPicture->setShadow(FALSE);
 
  /* Draw a rounded filled rectangle */
  $RectangleSettings = array("R"=>209,"G"=>134,"B"=>27,"Alpha"=>30);
  $myPicture->drawRoundedFilledRectangle(30,30,200,200,10,$RectangleSettings);
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Draw a rounded filled rectangle */
  $RectangleSettings = array("R"=>209,"G"=>31,"B"=>27,"Alpha"=>100,"Surrounding"=>30);
  $myPicture->drawRoundedFilledRectangle(480,50,650,80,5,$RectangleSettings);
 
  /* Draw a rounded filled rectangle */
  $RectangleSettings = array("R"=>209,"G"=>125,"B"=>27,"Alpha"=>100,"Surrounding"=>30);
  $myPicture->drawRoundedFilledRectangle(480,90,650,120,5,$RectangleSettings);
 
  /* Draw a rounded filled rectangle */
  $RectangleSettings = array("R"=>209,"G"=>198,"B"=>27,"Alpha"=>100,"Surrounding"=>30);
  $myPicture->drawRoundedFilledRectangle(480,130,650,160,5,$RectangleSettings);
 
  /* Draw a rounded filled rectangle */
  $RectangleSettings = array("R"=>134,"G"=>209,"B"=>27,"Alpha"=>100,"Surrounding"=>30);
  $myPicture->drawRoundedFilledRectangle(480,170,650,200,5,$RectangleSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawRoundedFilledRectangle.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawRoundedRectangle() - Transparency & colors",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Draw a rounded rectangle */
  $RectangleSettings = array("R"=>181,"G"=>209,"B"=>27,"Alpha"=>100);
  $myPicture->drawRoundedRectangle(20,60,400,170,10,$RectangleSettings);
 
  /* Draw a rounded rectangle */
  $RectangleSettings = array("R"=>209,"G"=>134,"B"=>27,"Alpha"=>30);
  $myPicture->drawRoundedRectangle(30,30,200,200,10,$RectangleSettings);
 
  /* Draw a rounded rectangle */
  $RectangleSettings = array("R"=>209,"G"=>31,"B"=>27,"Alpha"=>100);
  $myPicture->drawRoundedRectangle(480,50,650,80,5,$RectangleSettings);
 
  /* Draw a rounded rectangle */
  $RectangleSettings = array("R"=>209,"G"=>125,"B"=>27,"Alpha"=>100);
  $myPicture->drawRoundedRectangle(480,90,650,120,5,$RectangleSettings);
 
  /* Draw a rounded rectangle */
  $RectangleSettings = array("R"=>209,"G"=>198,"B"=>27,"Alpha"=>100);
  $myPicture->drawRoundedRectangle(480,130,650,160,5,$RectangleSettings);
 
  /* Draw a rounded rectangle */
  $RectangleSettings = array("R"=>134,"G"=>209,"B"=>27,"Alpha"=>100);
  $myPicture->drawRoundedRectangle(480,170,650,200,5,$RectangleSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawRoundedRectangle.png");
  ?>
  <?php
  /* CAT:Scaling */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(24,-25,26,25,25),"Temperature");
  $MyData->addPoints(array(1,2,VOID,9,10),"Humidity 1");
  $MyData->addPoints(array(1,VOID,7,-9,0),"Humidity 2");
  $MyData->addPoints(array(-1,-1,-1,-1,-1),"Humidity 3");
  $MyData->addPoints(array(0,0,0,0,0),"Vide");
  $MyData->setSerieOnAxis("Temperature",0);
  $MyData->setSerieOnAxis("Humidity 1",1);
  $MyData->setSerieOnAxis("Humidity 2",1);
  $MyData->setSerieOnAxis("Humidity 3",1);
  $MyData->setSerieOnAxis("Vide",2);
  $MyData->setAxisPosition(2,AXIS_POSITION_RIGHT);
  $MyData->setAxisName(0,"Temperature");
  $MyData->setAxisName(1,"Humidity");
  $MyData->setAxisName(2,"Empty value");
 
  /* Associate a color to each axis */
  $MyData->setAxisColor(0,array("R"=>102,"G"=>129,"B"=>63));
  $MyData->setAxisColor(1,array("R"=>129,"G"=>72,"B"=>63));
  $MyData->setAxisColor(2,array("R"=>63,"G"=>89,"B"=>129));
 
  /* Create the abscissa serie */
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","My labels");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawScale() - draw the X-Y scales",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
 
  /* Write the chart title */
  $myPicture->setGraphArea(90,60,660,190);
  $myPicture->drawText(350,55,"My chart title",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
  $myPicture->drawFilledRectangle(90,60,660,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
 
  /* Draw the scale */
  $myPicture->drawScale(array("DrawYLines"=>array(0),"Pos"=>SCALE_POS_LEFTRIGHT));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawScale.color.png");
  ?>
  <?php
  /* CAT:Scaling */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(1700,2500,7800,4500,3150),"Distance");
  $MyData->setAxisName(0,"Maximum distance");
  $MyData->setAxisUnit(0,"m");
  $MyData->setAxisDisplay(0,AXIS_FORMAT_METRIC);
 
  /* Create the abscissa serie */
  $MyData->addPoints(array(1230768000,1233446400,1235865600,1238544000,1241136000,1243814400),"Timestamp");
  $MyData->setSerieDescription("Timestamp","Sampled Dates");
  $MyData->setAbscissa("Timestamp");
  $MyData->setXAxisDisplay(AXIS_FORMAT_DATE);
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawScale() - draw the X-Y scales",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
 
  /* Write the chart title */
  $myPicture->setGraphArea(60,60,660,190);
  $myPicture->drawText(350,55,"My chart title",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
  $myPicture->drawFilledRectangle(60,60,660,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
 
  /* Draw the scale */
  $myPicture->drawScale();
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawScale.dates.png");
  ?>
  <?php
  /* CAT:Scaling */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(8,10,24,25,25,24,23,22,20,12,10),"Temperature");
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawScale() - draw the X-Y scales",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
 
  /* Write the chart title */
  $myPicture->setGraphArea(60,50,660,200);
  $myPicture->drawText(350,55,"My chart title",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Draw the scale */
  $scaleSettings = array("XMargin"=>15,"YMargin"=>15,"Floating"=>TRUE,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);
  $myPicture->drawScale($scaleSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawScale.floating.png");
  ?>
  <?php
  /* CAT:Scaling */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(24,-25,26,25,25),"Temperature");
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawScale() - draw the X-Y scales",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
 
  /* Write the chart title */
  $myPicture->setGraphArea(60,60,660,190);
  $myPicture->drawText(350,55,"My chart title",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
  $myPicture->drawFilledRectangle(60,60,660,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Draw the scale */
  $AxisBoundaries = array(0=>array("Min"=>0,"Max"=>100));
  $ScaleSettings = array("Mode"=>SCALE_MODE_MANUAL,"ManualScale"=>$AxisBoundaries,"DrawSubTicks"=>TRUE,"DrawArrows"=>TRUE,"ArrowSize"=>6);
  $myPicture->drawScale($ScaleSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawScale.png");
  ?>
  <?php
  /* CAT:Scaling */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(24,-25,26,25,25),"Temperature");
  $MyData->addPoints(array(1,2,VOID,9,10),"Humidity 1");
  $MyData->addPoints(array(1,VOID,7,-9,0),"Humidity 2");
  $MyData->addPoints(array(-1,-1,-1,-1,-1),"Humidity 3");
  $MyData->addPoints(array(0,0,0,0,0),"Vide");
  $MyData->setSerieOnAxis("Temperature",0);
  $MyData->setSerieOnAxis("Humidity 1",1);
  $MyData->setSerieOnAxis("Humidity 2",1);
  $MyData->setSerieOnAxis("Humidity 3",1);
  $MyData->setSerieOnAxis("Vide",2);
  $MyData->setAxisPosition(2,AXIS_POSITION_RIGHT);
  $MyData->setAxisName(0,"Temperature");
  $MyData->setAxisName(1,"Humidity");
  $MyData->setAxisName(2,"Empty value");
 
  /* Create the abscissa serie */
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","My labels");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawScale() - draw the X-Y scales",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
 
  /* Write the chart title */
  $myPicture->setGraphArea(90,60,660,190);
  $myPicture->drawText(350,55,"My chart title",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
  $myPicture->drawFilledRectangle(90,60,660,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
 
  /* Draw the scale */
  $myPicture->drawScale(array("DrawYLines"=>array(0),"Pos"=>SCALE_POS_LEFTRIGHT));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawScale.multiple.png");
  ?>
  <?php
  /* CAT:Scaling */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(24,-25,26,25,25),"Temperature");
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawScale() - draw the X-Y scales",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
 
  /* Write the chart title */
  $myPicture->setGraphArea(60,60,660,190);
  $myPicture->drawText(350,55,"My chart title",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
  $myPicture->drawFilledRectangle(60,60,660,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Draw the scale */
  $myPicture->drawScale(array("DrawSubTicks"=>TRUE,"DrawArrows"=>TRUE,"ArrowSize"=>6));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawScale.png");
  ?>
  <?php
  /* CAT:Scaling */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(24,13,14),"Temperature");
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array("Sample #1","Sample #2","Sample #3"),"Labels");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawScale() - draw the X-Y scales",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
 
  /* Write the chart title */
  $myPicture->setGraphArea(60,90,660,210);
  $myPicture->drawText(360,55,"My chart title",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
  $myPicture->drawFilledRectangle(60,90,660,210,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
 
  /* Draw the scale */
  $myPicture->drawScale(array("AutoAxisLabels"=>FALSE,"Pos"=>SCALE_POS_TOPBOTTOM));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawScale.reverse.png");
  ?>
  <?php
  /* CAT:Scatter chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
  include("../class/pScatter.class.php");
 
  /* Create the pData object */
  $myData = new pData();
 
  /* Create the X axis and the binded series */
  for ($i=0;$i<=10;$i=$i+1) { $myData->addPoints(rand(1,20),"Probe 1"); }
  for ($i=0;$i<=10;$i=$i+1) { $myData->addPoints(rand(1,20),"Probe 2"); }
  $myData->setAxisName(0,"X-Index");
  $myData->setAxisXY(0,AXIS_X);
  $myData->setAxisPosition(0,AXIS_POSITION_TOP);
 
  /* Create the Y axis and the binded series */
  for ($i=0;$i<=10;$i=$i+1) { $myData->addPoints(rand(1,20),"Probe 3"); }
  $myData->setSerieOnAxis("Probe 3",1);
  $myData->setAxisName(1,"Y-Index");
  $myData->setAxisXY(1,AXIS_Y);
  $myData->setAxisPosition(1,AXIS_POSITION_LEFT);
 
  /* Create the 1st scatter chart binding */
  $myData->setScatterSerie("Probe 1","Probe 3",0);
  $myData->setScatterSerieDescription(0,"This year");
  $myData->setScatterSerieColor(0,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Create the 2nd scatter chart binding */
  $myData->setScatterSerie("Probe 2","Probe 3",1);
  $myData->setScatterSerieDescription(1,"Last Year");
 
  /* Create the pChart object */
  $myPicture = new pImage(400,400,$myData);
 
  /* Turn of Anti-aliasing */
  $myPicture->Antialias = FALSE;
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,399,399,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Set the graph area */
  $myPicture->setGraphArea(40,40,370,370);
 
  /* Create the Scatter chart object */
  $myScatter = new pScatter($myPicture,$myData);
 
  /* Draw the scale */
  $scaleSettings = array("XMargin"=>15,"YMargin"=>15,"Floating"=>TRUE,"GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);
  $myScatter->drawScatterScale($scaleSettings);
 
  /* Draw the legend */
  $myScatter->drawScatterLegend(280,380,array("Mode"=>LEGEND_HORIZONTAL,"Style"=>LEGEND_NOBORDER));
 
  /* Draw a scatter plot chart */
  $myPicture->Antialias = TRUE;
  $myScatter->drawScatterPlotChart();
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.example.drawScatterBestFit.png");
  ?>
  <?php
  /* CAT:Mathematical */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
  include("../class/pScatter.class.php");
 
  /* Create the pData object */
  $myData = new pData();
 
  /* Create the X axis and the binded series */
  for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints(rand(1,20)*10+rand(0,$i),"Probe 1"); }
  for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints(rand(1,2)*10+rand(0,$i),"Probe 2"); }
  $myData->setAxisName(0,"X-Index");
  $myData->setAxisXY(0,AXIS_X);
  $myData->setAxisPosition(0,AXIS_POSITION_TOP);
 
  /* Create the Y axis and the binded series */
  for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints($i,"Probe 3"); }
  $myData->setSerieOnAxis("Probe 3",1);
  $myData->setAxisName(1,"Y-Index");
  $myData->setAxisXY(1,AXIS_Y);
  $myData->setAxisPosition(1,AXIS_POSITION_LEFT);
 
  /* Create the 1st scatter chart binding */
  $myData->setScatterSerie("Probe 1","Probe 3",0);
  $myData->setScatterSerieDescription(0,"This year");
  $myData->setScatterSerieColor(0,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Create the 2nd scatter chart binding */
  $myData->setScatterSerie("Probe 2","Probe 3",1);
  $myData->setScatterSerieDescription(1,"Last Year");
 
  /* Create the pChart object */
  $myPicture = new pImage(400,400,$myData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,400,400,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,400,400,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,400,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawScatterBestFit() - Linear regression",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,399,399,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Set the graph area */
  $myPicture->setGraphArea(50,60,350,360);
 
  /* Create the Scatter chart object */
  $myScatter = new pScatter($myPicture,$myData);
 
  /* Draw the scale */
  $myScatter->drawScatterScale();
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Draw a scatter plot chart */
  $myScatter->drawScatterPlotChart();
 
  /* Draw the legend */
  $myScatter->drawScatterLegend(280,380,array("Mode"=>LEGEND_HORIZONTAL,"Style"=>LEGEND_NOBORDER));
 
  /* Draw the line of best fit */
  $myScatter->drawScatterBestFit();
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawScatterBestFit.png");
  ?>
  <?php
  /* CAT:Scatter chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
  include("../class/pScatter.class.php");
 
  /* Create the pData object */
  $myData = new pData();
 
  /* Create the X axis and the binded series */
  for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints(cos(deg2rad($i))*20,"Probe 1"); }
  for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints(sin(deg2rad($i))*20,"Probe 2"); }
  $myData->setAxisName(0,"Index");
  $myData->setAxisXY(0,AXIS_X);
  $myData->setAxisPosition(0,AXIS_POSITION_BOTTOM);
 
  /* Create the Y axis and the binded series */
  for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints($i,"Probe 3"); }
  $myData->setSerieOnAxis("Probe 3",1);
  $myData->setAxisName(1,"Degree");
  $myData->setAxisXY(1,AXIS_Y);
 
  $myData->setAxisPosition(1,AXIS_POSITION_RIGHT);
 
  /* Create the 1st scatter chart binding */
  $myData->setScatterSerie("Probe 1","Probe 3",0);
  $myData->setScatterSerieDescription(0,"This year");
  $myData->setScatterSerieTicks(0,4);
  $myData->setScatterSerieColor(0,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Create the 2nd scatter chart binding */
  $myData->setScatterSerie("Probe 2","Probe 3",1);
  $myData->setScatterSerieDescription(1,"Last Year");
 
  /* Create the pChart object */
  $myPicture = new pImage(400,400,$myData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,400,400,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,400,400,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,400,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawScatterLineChart() - Draw a scatter line chart",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,399,399,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Set the graph area */
  $myPicture->setGraphArea(50,50,350,350);
 
  /* Create the Scatter chart object */
  $myScatter = new pScatter($myPicture,$myData);
 
  /* Draw the scale */
  $myScatter->drawScatterScale();
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Draw a scatter plot chart */
  $myScatter->drawScatterLineChart();
 
  /* Draw the legend */
  $myScatter->drawScatterLegend(280,380,array("Mode"=>LEGEND_HORIZONTAL,"Style"=>LEGEND_NOBORDER));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawScatterLineChart.png");
  ?>
  <?php
  /* CAT:Scatter chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
  include("../class/pScatter.class.php");
 
  /* Create the pData object */
  $myData = new pData();
 
  /* Create the X axis and the binded series */
  for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints(cos(deg2rad($i))*20,"Probe 1"); }
  $myData->setAxisName(0,"X-Index");
  $myData->setAxisXY(0,AXIS_X);
  $myData->setAxisPosition(0,AXIS_POSITION_BOTTOM);
 
  /* Create the Y axis and the binded series */
  for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints(sin(deg2rad(30-$i))*20,"Probe 2"); }
  $myData->setSerieOnAxis("Probe 2",1);
  $myData->setAxisName(1,"Y-Index");
  $myData->setAxisXY(1,AXIS_Y);
  $myData->setAxisPosition(1,AXIS_POSITION_RIGHT);
 
  /* Create the 1st scatter chart binding */
  $myData->setScatterSerie("Probe 1","Probe 2",0);
  $myData->setScatterSerieDescription(0,"Trigonometric function");
  $myData->setScatterSerieTicks(0,4);
  $myData->setScatterSerieColor(0,array("R"=>180,"G"=>0,"B"=>0));
  $myData->setScatterSeriePicture(0,"resources/chart_line.png");
 
  /* Create the pChart object */
  $myPicture = new pImage(400,400,$myData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,400,400,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,400,400,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,400,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawScatterLineChart() - Draw a scatter line chart",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,399,399,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Set the graph area */
  $myPicture->setGraphArea(50,50,350,350);
 
  /* Create the Scatter chart object */
  $myScatter = new pScatter($myPicture,$myData);
 
  /* Draw the scale */
  $myScatter->drawScatterScale();
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Draw a scatter plot chart */
  $myScatter->drawScatterLineChart();
 
  /* Draw the legend */
  $myScatter->drawScatterLegend(270,375,array("Mode"=>LEGEND_HORIZONTAL,"Style"=>LEGEND_NOBORDER));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawScatterLineChart.trigo.png");
  ?>
  <?php
  /* CAT:Scatter chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
  include("../class/pScatter.class.php");
 
  /* Create the pData object */
  $myData = new pData();
 
  /* Create the X axis and the binded series */
  for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints(cos(deg2rad($i))*20,"Probe 1"); }
  for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints(sin(deg2rad($i))*20,"Probe 2"); }
  $myData->setAxisName(0,"Index");
  $myData->setAxisXY(0,AXIS_X);
  $myData->setAxisPosition(0,AXIS_POSITION_BOTTOM);
 
  /* Create the Y axis and the binded series */
  for ($i=0;$i<=360;$i=$i+10) { $myData->addPoints($i,"Probe 3"); }
  $myData->setSerieOnAxis("Probe 3",1);
  $myData->setAxisName(1,"Degree");
  $myData->setAxisXY(1,AXIS_Y);
 
  $myData->setAxisPosition(1,AXIS_POSITION_RIGHT);
 
  /* Create the 1st scatter chart binding */
  $myData->setScatterSerie("Probe 1","Probe 3",0);
  $myData->setScatterSerieDescription(0,"This year");
  $myData->setScatterSerieColor(0,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Create the 2nd scatter chart binding */
  $myData->setScatterSerie("Probe 2","Probe 3",1);
  $myData->setScatterSerieDescription(1,"Last Year");
  $myData->setScatterSeriePicture(1,"resources/accept.png");
 
  /* Create the pChart object */
  $myPicture = new pImage(400,400,$myData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,400,400,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,400,400,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,400,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawScatterPlotChart() - Draw a scatter plot chart",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,399,399,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Set the graph area */
  $myPicture->setGraphArea(50,50,350,350);
 
  /* Create the Scatter chart object */
  $myScatter = new pScatter($myPicture,$myData);
 
  /* Draw the scale */
  $myScatter->drawScatterScale();
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Draw a scatter plot chart */
  $myScatter->drawScatterPlotChart();
 
  /* Draw the legend */
  $myScatter->drawScatterLegend(260,375,array("Mode"=>LEGEND_HORIZONTAL,"Style"=>LEGEND_NOBORDER));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawScatterPlotChart.png");
  ?>
  <?php
  /* CAT:Scatter chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
  include("../class/pScatter.class.php");
 
  /* Create the pData object */
  $myData = new pData();
 
  /* Create the X axis and the binded series */
  $myData->addPoints(array(3,12,15,8,5,-5),"X Values");
  $myData->setAxisName(0,"X Values");
  $myData->setAxisXY(0,AXIS_X);
  $myData->setAxisDisplay(0,AXIS_FORMAT_TIME,"i:s");
  $myData->setAxisPosition(0,AXIS_POSITION_BOTTOM);
 
  /* Create the Y axis and the binded series */
  $myData->addPoints(array(2,7,5,18,19,22),"Y Values");
  $myData->setSerieOnAxis("Y Values",1);
  $myData->setAxisName(1,"Y Values");
  $myData->setAxisXY(1,AXIS_Y);
 
  /* Create the pChart object */
  $myPicture = new pImage(400,400,$myData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,400,400,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,400,400,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,400,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawScatterScale() - Draw the scatter chart scale",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,399,399,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Set the graph area */
  $myPicture->setGraphArea(50,50,350,350);
 
  /* Create the Scatter chart object */
  $myScatter = new pScatter($myPicture,$myData);
 
  /* Draw the scale */
  $AxisBoundaries = array(0=>array("Min"=>0,"Max"=>3600,"Rows"=>12,"RowHeight"=>300),1=>array("Min"=>0,"Max"=>100));
  $ScaleSettings = array("Mode"=>SCALE_MODE_MANUAL,"ManualScale"=>$AxisBoundaries,"DrawSubTicks"=>TRUE);
  $myScatter->drawScatterScale($ScaleSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawScatterScale.manual.png");
  ?>
  <?php
  /* CAT:Scatter chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
  include("../class/pScatter.class.php");
 
  /* Create the pData object */
  $myData = new pData();
 
  /* Create the X axis and the binded series */
  $myData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");
  $myData->addPoints(array(3,12,15,8,5,-5),"Probe 2");
  $myData->setAxisName(0,"Temperatures");
  $myData->setAxisXY(0,AXIS_X);
 
  $myData->setAxisPosition(0,AXIS_POSITION_BOTTOM);
 
  /* Create the Y axis and the binded series */
  $myData->addPoints(array(2,7,5,18,19,22),"Probe 3");
  $myData->setSerieOnAxis("Probe 3",1);
  $myData->setAxisName(1,"Humidity");
  $myData->setAxisXY(1,AXIS_Y);
  $myData->setAxisUnit(1,"%");
  $myData->setAxisPosition(1,AXIS_POSITION_RIGHT);
 
  /* Create the pChart object */
  $myPicture = new pImage(400,400,$myData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,400,400,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,400,400,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,400,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawScatterScale() - Draw the scatter chart scale",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,399,399,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Set the graph area */
  $myPicture->setGraphArea(50,50,350,350);
 
  /* Create the Scatter chart object */
  $myScatter = new pScatter($myPicture,$myData);
 
  /* Draw the scale */
  $myScatter->drawScatterScale();
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawScatterScale.png");
  ?>
  <?php
  /* CAT:Scatter chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
  include("../class/pScatter.class.php");
 
  /* Create the pData object */
  $myData = new pData();
 
  /* Create the X axis and the binded series */
  for ($i=0;$i<=360;$i=$i+90) { $myData->addPoints(rand(1,30),"Probe 1"); }
  for ($i=0;$i<=360;$i=$i+90) { $myData->addPoints(rand(1,30),"Probe 2"); }
  $myData->setAxisName(0,"Index");
  $myData->setAxisXY(0,AXIS_X);
  $myData->setAxisPosition(0,AXIS_POSITION_BOTTOM);
 
  /* Create the Y axis and the binded series */
  for ($i=0;$i<=360;$i=$i+90) { $myData->addPoints($i,"Probe 3"); }
  $myData->setSerieOnAxis("Probe 3",1);
  $myData->setAxisName(1,"Degree");
  $myData->setAxisXY(1,AXIS_Y);
 
  $myData->setAxisPosition(1,AXIS_POSITION_RIGHT);
 
  /* Create the 1st scatter chart binding */
  $myData->setScatterSerie("Probe 1","Probe 3",0);
  $myData->setScatterSerieDescription(0,"This year");
  $myData->setScatterSerieTicks(0,4);
  $myData->setScatterSerieColor(0,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Create the 2nd scatter chart binding */
  $myData->setScatterSerie("Probe 2","Probe 3",1);
  $myData->setScatterSerieDescription(1,"Last Year");
 
  /* Create the pChart object */
  $myPicture = new pImage(400,400,$myData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,400,400,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,400,400,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,400,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawScatterSplineChart() - Draw a scatter spline chart",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,399,399,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Set the graph area */
  $myPicture->setGraphArea(50,50,350,350);
 
  /* Create the Scatter chart object */
  $myScatter = new pScatter($myPicture,$myData);
 
  /* Draw the scale */
  $myScatter->drawScatterScale();
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Draw a scatter plot chart */
  $myScatter->drawScatterSplineChart();
  $myScatter->drawScatterPlotChart();
 
  /* Draw the legend */
  $myScatter->drawScatterLegend(280,380,array("Mode"=>LEGEND_HORIZONTAL,"Style"=>LEGEND_NOBORDER));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawScatterSplineChart.png");
  ?>
  <?php
  /* CAT:Misc */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(2,7,5,18,19,22,23,25,22,12,10,10),"DEFCA");
  $MyData->setAxisName(0,"$ Incomes");
  $MyData->setAxisDisplay(0,AXIS_FORMAT_CURRENCY);
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aou","Sep","Oct","Nov","Dec"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
  $MyData->setPalette("DEFCA",array("R"=>55,"G"=>91,"B"=>127));
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>220,"StartG"=>220,"StartB"=>220,"EndR"=>255,"EndG"=>255,"EndB"=>255,"Alpha"=>100));
  $myPicture->drawRectangle(0,0,699,229,array("R"=>200,"G"=>200,"B"=>200));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(60,35,"2k9 Average Incomes",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMLEFT));
 
  /* Do some cosmetic and draw the chart */
  $myPicture->setGraphArea(60,40,670,190);
  $myPicture->drawFilledRectangle(60,40,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("GridR"=>180,"GridG"=>180,"GridB"=>180));
  $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->drawSplineChart();
  $myPicture->setShadow(FALSE);
 
  /* Write the chart legend */
  $myPicture->drawLegend(643,210,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawSimple.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawSpline() - for smooth line drawing",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Draw a spline */
  $SplineSettings = array("R"=>255,"G"=>255,"B"=>255,"ShowControl"=>TRUE);
  $Coordinates = array(array(40,80),array(280,60),array(340,166),array(590,120));
  $myPicture->drawSpline($Coordinates,$SplineSettings);
 
  /* Draw a spline */
  $SplineSettings = array("R"=>255,"G"=>255,"B"=>255,"ShowControl"=>TRUE,"Ticks"=>4);
  $Coordinates = array(array(250,50),array(250,180),array(350,180),array(350,50));
  $myPicture->drawSpline($Coordinates,$SplineSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawSpline.png");
  ?>
  <?php
  /* CAT:Spline chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");
  $MyData->addPoints(array(3,12,15,8,5,-5),"Probe 2");
  $MyData->addPoints(array(2,7,5,18,19,22),"Probe 3");
  $MyData->setSerieTicks("Probe 2",4);
  $MyData->setAxisName(0,"Temperatures");
 
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawSplineChart() - draw a spline chart",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Write the chart title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(250,55,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Draw the scale and the 1st chart */
  $myPicture->setGraphArea(60,60,450,190);
  $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("DrawSubTicks"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->drawSplineChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO));
  $myPicture->setShadow(FALSE);
 
  /* Draw the scale and the 2nd chart */
  $myPicture->setGraphArea(500,60,670,190);
  $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->drawSplineChart();
  $myPicture->setShadow(FALSE);
 
  /* Write the chart legend */
  $myPicture->drawLegend(510,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawSplineChart.png");
  ?>
  <?php
  /* CAT:Spline chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");
  $MyData->addPoints(array(3,12,15,8,5,-5),"Probe 2");
  $MyData->addPoints(array(2,7,5,18,19,22),"Probe 3");
  $MyData->setSerieTicks("Probe 2",4);
  $MyData->setSerieWeight("Probe 3",2);
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Turn of Antialiasing */
  $myPicture->Antialias = FALSE;
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the chart title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(150,35,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Define the chart area */
  $myPicture->setGraphArea(60,40,650,200);
 
  /* Draw the scale */
  $scaleSettings = array("XMargin"=>10,"YMargin"=>10,"Floating"=>TRUE,"GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);
  $myPicture->drawScale($scaleSettings);
 
  /* Turn on Antialiasing */
  $myPicture->Antialias = TRUE;
 
  /* Draw the line chart */
  $myPicture->drawSplineChart();
 
  /* Write the chart legend */
  $myPicture->drawLegend(540,20,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawSplineChart.simple.png");
  ?>
  <?php
  /* CAT:Stacked chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(4,0,0,12,8,3,0,12,8),"Frontend #1");
  $MyData->addPoints(array(3,12,15,8,5,5,12,15,8),"Frontend #2");
  $MyData->addPoints(array(2,7,5,18,19,22,7,5,18),"Frontend #3");
  $MyData->setAxisName(0,"Average Usage");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun","Jui","Aug","Sep"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Normalize the data series to 100% */
  $MyData->normalize(100,"%");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100));
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>20));
 
  /* Set the default font properties */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Draw the scale and the chart */
  $myPicture->setGraphArea(60,20,680,190);
  $myPicture->drawScale(array("XMargin"=>2,"DrawSubTicks"=>TRUE,"Mode"=>SCALE_MODE_ADDALL));
  $myPicture->drawStackedAreaChart(array("Surrounding"=>60));
 
  /* Turn on shadow processing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Write the chart legend */
  $myPicture->drawLegend(480,210,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawStackedAreaChart.normalized.png");
  ?>
  <?php
  /* CAT:Stacked chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(1,-2,-1,2,1,0),"Probe 1");
  $MyData->addPoints(array(1,-2,-3,2,1,8),"Probe 2");
  $MyData->addPoints(array(2,4,2,0,4,2),"Probe 3");
  $MyData->setSerieTicks("Probe 2",4);
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawStackedAreaChart() - draw a stacked area chart",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Write the chart title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(250,55,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Draw the scale and the 1st chart */
  $myPicture->setGraphArea(60,60,450,190);
  $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("DrawSubTicks"=>TRUE,"Mode"=>SCALE_MODE_ADDALL));
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->setShadow(FALSE);
  $myPicture->drawStackedAreaChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO,"Surrounding"=>20));
 
  /* Draw the scale and the 2nd chart */
  $myPicture->setGraphArea(500,60,670,190);
  $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"Mode"=>SCALE_MODE_ADDALL,"DrawSubTicks"=>TRUE));
  $myPicture->setShadow(FALSE);
  $myPicture->drawStackedAreaChart(array("Surrounding"=>10));
 
  /* Write the chart legend */
  $myPicture->drawLegend(510,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawStackedAreaChart.png");
  ?>
  <?php
  /* CAT:Stacked chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Frontend #1");
  $MyData->addPoints(array(3,12,15,8,5,-5),"Frontend #2");
  $MyData->addPoints(array(2,7,5,18,19,22),"Frontend #3");
  $MyData->setAxisName(0,"Average Usage");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Normalize all the data series to 100% */
  $MyData->normalize(100,"%");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100));
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>20));
 
  /* Set the default font properties */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Draw the scale and the chart */
  $myPicture->setGraphArea(60,20,680,190);
  $myPicture->drawScale(array("DrawSubTicks"=>TRUE,"Mode"=>SCALE_MODE_ADDALL));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->drawStackedBarChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO,"Gradient"=>TRUE,"GradientMode"=>GRADIENT_EFFECT_CAN,"Surrounding"=>30));
  $myPicture->setShadow(FALSE);
 
  /* Write the chart legend */
  $myPicture->drawLegend(480,210,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawStackedBarChart.can.png");
  ?>
  <?php
  /* CAT:Stacked chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");
  $MyData->addPoints(array(3,12,15,8,5,-5),"Probe 2");
  $MyData->addPoints(array(2,7,5,18,19,22),"Probe 3");
  $MyData->setSerieTicks("Probe 2",4);
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawStackedBarChart() - draw a stacked bar chart",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Write the chart title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(250,55,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Draw the scale and the 1st chart */
  $myPicture->setGraphArea(60,60,450,190);
  $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("DrawSubTicks"=>TRUE,"Mode"=>SCALE_MODE_ADDALL));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->drawStackedBarChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO,"Rounded"=>TRUE,"Surrounding"=>60));
  $myPicture->setShadow(FALSE);
 
  /* Draw the scale and the 2nd chart */
  $myPicture->setGraphArea(500,60,670,190);
  $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"Mode"=>SCALE_MODE_ADDALL,"DrawSubTicks"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->drawStackedBarChart();
  $myPicture->setShadow(FALSE);
 
  /* Write the chart legend */
  $myPicture->drawLegend(510,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawStackedBarChart.png");
  ?>
  <?php
  /* CAT:Stacked chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(-7,-8,-15,-20,-18,-12,8,-19,9,16,-20,8,10,-10,-14,-20,8,-9,-19),"Probe 3");
  $MyData->addPoints(array(19,0,-8,8,-8,12,-19,-10,5,12,-20,-8,10,-11,-12,8,-17,-14,0),"Probe 4");
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array(4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22),"Time");
  $MyData->setSerieDescription("Time","Hour of the day");
  $MyData->setAbscissa("Time");
  $MyData->setXAxisUnit("h");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
 
  /* Set the default font properties */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Draw the scale */
  $myPicture->setGraphArea(60,30,650,190);
  $myPicture->drawScale(array("CycleBackground"=>TRUE,"DrawSubTicks"=>TRUE,"GridR"=>0,"GridG"=>0,"GridB"=>0,"GridAlpha"=>10,"Mode"=>SCALE_MODE_ADDALL));
 
  /* Turn on shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Draw some thresholds */
  $myPicture->setShadow(FALSE);
  $myPicture->drawThreshold(-40,array("WriteCaption"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Ticks"=>4));
  $myPicture->drawThreshold(28,array("WriteCaption"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Ticks"=>4));
 
  /* Draw the chart */
  $myPicture->drawStackedBarChart(array("Rounded"=>TRUE,"DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO,"DisplaySize"=>6,"BorderR"=>255,"BorderG"=>255,"BorderB"=>255));
 
  /* Write the chart legend */
  $myPicture->drawLegend(570,212,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawStackedBarChart.rounded.png");
  ?>
  <?php
  /* CAT:Stacked chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Frontend #1");
  $MyData->addPoints(array(3,12,15,8,5,-5),"Frontend #2");
  $MyData->addPoints(array(2,7,5,18,19,22),"Frontend #3");
  $MyData->setAxisName(0,"Average Usage");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Normalize all the data series to 100% */
  $MyData->normalize(100,"%");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100));
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>20));
 
  /* Set the default font properties */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Draw the scale and the chart */
  $myPicture->setGraphArea(60,20,680,190);
  $myPicture->drawScale(array("DrawSubTicks"=>TRUE,"Mode"=>SCALE_MODE_ADDALL));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->drawStackedBarChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO,"Gradient"=>TRUE,"Surrounding"=>30));
  $myPicture->setShadow(FALSE);
 
  /* Write the chart legend */
  $myPicture->drawLegend(480,210,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawStackedBarChart.shaded.png");
  ?>
  <?php
  /* CAT:Step chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");
  $MyData->addPoints(array(3,12,15,8,5,-5),"Probe 2");
  $MyData->addPoints(array(2,7,5,18,19,22),"Probe 3");
  $MyData->setSerieTicks("Probe 2",4);
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawStepChart() - draw a step chart",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Write the chart title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(250,55,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Draw the scale and the 1st chart */
  $myPicture->setGraphArea(60,60,450,190);
  $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("DrawSubTicks"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->drawStepChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO));
  $myPicture->setShadow(FALSE);
 
  /* Draw the scale and the 2nd chart */
  $myPicture->setGraphArea(500,60,670,190);
  $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>-1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->drawStepChart();
  $myPicture->setShadow(FALSE);
 
  /* Write the chart legend */
  $myPicture->drawLegend(510,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawStepChart.png");
  ?>
  <?php
  /* CAT:Step chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(VOID,VOID,VOID,2,6,3),"Probe 1");
  $MyData->addPoints(array(13,12,15,18,15,10),"Probe 2");
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Turn of AAliasing */
  $myPicture->Antialias = FALSE;
 
  /* Draw the border */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Define the chart area */
  $myPicture->setGraphArea(60,30,650,190);
 
  /* Draw the scale */
  $scaleSettings = array("XMargin"=>10,"YMargin"=>10,"Floating"=>TRUE,"GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);
  $myPicture->drawScale($scaleSettings);
 
  /* Draw the step chart */
  $myPicture->drawStepChart();
 
  /* Write the chart legend */
  $myPicture->drawLegend(590,17,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawStepChart.simple.png");
  ?>
  <?php
  /* CAT:Stock chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
  include("../class/pStock.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(34,55,15,62,38,42),"Open");
  $MyData->addPoints(array(42,25,40,38,49,36),"Close");
  $MyData->addPoints(array(27,14,12,25,32,32),"Min");
  $MyData->addPoints(array(45,59,47,65,64,48),"Max");
  $MyData->setAxisDisplay(0,AXIS_FORMAT_CURRENCY,"$");
 
  $MyData->addPoints(array("8h","10h","12h","14h","16h","18h"),"Time");
  $MyData->setAbscissa("Time");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
 
  /* Draw the border */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(60,45,"Stock price",array("FontSize"=>28,"Align"=>TEXT_ALIGN_BOTTOMLEFT));
 
  /* Draw the 1st scale */
  $myPicture->setGraphArea(60,60,450,190);
  $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE));
 
  /* Draw the 1st stock chart */
  $mystockChart = new pStock($myPicture,$MyData);
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>30));
  $mystockChart->drawStockChart();
 
  /* Reset the display mode because of the graph small size */
  $MyData->setAxisDisplay(0,AXIS_FORMAT_DEFAULT);
 
  /* Draw the 2nd scale */
  $myPicture->setShadow(FALSE);
  $myPicture->setGraphArea(500,60,670,190);
  $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));
 
  /* Draw the 2nd stock chart */
  $mystockChart = new pStock($myPicture,$MyData);
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>30));
  $mystockChart->drawStockChart();
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawStockChart.png");
  ?>
  <?php
  /* CAT:Stock chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
  include("../class/pStock.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(35,28,17,27,12,12,20,15,20,28),"Open");
  $MyData->addPoints(array(20,17,25,20,25,23,16,29,26,17),"Close");
  $MyData->addPoints(array(10,11,14,11,9,4,3,7,9,5),"Min");
  $MyData->addPoints(array(37,32,33,29,29,25,22,34,29,31),"Max");
  $MyData->setAxisDisplay(0,AXIS_FORMAT_CURRENCY,"$");
 
  $MyData->addPoints(array("Dec 13","Dec 14","Dec 15","Dec 16","Dec 17", "Dec 20","Dec 21","Dec 22","Dec 23","Dec 24"),"Time");
  $MyData->setAbscissa("Time");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Turn of AAliasing */
  $myPicture->Antialias = FALSE;
 
  /* Draw the border */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Define the chart area */
  $myPicture->setGraphArea(60,30,650,190);
 
  /* Draw the scale */
  $scaleSettings = array("GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);
  $myPicture->drawScale($scaleSettings);
 
  /* Create the pStock object */
  $mystockChart = new pStock($myPicture,$MyData);
 
  /* Draw the stock chart */
  $stockSettings = array("BoxUpR"=>255,"BoxUpG"=>255,"BoxUpB"=>255,"BoxDownR"=>0,"BoxDownG"=>0,"BoxDownB"=>0);
  $mystockChart->drawStockChart($stockSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawStockChart.simple.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawText() - add some text to your charts",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Write some text */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/advent_light.ttf","FontSize"=>20));
  $TextSettings = array("R"=>255,"G"=>255,"B"=>255,"Angle"=>10);
  $myPicture->drawText(60,115,"10 degree text",$TextSettings);
 
  /* Write some text */
  $TextSettings = array("R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>40);
  $myPicture->drawText(220,130,"Simple text",$TextSettings);
 
  /* Write some text */
  $TextSettings = array("R"=>200,"G"=>100,"B"=>0,"Angle"=>90,"FontSize"=>14);
  $myPicture->drawText(500,170,"Vertical Text",$TextSettings);
 
  /* Write some text */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Bedizen.ttf","FontSize"=>6));
  $TextSettings = array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>10);
  $myPicture->drawText(220,160,"Encapsulated text",$TextSettings);
 
  /* Write some text */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>6));
  $TextSettings = array("DrawBox"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>10);
  $myPicture->drawText(220,195,"Text in a box",$TextSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawText.png");
  ?>
  <?php
  /* CAT:Misc */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(2,7,5,18,VOID,12,10,15,8,5,6,9),"Help Desk");
  $MyData->setAxisName(0,"Incidents");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun","Jui","Aou","Sep","Oct","Nov","Dec"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>100,"StartG"=>100,"StartB"=>100,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>100,"StartG"=>100,"StartB"=>100,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>20));
  $myPicture->drawGradientArea(0,0,60,230,DIRECTION_HORIZONTAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));
 
  /* Do some cosmetics */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->drawLine(60,0,60,230,array("R"=>70,"G"=>70,"B"=>70));
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(35,115,"Recorded cases",array("R"=>255,"G"=>255,"B"=>255,"FontSize"=>20,"Angle"=>90,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Prepare the chart area */
  $myPicture->setGraphArea(100,30,680,190);
  $myPicture->drawFilledRectangle(100,30,680,190,array("R"=>255,"G"=>255,"B"=>255,"Alpha"=>20));
  $myPicture->setFontProperties(array("R"=>255,"G"=>255,"B"=>255,"FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->drawScale(array("AxisR"=>255,"AxisG"=>255,"AxisB"=>255,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE));
 
  /* Write two thresholds over the chart */
  $myPicture->drawThreshold(10,array("WriteCaption"=>TRUE,"Caption"=>"Agreed SLA"));
  $myPicture->drawThreshold(15,array("WriteCaption"=>TRUE,"Caption"=>"Best effort"));
 
  /* Draw the chart */
  $myPicture->drawSplineChart();
  $myPicture->drawPlotChart();
 
 
  /* Write the data bounds */
  $myPicture->writeBounds();
 
  /* Write the chart legend */
  $myPicture->drawLegend(630,215,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawThreshold.labels.png");
  ?>
  <?php
  /* CAT:Misc */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(24,-25,26,25,25),"Temperature");
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawThreshold() - draw a treshold in the charting area",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Write the chart title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(250,55,"My chart title",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Draw the scale and do some cosmetics */
  $myPicture->setGraphArea(60,60,450,190);
  $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("DrawSubTicks"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Draw one static threshold */
  $myPicture->drawThreshold(5,array("Alpha"=>70,"Ticks"=>1));
 
  /* Draw one static threshold */
  $myPicture->drawThreshold(15,array("Alpha"=>70,"Ticks"=>2,"R"=>0,"G"=>0,"B"=>255));
 
  /* Disable shadow computing */
  $myPicture->setShadow(FALSE);
 
  /* Draw the scale and do some cosmetics */
  $myPicture->setGraphArea(500,60,670,190);
  $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Draw one static threshold */
  $myPicture->drawThreshold(5,array("Alpha"=>70,"Ticks"=>1));
 
  /* Draw one static threshold */
  $myPicture->drawThreshold(15,array("Alpha"=>70,"Ticks"=>2,"R"=>0,"G"=>0,"B"=>255));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawThreshold.png");
  ?>
  <?php
  /* CAT:Misc */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(24,-25,26,25,25),"Temperature");
  $MyData->setAxisName(0,"Temperatures");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"drawThresholdArea() - draw treshold areas in the charting area",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Write the chart title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(250,55,"My chart title",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Draw the scale and do some cosmetics */
  $myPicture->setGraphArea(60,60,450,190);
  $myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("DrawSubTicks"=>TRUE));
 
  /* Draw one static threshold area */
  $myPicture->drawThresholdArea(5,15,array("R"=>226,"G"=>194,"B"=>54,"Alpha"=>40));
 
  /* Draw the scale and do some cosmetics */
  $myPicture->setGraphArea(500,60,670,190);
  $myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
  $myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));
 
  /* Draw one static threshold area */
  $myPicture->drawThresholdArea(5,15,array("R"=>206,"G"=>231,"B"=>64,"Alpha"=>20));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawThresholdArea.png");
  ?>
  <?php
  /* CAT:Misc */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Define default font settings */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>14));
 
  /* Create the background */
  $myPicture->drawGradientArea(0,0,500,230,DIRECTION_HORIZONTAL,array("StartR"=>217,"StartG"=>250,"StartB"=>116,"EndR"=>181,"EndG"=>209,"EndB"=>27,"Alpha"=>100));
  $RectangleSettings = array("R"=>181,"G"=>209,"B"=>27,"Alpha"=>100);
  $myPicture->drawFilledRectangle(500,0,700,230,$RectangleSettings);
 
  /* Enable shadow computing on a (+1,+1) basis */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Draw the left area */
  $RectangleSettings = array("R"=>181,"G"=>209,"B"=>27,"Alpha"=>100);
  $myPicture->drawRoundedFilledRectangle(-5,0,20,240,10,$RectangleSettings);
  $TextSettings = array("R"=>255,"G"=>255,"B"=>255,"Angle"=>90,"Align"=>TEXT_ALIGN_MIDDLELEFT);
  $myPicture->drawText(10,220,"My first chart",$TextSettings);
 
  /* Draw the right area */
  $RectangleSettings = array("R"=>191,"G"=>219,"B"=>37,"Alpha"=>100,"Surrounding"=>20,"Ticks"=>2);
  $myPicture->drawFilledRectangle(510,10,689,219,$RectangleSettings);
 
  /* Write the legend */
  $TextSettings = array("R"=>255,"G"=>255,"B"=>255,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE);
  $myPicture->drawText(600,30,"Weather data",$TextSettings);
  $TextSettings = array("R"=>106,"G"=>125,"B"=>3,"Align"=>TEXT_ALIGN_TOPLEFT,"FontSize"=>11);
  $myPicture->drawText(520,45,"The data shown here has been",$TextSettings);
  $myPicture->drawText(520,60,"collected from European locations",$TextSettings);
  $myPicture->drawText(520,75,"by the French NAVI system.",$TextSettings);
  $myPicture->drawFromPNG(540,90,"resources/blocnote.png");
 
  /* Disable shadow computing */
  $myPicture->setShadow(FALSE);
 
  /* Draw the picture border */
  $RectangleSettings = array("R"=>181,"G"=>209,"B"=>27,"Alpha"=>100);
  $myPicture->drawRectangle(0,0,699,229,$RectangleSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.drawingObjects.png");
  ?>
  <?php
  /* CAT:Mathematical */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Frontend #1");
  $MyData->addPoints(array(3,12,15,8,5,-5),"Frontend #2");
  $MyData->addPoints(array(2,7,5,18,19,22),"Frontend #3");
  $MyData->setAxisName(0,"Average Usage");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Normalize the data series to 100% */
  $MyData->normalize(100,"%");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100));
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>20));
 
  /* Set the default font properties */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
 
  /* Draw the scale and the chart */
  $myPicture->setGraphArea(60,20,680,190);
  $myPicture->drawScale(array("DrawSubTicks"=>TRUE,"Mode"=>SCALE_MODE_ADDALL));
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->drawStackedBarChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO,"Rounded"=>FALSE,"Surrounding"=>60));
  $myPicture->setShadow(FALSE);
 
  /* Write the chart legend */
  $myPicture->drawLegend(480,210,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.normalize.png");
  ?>
  <?php
  /* CAT:Misc */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(24,25,26,25,25),"My Serie 1");
  $MyData->addPoints(array(12,13,14,16,18),"My Serie 2");
  $MyData->addPoints(array(80,76,73,71,33),"My Serie 3");
  $MyData->addPoints(array(47,67,78,76,54),"My Serie 4");
 
  /* Define the series name */
  $MyData->setSerieDescription("My Serie 1","Temperature");
  $MyData->setSerieDescription("My Serie 2","Humidity");
 
  /* Dispatche the series on different axis */
  $MyData->setSerieOnAxis("My Serie 1",1);
  $MyData->setSerieOnAxis("My Serie 2",1);
  $MyData->setSerieOnAxis("My Serie 3",2);
  $MyData->setSerieOnAxis("My Serie 4",2);
 
  /* Set the format of the axis */
  $MyData->setAxisDisplay(1,AXIS_FORMAT_DEFAULT);
  $MyData->setAxisDisplay(2,AXIS_FORMAT_DEFAULT);
  $MyData->setAxisDisplay(1,AXIS_FORMAT_TIME,"H:i");
 
  /* Set the unit of the axis */
 
  $MyData->setAxisUnit(2,"%");
 
  /* Set the name of the axis */
  $MyData->setAxisName(1,"Temperature");
  $MyData->setAxisName(2,"Humidity");
 
  /* Change the color of one serie */
  $serieSettings = array("R"=>229,"G"=>11,"B"=>11,"Alpha"=>80);
  $MyData->setPalette("My Serie 4",$serieSettings);
 
  /* Load a palette file */
  $MyData->loadPalette("resources/palette.txt",FALSE);
 
  /* Output the data structure */
  print_r($MyData->getData());
  ?>
  <?php
  /* CAT:Polar and radars */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pRadar.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(10,20,30,40,50,60,70,80,90),"ScoreA");
  $MyData->addPoints(array(20,40,50,12,10,30,40,50,60),"ScoreB");
  $MyData->setSerieDescription("ScoreA","Coverage A");
  $MyData->setSerieDescription("ScoreB","Coverage B");
 
  /* Define the absissa serie */
  $MyData->addPoints(array(40,80,120,160,200,240,280,320,360),"Coord");
  $MyData->setAbscissa("Coord");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw a solid background */
  $Settings = array("R"=>179, "G"=>217, "B"=>91, "Dash"=>1, "DashR"=>199, "DashG"=>237, "DashB"=>111);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay some gradient areas */
  $Settings = array("StartR"=>194, "StartG"=>231, "StartB"=>44, "EndR"=>43, "EndG"=>107, "EndB"=>58, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"pRadar - Draw polar charts",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Set the default font properties */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>10,"R"=>80,"G"=>80,"B"=>80));
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Create the pRadar object */
  $SplitChart = new pRadar();
 
  /* Draw a polar chart */
  $myPicture->setGraphArea(10,25,340,225);
  $Options = array("BackgroundGradient"=>array("StartR"=>255,"StartG"=>255,"StartB"=>255,"StartAlpha"=>100,"EndR"=>207,"EndG"=>227,"EndB"=>125,"EndAlpha"=>50), "FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6);
  $SplitChart->drawPolar($myPicture,$MyData,$Options);
 
  /* Draw a polar chart */
  $myPicture->setGraphArea(350,25,690,225);
  $Options = array("LabelPos"=>RADAR_LABELS_HORIZONTAL,"BackgroundGradient"=>array("StartR"=>255,"StartG"=>255,"StartB"=>255,"StartAlpha"=>50,"EndR"=>32,"EndG"=>109,"EndB"=>174,"EndAlpha"=>30),"AxisRotation"=>0,"DrawPoly"=>TRUE,"PolyAlpha"=>50, "FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6);
  $SplitChart->drawPolar($myPicture,$MyData,$Options);
 
  /* Write the chart legend */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->drawLegend(270,205,array("Style"=>LEGEND_BOX,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.polar.png");
  ?>
  <?php
  /* CAT:Polar and radars */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pRadar.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(4,4,10,10,4,4,15,15,4,4,10,10,4,4,15,15,4,4,10,10,4,4,15,15),"ScoreA");
  $MyData->setSerieDescription("ScoreA","Application A");
  $MyData->setPalette("ScoreA",array("R"=>150,"G"=>5,"B"=>217));
 
  /* Define the absissa serie */
  $MyData->addPoints(array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24),"Time");
  $MyData->setAbscissa("Time");
 
  /* Create the pChart object */
  $myPicture = new pImage(300,300,$MyData);
  $myPicture->drawGradientArea(0,0,300,300,DIRECTION_VERTICAL,array("StartR"=>200,"StartG"=>200,"StartB"=>200,"EndR"=>240,"EndG"=>240,"EndB"=>240,"Alpha"=>100));
  $myPicture->drawGradientArea(0,0,300,20,DIRECTION_HORIZONTAL,array("StartR"=>30,"StartG"=>30,"StartB"=>30,"EndR"=>100,"EndG"=>100,"EndB"=>100,"Alpha"=>100));
  $myPicture->drawLine(0,20,300,20,array("R"=>255,"G"=>255,"B"=>255));
  $RectangleSettings = array("R"=>180,"G"=>180,"B"=>180,"Alpha"=>100);
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,299,299,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"pRadar - Draw radar charts",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Set the default font properties */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>10,"R"=>80,"G"=>80,"B"=>80));
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Create the pRadar object */
  $SplitChart = new pRadar();
 
  /* Draw a radar chart */
  $myPicture->setGraphArea(10,25,290,290);
  $Options = array("SkipLabels"=>3,"LabelMiddle"=>TRUE,"Layout"=>RADAR_LAYOUT_STAR,"BackgroundGradient"=>array("StartR"=>255,"StartG"=>255,"StartB"=>255,"StartAlpha"=>100,"EndR"=>207,"EndG"=>227,"EndB"=>125,"EndAlpha"=>50));
  $SplitChart->drawRadar($myPicture,$MyData,$Options);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.radar.labels.png");
  ?>
  <?php
  /* CAT:Polar and radars */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pRadar.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(40,20,15,10,8,4),"ScoreA");
  $MyData->addPoints(array(8,10,12,20,30,15),"ScoreB");
  $MyData->addPoints(array(4,8,16,32,16,8),"ScoreC");
  $MyData->setSerieDescription("ScoreA","Application A");
  $MyData->setSerieDescription("ScoreB","Application B");
  $MyData->setSerieDescription("ScoreC","Application C");
 
  /* Define the absissa serie */
  $MyData->addPoints(array("Size","Speed","Reliability","Functionalities","Ease of use","Weight"),"Labels");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
 
  /* Draw a solid background */
  $Settings = array("R"=>179, "G"=>217, "B"=>91, "Dash"=>1, "DashR"=>199, "DashG"=>237, "DashB"=>111);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay some gradient areas */
  $Settings = array("StartR"=>194, "StartG"=>231, "StartB"=>44, "EndR"=>43, "EndG"=>107, "EndB"=>58, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"pRadar - Draw radar charts",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Set the default font properties */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>10,"R"=>80,"G"=>80,"B"=>80));
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Create the pRadar object */
  $SplitChart = new pRadar();
 
  /* Draw a radar chart */
  $myPicture->setGraphArea(10,25,300,225);
  $Options = array("Layout"=>RADAR_LAYOUT_STAR,"BackgroundGradient"=>array("StartR"=>255,"StartG"=>255,"StartB"=>255,"StartAlpha"=>100,"EndR"=>207,"EndG"=>227,"EndB"=>125,"EndAlpha"=>50), "FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6);
  $SplitChart->drawRadar($myPicture,$MyData,$Options);
 
  /* Draw a radar chart */
  $myPicture->setGraphArea(390,25,690,225);
  $Options = array("Layout"=>RADAR_LAYOUT_CIRCLE,"LabelPos"=>RADAR_LABELS_HORIZONTAL,"BackgroundGradient"=>array("StartR"=>255,"StartG"=>255,"StartB"=>255,"StartAlpha"=>50,"EndR"=>32,"EndG"=>109,"EndB"=>174,"EndAlpha"=>30), "FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6);
  $SplitChart->drawRadar($myPicture,$MyData,$Options);
 
  /* Write the chart legend */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->drawLegend(235,205,array("Style"=>LEGEND_BOX,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.radar.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"setFontProperties() - set default font properties",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Write some text */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/advent_light.ttf","FontSize"=>20));
  $myPicture->drawText(60,115,"10 degree text",array("Angle"=>10));
 
  /* Write some text */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/calibri.ttf","FontSize"=>20));
  $myPicture->drawText(75,130,"10 degree text",array("Angle"=>10));
 
  /* Write some text */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/GeosansLight.ttf","FontSize"=>20));
  $myPicture->drawText(90,145,"10 degree text",array("Angle"=>10));
 
  /* Write some text */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/MankSans.ttf","FontSize"=>20));
  $myPicture->drawText(105,160,"10 degree text",array("Angle"=>10));
 
  /* Write some text */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/MankSans.ttf","FontSize"=>30,"R"=>231,"G"=>50,"B"=>36));
  $myPicture->drawText(340,90,"Some big red text");
 
  /* Write some text */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6,"R"=>29,"G"=>70,"B"=>111));
  $myPicture->drawText(340,100,"Some blue text");
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.setFontProperties.png");
  ?>
  <?php
  /* CAT:Drawing */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"setShadow() - Add shadows",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Draw a filled circle */
  $formSettings = array("R"=>201,"G"=>230,"B"=>40,"Alpha"=>100,"Surrounding"=>30);
  $myPicture->drawFilledCircle(90,120,30,$formSettings);
 
  /* Draw a filled rectangle */
  $formSettings = array("R"=>231,"G"=>197,"B"=>40,"Alpha"=>100,"Surrounding"=>30);
  $myPicture->drawFilledRectangle(160,90,280,150,$formSettings);
 
  /* Draw a filled rounded rectangle */
  $formSettings = array("R"=>231,"G"=>102,"B"=>40,"Alpha"=>100,"Surrounding"=>70);
  $myPicture->drawRoundedFilledRectangle(320,90,440,150,5,$formSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.setShadow.png");
  ?>
  <?php
  /* CAT:Barcode */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pBarcode128.class.php");
  include("../class/pImage.class.php");
 
  /* Create the barcode 128 object */
  $Barcode = new pBarcode128("../");
 
  /* String to be written on the barcode */
  $String = "This is a test";
 
  /* Retrieve the barcode projected size */
  $Settings = array("ShowLegend"=>TRUE,"DrawArea"=>TRUE);
  $Size = $Barcode->getSize($String,$Settings);
 
  /* Create the pChart object */
  $myPicture = new pImage($Size["Width"],$Size["Height"]);
 
  /* Set the font to use */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/GeosansLight.ttf"));
 
  /* Render the barcode */
  $Barcode->draw($myPicture,$String,10,10,$Settings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.singlebarcode128.png");
  ?>
  <?php
  /* CAT:Barcode */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pBarcode39.class.php");
  include("../class/pImage.class.php");
 
  /* Create the barcode 39 object */
  $Barcode = new pBarcode39("../");
 
  /* String to be written on the barcode */
  $String = "This is a test";
 
  /* Retrieve the barcode projected size */
  $Settings = array("ShowLegend"=>TRUE,"DrawArea"=>TRUE);
  $Size = $Barcode->getSize($String,$Settings);
 
  /* Create the pChart object */
  $myPicture = new pImage($Size["Width"],$Size["Height"]);
 
  /* Set the font to use */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/GeosansLight.ttf"));
 
  /* Render the barcode */
  $Barcode->draw($myPicture,$String,10,10,$Settings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.singlebarcode39.png");
  ?>
  <?php
  /* CAT:Split chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pSplit.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,700,230,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"pSplit - Draw splitted path charts",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Set the default font properties */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>10,"R"=>80,"G"=>80,"B"=>80));
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(30,20,15,10,8,4),"Score");
  $MyData->addPoints(array("End of visit","Home Page","Product Page","Sales","Statistics","Prints"),"Labels");
  $MyData->setAbscissa("Labels");
 
  /* Create the pSplit object */
  $SplitChart = new pSplit();
 
  /* Draw the split chart */
  $Settings = array("TextPos"=>TEXT_POS_RIGHT,"TextPadding"=>10,"Spacing"=>20,"Surrounding"=>40);
  $myPicture->setGraphArea(10,20,340,230);
  $SplitChart->drawSplitPath($myPicture,$MyData,$Settings);
 
  /* Create and populate the pData object */
  $MyData2 = new pData();
  $MyData2->addPoints(array(30,20,15),"Score");
  $MyData2->addPoints(array("UK","FR","ES"),"Labels");
  $MyData2->setAbscissa("Labels");
 
  /* Draw the split chart */
  $Settings = array("TextPadding"=>4,"Spacing"=>30,"Surrounding"=>20);
  $myPicture->setGraphArea(350,50,690,200);
  $SplitChart->drawSplitPath($myPicture,$MyData2,$Settings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.split.png");
  ?>
  <?php
  /* CAT:Spring chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pSpring.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(600,600);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,600,600,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,600,600,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,600,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>100,"EndG"=>100,"EndB"=>100,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,599,599,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"pSpring - Draw spring charts",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Set the graph area boundaries*/
  $myPicture->setGraphArea(20,20,580,580);
 
  /* Set the default font properties */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>9,"R"=>80,"G"=>80,"B"=>80));
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Create the pSpring object */
  $SpringChart = new pSpring();
 
  /* Set the default parameters for newly added nodes */
  $SpringChart->setNodeDefaults(array("FreeZone"=>70));
 
  /* Create 11 random nodes */
  for($i=0;$i<=10;$i++)
  {
  $Connections = ""; $RdCx = rand(0,1);
  for($j=0;$j<=$RdCx;$j++)
  {
  $RandCx = rand(0,10);
  if ( $RandCx != $j )
  { $Connections[] = $RandCx; }
  }
 
  $SpringChart->addNode($i,array("Name"=>"Node ".$i,"Connections"=>$Connections));
  }
 
  /* Draw the spring chart */
  $Result = $SpringChart->drawSpring($myPicture,array("DrawQuietZone"=>TRUE,"Algorithm"=>ALGORITHM_CIRCULAR,"RingSize"=>100)); //WEIGHTED
 
  /* Output the statistics */
  // print_r($Result);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.spring.complex.png");
  ?>
  <?php
  /* CAT:Spring chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pSpring.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(300,300);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,300,300,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,300,300,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,300,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>100,"EndG"=>100,"EndB"=>100,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,299,299,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"pSpring - Draw spring charts",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Set the graph area boundaries*/
  $myPicture->setGraphArea(20,20,280,280);
 
  /* Set the default font properties */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>9,"R"=>80,"G"=>80,"B"=>80));
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Create the pSpring object */
  $SpringChart = new pSpring();
 
  /* Set the default parameters for newly added nodes */
  $SpringChart->setNodeDefaults(array("FreeZone"=>100));
 
  /* Create some nodes */
  $SpringChart->addNode(0,array("Shape"=>NODE_SHAPE_TRIANGLE,"FreeZone"=>60,"Size"=>20,"NodeType"=>NODE_TYPE_CENTRAL));
  $SpringChart->addNode(1,array("Connections"=>"0"));
  $SpringChart->addNode(2,array("Connections"=>"0"));
  $SpringChart->addNode(3,array("Connections"=>"2"));
 
  /* Set the nodes color */
  $SpringChart->setNodesColor(0,array("R"=>215,"G"=>163,"B"=>121,"BorderR"=>166,"BorderG"=>115,"BorderB"=>74));
  $SpringChart->setNodesColor(array(1,2,3),array("R"=>150,"G"=>215,"B"=>121,"Surrounding"=>-30));
 
  /* Set the link properties */
  $SpringChart->linkProperties(0,1,array("Name"=>"Synchronous","R"=>255,"G"=>0,"B"=>0));
  $SpringChart->linkProperties(0,2,array("Name"=>"Asynchronous","R"=>255,"G"=>0,"B"=>0,"Ticks"=>2));
  $SpringChart->linkProperties(3,2,array("Name"=>"Mixed","Ticks"=>4));
 
  /* Draw the spring chart */
  $Result = $SpringChart->drawSpring($myPicture);
 
  /* Output the statistics */
  // print_r($Result);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.spring.labels.png");
  ?>
  <?php
  /* CAT:Spring chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pSpring.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(300,300);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,300,300,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,300,300,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,300,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>100,"EndG"=>100,"EndB"=>100,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,299,299,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"pSpring - Draw spring charts",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Set the graph area boundaries*/
  $myPicture->setGraphArea(20,20,280,280);
 
  /* Set the default font properties */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>9,"R"=>80,"G"=>80,"B"=>80));
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Create the pSpring object */
  $SpringChart = new pSpring();
 
  /* Create some nodes */
  $SpringChart->addNode("0",array("Name"=>"","Shape"=>NODE_SHAPE_SQUARE,"FreeZone"=>60,"Size"=>20,"NodeType"=>NODE_TYPE_CENTRAL));
  $SpringChart->addNode("1",array("Name"=>"Johanna","Connections"=>array("0")));
  $SpringChart->addNode("2",array("Name"=>"Martin","Connections"=>array("0")));
  $SpringChart->addNode("3",array("Name"=>"Kevin","Connections"=>array("1")));
  $SpringChart->addNode("4",array("Name"=>"Alex","Connections"=>array("1")));
  $SpringChart->addNode("5",array("Name"=>"Julia","Connections"=>array("1")));
  $SpringChart->addNode("6",array("Name"=>"Lena","Connections"=>array("2")));
  $SpringChart->addNode("7",array("Name"=>"Elisa","Connections"=>array("2")));
  $SpringChart->addNode("8",array("Name"=>"Omar","Connections"=>array("2")));
 
  /* Set the nodes color */
  $SpringChart->setNodesColor(array(0),array("R"=>215,"G"=>163,"B"=>121,"BorderR"=>166,"BorderG"=>115,"BorderB"=>74));
  $SpringChart->setNodesColor(array(1,5,6,7),array("R"=>245,"G"=>183,"B"=>241,"Surrounding"=>-30));
  $SpringChart->setNodesColor(array(2,3,4,8),array("R"=>183,"G"=>224,"B"=>245,"Surrounding"=>-30));
 
  /* Draw the spring chart */
  $Result = $SpringChart->drawSpring($myPicture,array("DrawQuietZone"=>TRUE));
 
  /* Output the statistics */
  // print_r($Result);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.spring.png");
  ?>
  <?php
  /* CAT:Spring chart */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pSpring.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(300,300);
 
  /* Draw the background */
  $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
  $myPicture->drawFilledRectangle(0,0,300,300,$Settings);
 
  /* Overlay with a gradient */
  $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,300,300,DIRECTION_VERTICAL,$Settings);
  $myPicture->drawGradientArea(0,0,300,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>100,"EndG"=>100,"EndB"=>100,"Alpha"=>80));
 
  /* Add a border to the picture */
  $myPicture->drawRectangle(0,0,299,299,array("R"=>0,"G"=>0,"B"=>0));
 
  /* Write the picture title */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
  $myPicture->drawText(10,13,"pSpring - Draw spring charts",array("R"=>255,"G"=>255,"B"=>255));
 
  /* Set the graph area boundaries*/
  $myPicture->setGraphArea(20,20,280,280);
 
  /* Set the default font properties */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>9,"R"=>80,"G"=>80,"B"=>80));
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
 
  /* Create the pSpring object */
  $SpringChart = new pSpring();
 
  /* Create some nodes */
  $SpringChart->addNode(0,array("Shape"=>NODE_SHAPE_SQUARE,"FreeZone"=>60,"Size"=>20,"NodeType"=>NODE_TYPE_CENTRAL));
  $SpringChart->addNode(1,array("Connections"=>"0"));
  $SpringChart->addNode(2,array("Connections"=>"0"));
  $SpringChart->addNode(3,array("Shape"=>NODE_SHAPE_TRIANGLE,"Connections"=>"1"));
  $SpringChart->addNode(4,array("Shape"=>NODE_SHAPE_TRIANGLE,"Connections"=>"1"));
  $SpringChart->addNode(5,array("Shape"=>NODE_SHAPE_TRIANGLE,"Connections"=>"1"));
  $SpringChart->addNode(6,array("Connections"=>"2"));
  $SpringChart->addNode(7,array("Connections"=>"2"));
  $SpringChart->addNode(8,array("Connections"=>"2"));
 
  /* Set the nodes color */
  $SpringChart->setNodesColor(0,array("R"=>215,"G"=>163,"B"=>121,"BorderR"=>166,"BorderG"=>115,"BorderB"=>74));
  $SpringChart->setNodesColor(array(1,2),array("R"=>150,"G"=>215,"B"=>121,"Surrounding"=>-30));
  $SpringChart->setNodesColor(array(3,4,5),array("R"=>216,"G"=>166,"B"=>14,"Surrounding"=>-30));
  $SpringChart->setNodesColor(array(6,7,8),array("R"=>179,"G"=>121,"B"=>215,"Surrounding"=>-30));
 
  /* Set the link properties */
  $SpringChart->linkProperties(0,1,array("R"=>255,"G"=>0,"B"=>0,"Ticks"=>2));
  $SpringChart->linkProperties(0,2,array("R"=>255,"G"=>0,"B"=>0,"Ticks"=>2));
 
  /* Draw the spring chart */
  $Result = $SpringChart->drawSpring($myPicture);
 
  /* Output the statistics */
  // print_r($Result);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.spring.relations.png");
  ?>
  <?php
  /* CAT:Misc */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(550,175);
 
  /* Create a solid background */
  $Settings = array("R"=>183, "G"=>161, "B"=>71, "Dash"=>1, "DashR"=>203, "DashG"=>181, "DashB"=>91);
  $myPicture->drawFilledRectangle(0,0,550,175,$Settings);
 
  /* Do a gradient overlay */
  $Settings = array("StartR"=>231, "StartG"=>228, "StartB"=>155, "EndR"=>138, "EndG"=>91, "EndB"=>10, "Alpha"=>50);
  $myPicture->drawGradientArea(0,0,550,175,DIRECTION_VERTICAL,$Settings);
 
  /* Set the default font */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/calibri.ttf","FontSize"=>20));
 
  /* Draw the text box */
  $myPicture->setShadow(FALSE);
  $myPicture->drawFilledRectangle(141,77,393,126,array("Alpha"=>20,"R"=>230,"G"=>230,"B"=>230));
  $myPicture->drawRectangle(141,77,393,126,array("R"=>50,"G"=>50,"B"=>50));
 
  /* Write the text */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
  $TextSettings = array("R"=>201,"G"=>230,"B"=>40,"FontSize"=>40);
  $myPicture->drawText(144,125,"My text box",$TextSettings);
 
  /* Prepare and draw the markers */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
  $MyMarkerSettings = array("R"=>255,"G"=>0,"B"=>0,"BorderR"=>0,"BorderB"=>0,"BorderG"=>0,"Size"=>4);
 
  $myPicture->drawRectangleMarker(141,77,$MyMarkerSettings);
  $myPicture->drawRectangleMarker(141,101,$MyMarkerSettings);
  $myPicture->drawRectangleMarker(141,126,$MyMarkerSettings);
 
  $myPicture->drawRectangleMarker(260,77,$MyMarkerSettings);
  $myPicture->drawRectangleMarker(260,101,$MyMarkerSettings);
  $myPicture->drawRectangleMarker(260,126,$MyMarkerSettings);
 
  $myPicture->drawRectangleMarker(393,77,$MyMarkerSettings);
  $myPicture->drawRectangleMarker(393,101,$MyMarkerSettings);
  $myPicture->drawRectangleMarker(393,126,$MyMarkerSettings);
 
  /* Change the font settings */
  $myPicture->setFontProperties(array("FontName"=>"../fonts/calibri.ttf","FontSize"=>7));
  $myPicture->setShadow(FALSE);
 
  /* Write the arrows */
  $myPicture->drawArrowLabel(139,75,"TEXT_ALIGN_TOPLEFT",array("Length"=>20,"Angle"=>45,"RoundPos"=>TRUE));
  $myPicture->drawArrowLabel(139,101,"TEXT_ALIGN_MIDDLELEFT",array("Length"=>20,"Angle"=>90,"RoundPos"=>TRUE));
  $myPicture->drawArrowLabel(139,128,"TEXT_ALIGN_BOTTOMLEFT",array("Length"=>20,"Angle"=>135,"RoundPos"=>TRUE));
 
  $myPicture->drawArrowLabel(260,75,"TEXT_ALIGN_TOPMIDDLE",array("Length"=>20,"Angle"=>45,"RoundPos"=>TRUE));
  $myPicture->drawArrowLabel(260,101,"TEXT_ALIGN_MIDDLEMIDDLE",array("Length"=>90,"Angle"=>315,"RoundPos"=>TRUE));
  $myPicture->drawArrowLabel(260,128,"TEXT_ALIGN_BOTTOMMIDDLE",array("Length"=>20,"Angle"=>225,"RoundPos"=>TRUE));
 
  $myPicture->drawArrowLabel(395,75,"TEXT_ALIGN_TOPRIGHT",array("Length"=>20,"Angle"=>315,"RoundPos"=>TRUE));
  $myPicture->drawArrowLabel(395,101,"TEXT_ALIGN_MIDDLERIGHT",array("Length"=>20,"Angle"=>270,"RoundPos"=>TRUE));
  $myPicture->drawArrowLabel(395,128,"TEXT_ALIGN_BOTTOMRIGHT",array("Length"=>20,"Angle"=>225,"RoundPos"=>TRUE));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.spring.relations.png");
  ?>
  <?php
  /* CAT:Misc */
 
  /* pChart library inclusions */
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,NULL,TRUE);
 
  /* Draw a rounded filled rectangle */
  $RectangleSettings = array("R"=>209,"G"=>31,"B"=>27,"Alpha"=>50,"Surrounding"=>30);
  $myPicture->drawRoundedFilledRectangle(10,25,70,55,5,$RectangleSettings);
 
  /* Draw a rounded filled rectangle */
  $RectangleSettings = array("R"=>209,"G"=>125,"B"=>27,"Alpha"=>50,"Surrounding"=>30);
  $myPicture->drawRoundedFilledRectangle(10,85,70,115,5,$RectangleSettings);
 
  /* Draw a rounded filled rectangle */
  $RectangleSettings = array("R"=>209,"G"=>198,"B"=>27,"Alpha"=>50,"Surrounding"=>30);
  $myPicture->drawRoundedFilledRectangle(10,135,70,165,5,$RectangleSettings);
 
  /* Draw a rounded filled rectangle */
  $RectangleSettings = array("R"=>134,"G"=>209,"B"=>27,"Alpha"=>50,"Surrounding"=>30);
  $myPicture->drawRoundedFilledRectangle(10,185,70,215,5,$RectangleSettings);
 
  /* Enable shadow computing */
  $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20));
 
  /* Draw a rounded filled rectangle */
  $RectangleSettings = array("R"=>209,"G"=>198,"B"=>27,"Alpha"=>100,"Surrounding"=>30,"Radius"=>20);
  $myPicture->drawRoundedFilledRectangle(100,20,680,210,20,$RectangleSettings);
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.transparent.background.png");
  ?>
  <?php
  /* CAT:Misc */
 
  /* pChart library inclusions */
  include("../class/pData.class.php");
  include("../class/pDraw.class.php");
  include("../class/pImage.class.php");
 
  /* Create and populate the pData object */
  $MyData = new pData();
  $MyData->addPoints(array(2,7,5,18,VOID,12,10,15,8,5,6,9),"Help Desk");
  $MyData->setAxisName(0,"Incidents");
  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun","Jui","Aou","Sep","Oct","Nov","Dec"),"Labels");
  $MyData->setSerieDescription("Labels","Months");
  $MyData->setAbscissa("Labels");
 
  /* Create the pChart object */
  $myPicture = new pImage(700,230,$MyData);
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>100,"StartG"=>100,"StartB"=>100,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));
  $myPicture->drawGradientArea(0,0,700,230,DIRECTION_HORIZONTAL,array("StartR"=>100,"StartG"=>100,"StartB"=>100,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>20));
  $myPicture->drawGradientArea(0,0,60,230,DIRECTION_HORIZONTAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));
 
  /* Do some cosmetics */
  $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
  $myPicture->drawLine(60,0,60,230,array("R"=>70,"G"=>70,"B"=>70));
  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  $myPicture->drawText(35,115,"Recorded cases",array("R"=>255,"G"=>255,"B"=>255,"FontSize"=>20,"Angle"=>90,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 
  /* Draw a spline chart */
  $myPicture->setGraphArea(100,30,680,190);
  $myPicture->drawFilledRectangle(100,30,680,190,array("R"=>255,"G"=>255,"B"=>255,"Alpha"=>20));
  $myPicture->setFontProperties(array("R"=>255,"G"=>255,"B"=>255,"FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  $myPicture->drawScale(array("AxisR"=>255,"AxisG"=>255,"AxisB"=>255,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE));
  $myPicture->drawSplineChart();
 
  /* Write the data bounds */
  $myPicture->writeBounds();
  $myPicture->setShadow(FALSE);
 
  /* Write the chart legend */
  $myPicture->drawLegend(630,215,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 
  /* Render the picture (choose the best way) */
  $myPicture->autoOutput("pictures/example.writeBounds.png");
  ?>
  <?php if ( isset($_GET["Action"])) { $Script = $_GET["Script"]; highlight_file($Script); exit(); } ?>
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
  <title>pChart 2.x - examples rendering</title>
  <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>
  <style>
  body { background-color: #F0F0F0; font-family: tahoma; font-size: 14px; height: 100%; overflow: auto;}
  table { margin: 0px; padding: 0px; border: 0px; }
  tr { margin: 0px; padding: 0px; border: 0px; }
  td { font-family: tahoma; font-size: 11px; margin: 0px; padding: 0px; border: 0px; }
  div.folder { cursor: hand; cursor: pointer; }
  a.smallLinkGrey:link { text-decoration: none; color: #6A6A6A; }
  a.smallLinkGrey:visited { text-decoration: none; color: #6A6A6A; }
  a.smallLinkGrey:hover { text-decoration: underline; color: #6A6A6A; }
  a.smallLinkBlack:link { text-decoration: none; color: #000000; }
  a.smallLinkBlack:visited { text-decoration: none; color: #000000; }
  a.smallLinkBlack:hover { text-decoration: underline; color: #000000; }
  </style>
  </head>
  <body>
 
  <?php
  /* Files that we don't want to see in the tree */
  $Exclusion = array(".","..","index.php","buildAll.cmd","pictures","resources","delayedLoader","sandbox");
 
  /* Determine the current package version */
  $FileHandle = fopen("../readme.txt", "r");
  for ($i=0; $i<=5; $i++) { $buffer = fgets($FileHandle, 4096); }
  fclose($FileHandle);
  $Values = preg_split("/:/",$buffer);
  $Values = preg_split("/ /",$Values[1]);
  $Version = strip_tags($Values[1]);
 
  /* Build a list of the examples & categories */
  $DirectoryHandle = opendir(".");
  {
  $Tree = "";
  while (($FileName = readdir($DirectoryHandle)) !== false)
  {
  if ( !in_array($FileName,$Exclusion))
  {
  $FileHandle = fopen($FileName, "r");
  $buffer = fgets($FileHandle, 4096);
  $buffer = fgets($FileHandle, 4096);
  fclose($FileHandle);
 
  if ( preg_match("/CAT:/",$buffer) )
  {
  $Categorie = str_replace(" /* CAT:","",$buffer);
  $Categorie = str_replace("*/","",$Categorie);
  $Categorie = trim($Categorie);
  }
  else
  { $Categorie = "z_root"; }
 
  $FileShortName = str_replace("example.","",$FileName);
  $FileShortName = str_replace(".php","",$FileShortName);
  $FileShortName = trim($FileShortName);
 
  $Tree[$Categorie][]=array("FileName"=>$FileName,"FileShortName"=>$FileShortName);
  }
  }
  closedir($DirectoryHandle);
 
  ksort($Tree);
  ?>
 
  <table style='border: 2px solid #FFFFFF;'><tr><td>
  <div style='font-size: 11px; padding: 2px; color: #FFFFFF; background-color: #666666; border-bottom: 3px solid #484848; width: 362px;'>&nbsp;Navigation</div>
  <table style='padding: 1px; background-color: #E0E0E0; border: 1px solid #D0D0D0; border-top: 1px solid #FFFFFF;'><tr>
  <td width=16><img src='resources/application_view_tile.png' width=16 height=16 alt=''/></td>
  <td width=100>&nbsp;<b>Examples</b></td>
  <td width=16><img src='resources/application_view_list.png' width=16 height=16 alt=''/></td>
  <td width=100>&nbsp;<a class=smallLinkGrey href='sandbox/'>Sandbox</a></td>
  <td width=16><img src='resources/application_view_list.png' width=16 height=16 alt=''/></td>
  <td width=100>&nbsp;<a class=smallLinkGrey href='delayedLoader/'>Delayed loader</a></td>
  </tr></table>
  </td></tr></table>
 
  <br/>
  <table><tr><td valign='top'>
 
  <table style='border: 2px solid #FFFFFF;'><tr><td>
  <div style='font-size: 11px; padding: 2px; color: #FFFFFF; background-color: #666666; border-bottom: 3px solid #484848; width: 222px;'>&nbsp;Release <?php echo $Version; ?></div>
  <div style='border: 3px solid #D0D0D0; border-top: 1px solid #FFFFFF; background-color: #FAFAFA; width: 220px; overflow: auto'>
  <div style='padding: 1px; padding-bottom: 3px; color: #000000; background-color:#D0D0D0;'>
  <table><tr>
  <td><img src='resources/application_view_list.png' width=16 height=16 alt=''/></td>
  <td>&nbsp;Examples folder contents</td>
  </tr></table>
  </div>
  <?php
  $ID = 1; if ( isset($Tree["z_root"]) ) { $ID = 2; }
  foreach($Tree as $Key => $Elements)
  {
  if ( $ID == count($Tree) ) { $Icon = "dash-explorer-last.png"; $SubIcon = "dash-explorer-blank.png"; } else { $Icon = "dash-explorer.png"; $SubIcon = "dash-explorer-noleaf.png"; }
  if ( $Key != "z_root" )
  {
  echo "<table noborder cellpadding=0 cellspacing=0>\r\n";
  echo " <tr valign=middle>\r\n";
  echo " <td><img src='resources/".$Icon."' width=16 height=20 alt=''/></td>\r\n";
  echo " <td><img src='resources/folder.png' width=16 height=16 alt=''/></td>\r\n";
  echo " <td><div class=folder id='".$Key."_main' onclick='showHideMenu(".chr(34).$Key.chr(34).");'>&nbsp;".$Key."</div></td>\r\n";
  echo " </tr>\r\n";
  echo "</table>\r\n";
 
  echo "<table id='".$Key."' style='display: none;' noborder cellpadding=0 cellspacing=0><tr>\r\n";
  foreach($Elements as $SubKey => $Element)
  {
  $FileName = $Element["FileName"];
  $FileShortName = $Element["FileShortName"];
 
  if ( $SubKey == count($Elements)-1 ) { $Icon = "dash-explorer-last.png"; } else { $Icon = "dash-explorer.png"; }
 
  echo " <tr valign=middle>\r\n";
  echo " <td><img src='resources/".$SubIcon."' width=16 height=20 alt=''/></td>\r\n";
  echo " <td><img src='resources/".$Icon."' width=16 height=20 alt=''/></td>\r\n";
  echo " <td><img src='resources/application_view_tile.png' width=16 height=16 alt=''/></td>\r\n";
  echo " <td>&nbsp;<a class=smallLinkGrey href='#' onclick='render(".chr(34).$FileName.chr(34).");'>".$FileShortName."</a></td>\r\n";
  echo " </tr>\r\n";
  }
  echo "</table>\r\n";
 
  }
  $ID++;
  }
  }
  ?>
  </div>
  </td></tr></table>
 
  </td><td width=20></td><td valign='top' style='padding-top: 5px; font-size: 12px;'>
 
  <table><tr>
  <td><img src='resources/chart_bar.png' width=16 height=16 alt=''/></td>
  <td>&nbsp;Rendering area</td>
  </tr></table>
 
  <div style='display:table-cell; padding: 10px; border: 2px solid #FFFFFF; vertical-align: middle; overflow: auto; background-image: url("resources/dash.png");'>
  <div style='font-size: 10px;' id=render>
  <table><tr><td><img src='resources/accept.png' width=16 height=16 alt=""/></td><td>Click on an example to render it!</td></tr></table>
  </div>
  </div>
 
  <br/><br/>
 
  <table><tr>
  <td><img src='resources/application_view_list.png' width=16 height=16 alt=''/></td>
  <td>&nbsp;Source area</td>
  </tr></table>
 
  <div style='display:table-cell; padding: 10px; border: 2px solid #FFFFFF; vertical-align: middle; overflow: auto; background-image: url("resources/dash.png");'>
  <div style='font-size: 10px;' id=source style='width: 700px;'>
  <table><tr><td><img src='resources/accept.png' width=16 height=16 alt=""/></td><td>Click on an example to get its source!</td></tr></table>
  </div>
  </div>
 
  </td></tr></table>
  </body>
  <script>
  URL = "";
  SourceURL = "";
  LastOpened = "";
 
  function showHideMenu(Element)
  {
  status = document.getElementById(Element).style.display;
  if ( status == "none" )
  {
  if ( LastOpened != "" && LastOpened != Element ) { showHideMenu(LastOpened); }
 
  document.getElementById(Element).style.display = "inline";
  document.getElementById(Element+"_main").style.fontWeight = "bold";
  LastOpened = Element;
  }
  else
  {
  document.getElementById(Element).style.display = "none";
  document.getElementById(Element+"_main").style.fontWeight = "normal";
  LastOpened = "";
  }
  }
 
  function render(PictureName)
  {
  opacity("render",100,0,100);
 
  RandomKey = Math.random(100);
  URL = PictureName + "?Seed=" + RandomKey;
  SourceURL = PictureName;
 
  ajaxRender(URL);
  }
 
  function StartFade()
  {
  Loader = new Image();
  Loader.src = URL;
  setTimeout("CheckLoadingStatus()", 200);
  }
 
  function CheckLoadingStatus()
  {
  if ( Loader.complete == true )
  {
  changeOpac(0, "render");
  HTMLResult = "<center><img src='" + URL + "' alt=''/></center>";
  document.getElementById("render").innerHTML = HTMLResult;
 
  opacity("render",0,100,100);
  view(SourceURL);
  }
  else
  setTimeout("CheckLoadingStatus()", 200);
  }
 
  function changeOpac(opacity, id)
  {
  var object = document.getElementById(id).style;
  object.opacity = (opacity / 100);
  object.MozOpacity = (opacity / 100);
  object.KhtmlOpacity = (opacity / 100);
  object.filter = "alpha(opacity=" + opacity + ")";
  }
 
  function wait()
  {
  HTMLResult = "<center><img src='resources/wait.gif' width=24 height=24 alt=''/><br>Rendering</center>";
  document.getElementById("render").innerHTML = HTMLResult;
  changeOpac(20, "render");
  }
 
  function opacity(id, opacStart, opacEnd, millisec)
  {
  var speed = Math.round(millisec / 100);
  var timer = 0;
 
  if(opacStart > opacEnd)
  {
  for(i = opacStart; i >= opacEnd; i--)
  {
  setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
  timer++;
  }
  setTimeout("wait()",(timer * speed));
  }
  else if(opacStart < opacEnd)
  {
  for(i = opacStart; i <= opacEnd; i++)
  {
  setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
  timer++;
  }
  }
  }
 
  function ajaxRender(URL)
  {
  var xmlhttp=false;
  /*@cc_on @*/
  /*@if (@_jscript_version >= 5)
  try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } }
  @end @*/
 
  if (!xmlhttp && typeof XMLHttpRequest!='undefined')
  { try { xmlhttp = new XMLHttpRequest(); } catch (e) { xmlhttp=false; } }
 
  if (!xmlhttp && window.createRequest)
  { try { xmlhttp = window.createRequest(); } catch (e) { xmlhttp=false; } }
 
  xmlhttp.open("GET", URL,true);
 
  xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4) { StartFade(); } }
  xmlhttp.send(null)
  }
 
  function view(URL)
  {
  var xmlhttp=false;
  /*@cc_on @*/
  /*@if (@_jscript_version >= 5)
  try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } }
  @end @*/
 
  URL = "index.php?Action=View&Script=" + URL;
 
  if (!xmlhttp && typeof XMLHttpRequest!='undefined')
  { try { xmlhttp = new XMLHttpRequest(); } catch (e) { xmlhttp=false; } }
 
  if (!xmlhttp && window.createRequest)
  { try { xmlhttp = window.createRequest(); } catch (e) { xmlhttp=false; } }
 
  xmlhttp.open("GET", URL,true);
 
  xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4) { Result = xmlhttp.responseText; document.getElementById("source").innerHTML = Result.replace("/\<BR\>/"); } }
  xmlhttp.send(null)
  }
  </script>
  </html>
  <?php
  function size($Value)
  {
  if ( $Value < 1024 ) { return($Value." o."); }
  if ( $Value >= 1024 && $Value < 1024000 ) { return(floor($Value/1024)." ko."); }
  return(floor($Value/1024000))." mo.";
  }
 
  function left($value,$NbChar)
  { return substr($value,0,$NbChar); }
 
  function right($value,$NbChar)
  { return substr($value,strlen($value)-$NbChar,$NbChar); }
 
  function mid($value,$Depart,$NbChar)
  { return substr($value,$Depart-1,$NbChar); }
  ?>
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/accept.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/application_view_list.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/application_view_tile.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/blocnote.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/chart_bar.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/chart_line.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/computer.gif differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/dash-explorer-blank.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/dash-explorer-last.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/dash-explorer-noleaf.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/dash-explorer.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/dash.png differ
  Hour,Temperature,Humidity
  0,10,40
  1,9,41
  2,8,44
  3,8,42
  4,9,40
  5,9,38
  6,10,39
  7,11,35
  8,12,33
  9,14,32
  10,16,30
  11,18,30
  12,20,30
  13,21,31
  14,22,33
  15,23,34
  16,22,36
  17,20,37
  18,16,38
  19,14,38
  20,12,39
  21,11,40
  22,11,44
  23,10,40
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/folder.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/hologram.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/landscape1.jpg differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/landscape2.jpg differ
  239,210,121,100
  149,203,233,100
  2,71,105,100
  175,215,117,100
  44,87,0,100
  222,157,127,100
 
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/serie1.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/serie2.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/resources/wait.gif differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/accept.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/application_form.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/background.console.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/chart_bar.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/chart_bar_edit.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/chart_curve.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/chart_line.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/cog.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/color_swatch.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/comment.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/database_table.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/layout_edit.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/page_edit.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/paintcan.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/shape_flip_vertical.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/tab.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/vector.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/wait.gif differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/wand.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/graphix/wrench.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/includes/arrow.gif differ
  0.12345,VOID
  680001,AXIS_FORMAT_DEFAULT
  680002,AXIS_FORMAT_TIME
  680003,AXIS_FORMAT_DATE
  680004,AXIS_FORMAT_METRIC
  680005,AXIS_FORMAT_CURRENCY
  681001,AXIS_POSITION_LEFT
  681002,AXIS_POSITION_RIGHT
  682001,AXIS_X
  682002,AXIS_Y
  690001,DIRECTION_VERTICAL
  690002,DIRECTION_HORIZONTAL
  690101,SCALE_POS_LEFTRIGHT
  690102,SCALE_POS_TOPBOTTOM
  690201,SCALE_MODE_FLOATING
  690202,SCALE_MODE_START0
  690203,SCALE_MODE_ADDALL
  690204,SCALE_MODE_ADDALL_START0
  690301,SCALE_SKIP_NONE
  690302,SCALE_SKIP_SAME
  690303,SCALE_SKIP_NUMBERS
  690401,TEXT_ALIGN_TOPLEFT
  690402,TEXT_ALIGN_TOPMIDDLE
  690403,TEXT_ALIGN_TOPRIGHT
  690404,TEXT_ALIGN_MIDDLELEFT
  690405,TEXT_ALIGN_MIDDLEMIDDLE
  690406,TEXT_ALIGN_MIDDLERIGHT
  690407,TEXT_ALIGN_BOTTOMLEFT
  690408,TEXT_ALIGN_BOTTOMMIDDLE
  690409,TEXT_ALIGN_BOTTOMRIGHT
  690501,POSITION_TOP
  690502,POSITION_BOTTOM
  690601,LABEL_POS_LEFT
  690602,LABEL_POS_CENTER
  690603,LABEL_POS_RIGHT
  690604,LABEL_POS_TOP
  690605,LABEL_POS_BOTTOM
  690606,LABEL_POS_INSIDE
  690607,LABEL_POS_OUTSIDE
  690701,ORIENTATION_HORIZONTAL
  690702,ORIENTATION_VERTICAL
  690800,LEGEND_NOBORDER
  690801,LEGEND_BOX
  690802,LEGEND_ROUND
  690901,LEGEND_VERTICAL
  690902,LEGEND_HORIZONTAL
  691051,LEGEND_FAMILY_BOX
  691052,LEGEND_FAMILY_CIRCLE
  691053,LEGEND_FAMILY_LINE
  691001,DISPLAY_AUTO
  691002,DISPLAY_MANUAL
  691011,LABELING_ALL
  691012,LABELING_DIFFERENT
  691021,BOUND_MIN
  691022,BOUND_MAX
  691023,BOUND_BOTH
  691031,BOUND_LABEL_POS_TOP
  691032,BOUND_LABEL_POS_BOTTOM
  691033,BOUND_LABEL_POS_AUTO
  691041,CAPTION_LEFT_TOP
  691042,CAPTION_RIGHT_BOTTOM
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/includes/cross.gif differ
  /*
  functions.js - Sandbox JS
 
  Version : 1.1.0
  Made by : Jean-Damien POGOLOTTI
  Last Update : 18/01/11
 
  This file can be distributed under the license you can find at :
 
  http://www.pchart.net/license
 
  You can find the whole class documentation on the pChart web site.
  */
 
  Action = "Render";
 
  function toggleAuto()
  {
  if ( document.getElementById("g_autopos").checked ) { Automatic = true; } else { Automatic = false; }
  }
 
  function doLayout()
  {
  if ( !Automatic ) { return(0); }
 
  g_width = document.getElementById("g_width").value;
  g_height = document.getElementById("g_height").value;
 
  document.getElementById("g_title_x").value = g_width/2;
 
  checkEnabledAxis();
  }
 
  /* Apply curvy corners */
  function applyCorners()
  {
  settings = {tl: { radius: 10 },tr: { radius: 10 },bl: { radius: 10 },br: { radius: 10 },antiAlias: true,autoPad: true,validTags: ["div"]}
  var myBoxObject = new curvyCorners(settings, "roundedCorner");
  myBoxObject.applyCornersToAll();
  }
 
  /* Set or remove the focus */
  function setFocus(Object,Mode)
  {
  if (Mode == true)
  { Object.style.borderColor = "#808080"; }
  else
  { Object.style.borderColor = "#D0D0D0"; }
  }
 
  function highlightDIV(ID)
  {
  if ( ID == CurrentDiv ) { return(0); }
  document.getElementById("menu"+ID).style.backgroundColor = "#F4F4F4";
  }
 
  function clearDIV(ID)
  {
  if ( ID == CurrentDiv ) { return(0); }
  document.getElementById("menu"+ID).style.backgroundColor = "#EAEAEA";
  }
 
  function toggleDIV(ID)
  {
  /* reset the tab styles */
  for (i=1;i<=6;i++)
  { if ( i != ID ) { document.getElementById("menu"+i).style.backgroundColor = "#EAEAEA"; document.getElementById("menu"+i).style.borderColor = "#FEFEFE"; } }
 
  /* hide the curently displayed tab */
  if ( CurrentDiv != ID ) { document.getElementById("tab"+CurrentDiv).style.display = "none"; }
 
  document.getElementById("tab"+ID).style.display = "block";
 
  CurrentDiv = ID;
  document.getElementById("menu"+ID).style.backgroundColor = "#D0D0D0";
  document.getElementById("menu"+ID).style.borderColor = "#B0B0B0";
  }
 
  function render()
  {
  Action = "Render";
  saveToSession();
  }
 
  function code()
  {
  Action = "Code";
  saveToSession();
  }
 
  function saveToSession()
  {
  saveGeneral();
  }
 
  function saveGeneral()
  {
  document.getElementById("result_area").innerHTML = "<img src='graphix/wait.gif' width='24' height='24' alt=''><br/>Saving configuration (General)";
 
  g_width = document.getElementById("g_width").value;
  g_height = document.getElementById("g_height").value;
  g_border = document.getElementById("g_border").checked;
  g_aa = document.getElementById("g_aa").checked;
  g_shadow = document.getElementById("g_shadow").checked;
  g_transparent = document.getElementById("g_transparent").checked;
  g_autopos = document.getElementById("g_autopos").checked;
 
  g_title_enabled = document.getElementById("g_title_enabled").checked;
  g_title = document.getElementById("g_title").value;
  g_title_align = document.getElementById("g_title_align").options[document.getElementById("g_title_align").selectedIndex].value;
  g_title_x = document.getElementById("g_title_x").value;
  g_title_y = document.getElementById("g_title_y").value;
  g_title_color = document.getElementById("g_title_color").value;
  g_title_font = document.getElementById("g_title_font").options[document.getElementById("g_title_font").selectedIndex].value;
  g_title_font_size = document.getElementById("g_title_font_size").value;
  g_title_box = document.getElementById("g_title_box").checked;
 
  g_solid_enabled = document.getElementById("g_solid_enabled").checked;
  g_solid_color = document.getElementById("g_solid_color").value;
  g_solid_dashed = document.getElementById("g_solid_dashed").checked;
 
  g_gradient_enabled = document.getElementById("g_gradient_enabled").checked;
  g_gradient_start = document.getElementById("g_gradient_start").value;
  g_gradient_end = document.getElementById("g_gradient_end").value;
  g_gradient_direction = document.getElementById("g_gradient_direction").options[document.getElementById("g_gradient_direction").selectedIndex].value;
  g_gradient_alpha = document.getElementById("g_gradient_alpha").value;
 
  var reg=new RegExp("(#)", "g");
  g_title_color = g_title_color.replace(reg,"");
  g_solid_color = g_solid_color.replace(reg,"");
  g_gradient_start = g_gradient_start.replace(reg,"");
  g_gradient_end = g_gradient_end.replace(reg,"");
 
  URL = "script/session.php?g_width="+g_width+"&g_height="+g_height+"&g_border="+g_border+"&g_aa="+g_aa+"&g_shadow="+g_shadow+"&g_autopos="+g_autopos
  +"&g_title_enabled="+g_title_enabled+"&g_title="+g_title+"&g_title_align="+g_title_align+"&g_title_x="+g_title_x
  +"&g_title_y="+g_title_y+"&g_title_color="+g_title_color+"&g_title_font="+g_title_font+"&g_title_font_size="+g_title_font_size+"&g_title_box="+g_title_box
  +"&g_solid_enabled="+g_solid_enabled+"&g_solid_color="+g_solid_color+"&g_solid_dashed="+g_solid_dashed
  +"&g_gradient_enabled="+g_gradient_enabled+"&g_gradient_start="+g_gradient_start+"&g_gradient_end="+g_gradient_end
  +"&g_gradient_direction="+g_gradient_direction+"&g_gradient_alpha="+g_gradient_alpha+"&g_transparent="+g_transparent
  +"&Seed="+Math.random(100);
 
  push(URL,1);
  }
 
  function saveData()
  {
  document.getElementById("result_area").innerHTML = "<img src='graphix/wait.gif' width='24' height='24' alt=''><br/>Saving configuration (Data)";
 
  d_serie1_enabled = document.getElementById("d_serie1_enabled").checked;
  d_serie2_enabled = document.getElementById("d_serie2_enabled").checked;
  d_serie3_enabled = document.getElementById("d_serie3_enabled").checked;
  d_absissa_enabled = document.getElementById("d_absissa_enabled").checked;
 
  d_serie1_name = document.getElementById("d_serie1_name").value;
  d_serie2_name = document.getElementById("d_serie2_name").value;
  d_serie3_name = document.getElementById("d_serie3_name").value;
 
  d_serie1_axis = document.getElementById("d_serie1_axis").options[document.getElementById("d_serie1_axis").selectedIndex].value;
  d_serie2_axis = document.getElementById("d_serie2_axis").options[document.getElementById("d_serie2_axis").selectedIndex].value;
  d_serie3_axis = document.getElementById("d_serie3_axis").options[document.getElementById("d_serie3_axis").selectedIndex].value;
 
  data0 = ""; data1 = ""; data2 = ""; absissa = "";
  for(i=0;i<8;i++)
  {
  data0 = data0 + "!" + document.getElementById("d_serie1_data"+i).value;
  data1 = data1 + "!" + document.getElementById("d_serie2_data"+i).value;
  data2 = data2 + "!" + document.getElementById("d_serie3_data"+i).value;
  absissa = absissa + "!" + document.getElementById("d_absissa_data"+i).value;
  }
 
  d_normalize_enabled = document.getElementById("d_normalize_enabled").checked;
 
  d_axis0_name = document.getElementById("d_axis0_name").value;
  d_axis1_name = document.getElementById("d_axis1_name").value;
  d_axis2_name = document.getElementById("d_axis2_name").value;
 
  d_axis0_unit = document.getElementById("d_axis0_unit").value;
  d_axis1_unit = document.getElementById("d_axis1_unit").value;
  d_axis2_unit = document.getElementById("d_axis2_unit").value;
 
  d_axis0_position = document.getElementById("d_axis0_position").options[document.getElementById("d_axis0_position").selectedIndex].value;
  d_axis1_position = document.getElementById("d_axis1_position").options[document.getElementById("d_axis1_position").selectedIndex].value;
  d_axis2_position = document.getElementById("d_axis2_position").options[document.getElementById("d_axis2_position").selectedIndex].value;
 
  d_axis0_format = document.getElementById("d_axis0_format").options[document.getElementById("d_axis0_format").selectedIndex].value;
  d_axis1_format = document.getElementById("d_axis1_format").options[document.getElementById("d_axis1_format").selectedIndex].value;
  d_axis2_format = document.getElementById("d_axis2_format").options[document.getElementById("d_axis2_format").selectedIndex].value;
 
  URL = "script/session.php?d_serie1_enabled="+d_serie1_enabled+"&d_serie2_enabled="+d_serie2_enabled+"&d_serie3_enabled="+d_serie3_enabled
  +"&d_absissa_enabled="+d_absissa_enabled+"&d_serie1_axis="+d_serie1_axis+"&d_serie2_axis="+d_serie2_axis+"&d_serie3_axis="+d_serie3_axis
  +"&data0="+data0+"&data1="+data1+"&data2="+data2+"&absissa="+absissa+"&d_axis0_name="+d_axis0_name+"&d_axis1_name="+d_axis1_name
  +"&d_axis2_name="+d_axis2_name+"&d_axis0_unit="+d_axis0_unit+"&d_axis1_unit="+d_axis1_unit+"&d_axis2_unit="+d_axis2_unit
  +"&d_axis0_position="+d_axis0_position+"&d_axis1_position="+d_axis1_position+"&d_axis2_position="+d_axis2_position
  +"&d_normalize_enabled="+d_normalize_enabled+"&d_serie1_name="+d_serie1_name+"&d_serie2_name="+d_serie2_name+"&d_serie3_name="+d_serie3_name
  +"&d_axis0_format="+d_axis0_format+"&d_axis1_format="+d_axis1_format+"&d_axis2_format="+d_axis2_format;
 
  push(URL,2);
  }
 
  function saveScale()
  {
  document.getElementById("result_area").innerHTML = "<img src='graphix/wait.gif' width='24' height='24' alt=''><br/>Saving configuration (Scale)";
 
  s_x = document.getElementById("s_x").value;
  s_y = document.getElementById("s_y").value;
  s_width = document.getElementById("s_width").value;
  s_height = document.getElementById("s_height").value;
  s_direction = document.getElementById("s_direction").options[document.getElementById("s_direction").selectedIndex].value;
  s_arrows_enabled = document.getElementById("s_arrows_enabled").checked;
  s_mode = document.getElementById("s_mode").options[document.getElementById("s_mode").selectedIndex].value;
  s_cycle_enabled = document.getElementById("s_cycle_enabled").checked;
  s_x_margin = document.getElementById("s_x_margin").value;
  s_y_margin = document.getElementById("s_y_margin").value;
  s_automargin_enabled = document.getElementById("s_automargin_enabled").checked;
  s_font = document.getElementById("s_font").options[document.getElementById("s_font").selectedIndex].value;
  s_font_size = document.getElementById("s_font_size").value;
  s_font_color = document.getElementById("s_font_color").value;
 
  s_x_labeling = document.getElementById("s_x_labeling").options[document.getElementById("s_x_labeling").selectedIndex].value;
  s_x_skip = document.getElementById("s_x_skip").value;
  s_x_label_rotation = document.getElementById("s_x_label_rotation").value;
 
  s_grid_color = document.getElementById("s_grid_color").value;
  s_grid_alpha = document.getElementById("s_grid_alpha").value;
  s_grid_x_enabled = document.getElementById("s_grid_x_enabled").checked;
  s_grid_y_enabled = document.getElementById("s_grid_y_enabled").checked;
 
  s_ticks_color = document.getElementById("s_ticks_color").value;
  s_ticks_alpha = document.getElementById("s_ticks_alpha").value;
  s_subticks_color = document.getElementById("s_subticks_color").value;
  s_subticks_alpha = document.getElementById("s_subticks_alpha").value;
  s_subticks_enabled = document.getElementById("s_subticks_enabled").checked;
 
  URL = "script/session.php?s_x="+s_x+"&s_y="+s_y+"&s_width="+s_width+"&s_height="+s_height+"&s_direction="+s_direction
  +"&s_arrows_enabled="+s_arrows_enabled+"&s_mode="+s_mode+"&s_cycle_enabled="+s_cycle_enabled+"&s_x_margin="+s_x_margin
  +"&s_y_margin="+s_y_margin+"&s_automargin_enabled="+s_automargin_enabled+"&s_x_labeling="+s_x_labeling+"&s_x_skip="+s_x_skip
  +"&s_x_label_rotation="+s_x_label_rotation+"&s_grid_color="+s_grid_color+"&s_grid_alpha="+s_grid_alpha+"&s_grid_x_enabled="+s_grid_x_enabled
  +"&s_grid_y_enabled="+s_grid_y_enabled+"&s_ticks_color="+s_ticks_color+"&s_ticks_alpha="+s_ticks_alpha+"&s_subticks_color="+s_subticks_color
  +"&s_subticks_alpha="+s_subticks_alpha+"&s_subticks_enabled="+s_subticks_enabled+"&s_font="+s_font+"&s_font_size="+s_font_size
  +"&s_font_color="+s_font_color+"&Seed="+Math.random(100);
 
  push(URL,3);
  }
 
  function saveChart()
  {
  document.getElementById("result_area").innerHTML = "<img src='graphix/wait.gif' width='24' height='24' alt=''><br/>Saving configuration (Chart)";
 
  c_family = document.getElementById("c_family").options[document.getElementById("c_family").selectedIndex].value;
  c_display_values = document.getElementById("c_display_values").checked;
  c_break_color = document.getElementById("c_break_color").value;
  c_break = document.getElementById("c_break").checked;
 
  c_plot_size = document.getElementById("c_plot_size").value;
  c_border_size = document.getElementById("c_border_size").value;
  c_border_enabled = document.getElementById("c_border_enabled").checked;
 
  c_bar_classic = document.getElementById("c_bar_classic").checked;
  c_bar_rounded = document.getElementById("c_bar_rounded").checked;
  c_bar_gradient = document.getElementById("c_bar_gradient").checked;
  c_around_zero1 = document.getElementById("c_around_zero1").checked;
 
  c_transparency = document.getElementById("c_transparency").value;
  c_forced_transparency = document.getElementById("c_forced_transparency").checked;
  c_around_zero2 = document.getElementById("c_around_zero2").checked;
 
  URL = "script/session.php?c_family="+c_family+"&c_display_values="+c_display_values+"&c_plot_size="+c_plot_size+"&c_border_size="+c_border_size+"&c_border_enabled="+c_border_enabled
  +"&c_bar_classic="+c_bar_classic+"&c_bar_rounded="+c_bar_rounded+"&c_bar_gradient="+c_bar_gradient+"&c_around_zero1="+c_around_zero1
  +"&c_transparency="+c_transparency+"&c_forced_transparency="+c_forced_transparency+"&c_around_zero2="+c_around_zero2
  +"&c_break="+c_break+"&c_break_color="+c_break_color;
 
  push(URL,4);
  }
 
  function saveLegend()
  {
  document.getElementById("result_area").innerHTML = "<img src='graphix/wait.gif' width='24' height='24' alt=''><br/>Saving configuration (Legend and Thresholds)";
 
  l_enabled = document.getElementById("l_enabled").checked;
 
  l_font = document.getElementById("l_font").options[document.getElementById("l_font").selectedIndex].value;
  l_font_size = document.getElementById("l_font_size").value;
  l_font_color = document.getElementById("l_font_color").value;
 
  l_margin = document.getElementById("l_margin").value;
  l_alpha = document.getElementById("l_alpha").value;
  l_format = document.getElementById("l_format").options[document.getElementById("l_format").selectedIndex].value;
 
  l_orientation = document.getElementById("l_orientation").options[document.getElementById("l_orientation").selectedIndex].value;
  l_box_size = document.getElementById("l_box_size").value;
 
  l_position = document.getElementById("l_position").options[document.getElementById("l_position").selectedIndex].value;
  l_x = document.getElementById("l_x").value;
  l_y = document.getElementById("l_y").value;
 
  l_family = document.getElementById("l_family").options[document.getElementById("l_family").selectedIndex].value;
 
  t_enabled = document.getElementById("t_enabled").checked;
 
  t_value = document.getElementById("t_value").value;
  t_axis0 = document.getElementById("t_axis0").checked;
  t_axis1 = document.getElementById("t_axis1").checked;
  t_axis2 = document.getElementById("t_axis2").checked;
 
  t_color = document.getElementById("t_color").value;
  t_alpha = document.getElementById("t_alpha").value;
  t_ticks = document.getElementById("t_ticks").checked;
 
  t_caption = document.getElementById("t_caption").value;
  t_box = document.getElementById("t_box").checked;
  t_caption_enabled = document.getElementById("t_caption_enabled").checked;
 
  sl_enabled = document.getElementById("sl_enabled").checked;
  sl_shaded = document.getElementById("sl_shaded").checked;
  sl_caption_enabled = document.getElementById("sl_caption_enabled").checked;
  sl_caption_line = document.getElementById("sl_caption_line").checked;
 
  p_template = document.getElementById("p_template").options[document.getElementById("p_template").selectedIndex].value;
 
  if ( t_axis0 ) { t_axis = 0; }
  if ( t_axis1 ) { t_axis = 1; }
  if ( t_axis2 ) { t_axis = 2; }
 
  URL = "script/session.php?l_enabled="+l_enabled+"&l_font="+l_font+"&l_font_size="+l_font_size+"&l_font_color="+l_font_color
  +"&l_margin="+l_margin+"&l_alpha="+l_alpha+"&l_format="+l_format+"&l_orientation="+l_orientation+"&l_box_size="+l_box_size
  +"&t_enabled="+t_enabled+"&t_value="+t_value+"&t_axis="+t_axis+"&t_color="+t_color+"&t_alpha="+t_alpha+"&t_ticks="+t_ticks
  +"&t_caption="+t_caption+"&t_box="+t_box+"&t_caption_enabled="+t_caption_enabled+"&l_position="+l_position+"&l_x="+l_x+"&l_y="+l_y
  +"&p_template="+p_template+"&l_family="+l_family+"&sl_enabled="+sl_enabled+"&sl_shaded="+sl_shaded+"&sl_caption_enabled="+sl_caption_enabled
  +"&sl_caption_line="+sl_caption_line;
 
  push(URL,5);
  }
 
  function randomize()
  {
  for(i=0;i<8;i++)
  {
  document.getElementById("d_serie1_data"+i).value = Math.ceil(Math.random()*100-50);
  document.getElementById("d_serie2_data"+i).value = Math.ceil(Math.random()*100-50);
  document.getElementById("d_serie3_data"+i).value = Math.ceil(Math.random()*100-50);
  }
  }
 
  function setColors()
  {
  applyColor("g_title_color","g_title_color_show");
  applyColor("g_solid_color","g_solid_color_show");
  applyColor("g_gradient_start","g_gradient_start_show");
  applyColor("g_gradient_end","g_gradient_end_show");
  applyColor("s_font_color","s_font_color_show");
  applyColor("s_grid_color","s_grid_color_show");
  applyColor("s_ticks_color","s_ticks_color_show");
  applyColor("s_subticks_color","s_subticks_color_show");
  applyColor("l_font_color","l_font_color_show");
  applyColor("t_color","t_color_show");
  applyColor("c_break_color","c_break_color_show");
  }
 
  function applyColor(SourceID,TargetID)
  {
  color = document.getElementById(SourceID).value;
  color = color.replace("#","");
  document.getElementById(TargetID).style.backgroundColor = "#"+color;
  }
 
  function checkChartSettings()
  {
  ChartFamily = document.getElementById("c_family").options[document.getElementById("c_family").selectedIndex].value;
 
  disableItem("c_plot_size"); disableItem("c_border_size"); disableCheck("c_border_enabled");
  disableRadio("c_bar_classic"); disableRadio("c_bar_rounded"); disableRadio("c_bar_gradient"); disableCheck("c_around_zero1");
  disableItem("c_transparency"); disableCheck("c_forced_transparency"); disableCheck("c_around_zero2");
 
  if ( ChartFamily == "plot" )
  { enableItem("c_plot_size"); enableItem("c_border_size"); enableCheck("c_border_enabled"); checkPlotBorder(); }
 
  if ( ChartFamily == "bar" || ChartFamily == "sbar" )
  { enableRadio("c_bar_classic"); enableRadio("c_bar_rounded"); enableRadio("c_bar_gradient"); enableCheck("c_around_zero1"); }
 
  if ( ChartFamily == "fspline" || ChartFamily == "area" || ChartFamily == "sarea" || ChartFamily == "fstep" )
  { enableItem("c_transparency"); enableCheck("c_forced_transparency"); enableCheck("c_around_zero2"); checkAreaChart(); }
 
  if ( Automatic )
  {
  if ( ChartFamily == "sbar" || ChartFamily == "sarea" )
  document.getElementById("s_mode").value = "SCALE_MODE_ADDALL";
  else
  document.getElementById("s_mode").value = "SCALE_MODE_FLOATING";
  }
  }
 
  function checkLegend()
  {
  l_position = document.getElementById("l_position").options[document.getElementById("l_position").selectedIndex].value;
 
  if ( l_position == "Manual" )
  { enableItem("l_x"); enableItem("l_y"); }
  else
  { disableItem("l_x"); disableItem("l_y"); }
  }
 
  function checkPlotBorder()
  {
  borderEnabled = document.getElementById("c_border_enabled").checked;
  if ( borderEnabled ) { enableItem("c_border_size"); } else { disableItem("c_border_size"); }
  }
 
  function checkAreaChart()
  {
  c_forced_transparency = document.getElementById("c_forced_transparency").checked;
  if ( c_forced_transparency ) { enableItem("c_transparency"); } else { disableItem("c_transparency"); }
  }
 
  function toggleSubTicks()
  {
  if ( !document.getElementById("s_subticks_enabled").checked )
  { disableItem("s_subticks_color"); disableItem("s_subticks_alpha"); }
  else
  { enableItem("s_subticks_color"); enableItem("s_subticks_alpha"); }
  }
 
  function toggleAutoMargins()
  {
  if ( document.getElementById("s_automargin_enabled").checked )
  { disableItem("s_x_margin"); disableItem("s_y_margin"); }
  else
  { enableItem("s_x_margin"); enableItem("s_y_margin"); }
  }
 
  function checkEnabledAxis()
  {
  Serie1Enabled = document.getElementById("d_serie1_enabled").checked;
  Serie2Enabled = document.getElementById("d_serie2_enabled").checked;
  Serie3Enabled = document.getElementById("d_serie3_enabled").checked;
  Serie1Binding = document.getElementById("d_serie1_axis").options[document.getElementById("d_serie1_axis").selectedIndex].value;
  Serie2Binding = document.getElementById("d_serie2_axis").options[document.getElementById("d_serie2_axis").selectedIndex].value;
  Serie3Binding = document.getElementById("d_serie3_axis").options[document.getElementById("d_serie3_axis").selectedIndex].value;
 
  Series = 0;
  if ( Serie1Enabled ) { Series++; }
  if ( Serie2Enabled ) { Series++; }
  if ( Serie3Enabled ) { Series++; }
 
  if ( (Serie1Binding != 0 || !Serie1Enabled) && (Serie2Binding != 0 || !Serie2Enabled) && (Serie3Binding != 0 || !Serie3Enabled) )
  { disableItem("d_axis0_name"); disableItem("d_axis0_unit"); disableItem("d_axis0_position"); disableItem("d_axis0_format"); }
  else
  { enableItem("d_axis0_name"); enableItem("d_axis0_unit"); enableItem("d_axis0_position"); enableItem("d_axis0_format"); }
 
  if ( (Serie1Binding != 1 || !Serie1Enabled) && (Serie2Binding != 1 || !Serie2Enabled) && (Serie3Binding != 1 || !Serie3Enabled) )
  { disableItem("d_axis1_name"); disableItem("d_axis1_unit"); disableItem("d_axis1_position"); disableItem("d_axis1_format"); }
  else
  { enableItem("d_axis1_name"); enableItem("d_axis1_unit"); enableItem("d_axis1_position"); enableItem("d_axis1_format"); }
 
  if ( (Serie1Binding != 2 || !Serie1Enabled) && (Serie2Binding != 2 || !Serie2Enabled) && (Serie3Binding != 2 || !Serie3Enabled) )
  { disableItem("d_axis2_name"); disableItem("d_axis2_unit"); disableItem("d_axis2_position"); disableItem("d_axis2_format"); }
  else
  { enableItem("d_axis2_name"); enableItem("d_axis2_unit"); enableItem("d_axis2_position"); enableItem("d_axis2_format"); }
 
  if ( Automatic )
  {
  sl_enabled = document.getElementById("sl_enabled").checked;
  g_width = document.getElementById("g_width").value;
  g_height = document.getElementById("g_height").value;
  s_direction = document.getElementById("s_direction").options[document.getElementById("s_direction").selectedIndex].value;
 
  leftSeries = 0; rightSeries = 0;
 
  if ( !document.getElementById("d_axis0_position").disabled && document.getElementById("d_axis0_position").options[document.getElementById("d_axis0_position").selectedIndex].value == "left" ) { leftSeries++; }
  if ( !document.getElementById("d_axis0_position").disabled && document.getElementById("d_axis0_position").options[document.getElementById("d_axis0_position").selectedIndex].value == "right" ) { rightSeries++; }
  if ( !document.getElementById("d_axis1_position").disabled && document.getElementById("d_axis1_position").options[document.getElementById("d_axis1_position").selectedIndex].value == "left" ) { leftSeries++; }
  if ( !document.getElementById("d_axis1_position").disabled && document.getElementById("d_axis1_position").options[document.getElementById("d_axis1_position").selectedIndex].value == "right" ) { rightSeries++; }
  if ( !document.getElementById("d_axis2_position").disabled && document.getElementById("d_axis2_position").options[document.getElementById("d_axis2_position").selectedIndex].value == "left" ) { leftSeries++; }
  if ( !document.getElementById("d_axis2_position").disabled && document.getElementById("d_axis2_position").options[document.getElementById("d_axis2_position").selectedIndex].value == "right" ) { rightSeries++; }
 
  if ( s_direction == "SCALE_POS_LEFTRIGHT" )
  {
  if ( leftSeries == 0 ) { leftOffset = 20; } else { leftOffset = 10; }
  if ( rightSeries == 0 ) { rightOffset = 25; } else { rightOffset = 15; }
 
  leftMargin = leftOffset + 40 * leftSeries;
  width = g_width - leftMargin - 40 * rightSeries - rightOffset;
 
  if ( sl_enabled ) { BottomOffset = Series*15; } else { BottomOffset = 0; }
 
  document.getElementById("s_x").value = leftMargin;
  document.getElementById("s_y").value = 50;
  document.getElementById("s_width").value = width;
  document.getElementById("s_height").value = g_height - 50 - 40 - BottomOffset;
  }
  else
  {
  if ( leftSeries == 0 ) { topOffset = 40; } else { topOffset = 40; }
  if ( rightSeries == 0 ) { bottomOffset = 25; } else { bottomOffset = 15; }
 
  topMargin = topOffset + 30 * leftSeries;
  height = g_height - topMargin - 30 * rightSeries - bottomOffset;
 
  if ( sl_enabled ) { RightOffset = Series*15; } else { RightBottomOffset = 0; }
 
  document.getElementById("s_x").value = 70;
  document.getElementById("s_y").value = topMargin;
  document.getElementById("s_width").value = g_width - 70 - 40 - RightOffset;
  document.getElementById("s_height").value = height;
  }
  }
  }
 
  function disableItem(ID)
  {
  document.getElementById(ID).style.backgroundColor = "#E0E0E0";
  document.getElementById(ID).style.color = "#A0A0A0";
  document.getElementById(ID).disabled = true;
  }
 
  function disableCheck(ID)
  {
  document.getElementById(ID).style.color = "#A0A0A0";
  document.getElementById(ID).disabled = true;
  }
 
  function disableRadio(ID)
  {
  document.getElementById(ID).disabled = true;
  }
 
  function enableItem(ID)
  {
  document.getElementById(ID).style.backgroundColor = "#FFFFFF";
  document.getElementById(ID).style.color = "#707070";
  document.getElementById(ID).disabled = false;
  }
 
  function enableCheck(ID)
  {
  document.getElementById(ID).style.color = "#707070";
  document.getElementById(ID).disabled = false;
  }
 
  function enableRadio(ID)
  {
  document.getElementById(ID).disabled = false;
  }
 
  function setDefaultAbsissa()
  {
  document.getElementById("d_absissa_data0").value = "January";
  document.getElementById("d_absissa_data1").value = "February";
  document.getElementById("d_absissa_data2").value = "March";
  document.getElementById("d_absissa_data3").value = "April";
  document.getElementById("d_absissa_data4").value = "May";
  document.getElementById("d_absissa_data5").value = "June";
  document.getElementById("d_absissa_data6").value = "July";
  document.getElementById("d_absissa_data7").value = "August";
  }
 
  function push(URL,nextStep)
  {
  var xmlhttp=false;
  /*@cc_on @*/
  /*@if (@_jscript_version >= 5)
  try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } }
  @end @*/
 
  if (!xmlhttp && typeof XMLHttpRequest!='undefined')
  { try { xmlhttp = new XMLHttpRequest(); } catch (e) { xmlhttp=false; } }
 
  if (!xmlhttp && window.createRequest)
  { try { xmlhttp = window.createRequest(); } catch (e) { xmlhttp=false; } }
 
  xmlhttp.open("GET", URL,true);
 
  xmlhttp.onreadystatechange=function() {
  if (xmlhttp.readyState==4)
  {
  if ( nextStep == 1 ) { saveData(); }
  if ( nextStep == 2 ) { saveScale(); }
  if ( nextStep == 3 ) { saveChart(); }
  if ( nextStep == 4 ) { saveLegend(); }
  if ( nextStep == 5 )
  {
  if ( Action == "Render" )
  doRender();
  else
  push("script/render.php?Mode=Source&Seed="+Math.random(100),6);
  }
  if ( nextStep == 6 )
  {
  document.getElementById("result_area").innerHTML = "<pre name='code'>"+xmlhttp.responseText+"</pre>";
  }
  }
  }
  xmlhttp.send(null)
  }
 
  function doRender()
  {
  document.getElementById("result_area").innerHTML = "<img src='graphix/wait.gif' width='24' height='24' alt=''><br/>Rendering";
 
  RandomKey = Math.random(100);
  URL = "script/render.php?Seed=" + RandomKey;
 
  StartFade();
  }
 
  function StartFade()
  {
  Loader = new Image();
  Loader.src = URL;
  setTimeout("CheckLoadingStatus()", 200);
  }
 
  function CheckLoadingStatus()
  {
  if ( Loader.complete == true )
  {
  changeOpac(0, "result_area");
  HTMLResult = "<center><img src='" + URL + "' alt=''/></center>";
  document.getElementById("result_area").innerHTML = HTMLResult;
 
  opacity("result_area",0,100,500);
  }
  else
  setTimeout("CheckLoadingStatus()", 200);
  }
 
  function changeOpac(opacity, id)
  {
  var object = document.getElementById(id).style;
  object.opacity = (opacity / 100);
  object.MozOpacity = (opacity / 100);
  object.KhtmlOpacity = (opacity / 100);
  object.filter = "alpha(opacity=" + opacity + ")";
  }
 
  function opacity(id, opacStart, opacEnd, millisec)
  {
  var speed = Math.round(millisec / 100);
  var timer = 0;
 
  if(opacStart > opacEnd)
  {
  for(i = opacStart; i >= opacEnd; i--)
  {
  setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
  timer++;
  }
  }
  else if(opacStart < opacEnd)
  {
  for(i = opacStart; i <= opacEnd; i++)
  {
  setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
  timer++;
  }
  }
  }
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/includes/hs.png differ
 Binary files /dev/null and b/lib/pChart2.1.0/examples/sandbox/includes/hv.png differ
  /**
  * jscolor, JavaScript Color Picker
  *
  * @version 1.3.1
  * @license GNU Lesser General Public License, http://www.gnu.org/copyleft/lesser.html
  * @author Jan Odvarko, http://odvarko.cz
  * @created 2008-06-15
  * @updated 2010-01-23
  * @link http://jscolor.com
  */
 
 
  var jscolor = {
 
 
  dir : '', // location of jscolor directory (leave empty to autodetect)
  bindClass : 'color', // class name
  binding : true, // automatic binding via <input class="...">
  preloading : true, // use image preloading?
 
 
  install : function() {
  jscolor.addEvent(window, 'load', jscolor.init);
  },
 
 
  init : function() {
  if(jscolor.binding) {
  jscolor.bind();
  }
  if(jscolor.preloading) {
  jscolor.preload();
  }
  },
 
 
  getDir : function() {
  if(!jscolor.dir) {
  var detected = jscolor.detectDir();
  jscolor.dir = detected!==false ? detected : 'jscolor/';
  }
  return jscolor.dir;
  },
 
 
  detectDir : function() {
  var base = location.href;
 
  var e = document.getElementsByTagName('base');
  for(var i=0; i<e.length; i+=1) {
  if(e[i].href) { base = e[i].href; }
  }
 
  var e = document.getElementsByTagName('script');
  for(var i=0; i<e.length; i+=1) {
  if(e[i].src && /(^|\/)jscolor\.js([?#].*)?$/i.test(e[i].src)) {
  var src = new jscolor.URI(e[i].src);
  var srcAbs = src.toAbsolute(base);
  srcAbs.path = srcAbs.path.replace(/[^\/]+$/, ''); // remove filename
  srcAbs.query = null;
  srcAbs.fragment = null;
  return srcAbs.toString();
  }
  }
  return false;
  },
 
 
  bind : function() {
  var matchClass = new RegExp('(^|\\s)('+jscolor.bindClass+')\\s*(\\{[^}]*\\})?', 'i');
  var e = document.getElementsByTagName('input');
  for(var i=0; i<e.length; i+=1) {
  var m;
  if(!e[i].color && e[i].className && (m = e[i].className.match(matchClass))) {
  var prop = {};
  if(m[3]) {
  try {
  eval('prop='+m[3]);
  } catch(eInvalidProp) {}
  }
  e[i].color = new jscolor.color(e[i], prop);
  }
  }
  },
 
 
  preload : function() {
  for(var fn in jscolor.imgRequire) {
  if(jscolor.imgRequire.hasOwnProperty(fn)) {
  jscolor.loadImage(fn);
  }
  }
  },
 
 
  images : {
  pad : [ 181, 101 ],
  sld : [ 16, 101 ],
  cross : [ 15, 15 ],
  arrow : [ 7, 11 ]
  },
 
 
  imgRequire : {},
  imgLoaded : {},
 
 
  requireImage : function(filename) {
  jscolor.imgRequire[filename] = true;
  },
 
 
  loadImage : function(filename) {
  if(!jscolor.imgLoaded[filename]) {
  jscolor.imgLoaded[filename] = new Image();
  jscolor.imgLoaded[filename].src = jscolor.getDir()+filename;
  }
  },
 
 
  fetchElement : function(mixed) {
  return typeof mixed === 'string' ? document.getElementById(mixed) : mixed;
  },
 
 
  addEvent : function(el, evnt, func) {
  if(el.addEventListener) {
  el.addEventListener(evnt, func, false);
  } else if(el.attachEvent) {
  el.attachEvent('on'+evnt, func);
  }
  },
 
 
  fireEvent : function(el, evnt) {
  if(!el) {
  return;
  }
  if(document.createEventObject) {
  var ev = document.createEventObject();
  el.fireEvent('on'+evnt, ev);
  } else if(document.createEvent) {
  var ev = document.createEvent('HTMLEvents');
  ev.initEvent(evnt, true, true);
  el.dispatchEvent(ev);
  } else if(el['on'+evnt]) { // alternatively use the traditional event model (IE5)
  el['on'+evnt]();
  }
  },
 
 
  getElementPos : function(e) {
  var e1=e, e2=e;
  var x=0, y=0;
  if(e1.offsetParent) {
  do {
  x += e1.offsetLeft;
  y += e1.offsetTop;
  } while(e1 = e1.offsetParent);
  }
  while((e2 = e2.parentNode) && e2.nodeName.toUpperCase() !== 'BODY') {
  x -= e2.scrollLeft;
  y -= e2.scrollTop;
  }
  return [x, y];
  },
 
 
  getElementSize : function(e) {
  return [e.offsetWidth, e.offsetHeight];
  },
 
 
  getMousePos : function(e) {
  if(!e) { e = window.event; }
  if(typeof e.pageX === 'number') {
  return [e.pageX, e.pageY];
  } else if(typeof e.clientX === 'number') {
  return [
  e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft,
  e.clientY + document.body.scrollTop + document.documentElement.scrollTop
  ];
  }
  },
 
 
  getViewPos : function() {
  if(typeof window.pageYOffset === 'number') {
  return [window.pageXOffset, window.pageYOffset];
  } else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) {
  return [document.body.scrollLeft, document.body.scrollTop];
  } else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
  return [document.documentElement.scrollLeft, document.documentElement.scrollTop];
  } else {
  return [0, 0];
  }
  },
 
 
  getViewSize : function() {
  if(typeof window.innerWidth === 'number') {
  return [window.innerWidth, window.innerHeight];
  } else if(document.body && (document.body.clientWidth || document.body.clientHeight)) {
  return [document.body.clientWidth, document.body.clientHeight];
  } else if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
  return [document.documentElement.clientWidth, document.documentElement.clientHeight];
  } else {
  return [0, 0];
  }
  },
 
 
  URI : function(uri) { // See RFC3986
 
  this.scheme = null;
  this.authority = null;
  this.path = '';
  this.query = null;
  this.fragment = null;
 
  this.parse = function(uri) {
  var m = uri.match(/^(([A-Za-z][0-9A-Za-z+.-]*)(:))?((\/\/)([^\/?#]*))?([^?#]*)((\?)([^#]*))?((#)(.*))?/);
  this.scheme = m[3] ? m[2] : null;
  this.authority = m[5] ? m[6] : null;
  this.path = m[7];
  this.query = m[9] ? m[10] : null;
  this.fragment = m[12] ? m[13] : null;
  return this;
  };
 
  this.toString = function() {
  var result = '';
  if(this.scheme !== null) { result = result + this.scheme + ':'; }
  if(this.authority !== null) { result = result + '//' + this.authority; }
  if(this.path !== null) { result = result + this.path; }
  if(this.query !== null) { result = result + '?' + this.query; }
  if(this.fragment !== null) { result = result + '#' + this.fragment; }
  return result;
  };
 
  this.toAbsolute = function(base) {
  var base = new jscolor.URI(base);
  var r = this;
  var t = new jscolor.URI;
 
  if(base.scheme === null) { return false; }
 
  if(r.scheme !== null && r.scheme.toLowerCase() === base.scheme.toLowerCase()) {
  r.scheme = null;
  }
 
  if(r.scheme !== null) {
  t.scheme = r.scheme;
  t.authority = r.authority;
  t.path = removeDotSegments(r.path);
  t.query = r.query;
  } else {
  if(r.authority !== null) {
  t.authority = r.authority;
  t.path = removeDotSegments(r.path);
  t.query = r.query;
  } else {
  if(r.path === '') { // TODO: == or === ?
  t.path = base.path;
  if(r.query !== null) {
  t.query = r.query;
  } else {
  t.query = base.query;
  }
  } else {
  if(r.path.substr(0,1) === '/') {
  t.path = removeDotSegments(r.path);
  } else {
  if(base.authority !== null && base.path === '') { // TODO: == or === ?
  t.path = '/'+r.path;
  } else {
  t.path = base.path.replace(/[^\/]+$/,'')+r.path;
  }
  t.path = removeDotSegments(t.path);
  }
  t.query = r.query;
  }
  t.authority = base.authority;
  }
  t.scheme = base.scheme;
  }
  t.fragment = r.fragment;
 
  return t;
  };
 
  function removeDotSegments(path) {
  var out = '';
  while(path) {
  if(path.substr(0,3)==='../' || path.substr(0,2)==='./') {
  path = path.replace(/^\.+/,'').substr(1);
  } else if(path.substr(0,3)==='/./' || path==='/.') {
  path = '/'+path.substr(3);
  } else if(path.substr(0,4)==='/../' || path==='/..') {
  path = '/'+path.substr(4);
  out = out.replace(/\/?[^\/]*$/, '');
  } else if(path==='.' || path==='..') {
  path = '';
  } else {
  var rm = path.match(/^\/?[^\/]*/)[0];
  path = path.substr(rm.length);
  out = out + rm;
  }
  }
  return out;
  }
 
  if(uri) {
  this.parse(uri);
  }
 
  },
 
 
  /*
  * Usage example:
  * var myColor = new jscolor.color(myInputElement)
  */
 
  color : function(target, prop) {
 
 
  this.required = true; // refuse empty values?
  this.adjust = true; // adjust value to uniform notation?
  this.hash = false; // prefix color with # symbol?
  this.caps = true; // uppercase?
  this.valueElement = target; // value holder
  this.styleElement = target; // where to reflect current color
  this.hsv = [0, 0, 1]; // read-only 0-6, 0-1, 0-1
  this.rgb = [1, 1, 1]; // read-only 0-1, 0-1, 0-1
 
  this.pickerOnfocus = true; // display picker on focus?
  this.pickerMode = 'HSV'; // HSV | HVS
  this.pickerPosition = 'bottom'; // left | right | top | bottom
  this.pickerFace = 10; // px
  this.pickerFaceColor = 'ThreeDFace'; // CSS color
  this.pickerBorder = 1; // px
  this.pickerBorderColor = 'ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight'; // CSS color
  this.pickerInset = 1; // px
  this.pickerInsetColor = 'ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow'; // CSS color
  this.pickerZIndex = 10000;
 
 
  for(var p in prop) {
  if(prop.hasOwnProperty(p)) {
  this[p] = prop[p];
  }
  }
 
 
  this.hidePicker = function() {
  if(isPickerOwner()) {
  removePicker();
  }
  };
 
 
  this.showPicker = function() {
  if(!isPickerOwner()) {
  var tp = jscolor.getElementPos(target); // target pos
  var ts = jscolor.getElementSize(target); // target size
  var vp = jscolor.getViewPos(); // view pos
  var vs = jscolor.getViewSize(); // view size
  var ps = [ // picker size
  2*this.pickerBorder + 4*this.pickerInset + 2*this.pickerFace + jscolor.images.pad[0] + 2*jscolor.images.arrow[0] + jscolor.images.sld[0],
  2*this.pickerBorder + 2*this.pickerInset + 2*this.pickerFace + jscolor.images.pad[1]
  ];
  var a, b, c;
  switch(this.pickerPosition.toLowerCase()) {
  case 'left': a=1; b=0; c=-1; break;
  case 'right':a=1; b=0; c=1; break;
  case 'top': a=0; b=1; c=-1; break;
  default: a=0; b=1; c=1; break;
  }
  var l = (ts[b]+ps[b])/2;
  var pp = [ // picker pos
  -vp[a]+tp[a]+ps[a] > vs[a] ?
  (-vp[a]+tp[a]+ts[a]/2 > vs[a]/2 && tp[a]+ts[a]-ps[a] >= 0 ? tp[a]+ts[a]-ps[a] : tp[a]) :
  tp[a],
  -vp[b]+tp[b]+ts[b]+ps[b]-l+l*c > vs[b] ?
  (-vp[b]+tp[b]+ts[b]/2 > vs[b]/2 && tp[b]+ts[b]-l-l*c >= 0 ? tp[b]+ts[b]-l-l*c : tp[b]+ts[b]-l+l*c) :
  (tp[b]+ts[b]-l+l*c >= 0 ? tp[b]+ts[b]-l+l*c : tp[b]+ts[b]-l-l*c)
  ];
  drawPicker(pp[a], pp[b]);
  }
  };
 
 
  this.importColor = function() {
  if(!valueElement) {
  this.exportColor();
  } else {
  if(!this.adjust) {
  if(!this.fromString(valueElement.value, leaveValue)) {
  styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor;
  styleElement.style.color = styleElement.jscStyle.color;
  this.exportColor(leaveValue | leaveStyle);
  }
  } else if(!this.required && /^\s*$/.test(valueElement.value)) {
  valueElement.value = '';
  styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor;
  styleElement.style.color = styleElement.jscStyle.color;
  this.exportColor(leaveValue | leaveStyle);
 
  } else if(this.fromString(valueElement.value)) {
  // OK
  } else {
  this.exportColor();
  }
  }
  };
 
 
  this.exportColor = function(flags) {
  if(!(flags & leaveValue) && valueElement) {
  var value = this.toString();
  if(this.caps) { value = value.toUpperCase(); }
  if(this.hash) { value = '#'+value; }
  valueElement.value = value;
  }
  if(!(flags & leaveStyle) && styleElement) {
  /*
  styleElement.style.backgroundColor = '#'+this.toString();
  styleElement.style.color =
  0.213 * this.rgb[0] +
  0.715 * this.rgb[1] +
  0.072 * this.rgb[2]
  < 0.5 ? '#FFF' : '#000';
  */
  }
  if(!(flags & leavePad) && isPickerOwner()) {
  redrawPad();
  }
  if(!(flags & leaveSld) && isPickerOwner()) {
  redrawSld();
  }
  };
 
 
  this.fromHSV = function(h, s, v, flags) { // null = don't change
  h<0 && (h=0) || h>6 && (h=6);
  s<0 && (s=0) || s>1 && (s=1);
  v<0 && (v=0) || v>1 && (v=1);
  this.rgb = HSV_RGB(
  h===null ? this.hsv[0] : (this.hsv[0]=h),
  s===null ? this.hsv[1] : (this.hsv[1]=s),
  v===null ? this.hsv[2] : (this.hsv[2]=v)
  );
  this.exportColor(flags);
  };
 
 
  this.fromRGB = function(r, g, b, flags) { // null = don't change
  r<0 && (r=0) || r>1 && (r=1);
  g<0 && (g=0) || g>1 && (g=1);
  b<0 && (b=0) || b>1 && (b=1);
  var hsv = RGB_HSV(
  r===null ? this.rgb[0] : (this.rgb[0]=r),
  g===null ? this.rgb[1] : (this.rgb[1]=g),
  b===null ? this.rgb[2] : (this.rgb[2]=b)
  );
  if(hsv[0] !== null) {
  this.hsv[0] = hsv[0];
  }
  if(hsv[2] !== 0) {
  this.hsv[1] = hsv[1];
  }
  this.hsv[2] = hsv[2];
  this.exportColor(flags);
  };
 
 
  this.fromString = function(hex, flags) {
  var m = hex.match(/^\W*([0-9A-F]{3}([0-9A-F]{3})?)\W*$/i);
  if(!m) {
  return false;
  } else {
  if(m[1].length === 6) { // 6-char notation
  this.fromRGB(
  parseInt(m[1].substr(0,2),16) / 255,
  parseInt(m[1].substr(2,2),16) / 255,
  parseInt(m[1].substr(4,2),16) / 255,
  flags
  );
  } else { // 3-char notation
  this.fromRGB(
  parseInt(m[1].charAt(0)+m[1].charAt(0),16) / 255,
  parseInt(m[1].charAt(1)+m[1].charAt(1),16) / 255,
  parseInt(m[1].charAt(2)+m[1].charAt(2),16) / 255,
  flags
  );
  }
  return true;
  }
  };
 
 
  this.toString = function() {
  return (
  (0x100 | Math.round(255*this.rgb[0])).toString(16).substr(1) +
  (0x100 | Math.round(255*this.rgb[1])).toString(16).substr(1) +
  (0x100 | Math.round(255*this.rgb[2])).toString(16).substr(1)
  );
  };
 
 
  function RGB_HSV(r, g, b) {
  var n = Math.min(Math.min(r,g),b);
  var v = Math.max(Math.max(r,g),b);
  var m = v - n;
  if(m === 0) { return [ null, 0, v ]; }
  var h = r===n ? 3+(b-g)/m : (g===n ? 5+(r-b)/m : 1+(g-r)/m);
  return [ h===6?0:h, m/v, v ];
  }
 
 
  function HSV_RGB(h, s, v) {
  if(h === null) { return [ v, v, v ]; }
  var i = Math.floor(h);
  var f = i%2 ? h-i : 1-(h-i);
  var m = v * (1 - s);
  var n = v * (1 - s*f);
  switch(i) {
  case 6:
  case 0: return [v,n,m];
  case 1: return [n,v,m];
  case 2: return [m,v,n];
  case 3: return [m,n,v];
  case 4: return [n,m,v];
  case 5: return [v,m,n];
  }
  }
 
 
  function removePicker() {
  delete jscolor.picker.owner;
  document.getElementsByTagName('body')[0].removeChild(jscolor.picker.boxB);
  }
 
 
  function drawPicker(x, y) {
  if(!jscolor.picker) {
  jscolor.picker = {
  box : document.createElement('div'),
  boxB : document.createElement('div'),
  pad : document.createElement('div'),
  padB : document.createElement('div'),
  padM : document.createElement('div'),
  sld : document.createElement('div'),
  sldB : document.createElement('div'),
  sldM : document.createElement('div')
  };
  for(var i=0,segSize=4; i<jscolor.images.sld[1]; i+=segSize) {
  var seg = document.createElement('div');
  seg.style.height = segSize+'px';
  seg.style.fontSize = '1px';
  seg.style.lineHeight = '0';
  jscolor.picker.sld.appendChild(seg);
  }
  jscolor.picker.sldB.appendChild(jscolor.picker.sld);
  jscolor.picker.box.appendChild(jscolor.picker.sldB);
  jscolor.picker.box.appendChild(jscolor.picker.sldM);
  jscolor.picker.padB.appendChild(jscolor.picker.pad);
  jscolor.picker.box.appendChild(jscolor.picker.padB);
  jscolor.picker.box.appendChild(jscolor.picker.padM);
  jscolor.picker.boxB.appendChild(jscolor.picker.box);
  }
 
  var p = jscolor.picker;
 
  // recompute controls positions
  posPad = [
  x+THIS.pickerBorder+THIS.pickerFace+THIS.pickerInset,
  y+THIS.pickerBorder+THIS.pickerFace+THIS.pickerInset ];
  posSld = [
  null,
  y+THIS.pickerBorder+THIS.pickerFace+THIS.pickerInset ];
 
  // controls interaction
  p.box.onmouseup =
  p.box.onmouseout = function() { target.focus(); };
  p.box.onmousedown = function() { abortBlur=true; };
  p.box.onmousemove = function(e) { holdPad && setPad(e); holdSld && setSld(e); };
  p.padM.onmouseup =
  p.padM.onmouseout = function() { if(holdPad) { holdPad=false; jscolor.fireEvent(valueElement,'change'); } };
  p.padM.onmousedown = function(e) { holdPad=true; setPad(e); };
  p.sldM.onmouseup =
  p.sldM.onmouseout = function() { if(holdSld) { holdSld=false; jscolor.fireEvent(valueElement,'change'); } };
  p.sldM.onmousedown = function(e) { holdSld=true; setSld(e); };
 
  // picker
  p.box.style.width = 4*THIS.pickerInset + 2*THIS.pickerFace + jscolor.images.pad[0] + 2*jscolor.images.arrow[0] + jscolor.images.sld[0] + 'px';
  p.box.style.height = 2*THIS.pickerInset + 2*THIS.pickerFace + jscolor.images.pad[1] + 'px';
 
  // picker border
  p.boxB.style.position = 'absolute';
  p.boxB.style.clear = 'both';
  p.boxB.style.left = x+'px';
  p.boxB.style.top = y+'px';
  p.boxB.style.zIndex = THIS.pickerZIndex;
  p.boxB.style.border = THIS.pickerBorder+'px solid';
  p.boxB.style.borderColor = THIS.pickerBorderColor;
  p.boxB.style.background = THIS.pickerFaceColor;
 
  // pad image
  p.pad.style.width = jscolor.images.pad[0]+'px';
  p.pad.style.height = jscolor.images.pad[1]+'px';
 
  // pad border
  p.padB.style.position = 'absolute';
  p.padB.style.left = THIS.pickerFace+'px';
  p.padB.style.top = THIS.pickerFace+'px';
  p.padB.style.border = THIS.pickerInset+'px solid';
  p.padB.style.borderColor = THIS.pickerInsetColor;
 
  // pad mouse area
  p.padM.style.position = 'absolute';
  p.padM.style.left = '0';
  p.padM.style.top = '0';
  p.padM.style.width = THIS.pickerFace + 2*THIS.pickerInset + jscolor.images.pad[0] + jscolor.images.arrow[0] + 'px';
  p.padM.style.height = p.box.style.height;
  p.padM.style.cursor = 'crosshair';
 
  // slider image
  p.sld.style.overflow = 'hidden';
  p.sld.style.width = jscolor.images.sld[0]+'px';
  p.sld.style.height = jscolor.images.sld[1]+'px';
 
  // slider border
  p.sldB.style.position = 'absolute';
  p.sldB.style.right = THIS.pickerFace+'px';
  p.sldB.style.top = THIS.pickerFace+'px';
  p.sldB.style.border = THIS.pickerInset+'px solid';
  p.sldB.style.borderColor = THIS.pickerInsetColor;
 
  // slider mouse area
  p.sldM.style.position = 'absolute';
  p.sldM.style.right = '0';
  p.sldM.style.top = '0';
  p.sldM.style.width = jscolor.images.sld[0] + jscolor.images.arrow[0] + THIS.pickerFace + 2*THIS.pickerInset + 'px';
  p.sldM.style.height = p.box.style.height;
  try {
  p.sldM.style.cursor = 'pointer';
  } catch(eOldIE) {
  p.sldM.style.cursor = 'hand';
  }
 
  // load images in optimal order
  switch(modeID) {
  case 0: var padImg = 'hs.png'; break;
  case 1: var padImg = 'hv.png'; break;
  }
  p.padM.style.background = "url('"+jscolor.getDir()+"cross.gif') no-repeat";
  p.sldM.style.background = "url('"+jscolor.getDir()+"arrow.gif') no-repeat";
  p.pad.style.background = "url('"+jscolor.getDir()+padImg+"') 0 0 no-repeat";
 
  // place pointers
  redrawPad();
  redrawSld();
 
  jscolor.picker.owner = THIS;
  document.getElementsByTagName('body')[0].appendChild(p.boxB);
  }
 
 
  function redrawPad() {
  // redraw the pad pointer
  switch(modeID) {
  case 0: var yComponent = 1; break;
  case 1: var yComponent = 2; break;
  }
  var x = Math.round((THIS.hsv[0]/6) * (jscolor.images.pad[0]-1));
  var y = Math.round((1-THIS.hsv[yComponent]) * (jscolor.images.pad[1]-1));
  jscolor.picker.padM.style.backgroundPosition =
  (THIS.pickerFace+THIS.pickerInset+x - Math.floor(jscolor.images.cross[0]/2)) + 'px ' +
  (THIS.pickerFace+THIS.pickerInset+y - Math.floor(jscolor.images.cross[1]/2)) + 'px';
 
  // redraw the slider image
  var seg = jscolor.picker.sld.childNodes;
 
  switch(modeID) {
  case 0:
  var rgb = HSV_RGB(THIS.hsv[0], THIS.hsv[1], 1);
  for(var i=0; i<seg.length; i+=1) {
  seg[i].style.backgroundColor = 'rgb('+
  (rgb[0]*(1-i/seg.length)*100)+'%,'+
  (rgb[1]*(1-i/seg.length)*100)+'%,'+
  (rgb[2]*(1-i/seg.length)*100)+'%)';
  }
  break;
  case 1:
  var rgb, s, c = [ THIS.hsv[2], 0, 0 ];
  var i = Math.floor(THIS.hsv[0]);
  var f = i%2 ? THIS.hsv[0]-i : 1-(THIS.hsv[0]-i);
  switch(i) {
  case 6:
  case 0: rgb=[0,1,2]; break;
  case 1: rgb=[1,0,2]; break;
  case 2: rgb=[2,0,1]; break;
  case 3: rgb=[2,1,0]; break;
  case 4: rgb=[1,2,0]; break;
  case 5: rgb=[0,2,1]; break;
  }
  for(var i=0; i<seg.length; i+=1) {
  s = 1 - 1/(seg.length-1)*i;
  c[1] = c[0] * (1 - s*f);
  c[2] = c[0] * (1 - s);
  seg[i].style.backgroundColor = 'rgb('+
  (c[rgb[0]]*100)+'%,'+
  (c[rgb[1]]*100)+'%,'+
  (c[rgb[2]]*100)+'%)';
  }
  break;
  }
  }
 
 
  function redrawSld() {
  // redraw the slider pointer
  switch(modeID) {
  case 0: var yComponent = 2; break;
  case 1: var yComponent = 1; break;
  }
  var y = Math.round((1-THIS.hsv[yComponent]) * (jscolor.images.sld[1]-1));
  jscolor.picker.sldM.style.backgroundPosition =
  '0 ' + (THIS.pickerFace+THIS.pickerInset+y - Math.floor(jscolor.images.arrow[1]/2)) + 'px';
  }
 
 
  function isPickerOwner() {
  return jscolor.picker && jscolor.picker.owner === THIS;
  }
 
 
  function blurTarget() {
  if(valueElement === target) {
  THIS.importColor();
  }
  if(THIS.pickerOnfocus) {
  THIS.hidePicker();
  }
  }
 
 
  function blurValue() {
  if(valueElement !== target) {
  THIS.importColor();
  }
  }
 
 
  function setPad(e) {
  var posM = jscolor.getMousePos(e);
  var x = posM[0]-posPad[0];
  var y = posM[1]-posPad[1];
  switch(modeID) {
  case 0: THIS.fromHSV(x*(6/(jscolor.images.pad[0]-1)), 1 - y/(jscolor.images.pad[1]-1), null, leaveSld); break;
  case 1: THIS.fromHSV(x*(6/(jscolor.images.pad[0]-1)), null, 1 - y/(jscolor.images.pad[1]-1), leaveSld); break;
  }
  }
 
 
  function setSld(e) {
  var posM = jscolor.getMousePos(e);
  var y = posM[1]-posPad[1];
  switch(modeID) {
  case 0: THIS.fromHSV(null, null, 1 - y/(jscolor.images.sld[1]-1), leavePad); break;
  case 1: THIS.fromHSV(null, 1 - y/(jscolor.images.sld[1]-1), null, leavePad); break;
  }
  }
 
 
  var THIS = this;
  var modeID = this.pickerMode.toLowerCase()==='hvs' ? 1 : 0;
  var abortBlur = false;
  var
  valueElement = jscolor.fetchElement(this.valueElement),
  styleElement = jscolor.fetchElement(this.styleElement);
  var
  holdPad = false,
  holdSld = false;
  var
  posPad,
  posSld;
  var
  leaveValue = 1<<0,
  leaveStyle = 1<<1,
  leavePad = 1<<2,
  leaveSld = 1<<3;
 
  // target
  jscolor.addEvent(target, 'focus', function() {
  if(THIS.pickerOnfocus) { THIS.showPicker(); }
  });
  jscolor.addEvent(target, 'blur', function() {
  if(!abortBlur) {
  window.setTimeout(function(){ abortBlur || blurTarget(); abortBlur=false; }, 0);
  } else {
  abortBlur = false;
  }
  });
 
  // valueElement
  if(valueElement) {
  var updateField = function() {
  THIS.fromString(valueElement.value, leaveValue);
  };
  jscolor.addEvent(valueElement, 'keyup', updateField);
  jscolor.addEvent(valueElement, 'input', updateField);
  jscolor.addEvent(valueElement, 'blur', blurValue);
  valueElement.setAttribute('autocomplete', 'off');
  }
 
  // styleElement
  if(styleElement) {
  styleElement.jscStyle = {
  backgroundColor : styleElement.style.backgroundColor,
  color : styleElement.style.color
  };
  }
 
  // require images
  switch(modeID) {
  case 0: jscolor.requireImage('hs.png'); break;
  case 1: jscolor.requireImage('hv.png'); break;
  }
  jscolor.requireImage('cross.gif');
  jscolor.requireImage('arrow.gif');
 
  this.importColor();
  }
 
  };
 
 
  jscolor.install();
 
 
  /****************************************************************
  * *
  * curvyCorners *
  * ------------ *
  * *
  * This script generates rounded corners for your divs. *
  * *
  * Version 1.2.9 *
  * Copyright (c) 2006 Cameron Cooke *
  * By: Cameron Cooke and Tim Hutchison. *
  * *
  * *
  * Website: http://www.curvycorners.net *
  * Email: info@totalinfinity.com *
  * Forum: http://www.curvycorners.net/forum/ *
  * *
  * *
  * This library is free software; you can redistribute *
  * it and/or modify it under the terms of the GNU *
  * Lesser General Public License as published by the *
  * Free Software Foundation; either version 2.1 of the *
  * License, or (at your option) any later version. *
  * *
  * This library is distributed in the hope that it will *
  * be useful, but WITHOUT ANY WARRANTY; without even the *
  * implied warranty of MERCHANTABILITY or FITNESS FOR A *
  * PARTICULAR PURPOSE. See the GNU Lesser General Public *
  * License for more details. *
  * *
  * You should have received a copy of the GNU Lesser *
  * General Public License along with this library; *
  * Inc., 59 Temple Place, Suite 330, Boston, *
  * MA 02111-1307 USA *
  * *
  ****************************************************************/
 
  var isIE = navigator.userAgent.toLowerCase().indexOf("msie") > -1; var isMoz = document.implementation && document.implementation.createDocument; var isSafari = ((navigator.userAgent.toLowerCase().indexOf('safari')!=-1)&&(navigator.userAgent.toLowerCase().indexOf('mac')!=-1))?true:false; function curvyCorners()
  { if(typeof(arguments[0]) != "object") throw newCurvyError("First parameter of curvyCorners() must be an object."); if(typeof(arguments[1]) != "object" && typeof(arguments[1]) != "string") throw newCurvyError("Second parameter of curvyCorners() must be an object or a class name."); if(typeof(arguments[1]) == "string")
  { var startIndex = 0; var boxCol = getElementsByClass(arguments[1]);}
  else
  { var startIndex = 1; var boxCol = arguments;}
  var curvyCornersCol = new Array(); if(arguments[0].validTags)
  var validElements = arguments[0].validTags; else
  var validElements = ["div"]; for(var i = startIndex, j = boxCol.length; i < j; i++)
  { var currentTag = boxCol[i].tagName.toLowerCase(); if(inArray(validElements, currentTag) !== false)
  { curvyCornersCol[curvyCornersCol.length] = new curvyObject(arguments[0], boxCol[i]);}
  }
  this.objects = curvyCornersCol; this.applyCornersToAll = function()
  { for(var x = 0, k = this.objects.length; x < k; x++)
  { this.objects[x].applyCorners();}
  }
  }
  function curvyObject()
  { this.box = arguments[1]; this.settings = arguments[0]; this.topContainer = null; this.bottomContainer = null; this.masterCorners = new Array(); this.contentDIV = null; var boxHeight = get_style(this.box, "height", "height"); var boxWidth = get_style(this.box, "width", "width"); var borderWidth = get_style(this.box, "borderTopWidth", "border-top-width"); var borderColour = get_style(this.box, "borderTopColor", "border-top-color"); var boxColour = get_style(this.box, "backgroundColor", "background-color"); var backgroundImage = get_style(this.box, "backgroundImage", "background-image"); var boxPosition = get_style(this.box, "position", "position"); var boxPadding = get_style(this.box, "paddingTop", "padding-top"); this.boxHeight = parseInt(((boxHeight != "" && boxHeight != "auto" && boxHeight.indexOf("%") == -1)? boxHeight.substring(0, boxHeight.indexOf("px")) : this.box.scrollHeight)); this.boxWidth = parseInt(((boxWidth != "" && boxWidth != "auto" && boxWidth.indexOf("%") == -1)? boxWidth.substring(0, boxWidth.indexOf("px")) : this.box.scrollWidth)); this.borderWidth = parseInt(((borderWidth != "" && borderWidth.indexOf("px") !== -1)? borderWidth.slice(0, borderWidth.indexOf("px")) : 0)); this.boxColour = format_colour(boxColour); this.boxPadding = parseInt(((boxPadding != "" && boxPadding.indexOf("px") !== -1)? boxPadding.slice(0, boxPadding.indexOf("px")) : 0)); this.borderColour = format_colour(borderColour); this.borderString = this.borderWidth + "px" + " solid " + this.borderColour; this.backgroundImage = ((backgroundImage != "none")? backgroundImage : ""); this.boxContent = this.box.innerHTML; if(boxPosition != "absolute") this.box.style.position = "relative"; this.box.style.padding = "0px"; if(isIE && boxWidth == "auto" && boxHeight == "auto") this.box.style.width = "100%"; if(this.settings.autoPad == true && this.boxPadding > 0)
  this.box.innerHTML = ""; this.applyCorners = function()
  { for(var t = 0; t < 2; t++)
  { switch(t)
  { case 0:
  if(this.settings.tl || this.settings.tr)
  { var newMainContainer = document.createElement("DIV"); newMainContainer.style.width = "100%"; newMainContainer.style.fontSize = "1px"; newMainContainer.style.overflow = "hidden"; newMainContainer.style.position = "absolute"; newMainContainer.style.paddingLeft = this.borderWidth + "px"; newMainContainer.style.paddingRight = this.borderWidth + "px"; var topMaxRadius = Math.max(this.settings.tl ? this.settings.tl.radius : 0, this.settings.tr ? this.settings.tr.radius : 0); newMainContainer.style.height = topMaxRadius + "px"; newMainContainer.style.top = 0 - topMaxRadius + "px"; newMainContainer.style.left = 0 - this.borderWidth + "px"; this.topContainer = this.box.appendChild(newMainContainer);}
  break; case 1:
  if(this.settings.bl || this.settings.br)
  { var newMainContainer = document.createElement("DIV"); newMainContainer.style.width = "100%"; newMainContainer.style.fontSize = "1px"; newMainContainer.style.overflow = "hidden"; newMainContainer.style.position = "absolute"; newMainContainer.style.paddingLeft = this.borderWidth + "px"; newMainContainer.style.paddingRight = this.borderWidth + "px"; var botMaxRadius = Math.max(this.settings.bl ? this.settings.bl.radius : 0, this.settings.br ? this.settings.br.radius : 0); newMainContainer.style.height = botMaxRadius + "px"; newMainContainer.style.bottom = 0 - botMaxRadius + "px"; newMainContainer.style.left = 0 - this.borderWidth + "px"; this.bottomContainer = this.box.appendChild(newMainContainer);}
  break;}
  }
  if(this.topContainer) this.box.style.borderTopWidth = "0px"; if(this.bottomContainer) this.box.style.borderBottomWidth = "0px"; var corners = ["tr", "tl", "br", "bl"]; for(var i in corners)
  { if(i > -1 < 4)
  { var cc = corners[i]; if(!this.settings[cc])
  { if(((cc == "tr" || cc == "tl") && this.topContainer != null) || ((cc == "br" || cc == "bl") && this.bottomContainer != null))
  { var newCorner = document.createElement("DIV"); newCorner.style.position = "relative"; newCorner.style.fontSize = "1px"; newCorner.style.overflow = "hidden"; if(this.backgroundImage == "")
  newCorner.style.backgroundColor = this.boxColour; else
  newCorner.style.backgroundImage = this.backgroundImage; switch(cc)
  { case "tl":
  newCorner.style.height = topMaxRadius - this.borderWidth + "px"; newCorner.style.marginRight = this.settings.tr.radius - (this.borderWidth*2) + "px"; newCorner.style.borderLeft = this.borderString; newCorner.style.borderTop = this.borderString; newCorner.style.left = -this.borderWidth + "px"; break; case "tr":
  newCorner.style.height = topMaxRadius - this.borderWidth + "px"; newCorner.style.marginLeft = this.settings.tl.radius - (this.borderWidth*2) + "px"; newCorner.style.borderRight = this.borderString; newCorner.style.borderTop = this.borderString; newCorner.style.backgroundPosition = "-" + (topMaxRadius + this.borderWidth) + "px 0px"; newCorner.style.left = this.borderWidth + "px"; break; case "bl":
  newCorner.style.height = botMaxRadius - this.borderWidth + "px"; newCorner.style.marginRight = this.settings.br.radius - (this.borderWidth*2) + "px"; newCorner.style.borderLeft = this.borderString; newCorner.style.borderBottom = this.borderString; newCorner.style.left = -this.borderWidth + "px"; newCorner.style.backgroundPosition = "-" + (this.borderWidth) + "px -" + (this.boxHeight + (botMaxRadius + this.borderWidth)) + "px"; break; case "br":
  newCorner.style.height = botMaxRadius - this.borderWidth + "px"; newCorner.style.marginLeft = this.settings.bl.radius - (this.borderWidth*2) + "px"; newCorner.style.borderRight = this.borderString; newCorner.style.borderBottom = this.borderString; newCorner.style.left = this.borderWidth + "px"
  newCorner.style.backgroundPosition = "-" + (botMaxRadius + this.borderWidth) + "px -" + (this.boxHeight + (botMaxRadius + this.borderWidth)) + "px"; break;}
  }
  }
  else
  { if(this.masterCorners[this.settings[cc].radius])
  { var newCorner = this.masterCorners[this.settings[cc].radius].cloneNode(true);}
  else
  { var newCorner = document.createElement("DIV"); newCorner.style.height = this.settings[cc].radius + "px"; newCorner.style.width = this.settings[cc].radius + "px"; newCorner.style.position = "absolute"; newCorner.style.fontSize = "1px"; newCorner.style.overflow = "hidden"; var borderRadius = parseInt(this.settings[cc].radius - this.borderWidth); for(var intx = 0, j = this.settings[cc].radius; intx < j; intx++)
  { if((intx +1) >= borderRadius)
  var y1 = -1; else
  var y1 = (Math.floor(Math.sqrt(Math.pow(borderRadius, 2) - Math.pow((intx+1), 2))) - 1); if(borderRadius != j)
  { if((intx) >= borderRadius)
  var y2 = -1; else
  var y2 = Math.ceil(Math.sqrt(Math.pow(borderRadius,2) - Math.pow(intx, 2))); if((intx+1) >= j)
  var y3 = -1; else
  var y3 = (Math.floor(Math.sqrt(Math.pow(j ,2) - Math.pow((intx+1), 2))) - 1);}
  if((intx) >= j)
  var y4 = -1; else
  var y4 = Math.ceil(Math.sqrt(Math.pow(j ,2) - Math.pow(intx, 2))); if(y1 > -1) this.drawPixel(intx, 0, this.boxColour, 100, (y1+1), newCorner, -1, this.settings[cc].radius); if(borderRadius != j)
  { for(var inty = (y1 + 1); inty < y2; inty++)
  { if(this.settings.antiAlias)
  { if(this.backgroundImage != "")
  { var borderFract = (pixelFraction(intx, inty, borderRadius) * 100); if(borderFract < 30)
  { this.drawPixel(intx, inty, this.borderColour, 100, 1, newCorner, 0, this.settings[cc].radius);}
  else
  { this.drawPixel(intx, inty, this.borderColour, 100, 1, newCorner, -1, this.settings[cc].radius);}
  }
  else
  { var pixelcolour = BlendColour(this.boxColour, this.borderColour, pixelFraction(intx, inty, borderRadius)); this.drawPixel(intx, inty, pixelcolour, 100, 1, newCorner, 0, this.settings[cc].radius, cc);}
  }
  }
  if(this.settings.antiAlias)
  { if(y3 >= y2)
  { if (y2 == -1) y2 = 0; this.drawPixel(intx, y2, this.borderColour, 100, (y3 - y2 + 1), newCorner, 0, 0);}
  }
  else
  { if(y3 >= y1)
  { this.drawPixel(intx, (y1 + 1), this.borderColour, 100, (y3 - y1), newCorner, 0, 0);}
  }
  var outsideColour = this.borderColour;}
  else
  { var outsideColour = this.boxColour; var y3 = y1;}
  if(this.settings.antiAlias)
  { for(var inty = (y3 + 1); inty < y4; inty++)
  { this.drawPixel(intx, inty, outsideColour, (pixelFraction(intx, inty , j) * 100), 1, newCorner, ((this.borderWidth > 0)? 0 : -1), this.settings[cc].radius);}
  }
  }
  this.masterCorners[this.settings[cc].radius] = newCorner.cloneNode(true);}
  if(cc != "br")
  { for(var t = 0, k = newCorner.childNodes.length; t < k; t++)
  { var pixelBar = newCorner.childNodes[t]; var pixelBarTop = parseInt(pixelBar.style.top.substring(0, pixelBar.style.top.indexOf("px"))); var pixelBarLeft = parseInt(pixelBar.style.left.substring(0, pixelBar.style.left.indexOf("px"))); var pixelBarHeight = parseInt(pixelBar.style.height.substring(0, pixelBar.style.height.indexOf("px"))); if(cc == "tl" || cc == "bl"){ pixelBar.style.left = this.settings[cc].radius -pixelBarLeft -1 + "px";}
  if(cc == "tr" || cc == "tl"){ pixelBar.style.top = this.settings[cc].radius -pixelBarHeight -pixelBarTop + "px";}
  switch(cc)
  { case "tr":
  pixelBar.style.backgroundPosition = "-" + Math.abs((this.boxWidth - this.settings[cc].radius + this.borderWidth) + pixelBarLeft) + "px -" + Math.abs(this.settings[cc].radius -pixelBarHeight -pixelBarTop - this.borderWidth) + "px"; break; case "tl":
  pixelBar.style.backgroundPosition = "-" + Math.abs((this.settings[cc].radius -pixelBarLeft -1) - this.borderWidth) + "px -" + Math.abs(this.settings[cc].radius -pixelBarHeight -pixelBarTop - this.borderWidth) + "px"; break; case "bl":
  pixelBar.style.backgroundPosition = "-" + Math.abs((this.settings[cc].radius -pixelBarLeft -1) - this.borderWidth) + "px -" + Math.abs((this.boxHeight + this.settings[cc].radius + pixelBarTop) -this.borderWidth) + "px"; break;}
  }
  }
  }
  if(newCorner)
  { switch(cc)
  { case "tl":
  if(newCorner.style.position == "absolute") newCorner.style.top = "0px"; if(newCorner.style.position == "absolute") newCorner.style.left = "0px"; if(this.topContainer) this.topContainer.appendChild(newCorner); break; case "tr":
  if(newCorner.style.position == "absolute") newCorner.style.top = "0px"; if(newCorner.style.position == "absolute") newCorner.style.right = "0px"; if(this.topContainer) this.topContainer.appendChild(newCorner); break; case "bl":
  if(newCorner.style.position == "absolute") newCorner.style.bottom = "0px"; if(newCorner.style.position == "absolute") newCorner.style.left = "0px"; if(this.bottomContainer) this.bottomContainer.appendChild(newCorner); break; case "br":
  if(newCorner.style.position == "absolute") newCorner.style.bottom = "0px"; if(newCorner.style.position == "absolute") newCorner.style.right = "0px"; if(this.bottomContainer) this.bottomContainer.appendChild(newCorner); break;}
  }
  }
  }
  var radiusDiff = new Array(); radiusDiff["t"] = Math.abs(this.settings.tl.radius - this.settings.tr.radius)
  radiusDiff["b"] = Math.abs(this.settings.bl.radius - this.settings.br.radius); for(z in radiusDiff)
  { if(z == "t" || z == "b")
  { if(radiusDiff[z])
  { var smallerCornerType = ((this.settings[z + "l"].radius < this.settings[z + "r"].radius)? z +"l" : z +"r"); var newFiller = document.createElement("DIV"); newFiller.style.height = radiusDiff[z] + "px"; newFiller.style.width = this.settings[smallerCornerType].radius+ "px"
  newFiller.style.position = "absolute"; newFiller.style.fontSize = "1px"; newFiller.style.overflow = "hidden"; newFiller.style.backgroundColor = this.boxColour; switch(smallerCornerType)
  { case "tl":
  newFiller.style.bottom = "0px"; newFiller.style.left = "0px"; newFiller.style.borderLeft = this.borderString; this.topContainer.appendChild(newFiller); break; case "tr":
  newFiller.style.bottom = "0px"; newFiller.style.right = "0px"; newFiller.style.borderRight = this.borderString; this.topContainer.appendChild(newFiller); break; case "bl":
  newFiller.style.top = "0px"; newFiller.style.left = "0px"; newFiller.style.borderLeft = this.borderString; this.bottomContainer.appendChild(newFiller); break; case "br":
  newFiller.style.top = "0px"; newFiller.style.right = "0px"; newFiller.style.borderRight = this.borderString; this.bottomContainer.appendChild(newFiller); break;}
  }
  var newFillerBar = document.createElement("DIV"); newFillerBar.style.position = "relative"; newFillerBar.style.fontSize = "1px"; newFillerBar.style.overflow = "hidden"; newFillerBar.style.backgroundColor = this.boxColour; newFillerBar.style.backgroundImage = this.backgroundImage; switch(z)
  { case "t":
  if(this.topContainer)
  { if(this.settings.tl.radius && this.settings.tr.radius)
  { newFillerBar.style.height = topMaxRadius - this.borderWidth + "px"; newFillerBar.style.marginLeft = this.settings.tl.radius - this.borderWidth + "px"; newFillerBar.style.marginRight = this.settings.tr.radius - this.borderWidth + "px"; newFillerBar.style.borderTop = this.borderString; if(this.backgroundImage != "")
  newFillerBar.style.backgroundPosition = "-" + (topMaxRadius + this.borderWidth) + "px 0px"; this.topContainer.appendChild(newFillerBar);}
  this.box.style.backgroundPosition = "0px -" + (topMaxRadius - this.borderWidth) + "px";}
  break; case "b":
  if(this.bottomContainer)
  { if(this.settings.bl.radius && this.settings.br.radius)
  { newFillerBar.style.height = botMaxRadius - this.borderWidth + "px"; newFillerBar.style.marginLeft = this.settings.bl.radius - this.borderWidth + "px"; newFillerBar.style.marginRight = this.settings.br.radius - this.borderWidth + "px"; newFillerBar.style.borderBottom = this.borderString; if(this.backgroundImage != "")
  newFillerBar.style.backgroundPosition = "-" + (botMaxRadius + this.borderWidth) + "px -" + (this.boxHeight + (topMaxRadius + this.borderWidth)) + "px"; this.bottomContainer.appendChild(newFillerBar);}
  }
  break;}
  }
  }
  if(this.settings.autoPad == true && this.boxPadding > 0)
  { var contentContainer = document.createElement("DIV"); contentContainer.style.position = "relative"; contentContainer.innerHTML = this.boxContent; contentContainer.className = "autoPadDiv"; var topPadding = Math.abs(topMaxRadius - this.boxPadding); var botPadding = Math.abs(botMaxRadius - this.boxPadding); if(topMaxRadius < this.boxPadding)
  contentContainer.style.paddingTop = topPadding + "px"; if(botMaxRadius < this.boxPadding)
  contentContainer.style.paddingBottom = botMaxRadius + "px"; contentContainer.style.paddingLeft = this.boxPadding + "px"; contentContainer.style.paddingRight = this.boxPadding + "px"; this.contentDIV = this.box.appendChild(contentContainer);}
  }
  this.drawPixel = function(intx, inty, colour, transAmount, height, newCorner, image, cornerRadius)
  { var pixel = document.createElement("DIV"); pixel.style.height = height + "px"; pixel.style.width = "1px"; pixel.style.position = "absolute"; pixel.style.fontSize = "1px"; pixel.style.overflow = "hidden"; var topMaxRadius = Math.max(this.settings["tr"].radius, this.settings["tl"].radius); if(image == -1 && this.backgroundImage != "")
  { pixel.style.backgroundImage = this.backgroundImage; pixel.style.backgroundPosition = "-" + (this.boxWidth - (cornerRadius - intx) + this.borderWidth) + "px -" + ((this.boxHeight + topMaxRadius + inty) -this.borderWidth) + "px";}
  else
  { pixel.style.backgroundColor = colour;}
  if (transAmount != 100)
  setOpacity(pixel, transAmount); pixel.style.top = inty + "px"; pixel.style.left = intx + "px"; newCorner.appendChild(pixel);}
  }
  function insertAfter(parent, node, referenceNode)
  { parent.insertBefore(node, referenceNode.nextSibling);}
  function BlendColour(Col1, Col2, Col1Fraction)
  { var red1 = parseInt(Col1.substr(1,2),16); var green1 = parseInt(Col1.substr(3,2),16); var blue1 = parseInt(Col1.substr(5,2),16); var red2 = parseInt(Col2.substr(1,2),16); var green2 = parseInt(Col2.substr(3,2),16); var blue2 = parseInt(Col2.substr(5,2),16); if(Col1Fraction > 1 || Col1Fraction < 0) Col1Fraction = 1; var endRed = Math.round((red1 * Col1Fraction) + (red2 * (1 - Col1Fraction))); if(endRed > 255) endRed = 255; if(endRed < 0) endRed = 0; var endGreen = Math.round((green1 * Col1Fraction) + (green2 * (1 - Col1Fraction))); if(endGreen > 255) endGreen = 255; if(endGreen < 0) endGreen = 0; var endBlue = Math.round((blue1 * Col1Fraction) + (blue2 * (1 - Col1Fraction))); if(endBlue > 255) endBlue = 255; if(endBlue < 0) endBlue = 0; return "#" + IntToHex(endRed)+ IntToHex(endGreen)+ IntToHex(endBlue);}
  function IntToHex(strNum)
  { base = strNum / 16; rem = strNum % 16; base = base - (rem / 16); baseS = MakeHex(base); remS = MakeHex(rem); return baseS + '' + remS;}
  function MakeHex(x)
  { if((x >= 0) && (x <= 9))
  { return x;}
  else
  { switch(x)
  { case 10: return "A"; case 11: return "B"; case 12: return "C"; case 13: return "D"; case 14: return "E"; case 15: return "F";}
  }
  }
  function pixelFraction(x, y, r)
  { var pixelfraction = 0; var xvalues = new Array(1); var yvalues = new Array(1); var point = 0; var whatsides = ""; var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(x,2))); if ((intersect >= y) && (intersect < (y+1)))
  { whatsides = "Left"; xvalues[point] = 0; yvalues[point] = intersect - y; point = point + 1;}
  var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(y+1,2))); if ((intersect >= x) && (intersect < (x+1)))
  { whatsides = whatsides + "Top"; xvalues[point] = intersect - x; yvalues[point] = 1; point = point + 1;}
  var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(x+1,2))); if ((intersect >= y) && (intersect < (y+1)))
  { whatsides = whatsides + "Right"; xvalues[point] = 1; yvalues[point] = intersect - y; point = point + 1;}
  var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(y,2))); if ((intersect >= x) && (intersect < (x+1)))
  { whatsides = whatsides + "Bottom"; xvalues[point] = intersect - x; yvalues[point] = 0;}
  switch (whatsides)
  { case "LeftRight":
  pixelfraction = Math.min(yvalues[0],yvalues[1]) + ((Math.max(yvalues[0],yvalues[1]) - Math.min(yvalues[0],yvalues[1]))/2); break; case "TopRight":
  pixelfraction = 1-(((1-xvalues[0])*(1-yvalues[1]))/2); break; case "TopBottom":
  pixelfraction = Math.min(xvalues[0],xvalues[1]) + ((Math.max(xvalues[0],xvalues[1]) - Math.min(xvalues[0],xvalues[1]))/2); break; case "LeftBottom":
  pixelfraction = (yvalues[0]*xvalues[1])/2; break; default:
  pixelfraction = 1;}
  return pixelfraction;}
  function rgb2Hex(rgbColour)
  { try{ var rgbArray = rgb2Array(rgbColour); var red = parseInt(rgbArray[0]); var green = parseInt(rgbArray[1]); var blue = parseInt(rgbArray[2]); var hexColour = "#" + IntToHex(red) + IntToHex(green) + IntToHex(blue);}
  catch(e){ alert("There was an error converting the RGB value to Hexadecimal in function rgb2Hex");}
  return hexColour;}
  function rgb2Array(rgbColour)
  { var rgbValues = rgbColour.substring(4, rgbColour.indexOf(")")); var rgbArray = rgbValues.split(", "); return rgbArray;}
  function setOpacity(obj, opacity)
  { opacity = (opacity == 100)?99.999:opacity; if(isSafari && obj.tagName != "IFRAME")
  { var rgbArray = rgb2Array(obj.style.backgroundColor); var red = parseInt(rgbArray[0]); var green = parseInt(rgbArray[1]); var blue = parseInt(rgbArray[2]); obj.style.backgroundColor = "rgba(" + red + ", " + green + ", " + blue + ", " + opacity/100 + ")";}
  else if(typeof(obj.style.opacity) != "undefined")
  { obj.style.opacity = opacity/100;}
  else if(typeof(obj.style.MozOpacity) != "undefined")
  { obj.style.MozOpacity = opacity/100;}
  else if(typeof(obj.style.filter) != "undefined")
  { obj.style.filter = "alpha(opacity:" + opacity + ")";}
  else if(typeof(obj.style.KHTMLOpacity) != "undefined")
  { obj.style.KHTMLOpacity = opacity/100;}
  }
  function inArray(array, value)
  { for(var i = 0; i < array.length; i++){ if (array[i] === value) return i;}
  return false;}
  function inArrayKey(array, value)
  { for(key in array){ if(key === value) return true;}
  return false;}
  function addEvent(elm, evType, fn, useCapture) { if (elm.addEventListener) { elm.addEventListener(evType, fn, useCapture); return true;}
  else if (elm.attachEvent) { var r = elm.attachEvent('on' + evType, fn); return r;}
  else { elm['on' + evType] = fn;}
  }
  function removeEvent(obj, evType, fn, useCapture){ if (obj.removeEventListener){ obj.removeEventListener(evType, fn, useCapture); return true;} else if (obj.detachEvent){ var r = obj.detachEvent("on"+evType, fn); return r;} else { alert("Handler could not be removed");}
  }
  function format_colour(colour)
  { var returnColour = "#ffffff"; if(colour != "" && colour != "transparent")
  { if(colour.substr(0, 3) == "rgb")
  { returnColour = rgb2Hex(colour);}
  else if(colour.length == 4)
  { returnColour = "#" + colour.substring(1, 2) + colour.substring(1, 2) + colour.substring(2, 3) + colour.substring(2, 3) + colour.substring(3, 4) + colour.substring(3, 4);}
  else
  { returnColour = colour;}
  }
  return returnColour;}
  function get_style(obj, property, propertyNS)
  { try
  { if(obj.currentStyle)
  { var returnVal = eval("obj.currentStyle." + property);}
  else
  { if(isSafari && obj.style.display == "none")
  { obj.style.display = ""; var wasHidden = true;}
  var returnVal = document.defaultView.getComputedStyle(obj, '').getPropertyValue(propertyNS); if(isSafari && wasHidden)
  { obj.style.display = "none";}
  }
  }
  catch(e)
  { }
  return returnVal;}
  function getElementsByClass(searchClass, node, tag)
  { var classElements = new Array(); if(node == null)
  node = document; if(tag == null)
  tag = '*'; var els = node.getElementsByTagName(tag); var elsLen = els.length; var pattern = new RegExp("(^|\s)"+searchClass+"(\s|$)"); for (i = 0, j = 0; i < elsLen; i++)
  { if(pattern.test(els[i].className))
  { classElements[j] = els[i]; j++;}
  }
  return classElements;}
  function newCurvyError(errorMessage)
  { return new Error("curvyCorners Error:\n" + errorMessage)
  }
 
  <?php
  /*
  index.php - Sandbox web frontend
 
  Version : 1.1.0
  Made by : Jean-Damien POGOLOTTI
  Last Update : 18/01/11
 
  This file can be distributed under the license you can find at :
 
  http://www.pchart.net/license
 
  You can find the whole class documentation on the pChart web site.
  */
  ?>
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
  <title>Sandbox system</title>
  <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>
  <meta name='description' content='pChart is an object oriented php charting library'/>
  <meta name='keywords' content='pchart, php chart, charting library, php charting'/>
  <link rel='stylesheet' type='text/css' href='style.css'/>
  <link rel='shortcut icon' href='images/favicon.ico'/>
  <script type='text/javascript' src='includes/rounded_corners_lite.inc.js'></script>
  <script type='text/javascript' src='includes/jscolor.js'></script>
  <script type='text/javascript' src='includes/functions.js'></script>
  </head>
  <body>
  <table style=''><tr><td>
  <table style='padding: 2px; background-color: #E0E0E0; border: 1px solid #D0D0D0;'><tr>
  <td class='topMenu'>
  <div class='topMenu' id='menu1' onmouseover='highlightDIV(1);' onmouseout='clearDIV(1);' onclick='toggleDIV(1);'>
  <table style='padding: 2px; border: 1px solid #D0D0D0;'><tr>
  <td class='topMenu'><img src='graphix/tab.png' width='16' height='16' alt=''/></td>
  <td class='topMenu'>&nbsp;General settings&nbsp;</td>
  </tr></table>
  </div>
  </td>
  <td class='topMenu' width='5'></td>
  <td class='topMenu'>
  <div class='topMenu' id='menu2' onmouseover='highlightDIV(2);' onmouseout='clearDIV(2);' onclick='toggleDIV(2);'>
  <table style='padding: 2px; border: 1px solid #D0D0D0;'><tr>
  <td class='topMenu'><img src='graphix/tab.png' width='16' height='16' alt=''/></td>
  <td class='topMenu'>&nbsp;Data&nbsp;</td>
  </tr></table>
  </div>
  </td>
  <td class='topMenu' width='5'></td>
  <td class='topMenu'>
  <div class='topMenu' id='menu3' onmouseover='highlightDIV(3);' onmouseout='clearDIV(3);' onclick='toggleDIV(3);'>
  <table style='padding: 2px; border: 1px solid #D0D0D0;'><tr>
  <td class='topMenu'><img src='graphix/tab.png' width='16' height='16' alt=''/></td>
  <td class='topMenu'>&nbsp;Scale&nbsp;</td>
  </tr></table>
  </div>
  </td>
  <td class='topMenu' width='5'></td>
  <td class='topMenu'>
  <div class='topMenu' id='menu4' onmouseover='highlightDIV(4);' onmouseout='clearDIV(4);' onclick='toggleDIV(4);'>
  <table style='padding: 2px; border: 1px solid #D0D0D0;'><tr>
  <td class='topMenu'><img src='graphix/tab.png' width='16' height='16' alt=''/></td>
  <td class='topMenu'>&nbsp;Chart&nbsp;</td>
  </tr></table>
  </div>
  </td>
  <td class='topMenu' width='5'></td>
  <td class='topMenu'>
  <div class='topMenu' id='menu5' onmouseover='highlightDIV(5);' onmouseout='clearDIV(5);' onclick='toggleDIV(5);'>
  <table style='padding: 2px; border: 1px solid #D0D0D0;'><tr>
  <td class='topMenu'><img src='graphix/tab.png' width='16' height='16' alt=''/></td>
  <td class='topMenu'>&nbsp;Legend, thresholds &amp; Misc&nbsp;</td>
  </tr></table>
  </div>
  </td>
  </tr></table>
  </td>
  <td width='5'></td>
  <td>
  <table style='padding: 2px; background-color: #D0D0D0; border: 1px solid #D0D0D0;'><tr>
  <td class='topMenu'>
  <div class='topMenu' id='menu6' onmouseover='highlightDIV(6);' onmouseout='clearDIV(6);' onclick='code();'>
  <table style='padding: 2px; border: 1px solid #D0D0D0;'><tr>
  <td class='topMenu'><img src='graphix/cog.png' width='16' height='16' alt=''/></td>
  <td class='topMenu'>&nbsp;Show code&nbsp;</td>
  </tr></table>
  </div>
  </td>
  <td class='topMenu' width='5'></td>
  <td class='topMenu'>
  <div class='topMenu' id='menu7' onmouseover='highlightDIV(7);' onmouseout='clearDIV(7);' onclick='render();'>
  <table style='padding: 2px; border: 1px solid #D0D0D0;'><tr>
  <td class='topMenu'><img src='graphix/accept.png' width='16' height='16' alt=''/></td>
  <td class='topMenu'>&nbsp;Render picture&nbsp;</td>
  </tr></table>
  </div>
  </td>
  </tr></table>
  </td></tr></table>
 
  <table><tr><td valign='top'>
 
  <div class="roundedCorner" id='tab1' style='margin-top: 30px; margin-left: 20px; width: 350px; height: 420px; background: #F0F0F0; padding: 10px; color: #667309; border: 1px solid #E0E0E0'>
  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>
  <td width='20'><img src='graphix/wrench.png' width='16' height='16' alt=''/></td>
  <td width='300'><b>General settings</b></td>
  </tr></table>
  <br/>
  <table><tr>
  <td>Width &nbsp;</td>
  <td><input type='text' id='g_width' value='700' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' onkeyup='doLayout();' /></td>
  <td>&nbsp;&nbsp; Height &nbsp;</td>
  <td><input type='text' id='g_height' value='230' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' onkeyup='doLayout();' /></td>
  <td>&nbsp;&nbsp;<input type='checkbox' id='g_transparent' /></td>
  <td>Transparent background</td>
  </tr></table>
  <table><tr>
  <td><input type='checkbox' id='g_aa' checked='checked' /></td>
  <td>Turn on antialiasing</td>
  <td>&nbsp;&nbsp;<input type='checkbox' id='g_shadow' checked='checked' /></td>
  <td>Enable shadow</td>
  <td>&nbsp;&nbsp; <input type='checkbox' id='g_border' checked='checked' /></td>
  <td>with a border</td>
  </tr></table>
  <table><tr>
  <td><input type='checkbox' id='g_autopos' checked='checked' onclick='toggleAuto();' /></td>
  <td>Automatic positioning of the elements</td>
  </tr></table>
 
  <br/>
 
  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>
  <td width='20'><img src='graphix/comment.png' width='16' height='16' alt=''/></td>
  <td width='240'><b>Chart title</b></td>
  <td width='20'><input type='checkbox' id='g_title_enabled' checked='checked' /></td>
  <td width='38'>Enabled</td>
  </tr></table>
  <br/>
  <table><tr>
  <td width='55'>Chart Title</td>
  <td><input type='text' id='g_title' value='My first pChart project' style='width: 260px;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  </tr></table>
  <table><tr>
  <td width='147'>Alignement method (<a class='smallLinkBlack' target='_new' href='http://wiki.pchart.net/doc.draw.text.html'>help</a>)</td>
  <td><select id='g_title_align'><?php listalign(); ?></select></td>
  </tr></table>
  <table><tr>
  <td width='55'>X position &nbsp;</td>
  <td><input type='text' id='g_title_x' value='350' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td>&nbsp;&nbsp; Y position &nbsp;</td>
  <td><input type='text' id='g_title_y' value='25' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td>&nbsp;&nbsp; Color &nbsp;</td>
  <td><input type='text' class='color' id='g_title_color' value='#FFFFFF' style='text-align: center; width: 60px;' onchange='applyColor("g_title_color","g_title_color_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td><div id='g_title_color_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>
  </tr></table>
  <table><tr>
  <td width='55'>Font name &nbsp;</td>
  <td><select id='g_title_font'><?php listfonts(); ?></select></td>
  <td>&nbsp;&nbsp; Size &nbsp;</td>
  <td><input type='text' id='g_title_font_size' value='14' style='width: 20px; text-align: center;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td>&nbsp;&nbsp; <input type='checkbox' id='g_title_box' /></td>
  <td>in a box</td>
  </tr></table>
 
  <br/>
 
  <table style='background-color: #E8E8E8; padding:1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>
  <td width='20'><img src='graphix/paintcan.png' width='16' height='16' alt=''/></td>
  <td width='240'><b>Solid background</b></td>
  <td width='20'><input type='checkbox' id='g_solid_enabled' checked='checked' /></td>
  <td width='38'>Enabled</td>
  </tr></table>
  <br/>
  <table><tr>
  <td width='55'>Color</td>
  <td><input type='text' class='color' id='g_solid_color' value='#AAB757' style='text-align: center; width: 60px;' onchange='applyColor("g_solid_color","g_solid_color_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td width='40'><div id='g_solid_color_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>
  <td width='20'><input type='checkbox' id='g_solid_dashed' checked='checked' /></td>
  <td width='38'>Dashed</td>
  </tr></table>
 
  <br/>
 
  <table style='background-color: #E8E8E8; padding:1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>
  <td width='20'><img src='graphix/paintcan.png' width='16' height='16' alt=''/></td>
  <td width='240'><b>Gradient background</b></td>
  <td width='20'><input type='checkbox' id='g_gradient_enabled' checked='checked' /></td>
  <td width='38'>Enabled</td>
  </tr></table>
  <br/>
  <table><tr>
  <td width='55'>Start color</td>
  <td><input type='text' class='color' id='g_gradient_start' value='#DBE78B' style='text-align: center; width: 60px;' onchange='applyColor("g_gradient_start","g_gradient_start_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td width='55'><div id='g_gradient_start_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>
  <td width='54'>End color &nbsp;</td>
  <td><input type='text' class='color' id='g_gradient_end' value='#018A44' style='text-align: center; width: 60px;' onchange='applyColor("g_gradient_end","g_gradient_end_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td><div id='g_gradient_end_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>
  </tr></table>
  <table><tr>
  <td width='55'>Direction</td>
  <td width='75'><select id='g_gradient_direction'><option value='vertical'>Vertical</option><option value='horizontal'>Horizontal</option></select></td>
  <td width='100'>&nbsp; Alpha transparency</td>
  <td><input type='text' id='g_gradient_alpha' value='50' style='width: 20px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td>%</td>
  </tr></table>
  </div>
 
  <div class="roundedCorner" id='tab2' style='display: none; margin-top: 30px; margin-left: 20px; width: 350px; height: 455px; background: #F0F0F0; padding: 10px; color: #667309; border: 1px solid #E0E0E0'>
  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>
  <td width='20'><img src='graphix/database_table.png' width='16' height='16' alt=''/></td>
  <td width='300'><b>Dataset definition</b></td>
  </tr></table>
  <br/>
  <table>
  <tr>
  <td width='46'></td>
  <td width='65'><center>Serie 1</center></td>
  <td width='65'><center>Serie 2</center></td>
  <td width='65'><center>Serie 3</center></td>
  <td width='65'><center>Absissa</center></td>
  </tr>
  <tr>
  <td>Enabled</td>
  <td><center><input type='checkbox' id='d_serie1_enabled' checked='checked' onclick='checkEnabledAxis();' /></center></td>
  <td><center><input type='checkbox' id='d_serie2_enabled' checked='checked' onclick='checkEnabledAxis();' /></center></td>
  <td><center><input type='checkbox' id='d_serie3_enabled' checked='checked' onclick='checkEnabledAxis();' /></center></td>
  <td><center><input type='checkbox' id='d_absissa_enabled' checked='checked' /></center></td>
  </tr>
  </table>
  <table>
  <tr>
  <td width='46'>Name</td>
  <td width='65'><center><input type='text' id='d_serie1_name' value='Serie 1' style='width: 50px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>
  <td width='65'><center><input type='text' id='d_serie2_name' value='Serie 2' style='width: 50px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>
  <td width='65'><center><input type='text' id='d_serie3_name' value='Serie 3' style='width: 50px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>
  <td width='65'><center>-</center></td>
  </tr>
  <tr>
  <td width='46'>Binding</td>
  <td width='65'><center><select id='d_serie1_axis' style='width: 54px;' onchange='checkEnabledAxis();'><?php listaxis(); ?></select></center></td>
  <td width='65'><center><select id='d_serie2_axis' style='width: 54px;' onchange='checkEnabledAxis();'><?php listaxis(); ?></select></center></td>
  <td width='65'><center><select id='d_serie3_axis' style='width: 54px;' onchange='checkEnabledAxis();'><?php listaxis(); ?></select></center></td>
  <td width='65'><center>-</center></td>
  </tr>
  <?php
  for($i=0; $i<8;$i++)
  {
  ?>
  <tr>
  <?php if ( $i == 0 ) { ?>
  <td>Data</td>
  <?php } else { ?>
  <td></td>
  <?php } ?>
  <td><center><input type='text' id='d_serie1_data<?php echo $i; ?>' style='width: 50px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>
  <td><center><input type='text' id='d_serie2_data<?php echo $i; ?>' style='width: 50px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>
  <td><center><input type='text' id='d_serie3_data<?php echo $i; ?>' style='width: 50px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>
  <td><center><input type='text' id='d_absissa_data<?php echo $i; ?>' style='width: 60px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>
  </tr>
  <?php
  }
  ?>
  </table>
  <table>
  <tr>
  <td width='50'></td>
  <td><input type='checkbox' id='d_normalize_enabled' /></td>
  <td>normalize the datasets.</td>
  <td width='10'></td>
  <td>[ <a class='smallLinkBlack' href='javascript:randomize();'>randomize</a> ]</td>
  </tr>
  </table>
  <br/>
  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>
  <td width='20'><img src='graphix/chart_bar_edit.png' width='16' height='16' alt=''/></td>
  <td width='300'><b>Axis position and units</b></td>
  </tr></table>
  <br/>
  <table>
  <tr>
  <td width='40'></td>
  <td width='90'><center><b>Axis 0</b></center></td>
  <td width='90'><center><b>Axis 1</b></center></td>
  <td width='90'><center><b>Axis 2</b></center></td>
  </tr>
  <tr>
  <td>Name</td>
  <td><center><input type='text' id='d_axis0_name' value='1st axis' style='width: 76px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>
  <td><center><input type='text' id='d_axis1_name' value='2nd axis' style='width: 76px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>
  <td><center><input type='text' id='d_axis2_name' value='3rd axis' style='width: 76px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>
  </tr>
  <tr>
  <td>Unit</td>
  <td><center><input type='text' id='d_axis0_unit' style='width: 76px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>
  <td><center><input type='text' id='d_axis1_unit' style='width: 76px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>
  <td><center><input type='text' id='d_axis2_unit' style='width: 76px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></center></td>
  </tr>
  <tr>
  <td>Position</td>
  <td><center><select id='d_axis0_position' style='width: 80px;' onchange='checkEnabledAxis();'><?php listaxispos(); ?></select></center></td>
  <td><center><select id='d_axis1_position' style='width: 80px;' onchange='checkEnabledAxis();'><?php listaxispos(); ?></select></center></td>
  <td><center><select id='d_axis2_position' style='width: 80px;' onchange='checkEnabledAxis();'><?php listaxispos(); ?></select></center></td>
  </tr>
  <tr>
  <td>Format</td>
  <td><center><select id='d_axis0_format' style='width: 80px;' onchange='checkEnabledAxis();'><?php listaxisformat(); ?></select></center></td>
  <td><center><select id='d_axis1_format' style='width: 80px;' onchange='checkEnabledAxis();'><?php listaxisformat(); ?></select></center></td>
  <td><center><select id='d_axis2_format' style='width: 80px;' onchange='checkEnabledAxis();'><?php listaxisformat(); ?></select></center></td>
  </tr>
  </table>
  </div>
 
  <div class="roundedCorner" id='tab3' style='display: none; margin-top: 30px; margin-left: 20px; width: 350px; height: 435px; background: #F0F0F0; padding: 10px; color: #667309; border: 1px solid #E0E0E0'>
  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>
  <td width='20'><img src='graphix/layout_edit.png' width='16' height='16' alt=''/></td>
  <td width='300'><b>Charting area definition</b></td>
  </tr></table>
  <br/>
  <table><tr>
  <td width='50'>X &nbsp;</td>
  <td><input type='text' id='s_x' value='70' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td>&nbsp;&nbsp; Y &nbsp;</td>
  <td><input type='text' id='s_y' value='50' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td>&nbsp;&nbsp; Width &nbsp;</td>
  <td><input type='text' id='s_width' value='590' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td>&nbsp;&nbsp; Height &nbsp;</td>
  <td><input type='text' id='s_height' value='140' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  </tr></table>
  <table><tr>
  <td width='50'>Direction</td>
  <td width='160'><select id='s_direction' onchange='checkEnabledAxis();'><option value='SCALE_POS_LEFTRIGHT'>SCALE_POS_LEFTRIGHT</option><option value='SCALE_POS_TOPBOTTOM'>SCALE_POS_TOPBOTTOM</option></select></td>
  <td>&nbsp;<input type='checkbox' id='s_arrows_enabled' /></td>
  <td>&nbsp;with arrows</td>
  </tr></table>
  <table><tr>
  <td width='50'>Mode</td>
  <td width='160'><select id='s_mode'><option value='SCALE_MODE_FLOATING'>SCALE_MODE_FLOATING</option><option value='SCALE_MODE_START0'>SCALE_MODE_START0</option><option value='SCALE_MODE_ADDALL'>SCALE_MODE_ADDALL</option><option value='SCALE_MODE_ADDALL_START0'>SCALE_MODE_ADDALL_START0</option></select></td>
  <td>&nbsp;<input type='checkbox' id='s_cycle_enabled' checked='checked' /></td>
  <td>&nbsp;Background</td>
  </tr></table>
  <table><tr>
  <td width='50'>X Margin</td>
  <td width='35'><input type='text' id='s_x_margin' value='0' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td width='50'>&nbsp; Y Margin</td>
  <td width='68'><input type='text' id='s_y_margin' value='0' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td>&nbsp;&nbsp;<input type='checkbox' id='s_automargin_enabled' checked='checked' onclick='toggleAutoMargins();' /></td>
  <td>&nbsp;automatic</td>
  </tr></table>
  <table><tr>
  <td width='50'>Font</td>
  <td><select id='s_font'><?php listfonts("pf_arma_five"); ?></select></td>
  <td>&nbsp; Size &nbsp;</td>
  <td><input type='text' id='s_font_size' value='6' style='width: 20px; text-align: center;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td>&nbsp; Color &nbsp;</td>
  <td><input type='text' id='s_font_color' class='color' value='#000000' style='text-align: center; width: 50px;' onchange='applyColor("s_font_color","s_font_color_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td><div id='s_font_color_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>
  </tr></table>
  <br/>
  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>
  <td width='20'><img src='graphix/page_edit.png' width='16' height='16' alt=''/></td>
  <td width='300'><b>X Axis configuration</b></td>
  </tr></table>
  <br/>
  <table><tr>
  <td width='50'>Mode</td>
  <td><select id='s_x_labeling'><option value='LABELING_ALL'>LABELING_ALL</option><option value='LABELING_DIFFERENT'>LABELING_DIFFERENT</option></select></td>
  <td>&nbsp;&nbsp; Skip each</td>
  <td>&nbsp;<input type='text' id='s_x_skip' value='0' style='width: 20px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td>&nbsp;labels</td>
  </tr></table>
  <table><tr>
  <td width='50'>Rotation</td>
  <td><input type='text' id='s_x_label_rotation' value='0' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  </tr></table>
  <br/>
  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>
  <td width='20'><img src='graphix/page_edit.png' width='16' height='16' alt=''/></td>
  <td width='300'><b>Grid</b></td>
  </tr></table>
  <br/>
  <table><tr>
  <td width='70'>Grid color</td>
  <td><input type='text' id='s_grid_color' class='color' value='#FFFFFF' style='text-align: center; width: 60px; text-align: center' onchange='applyColor("s_grid_color","s_grid_color_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td><div id='s_grid_color_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>
  <td>&nbsp; Alpha</td>
  <td>&nbsp; <input type='text' id='s_grid_alpha' value='50' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  </tr></table>
  <table><tr>
  <td width='70'>Display</td>
  <td>&nbsp;<input type='checkbox' id='s_grid_x_enabled' checked='checked' /></td>
  <td>&nbsp;X Lines</td>
  <td>&nbsp;&nbsp;&nbsp;<input type='checkbox' id='s_grid_y_enabled' checked='checked' /></td>
  <td>&nbsp;Y Lines</td>
  </tr></table>
 
  <br/>
  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>
  <td width='20'><img src='graphix/page_edit.png' width='16' height='16' alt=''/></td>
  <td width='300'><b>Ticks</b></td>
  </tr></table>
  <br/>
  <table><tr>
  <td width='70'>Ticks color</td>
  <td><input type='text' id='s_ticks_color' class='color' value='#000000' style='text-align: center; width: 60px; text-align: center' onchange='applyColor("s_ticks_color","s_ticks_color_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td><div id='s_ticks_color_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>
  <td>&nbsp; Alpha</td>
  <td>&nbsp; <input type='text' id='s_ticks_alpha' value='50' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  </tr></table>
  <table><tr>
  <td width='70'>Sub ticks color</td>
  <td><input type='text' id='s_subticks_color' class='color' value='#FF0000' style='text-align: center; width: 60px; text-align: center' onchange='applyColor("s_subticks_color","s_subticks_color_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td><div id='s_subticks_color_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>
  <td>&nbsp; Alpha</td>
  <td>&nbsp; <input type='text' id='s_subticks_alpha' value='50' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td>&nbsp;<input type='checkbox' id='s_subticks_enabled' checked='checked' onclick='toggleSubTicks();' /></td>
  <td>&nbsp;enabled</td>
  </tr></table>
  </div>
 
  <div class="roundedCorner" id='tab4' style='display: none; margin-top: 30px; margin-left: 20px; width: 350px; height: 420px; background: #F0F0F0; padding: 10px; color: #667309; border: 1px solid #E0E0E0'>
  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>
  <td width='20'><img src='graphix/wrench.png' width='16' height='16' alt=''/></td>
  <td width='300'><b>Chart</b></td>
  </tr></table>
  <br/>
  <table><tr>
  <td width='60'>Chart family</td>
  <td><select id='c_family' onchange='checkChartSettings();'><?php echo listCharts(); ?></select></td>
  <td>&nbsp;Break color</td>
  <td>&nbsp;<input type='text' id='c_break_color' class='color' value='#EA371A' style='text-align: center; width: 60px; text-align: center' onchange='applyColor("c_break_color","c_break_color_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td><div id='c_break_color_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>
  </tr></table>
  <table><tr>
  <td width='60'>Settings : </td>
  <td><input type='checkbox' id='c_display_values' /></td>
  <td>&nbsp;Display values</td>
  <td>&nbsp;<input type='checkbox' id='c_break' /></td>
  <td>&nbsp;Don't break on VOID</td>
  </tr></table>
  <div style='background: #D2F5C1; padding: 4px; color: #667309; margin-top: 10px;'>
  <table><tr>
  <td width='20'><img src='graphix/comment.png' width='16' height='16' alt=''/></td>
  <td>Selecting a chart layout will enable/disable chart specifics options.</td>
  </tr></table>
  </div>
  <br/>
  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>
  <td width='20'><img src='graphix/chart_line.png' width='16' height='16' alt=''/></td>
  <td width='300'><b>Plot specifics</b></td>
  </tr></table>
  <br/>
  <table><tr>
  <td width='60'>Plot size</td>
  <td><input type='text' id='c_plot_size' value='3' style='width: 20px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td width='60'>&nbsp;&nbsp; Border size</td>
  <td>&nbsp;<input type='text' id='c_border_size' value='2' style='width: 20px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td>&nbsp;<input type='checkbox' id='c_border_enabled' checked='checked' onclick='checkPlotBorder();' /></td>
  <td>&nbsp;border enabled</td>
  </tr></table>
  <br/>
  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>
  <td width='20'><img src='graphix/chart_bar.png' width='16' height='16' alt=''/></td>
  <td width='300'><b>Bar charts specifics</b></td>
  </tr></table>
  <br/>
  <table><tr>
  <td>&nbsp;<input type='radio' id='c_bar_classic' name='c_bar_design' value='0' checked='checked' /></td>
  <td>&nbsp;Classic</td>
  <td>&nbsp;<input type='radio' id='c_bar_rounded' name='c_bar_design' value='1' /></td>
  <td>&nbsp;Rounded</td>
  <td>&nbsp;<input type='radio' id='c_bar_gradient' name='c_bar_design' value='2' /></td>
  <td>&nbsp;Gradient filling</td>
  <td>&nbsp;<input type='checkbox' id='c_around_zero1' checked='checked' /></td>
  <td>&nbsp;around zero</td>
  </tr></table>
  <br/>
  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>
  <td width='20'><img src='graphix/chart_curve.png' width='16' height='16' alt=''/></td>
  <td width='300'><b>Area charts specifics</b></td>
  </tr></table>
  <br/>
  <table><tr>
  <td width='100'>Forced transparency</td>
  <td><input type='text' id='c_transparency' value='50' style='width: 20px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td>&nbsp;<input type='checkbox' id='c_forced_transparency' checked='checked' onclick='checkAreaChart();' /></td>
  <td>&nbsp;enabled</td>
  <td>&nbsp;<input type='checkbox' id='c_around_zero2' checked='checked' /></td>
  <td>&nbsp;wrapped around zero</td>
  </tr></table>
  </div>
 
  <div class="roundedCorner" id='tab5' style='display: none; margin-top: 30px; margin-left: 20px; width: 350px; height: 420px; background: #F0F0F0; padding: 10px; color: #667309; border: 1px solid #E0E0E0'>
  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>
  <td width='20'><img src='graphix/application_form.png' width='16' height='16' alt=''/></td>
  <td width='240'><b>Legend</b></td>
  <td width='20'><input type='checkbox' id='l_enabled' checked='checked' /></td>
  <td width='38'>Enabled</td>
  </tr></table>
  <br/>
  <table><tr>
  <td width='50'>Font</td>
  <td><select id='l_font'><?php listfonts("pf_arma_five"); ?></select></td>
  <td>&nbsp; Size &nbsp;</td>
  <td><input type='text' id='l_font_size' value='6' style='width: 20px; text-align: center;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td>&nbsp; Color &nbsp;</td>
  <td><input type='text' id='l_font_color' class='color' value='#000000' style='text-align: center; width: 50px;' onchange='applyColor("l_font_color","l_font_color_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td><div id='l_font_color_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>
  </tr></table>
  <table><tr>
  <td width='50'>Margin</td>
  <td><input type='text' id='l_margin' value='6' style='width: 20px; text-align: center;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td>&nbsp; Alpha &nbsp;</td>
  <td><input type='text' id='l_alpha' value='30' style='width: 20px; text-align: center;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td>&nbsp; Format</td>
  <td>&nbsp; <select id='l_format'><?php echo LegendFormat(); ?></select></td>
  </tr></table>
  <table><tr>
  <td width='50'>Orientation</td>
  <td>&nbsp; <select id='l_orientation' style='width: 160px;'><option value='LEGEND_VERTICAL'>LEGEND_VERTICAL</option><option value='LEGEND_HORIZONTAL' selected='selected'>LEGEND_HORIZONTAL</option></select></td>
  <td>&nbsp; Box size &nbsp;</td>
  <td><input type='text' id='l_box_size' value='5' style='width: 20px; text-align: center;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  </tr></table>
  <table><tr>
  <td width='50'>Position</td>
  <td>&nbsp; <select id='l_position' style='width: 160px;' onclick='checkLegend();'><option value='CORNER_TOP_RIGHT'>CORNER_TOP_RIGHT</option><option value='CORNER_BOTTOM_RIGHT'>CORNER_BOTTOM_RIGHT</option><option value='Manual'>Manual</option></select></td>
  <td>&nbsp; X &nbsp;</td>
  <td><input type='text' id='l_x' value='10' style='width: 20px; text-align: center;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td>&nbsp; Y &nbsp;</td>
  <td><input type='text' id='l_y' value='10' style='width: 20px; text-align: center;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  </tr></table>
  <table><tr>
  <td width='50'>Layout</td>
  <td>&nbsp; <select id='l_family' style='width: 160px;'><option value='LEGEND_SERIE_BOX'>LEGEND_SERIE_BOX</option><option value='LEGEND_FAMILY_CIRCLE'>LEGEND_FAMILY_CIRCLE</option><option value='LEGEND_FAMILY_LINE'>LEGEND_FAMILY_LINE</option></select></td>
  </tr></table>
  <br/>
  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>
  <td width='20'><img src='graphix/vector.png' width='16' height='16' alt=''/></td>
  <td width='240'><b>Threshold</b></td>
  <td width='20'><input type='checkbox' id='t_enabled' /></td>
  <td width='38'>Enabled</td>
  </tr></table>
  <br/>
  <table><tr>
  <td width='50'>Value</td>
  <td width='60'><input type='text' id='t_value' value='0' style='width: 30px; text-align: center' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td>&nbsp;<input type='radio' id='t_axis0' name='t_axis' value='0' checked='checked' /></td>
  <td>&nbsp;Axis 0</td>
  <td>&nbsp;<input type='radio' id='t_axis1' name='t_axis' value='1' /></td>
  <td>&nbsp;Axis 1</td>
  <td>&nbsp;<input type='radio' id='t_axis2' name='t_axis' value='2' /></td>
  <td>&nbsp;Axis 2</td>
  </tr></table>
  <table><tr>
  <td width='50'>Color</td>
  <td><input type='text' id='t_color' class='color' value='#000000' style='text-align: center; width: 50px;' onchange='applyColor("t_color","t_color_show");' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td><div id='t_color_show' style='margin-left: 4px; width: 10px; height: 10px; border: 1px solid #808080;'></div></td>
  <td>&nbsp; Alpha &nbsp;</td>
  <td><input type='text' id='t_alpha' value='50' style='width: 20px; text-align: center;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td>&nbsp;&nbsp; <input type='checkbox' id='t_ticks' checked='checked' /></td>
  <td>&nbsp; ticks &nbsp;</td>
  </tr></table>
  <table><tr>
  <td width='50'>Caption</td>
  <td><input type='text' id='t_caption' value='Threshold' style='width: 50px;' onmouseover='setFocus(this,true);' onmouseout='setFocus(this,false);' /></td>
  <td>&nbsp; <input type='checkbox' id='t_box' checked='checked' /></td>
  <td>&nbsp;in a box&nbsp;</td>
  <td>&nbsp; <input type='checkbox' id='t_caption_enabled' checked='checked' /></td>
  <td>&nbsp;caption enabled &nbsp;</td>
  </tr></table>
  <br/>
  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>
  <td width='20'><img src='graphix/shape_flip_vertical.png' width='16' height='16' alt=''/></td>
  <td width='240'><b>Slope chart</b></td>
  <td width='20'><input type='checkbox' id='sl_enabled' onclick='doLayout();' /></td>
  <td width='38'>Enabled</td>
  </tr></table>
  <table><tr>
  <td>&nbsp; <input type='checkbox' id='sl_shaded' checked='checked' /></td>
  <td>&nbsp;Shaded&nbsp;</td>
  <td>&nbsp; <input type='checkbox' id='sl_caption_enabled' checked='checked' /></td>
  <td>&nbsp;With caption &nbsp;</td>
  <td>&nbsp; <input type='checkbox' id='sl_caption_line' checked='checked' /></td>
  <td>&nbsp;Use line as caption &nbsp;</td>
  </tr></table>
  <br/>
 
  <table style='background-color: #E8E8E8; padding: 1px; border-top: 1px solid #F5F5F5; border-bottom: 1px solid #E0E0E0'><tr>
  <td width='20'><img src='graphix/color_swatch.png' width='16' height='16' alt=''/></td>
  <td width='300'><b>Palette</b></td>
  </tr></table>
  <br/>
  <table><tr>
  <td width='50'>Template</td>
  <td>&nbsp; <select id='p_template'><?php echo listPalettes(); ?></select></td>
  </tr></table>
  </div>
  </td>
  <td width='20'></td>
  <td width='730'>
  <center><div id='result_area' style='font-size: 10px;'></div></center>
  </td>
  </tr></table>
  <script type="text/javascript">
  CurrentDiv = 1;
  URL = "";
  Automatic = true;
 
  /* Initial layout */
  toggleDIV(1);
  applyCorners();
  randomize();
  setDefaultAbsissa();
  checkEnabledAxis();
  toggleSubTicks();
  toggleAutoMargins();
  checkChartSettings();
  checkLegend();
  setColors();
  </script>
  </body>
  </html>
  <?php
  function listfonts($Default="")
  {
  echo "<option value='advent_light.ttf'>advent_light</option>";
  echo "<option value='Bedizen.ttf'>Bedizen</option>";
  if ( $Default == "" )
  { echo "<option value='Forgotte.ttf' selected='selected'>Forgotte</option>"; }
  else
  { echo "<option value='Forgotte.ttf'>Forgotte</option>"; }
  echo "<option value='GeosansLight.ttf'>GeosansLight</option>";
  if ( $Default == "pf_arma_five" )
  { echo "<option value='pf_arma_five.ttf' selected='selected'>pf_arma_five</option>"; }
  else
  { echo "<option value='pf_arma_five.ttf'>pf_arma_five</option>"; }
  echo "<option value='Silkscreen.ttf'>Silkscreen</option>";
  }
 
  function listaxis()
  {
  echo "<option value='0' selected='selected'>Axis 0</option>";
  echo "<option value='1'>Axis 1</option>";
  echo "<option value='2'>Axis 2</option>";
  }
 
  function listaxispos()
  {
  echo "<option value='left' selected='selected'>Left</option>";
  echo "<option value='right'>Right</option>";
  }
 
  function LegendFormat()
  {
  echo "<option value='LEGEND_NOBORDER' selected='selected'>LEGEND_NOBORDER</option>";
  echo "<option value='LEGEND_BOX'>LEGEND_BOX</option>";
  echo "<option value='LEGEND_ROUND'>LEGEND_ROUND</option>";
  }
 
  function listCharts()
  {
  echo "<option value='plot'>Plot chart</option>";
  echo "<option value='line'>Line chart</option>";
  echo "<option value='spline' selected='selected'>Spline chart</option>";
  echo "<option value='step'>Step chart</option>";
  echo "<option value='bar'>Bar chart</option>";
  echo "<option value='area'>Area chart</option>";
  echo "<option value='fspline'>Filled spline chart &nbsp;&nbsp;&nbsp;&nbsp;</option>";
  echo "<option value='fstep'>Filled step chart</option>";
  echo "<option value='sbar'>Stacked bar chart</option>";
  echo "<option value='sarea'>Stacked area chart</option>";
  }
 
  function listPalettes()
  {
  echo "<option value='default'>Default</option>";
  echo "<option value='autumn'>Autumn</option>";
  echo "<option value='blind'>Blind</option>";
  echo "<option value='evening'>Evening</option>";
  echo "<option value='kitchen'>Kitchen</option>";
  echo "<option value='light'>Light</option>";
  echo "<option value='navy'>Navy</option>";
  echo "<option value='shade'>Shade</option>";
  echo "<option value='spring'>Spring</option>";
  echo "<option value='shade'>Shade</option>";
  echo "<option value='summer'>Summer</option>";
  }
 
  function listalign()
  {
  echo "<option value='TEXT_ALIGN_TOPLEFT'>TEXT_ALIGN_TOPLEFT</option>";
  echo "<option value='TEXT_ALIGN_TOPMIDDLE'>TEXT_ALIGN_TOPMIDDLE</option>";
  echo "<option value='TEXT_ALIGN_TOPRIGHT'>TEXT_ALIGN_TOPRIGHT</option>";
  echo "<option value='TEXT_ALIGN_MIDDLELEFT'>TEXT_ALIGN_MIDDLELEFT</option>";
  echo "<option selected='selected' value='TEXT_ALIGN_MIDDLEMIDDLE'>TEXT_ALIGN_MIDDLEMIDDLE</option>";
  echo "<option value='TEXT_ALIGN_MIDDLERIGHT'>TEXT_ALIGN_MIDDLERIGHT</option>";
  echo "<option value='TEXT_ALIGN_BOTTOMLEFT'>TEXT_ALIGN_BOTTOMLEFT</option>";
  echo "<option value='TEXT_ALIGN_BOTTOMMIDDLE'>TEXT_ALIGN_BOTTOMMIDDLE</option>";
  echo "<option value='TEXT_ALIGN_BOTTOMRIGHT'>TEXT_ALIGN_BOTTOMRIGHT</option>";
  }
 
  function listaxisformat()
  {
  echo "<option selected='selected' value='AXIS_FORMAT_DEFAULT'>DEFAULT</option>";
  echo "<option value='AXIS_FORMAT_METRIC'>METRIC</option>";
  echo "<option value='AXIS_FORMAT_CURRENCY'>CURRENCY</option>";
  }
  ?>
  <?php
  /*
  render.php - Sandbox rendering engine
 
  Version : 1.1.0
  Made by : Jean-Damien POGOLOTTI
  Last Update : 18/01/11
 
  This file can be distributed under the license you can find at :
 
  http://www.pchart.net/license
 
  You can find the whole class documentation on the pChart web site.
  */
 
  session_start();
 
  if ( !isset($_GET["Mode"]) ) { $Mode = "Render"; } else { $Mode = $_GET["Mode"]; }
 
  $Constants = readConstantFile();
 
  /* -- Retrieve General configuration items -------------------------------- */
  $g_width = $_SESSION["g_width"];
  $g_height = $_SESSION["g_height"];
  $g_border = $_SESSION["g_border"];
 
  $g_aa = $_SESSION["g_aa"];
  $g_shadow = $_SESSION["g_shadow"];
  $g_transparent = $_SESSION["g_transparent"];
 
  $g_title_enabled = $_SESSION["g_title_enabled"];
  $g_title = $_SESSION["g_title"];
  $g_title_align = $_SESSION["g_title_align"];
  $g_title_x = $_SESSION["g_title_x"];
  $g_title_y = $_SESSION["g_title_y"];
  $g_title_color = $_SESSION["g_title_color"];
  $g_title_font = $_SESSION["g_title_font"];
  $g_title_font_size = $_SESSION["g_title_font_size"];
  $g_title_box = $_SESSION["g_title_box"];
 
  $g_solid_enabled = $_SESSION["g_solid_enabled"];
  $g_solid_color = $_SESSION["g_solid_color"];
  $g_solid_dashed = $_SESSION["g_solid_dashed"];
 
  $g_gradient_enabled = $_SESSION["g_gradient_enabled"];
  $g_gradient_start = $_SESSION["g_gradient_start"];
  $g_gradient_end = $_SESSION["g_gradient_end"];
  $g_gradient_direction = $_SESSION["g_gradient_direction"];
  $g_gradient_alpha = $_SESSION["g_gradient_alpha"];
  /* ------------------------------------------------------------------------ */
 
  /* -- Retrieve Data configuration items ----------------------------------- */
  $d_serie1_enabled = $_SESSION["d_serie1_enabled"];
  $d_serie2_enabled = $_SESSION["d_serie2_enabled"];
  $d_serie3_enabled = $_SESSION["d_serie3_enabled"];
  $d_absissa_enabled = $_SESSION["d_absissa_enabled"];
 
  $d_serie1_name = $_SESSION["d_serie1_name"];
  $d_serie2_name = $_SESSION["d_serie2_name"];
  $d_serie3_name = $_SESSION["d_serie3_name"];
 
  $d_serie1_axis = $_SESSION["d_serie1_axis"];
  $d_serie2_axis = $_SESSION["d_serie2_axis"];
  $d_serie3_axis = $_SESSION["d_serie3_axis"];
 
  $data0 = $_SESSION["data0"];
  $data1 = $_SESSION["data1"];
  $data2 = $_SESSION["data2"];
  $absissa = $_SESSION["absissa"];
 
  $d_normalize_enabled = $_SESSION["d_normalize_enabled"];
 
  $d_axis0_name = $_SESSION["d_axis0_name"];
  $d_axis1_name = $_SESSION["d_axis1_name"];
  $d_axis2_name = $_SESSION["d_axis2_name"];
 
  $d_axis0_unit = $_SESSION["d_axis0_unit"];
  $d_axis1_unit = $_SESSION["d_axis1_unit"];
  $d_axis2_unit = $_SESSION["d_axis2_unit"];
 
  $d_axis0_position = $_SESSION["d_axis0_position"];
  $d_axis1_position = $_SESSION["d_axis1_position"];
  $d_axis2_position = $_SESSION["d_axis2_position"];
 
  $d_axis0_format = $_SESSION["d_axis0_format"];
  $d_axis1_format = $_SESSION["d_axis1_format"];
  $d_axis2_format = $_SESSION["d_axis2_format"];
 
  /* ------------------------------------------------------------------------ */
 
  /* -- Retrieve Scale configuration items ---------------------------------- */
  $s_x = $_SESSION["s_x"];
  $s_y = $_SESSION["s_y"];
  $s_width = $_SESSION["s_width"];
  $s_height = $_SESSION["s_height"];
  $s_direction = $_SESSION["s_direction"];
  $s_arrows_enabled = $_SESSION["s_arrows_enabled"];
  $s_mode = $_SESSION["s_mode"];
  $s_cycle_enabled = $_SESSION["s_cycle_enabled"];
  $s_x_margin = $_SESSION["s_x_margin"];
  $s_y_margin = $_SESSION["s_y_margin"];
  $s_automargin_enabled = $_SESSION["s_automargin_enabled"];
  $s_font = $_SESSION["s_font"];
  $s_font_size = $_SESSION["s_font_size"];
  $s_font_color = $_SESSION["s_font_color"];
 
  $s_x_labeling = $_SESSION["s_x_labeling"];
  $s_x_skip = $_SESSION["s_x_skip"];
  $s_x_label_rotation = $_SESSION["s_x_label_rotation"];
 
  $s_grid_color = $_SESSION["s_grid_color"];
  $s_grid_alpha = $_SESSION["s_grid_alpha"];
  $s_grid_x_enabled = $_SESSION["s_grid_x_enabled"];
  $s_grid_y_enabled = $_SESSION["s_grid_y_enabled"];
 
  $s_ticks_color = $_SESSION["s_ticks_color"];
  $s_ticks_alpha = $_SESSION["s_ticks_alpha"];
  $s_subticks_color = $_SESSION["s_subticks_color"];
  $s_subticks_alpha = $_SESSION["s_subticks_alpha"];
  $s_subticks_enabled = $_SESSION["s_subticks_enabled"];
  /* ------------------------------------------------------------------------ */
 
  /* -- Retrieve Chart configuration items ---------------------------------- */
  $c_family = $_SESSION["c_family"];
  $c_display_values = $_SESSION["c_display_values"];
  $c_break_color = $_SESSION["c_break_color"];
  $c_break = $_SESSION["c_break"];
 
  $c_plot_size = $_SESSION["c_plot_size"];
  $c_border_size = $_SESSION["c_border_size"];
  $c_border_enabled = $_SESSION["c_border_enabled"];
 
  $c_bar_classic = $_SESSION["c_bar_classic"];
  $c_bar_rounded = $_SESSION["c_bar_rounded"];
  $c_bar_gradient = $_SESSION["c_bar_gradient"];
  $c_around_zero1 = $_SESSION["c_around_zero1"];
 
  $c_transparency = $_SESSION["c_transparency"];
  $c_forced_transparency = $_SESSION["c_forced_transparency"];
  $c_around_zero2 = $_SESSION["c_around_zero2"];
  /* ------------------------------------------------------------------------ */
 
  /* -- Retrieve Legend configuration items ---------------------------------- */
  $l_enabled = $_SESSION["l_enabled"];
 
  $l_font = $_SESSION["l_font"];
  $l_font_size = $_SESSION["l_font_size"];
  $l_font_color = $_SESSION["l_font_color"];
 
  $l_margin = $_SESSION["l_margin"];
  $l_alpha = $_SESSION["l_alpha"];
  $l_format = $_SESSION["l_format"];
 
  $l_orientation = $_SESSION["l_orientation"];
  $l_box_size = $_SESSION["l_box_size"];
 
  $l_position = $_SESSION["l_position"];
  $l_x = $_SESSION["l_x"];
  $l_y = $_SESSION["l_y"];
 
  $l_family = $_SESSION["l_family"];
  /* ------------------------------------------------------------------------ */
 
  /* -- Retrieve Threshold configuration items ------------------------------ */
  $t_enabled = $_SESSION["t_enabled"];
 
  $t_value = $_SESSION["t_value"];
  $t_axis = $_SESSION["t_axis"];
 
  $t_color = $_SESSION["t_color"];
  $t_alpha = $_SESSION["t_alpha"];
  $t_ticks = $_SESSION["t_ticks"];
 
  $t_caption = $_SESSION["t_caption"];
  $t_box = $_SESSION["t_box"];
  $t_caption_enabled = $_SESSION["t_caption_enabled"];
  /* ------------------------------------------------------------------------ */
 
  /* -- Retrieve slope chart configuration items ---------------------------- */
  $sl_enabled = $_SESSION["sl_enabled"];
  $sl_shaded = $_SESSION["sl_shaded"];
  $sl_caption_enabled = $_SESSION["sl_caption_enabled"];
  $sl_caption_line = $_SESSION["sl_caption_line"];
  /* ------------------------------------------------------------------------ */
 
  /* -- Retrieve color configuration items ---------------------------------- */
  $p_template = $_SESSION["p_template"];
  /* ------------------------------------------------------------------------ */
 
 
  /* pChart library inclusions */
  include("../../../class/pData.class.php");
  include("../../../class/pDraw.class.php");
  include("../../../class/pImage.class.php");
 
  $myData = new pData();
  if ( $Mode == "Source" )
  {
  echo "&lt;?php\r\n";
  echo 'include("class/pData.class.php");'."\r\n";
  echo 'include("class/pDraw.class.php");'."\r\n";
  echo 'include("class/pImage.class.php");'."\r\n";
  echo "\r\n";
  echo '$myData = new pData();'."\r\n";
  }
 
  if ( $p_template != "default" )
  $myData->loadPalette("../../../palettes/".$p_template.".color",TRUE);
 
  $Axis = "";
  if ( $d_serie1_enabled == "true" )
  {
  $data0 = stripTail($data0);
  $Values = preg_split("/!/",right($data0,strlen($data0)-1));
  foreach($Values as $key => $Value)
  { if ( $Value == "" ) { $Value = VOID; } $myData->addPoints($Value,"Serie1"); }
 
  $myData->setSerieDescription("Serie1",$d_serie1_name);
  $myData->setSerieOnAxis("Serie1",$d_serie1_axis);
  $Axis[$d_serie1_axis] = TRUE;
 
  if ( $Mode == "Source" )
  {
  $Data = "";
  foreach($Values as $key => $Value)
  { if ( $Value == "" || $Value == VOID ) { $Value = "VOID"; } $Data = $Data.",".toString($Value); }
  $Data = right($Data,strlen($Data)-1);
 
  echo '$myData->addPoints(array('.$Data.'),"Serie1");'."\r\n";
  echo '$myData->setSerieDescription("Serie1","'.$d_serie1_name.'");'."\r\n";
  echo '$myData->setSerieOnAxis("Serie1",'.$d_serie1_axis.');'."\r\n\r\n";
 
  $Axis[$d_serie1_axis] = TRUE;
  }
  }
 
  if ( $d_serie2_enabled == "true" )
  {
  $data1 = stripTail($data1);
  $Values = preg_split("/!/",right($data1,strlen($data1)-1));
  foreach($Values as $key => $Value)
  { if ( $Value == "" ) { $Value = VOID; } $myData->addPoints($Value,"Serie2"); }
 
  $myData->setSerieDescription("Serie2",$d_serie2_name);
  $myData->setSerieOnAxis("Serie2",$d_serie2_axis);
  $Axis[$d_serie2_axis] = TRUE;
 
  if ( $Mode == "Source" )
  {
  $Data = "";
  foreach($Values as $key => $Value)
  { if ( $Value == "" ) { $Value = "VOID"; } $Data = $Data.",".toString($Value); }
  $Data = right($Data,strlen($Data)-1);
 
  echo '$myData->addPoints(array('.$Data.'),"Serie2");'."\r\n";
  echo '$myData->setSerieDescription("Serie2","'.$d_serie2_name.'");'."\r\n";
  echo '$myData->setSerieOnAxis("Serie2",'.$d_serie2_axis.');'."\r\n\r\n";
 
  $Axis[$d_serie2_axis] = TRUE;
  }
  }
 
  if ( $d_serie3_enabled == "true" )
  {
  $data2 = stripTail($data2);
  $Values = preg_split("/!/",right($data2,strlen($data2)-1));
  foreach($Values as $key => $Value)
  { if ( $Value == "" ) { $Value = VOID; } $myData->addPoints($Value,"Serie3"); }
 
  $myData->setSerieDescription("Serie3",$d_serie3_name);
  $myData->setSerieOnAxis("Serie3",$d_serie3_axis);
  $Axis[$d_serie3_axis] = TRUE;
 
  if ( $Mode == "Source" )
  {
  $Data = "";
  foreach($Values as $key => $Value)
  { if ( $Value == "" ) { $Value = "VOID"; } $Data = $Data.",".toString($Value); }
  $Data = right($Data,strlen($Data)-1);
 
  echo '$myData->addPoints(array('.$Data.'),"Serie3");'."\r\n";
  echo '$myData->setSerieDescription("Serie3","'.$d_serie3_name.'");'."\r\n";
  echo '$myData->setSerieOnAxis("Serie3",'.$d_serie3_axis.');'."\r\n\r\n";
 
  $Axis[$d_serie3_axis] = TRUE;
  }
  }
 
  if ( $d_absissa_enabled == "true" )
  {
  $absissa = stripTail($absissa);
  $Values = preg_split("/!/",right($absissa,strlen($absissa)-1));
  foreach($Values as $key => $Value)
  { if ( $Value == "" ) { $Value = VOID; } $myData->addPoints($Value,"Absissa"); }
 
  $myData->setAbscissa("Absissa");
 
  if ( $Mode == "Source" )
  {
  $Data = "";
  foreach($Values as $key => $Value)
  { if ( $Value == "" ) { $Value = "VOID"; } $Data = $Data.",".toString($Value); }
  $Data = right($Data,strlen($Data)-1);
 
  echo '$myData->addPoints(array('.$Data.'),"Absissa");'."\r\n";
  echo '$myData->setAbscissa("Absissa");'."\r\n\r\n";
  }
  }
 
  if ( isset($Axis[0]) )
  {
  if ( $d_axis0_position == "left" ) { $myData->setAxisPosition(0,AXIS_POSITION_LEFT); } else { $myData->setAxisPosition(0,AXIS_POSITION_RIGHT); }
  $myData->setAxisName(0,$d_axis0_name);
  $myData->setAxisUnit(0,$d_axis0_unit);
 
  if ( $d_axis0_format == "AXIS_FORMAT_METRIC" ) { $myData->setAxisDisplay(0,680004); }
  if ( $d_axis0_format == "AXIS_FORMAT_CURRENCY" ) { $myData->setAxisDisplay(0,680005,"$"); }
 
  if ( $Mode == "Source" )
  {
  if ( $d_axis0_position == "left" ) { echo '$myData->setAxisPosition(0,AXIS_POSITION_LEFT);'."\r\n"; } else { echo '$myData->setAxisPosition(0,AXIS_POSITION_RIGHT);'."\r\n"; }
  echo '$myData->setAxisName(0,"'.$d_axis0_name.'");'."\r\n";
  echo '$myData->setAxisUnit(0,"'.$d_axis0_unit.'");'."\r\n\r\n";
  }
  }
 
  if ( isset($Axis[1]) )
  {
  if ( $d_axis1_position == "left" ) { $myData->setAxisPosition(1,AXIS_POSITION_LEFT); } else { $myData->setAxisPosition(1,AXIS_POSITION_RIGHT); }
  $myData->setAxisName(1,$d_axis1_name);
  $myData->setAxisUnit(1,$d_axis1_unit);
 
  if ( $Mode == "Source" )
  {
  if ( $d_axis1_position == "left" ) { echo '$myData->setAxisPosition(1,AXIS_POSITION_LEFT);'."\r\n"; } else { echo '$myData->setAxisPosition(1,AXIS_POSITION_RIGHT);'."\r\n"; }
  echo '$myData->setAxisName(1,"'.$d_axis1_name.'");'."\r\n";
  echo '$myData->setAxisUnit(1,"'.$d_axis1_unit.'");'."\r\n\r\n";
  }
  }
 
  if ( isset($Axis[2]) )
  {
  if ( $d_axis2_position == "left" ) { $myData->setAxisPosition(2,AXIS_POSITION_LEFT); } else { $myData->setAxisPosition(2,AXIS_POSITION_RIGHT); }
  $myData->setAxisName(2,$d_axis2_name);
  $myData->setAxisUnit(2,$d_axis2_unit);
 
  if ( $Mode == "Source" )
  {
  if ( $d_axis2_position == "left" ) { echo '$myData->setAxisPosition(2,AXIS_POSITION_LEFT);'."\r\n"; } else { echo '$myData->setAxisPosition(2,AXIS_POSITION_RIGHT);'."\r\n"; }
  echo '$myData->setAxisName(2,"'.$d_axis2_name.'");'."\r\n";
  echo '$myData->setAxisUnit(2,"'.$d_axis2_unit.'");'."\r\n\r\n";
  }
  }
 
  if ( $d_normalize_enabled == "true" )
  {
  if ( $Mode == "Render" )
  $myData->normalize(100);
  else
  echo '$myData->normalize(100);'."\r\n";
  }
 
  if ( $Mode == "Render" )
  {
  if ( $g_transparent == "true" )
  $myPicture = new pImage($g_width,$g_height,$myData,TRUE);
  else
  $myPicture = new pImage($g_width,$g_height,$myData);
  }
  else
  {
  $myPicture = new pImage($g_width,$g_height,$myData);
  if ( $g_transparent == "true" )
  echo '$myPicture = new pImage('.$g_width.','.$g_height.',$myData,TRUE);'."\r\n";
  else
  echo '$myPicture = new pImage('.$g_width.','.$g_height.',$myData);'."\r\n";
  }
 
  if ( $g_aa == "false" )
  {
  if ( $Mode == "Render" )
  $myPicture->Antialias = FALSE;
  else
  echo '$myPicture->Antialias = FALSE;'."\r\n";
  }
 
  if ( $g_solid_enabled == "true" )
  {
  list($R,$G,$B) = extractColors($g_solid_color);
  $Settings = array("R"=>$R,"G"=>$G,"B"=>$B);
 
  if ( $g_solid_dashed == "true" ) { $Settings["Dash"] = TRUE; $Settings["DashR"]=$R+20; $Settings["DashG"]=$G+20; $Settings["DashB"]=$B+20; }
 
  if ( $Mode == "Render" )
  $myPicture->drawFilledRectangle(0,0,$g_width,$g_height,$Settings);
  else
  {
  echo dumpArray("Settings",$Settings);
  echo '$myPicture->drawFilledRectangle(0,0,'.$g_width.','.$g_height.',$Settings);'."\r\n\r\n";
  }
  }
 
  if ( $g_gradient_enabled == "true" )
  {
  list($StartR,$StartG,$StartB) = extractColors($g_gradient_start);
  list($EndR,$EndG,$EndB) = extractColors($g_gradient_end);
 
  $Settings = array("StartR"=>$StartR,"StartG"=>$StartG,"StartB"=>$StartB,"EndR"=>$EndR,"EndG"=>$EndG,"EndB"=>$EndB,"Alpha"=>$g_gradient_alpha);
 
  if ( $Mode == "Render" )
  {
  if ( $g_gradient_direction == "vertical" )
  $myPicture->drawGradientArea(0,0,$g_width,$g_height,DIRECTION_VERTICAL,$Settings);
  else
  $myPicture->drawGradientArea(0,0,$g_width,$g_height,DIRECTION_HORIZONTAL,$Settings);
  }
  else
  {
  echo dumpArray("Settings",$Settings);
 
  if ( $g_gradient_direction == "vertical" )
  echo '$myPicture->drawGradientArea(0,0,'.$g_width.','.$g_height.',DIRECTION_VERTICAL,$Settings);'."\r\n\r\n";
  else
  echo '$myPicture->drawGradientArea(0,0,'.$g_width.','.$g_height.',DIRECTION_HORIZONTAL,$Settings);'."\r\n\r\n";
  }
  }
 
  if ( $Mode == "Render" )
  {
  if ( $g_border == "true" ) { $myPicture->drawRectangle(0,0,$g_width-1,$g_height-1,array("R"=>0,"G"=>0,"B"=>0)); }
  if ( $g_shadow == "true" ) { $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>50,"G"=>50,"B"=>50,"Alpha"=>20)); }
  }
  else
  {
  if ( $g_border == "true" ) { echo '$myPicture->drawRectangle(0,0,'.($g_width-1).','.($g_height-1).',array("R"=>0,"G"=>0,"B"=>0));'."\r\n\r\n"; }
  if ( $g_shadow == "true" ) { echo '$myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>50,"G"=>50,"B"=>50,"Alpha"=>20));'."\r\n\r\n"; }
  }
 
  if ( $g_title_enabled == "true" )
  {
  if ( $Mode == "Render" )
  $myPicture->setFontProperties(array("FontName"=>"../../../fonts/".$g_title_font,"FontSize"=>$g_title_font_size));
  else
  echo '$myPicture->setFontProperties(array("FontName"=>"fonts/'.$g_title_font.'","FontSize"=>'.$g_title_font_size.'));'."\r\n";
 
  list($R,$G,$B) = extractColors($g_title_color);
 
  $TextSettings = array("Align"=>getTextAlignCode($g_title_align),"R"=>$R,"G"=>$G,"B"=>$B);
  if ( $g_title_box == "true" ) { $TextSettings["DrawBox"] = TRUE; $TextSettings["BoxAlpha"] = 30; }
 
  if ( $Mode == "Render" )
  $myPicture->drawText($g_title_x,$g_title_y,$g_title,$TextSettings);
  else
  {
  echo dumpArray("TextSettings",$TextSettings);
  echo '$myPicture->drawText('.$g_title_x.','.$g_title_y.',"'.$g_title.'",$TextSettings);'."\r\n\r\n";
  }
  }
 
  /* Scale section */
  if ( $Mode == "Render" )
  { if ( $g_shadow == "true" ) { $myPicture->setShadow(FALSE); } }
  else
  { if ( $g_shadow == "true" ) { echo '$myPicture->setShadow(FALSE);'."\r\n"; } }
 
  if ( $Mode == "Render" )
  $myPicture->setGraphArea($s_x,$s_y,$s_x+$s_width,$s_y+$s_height);
  else
  echo '$myPicture->setGraphArea('.$s_x.','.$s_y.','.($s_x+$s_width).','.($s_y+$s_height).');'."\r\n";
 
  list($R,$G,$B) = extractColors($s_font_color);
  if ( $Mode == "Render" )
  $myPicture->setFontProperties(array("R"=>$R,"G"=>$G,"B"=>$B,"FontName"=>"../../../fonts/".$s_font,"FontSize"=>$s_font_size));
  else
  echo '$myPicture->setFontProperties(array("R"=>'.$R.',"G"=>'.$G.',"B"=>'.$B.',"FontName"=>"fonts/'.$s_font.'","FontSize"=>'.$s_font_size.'));'."\r\n\r\n";
 
  /* Scale specific parameters -------------------------------------------------------------------------------- */
  list($GridR,$GridG,$GridB) = extractColors($s_grid_color);
  list($TickR,$TickG,$TickB) = extractColors($s_ticks_color);
  list($SubTickR,$SubTickG,$SubTickB) = extractColors($s_subticks_color);
 
  if ( $s_direction == "SCALE_POS_LEFTRIGHT" ) { $Pos = 690101; } else { $Pos = 690102; }
  if ( $s_x_labeling == "LABELING_ALL") { $Labeling = 691011; } else { $Labeling = 691012; }
  if ( $s_mode == "SCALE_MODE_FLOATING" ) { $iMode = 690201; }
  if ( $s_mode == "SCALE_MODE_START0" ) { $iMode = 690202; }
  if ( $s_mode == "SCALE_MODE_ADDALL" ) { $iMode = 690203; }
  if ( $s_mode == "SCALE_MODE_ADDALL_START0" ) { $iMode = 690204; }
 
  $Settings = array("Pos"=>$Pos,"Mode"=>$iMode,"LabelingMethod"=>$Labeling,"GridR"=>$GridR,"GridG"=>$GridG,"GridB"=>$GridB,"GridAlpha"=>$s_grid_alpha,"TickR"=>$TickR,"TickG"=>$TickG,"TickB"=>$TickB,"TickAlpha"=>$s_ticks_alpha,"LabelRotation"=>$s_x_label_rotation);
 
  if ( $s_x_skip != 0 ) { $Settings["LabelSkip"] = $s_x_skip; }
  if ( $s_cycle_enabled == "true" ) { $Settings["CycleBackground"] = TRUE; }
  if ( $s_arrows_enabled == "true" ) { $Settings["DrawArrows"] = TRUE; }
  if ( $s_grid_x_enabled == "true" ) { $Settings["DrawXLines"] = TRUE; } else { $Settings["DrawXLines"] = 0; }
  if ( $s_subticks_enabled == "true" )
  { $Settings["DrawSubTicks"] = TRUE; $Settings["SubTickR"] = $SubTickR; $Settings["SubTickG"] = $SubTickG; $Settings["SubTickB"] = $SubTickB; $Settings["SubTickAlpha"] = $s_subticks_alpha;}
  if ( $s_automargin_enabled == "false" )
  { $Settings["XMargin"] = $s_x_margin; $Settings["YMargin"] = $s_y_margin; }
 
  if ( $Mode == "Render" )
  {
  if ( $s_grid_y_enabled == "true" ) { $Settings["DrawYLines"] = ALL; } else { $Settings["DrawYLines"] = NONE; }
  $myPicture->drawScale($Settings);
  }
  else
  {
  if ( $s_grid_y_enabled == "true" ) { $Settings["DrawYLines"] = "ALL"; } else { $Settings["DrawYLines"] = "NONE"; }
  echo dumpArray("Settings",$Settings);
  echo '$myPicture->drawScale($Settings);'."\r\n\r\n";
  }
  /* ---------------------------------------------------------------------------------------------------------- */
 
  if ( $Mode == "Render" )
  { if ( $g_shadow == "true" ) { $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>50,"G"=>50,"B"=>50,"Alpha"=>10)); } }
  else
  { if ( $g_shadow == "true" ) { echo '$myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>50,"G"=>50,"B"=>50,"Alpha"=>10));'."\r\n\r\n"; } }
 
  /* Chart specific parameters -------------------------------------------------------------------------------- */
  if ( $c_display_values == "true" ) { $Config = array("DisplayValues"=>TRUE); } else { $Config = ""; }
 
  if ( $c_family == "plot" )
  {
  $Config["PlotSize"] = $c_plot_size;
  if ( $c_border_enabled == "true" ) { $Config["PlotBorder"] = TRUE; $Config["BorderSize"] = $c_border_size; }
 
  if ( $Mode == "Render" )
  $myPicture->drawPlotChart($Config);
  else
  {
  echo dumpArray("Config",$Config);
  echo '$myPicture->drawPlotChart($Config);'."\r\n";
  }
  }
 
  if ( $c_family == "line" )
  {
  if ( $c_break == "true" )
  {
  list($BreakR,$BreakG,$BreakB) = extractColors($c_break_color);
 
  $Config["BreakVoid"] = 0;
  $Config["BreakR"] = $BreakR;
  $Config["BreakG"] = $BreakG;
  $Config["BreakB"] = $BreakB;
  }
 
  if ( $Mode == "Render" )
  $myPicture->drawLineChart($Config);
  else
  {
  echo dumpArray("Config",$Config);
  echo '$myPicture->drawLineChart($Config);'."\r\n";
  }
  }
 
  if ( $c_family == "step" )
  {
  if ( $c_break == "true" )
  {
  list($BreakR,$BreakG,$BreakB) = extractColors($c_break_color);
 
  $Config["BreakVoid"] = 0;
  $Config["BreakR"] = $BreakR;
  $Config["BreakG"] = $BreakG;
  $Config["BreakB"] = $BreakB;
  }
 
  if ( $Mode == "Render" )
  $myPicture->drawStepChart($Config);
  else
  {
  echo dumpArray("Config",$Config);
  echo '$myPicture->drawStepChart($Config);'."\r\n";
  }
  }
 
  if ( $c_family == "spline" )
  {
  if ( $c_break == "true" )
  {
  list($BreakR,$BreakG,$BreakB) = extractColors($c_break_color);
 
  $Config["BreakVoid"] = 0;
  $Config["BreakR"] = $BreakR;
  $Config["BreakG"] = $BreakG;
  $Config["BreakB"] = $BreakB;
  }
 
  if ( $Mode == "Render" )
  $myPicture->drawSplineChart($Config);
  else
  {
  echo dumpArray("Config",$Config);
  echo '$myPicture->drawSplineChart($Config);'."\r\n";
  }
  }
 
  if ( $c_family == "bar" )
  {
  if ( $c_bar_rounded == "true" ) { $Config["Rounded"] = TRUE; }
  if ( $c_bar_gradient == "true" ) { $Config["Gradient"] = TRUE; }
  if ( $c_around_zero1 == "true" ) { $Config["AroundZero"] = TRUE; }
 
  if ( $Mode == "Render" )
  $myPicture->drawBarChart($Config);
  else
  {
  echo dumpArray("Config",$Config);
  echo '$myPicture->drawBarChart($Config);'."\r\n";
  }
  }
 
  if ( $c_family == "area" )
  {
  if ( $c_forced_transparency == "true" ) { $Config["ForceTransparency"] = $c_transparency; }
  if ( $c_around_zero2 == "true" ) { $Config["AroundZero"] = TRUE; }
 
  if ( $Mode == "Render" )
  $myPicture->drawAreaChart($Config);
  else
  {
  echo dumpArray("Config",$Config);
  echo '$myPicture->drawAreaChart($Config);'."\r\n";
  }
  }
 
  if ( $c_family == "fstep" )
  {
  if ( $c_forced_transparency == "true" ) { $Config["ForceTransparency"] = $c_transparency; }
  if ( $c_around_zero2 == "true" ) { $Config["AroundZero"] = TRUE; } else { $Config["AroundZero"] = FALSE; }
 
  if ( $Mode == "Render" )
  $myPicture->drawFilledStepChart($Config);
  else
  {
  echo dumpArray("Config",$Config);
  echo '$myPicture->drawFilledStepChart($Config);'."\r\n";
  }
  }
 
  if ( $c_family == "fspline" )
  {
  if ( $c_forced_transparency == "true" ) { $Config["ForceTransparency"] = $c_transparency; }
  if ( $c_around_zero2 == "true" ) { $Config["AroundZero"] = TRUE; }
 
  if ( $Mode == "Render" )
  $myPicture->drawFilledSplineChart($Config);
  else
  {
  echo dumpArray("Config",$Config);
  echo '$myPicture->drawFilledSplineChart($Config);'."\r\n";
  }
  }
 
  if ( $c_family == "sbar" )
  {
  if ( $c_bar_rounded == "true" ) { $Config["Rounded"] = TRUE; }
  if ( $c_bar_gradient == "true" ) { $Config["Gradient"] = TRUE; }
  if ( $c_around_zero1 == "true" ) { $Config["AroundZero"] = TRUE; }
 
  if ( $Mode == "Render" )
  $myPicture->drawStackedBarChart($Config);
  else
  {
  echo dumpArray("Config",$Config);
  echo '$myPicture->drawStackedBarChart($Config);'."\r\n";
  }
  }
 
  if ( $c_family == "sarea" )
  {
  if ( $c_forced_transparency == "true" ) { $Config["ForceTransparency"] = $c_transparency; }
  if ( $c_around_zero2 == "true" ) { $Config["AroundZero"] = TRUE; }
 
  if ( $Mode == "Render" )
  $myPicture->drawStackedAreaChart($Config);
  else
  {
  echo dumpArray("Config",$Config);
  echo '$myPicture->drawStackedAreaChart($Config);'."\r\n";
  }
  }
 
  if ( $t_enabled == "true" )
  {
  list($R,$G,$B) = extractColors($t_color);
 
  $Config = "";
  $Config["R"] = $R; $Config["G"] = $G; $Config["B"] = $B;
  $Config["Alpha"] = $t_alpha;
 
  if ( isset($myData->Data["Axis"][$t_axis]) ) { $Config["AxisID"] = $t_axis; }
 
  if ( $t_ticks == "true" ) { $Config["Ticks"] = 4; } else { $Config["Ticks"] = 0; }
 
  if ( $t_caption_enabled == "true" )
  {
  $Config["WriteCaption"] = TRUE;
  $Config["Caption"] = $t_caption;
  if ( $t_box == "true" ) { $Config["DrawBox"] = TRUE; }
  }
 
  if ( $Mode == "Render" )
  $myPicture->drawThreshold($t_value,$Config);
  else
  {
  $Config["Caption"] = chr(34).$t_caption.chr(34);
 
  echo "\r\n";
  echo dumpArray("Config",$Config);
  echo '$myPicture->drawThreshold('.$t_value.',$Config);'."\r\n";
  }
  }
 
  if ( $l_enabled == "true" )
  {
  list($R,$G,$B) = extractColors($l_font_color);
 
  $Config = "";
  $Config["FontR"] = $R; $Config["FontG"] = $G; $Config["FontB"] = $B;
  $Config["FontName"] = "../../../fonts/".$l_font;
  $Config["FontSize"] = $l_font_size;
  $Config["Margin"] = $l_margin;
  $Config["Alpha"] = $l_alpha;
  $Config["BoxSize"] = $l_box_size;
 
  if ( $l_format == "LEGEND_NOBORDER" ) { $Config["Style"] = 690800; }
  if ( $l_format == "LEGEND_BOX" ) { $Config["Style"] = 690801; }
  if ( $l_format == "LEGEND_ROUND" ) { $Config["Style"] = 690802; }
 
  if ( $l_orientation == "LEGEND_VERTICAL" ) { $Config["Mode"] = 690901; }
  if ( $l_orientation == "LEGEND_HORIZONTAL" ) { $Config["Mode"] = 690902; }
 
  if ( $l_family == "LEGEND_FAMILY_CIRCLE" ) { $Config["Family"] = 691052; }
  if ( $l_family == "LEGEND_FAMILY_LINE" ) { $Config["Family"] = 691053; }
 
  $Size = $myPicture->getLegendSize($Config);
  if ( $l_position == "CORNER_TOP_RIGHT" )
  { $l_y = $l_margin + 10; $l_x = $g_width - $Size["Width"] - 10 + $l_margin; }
  if ( $l_position == "CORNER_BOTTOM_RIGHT" )
  { $l_y = $g_height - $Size["Height"] - 10 + $l_margin; $l_x = $g_width - $Size["Width"] - 10 + $l_margin; }
 
  if ( $Mode == "Render" )
  $myPicture->drawLegend($l_x,$l_y,$Config);
  else
  {
  $Config["FontName"] = chr(34)."fonts/".$l_font.chr(34);
 
  echo "\r\n";
  echo dumpArray("Config",$Config);
  echo '$myPicture->drawLegend('.$l_x.','.$l_y.',$Config);'."\r\n";
  }
  }
 
  if ( $sl_enabled == "true" )
  {
  $Config = "";
  $Config["CaptionMargin"] = 10;
  $Config["CaptionWidth"] = 10;
 
  if ( $sl_shaded == "true" ) { $Config["ShadedSlopeBox"] = TRUE; }
  if ( $sl_caption_enabled != "true" ) { $Config["Caption"] = FALSE; }
  if ( $sl_caption_line == "true" ) { $Config["CaptionLine"] =TRUE; }
 
  if ( $Mode == "Render" )
  $myPicture->drawDerivative($Config);
  else
  {
  echo "\r\n";
  echo dumpArray("Config",$Config);
  echo '$myPicture->drawDerivative($Config);'."\r\n";
  }
  }
 
  if ( $Mode == "Render" )
  $myPicture->stroke();
  else
  echo "\r\n".'$myPicture->stroke();'."\r\n?>";
 
  function extractColors($Hexa)
  {
  if ( strlen($Hexa) != 6 ) { return(array(0,0,0)); }
 
  $R = hexdec(left($Hexa,2));
  $G = hexdec(mid($Hexa,3,2));
  $B = hexdec(right($Hexa,2));
 
  return(array($R,$G,$B));
  }
 
  function getTextAlignCode($Mode)
  {
  if ( $Mode == "TEXT_ALIGN_TOPLEFT" ) { return(690401); }
  if ( $Mode == "TEXT_ALIGN_TOPMIDDLE" ) { return(690402); }
  if ( $Mode == "TEXT_ALIGN_TOPRIGHT" ) { return(690403); }
  if ( $Mode == "TEXT_ALIGN_MIDDLELEFT" ) { return(690404); }
  if ( $Mode == "TEXT_ALIGN_MIDDLEMIDDLE" ) { return(690405); }
  if ( $Mode == "TEXT_ALIGN_MIDDLERIGHT" ) { return(690406); }
  if ( $Mode == "TEXT_ALIGN_BOTTOMLEFT" ) { return(690407); }
  if ( $Mode == "TEXT_ALIGN_BOTTOMMIDDLE" ) { return(690408); }
  if ( $Mode == "TEXT_ALIGN_BOTTOMRIGHT" ) { return(690409); }
  }
 
  function dumpArray($Name,$Values)
  {
  if ( $Values == "" ) { return('$'.$Name.' = "";'."\r\n"); }
 
  $Result = '$'.$Name." = array(";
  foreach ($Values as $Key => $Value)
  { $Result = $Result.chr(34).$Key.chr(34)."=>".translate($Value).", "; }
 
  $Result = left($Result,strlen($Result)-2).");\r\n";
 
  return($Result);
  }
 
  function translate($Value)
  {
  global $Constants;
 
  if ( isset($Constants[$Value]))
  return($Constants[$Value]);
  else
  return($Value);
  }
 
 
  function stripTail($Values)
  {
  $Values = preg_split("/!/",right($Values,strlen($Values)-1));
 
  $Temp = ""; $Result = "";
  foreach($Values as $Key => $Value)
  {
  if ( $Value == "" )
  { $Temp[] = VOID; }
  else
  {
  if ( $Temp != "" && $Result != "" )
  { $Result = array_merge($Result,$Temp); }
  elseif( $Temp != "" && $Result == "" )
  { $Result = $Temp; }
 
  $Result[] = $Value;
  $Temp = "";
  }
  }
 
  $Serialized = "!"; foreach($Result as $Key => $Value) { $Serialized = $Serialized.$Value."!"; }
  $Serialized = left($Serialized,strlen($Serialized)-1);
 
  return($Serialized);
  }
 
  function readConstantFile()
  {
  $FileName = "../includes/constants.txt";
 
  $handle = @fopen($FileName, "r");
  if ($handle)
  {
  $Result = "";
  while (($buffer = fgets($handle, 4096)) !== false)
  {
  $Values = preg_split("/,/",$buffer);
  $Result[$Values[0]] = $Values[1];
  }
  fclose($handle);
  return($Result);
  }
  else
  { return(array("VOID"=>"0.12345")); }
  }
 
  function toString($Value)
  {
  if ( is_numeric($Value) || $Value == "VOID")
  return($Value);
  else
  return(chr(34).$Value.chr(34));
  }
 
  function left($value,$NbChar)
  { return substr($value,0,$NbChar); }
 
  function right($value,$NbChar)
  { return substr($value,strlen($value)-$NbChar,$NbChar); }
 
  function mid($value,$Depart,$NbChar)
  { return substr($value,$Depart-1,$NbChar); }
  ?>
  <?php
  /*
  session.php - Sandbox sesson manager
 
  Version : 1.1.0
  Made by : Jean-Damien POGOLOTTI
  Last Update : 18/01/11
 
  This file can be distributed under the license you can find at :
 
  http://www.pchart.net/license
 
  You can find the whole class documentation on the pChart web site.
  */
 
  session_start();
 
  foreach($_GET as $Key => $Value)
  { $_SESSION[$Key] = $Value; }
 
  print_r($_SESSION);
 
  usleep(200000);
  ?>
  body
  {
  margin: 4px;
  text-align: left;
  font-family: tahoma;
  background-color: #FFFFFF;
  background-image: url('graphix/background.console.png');
  }
 
  table { margin: 0px; padding: 0px;}
 
  td { margin: 0px; padding: 0px; }
 
  tr { margin: 0px; padding: 0px; }
 
  td.topMenu { font-family: tahoma; font-size: 11px; }
 
  div.roundedCorner { font-size: 10px; }
 
  div.topMenu { border: 1px solid #FEFEFE; background-color: #EAEAEA; cursor: hand; cursor: pointer; }
 
  input
  {
  font-family: tahoma;
  font-size: 10px;
  }
 
  input[type="text"]
  {
  width: 325px;
  border: 1px solid #D0D0D0;
  background-color: #FFFFFF;
  vertical-align: middle;
  font-weight: normal;
  color: #707070;
  outline: none;
  height: 15px;
  }
 
  select
  {
  border: 1px solid #D0D0D0;
  background-color: #FFFFFF;
  vertical-align: middle;
  font-weight: normal;
  color: #707070;
  outline: none;
  font-size: 10px;
  height: 19px;
  }
 
  input[type="submit"]
  {
  border: 1px solid #D0D0D0;
  background-color: #FFFFFF;
  vertical-align: middle;
  font-weight: normal;
  color: #707070;
  outline: none;
  }
 
  pre
  {
  font-family; tahoma;
  font-size: 11px;
  background-color: #FFFFFF;
  border: 1px solid #E0E0E0;
  padding: 5px;
  margin-top: 20px;
  text-align: left;
  overflow-x: auto;
  white-space: pre-wrap;
  white-space: -moz-pre-wrap !important;
  white-space: -pre-wrap;
  white-space: -o-pre-wrap;
  word-wrap: break-word;
  }
 
  a.link:link { text-decoration: none; }
  a.link:visited { text-decoration: none; }
  a.link:hover { text-decoration: underline; }
 
  a.smallLinkGrey:link { text-decoration: none; color: #6A6A6A; }
  a.smallLinkGrey:visited { text-decoration: none; color: #6A6A6A; }
  a.smallLinkGrey:hover { text-decoration: underline; color: #6A6A6A; }
 
  a.smallLinkBlack:link { text-decoration: none; color: #000000; }
  a.smallLinkBlack:visited { text-decoration: none; color: #000000; }
  a.smallLinkBlack:hover { text-decoration: underline; color: #000000; }
 
 Binary files /dev/null and b/lib/pChart2.1.0/fonts/Bedizen.ttf differ
 Binary files /dev/null and b/lib/pChart2.1.0/fonts/Forgotte.ttf differ
 Binary files /dev/null and b/lib/pChart2.1.0/fonts/GeosansLight.ttf differ
 Binary files /dev/null and b/lib/pChart2.1.0/fonts/MankSans.ttf differ
 Binary files /dev/null and b/lib/pChart2.1.0/fonts/Silkscreen.ttf differ
 Binary files /dev/null and b/lib/pChart2.1.0/fonts/advent_light.ttf differ
 Binary files /dev/null and b/lib/pChart2.1.0/fonts/calibri.ttf differ
 Binary files /dev/null and b/lib/pChart2.1.0/fonts/pf_arma_five.ttf differ
 Binary files /dev/null and b/lib/pChart2.1.0/fonts/verdana.ttf differ
  <?php
  /* If you navigate here, then you should see the examples */
 
  header('Location: examples/');
  exit();
  ?>
  185,106,154,100
  216,137,184,100
  156,192,137,100
  216,243,201,100
  253,232,215,100
  255,255,255,100
 
  109,152,171,100
  0,39,94,100
  254,183,41,100
  168,177,184,100
  255,255,255,100
  0,0,0,100
 
  242,245,237,100
  255,194,0,100
  255,91,0,100
  184,0,40,100
  132,0,46,100
  74,192,242,100
 
  155,225,251,100
  197,239,253,100
  189,32,49,100
  35,31,32,100
  255,255,255,100
  0,98,149,100
 
  239,210,121,100
  149,203,233,100
  2,71,105,100
  175,215,117,100
  44,87,0,100
  222,157,127,100
 
 
  25,78,132,100
  59,107,156,100
  31,36,42,100
  55,65,74,100
  96,187,34,100
  242,186,187,100
 
  117,113,22,100
  174,188,33,100
  217,219,86,100
  0,71,127,100
  76,136,190,100
  141,195,233,100
 
  146,123,81,100
  168,145,102,100
  128,195,28,100
  188,221,90,100
  255,121,0,100
  251,179,107,100
 
  253,184,19,100
  246,139,31,100
  241,112,34,100
  98,194,204,100
  228,246,248,100
  238,246,108,100
 
 Binary files /dev/null and b/lib/pChart2.1.0/readme.txt differ