From 61e00e523e7a36570bf05cacfae53dc33621f5e8 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Fri, 4 Jun 2010 16:19:55 +0200 Subject: [PATCH 01/80] file placeholder creation. Will build on top of these. --- libraries/chart.lib.php | 15 +++++++++++++++ server_status.php | 8 ++++++++ 2 files changed, 23 insertions(+) create mode 100644 libraries/chart.lib.php diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php new file mode 100644 index 000000000..758b1953b --- /dev/null +++ b/libraries/chart.lib.php @@ -0,0 +1,15 @@ + diff --git a/server_status.php b/server_status.php index 3ab8a49a2..2981ed776 100644 --- a/server_status.php +++ b/server_status.php @@ -34,6 +34,11 @@ require './libraries/server_links.inc.php'; require './libraries/replication.inc.php'; require_once './libraries/replication_gui.lib.php'; +/** + * Chart generation + */ +require_once './libraries/chart.lib.php'; + /** * Displays the sub-page heading */ @@ -582,6 +587,9 @@ foreach ($used_queries as $name => $value) { ?> +
+ +
From 1f378cef7fed5565f722913dbed8ec7721a793fa Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Mon, 14 Jun 2010 23:36:22 +0300 Subject: [PATCH 02/80] added OFC php wrapper together with SWF file to PMA --- js/open-flash-chart.swf | Bin 0 -> 276186 bytes libraries/chart/ofc/README.txt | 16 ++ libraries/chart/ofc/dot_base.php | 231 ++++++++++++++++ libraries/chart/ofc/json_format.php | 86 ++++++ libraries/chart/ofc/ofc_area_base.php | 40 +++ libraries/chart/ofc/ofc_area_hollow.php | 10 + libraries/chart/ofc/ofc_area_line.php | 10 + libraries/chart/ofc/ofc_arrow.php | 27 ++ libraries/chart/ofc/ofc_bar.php | 34 +++ libraries/chart/ofc/ofc_bar_3d.php | 22 ++ libraries/chart/ofc/ofc_bar_base.php | 97 +++++++ libraries/chart/ofc/ofc_bar_filled.php | 39 +++ libraries/chart/ofc/ofc_bar_glass.php | 131 +++++++++ libraries/chart/ofc/ofc_bar_sketch.php | 29 ++ libraries/chart/ofc/ofc_bar_stack.php | 55 ++++ libraries/chart/ofc/ofc_candle.php | 41 +++ libraries/chart/ofc/ofc_hbar.php | 64 +++++ libraries/chart/ofc/ofc_line.php | 157 +++++++++++ libraries/chart/ofc/ofc_line_base.php | 92 +++++++ libraries/chart/ofc/ofc_line_dot.php | 33 +++ libraries/chart/ofc/ofc_line_hollow.php | 9 + libraries/chart/ofc/ofc_line_style.php | 11 + libraries/chart/ofc/ofc_menu.php | 56 ++++ libraries/chart/ofc/ofc_pie.php | 257 ++++++++++++++++++ libraries/chart/ofc/ofc_radar_axis.php | 47 ++++ libraries/chart/ofc/ofc_radar_axis_labels.php | 15 + .../chart/ofc/ofc_radar_spoke_labels.php | 15 + libraries/chart/ofc/ofc_scatter.php | 47 ++++ libraries/chart/ofc/ofc_scatter_line.php | 49 ++++ libraries/chart/ofc/ofc_shape.php | 25 ++ libraries/chart/ofc/ofc_sugar.php | 43 +++ libraries/chart/ofc/ofc_tags.php | 133 +++++++++ libraries/chart/ofc/ofc_title.php | 39 +++ libraries/chart/ofc/ofc_tooltip.php | 67 +++++ libraries/chart/ofc/ofc_upload_image.php | 70 +++++ libraries/chart/ofc/ofc_x_axis.php | 140 ++++++++++ libraries/chart/ofc/ofc_x_axis_label.php | 45 +++ libraries/chart/ofc/ofc_x_axis_labels.php | 69 +++++ libraries/chart/ofc/ofc_x_legend.php | 15 + libraries/chart/ofc/ofc_y_axis.php | 17 ++ libraries/chart/ofc/ofc_y_axis_base.php | 116 ++++++++ libraries/chart/ofc/ofc_y_axis_label.php | 38 +++ libraries/chart/ofc/ofc_y_axis_labels.php | 57 ++++ libraries/chart/ofc/ofc_y_axis_right.php | 6 + libraries/chart/ofc/ofc_y_legend.php | 15 + libraries/chart/ofc/open-flash-chart.php | 178 ++++++++++++ 46 files changed, 2793 insertions(+) create mode 100644 js/open-flash-chart.swf create mode 100644 libraries/chart/ofc/README.txt create mode 100644 libraries/chart/ofc/dot_base.php create mode 100644 libraries/chart/ofc/json_format.php create mode 100644 libraries/chart/ofc/ofc_area_base.php create mode 100644 libraries/chart/ofc/ofc_area_hollow.php create mode 100644 libraries/chart/ofc/ofc_area_line.php create mode 100644 libraries/chart/ofc/ofc_arrow.php create mode 100644 libraries/chart/ofc/ofc_bar.php create mode 100644 libraries/chart/ofc/ofc_bar_3d.php create mode 100644 libraries/chart/ofc/ofc_bar_base.php create mode 100644 libraries/chart/ofc/ofc_bar_filled.php create mode 100644 libraries/chart/ofc/ofc_bar_glass.php create mode 100644 libraries/chart/ofc/ofc_bar_sketch.php create mode 100644 libraries/chart/ofc/ofc_bar_stack.php create mode 100644 libraries/chart/ofc/ofc_candle.php create mode 100644 libraries/chart/ofc/ofc_hbar.php create mode 100644 libraries/chart/ofc/ofc_line.php create mode 100644 libraries/chart/ofc/ofc_line_base.php create mode 100644 libraries/chart/ofc/ofc_line_dot.php create mode 100644 libraries/chart/ofc/ofc_line_hollow.php create mode 100644 libraries/chart/ofc/ofc_line_style.php create mode 100644 libraries/chart/ofc/ofc_menu.php create mode 100644 libraries/chart/ofc/ofc_pie.php create mode 100644 libraries/chart/ofc/ofc_radar_axis.php create mode 100644 libraries/chart/ofc/ofc_radar_axis_labels.php create mode 100644 libraries/chart/ofc/ofc_radar_spoke_labels.php create mode 100644 libraries/chart/ofc/ofc_scatter.php create mode 100644 libraries/chart/ofc/ofc_scatter_line.php create mode 100644 libraries/chart/ofc/ofc_shape.php create mode 100644 libraries/chart/ofc/ofc_sugar.php create mode 100644 libraries/chart/ofc/ofc_tags.php create mode 100644 libraries/chart/ofc/ofc_title.php create mode 100644 libraries/chart/ofc/ofc_tooltip.php create mode 100644 libraries/chart/ofc/ofc_upload_image.php create mode 100644 libraries/chart/ofc/ofc_x_axis.php create mode 100644 libraries/chart/ofc/ofc_x_axis_label.php create mode 100644 libraries/chart/ofc/ofc_x_axis_labels.php create mode 100644 libraries/chart/ofc/ofc_x_legend.php create mode 100644 libraries/chart/ofc/ofc_y_axis.php create mode 100644 libraries/chart/ofc/ofc_y_axis_base.php create mode 100644 libraries/chart/ofc/ofc_y_axis_label.php create mode 100644 libraries/chart/ofc/ofc_y_axis_labels.php create mode 100644 libraries/chart/ofc/ofc_y_axis_right.php create mode 100644 libraries/chart/ofc/ofc_y_legend.php create mode 100644 libraries/chart/ofc/open-flash-chart.php diff --git a/js/open-flash-chart.swf b/js/open-flash-chart.swf new file mode 100644 index 0000000000000000000000000000000000000000..3a01e52aeeaba86b1a932c09ad48bb447e8ad8f3 GIT binary patch literal 276186 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%0AswSAXJNzV>MU?tF`JR^B}b7* zM29nb;u#ITrw2k3`9d38Iof9>Y}9Dq=A^lYNzjl_wP}MzyHw)g3_jm!4=%7~FgF^? z7&Uw?;QMvZZBp}dzaDnCE@!?1u_a3_w+QAPVv*##+q__-OxJ{`0UKo6w;i5X7%|_b zeOll13+WL?jn0t{TryF7oCUHf>W?-T@YXf%P+2z)+}q0A@Spm{7p`^({5KO>kmW-I6=q;$<`c+A9i^4}G#yEqGj{+EEm`)y**~BE@ z(O4sq-y3r%JRtVe!lH=JJUn06;=f&WcnNgc^YOaf8$*5aFesx$^1-wW934*C380V|KM94UbKRJ*^UAY zk*I__T4(q_$9}YX(-O0TN!H+6uk-tZXJt(p8|7qn@tjYbss3%tEayyxoox08FK`<& z>*jx9s%grSKT@pQe(#WE{FR0B?MZ(P;~Cn&Tq|6`Gl$9Y3Tt(9!1>o3`A={ivpcBV z;@p3rl({{uZBhOqfx`tI4!k)>?o3>MLO6-c{nY&%L znrGj(xN^!pKkxXggj0Mm!t)Nxd)zy@aDIZs>4ic8w_5Kw*mk@-b}vDa#hG!%k%jXg z@bEaL*u2W(Z$Ec<4GZ60rk5^P7&_Dz?t93ap`IMCx#L_M-^pb~8H`_?58J(|wNI*I zc-_j+ezCi~fNj~~L_Sy9gO*bpt*pBwnjahTdCEM$5L+>`({%2E$jL_)FHe54KW9$= z@(J}7lbdIqc8z_S_$TuW=c1o7R*Y7xJH$%F9&L7=@tLQJr>XnmWYrteJLVs?jOvoJ zKfciRxnaKLwb;hjF$aEh%S07+Iv)-wle8^wb&d-UTztJCFKp4i)fQVmSY6})c=g3s zsW0z%kF1>LoVb0%cPqZ!mF{oy9?vQ-xM%X<>+TcZZJ)fgd$n0G{X6p&=A5bysf

-KjIcLcI{ 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 b(Ue#5|5`uoQTlmUp8a1_+&_5>X>M%*Oag35 literal 0 HcmV?d00001 diff --git a/libraries/chart/ofc/README.txt b/libraries/chart/ofc/README.txt new file mode 100644 index 000000000..012fbfd52 --- /dev/null +++ b/libraries/chart/ofc/README.txt @@ -0,0 +1,16 @@ +Open Flash Chart - PHP libraries. These help create data files for Open Flash Chart. +Copyright (C) 2007 + +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; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA \ No newline at end of file diff --git a/libraries/chart/ofc/dot_base.php b/libraries/chart/ofc/dot_base.php new file mode 100644 index 000000000..5772efcd9 --- /dev/null +++ b/libraries/chart/ofc/dot_base.php @@ -0,0 +1,231 @@ +type = $type; + if( isset( $value ) ) + $this->value( $value ); + } + + /** + * For line charts that only require a Y position + * for each point. + * @param $value as integer, the Y position + */ + function value( $value ) + { + $this->value = $value; + } + + /** + * For scatter charts that require an X and Y position for + * each point. + * + * @param $x as integer + * @param $y as integer + */ + function position( $x, $y ) + { + $this->x = $x; + $this->y = $y; + } + + /** + * @param $colour is a string, HEX colour, e.g. '#FF0000' red + */ + function colour($colour) + { + $this->colour = $colour; + return $this; + } + + /** + * The tooltip for this dot. + */ + function tooltip( $tip ) + { + $this->tip = $tip; + return $this; + } + + /** + * @param $size is an integer. Size of the dot. + */ + function size($size) + { + $tmp = 'dot-size'; + $this->$tmp = $size; + return $this; + } + + /** + * a private method + */ + function type( $type ) + { + $this->type = $type; + return $this; + } + + /** + * @param $size is an integer. The size of the hollow 'halo' around the dot that masks the line. + */ + function halo_size( $size ) + { + $tmp = 'halo-size'; + $this->$tmp = $size; + return $this; + } + + /** + * @param $do as string. One of three options (examples): + * - "http://example.com" - browse to this URL + * - "https://example.com" - browse to this URL + * - "trace:message" - print this message in the FlashDevelop debug pane + * - all other strings will be called as Javascript functions, so a string "hello_world" + * will call the JS function "hello_world(index)". It passes in the index of the + * point. + */ + function on_click( $do ) + { + $tmp = 'on-click'; + $this->$tmp = $do; + } +} + +/** + * Draw a hollow dot + */ +class hollow_dot extends dot_base +{ + function hollow_dot($value=null) + { + parent::dot_base( 'hollow-dot', $value ); + } +} + +/** + * Draw a star + */ +class star extends dot_base +{ + /** + * The constructor, takes an optional $value + */ + function star($value=null) + { + parent::dot_base( 'star', $value ); + } + + /** + * @param $angle is an integer. + */ + function rotation($angle) + { + $this->rotation = $angle; + return $this; + } + + /** + * @param $is_hollow is a boolean. + */ + function hollow($is_hollow) + { + $this->hollow = $is_hollow; + } +} + +/** + * Draw a 'bow tie' shape. + */ +class bow extends dot_base +{ + /** + * The constructor, takes an optional $value + */ + function bow($value=null) + { + parent::dot_base( 'bow', $value ); + } + + /** + * Rotate the anchor object. + * @param $angle is an integer. + */ + function rotation($angle) + { + $this->rotation = $angle; + return $this; + } +} + +/** + * An n sided shape. + */ +class anchor extends dot_base +{ + /** + * The constructor, takes an optional $value + */ + function anchor($value=null) + { + parent::dot_base( 'anchor', $value ); + } + + /** + * Rotate the anchor object. + * @param $angle is an integer. + */ + function rotation($angle) + { + $this->rotation = $angle; + return $this; + } + + /** + * @param $sides is an integer. Number of sides this shape has. + */ + function sides($sides) + { + $this->sides = $sides; + return $this; + } +} + +/** + * A simple dot + */ +class dot extends dot_base +{ + /** + * The constructor, takes an optional $value + */ + function dot($value=null) + { + parent::dot_base( 'dot', $value ); + } +} + +/** + * A simple dot + */ +class solid_dot extends dot_base +{ + /** + * The constructor, takes an optional $value + */ + function solid_dot($value=null) + { + parent::dot_base( 'solid-dot', $value ); + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/json_format.php b/libraries/chart/ofc/json_format.php new file mode 100644 index 000000000..b8e3de5cb --- /dev/null +++ b/libraries/chart/ofc/json_format.php @@ -0,0 +1,86 @@ + 0 && $json[$c-1] != '\\') + { + $in_string = !$in_string; + } + default: + $new_json .= $char; + break; + } + } + + return $new_json; +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_area_base.php b/libraries/chart/ofc/ofc_area_base.php new file mode 100644 index 000000000..a6e811fd5 --- /dev/null +++ b/libraries/chart/ofc/ofc_area_base.php @@ -0,0 +1,40 @@ +type = "area"; + } + + /** + * the fill colour + */ + function set_fill_colour( $colour ) + { + $this->fill = $colour; + } + + /** + * sugar: see set_fill_colour + */ + function fill_colour( $colour ) + { + $this->set_fill_colour( $colour ); + return $this; + } + + function set_fill_alpha( $alpha ) + { + $tmp = "fill-alpha"; + $this->$tmp = $alpha; + } + + function set_loop() + { + $this->loop = true; + } +} diff --git a/libraries/chart/ofc/ofc_area_hollow.php b/libraries/chart/ofc/ofc_area_hollow.php new file mode 100644 index 000000000..4293af0b6 --- /dev/null +++ b/libraries/chart/ofc/ofc_area_hollow.php @@ -0,0 +1,10 @@ +type = "area_hollow"; + parent::area_base(); + } +} diff --git a/libraries/chart/ofc/ofc_area_line.php b/libraries/chart/ofc/ofc_area_line.php new file mode 100644 index 000000000..5731391a3 --- /dev/null +++ b/libraries/chart/ofc/ofc_area_line.php @@ -0,0 +1,10 @@ +type = "area_line"; + parent::area_base(); + } +} diff --git a/libraries/chart/ofc/ofc_arrow.php b/libraries/chart/ofc/ofc_arrow.php new file mode 100644 index 000000000..3c2c6e9dc --- /dev/null +++ b/libraries/chart/ofc/ofc_arrow.php @@ -0,0 +1,27 @@ +type = "arrow"; + $this->start = array("x"=>$x, "y"=>$y); + $this->end = array("x"=>$a, "y"=>$b); + $this->colour($colour); + $this->{"barb-length"} = $barb_length; + } + + function colour( $colour ) + { + $this->colour = $colour; + return $this; + } +} diff --git a/libraries/chart/ofc/ofc_bar.php b/libraries/chart/ofc/ofc_bar.php new file mode 100644 index 000000000..6ddda4274 --- /dev/null +++ b/libraries/chart/ofc/ofc_bar.php @@ -0,0 +1,34 @@ +top = $top; + + if( isset( $bottom ) ) + $this->bottom = $bottom; + } + + function set_colour( $colour ) + { + $this->colour = $colour; + } + + function set_tooltip( $tip ) + { + $this->tip = $tip; + } +} + +class bar extends bar_base +{ + function bar() + { + $this->type = "bar"; + parent::bar_base(); + } +} + diff --git a/libraries/chart/ofc/ofc_bar_3d.php b/libraries/chart/ofc/ofc_bar_3d.php new file mode 100644 index 000000000..47552184c --- /dev/null +++ b/libraries/chart/ofc/ofc_bar_3d.php @@ -0,0 +1,22 @@ +top = $top; + } + + function set_colour( $colour ) + { + $this->colour = $colour; + } + + function set_tooltip( $tip ) + { + $this->tip = $tip; + } +} + diff --git a/libraries/chart/ofc/ofc_bar_base.php b/libraries/chart/ofc/ofc_bar_base.php new file mode 100644 index 000000000..c1303b86b --- /dev/null +++ b/libraries/chart/ofc/ofc_bar_base.php @@ -0,0 +1,97 @@ +text = $text; + $tmp = 'font-size'; + $this->$tmp = $size; + } + + /** + * syntatical sugar. + */ + function key( $text, $size ) + { + $this->set_key( $text, $size ); + } + + /** + * @param $v as an array, a mix of: + * - a bar_value class. You can use this to customise the paramters of each bar. + * - integer. This is the Y position of the top of the bar. + */ + function set_values( $v ) + { + $this->values = $v; + } + + /** + * see set_values + */ + function append_value( $v ) + { + $this->values[] = $v; + } + + /** + * @param $colour as string, a HEX colour, e.g. '#ff0000' red + */ + function set_colour( $colour ) + { + $this->colour = $colour; + } + + /** + *syntatical sugar + */ + function colour( $colour ) + { + $this->set_colour( $colour ); + } + + /** + * @param $alpha as real number (range 0 to 1), e.g. 0.5 is half transparent + */ + function set_alpha( $alpha ) + { + $this->alpha = $alpha; + } + + /** + * @param $tip as string, the tip to show. May contain various magic variables. + */ + function set_tooltip( $tip ) + { + $this->tip = $tip; + } + + /** + *@param $on_show as line_on_show object + */ + function set_on_show($on_show) + { + $this->{'on-show'} = $on_show; + } + + function set_on_click( $text ) + { + $tmp = 'on-click'; + $this->$tmp = $text; + } + + function attach_to_right_y_axis() + { + $this->axis = 'right'; + } +} + diff --git a/libraries/chart/ofc/ofc_bar_filled.php b/libraries/chart/ofc/ofc_bar_filled.php new file mode 100644 index 000000000..837c1fc45 --- /dev/null +++ b/libraries/chart/ofc/ofc_bar_filled.php @@ -0,0 +1,39 @@ +$tmp = $outline_colour; + } +} + +class bar_filled extends bar_base +{ + function bar_filled( $colour=null, $outline_colour=null ) + { + $this->type = "bar_filled"; + parent::bar_base(); + + if( isset( $colour ) ) + $this->set_colour( $colour ); + + if( isset( $outline_colour ) ) + $this->set_outline_colour( $outline_colour ); + } + + function set_outline_colour( $outline_colour ) + { + $tmp = 'outline-colour'; + $this->$tmp = $outline_colour; + } +} + diff --git a/libraries/chart/ofc/ofc_bar_glass.php b/libraries/chart/ofc/ofc_bar_glass.php new file mode 100644 index 000000000..e83350151 --- /dev/null +++ b/libraries/chart/ofc/ofc_bar_glass.php @@ -0,0 +1,131 @@ +type = $type; + $this->cascade = (float)$cascade; + $this->delay = (float)$delay; + } +} + +class bar_value +{ + /** + * @param $top as integer. The Y value of the top of the bar + * @param OPTIONAL $bottom as integer. The Y value of the bottom of the bar, defaults to Y min. + */ + function bar_value( $top, $bottom=null ) + { + $this->top = $top; + + if( isset( $bottom ) ) + $this->bottom = $bottom; + } + + function set_colour( $colour ) + { + $this->colour = $colour; + } + + function set_tooltip( $tip ) + { + $this->tip = $tip; + } +} + +class bar extends bar_base +{ + function bar() + { + $this->type = "bar"; + parent::bar_base(); + } +} + +class bar_glass extends bar_base +{ + function bar_glass() + { + $this->type = "bar_glass"; + parent::bar_base(); + } +} + +class bar_cylinder extends bar_base +{ + function bar_cylinder() + { + $this->type = "bar_cylinder"; + parent::bar_base(); + } +} + +class bar_cylinder_outline extends bar_base +{ + function bar_cylinder_outline() + { + $this->type = "bar_cylinder_outline"; + parent::bar_base(); + } +} + +class bar_rounded_glass extends bar_base +{ + function bar_rounded_glass() + { + $this->type = "bar_round_glass"; + parent::bar_base(); + } +} + +class bar_round extends bar_base +{ + function bar_round() + { + $this->type = "bar_round"; + parent::bar_base(); + } +} + +class bar_dome extends bar_base +{ + function bar_dome() + { + $this->type = "bar_dome"; + parent::bar_base(); + } +} + +class bar_round3d extends bar_base +{ + function bar_round3d() + { + $this->type = "bar_round3d"; + parent::bar_base(); + } +} + +class bar_3d extends bar_base +{ + function bar_3d() + { + $this->type = "bar_3d"; + parent::bar_base(); + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_bar_sketch.php b/libraries/chart/ofc/ofc_bar_sketch.php new file mode 100644 index 000000000..ce1bcccf8 --- /dev/null +++ b/libraries/chart/ofc/ofc_bar_sketch.php @@ -0,0 +1,29 @@ +type = "bar_sketch"; + parent::bar_base(); + + $this->set_colour( $colour ); + $this->set_outline_colour( $outline_colour ); + $this->offset = $fun_factor; + } + + function set_outline_colour( $outline_colour ) + { + $tmp = 'outline-colour'; + $this->$tmp = $outline_colour; + } +} + diff --git a/libraries/chart/ofc/ofc_bar_stack.php b/libraries/chart/ofc/ofc_bar_stack.php new file mode 100644 index 000000000..3d9f8d9f0 --- /dev/null +++ b/libraries/chart/ofc/ofc_bar_stack.php @@ -0,0 +1,55 @@ +type = "bar_stack"; + parent::bar_base(); + } + + function append_stack( $v ) + { + $this->append_value( $v ); + } + + // an array of HEX colours strings + // e.g. array( '#ff0000', '#00ff00' ); + function set_colours( $colours ) + { + $this->colours = $colours; + } + + // an array of bar_stack_value + function set_keys( $keys ) + { + $this->keys = $keys; + } +} + +class bar_stack_value +{ + function bar_stack_value( $val, $colour ) + { + $this->val = $val; + $this->colour = $colour; + } + + function set_tooltip( $tip ) + { + $this->tip = $tip; + } +} + +class bar_stack_key +{ + function bar_stack_key( $colour, $text, $font_size ) + { + $this->colour = $colour; + $this->text = $text; + $tmp = 'font-size'; + $this->$tmp = $font_size; + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_candle.php b/libraries/chart/ofc/ofc_candle.php new file mode 100644 index 000000000..21ad67f8d --- /dev/null +++ b/libraries/chart/ofc/ofc_candle.php @@ -0,0 +1,41 @@ +high = $high; + $this->top = $open; + $this->bottom = $close; + $this->low = $low; + } + + function set_colour( $colour ) + { + $this->colour = $colour; + } + + function set_tooltip( $tip ) + { + $this->tip = $tip; + } +} + +class candle extends bar_base +{ + function candle($colour, $negative_colour=null) + { + $this->type = "candle"; + parent::bar_base(); + + $this->set_colour( $colour ); + if(!is_null($negative_colour)) + $this->{'negative-colour'} = $negative_colour; + } +} + diff --git a/libraries/chart/ofc/ofc_hbar.php b/libraries/chart/ofc/ofc_hbar.php new file mode 100644 index 000000000..6f8c0e451 --- /dev/null +++ b/libraries/chart/ofc/ofc_hbar.php @@ -0,0 +1,64 @@ +left = $left; + $this->right = $right; + } + else + $this->right = $left; + } + + function set_colour( $colour ) + { + $this->colour = $colour; + } + + function set_tooltip( $tip ) + { + $this->tip = $tip; + } +} + +class hbar +{ + function hbar( $colour ) + { + $this->type = "hbar"; + $this->values = array(); + $this->set_colour( $colour ); + } + + function append_value( $v ) + { + $this->values[] = $v; + } + + function set_values( $v ) + { + foreach( $v as $val ) + $this->append_value( new hbar_value( $val ) ); + } + + function set_colour( $colour ) + { + $this->colour = $colour; + } + + function set_key( $text, $size ) + { + $this->text = $text; + $tmp = 'font-size'; + $this->$tmp = $size; + } + + function set_tooltip( $tip ) + { + $this->tip = $tip; + } +} + diff --git a/libraries/chart/ofc/ofc_line.php b/libraries/chart/ofc/ofc_line.php new file mode 100644 index 000000000..e635f2c02 --- /dev/null +++ b/libraries/chart/ofc/ofc_line.php @@ -0,0 +1,157 @@ +type = $type; + $this->cascade = (float)$cascade; + $this->delay = (float)$delay; + } +} + +class line +{ + function line() + { + $this->type = "line"; + $this->values = array(); + } + + /** + * Set the default dot that all the real + * dots inherit their properties from. If you set the + * default dot to be red, all values in your chart that + * do not specify a colour will be red. Same for all the + * other attributes such as tooltip, on-click, size etc... + * + * @param $style as any class that inherits base_dot + */ + function set_default_dot_style( $style ) + { + $tmp = 'dot-style'; + $this->$tmp = $style; + } + + /** + * @param $v as array, can contain any combination of: + * - integer, Y position of the point + * - any class that inherits from dot_base + * - null + */ + function set_values( $v ) + { + $this->values = $v; + } + + /** + * Append a value to the line. + * + * @param mixed $v + */ + function append_value($v) + { + $this->values[] = $v; + } + + function set_width( $width ) + { + $this->width = $width; + } + + function set_colour( $colour ) + { + $this->colour = $colour; + } + + /** + * sytnatical sugar for set_colour + */ + function colour( $colour ) + { + $this->set_colour( $colour ); + return $this; + } + + function set_halo_size( $size ) + { + $tmp = 'halo-size'; + $this->$tmp = $size; + } + + function set_key( $text, $font_size ) + { + $this->text = $text; + $tmp = 'font-size'; + $this->$tmp = $font_size; + } + + function set_tooltip( $tip ) + { + $this->tip = $tip; + } + + /** + * @param $text as string. A javascript function name as a string. The chart will + * try to call this function, it will pass the chart id as the only parameter into + * this function. E.g: + * + */ + function set_on_click( $text ) + { + $tmp = 'on-click'; + $this->$tmp = $text; + } + + function loop() + { + $this->loop = true; + } + + function line_style( $s ) + { + $tmp = "line-style"; + $this->$tmp = $s; + } + + /** + * Sets the text for the line. + * + * @param string $text + */ + function set_text($text) + { + $this->text = $text; + } + + function attach_to_right_y_axis() + { + $this->axis = 'right'; + } + + /** + *@param $on_show as line_on_show object + */ + function set_on_show($on_show) + { + $this->{'on-show'} = $on_show; + } + + function on_show($on_show) + { + $this->set_on_show($on_show); + return $this; + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_line_base.php b/libraries/chart/ofc/ofc_line_base.php new file mode 100644 index 000000000..fa45cbc89 --- /dev/null +++ b/libraries/chart/ofc/ofc_line_base.php @@ -0,0 +1,92 @@ +type = "line"; + $this->text = "Page views"; + $tmp = 'font-size'; + $this->$tmp = 10; + + $this->values = array(); + } + + function set_values( $v ) + { + $this->values = $v; + } + + /** + * Append a value to the line. + * + * @param mixed $v + */ + function append_value($v) + { + $this->values[] = $v; + } + + function set_width( $width ) + { + $this->width = $width; + } + + function set_colour( $colour ) + { + $this->colour = $colour; + } + + function set_dot_size( $size ) + { + $tmp = 'dot-size'; + $this->$tmp = $size; + } + + function set_halo_size( $size ) + { + $tmp = 'halo-size'; + $this->$tmp = $size; + } + + function set_key( $text, $font_size ) + { + $this->text = $text; + $tmp = 'font-size'; + $this->$tmp = $font_size; + } + + function set_tooltip( $tip ) + { + $this->tip = $tip; + } + + function set_on_click( $text ) + { + $tmp = 'on-click'; + $this->$tmp = $text; + } + + function loop() + { + $this->loop = true; + } + + function line_style( $s ) + { + $tmp = "line-style"; + $this->$tmp = $s; + } + + /** + * Sets the text for the line. + * + * @param string $text + */ + function set_text($text) + { + $this->text = $text; + } + + +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_line_dot.php b/libraries/chart/ofc/ofc_line_dot.php new file mode 100644 index 000000000..146691173 --- /dev/null +++ b/libraries/chart/ofc/ofc_line_dot.php @@ -0,0 +1,33 @@ +value = $value; + $this->colour = $colour; + } + + function set_colour( $colour ) + { + $this->colour = $colour; + } + + function set_size( $size ) + { + $this->size = $size; + } + + function set_tooltip( $tip ) + { + $this->tip = $tip; + } +} + +class line_dot extends line_base +{ + function line_dot() + { + $this->type = "line_dot"; + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_line_hollow.php b/libraries/chart/ofc/ofc_line_hollow.php new file mode 100644 index 000000000..512bb07d9 --- /dev/null +++ b/libraries/chart/ofc/ofc_line_hollow.php @@ -0,0 +1,9 @@ +type = "line_hollow"; + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_line_style.php b/libraries/chart/ofc/ofc_line_style.php new file mode 100644 index 000000000..4f538cf9d --- /dev/null +++ b/libraries/chart/ofc/ofc_line_style.php @@ -0,0 +1,11 @@ +style = "dash"; + $this->on = $on; + $this->off = $off; + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_menu.php b/libraries/chart/ofc/ofc_menu.php new file mode 100644 index 000000000..0750a09c2 --- /dev/null +++ b/libraries/chart/ofc/ofc_menu.php @@ -0,0 +1,56 @@ +type = "text"; + $this->text = $text; + $tmp = 'javascript-function'; + $this->$tmp = $javascript_function_name; + } +} + +class ofc_menu_item_camera +{ + /** + * @param $text as string. The menu item text. + * @param $javascript_function_name as string. The javascript function name, the + * js function takes one parameter, the chart ID. So for example, our js function + * could look like this: + * + * function save_image( chart_id ) + * { + * alert( chart_id ); + * } + * + * to make a menu item call this: ofc_menu_item_camera('Save chart', 'save_image'); + */ + function ofc_menu_item_camera($text, $javascript_function_name) + { + $this->type = "camera-icon"; + $this->text = $text; + $tmp = 'javascript-function'; + $this->$tmp = $javascript_function_name; + } +} + +class ofc_menu +{ + function ofc_menu($colour, $outline_colour) + { + $this->colour = $colour; + $this->outline_colour = $outline_colour; + } + + function values($values) + { + $this->values = $values; + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_pie.php b/libraries/chart/ofc/ofc_pie.php new file mode 100644 index 000000000..bf779c554 --- /dev/null +++ b/libraries/chart/ofc/ofc_pie.php @@ -0,0 +1,257 @@ +value = $value; + $this->label = $label; + } + + function set_colour( $colour ) + { + $this->colour = $colour; + } + + function set_label( $label, $label_colour, $font_size ) + { + $this->label = $label; + + $tmp = 'label-colour'; + $this->$tmp = $label_colour; + + $tmp = 'font-size'; + $this->$tmp = $font_size; + + } + + function set_tooltip( $tip ) + { + $this->tip = $tip; + } + + function on_click( $event ) + { + $tmp = 'on-click'; + $this->$tmp = $event; + } + + + /** + * An object that inherits from base_pie_animation + */ + function add_animation( $animation ) + { + if( !isset( $this->animate ) ) + $this->animate = array(); + + $this->animate[] = $animation; + + return $this; + } +} + +class base_pie_animation{} + +/** + * fade the pie slice from $alpha (pie set_alpha) to 100% opaque. + */ +class pie_fade extends base_pie_animation +{ + function pie_fade() + { + $this->type="fade"; + } +} + +/** + * Bounce the pie slice out a little + */ +class pie_bounce extends base_pie_animation +{ + /** + * @param $distance as integer, distance to bounce in pixels + */ + function pie_bounce( $distance ) + { + $this->type="bounce"; + $this->distance = $distance; + } +} + +/** + * Make a pie chart and fill it with pie slices + */ +class pie +{ + function pie() + { + $this->type = 'pie'; + } + + function set_colours( $colours ) + { + $this->colours = $colours; + } + + /** + * Sugar wrapped around set_colours + */ + function colours( $colours ) + { + $this->set_colours( $colours ); + return $this; + } + + /** + * @param $alpha as float (0-1) 0.75 = 3/4 visible + */ + function set_alpha( $alpha ) + { + $this->alpha = $alpha; + } + + /** + *sugar wrapped set_alpha + **/ + function alpha( $alpha ) + { + $this->set_alpha( $alpha ); + return $this; + } + + /** + * @param $v as array containing one of + * - null + * - real or integer number + * - a pie_value object + */ + function set_values( $v ) + { + $this->values = $v; + } + + /** + * sugar for set_values + */ + function values( $v ) + { + $this->set_values( $v ); + return $this; + } + + /** + * HACK to keep old code working. + */ + function set_animate( $bool ) + { + if( $bool ) + $this->add_animation( new pie_fade() ); + + } + + /** + * An object that inherits from base_pie_animation + */ + function add_animation( $animation ) + { + if( !isset( $this->animate ) ) + $this->animate = array(); + + $this->animate[] = $animation; + + return $this; + } + + /** + * @param $angle as real number + */ + function set_start_angle( $angle ) + { + $tmp = 'start-angle'; + $this->$tmp = $angle; + } + + /** + * sugar for set_start_angle + */ + function start_angle($angle) + { + $this->set_start_angle( $angle ); + return $this; + } + + /** + * @param $tip as string. The tooltip text. May contain magic varibles + */ + function set_tooltip( $tip ) + { + $this->tip = $tip; + } + + /** + * sugar for set_tooltip + */ + function tooltip( $tip ) + { + $this->set_tooltip( $tip ); + return $this; + } + + function set_gradient_fill() + { + $tmp = 'gradient-fill'; + $this->$tmp = true; + } + + function gradient_fill() + { + $this->set_gradient_fill(); + return $this; + } + + /** + * By default each label is the same colour as the slice, + * but you can ovveride that behaviour using this method. + * + * @param $label_colour as string HEX colour; + */ + function set_label_colour( $label_colour ) + { + $tmp = 'label-colour'; + $this->$tmp = $label_colour; + } + + function label_colour( $label_colour ) + { + $this->set_label_colour( $label_colour ); + return $this; + } + + /** + * Turn off the labels + */ + function set_no_labels() + { + $tmp = 'no-labels'; + $this->$tmp = true; + } + + function on_click( $event ) + { + $tmp = 'on-click'; + $this->$tmp = $event; + } + + /** + * Fix the radius of the pie chart. Take a look at the magic variable #radius# + * for helping figure out what radius to set it to. + * + * @param $radius as number + */ + function radius( $radius ) + { + $this->radius = $radius; + return $this; + } +} diff --git a/libraries/chart/ofc/ofc_radar_axis.php b/libraries/chart/ofc/ofc_radar_axis.php new file mode 100644 index 000000000..909c41af8 --- /dev/null +++ b/libraries/chart/ofc/ofc_radar_axis.php @@ -0,0 +1,47 @@ +set_max( $max ); + } + + function set_max( $max ) + { + $this->max = $max; + } + + function set_steps( $steps ) + { + $this->steps = $steps; + } + + function set_stroke( $s ) + { + $this->stroke = $s; + } + + function set_colour( $colour ) + { + $this->colour = $colour; + } + + function set_grid_colour( $colour ) + { + $tmp = 'grid-colour'; + $this->$tmp = $colour; + } + + function set_labels( $labels ) + { + $this->labels = $labels; + } + + function set_spoke_labels( $labels ) + { + $tmp = 'spoke-labels'; + $this->$tmp = $labels; + } +} + diff --git a/libraries/chart/ofc/ofc_radar_axis_labels.php b/libraries/chart/ofc/ofc_radar_axis_labels.php new file mode 100644 index 000000000..22d485e4e --- /dev/null +++ b/libraries/chart/ofc/ofc_radar_axis_labels.php @@ -0,0 +1,15 @@ +labels = $labels; + } + + function set_colour( $colour ) + { + $this->colour = $colour; + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_radar_spoke_labels.php b/libraries/chart/ofc/ofc_radar_spoke_labels.php new file mode 100644 index 000000000..51ba25e9a --- /dev/null +++ b/libraries/chart/ofc/ofc_radar_spoke_labels.php @@ -0,0 +1,15 @@ +labels = $labels; + } + + function set_colour( $colour ) + { + $this->colour = $colour; + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_scatter.php b/libraries/chart/ofc/ofc_scatter.php new file mode 100644 index 000000000..7159a3a64 --- /dev/null +++ b/libraries/chart/ofc/ofc_scatter.php @@ -0,0 +1,47 @@ +x = $x; + $this->y = $y; + + if( $dot_size > 0 ) + { + $tmp = 'dot-size'; + $this->$tmp = $dot_size; + } + } +} + +class scatter +{ + function scatter( $colour ) + { + $this->type = "scatter"; + $this->set_colour( $colour ); + } + + function set_colour( $colour ) + { + $this->colour = $colour; + } + + function set_default_dot_style( $style ) + { + $tmp = 'dot-style'; + $this->$tmp = $style; + } + + /** + * @param $v as array, can contain any combination of: + * - integer, Y position of the point + * - any class that inherits from scatter_value + * - null + */ + function set_values( $values ) + { + $this->values = $values; + } +} diff --git a/libraries/chart/ofc/ofc_scatter_line.php b/libraries/chart/ofc/ofc_scatter_line.php new file mode 100644 index 000000000..d667d7e8c --- /dev/null +++ b/libraries/chart/ofc/ofc_scatter_line.php @@ -0,0 +1,49 @@ +type = "scatter_line"; + $this->set_colour( $colour ); + $this->set_width( $width ); + } + + function set_default_dot_style( $style ) + { + $tmp = 'dot-style'; + $this->$tmp = $style; + } + + function set_colour( $colour ) + { + $this->colour = $colour; + } + + function set_width( $width ) + { + $this->width = $width; + } + + function set_values( $values ) + { + $this->values = $values; + } + + function set_step_horizontal() + { + $this->stepgraph = 'horizontal'; + } + + function set_step_vertical() + { + $this->stepgraph = 'vertical'; + } + + function set_key( $text, $font_size ) + { + $this->text = $text; + $tmp = 'font-size'; + $this->$tmp = $font_size; + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_shape.php b/libraries/chart/ofc/ofc_shape.php new file mode 100644 index 000000000..0cfe39f9b --- /dev/null +++ b/libraries/chart/ofc/ofc_shape.php @@ -0,0 +1,25 @@ +x = $x; + $this->y = $y; + } +} + +class shape +{ + function shape( $colour ) + { + $this->type = "shape"; + $this->colour = $colour; + $this->values = array(); + } + + function append_value( $p ) + { + $this->values[] = $p; + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_sugar.php b/libraries/chart/ofc/ofc_sugar.php new file mode 100644 index 000000000..a9e85555e --- /dev/null +++ b/libraries/chart/ofc/ofc_sugar.php @@ -0,0 +1,43 @@ +colour($colour)->size($size); + } +} + +class s_box extends anchor +{ + /** + * I use this wrapper for default dot types, + * it just makes the code easier to read. + */ + function s_box($colour, $size) + { + parent::anchor(); + $this->colour($colour)->size($size)->rotation(45)->sides(4); + } +} + +class s_hollow_dot extends hollow_dot +{ + /** + * I use this wrapper for default dot types, + * it just makes the code easier to read. + */ + function s_hollow_dot($colour, $size) + { + parent::hollow_dot(); + $this->colour($colour)->size($size); + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_tags.php b/libraries/chart/ofc/ofc_tags.php new file mode 100644 index 000000000..7e7e24454 --- /dev/null +++ b/libraries/chart/ofc/ofc_tags.php @@ -0,0 +1,133 @@ +type = "tags"; + $this->values = array(); + } + + function colour( $colour ) + { + $this->colour = $colour; + return $this; + } + + /** + *@param $font as string. e.g. "Verdana" + *@param $size as integer. Size in px + */ + function font($font, $size) + { + $this->font = $font; + $this->{'font-size'} = $size; + return $this; + } + + /** + *@param $x as integer. Size of x padding in px + *@param $y as integer. Size of y padding in px + */ + function padding($x, $y) + { + $this->{"pad-x"} = $x; + $this->{"pad-y"} = $y; + return $this; + } + + function rotate($angle) + { + $this->rotate($angle); + return $this; + } + + function align_x_center() + { + $this->{"align-x"} = "center"; + return $this; + } + + function align_x_left() + { + $this->{"align-x"} = "left"; + return $this; + } + + function align_x_right() + { + $this->{"align-x"} = "right"; + return $this; + } + + function align_y_above() + { + $this->{"align-y"} = "above"; + return $this; + } + + function align_y_below() + { + $this->{"align-y"} = "below"; + return $this; + } + + function align_y_center() + { + $this->{"align-y"} = "center"; + return $this; + } + + /** + * This can contain some HTML, e.g: + * - "More info" + * - "ofc" + */ + function text($text) + { + $this->text = $text; + return $this; + } + + /** + * This works, but to get the mouse pointer to change + * to a little hand you need to use "stuff"-- see text() + */ + function on_click($on_click) + { + $this->{'on-click'} = $on_click; + return $this; + } + + /** + *@param $bold boolean. + *@param $underline boolean. + *@param $border boolean. + *@prarm $alpha real (0 to 1.0) + */ + function style($bold, $underline, $border, $alpha ) + { + $this->bold = $bold; + $this->border = $underline; + $this->underline = $border; + $this->alpha = $alpha; + return $this; + } + + /** + *@param $tag as ofc_tag + */ + function append_tag($tag) + { + $this->values[] = $tag; + } +} + +class ofc_tag extends ofc_tags +{ + function ofc_tag($x, $y) + { + $this->x = $x; + $this->y = $y; + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_title.php b/libraries/chart/ofc/ofc_title.php new file mode 100644 index 000000000..cda1de006 --- /dev/null +++ b/libraries/chart/ofc/ofc_title.php @@ -0,0 +1,39 @@ +text = $text; + } + + /** + * A css string. Can optionally contain: + * - font-size + * - font-family + * - font-weight + * - color + * - background-color + * - text-align + * - margin + * - margin-left + * - margin-right + * - margin-top + * - margin-bottom + * - padding + * - padding-left + * - padding-right + * - padding-top + * - padding-bottom + * just like the css we use all the time :-) + */ + function set_style( $css ) + { + $this->style = $css; + //"{font-size: 20px; color:#0000ff; font-family: Verdana; text-align: center;}"; + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_tooltip.php b/libraries/chart/ofc/ofc_tooltip.php new file mode 100644 index 000000000..3104ee33b --- /dev/null +++ b/libraries/chart/ofc/ofc_tooltip.php @@ -0,0 +1,67 @@ +shadow = $shadow; + } + + /** + * @param $stroke as integer, border width in pixels (e.g. 5 ) + */ + function set_stroke( $stroke ) + { + $this->stroke = $stroke; + } + + /** + * @param $colour as string, HEX colour e.g. '#0000ff' + */ + function set_colour( $colour ) + { + $this->colour = $colour; + } + + /** + * @param $bg as string, HEX colour e.g. '#0000ff' + */ + function set_background_colour( $bg ) + { + $this->background = $bg; + } + + /** + * @param $style as string. A css style. + */ + function set_title_style( $style ) + { + $this->title = $style; + } + + /** + * @param $style as string. A css style. + */ + function set_body_style( $style ) + { + $this->body = $style; + } + + function set_proximity() + { + $this->mouse = 1; + } + + function set_hover() + { + $this->mouse = 2; + } +} + diff --git a/libraries/chart/ofc/ofc_upload_image.php b/libraries/chart/ofc/ofc_upload_image.php new file mode 100644 index 000000000..0261f9aea --- /dev/null +++ b/libraries/chart/ofc/ofc_upload_image.php @@ -0,0 +1,70 @@ + save_image debug mode, you +// will see the 'echo' text in a new window. +// + +/* + +print_r( $_GET ); +print_r( $_POST ); +print_r( $_FILES ); + +print_r( $GLOBALS ); +print_r( $GLOBALS["HTTP_RAW_POST_DATA"] ); + +*/ + + +// default path for the image to be stored // +$default_path = '../tmp-upload-images/'; + +if (!file_exists($default_path)) mkdir($default_path, 0777, true); + +// full path to the saved image including filename // +$destination = $default_path . basename( $_GET[ 'name' ] ); + +echo 'Saving your image to: '. $destination; +// print_r( $_POST ); +// print_r( $_SERVER ); +// echo $HTTP_RAW_POST_DATA; + +// +// POST data is usually string data, but we are passing a RAW .png +// so PHP is a bit confused and $_POST is empty. But it has saved +// the raw bits into $HTTP_RAW_POST_DATA +// + +$jfh = fopen($destination, 'w') or die("can't open file"); +fwrite($jfh, $HTTP_RAW_POST_DATA); +fclose($jfh); + +// +// LOOK: +// +exit(); + + +// +// PHP5: +// + + +// default path for the image to be stored // +$default_path = 'tmp-upload-images/'; + +if (!file_exists($default_path)) mkdir($default_path, 0777, true); + +// full path to the saved image including filename // +$destination = $default_path . basename( $_FILES[ 'Filedata' ][ 'name' ] ); + +// move the image into the specified directory // +if (move_uploaded_file($_FILES[ 'Filedata' ][ 'tmp_name' ], $destination)) { + echo "The file " . basename( $_FILES[ 'Filedata' ][ 'name' ] ) . " has been uploaded;"; +} else { + echo "FILE UPLOAD FAILED"; +} + + +?> diff --git a/libraries/chart/ofc/ofc_x_axis.php b/libraries/chart/ofc/ofc_x_axis.php new file mode 100644 index 000000000..da1c7672b --- /dev/null +++ b/libraries/chart/ofc/ofc_x_axis.php @@ -0,0 +1,140 @@ +stroke = $stroke; + } + + function stroke( $stroke ) + { + $this->set_stroke( $stroke ); + return $this; + } + + /** + *@param $colour as string HEX colour + *@param $grid_colour as string HEX colour + */ + function set_colours( $colour, $grid_colour ) + { + $this->set_colour( $colour ); + $this->set_grid_colour( $grid_colour ); + } + + /** + *@param $colour as string HEX colour + */ + function set_colour( $colour ) + { + $this->colour = $colour; + } + + function colour( $colour ) + { + $this->set_colour($colour); + return $this; + } + + function set_tick_height( $height ) + { + $tmp = 'tick-height'; + $this->$tmp = $height; + } + + function tick_height( $height ) + { + $this->set_tick_height($height); + return $this; + } + + function set_grid_colour( $colour ) + { + $tmp = 'grid-colour'; + $this->$tmp = $colour; + } + + function grid_colour( $colour ) + { + $this->set_grid_colour($colour); + return $this; + } + + /** + * @param $o is a boolean. If true, the X axis start half a step in + * This defaults to True + */ + function set_offset( $o ) + { + $this->offset = $o?true:false; + } + + function offset( $o ) + { + $this->set_offset($o); + return $this; + } + + /** + * @param $steps as integer. Which grid lines and ticks are visible. + */ + function set_steps( $steps ) + { + $this->steps = $steps; + } + + function steps( $steps ) + { + $this->set_steps($steps); + return $this; + } + + /** + * @param $val as an integer, the height in pixels of the 3D bar. Mostly + * used for the 3D bar chart. + */ + function set_3d( $val ) + { + $tmp = '3d'; + $this->$tmp = $val; + } + + /** + * @param $x_axis_labels as an x_axis_labels object + * Use this to customize the labels (colour, font, etc...) + */ + function set_labels( $x_axis_labels ) + { + //$this->labels = $v; + $this->labels = $x_axis_labels; + } + + /** + * Sugar syntax: helper function to make the examples simpler. + * @param $a is an array of labels + */ + function set_labels_from_array( $a ) + { + $x_axis_labels = new x_axis_labels(); + $x_axis_labels->set_labels( $a ); + $this->labels = $x_axis_labels; + + if( isset( $this->steps ) ) + $x_axis_labels->set_steps( $this->steps ); + } + + /** + * min and max. + */ + function set_range( $min, $max ) + { + $this->min = $min; + $this->max = $max; + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_x_axis_label.php b/libraries/chart/ofc/ofc_x_axis_label.php new file mode 100644 index 000000000..cf116f15f --- /dev/null +++ b/libraries/chart/ofc/ofc_x_axis_label.php @@ -0,0 +1,45 @@ +set_text( $text ); + $this->set_colour( $colour ); + $this->set_size( $size ); + $this->set_rotate( $rotate ); + } + + function set_text( $text ) + { + $this->text = $text; + } + + function set_colour( $colour ) + { + $this->colour = $colour; + } + + function set_size( $size ) + { + $this->size = $size; + } + + function set_rotate( $rotate ) + { + $this->rotate = $rotate; + } + + function set_vertical() + { + $this->rotate = "vertical"; + } + + function set_visible() + { + $this->visible = true; + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_x_axis_labels.php b/libraries/chart/ofc/ofc_x_axis_labels.php new file mode 100644 index 000000000..af4540f95 --- /dev/null +++ b/libraries/chart/ofc/ofc_x_axis_labels.php @@ -0,0 +1,69 @@ +steps = $steps; + } + + /** + * @param $steps as integer which labels are visible + */ + function visible_steps( $steps ) + { + $this->{"visible-steps"} = $steps; + return $this; + } + + /** + * + * @param $labels as an array of [x_axis_label or string] + */ + function set_labels( $labels ) + { + $this->labels = $labels; + } + + function set_colour( $colour ) + { + $this->colour = $colour; + } + + /** + * font size in pixels + */ + function set_size( $size ) + { + $this->size = $size; + } + + /** + * rotate labels + */ + function set_vertical() + { + $this->rotate = 270; + } + + /** + * @param @angle as real. The angle of the text. + */ + function rotate( $angle ) + { + $this->rotate = $angle; + } + + /** + * @param $text as string. Replace and magic variables with actual x axis position. + */ + function text( $text ) + { + $this->text = $text; + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_x_legend.php b/libraries/chart/ofc/ofc_x_legend.php new file mode 100644 index 000000000..7a25af0c2 --- /dev/null +++ b/libraries/chart/ofc/ofc_x_legend.php @@ -0,0 +1,15 @@ +text = $text; + } + + function set_style( $css ) + { + $this->style = $css; + //"{font-size: 20px; color:#0000ff; font-family: Verdana; text-align: center;}"; + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_y_axis.php b/libraries/chart/ofc/ofc_y_axis.php new file mode 100644 index 000000000..3846c9285 --- /dev/null +++ b/libraries/chart/ofc/ofc_y_axis.php @@ -0,0 +1,17 @@ +$tmp = $colour; + } + +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_y_axis_base.php b/libraries/chart/ofc/ofc_y_axis_base.php new file mode 100644 index 000000000..8093a09e5 --- /dev/null +++ b/libraries/chart/ofc/ofc_y_axis_base.php @@ -0,0 +1,116 @@ +stroke = $s; + } + + /** + * @param $val as integer. The length of the ticks in pixels + */ + function set_tick_length( $val ) + { + $tmp = 'tick-length'; + $this->$tmp = $val; + } + + function set_colours( $colour, $grid_colour ) + { + $this->set_colour( $colour ); + $this->set_grid_colour( $grid_colour ); + } + + function set_colour( $colour ) + { + $this->colour = $colour; + } + + function set_grid_colour( $colour ) + { + $tmp = 'grid-colour'; + $this->$tmp = $colour; + } + + /** + * Set min and max values, also (optionally) set the steps value. + * You can reverse the chart by setting min larger than max, e.g. min = 10 + * and max = 0. + * + * @param $min as integer + * @param $max as integer + * @param $steps as integer. + */ + function set_range( $min, $max, $steps=1 ) + { + $this->min = $min; + $this->max = $max; + $this->set_steps( $steps ); + } + + /** + * Sugar for set_range + */ + function range( $min, $max, $steps=1 ) + { + $this->set_range( $min, $max, $steps ); + return $this; + } + + /** + * @param $off as Boolean. If true the Y axis is nudged up half a step. + */ + function set_offset( $off ) + { + $this->offset = $off?1:0; + } + + /** + * @param $y_axis_labels as an y_axis_labels object + * Use this to customize the labels (colour, font, etc...) + */ + function set_labels( $y_axis_labels ) + { + $this->labels = $y_axis_labels; + } + + /** + * Pass in some text for each label. This can contain magic variables "#val#" which + * will get replaced with the value for that Y axis label. Useful for: + * - "£#val#" + * - "#val#%" + * - "#val# million" + * + * @param $text as string. + */ + function set_label_text( $text ) + { + $tmp = new y_axis_labels(); + $tmp->set_text( $text ); + $this->labels = $tmp; + } + + /** + * @param $steps as integer. + * + * Only show every $steps label, e.g. every 10th + */ + function set_steps( $steps ) + { + $this->steps = $steps; + } + + /** + * Make the labels show vertical + */ + function set_vertical() + { + $this->rotate = "vertical"; + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_y_axis_label.php b/libraries/chart/ofc/ofc_y_axis_label.php new file mode 100644 index 000000000..f2616f537 --- /dev/null +++ b/libraries/chart/ofc/ofc_y_axis_label.php @@ -0,0 +1,38 @@ +y = $y; + $this->set_text( $text ); + } + + function set_text( $text ) + { + $this->text = $text; + } + + function set_colour( $colour ) + { + $this->colour = $colour; + } + + function set_size( $size ) + { + $this->size = $size; + } + + function set_rotate( $rotate ) + { + $this->rotate = $rotate; + } + + function set_vertical() + { + $this->rotate = "vertical"; + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_y_axis_labels.php b/libraries/chart/ofc/ofc_y_axis_labels.php new file mode 100644 index 000000000..c0708ab21 --- /dev/null +++ b/libraries/chart/ofc/ofc_y_axis_labels.php @@ -0,0 +1,57 @@ +steps = $steps; + } + + /** + * + * @param $labels as an array of [y_axis_label or string] + */ + function set_labels( $labels ) + { + $this->labels = $labels; + } + + function set_colour( $colour ) + { + $this->colour = $colour; + } + + /** + * font size in pixels + */ + function set_size( $size ) + { + $this->size = $size; + } + + /** + * rotate labels + */ + function set_vertical() + { + $this->rotate = 270; + } + + function rotate( $angle ) + { + $this->rotate = $angle; + } + + /** + * @param $text default text that all labels inherit + */ + function set_text( $text ) + { + $this->text = $text; + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_y_axis_right.php b/libraries/chart/ofc/ofc_y_axis_right.php new file mode 100644 index 000000000..71f7c2984 --- /dev/null +++ b/libraries/chart/ofc/ofc_y_axis_right.php @@ -0,0 +1,6 @@ +text = $text; + } + + function set_style( $css ) + { + $this->style = $css; + //"{font-size: 20px; color:#0000ff; font-family: Verdana; text-align: center;}"; + } +} \ No newline at end of file diff --git a/libraries/chart/ofc/open-flash-chart.php b/libraries/chart/ofc/open-flash-chart.php new file mode 100644 index 000000000..b017097d0 --- /dev/null +++ b/libraries/chart/ofc/open-flash-chart.php @@ -0,0 +1,178 @@ +title = new title( "Many data lines" ); + $this->elements = array(); + } + + function set_title( $t ) + { + $this->title = $t; + } + + function set_x_axis( $x ) + { + $this->x_axis = $x; + } + + function set_y_axis( $y ) + { + $this->y_axis = $y; + } + + function add_y_axis( $y ) + { + $this->y_axis = $y; + } + + function set_y_axis_right( $y ) + { + $this->y_axis_right = $y; + } + + function add_element( $e ) + { + $this->elements[] = $e; + } + + function set_x_legend( $x ) + { + $this->x_legend = $x; + } + + function set_y_legend( $y ) + { + $this->y_legend = $y; + } + + function set_bg_colour( $colour ) + { + $this->bg_colour = $colour; + } + + function set_radar_axis( $radar ) + { + $this->radar_axis = $radar; + } + + function set_tooltip( $tooltip ) + { + $this->tooltip = $tooltip; + } + + /** + * This is a bit funky :( + * + * @param $num_decimals as integer. Truncate the decimals to $num_decimals, e.g. set it + * to 5 and 3.333333333 will display as 3.33333. 2.0 will display as 2 (or 2.00000 - see below) + * @param $is_fixed_num_decimals_forced as boolean. If true it will pad the decimals. + * @param $is_decimal_separator_comma as boolean + * @param $is_thousand_separator_disabled as boolean + * + * This needs a bit of love and attention + */ + function set_number_format($num_decimals, $is_fixed_num_decimals_forced, $is_decimal_separator_comma, $is_thousand_separator_disabled ) + { + $this->num_decimals = $num_decimals; + $this->is_fixed_num_decimals_forced = $is_fixed_num_decimals_forced; + $this->is_decimal_separator_comma = $is_decimal_separator_comma; + $this->is_thousand_separator_disabled = $is_thousand_separator_disabled; + } + + /** + * This is experimental and will change as we make it work + * + * @param $m as ofc_menu + */ + function set_menu($m) + { + $this->menu = $m; + } + + function toString() + { + if (function_exists('json_encode')) + { + return json_encode($this); + } + else + { + $json = new Services_JSON(); + return $json->encode( $this ); + } + } + + function toPrettyString() + { + return json_format( $this->toString() ); + } +} + + + +// +// there is no PHP end tag so we don't mess the headers up! +// \ No newline at end of file From 9e25d0536d7d6e52f915d3cabde7bbde814f9e9e Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Mon, 14 Jun 2010 23:36:52 +0300 Subject: [PATCH 03/80] implementation of the pie chart using OFC --- libraries/chart.lib.php | 7 ++- libraries/chart/pma_chart.php | 58 ++++++++++++++++++++ libraries/chart/pma_ofc_chart.php | 89 +++++++++++++++++++++++++++++++ libraries/chart/pma_ofc_pie.php | 46 ++++++++++++++++ server_status.php | 19 +++++-- 5 files changed, 214 insertions(+), 5 deletions(-) create mode 100644 libraries/chart/pma_chart.php create mode 100644 libraries/chart/pma_ofc_chart.php create mode 100644 libraries/chart/pma_ofc_pie.php diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index 758b1953b..043d394a2 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -7,9 +7,12 @@ * @package phpMyAdmin */ -function PMA_chart_pie($data) +function PMA_chart_pie($titleText, $data) { - return "pie chart placeholder"; + require_once('./libraries/chart/pma_ofc_pie.php'); + + $chart = new PMA_OFC_Pie($titleText, $data); + echo $chart->toString(); } ?> diff --git a/libraries/chart/pma_chart.php b/libraries/chart/pma_chart.php new file mode 100644 index 000000000..57fde5844 --- /dev/null +++ b/libraries/chart/pma_chart.php @@ -0,0 +1,58 @@ +colors); + } +} + +?> \ No newline at end of file diff --git a/libraries/chart/pma_ofc_chart.php b/libraries/chart/pma_ofc_chart.php new file mode 100644 index 000000000..c04bb2068 --- /dev/null +++ b/libraries/chart/pma_ofc_chart.php @@ -0,0 +1,89 @@ +'; + $out[] = 'function '.$data_func_name.'()'; + $out[] = '{'; + $out[] = "return '".str_replace("\n", '', $data)."';"; + $out[] = '}'; + $out[] = ''; + + $out[] = 'width.'" height="'.$this->height.'" id="'.$obj_id.'" align="middle">'; + $out[] = ''; + $out[] = ''; + $out[] = ''; + $out[] = ''; + $out[] = ''; + $out[] = ''; + + return implode("\n", $out); + } + + function toString() + { + return $this->get_embed_code($this->chart->toPrettyString()); + } +} + +?> \ No newline at end of file diff --git a/libraries/chart/pma_ofc_pie.php b/libraries/chart/pma_ofc_pie.php new file mode 100644 index 000000000..f213a2248 --- /dev/null +++ b/libraries/chart/pma_ofc_pie.php @@ -0,0 +1,46 @@ +set_style($this->titleStyle); + + // create the main chart element - pie + $pie = new pie(); + $pie->set_alpha(1); + $pie->set_start_angle(35); + $pie->add_animation(new pie_fade()); + $pie->add_animation(new pie_bounce(10)); + $pie->set_tooltip('#val# '._('of').' #total#
#percent# '._('of').' 100%'); + $pie->set_colours($this->colors); + + $values = array(); + foreach($data as $key => $value) { + $values[] = new pie_value($value, $key); + } + + $pie->set_values($values); + $pie->gradient_fill(); + + // create chart + $this->chart = new open_flash_chart(); + $this->chart->x_axis = null; + $this->chart->set_bg_colour($this->bgColor); + $this->chart->set_title($title); + $this->chart->add_element($pie); + } +} + +?> \ No newline at end of file diff --git a/server_status.php b/server_status.php index 2981ed776..b6e8b148f 100644 --- a/server_status.php +++ b/server_status.php @@ -587,9 +587,22 @@ foreach ($used_queries as $name => $value) { ?> -
- -
+

+ +
+ + +
+ $value) { + $key = str_replace(array('Com_', '_'), array('', ' '), $key); + $chart_data[ucwords($key)] = (int)$value; + } + echo PMA_chart_pie(__('Query type'), $chart_data); + ?> +
From 473b9b38dcc8200b7efb9a52c8f24aa00d171ec6 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Tue, 15 Jun 2010 20:13:12 +0300 Subject: [PATCH 04/80] fixed the layout of the chart in the server status page --- server_status.php | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/server_status.php b/server_status.php index b6e8b148f..d82fc1963 100644 --- a/server_status.php +++ b/server_status.php @@ -587,22 +587,19 @@ foreach ($used_queries as $name => $value) { ?> +
-
- - -
- $value) { - $key = str_replace(array('Com_', '_'), array('', ' '), $key); - $chart_data[ucwords($key)] = (int)$value; - } - echo PMA_chart_pie(__('Query type'), $chart_data); - ?> -
+
+ $value) { + $key = str_replace(array('Com_', '_'), array('', ' '), $key); + $chart_data[ucwords($key)] = (int)$value; + } + echo PMA_chart_pie(__('Query type'), $chart_data); + ?>
From d814efcfb634d8ddb25d5089d84583c4424bba1a Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Tue, 15 Jun 2010 20:13:34 +0300 Subject: [PATCH 05/80] added the chart in the profiling window --- libraries/chart.lib.php | 4 +-- libraries/chart/pma_chart.php | 47 ++++++++++++++++++++++----------- libraries/chart/pma_ofc_pie.php | 6 +++-- libraries/common.lib.php | 42 ++++++++++++++++++++++++++++- sql.php | 2 +- 5 files changed, 79 insertions(+), 22 deletions(-) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index 043d394a2..bf3b2c699 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -7,11 +7,11 @@ * @package phpMyAdmin */ -function PMA_chart_pie($titleText, $data) +function PMA_chart_pie($titleText, $data, $options = null) { require_once('./libraries/chart/pma_ofc_pie.php'); - $chart = new PMA_OFC_Pie($titleText, $data); + $chart = new PMA_OFC_Pie($titleText, $data, $options); echo $chart->toString(); } diff --git a/libraries/chart/pma_chart.php b/libraries/chart/pma_chart.php index 57fde5844..a1d798070 100644 --- a/libraries/chart/pma_chart.php +++ b/libraries/chart/pma_chart.php @@ -11,21 +11,21 @@ class PMA_Chart * Colors for the different slices in the pie chart. */ protected $colors = array( - '#485E70', - '#484A70', - '#594870', - '#6D4870', - '#70485E', '#70484A', '#705948', - '#706D48', - '#5E7048', - '#4A7048', + '#6D4870', + '#70485E', + '#485E70', + '#484A70', '#487059', '#48706D', - '#5F7E95', + '#594870', + '#5E7048', '#839CAF', '#95775F', + '#5F7E95', + '#706D48', + '#4A7048', '#AF9683', ); @@ -44,15 +44,30 @@ class PMA_Chart */ protected $height = 250; - /* - * Colors in the colors array have been written down in an gradient - * order. Without shuffling pie chart has an angular gradient. - * Colors could also be shuffles in the array initializer. - */ function __construct() { - shuffle(&$this->colors); + + } + + /* + * A function which handles passed parameters. Useful if desired + * chart needs to be a little bit different from the default one. + * + * Option handling could be made more efficient if options would be + * stored in an array. + */ + function handleOptions($options) + { + if (is_null($options)) + return; + + if (isset($options['bgColor'])) + $this->bgColor = $options['bgColor']; + if (isset($options['width'])) + $this->width = $options['width']; + if (isset($options['height'])) + $this->height = $options['height']; } } -?> \ No newline at end of file +?> diff --git a/libraries/chart/pma_ofc_pie.php b/libraries/chart/pma_ofc_pie.php index f213a2248..e8628fe06 100644 --- a/libraries/chart/pma_ofc_pie.php +++ b/libraries/chart/pma_ofc_pie.php @@ -7,10 +7,12 @@ require_once('pma_ofc_chart.php'); */ class PMA_OFC_Pie extends PMA_OFC_Chart { - function __construct($titleText, $data) + function __construct($titleText, $data, $options = null) { parent::__construct(); + $this->handleOptions($options); + include './libraries/chart/ofc/open-flash-chart.php'; // create and style chart title @@ -43,4 +45,4 @@ class PMA_OFC_Pie extends PMA_OFC_Chart } } -?> \ No newline at end of file +?> diff --git a/libraries/common.lib.php b/libraries/common.lib.php index ec2f8eb67..8002bcb48 100644 --- a/libraries/common.lib.php +++ b/libraries/common.lib.php @@ -1339,12 +1339,14 @@ function PMA_profilingCheckbox($sql_query) * Displays the results of SHOW PROFILE * * @param array the results + * @param boolean show chart * @access public * */ -function PMA_profilingResults($profiling_results) +function PMA_profilingResults($profiling_results, $show_chart = false) { echo '
' . __('Profiling') . '' . "\n"; + echo '
'; echo '' . "\n"; echo ' ' . "\n"; echo ' ' . "\n"; @@ -1356,10 +1358,48 @@ function PMA_profilingResults($profiling_results) echo '' . "\n"; echo '' . "\n"; } + echo '
' . __('Status') . '' . $one_result['Status'] . '' . $one_result['Duration'] . '
' . "\n"; + echo '
'; + + if ($show_chart) { + echo '
'; + PMA_profilingResultsChart($profiling_results); + echo '
'; + } + echo '
' . "\n"; } +/** + * Displays the results of SHOW PROFILE as a chart + * + * @param array the results + * @access public + * + */ +function PMA_profilingResultsChart($profiling_results) +{ + require_once './libraries/chart.lib.php'; + + $chart_data = array(); + foreach($profiling_results as $one_result) { + $value = (int)($one_result['Duration']*1000000); + $key = ucwords($one_result['Status']); + $chart_data[$key] = $value; + } + + echo PMA_chart_pie( + __('Query execution time comparison (in microseconds)'), + $chart_data, + array( + 'bgColor' => '#e5e5e5', + 'width' => 500, + 'height' => 300, + ) + ); +} + /** * Formats $value to byte view * diff --git a/sql.php b/sql.php index 288f150d4..1ec8f0dab 100644 --- a/sql.php +++ b/sql.php @@ -607,7 +607,7 @@ else { } if (isset($profiling_results)) { - PMA_profilingResults($profiling_results); + PMA_profilingResults($profiling_results, true); } // Displays the results in a table From fc21678fa4d499085afa0fe333cf770cddd25a99 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Thu, 17 Jun 2010 16:00:08 +0300 Subject: [PATCH 06/80] moved flash file to appropriate directory --- {js => flash}/open-flash-chart.swf | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename {js => flash}/open-flash-chart.swf (100%) diff --git a/js/open-flash-chart.swf b/flash/open-flash-chart.swf similarity index 100% rename from js/open-flash-chart.swf rename to flash/open-flash-chart.swf From f1b5ab52ef7f16fe66f0deede1c99964c10c25e8 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Thu, 17 Jun 2010 16:01:09 +0300 Subject: [PATCH 07/80] added first pChart charts. --- libraries/chart/pChart/fonts/tahoma.ttf | Bin 0 -> 383804 bytes libraries/chart/pChart/pCache.class | 119 + libraries/chart/pChart/pChart.class | 3489 +++++++++++++++++++++++ libraries/chart/pChart/pData.class | 260 ++ libraries/chart/pma_pchart_chart.php | 25 + libraries/chart/pma_pchart_pie.php | 68 + 6 files changed, 3961 insertions(+) create mode 100644 libraries/chart/pChart/fonts/tahoma.ttf create mode 100644 libraries/chart/pChart/pCache.class create mode 100644 libraries/chart/pChart/pChart.class create mode 100644 libraries/chart/pChart/pData.class create mode 100644 libraries/chart/pma_pchart_chart.php create mode 100644 libraries/chart/pma_pchart_pie.php diff --git a/libraries/chart/pChart/fonts/tahoma.ttf b/libraries/chart/pChart/fonts/tahoma.ttf new file mode 100644 index 0000000000000000000000000000000000000000..59b14a2d2d45b78eecbb2f22e1d2e084678e8d94 GIT binary patch literal 383804 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 QGW{ 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%0Dwr9W)AjlF<@N3L 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

IM?ys1at?vr3o1e&qaY)z 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 Yi= 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. + + Class initialisation : + pCache($CacheFolder="Cache/") + Cache management : + IsInCache($Data) + GetFromCache($ID,$Data) + WriteToCache($ID,$Data,$Picture) + DeleteFromCache($ID,$Data) + ClearCache() + Inner functions : + GetHash($ID,$Data) + */ + + /* pCache class definition */ + class pCache + { + var $HashKey = ""; + var $CacheFolder = "Cache/"; + + /* Create the pCache object */ + function pCache($CacheFolder="Cache/") + { + $this->CacheFolder = $CacheFolder; + } + + /* This function is clearing the cache folder */ + function ClearCache() + { + if ($handle = opendir($this->CacheFolder)) + { + while (false !== ($file = readdir($handle))) + { + if ( $file != "." && $file != ".." ) + unlink($this->CacheFolder.$file); + } + closedir($handle); + } + } + + /* This function is checking if we have an offline version of this chart */ + function IsInCache($ID,$Data,$Hash="") + { + if ( $Hash == "" ) + $Hash = $this->GetHash($ID,$Data); + + if ( file_exists($this->CacheFolder.$Hash) ) + return(TRUE); + else + return(FALSE); + } + + /* This function is making a copy of drawn chart in the cache folder */ + function WriteToCache($ID,$Data,$Picture) + { + $Hash = $this->GetHash($ID,$Data); + $FileName = $this->CacheFolder.$Hash; + + imagepng($Picture->Picture,$FileName); + } + + /* This function is removing any cached copy of this chart */ + function DeleteFromCache($ID,$Data) + { + $Hash = $this->GetHash($ID,$Data); + $FileName = $this->CacheFolder.$Hash; + + if ( file_exists($FileName ) ) + unlink($FileName); + } + + /* This function is retrieving the cached picture if applicable */ + function GetFromCache($ID,$Data) + { + $Hash = $this->GetHash($ID,$Data); + if ( $this->IsInCache("","",$Hash ) ) + { + $FileName = $this->CacheFolder.$Hash; + + header('Content-type: image/png'); + @readfile($FileName); + exit(); + } + } + + /* This function is building the graph unique hash key */ + function GetHash($ID,$Data) + { + $mKey = "$ID"; + foreach($Data as $key => $Values) + { + $tKey = ""; + foreach($Values as $Serie => $Value) + $tKey = $tKey.$Serie.$Value; + $mKey = $mKey.md5($tKey); + } + return(md5($mKey)); + } + } +?> \ No newline at end of file diff --git a/libraries/chart/pChart/pChart.class b/libraries/chart/pChart/pChart.class new file mode 100644 index 000000000..c407b7e2c --- /dev/null +++ b/libraries/chart/pChart/pChart.class @@ -0,0 +1,3489 @@ +. + + Class initialisation : + pChart($XSize,$YSize) + Draw methods : + drawBackground($R,$G,$B) + drawRectangle($X1,$Y1,$X2,$Y2,$R,$G,$B) + drawFilledRectangle($X1,$Y1,$X2,$Y2,$R,$G,$B,$DrawBorder=TRUE,$Alpha=100) + drawRoundedRectangle($X1,$Y1,$X2,$Y2,$Radius,$R,$G,$B) + drawFilledRoundedRectangle($X1,$Y1,$X2,$Y2,$Radius,$R,$G,$B) + drawCircle($Xc,$Yc,$Height,$R,$G,$B,$Width=0) + drawFilledCircle($Xc,$Yc,$Height,$R,$G,$B,$Width=0) + drawEllipse($Xc,$Yc,$Height,$Width,$R,$G,$B) + drawFilledEllipse($Xc,$Yc,$Height,$Width,$R,$G,$B) + drawLine($X1,$Y1,$X2,$Y2,$R,$G,$B,$GraphFunction=FALSE) + drawDottedLine($X1,$Y1,$X2,$Y2,$DotSize,$R,$G,$B) + drawAlphaPixel($X,$Y,$Alpha,$R,$G,$B) + drawFromPNG($FileName,$X,$Y,$Alpha=100) + drawFromGIF($FileName,$X,$Y,$Alpha=100) + drawFromJPG($FileName,$X,$Y,$Alpha=100) + Graph setup methods : + addBorder($Width=3,$R=0,$G=0,$B=0) + clearScale() + clearShadow() + createColorGradientPalette($R1,$G1,$B1,$R2,$G2,$B2,$Shades) + drawGraphArea($R,$G,$B,$Stripe=FALSE) + drawScale($Data,$DataDescription,$ScaleMode,$R,$G,$B,$DrawTicks=TRUE,$Angle=0,$Decimals=1,$WithMargin=FALSE,$SkipLabels=1,$RightScale=FALSE) + drawRightScale($Data,$DataDescription,$ScaleMode,$R,$G,$B,$DrawTicks=TRUE,$Angle=0,$Decimals=1,$WithMargin=FALSE,$SkipLabels=1) + drawXYScale($Data,$DataDescription,$YSerieName,$XSerieName,$R,$G,$B,$WithMargin=0,$Angle=0,$Decimals=1) + drawGrid($LineWidth,$Mosaic=TRUE,$R=220,$G=220,$B=220,$Alpha=100) + drawLegend($XPos,$YPos,$DataDescription,$R,$G,$B,$Rs=-1,$Gs=-1,$Bs=-1,$Rt=0,$Gt=0,$Bt=0,$Border=FALSE) + drawPieLegend($XPos,$YPos,$Data,$DataDescription,$R,$G,$B) + drawTitle($XPos,$YPos,$Value,$R,$G,$B,$XPos2=-1,$YPos2=-1,$Shadow=FALSE) + drawTreshold($Value,$R,$G,$B,$ShowLabel=FALSE,$ShowOnRight=FALSE,$TickWidth=4,$FreeText=NULL) + drawArea($Data,$Serie1,$Serie2,$R,$G,$B,$Alpha = 50) + drawRadarAxis($Data,$DataDescription,$Mosaic=TRUE,$BorderOffset=10,$A_R=60,$A_G=60,$A_B=60,$S_R=200,$S_G=200,$S_B=200,$MaxValue=-1) + drawGraphAreaGradient($R,$G,$B,$Decay,$Target=TARGET_GRAPHAREA) + drawTextBox($X1,$Y1,$X2,$Y2,$Text,$Angle=0,$R=255,$G=255,$B=255,$Align=ALIGN_LEFT,$Shadow=TRUE,$BgR=-1,$BgG=-1,$BgB=-1,$Alpha=100) + getLegendBoxSize($DataDescription) + loadColorPalette($FileName,$Delimiter=",") + reportWarnings($Interface="CLI") + setGraphArea($X1,$Y1,$X2,$Y2) + setLabel($Data,$DataDescription,$SerieName,$ValueName,$Caption,$R=210,$G=210,$B=210) + setColorPalette($ID,$R,$G,$B) + setCurrency($Currency) + setDateFormat($Format) + setFontProperties($FontName,$FontSize) + setLineStyle($Width=1,$DotSize=0) + setFixedScale($VMin,$VMax,$Divisions=5,$VXMin=0,$VXMin=0,$XDivisions=5) + setShadowProperties($XDistance=1,$YDistance=1,$R=60,$G=60,$B=60,$Alpha) + writeValues($Data,$DataDescription,$Series) + Graphs methods : + drawPlotGraph($Data,$DataDescription,$BigRadius=5,$SmallRadius=2,$R2=-1,$G2=-1,$B2=-1,$Shadow=FALSE) + drawXYPlotGraph($Data,$DataDescription,$YSerieName,$XSerieName,$PaletteID=0,$BigRadius=5,$SmallRadius=2,$R2=-1,$G2=-1,$B2=-1) + drawLineGraph($Data,$DataDescription,$SerieName="") + drawXYGraph($Data,$DataDescription,$YSerieName,$XSerieName,$PaletteID=0) + drawFilledLineGraph($Data,$DataDescription,$Alpha=100,$AroundZero=FALSE) + drawCubicCurve($Data,$DataDescription,$Accuracy=.1,$SerieName="") + drawFilledCubicCurve($Data,$DataDescription,$Accuracy=.1,$Alpha=100,$AroundZero=FALSE) + drawOverlayBarGraph($Data,$DataDescription,$Alpha=50) + drawBarGraph($Data,$DataDescription,$Shadow=FALSE) + drawStackedBarGraph($Data,$DataDescription,$Alpha=50,$Contiguous=FALSE) + drawLimitsGraph($Data,$DataDescription,$R=0,$G=0,$B=0) + drawRadar($Data,$DataDescription,$BorderOffset=10,$MaxValue=-1) + drawFilledRadar($Data,$DataDescription,$Alpha=50,$BorderOffset=10,$MaxValue=-1) + drawBasicPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$R=255,$G=255,$B=255,$Decimals=0) + drawFlatPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$SpliceDistance=0,$Decimals = 0) + drawFlatPieGraphWithShadow($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$SpliceDistance=0,$Decimals = 0) + drawPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$EnhanceColors=TRUE,$Skew=60,$SpliceHeight=20,$SpliceDistance=0,$Decimals=0) + Other methods : + setImageMap($Mode=TRUE,$GraphID="MyGraph") + getImageMap($MapName,$Flush=TRUE) + Render($FileName) + Stroke() + */ + + /* Declare some script wide constants */ + define("SCALE_NORMAL",1); + define("SCALE_ADDALL",2); + define("SCALE_START0",3); + define("SCALE_ADDALLSTART0",4); + define("PIE_PERCENTAGE", 1); + define("PIE_LABELS",2); + define("PIE_NOLABEL",3); + define("PIE_PERCENTAGE_LABEL", 4); + define("TARGET_GRAPHAREA",1); + define("TARGET_BACKGROUND",2); + define("ALIGN_TOP_LEFT",1); + define("ALIGN_TOP_CENTER",2); + define("ALIGN_TOP_RIGHT",3); + define("ALIGN_LEFT",4); + define("ALIGN_CENTER",5); + define("ALIGN_RIGHT",6); + define("ALIGN_BOTTOM_LEFT",7); + define("ALIGN_BOTTOM_CENTER",8); + define("ALIGN_BOTTOM_RIGHT",9); + + /* pChart class definition */ + class pChart + { + /* Palettes definition */ + var $Palette = array("0"=>array("R"=>188,"G"=>224,"B"=>46), + "1"=>array("R"=>224,"G"=>100,"B"=>46), + "2"=>array("R"=>224,"G"=>214,"B"=>46), + "3"=>array("R"=>46,"G"=>151,"B"=>224), + "4"=>array("R"=>176,"G"=>46,"B"=>224), + "5"=>array("R"=>224,"G"=>46,"B"=>117), + "6"=>array("R"=>92,"G"=>224,"B"=>46), + "7"=>array("R"=>224,"G"=>176,"B"=>46)); + + /* Some static vars used in the class */ + var $XSize = NULL; + var $YSize = NULL; + var $Picture = NULL; + var $ImageMap = NULL; + + /* Error management */ + var $ErrorReporting = FALSE; + var $ErrorInterface = "CLI"; + var $Errors = NULL; + var $ErrorFontName = "Fonts/pf_arma_five.ttf"; + var $ErrorFontSize = 6; + + /* vars related to the graphing area */ + var $GArea_X1 = NULL; + var $GArea_Y1 = NULL; + var $GArea_X2 = NULL; + var $GArea_Y2 = NULL; + var $GAreaXOffset = NULL; + var $VMax = NULL; + var $VMin = NULL; + var $VXMax = NULL; + var $VXMin = NULL; + var $Divisions = NULL; + var $XDivisions = NULL; + var $DivisionHeight = NULL; + var $XDivisionHeight = NULL; + var $DivisionCount = NULL; + var $XDivisionCount = NULL; + var $DivisionRatio = NULL; + var $XDivisionRatio = NULL; + var $DivisionWidth = NULL; + var $DataCount = NULL; + var $Currency = "\$"; + + /* Text format related vars */ + var $FontName = NULL; + var $FontSize = NULL; + var $DateFormat = "d/m/Y"; + + /* Lines format related vars */ + var $LineWidth = 1; + var $LineDotSize = 0; + + /* Layer related vars */ + var $Layers = NULL; + + /* Set antialias quality : 0 is maximum, 100 minimum*/ + var $AntialiasQuality = 0; + + /* Shadow settings */ + var $ShadowActive = FALSE; + var $ShadowXDistance = 1; + var $ShadowYDistance = 1; + var $ShadowRColor = 60; + var $ShadowGColor = 60; + var $ShadowBColor = 60; + var $ShadowAlpha = 50; + var $ShadowBlur = 0; + + /* Image Map settings */ + var $BuildMap = FALSE; + var $MapFunction = NULL; + var $tmpFolder = "tmp/"; + var $MapID = NULL; + + /* This function create the background picture */ + function pChart($XSize,$YSize) + { + $this->XSize = $XSize; + $this->YSize = $YSize; + $this->Picture = imagecreatetruecolor($XSize,$YSize); + + $C_White =$this->AllocateColor($this->Picture,255,255,255); + imagefilledrectangle($this->Picture,0,0,$XSize,$YSize,$C_White); + imagecolortransparent($this->Picture,$C_White); + + $this->setFontProperties("tahoma.ttf",8); + } + + /* Set if warnings should be reported */ + function reportWarnings($Interface="CLI") + { + $this->ErrorReporting = TRUE; + $this->ErrorInterface = $Interface; + } + + /* Set the font properties */ + function setFontProperties($FontName,$FontSize) + { + $this->FontName = $FontName; + $this->FontSize = $FontSize; + } + + /* Set the shadow properties */ + function setShadowProperties($XDistance=1,$YDistance=1,$R=60,$G=60,$B=60,$Alpha=50,$Blur=0) + { + $this->ShadowActive = TRUE; + $this->ShadowXDistance = $XDistance; + $this->ShadowYDistance = $YDistance; + $this->ShadowRColor = $R; + $this->ShadowGColor = $G; + $this->ShadowBColor = $B; + $this->ShadowAlpha = $Alpha; + $this->ShadowBlur = $Blur; + } + + /* Remove shadow option */ + function clearShadow() + { + $this->ShadowActive = FALSE; + } + + /* Set Palette color */ + function setColorPalette($ID,$R,$G,$B) + { + 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; } + + $this->Palette[$ID]["R"] = $R; + $this->Palette[$ID]["G"] = $G; + $this->Palette[$ID]["B"] = $B; + } + + /* Create a color palette shading from one color to another */ + function createColorGradientPalette($R1,$G1,$B1,$R2,$G2,$B2,$Shades) + { + $RFactor = ($R2-$R1)/$Shades; + $GFactor = ($G2-$G1)/$Shades; + $BFactor = ($B2-$B1)/$Shades; + + for($i=0;$i<=$Shades-1;$i++) + { + $this->Palette[$i]["R"] = $R1+$RFactor*$i; + $this->Palette[$i]["G"] = $G1+$GFactor*$i; + $this->Palette[$i]["B"] = $B1+$BFactor*$i; + } + } + + /* Load Color Palette from file */ + function loadColorPalette($FileName,$Delimiter=",") + { + $handle = @fopen($FileName,"r"); + $ColorID = 0; + if ($handle) + { + while (!feof($handle)) + { + $buffer = fgets($handle, 4096); + $buffer = str_replace(chr(10),"",$buffer); + $buffer = str_replace(chr(13),"",$buffer); + $Values = split($Delimiter,$buffer); + if ( count($Values) == 3 ) + { + $this->Palette[$ColorID]["R"] = $Values[0]; + $this->Palette[$ColorID]["G"] = $Values[1]; + $this->Palette[$ColorID]["B"] = $Values[2]; + $ColorID++; + } + } + } + } + + /* Set line style */ + function setLineStyle($Width=1,$DotSize=0) + { + $this->LineWidth = $Width; + $this->LineDotSize = $DotSize; + } + + /* Set currency symbol */ + function setCurrency($Currency) + { + $this->Currency = $Currency; + } + + /* Set the graph area location */ + function setGraphArea($X1,$Y1,$X2,$Y2) + { + $this->GArea_X1 = $X1; + $this->GArea_Y1 = $Y1; + $this->GArea_X2 = $X2; + $this->GArea_Y2 = $Y2; + } + + /* Prepare the graph area */ + function drawGraphArea($R,$G,$B,$Stripe=FALSE) + { + $this->drawFilledRectangle($this->GArea_X1,$this->GArea_Y1,$this->GArea_X2,$this->GArea_Y2,$R,$G,$B,FALSE); + $this->drawRectangle($this->GArea_X1,$this->GArea_Y1,$this->GArea_X2,$this->GArea_Y2,$R-40,$G-40,$B-40); + + if ( $Stripe ) + { + $R2 = $R-15; if ( $R2 < 0 ) { $R2 = 0; } + $G2 = $R-15; if ( $G2 < 0 ) { $G2 = 0; } + $B2 = $R-15; if ( $B2 < 0 ) { $B2 = 0; } + + $LineColor =$this->AllocateColor($this->Picture,$R2,$G2,$B2); + $SkewWidth = $this->GArea_Y2-$this->GArea_Y1-1; + + for($i=$this->GArea_X1-$SkewWidth;$i<=$this->GArea_X2;$i=$i+4) + { + $X1 = $i; $Y1 = $this->GArea_Y2; + $X2 = $i+$SkewWidth; $Y2 = $this->GArea_Y1; + + + if ( $X1 < $this->GArea_X1 ) + { $X1 = $this->GArea_X1; $Y1 = $this->GArea_Y1 + $X2 - $this->GArea_X1 + 1; } + + if ( $X2 >= $this->GArea_X2 ) + { $Y2 = $this->GArea_Y1 + $X2 - $this->GArea_X2 +1; $X2 = $this->GArea_X2 - 1; } +// * Fixed in 1.27 * { $X2 = $this->GArea_X2 - 1; $Y2 = $this->GArea_Y2 - ($this->GArea_X2 - $X1); } + + imageline($this->Picture,$X1,$Y1,$X2,$Y2+1,$LineColor); + } + } + } + + /* Allow you to clear the scale : used if drawing multiple charts */ + function clearScale() + { + $this->VMin = NULL; + $this->VMax = NULL; + $this->VXMin = NULL; + $this->VXMax = NULL; + $this->Divisions = NULL; + $this->XDivisions = NULL; } + + /* Allow you to fix the scale, use this to bypass the automatic scaling */ + function setFixedScale($VMin,$VMax,$Divisions=5,$VXMin=0,$VXMax=0,$XDivisions=5) + { + $this->VMin = $VMin; + $this->VMax = $VMax; + $this->Divisions = $Divisions; + + if ( !$VXMin == 0 ) + { + $this->VXMin = $VXMin; + $this->VXMax = $VXMax; + $this->XDivisions = $XDivisions; + } + } + + /* Wrapper to the drawScale() function allowing a second scale to be drawn */ + function drawRightScale($Data,$DataDescription,$ScaleMode,$R,$G,$B,$DrawTicks=TRUE,$Angle=0,$Decimals=1,$WithMargin=FALSE,$SkipLabels=1) + { + $this->drawScale($Data,$DataDescription,$ScaleMode,$R,$G,$B,$DrawTicks,$Angle,$Decimals,$WithMargin,$SkipLabels,TRUE); + } + + /* Compute and draw the scale */ + function drawScale($Data,$DataDescription,$ScaleMode,$R,$G,$B,$DrawTicks=TRUE,$Angle=0,$Decimals=1,$WithMargin=FALSE,$SkipLabels=1,$RightScale=FALSE) + { + /* Validate the Data and DataDescription array */ + $this->validateData("drawScale",$Data); + + $C_TextColor =$this->AllocateColor($this->Picture,$R,$G,$B); + + $this->drawLine($this->GArea_X1,$this->GArea_Y1,$this->GArea_X1,$this->GArea_Y2,$R,$G,$B); + $this->drawLine($this->GArea_X1,$this->GArea_Y2,$this->GArea_X2,$this->GArea_Y2,$R,$G,$B); + + if ( $this->VMin == NULL && $this->VMax == NULL) + { + if (isset($DataDescription["Values"][0])) + { + $this->VMin = $Data[0][$DataDescription["Values"][0]]; + $this->VMax = $Data[0][$DataDescription["Values"][0]]; + } + else { $this->VMin = 2147483647; $this->VMax = -2147483647; } + + /* Compute Min and Max values */ + if ( $ScaleMode == SCALE_NORMAL || $ScaleMode == SCALE_START0 ) + { + if ( $ScaleMode == SCALE_START0 ) { $this->VMin = 0; } + + foreach ( $Data as $Key => $Values ) + { + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + if (isset($Data[$Key][$ColName])) + { + $Value = $Data[$Key][$ColName]; + + if ( is_numeric($Value) ) + { + if ( $this->VMax < $Value) { $this->VMax = $Value; } + if ( $this->VMin > $Value) { $this->VMin = $Value; } + } + } + } + } + } + elseif ( $ScaleMode == SCALE_ADDALL || $ScaleMode == SCALE_ADDALLSTART0 ) /* Experimental */ + { + if ( $ScaleMode == SCALE_ADDALLSTART0 ) { $this->VMin = 0; } + + foreach ( $Data as $Key => $Values ) + { + $Sum = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + if (isset($Data[$Key][$ColName])) + { + $Value = $Data[$Key][$ColName]; + if ( is_numeric($Value) ) + $Sum += $Value; + } + } + if ( $this->VMax < $Sum) { $this->VMax = $Sum; } + if ( $this->VMin > $Sum) { $this->VMin = $Sum; } + } + } + + if ( $this->VMax > preg_replace('/\.[0-9]+/','',$this->VMax) ) + $this->VMax = preg_replace('/\.[0-9]+/','',$this->VMax)+1; + + /* If all values are the same */ + if ( $this->VMax == $this->VMin ) + { + if ( $this->VMax >= 0 ) { $this->VMax++; } + else { $this->VMin--; } + } + + $DataRange = $this->VMax - $this->VMin; + if ( $DataRange == 0 ) { $DataRange = .1; } + + /* Compute automatic scaling */ + $ScaleOk = FALSE; $Factor = 1; + $MinDivHeight = 25; $MaxDivs = ($this->GArea_Y2 - $this->GArea_Y1) / $MinDivHeight; + + if ( $this->VMin == 0 && $this->VMax == 0 ) + { $this->VMin = 0; $this->VMax = 2; $Scale = 1; $Divisions = 2;} + elseif ($MaxDivs > 1) + { + while(!$ScaleOk) + { + $Scale1 = ( $this->VMax - $this->VMin ) / $Factor; + $Scale2 = ( $this->VMax - $this->VMin ) / $Factor / 2; + $Scale4 = ( $this->VMax - $this->VMin ) / $Factor / 4; + + if ( $Scale1 > 1 && $Scale1 <= $MaxDivs && !$ScaleOk) { $ScaleOk = TRUE; $Divisions = floor($Scale1); $Scale = 1;} + if ( $Scale2 > 1 && $Scale2 <= $MaxDivs && !$ScaleOk) { $ScaleOk = TRUE; $Divisions = floor($Scale2); $Scale = 2;} + if (!$ScaleOk) + { + if ( $Scale2 > 1 ) { $Factor = $Factor * 10; } + if ( $Scale2 < 1 ) { $Factor = $Factor / 10; } + } + } + + if ( floor($this->VMax / $Scale / $Factor) != $this->VMax / $Scale / $Factor) + { + $GridID = floor ( $this->VMax / $Scale / $Factor) + 1; + $this->VMax = $GridID * $Scale * $Factor; + $Divisions++; + } + + if ( floor($this->VMin / $Scale / $Factor) != $this->VMin / $Scale / $Factor) + { + $GridID = floor( $this->VMin / $Scale / $Factor); + $this->VMin = $GridID * $Scale * $Factor; + $Divisions++; + } + } + else /* Can occurs for small graphs */ + $Scale = 1; + + if ( !isset($Divisions) ) + $Divisions = 2; + + if ($Scale == 1 && $Divisions%2 == 1) + $Divisions--; + } + else + $Divisions = $this->Divisions; + + $this->DivisionCount = $Divisions; + + $DataRange = $this->VMax - $this->VMin; + if ( $DataRange == 0 ) { $DataRange = .1; } + + $this->DivisionHeight = ( $this->GArea_Y2 - $this->GArea_Y1 ) / $Divisions; + $this->DivisionRatio = ( $this->GArea_Y2 - $this->GArea_Y1 ) / $DataRange; + + $this->GAreaXOffset = 0; + if ( count($Data) > 1 ) + { + if ( $WithMargin == FALSE ) + $this->DivisionWidth = ( $this->GArea_X2 - $this->GArea_X1 ) / (count($Data)-1); + else + { + $this->DivisionWidth = ( $this->GArea_X2 - $this->GArea_X1 ) / (count($Data)); + $this->GAreaXOffset = $this->DivisionWidth / 2; + } + } + else + { + $this->DivisionWidth = $this->GArea_X2 - $this->GArea_X1; + $this->GAreaXOffset = $this->DivisionWidth / 2; + } + + $this->DataCount = count($Data); + + if ( $DrawTicks == FALSE ) + return(0); + + $YPos = $this->GArea_Y2; $XMin = NULL; + for($i=1;$i<=$Divisions+1;$i++) + { + if ( $RightScale ) + $this->drawLine($this->GArea_X2,$YPos,$this->GArea_X2+5,$YPos,$R,$G,$B); + else + $this->drawLine($this->GArea_X1,$YPos,$this->GArea_X1-5,$YPos,$R,$G,$B); + + $Value = $this->VMin + ($i-1) * (( $this->VMax - $this->VMin ) / $Divisions); + $Value = round($Value * pow(10,$Decimals)) / pow(10,$Decimals); + if ( $DataDescription["Format"]["Y"] == "number" ) + $Value = $Value.$DataDescription["Unit"]["Y"]; + if ( $DataDescription["Format"]["Y"] == "time" ) + $Value = $this->ToTime($Value); + if ( $DataDescription["Format"]["Y"] == "date" ) + $Value = $this->ToDate($Value); + if ( $DataDescription["Format"]["Y"] == "metric" ) + $Value = $this->ToMetric($Value); + if ( $DataDescription["Format"]["Y"] == "currency" ) + $Value = $this->ToCurrency($Value); + + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value); + $TextWidth = $Position[2]-$Position[0]; + + if ( $RightScale ) + { + imagettftext($this->Picture,$this->FontSize,0,$this->GArea_X2+10,$YPos+($this->FontSize/2),$C_TextColor,$this->FontName,$Value); + if ( $XMin < $this->GArea_X2+15+$TextWidth || $XMin == NULL ) { $XMin = $this->GArea_X2+15+$TextWidth; } + } + else + { + imagettftext($this->Picture,$this->FontSize,0,$this->GArea_X1-10-$TextWidth,$YPos+($this->FontSize/2),$C_TextColor,$this->FontName,$Value); + if ( $XMin > $this->GArea_X1-10-$TextWidth || $XMin == NULL ) { $XMin = $this->GArea_X1-10-$TextWidth; } + } + + $YPos = $YPos - $this->DivisionHeight; + } + + /* Write the Y Axis caption if set */ + if ( isset($DataDescription["Axis"]["Y"]) ) + { + $Position = imageftbbox($this->FontSize,90,$this->FontName,$DataDescription["Axis"]["Y"]); + $TextHeight = abs($Position[1])+abs($Position[3]); + $TextTop = (($this->GArea_Y2 - $this->GArea_Y1) / 2) + $this->GArea_Y1 + ($TextHeight/2); + + if ( $RightScale ) + imagettftext($this->Picture,$this->FontSize,90,$XMin+$this->FontSize,$TextTop,$C_TextColor,$this->FontName,$DataDescription["Axis"]["Y"]); + else + imagettftext($this->Picture,$this->FontSize,90,$XMin-$this->FontSize,$TextTop,$C_TextColor,$this->FontName,$DataDescription["Axis"]["Y"]); + } + + /* Horizontal Axis */ + $XPos = $this->GArea_X1 + $this->GAreaXOffset; + $ID = 1; $YMax = NULL; + foreach ( $Data as $Key => $Values ) + { + if ( $ID % $SkipLabels == 0 ) + { + $this->drawLine(floor($XPos),$this->GArea_Y2,floor($XPos),$this->GArea_Y2+5,$R,$G,$B); + $Value = $Data[$Key][$DataDescription["Position"]]; + if ( $DataDescription["Format"]["X"] == "number" ) + $Value = $Value.$DataDescription["Unit"]["X"]; + if ( $DataDescription["Format"]["X"] == "time" ) + $Value = $this->ToTime($Value); + if ( $DataDescription["Format"]["X"] == "date" ) + $Value = $this->ToDate($Value); + if ( $DataDescription["Format"]["X"] == "metric" ) + $Value = $this->ToMetric($Value); + if ( $DataDescription["Format"]["X"] == "currency" ) + $Value = $this->ToCurrency($Value); + + $Position = imageftbbox($this->FontSize,$Angle,$this->FontName,$Value); + $TextWidth = abs($Position[2])+abs($Position[0]); + $TextHeight = abs($Position[1])+abs($Position[3]); + + if ( $Angle == 0 ) + { + $YPos = $this->GArea_Y2+18; + imagettftext($this->Picture,$this->FontSize,$Angle,floor($XPos)-floor($TextWidth/2),$YPos,$C_TextColor,$this->FontName,$Value); + } + else + { + $YPos = $this->GArea_Y2+10+$TextHeight; + if ( $Angle <= 90 ) + imagettftext($this->Picture,$this->FontSize,$Angle,floor($XPos)-$TextWidth+5,$YPos,$C_TextColor,$this->FontName,$Value); + else + imagettftext($this->Picture,$this->FontSize,$Angle,floor($XPos)+$TextWidth+5,$YPos,$C_TextColor,$this->FontName,$Value); + } + if ( $YMax < $YPos || $YMax == NULL ) { $YMax = $YPos; } + } + + $XPos = $XPos + $this->DivisionWidth; + $ID++; + } + + /* Write the X Axis caption if set */ + if ( isset($DataDescription["Axis"]["X"]) ) + { + $Position = imageftbbox($this->FontSize,90,$this->FontName,$DataDescription["Axis"]["X"]); + $TextWidth = abs($Position[2])+abs($Position[0]); + $TextLeft = (($this->GArea_X2 - $this->GArea_X1) / 2) + $this->GArea_X1 + ($TextWidth/2); + imagettftext($this->Picture,$this->FontSize,0,$TextLeft,$YMax+$this->FontSize+5,$C_TextColor,$this->FontName,$DataDescription["Axis"]["X"]); + } + } + + /* Compute and draw the scale for X/Y charts */ + function drawXYScale($Data,$DataDescription,$YSerieName,$XSerieName,$R,$G,$B,$WithMargin=0,$Angle=0,$Decimals=1) + { + /* Validate the Data and DataDescription array */ + $this->validateData("drawScale",$Data); + + $C_TextColor =$this->AllocateColor($this->Picture,$R,$G,$B); + + $this->drawLine($this->GArea_X1,$this->GArea_Y1,$this->GArea_X1,$this->GArea_Y2,$R,$G,$B); + $this->drawLine($this->GArea_X1,$this->GArea_Y2,$this->GArea_X2,$this->GArea_Y2,$R,$G,$B); + + /* Process Y scale */ + if ( $this->VMin == NULL && $this->VMax == NULL) + { + $this->VMin = $Data[0][$YSerieName]; + $this->VMax = $Data[0][$YSerieName]; + + foreach ( $Data as $Key => $Values ) + { + if (isset($Data[$Key][$YSerieName])) + { + $Value = $Data[$Key][$YSerieName]; + if ( $this->VMax < $Value) { $this->VMax = $Value; } + if ( $this->VMin > $Value) { $this->VMin = $Value; } + } + } + + if ( $this->VMax > preg_replace('/\.[0-9]+/','',$this->VMax) ) + $this->VMax = preg_replace('/\.[0-9]+/','',$this->VMax)+1; + + $DataRange = $this->VMax - $this->VMin; + if ( $DataRange == 0 ) { $DataRange = .1; } + + /* Compute automatic scaling */ + $ScaleOk = FALSE; $Factor = 1; + $MinDivHeight = 25; $MaxDivs = ($this->GArea_Y2 - $this->GArea_Y1) / $MinDivHeight; + + if ( $this->VMin == 0 && $this->VMax == 0 ) + { $this->VMin = 0; $this->VMax = 2; $Scale = 1; $Divisions = 2;} + elseif ($MaxDivs > 1) + { + while(!$ScaleOk) + { + $Scale1 = ( $this->VMax - $this->VMin ) / $Factor; + $Scale2 = ( $this->VMax - $this->VMin ) / $Factor / 2; + $Scale4 = ( $this->VMax - $this->VMin ) / $Factor / 4; + + if ( $Scale1 > 1 && $Scale1 <= $MaxDivs && !$ScaleOk) { $ScaleOk = TRUE; $Divisions = floor($Scale1); $Scale = 1;} + if ( $Scale2 > 1 && $Scale2 <= $MaxDivs && !$ScaleOk) { $ScaleOk = TRUE; $Divisions = floor($Scale2); $Scale = 2;} + if (!$ScaleOk) + { + if ( $Scale2 > 1 ) { $Factor = $Factor * 10; } + if ( $Scale2 < 1 ) { $Factor = $Factor / 10; } + } + } + + if ( floor($this->VMax / $Scale / $Factor) != $this->VMax / $Scale / $Factor) + { + $GridID = floor ( $this->VMax / $Scale / $Factor) + 1; + $this->VMax = $GridID * $Scale * $Factor; + $Divisions++; + } + + if ( floor($this->VMin / $Scale / $Factor) != $this->VMin / $Scale / $Factor) + { + $GridID = floor( $this->VMin / $Scale / $Factor); + $this->VMin = $GridID * $Scale * $Factor; + $Divisions++; + } + } + else /* Can occurs for small graphs */ + $Scale = 1; + + if ( !isset($Divisions) ) + $Divisions = 2; + + if ( $this->isRealInt(($this->VMax-$this->VMin)/($Divisions-1))) + $Divisions--; + elseif ( $this->isRealInt(($this->VMax-$this->VMin)/($Divisions+1))) + $Divisions++; + } + else + $Divisions = $this->Divisions; + + $this->DivisionCount = $Divisions; + + $DataRange = $this->VMax - $this->VMin; + if ( $DataRange == 0 ) { $DataRange = .1; } + + $this->DivisionHeight = ( $this->GArea_Y2 - $this->GArea_Y1 ) / $Divisions; + $this->DivisionRatio = ( $this->GArea_Y2 - $this->GArea_Y1 ) / $DataRange; + + $YPos = $this->GArea_Y2; $XMin = NULL; + for($i=1;$i<=$Divisions+1;$i++) + { + $this->drawLine($this->GArea_X1,$YPos,$this->GArea_X1-5,$YPos,$R,$G,$B); + $Value = $this->VMin + ($i-1) * (( $this->VMax - $this->VMin ) / $Divisions); + $Value = round($Value * pow(10,$Decimals)) / pow(10,$Decimals); + if ( $DataDescription["Format"]["Y"] == "number" ) + $Value = $Value.$DataDescription["Unit"]["Y"]; + if ( $DataDescription["Format"]["Y"] == "time" ) + $Value = $this->ToTime($Value); + if ( $DataDescription["Format"]["Y"] == "date" ) + $Value = $this->ToDate($Value); + if ( $DataDescription["Format"]["Y"] == "metric" ) + $Value = $this->ToMetric($Value); + if ( $DataDescription["Format"]["Y"] == "currency" ) + $Value = $this->ToCurrency($Value); + + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value); + $TextWidth = $Position[2]-$Position[0]; + imagettftext($this->Picture,$this->FontSize,0,$this->GArea_X1-10-$TextWidth,$YPos+($this->FontSize/2),$C_TextColor,$this->FontName,$Value); + + if ( $XMin > $this->GArea_X1-10-$TextWidth || $XMin == NULL ) { $XMin = $this->GArea_X1-10-$TextWidth; } + + $YPos = $YPos - $this->DivisionHeight; + } + + /* Process X scale */ + if ( $this->VXMin == NULL && $this->VXMax == NULL) + { + $this->VXMin = $Data[0][$XSerieName]; + $this->VXMax = $Data[0][$XSerieName]; + + foreach ( $Data as $Key => $Values ) + { + if (isset($Data[$Key][$XSerieName])) + { + $Value = $Data[$Key][$XSerieName]; + if ( $this->VXMax < $Value) { $this->VXMax = $Value; } + if ( $this->VXMin > $Value) { $this->VXMin = $Value; } + } + } + + if ( $this->VXMax > preg_replace('/\.[0-9]+/','',$this->VXMax) ) + $this->VXMax = preg_replace('/\.[0-9]+/','',$this->VXMax)+1; + + $DataRange = $this->VMax - $this->VMin; + if ( $DataRange == 0 ) { $DataRange = .1; } + + /* Compute automatic scaling */ + $ScaleOk = FALSE; $Factor = 1; + $MinDivWidth = 25; $MaxDivs = ($this->GArea_X2 - $this->GArea_X1) / $MinDivWidth; + + if ( $this->VXMin == 0 && $this->VXMax == 0 ) + { $this->VXMin = 0; $this->VXMax = 2; $Scale = 1; $XDivisions = 2;} + elseif ($MaxDivs > 1) + { + while(!$ScaleOk) + { + $Scale1 = ( $this->VXMax - $this->VXMin ) / $Factor; + $Scale2 = ( $this->VXMax - $this->VXMin ) / $Factor / 2; + $Scale4 = ( $this->VXMax - $this->VXMin ) / $Factor / 4; + + if ( $Scale1 > 1 && $Scale1 <= $MaxDivs && !$ScaleOk) { $ScaleOk = TRUE; $XDivisions = floor($Scale1); $Scale = 1;} + if ( $Scale2 > 1 && $Scale2 <= $MaxDivs && !$ScaleOk) { $ScaleOk = TRUE; $XDivisions = floor($Scale2); $Scale = 2;} + if (!$ScaleOk) + { + if ( $Scale2 > 1 ) { $Factor = $Factor * 10; } + if ( $Scale2 < 1 ) { $Factor = $Factor / 10; } + } + } + + if ( floor($this->VXMax / $Scale / $Factor) != $this->VXMax / $Scale / $Factor) + { + $GridID = floor ( $this->VXMax / $Scale / $Factor) + 1; + $this->VXMax = $GridID * $Scale * $Factor; + $XDivisions++; + } + + if ( floor($this->VXMin / $Scale / $Factor) != $this->VXMin / $Scale / $Factor) + { + $GridID = floor( $this->VXMin / $Scale / $Factor); + $this->VXMin = $GridID * $Scale * $Factor; + $XDivisions++; + } + } + else /* Can occurs for small graphs */ + $Scale = 1; + + if ( !isset($XDivisions) ) + $XDivisions = 2; + + if ( $this->isRealInt(($this->VXMax-$this->VXMin)/($XDivisions-1))) + $XDivisions--; + elseif ( $this->isRealInt(($this->VXMax-$this->VXMin)/($XDivisions+1))) + $XDivisions++; + } + else + $XDivisions = $this->XDivisions; + + $this->XDivisionCount = $Divisions; + $this->DataCount = $Divisions + 2; + + $XDataRange = $this->VXMax - $this->VXMin; + if ( $XDataRange == 0 ) { $XDataRange = .1; } + + $this->DivisionWidth = ( $this->GArea_X2 - $this->GArea_X1 ) / $XDivisions; + $this->XDivisionRatio = ( $this->GArea_X2 - $this->GArea_X1 ) / $XDataRange; + + $XPos = $this->GArea_X1; $YMax = NULL; + for($i=1;$i<=$XDivisions+1;$i++) + { + $this->drawLine($XPos,$this->GArea_Y2,$XPos,$this->GArea_Y2+5,$R,$G,$B); + + $Value = $this->VXMin + ($i-1) * (( $this->VXMax - $this->VXMin ) / $XDivisions); + $Value = round($Value * pow(10,$Decimals)) / pow(10,$Decimals); + if ( $DataDescription["Format"]["Y"] == "number" ) + $Value = $Value.$DataDescription["Unit"]["Y"]; + if ( $DataDescription["Format"]["Y"] == "time" ) + $Value = $this->ToTime($Value); + if ( $DataDescription["Format"]["Y"] == "date" ) + $Value = $this->ToDate($Value); + if ( $DataDescription["Format"]["Y"] == "metric" ) + $Value = $this->ToMetric($Value); + if ( $DataDescription["Format"]["Y"] == "currency" ) + $Value = $this->ToCurrency($Value); + + $Position = imageftbbox($this->FontSize,$Angle,$this->FontName,$Value); + $TextWidth = abs($Position[2])+abs($Position[0]); + $TextHeight = abs($Position[1])+abs($Position[3]); + + if ( $Angle == 0 ) + { + $YPos = $this->GArea_Y2+18; + imagettftext($this->Picture,$this->FontSize,$Angle,floor($XPos)-floor($TextWidth/2),$YPos,$C_TextColor,$this->FontName,$Value); + } + else + { + $YPos = $this->GArea_Y2+10+$TextHeight; + if ( $Angle <= 90 ) + imagettftext($this->Picture,$this->FontSize,$Angle,floor($XPos)-$TextWidth+5,$YPos,$C_TextColor,$this->FontName,$Value); + else + imagettftext($this->Picture,$this->FontSize,$Angle,floor($XPos)+$TextWidth+5,$YPos,$C_TextColor,$this->FontName,$Value); + } + + if ( $YMax < $YPos || $YMax == NULL ) { $YMax = $YPos; } + + $XPos = $XPos + $this->DivisionWidth; + } + + /* Write the Y Axis caption if set */ + if ( isset($DataDescription["Axis"]["Y"]) ) + { + $Position = imageftbbox($this->FontSize,90,$this->FontName,$DataDescription["Axis"]["Y"]); + $TextHeight = abs($Position[1])+abs($Position[3]); + $TextTop = (($this->GArea_Y2 - $this->GArea_Y1) / 2) + $this->GArea_Y1 + ($TextHeight/2); + imagettftext($this->Picture,$this->FontSize,90,$XMin-$this->FontSize,$TextTop,$C_TextColor,$this->FontName,$DataDescription["Axis"]["Y"]); + } + + /* Write the X Axis caption if set */ + if ( isset($DataDescription["Axis"]["X"]) ) + { + $Position = imageftbbox($this->FontSize,90,$this->FontName,$DataDescription["Axis"]["X"]); + $TextWidth = abs($Position[2])+abs($Position[0]); + $TextLeft = (($this->GArea_X2 - $this->GArea_X1) / 2) + $this->GArea_X1 + ($TextWidth/2); + imagettftext($this->Picture,$this->FontSize,0,$TextLeft,$YMax+$this->FontSize+5,$C_TextColor,$this->FontName,$DataDescription["Axis"]["X"]); + } + } + + /* Compute and draw the scale */ + function drawGrid($LineWidth,$Mosaic=TRUE,$R=220,$G=220,$B=220,$Alpha=100) + { + /* Draw mosaic */ + if ( $Mosaic ) + { + $LayerWidth = $this->GArea_X2-$this->GArea_X1; + $LayerHeight = $this->GArea_Y2-$this->GArea_Y1; + + $this->Layers[0] = imagecreatetruecolor($LayerWidth,$LayerHeight); + $C_White =$this->AllocateColor($this->Layers[0],255,255,255); + imagefilledrectangle($this->Layers[0],0,0,$LayerWidth,$LayerHeight,$C_White); + imagecolortransparent($this->Layers[0],$C_White); + + $C_Rectangle =$this->AllocateColor($this->Layers[0],250,250,250); + + $YPos = $LayerHeight; //$this->GArea_Y2-1; + $LastY = $YPos; + for($i=0;$i<=$this->DivisionCount;$i++) + { + $LastY = $YPos; + $YPos = $YPos - $this->DivisionHeight; + + if ( $YPos <= 0 ) { $YPos = 1; } + + if ( $i % 2 == 0 ) + { + imagefilledrectangle($this->Layers[0],1,$YPos,$LayerWidth-1,$LastY,$C_Rectangle); + } + } + imagecopymerge($this->Picture,$this->Layers[0],$this->GArea_X1,$this->GArea_Y1,0,0,$LayerWidth,$LayerHeight,$Alpha); + imagedestroy($this->Layers[0]); + } + + /* Horizontal lines */ + $YPos = $this->GArea_Y2 - $this->DivisionHeight; + for($i=1;$i<=$this->DivisionCount;$i++) + { + if ( $YPos > $this->GArea_Y1 && $YPos < $this->GArea_Y2 ) + $this->drawDottedLine($this->GArea_X1,$YPos,$this->GArea_X2,$YPos,$LineWidth,$R,$G,$B); + + $YPos = $YPos - $this->DivisionHeight; + } + + /* Vertical lines */ + if ( $this->GAreaXOffset == 0 ) + { $XPos = $this->GArea_X1 + $this->DivisionWidth + $this->GAreaXOffset; $ColCount = $this->DataCount-2; } + else + { $XPos = $this->GArea_X1 + $this->GAreaXOffset; $ColCount = floor( ($this->GArea_X2 - $this->GArea_X1) / $this->DivisionWidth ); } + + for($i=1;$i<=$ColCount;$i++) + { + if ( $XPos > $this->GArea_X1 && $XPos < $this->GArea_X2 ) + $this->drawDottedLine(floor($XPos),$this->GArea_Y1,floor($XPos),$this->GArea_Y2,$LineWidth,$R,$G,$B); + $XPos = $XPos + $this->DivisionWidth; + } + } + + /* retrieve the legends size */ + function getLegendBoxSize($DataDescription) + { + if ( !isset($DataDescription["Description"]) ) + return(-1); + + /* <-10->[8]<-4->Text<-10-> */ + $MaxWidth = 0; $MaxHeight = 8; + foreach($DataDescription["Description"] as $Key => $Value) + { + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value); + $TextWidth = $Position[2]-$Position[0]; + $TextHeight = $Position[1]-$Position[7]; + if ( $TextWidth > $MaxWidth) { $MaxWidth = $TextWidth; } + $MaxHeight = $MaxHeight + $TextHeight + 4; + } + $MaxHeight = $MaxHeight - 3; + $MaxWidth = $MaxWidth + 32; + + return(array($MaxWidth,$MaxHeight)); + } + + /* Draw the data legends */ + function drawLegend($XPos,$YPos,$DataDescription,$R,$G,$B,$Rs=-1,$Gs=-1,$Bs=-1,$Rt=0,$Gt=0,$Bt=0,$Border=TRUE) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawLegend",$DataDescription); + + if ( !isset($DataDescription["Description"]) ) + return(-1); + + $C_TextColor =$this->AllocateColor($this->Picture,$Rt,$Gt,$Bt); + + /* <-10->[8]<-4->Text<-10-> */ + $MaxWidth = 0; $MaxHeight = 8; + foreach($DataDescription["Description"] as $Key => $Value) + { + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value); + $TextWidth = $Position[2]-$Position[0]; + $TextHeight = $Position[1]-$Position[7]; + if ( $TextWidth > $MaxWidth) { $MaxWidth = $TextWidth; } + $MaxHeight = $MaxHeight + $TextHeight + 4; + } + $MaxHeight = $MaxHeight - 5; + $MaxWidth = $MaxWidth + 32; + + if ( $Rs == -1 || $Gs == -1 || $Bs == -1 ) + { $Rs = $R-30; $Gs = $G-30; $Bs = $B-30; } + + if ( $Border ) + { + $this->drawFilledRoundedRectangle($XPos+1,$YPos+1,$XPos+$MaxWidth+1,$YPos+$MaxHeight+1,5,$Rs,$Gs,$Bs); + $this->drawFilledRoundedRectangle($XPos,$YPos,$XPos+$MaxWidth,$YPos+$MaxHeight,5,$R,$G,$B); + } + + $YOffset = 4 + $this->FontSize; $ID = 0; + foreach($DataDescription["Description"] as $Key => $Value) + { + $this->drawFilledRoundedRectangle($XPos+10,$YPos+$YOffset-4,$XPos+14,$YPos+$YOffset-4,2,$this->Palette[$ID]["R"],$this->Palette[$ID]["G"],$this->Palette[$ID]["B"]); + imagettftext($this->Picture,$this->FontSize,0,$XPos+22,$YPos+$YOffset,$C_TextColor,$this->FontName,$Value); + + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value); + $TextHeight = $Position[1]-$Position[7]; + + $YOffset = $YOffset + $TextHeight + 4; + $ID++; + } + } + + /* Draw the data legends */ + function drawPieLegend($XPos,$YPos,$Data,$DataDescription,$R,$G,$B) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawPieLegend",$DataDescription,FALSE); + $this->validateData("drawPieLegend",$Data); + + if ( !isset($DataDescription["Position"]) ) + return(-1); + + $C_TextColor =$this->AllocateColor($this->Picture,0,0,0); + + /* <-10->[8]<-4->Text<-10-> */ + $MaxWidth = 0; $MaxHeight = 8; + foreach($Data as $Key => $Value) + { + $Value2 = $Value[$DataDescription["Position"]]; + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value2); + $TextWidth = $Position[2]-$Position[0]; + $TextHeight = $Position[1]-$Position[7]; + if ( $TextWidth > $MaxWidth) { $MaxWidth = $TextWidth; } + + $MaxHeight = $MaxHeight + $TextHeight + 4; + } + $MaxHeight = $MaxHeight - 3; + $MaxWidth = $MaxWidth + 32; + + $this->drawFilledRoundedRectangle($XPos+1,$YPos+1,$XPos+$MaxWidth+1,$YPos+$MaxHeight+1,5,$R-30,$G-30,$B-30); + $this->drawFilledRoundedRectangle($XPos,$YPos,$XPos+$MaxWidth,$YPos+$MaxHeight,5,$R,$G,$B); + + $YOffset = 4 + $this->FontSize; $ID = 0; + foreach($Data as $Key => $Value) + { + $Value2 = $Value[$DataDescription["Position"]]; + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value2); + $TextHeight = $Position[1]-$Position[7]; + $this->drawFilledRectangle($XPos+10,$YPos+$YOffset-6,$XPos+14,$YPos+$YOffset-2,$this->Palette[$ID]["R"],$this->Palette[$ID]["G"],$this->Palette[$ID]["B"]); + + imagettftext($this->Picture,$this->FontSize,0,$XPos+22,$YPos+$YOffset,$C_TextColor,$this->FontName,$Value2); + $YOffset = $YOffset + $TextHeight + 4; + $ID++; + } + } + + /* Draw the graph title */ + function drawTitle($XPos,$YPos,$Value,$R,$G,$B,$XPos2=-1,$YPos2=-1,$Shadow=FALSE) + { + $C_TextColor = $this->AllocateColor($this->Picture,$R,$G,$B); + + if ( $XPos2 != -1 ) + { + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value); + $TextWidth = $Position[2]-$Position[0]; + $XPos = floor(( $XPos2 - $XPos - $TextWidth ) / 2 ) + $XPos; + } + + if ( $YPos2 != -1 ) + { + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value); + $TextHeight = $Position[5]-$Position[3]; + $YPos = floor(( $YPos2 - $YPos - $TextHeight ) / 2 ) + $YPos; + } + + if ( $Shadow ) + { + $C_ShadowColor = $this->AllocateColor($this->Picture,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor); + imagettftext($this->Picture,$this->FontSize,0,$XPos+$this->ShadowXDistance,$YPos+$this->ShadowYDistance,$C_ShadowColor,$this->FontName,$Value); + } + + imagettftext($this->Picture,$this->FontSize,0,$XPos,$YPos,$C_TextColor,$this->FontName,$Value); + } + + /* Draw a text box with text align & alpha properties */ + function drawTextBox($X1,$Y1,$X2,$Y2,$Text,$Angle=0,$R=255,$G=255,$B=255,$Align=ALIGN_LEFT,$Shadow=TRUE,$BgR=-1,$BgG=-1,$BgB=-1,$Alpha=100) + { + $Position = imageftbbox($this->FontSize,$Angle,$this->FontName,$Text); + $TextWidth = $Position[2]-$Position[0]; + $TextHeight = $Position[5]-$Position[3]; + $AreaWidth = $X2 - $X1; + $AreaHeight = $Y2 - $Y1; + + if ( $BgR != -1 && $BgG != -1 && $BgB != -1 ) + $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,$BgR,$BgG,$BgB,FALSE,$Alpha); + + if ( $Align == ALIGN_TOP_LEFT ) { $X = $X1+1; $Y = $Y1+$this->FontSize+1; } + if ( $Align == ALIGN_TOP_CENTER ) { $X = $X1+($AreaWidth/2)-($TextWidth/2); $Y = $Y1+$this->FontSize+1; } + if ( $Align == ALIGN_TOP_RIGHT ) { $X = $X2-$TextWidth-1; $Y = $Y1+$this->FontSize+1; } + if ( $Align == ALIGN_LEFT ) { $X = $X1+1; $Y = $Y1+($AreaHeight/2)-($TextHeight/2); } + if ( $Align == ALIGN_CENTER ) { $X = $X1+($AreaWidth/2)-($TextWidth/2); $Y = $Y1+($AreaHeight/2)-($TextHeight/2); } + if ( $Align == ALIGN_RIGHT ) { $X = $X2-$TextWidth-1; $Y = $Y1+($AreaHeight/2)-($TextHeight/2); } + if ( $Align == ALIGN_BOTTOM_LEFT ) { $X = $X1+1; $Y = $Y2-1; } + if ( $Align == ALIGN_BOTTOM_CENTER ) { $X = $X1+($AreaWidth/2)-($TextWidth/2); $Y = $Y2-1; } + if ( $Align == ALIGN_BOTTOM_RIGHT ) { $X = $X2-$TextWidth-1; $Y = $Y2-1; } + + $C_TextColor =$this->AllocateColor($this->Picture,$R,$G,$B); + $C_ShadowColor =$this->AllocateColor($this->Picture,0,0,0); + if ( $Shadow ) + imagettftext($this->Picture,$this->FontSize,$Angle,$X+1,$Y+1,$C_ShadowColor,$this->FontName,$Text); + + imagettftext($this->Picture,$this->FontSize,$Angle,$X,$Y,$C_TextColor,$this->FontName,$Text); + } + + /* Compute and draw the scale */ + function drawTreshold($Value,$R,$G,$B,$ShowLabel=FALSE,$ShowOnRight=FALSE,$TickWidth=4,$FreeText=NULL) + { + 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; } + + $C_TextColor =$this->AllocateColor($this->Picture,$R,$G,$B); + $Y = $this->GArea_Y2 - ($Value - $this->VMin) * $this->DivisionRatio; + + if ( $Y <= $this->GArea_Y1 || $Y >= $this->GArea_Y2 ) + return(-1); + + if ( $TickWidth == 0 ) + $this->drawLine($this->GArea_X1,$Y,$this->GArea_X2,$Y,$R,$G,$B); + else + $this->drawDottedLine($this->GArea_X1,$Y,$this->GArea_X2,$Y,$TickWidth,$R,$G,$B); + + if ( $ShowLabel ) + { + if ( $FreeText == NULL ) + { $Label = $Value; } else { $Label = $FreeText; } + + if ( $ShowOnRight ) + imagettftext($this->Picture,$this->FontSize,0,$this->GArea_X2+2,$Y+($this->FontSize/2),$C_TextColor,$this->FontName,$Label); + else + imagettftext($this->Picture,$this->FontSize,0,$this->GArea_X1+2,$Y-($this->FontSize/2),$C_TextColor,$this->FontName,$Label); + } + } + + /* This function put a label on a specific point */ + function setLabel($Data,$DataDescription,$SerieName,$ValueName,$Caption,$R=210,$G=210,$B=210) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("setLabel",$DataDescription); + $this->validateData("setLabel",$Data); + $ShadowFactor = 100; + $C_Label =$this->AllocateColor($this->Picture,$R,$G,$B); + $C_Shadow =$this->AllocateColor($this->Picture,$R-$ShadowFactor,$G-$ShadowFactor,$B-$ShadowFactor); + $C_TextColor =$this->AllocateColor($this->Picture,0,0,0); + + $Cp = 0; $Found = FALSE; + foreach ( $Data as $Key => $Value ) + { + if ( $Data[$Key][$DataDescription["Position"]] == $ValueName ) + { $NumericalValue = $Data[$Key][$SerieName]; $Found = TRUE; } + if ( !$Found ) + $Cp++; + } + + $XPos = $this->GArea_X1 + $this->GAreaXOffset + ( $this->DivisionWidth * $Cp ) + 2; + $YPos = $this->GArea_Y2 - ($NumericalValue - $this->VMin) * $this->DivisionRatio; + + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Caption); + $TextHeight = $Position[3] - $Position[5]; + $TextWidth = $Position[2]-$Position[0] + 2; + $TextOffset = floor($TextHeight/2); + + // Shadow + $Poly = array($XPos+1,$YPos+1,$XPos + 9,$YPos - $TextOffset,$XPos + 8,$YPos + $TextOffset + 2); + imagefilledpolygon($this->Picture,$Poly,3,$C_Shadow); + $this->drawLine($XPos,$YPos+1,$XPos + 9,$YPos - $TextOffset - .2,$R-$ShadowFactor,$G-$ShadowFactor,$B-$ShadowFactor); + $this->drawLine($XPos,$YPos+1,$XPos + 9,$YPos + $TextOffset + 2.2,$R-$ShadowFactor,$G-$ShadowFactor,$B-$ShadowFactor); + $this->drawFilledRectangle($XPos + 9,$YPos - $TextOffset-.2,$XPos + 13 + $TextWidth,$YPos + $TextOffset + 2.2,$R-$ShadowFactor,$G-$ShadowFactor,$B-$ShadowFactor); + + // Label background + $Poly = array($XPos,$YPos,$XPos + 8,$YPos - $TextOffset - 1,$XPos + 8,$YPos + $TextOffset + 1); + imagefilledpolygon($this->Picture,$Poly,3,$C_Label); + $this->drawLine($XPos-1,$YPos,$XPos + 8,$YPos - $TextOffset - 1.2,$R,$G,$B); + $this->drawLine($XPos-1,$YPos,$XPos + 8,$YPos + $TextOffset + 1.2,$R,$G,$B); + $this->drawFilledRectangle($XPos + 8,$YPos - $TextOffset - 1.2,$XPos + 12 + $TextWidth,$YPos + $TextOffset + 1.2,$R,$G,$B); + + imagettftext($this->Picture,$this->FontSize,0,$XPos + 10,$YPos + $TextOffset,$C_TextColor,$this->FontName,$Caption); + } + + /* This function draw a plot graph */ + function drawPlotGraph($Data,$DataDescription,$BigRadius=5,$SmallRadius=2,$R2=-1,$G2=-1,$B2=-1,$Shadow=FALSE) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawPlotGraph",$DataDescription); + $this->validateData("drawPlotGraph",$Data); + + $GraphID = 0; + $Ro = $R2; $Go = $G2; $Bo = $B2; + + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } + + $R = $this->Palette[$ColorID]["R"]; + $G = $this->Palette[$ColorID]["G"]; + $B = $this->Palette[$ColorID]["B"]; + $R2 = $Ro; $G2 = $Go; $B2 = $Bo; + + if ( isset($DataDescription["Symbol"][$ColName]) ) + { + $Is_Alpha = ((ord ( file_get_contents ($DataDescription["Symbol"][$ColName], false, null, 25, 1)) & 6) & 4) == 4; + + $Infos = getimagesize($DataDescription["Symbol"][$ColName]); + $ImageWidth = $Infos[0]; + $ImageHeight = $Infos[1]; + $Symbol = imagecreatefromgif($DataDescription["Symbol"][$ColName]); + } + + $XPos = $this->GArea_X1 + $this->GAreaXOffset; + $Hsize = round($BigRadius/2); + $R3 = -1; $G3 = -1; $B3 = -1; + foreach ( $Data as $Key => $Values ) + { + $Value = $Data[$Key][$ColName]; + $YPos = $this->GArea_Y2 - (($Value-$this->VMin) * $this->DivisionRatio); + + /* Save point into the image map if option activated */ + if ( $this->BuildMap ) + $this->addToImageMap($XPos-$Hsize,$YPos-$Hsize,$XPos+1+$Hsize,$YPos+$Hsize+1,$DataDescription["Description"][$ColName],$Data[$Key][$ColName].$DataDescription["Unit"]["Y"],"Plot"); + + if ( is_numeric($Value) ) + { + if ( !isset($DataDescription["Symbol"][$ColName]) ) + { + + if ( $Shadow ) + { + if ( $R3 !=-1 && $G3 !=-1 && $B3 !=-1 ) + $this->drawFilledCircle($XPos+2,$YPos+2,$BigRadius,$R3,$G3,$B3); + else + { + $R3 = $this->Palette[$ColorID]["R"]-20; if ( $R3 < 0 ) { $R3 = 0; } + $G3 = $this->Palette[$ColorID]["G"]-20; if ( $G3 < 0 ) { $G3 = 0; } + $B3 = $this->Palette[$ColorID]["B"]-20; if ( $B3 < 0 ) { $B3 = 0; } + $this->drawFilledCircle($XPos+2,$YPos+2,$BigRadius,$R3,$G3,$B3); + } + } + + $this->drawFilledCircle($XPos+1,$YPos+1,$BigRadius,$R,$G,$B); + + if ( $SmallRadius != 0 ) + { + if ( $R2 !=-1 && $G2 !=-1 && $B2 !=-1 ) + $this->drawFilledCircle($XPos+1,$YPos+1,$SmallRadius,$R2,$G2,$B2); + else + { + $R2 = $this->Palette[$ColorID]["R"]-15; if ( $R2 < 0 ) { $R2 = 0; } + $G2 = $this->Palette[$ColorID]["G"]-15; if ( $G2 < 0 ) { $G2 = 0; } + $B2 = $this->Palette[$ColorID]["B"]-15; if ( $B2 < 0 ) { $B2 = 0; } + + $this->drawFilledCircle($XPos+1,$YPos+1,$SmallRadius,$R2,$G2,$B2); + } + } + } + else + { + imagecopymerge($this->Picture,$Symbol,$XPos+1-$ImageWidth/2,$YPos+1-$ImageHeight/2,0,0,$ImageWidth,$ImageHeight,100); + } + } + + $XPos = $XPos + $this->DivisionWidth; + } + $GraphID++; + } + } + + /* This function draw a plot graph in an X/Y space */ + function drawXYPlotGraph($Data,$DataDescription,$YSerieName,$XSerieName,$PaletteID=0,$BigRadius=5,$SmallRadius=2,$R2=-1,$G2=-1,$B2=-1,$Shadow=TRUE) + { + $R = $this->Palette[$PaletteID]["R"]; + $G = $this->Palette[$PaletteID]["G"]; + $B = $this->Palette[$PaletteID]["B"]; + $R3 = -1; $G3 = -1; $B3 = -1; + + $YLast = -1; $XLast = -1; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$YSerieName]) && isset($Data[$Key][$XSerieName]) ) + { + $X = $Data[$Key][$XSerieName]; + $Y = $Data[$Key][$YSerieName]; + + $Y = $this->GArea_Y2 - (($Y-$this->VMin) * $this->DivisionRatio); + $X = $this->GArea_X1 + (($X-$this->VXMin) * $this->XDivisionRatio); + + + if ( $Shadow ) + { + if ( $R3 !=-1 && $G3 !=-1 && $B3 !=-1 ) + $this->drawFilledCircle($X+2,$Y+2,$BigRadius,$R3,$G3,$B3); + else + { + $R3 = $this->Palette[$PaletteID]["R"]-20; if ( $R < 0 ) { $R = 0; } + $G3 = $this->Palette[$PaletteID]["G"]-20; if ( $G < 0 ) { $G = 0; } + $B3 = $this->Palette[$PaletteID]["B"]-20; if ( $B < 0 ) { $B = 0; } + $this->drawFilledCircle($X+2,$Y+2,$BigRadius,$R3,$G3,$B3); + } + } + + $this->drawFilledCircle($X+1,$Y+1,$BigRadius,$R,$G,$B); + + if ( $R2 !=-1 && $G2 !=-1 && $B2 !=-1 ) + $this->drawFilledCircle($X+1,$Y+1,$SmallRadius,$R2,$G2,$B2); + else + { + $R2 = $this->Palette[$PaletteID]["R"]+20; if ( $R > 255 ) { $R = 255; } + $G2 = $this->Palette[$PaletteID]["G"]+20; if ( $G > 255 ) { $G = 255; } + $B2 = $this->Palette[$PaletteID]["B"]+20; if ( $B > 255 ) { $B = 255; } + $this->drawFilledCircle($X+1,$Y+1,$SmallRadius,$R2,$G2,$B2); + } + } + } + + } + + /* This function draw an area between two series */ + function drawArea($Data,$Serie1,$Serie2,$R,$G,$B,$Alpha = 50) + { + /* Validate the Data and DataDescription array */ + $this->validateData("drawArea",$Data); + + $LayerWidth = $this->GArea_X2-$this->GArea_X1; + $LayerHeight = $this->GArea_Y2-$this->GArea_Y1; + + $this->Layers[0] = imagecreatetruecolor($LayerWidth,$LayerHeight); + $C_White =$this->AllocateColor($this->Layers[0],255,255,255); + imagefilledrectangle($this->Layers[0],0,0,$LayerWidth,$LayerHeight,$C_White); + imagecolortransparent($this->Layers[0],$C_White); + + $C_Graph =$this->AllocateColor($this->Layers[0],$R,$G,$B); + + $XPos = $this->GAreaXOffset; + $LastXPos = -1; + foreach ( $Data as $Key => $Values ) + { + $Value1 = $Data[$Key][$Serie1]; + $Value2 = $Data[$Key][$Serie2]; + $YPos1 = $LayerHeight - (($Value1-$this->VMin) * $this->DivisionRatio); + $YPos2 = $LayerHeight - (($Value2-$this->VMin) * $this->DivisionRatio); + + if ( $LastXPos != -1 ) + { + $Points = ""; + $Points[] = $LastXPos; $Points[] = $LastYPos1; + $Points[] = $LastXPos; $Points[] = $LastYPos2; + $Points[] = $XPos; $Points[] = $YPos2; + $Points[] = $XPos; $Points[] = $YPos1; + + imagefilledpolygon($this->Layers[0],$Points,4,$C_Graph); + } + + $LastYPos1 = $YPos1; + $LastYPos2 = $YPos2; + $LastXPos = $XPos; + + $XPos = $XPos + $this->DivisionWidth; + } + + imagecopymerge($this->Picture,$this->Layers[0],$this->GArea_X1,$this->GArea_Y1,0,0,$LayerWidth,$LayerHeight,$Alpha); + imagedestroy($this->Layers[0]); + } + + + /* This function write the values of the specified series */ + function writeValues($Data,$DataDescription,$Series) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("writeValues",$DataDescription); + $this->validateData("writeValues",$Data); + + if ( !is_array($Series) ) { $Series = array($Series); } + + foreach($Series as $Key => $Serie) + { + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $Serie ) { $ColorID = $ID; }; $ID++; } + + $XPos = $this->GArea_X1 + $this->GAreaXOffset; + $XLast = -1; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$Serie]) && is_numeric($Data[$Key][$Serie])) + { + $Value = $Data[$Key][$Serie]; + $YPos = $this->GArea_Y2 - (($Value-$this->VMin) * $this->DivisionRatio); + + $Positions = imagettfbbox($this->FontSize,0,$this->FontName,$Value); + $Width = $Positions[2] - $Positions[6]; $XOffset = $XPos - ($Width/2); + $Height = $Positions[3] - $Positions[7]; $YOffset = $YPos - 4; + + $C_TextColor =$this->AllocateColor($this->Picture,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); + imagettftext($this->Picture,$this->FontSize,0,$XOffset,$YOffset,$C_TextColor,$this->FontName,$Value); + } + $XPos = $XPos + $this->DivisionWidth; + } + + } + } + + /* This function draw a line graph */ + function drawLineGraph($Data,$DataDescription,$SerieName="") + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawLineGraph",$DataDescription); + $this->validateData("drawLineGraph",$Data); + + $GraphID = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } + + if ( $SerieName == "" || $SerieName == $ColName ) + { + $XPos = $this->GArea_X1 + $this->GAreaXOffset; + $XLast = -1; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName])) + { + $Value = $Data[$Key][$ColName]; + $YPos = $this->GArea_Y2 - (($Value-$this->VMin) * $this->DivisionRatio); + + /* Save point into the image map if option activated */ + if ( $this->BuildMap ) + $this->addToImageMap($XPos-3,$YPos-3,$XPos+3,$YPos+3,$DataDescription["Description"][$ColName],$Data[$Key][$ColName].$DataDescription["Unit"]["Y"],"Line"); + + if (!is_numeric($Value)) { $XLast = -1; } + if ( $XLast != -1 ) + $this->drawLine($XLast,$YLast,$XPos,$YPos,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"],TRUE); + + $XLast = $XPos; + $YLast = $YPos; + if (!is_numeric($Value)) { $XLast = -1; } + } + $XPos = $XPos + $this->DivisionWidth; + } + $GraphID++; + } + } + } + + /* This function draw a line graph */ + function drawXYGraph($Data,$DataDescription,$YSerieName,$XSerieName,$PaletteID=0) + { + $YLast = -1; $XLast = -1; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$YSerieName]) && isset($Data[$Key][$XSerieName]) ) + { + $X = $Data[$Key][$XSerieName]; + $Y = $Data[$Key][$YSerieName]; + + $Y = $this->GArea_Y2 - (($Y-$this->VMin) * $this->DivisionRatio); + $X = $this->GArea_X1 + (($X-$this->VXMin) * $this->XDivisionRatio); + + if ($XLast != -1 && $YLast != -1) + { + $this->drawLine($XLast,$YLast,$X,$Y,$this->Palette[$PaletteID]["R"],$this->Palette[$PaletteID]["G"],$this->Palette[$PaletteID]["B"],TRUE); + } + + $XLast = $X; + $YLast = $Y; + } + } + } + + /* This function draw a cubic curve */ + function drawCubicCurve($Data,$DataDescription,$Accuracy=.1,$SerieName="") + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawCubicCurve",$DataDescription); + $this->validateData("drawCubicCurve",$Data); + + $GraphID = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + if ( $SerieName == "" || $SerieName == $ColName ) + { + $XIn = ""; $Yin = ""; $Yt = ""; $U = ""; + $XIn[0] = 0; $YIn[0] = 0; + + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } + + $Index = 1; + $XLast = -1; $Missing = ""; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName]) ) + { + $Value = $Data[$Key][$ColName]; + $XIn[$Index] = $Index; + $YIn[$Index] = $Value; + if ( !is_numeric($Value) ) { $Missing[$Index] = TRUE; } + $Index++; + } + } + $Index--; + + $Yt[0] = 0; + $Yt[1] = 0; + $U[1] = 0; + for($i=2;$i<=$Index-1;$i++) + { + $Sig = ($XIn[$i] - $XIn[$i-1]) / ($XIn[$i+1] - $XIn[$i-1]); + $p = $Sig * $Yt[$i-1] + 2; + $Yt[$i] = ($Sig - 1) / $p; + $U[$i] = ($YIn[$i+1] - $YIn[$i]) / ($XIn[$i+1] - $XIn[$i]) - ($YIn[$i] - $YIn[$i-1]) / ($XIn[$i] - $XIn[$i-1]); + $U[$i] = (6 * $U[$i] / ($XIn[$i+1] - $XIn[$i-1]) - $Sig * $U[$i-1]) / $p; + } + + $qn = 0; + $un = 0; + $Yt[$Index] = ($un - $qn * $U[$Index-1]) / ($qn * $Yt[$Index-1] + 1); + + for($k=$Index-1;$k>=1;$k--) + $Yt[$k] = $Yt[$k] * $Yt[$k+1] + $U[$k]; + + $XPos = $this->GArea_X1 + $this->GAreaXOffset; + for($X=1;$X<=$Index;$X=$X+$Accuracy) + { + $klo = 1; + $khi = $Index; + $k = $khi - $klo; + while($k > 1) + { + $k = $khi - $klo; + If ( $XIn[$k] >= $X ) + $khi = $k; + else + $klo = $k; + } + $klo = $khi - 1; + + $h = $XIn[$khi] - $XIn[$klo]; + $a = ($XIn[$khi] - $X) / $h; + $b = ($X - $XIn[$klo]) / $h; + $Value = $a * $YIn[$klo] + $b * $YIn[$khi] + (($a*$a*$a - $a) * $Yt[$klo] + ($b*$b*$b - $b) * $Yt[$khi]) * ($h*$h) / 6; + + $YPos = $this->GArea_Y2 - (($Value-$this->VMin) * $this->DivisionRatio); + + if ( $XLast != -1 && !isset($Missing[floor($X)]) && !isset($Missing[floor($X+1)]) ) + $this->drawLine($XLast,$YLast,$XPos,$YPos,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"],TRUE); + + $XLast = $XPos; + $YLast = $YPos; + $XPos = $XPos + $this->DivisionWidth * $Accuracy; + } + + // Add potentialy missing values + $XPos = $XPos - $this->DivisionWidth * $Accuracy; + if ( $XPos < ($this->GArea_X2 - $this->GAreaXOffset) ) + { + $YPos = $this->GArea_Y2 - (($YIn[$Index]-$this->VMin) * $this->DivisionRatio); + $this->drawLine($XLast,$YLast,$this->GArea_X2-$this->GAreaXOffset,$YPos,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"],TRUE); + } + + $GraphID++; + } + } + } + + /* This function draw a filled cubic curve */ + function drawFilledCubicCurve($Data,$DataDescription,$Accuracy=.1,$Alpha=100,$AroundZero=FALSE) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawFilledCubicCurve",$DataDescription); + $this->validateData("drawFilledCubicCurve",$Data); + + $LayerWidth = $this->GArea_X2-$this->GArea_X1; + $LayerHeight = $this->GArea_Y2-$this->GArea_Y1; + $YZero = $LayerHeight - ((0-$this->VMin) * $this->DivisionRatio); + if ( $YZero > $LayerHeight ) { $YZero = $LayerHeight; } + + $GraphID = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + $XIn = ""; $Yin = ""; $Yt = ""; $U = ""; + $XIn[0] = 0; $YIn[0] = 0; + + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } + + $Index = 1; + $XLast = -1; $Missing = ""; + foreach ( $Data as $Key => $Values ) + { + $Value = $Data[$Key][$ColName]; + $XIn[$Index] = $Index; + $YIn[$Index] = $Value; + if ( !is_numeric($Value) ) { $Missing[$Index] = TRUE; } + $Index++; + } + $Index--; + + $Yt[0] = 0; + $Yt[1] = 0; + $U[1] = 0; + for($i=2;$i<=$Index-1;$i++) + { + $Sig = ($XIn[$i] - $XIn[$i-1]) / ($XIn[$i+1] - $XIn[$i-1]); + $p = $Sig * $Yt[$i-1] + 2; + $Yt[$i] = ($Sig - 1) / $p; + $U[$i] = ($YIn[$i+1] - $YIn[$i]) / ($XIn[$i+1] - $XIn[$i]) - ($YIn[$i] - $YIn[$i-1]) / ($XIn[$i] - $XIn[$i-1]); + $U[$i] = (6 * $U[$i] / ($XIn[$i+1] - $XIn[$i-1]) - $Sig * $U[$i-1]) / $p; + } + + $qn = 0; + $un = 0; + $Yt[$Index] = ($un - $qn * $U[$Index-1]) / ($qn * $Yt[$Index-1] + 1); + + for($k=$Index-1;$k>=1;$k--) + $Yt[$k] = $Yt[$k] * $Yt[$k+1] + $U[$k]; + + $Points = ""; + $Points[] = $this->GAreaXOffset; + $Points[] = $LayerHeight; + + $this->Layers[0] = imagecreatetruecolor($LayerWidth,$LayerHeight); + $C_White =$this->AllocateColor($this->Layers[0],255,255,255); + imagefilledrectangle($this->Layers[0],0,0,$LayerWidth,$LayerHeight,$C_White); + imagecolortransparent($this->Layers[0],$C_White); + + $YLast = NULL; + $XPos = $this->GAreaXOffset; $PointsCount = 2; + for($X=1;$X<=$Index;$X=$X+$Accuracy) + { + $klo = 1; + $khi = $Index; + $k = $khi - $klo; + while($k > 1) + { + $k = $khi - $klo; + If ( $XIn[$k] >= $X ) + $khi = $k; + else + $klo = $k; + } + $klo = $khi - 1; + + $h = $XIn[$khi] - $XIn[$klo]; + $a = ($XIn[$khi] - $X) / $h; + $b = ($X - $XIn[$klo]) / $h; + $Value = $a * $YIn[$klo] + $b * $YIn[$khi] + (($a*$a*$a - $a) * $Yt[$klo] + ($b*$b*$b - $b) * $Yt[$khi]) * ($h*$h) / 6; + + $YPos = $LayerHeight - (($Value-$this->VMin) * $this->DivisionRatio); + + if ( $YLast != NULL && $AroundZero && !isset($Missing[floor($X)]) && !isset($Missing[floor($X+1)])) + { + $aPoints = ""; + $aPoints[] = $XLast; + $aPoints[] = $YLast; + $aPoints[] = $XPos; + $aPoints[] = $YPos; + $aPoints[] = $XPos; + $aPoints[] = $YZero; + $aPoints[] = $XLast; + $aPoints[] = $YZero; + + $C_Graph =$this->AllocateColor($this->Layers[0],$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); + imagefilledpolygon($this->Layers[0],$aPoints,4,$C_Graph); + } + + if ( !isset($Missing[floor($X)]) || $YLast == NULL ) + { + $PointsCount++; + $Points[] = $XPos; + $Points[] = $YPos; + } + else + { + $PointsCount++; $Points[] = $XLast; $Points[] = $LayerHeight; + } + + $YLast = $YPos; $XLast = $XPos; + $XPos = $XPos + $this->DivisionWidth * $Accuracy; + } + + // Add potentialy missing values + $XPos = $XPos - $this->DivisionWidth * $Accuracy; + if ( $XPos < ($LayerWidth-$this->GAreaXOffset) ) + { + $YPos = $LayerHeight - (($YIn[$Index]-$this->VMin) * $this->DivisionRatio); + + if ( $YLast != NULL && $AroundZero ) + { + $aPoints = ""; + $aPoints[] = $XLast; + $aPoints[] = $YLast; + $aPoints[] = $LayerWidth-$this->GAreaXOffset; + $aPoints[] = $YPos; + $aPoints[] = $LayerWidth-$this->GAreaXOffset; + $aPoints[] = $YZero; + $aPoints[] = $XLast; + $aPoints[] = $YZero; + + $C_Graph =$this->AllocateColor($this->Layers[0],$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); + imagefilledpolygon($this->Layers[0],$aPoints,4,$C_Graph); + } + + if ( $YIn[$klo] != "" && $YIn[$khi] != "" || $YLast == NULL ) + { + $PointsCount++; + $Points[] = $LayerWidth-$this->GAreaXOffset; + $Points[] = $YPos; + } + } + + $Points[] = $LayerWidth-$this->GAreaXOffset; + $Points[] = $LayerHeight; + + if ( !$AroundZero ) + { + $C_Graph =$this->AllocateColor($this->Layers[0],$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); + imagefilledpolygon($this->Layers[0],$Points,$PointsCount,$C_Graph); + } + + imagecopymerge($this->Picture,$this->Layers[0],$this->GArea_X1,$this->GArea_Y1,0,0,$LayerWidth,$LayerHeight,$Alpha); + imagedestroy($this->Layers[0]); + + $this->drawCubicCurve($Data,$DataDescription,$Accuracy,$ColName); + + $GraphID++; + } + } + + /* This function draw a filled line graph */ + function drawFilledLineGraph($Data,$DataDescription,$Alpha=100,$AroundZero=FALSE) + { + $Empty = -2147483647; + + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawFilledLineGraph",$DataDescription); + $this->validateData("drawFilledLineGraph",$Data); + + $LayerWidth = $this->GArea_X2-$this->GArea_X1; + $LayerHeight = $this->GArea_Y2-$this->GArea_Y1; + + $GraphID = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } + + $aPoints = ""; + $aPoints[] = $this->GAreaXOffset; + $aPoints[] = $LayerHeight; + + $this->Layers[0] = imagecreatetruecolor($LayerWidth,$LayerHeight); + $C_White = $this->AllocateColor($this->Layers[0],255,255,255); + imagefilledrectangle($this->Layers[0],0,0,$LayerWidth,$LayerHeight,$C_White); + imagecolortransparent($this->Layers[0],$C_White); + + $XPos = $this->GAreaXOffset; + $XLast = -1; $PointsCount = 2; + $YZero = $LayerHeight - ((0-$this->VMin) * $this->DivisionRatio); + if ( $YZero > $LayerHeight ) { $YZero = $LayerHeight; } + + $YLast = $Empty; + foreach ( $Data as $Key => $Values ) + { + $Value = $Data[$Key][$ColName]; + $YPos = $LayerHeight - (($Value-$this->VMin) * $this->DivisionRatio); + + /* Save point into the image map if option activated */ + if ( $this->BuildMap ) + $this->addToImageMap($XPos-3,$YPos-3,$XPos+3,$YPos+3,$DataDescription["Description"][$ColName],$Data[$Key][$ColName].$DataDescription["Unit"]["Y"],"FLine"); + + if ( !is_numeric($Value) ) + { + $PointsCount++; + $aPoints[] = $XLast; + $aPoints[] = $LayerHeight; + + $YLast = $Empty; + } + else + { + $PointsCount++; + if ( $YLast <> $Empty ) + { $aPoints[] = $XPos; $aPoints[] = $YPos; } + else + { $PointsCount++; $aPoints[] = $XPos; $aPoints[] = $LayerHeight; $aPoints[] = $XPos; $aPoints[] = $YPos; } + + if ($YLast <> $Empty && $AroundZero) + { + $Points = ""; + $Points[] = $XLast; $Points[] = $YLast; + $Points[] = $XPos; + $Points[] = $YPos; + $Points[] = $XPos; + $Points[] = $YZero; + $Points[] = $XLast; + $Points[] = $YZero; + + $C_Graph = $this->AllocateColor($this->Layers[0],$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); + imagefilledpolygon($this->Layers[0],$Points,4,$C_Graph); + } + $YLast = $YPos; + } + + $XLast = $XPos; + $XPos = $XPos + $this->DivisionWidth; + } + $aPoints[] = $LayerWidth - $this->GAreaXOffset; + $aPoints[] = $LayerHeight; + + if ( $AroundZero == FALSE ) + { + $C_Graph = $this->AllocateColor($this->Layers[0],$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); + imagefilledpolygon($this->Layers[0],$aPoints,$PointsCount,$C_Graph); + } + + imagecopymerge($this->Picture,$this->Layers[0],$this->GArea_X1,$this->GArea_Y1,0,0,$LayerWidth,$LayerHeight,$Alpha); + imagedestroy($this->Layers[0]); + $GraphID++; + $this->drawLineGraph($Data,$DataDescription,$ColName); + } + } + + /* This function draw a bar graph */ + function drawOverlayBarGraph($Data,$DataDescription,$Alpha=50) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawOverlayBarGraph",$DataDescription); + $this->validateData("drawOverlayBarGraph",$Data); + + $LayerWidth = $this->GArea_X2-$this->GArea_X1; + $LayerHeight = $this->GArea_Y2-$this->GArea_Y1; + + $GraphID = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } + + $this->Layers[$GraphID] = imagecreatetruecolor($LayerWidth,$LayerHeight); + $C_White = $this->AllocateColor($this->Layers[$GraphID],255,255,255); + $C_Graph = $this->AllocateColor($this->Layers[$GraphID],$this->Palette[$GraphID]["R"],$this->Palette[$GraphID]["G"],$this->Palette[$GraphID]["B"]); + imagefilledrectangle($this->Layers[$GraphID],0,0,$LayerWidth,$LayerHeight,$C_White); + imagecolortransparent($this->Layers[$GraphID],$C_White); + + $XWidth = $this->DivisionWidth / 4; + $XPos = $this->GAreaXOffset; + $YZero = $LayerHeight - ((0-$this->VMin) * $this->DivisionRatio); + $XLast = -1; $PointsCount = 2; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName]) ) + { + $Value = $Data[$Key][$ColName]; + if ( is_numeric($Value) ) + { + $YPos = $LayerHeight - (($Value-$this->VMin) * $this->DivisionRatio); + + imagefilledrectangle($this->Layers[$GraphID],$XPos-$XWidth,$YPos,$XPos+$XWidth,$YZero,$C_Graph); + + $X1 = floor($XPos - $XWidth + $this->GArea_X1); $Y1 = floor($YPos+$this->GArea_Y1) + .2; + $X2 = floor($XPos + $XWidth + $this->GArea_X1); $Y2 = $this->GArea_Y2 - ((0-$this->VMin) * $this->DivisionRatio); + if ( $X1 <= $this->GArea_X1 ) { $X1 = $this->GArea_X1 + 1; } + if ( $X2 >= $this->GArea_X2 ) { $X2 = $this->GArea_X2 - 1; } + + /* Save point into the image map if option activated */ + if ( $this->BuildMap ) + $this->addToImageMap($X1,min($Y1,$Y2),$X2,max($Y1,$Y2),$DataDescription["Description"][$ColName],$Data[$Key][$ColName].$DataDescription["Unit"]["Y"],"oBar"); + + $this->drawLine($X1,$Y1,$X2,$Y1,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"],TRUE); + } + } + $XPos = $XPos + $this->DivisionWidth; + } + + $GraphID++; + } + + for($i=0;$i<=($GraphID-1);$i++) + { + imagecopymerge($this->Picture,$this->Layers[$i],$this->GArea_X1,$this->GArea_Y1,0,0,$LayerWidth,$LayerHeight,$Alpha); + imagedestroy($this->Layers[$i]); + } + } + + /* This function draw a bar graph */ + function drawBarGraph($Data,$DataDescription,$Shadow=FALSE,$Alpha=100) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawBarGraph",$DataDescription); + $this->validateData("drawBarGraph",$Data); + + $GraphID = 0; + $Series = count($DataDescription["Values"]); + $SeriesWidth = $this->DivisionWidth / ($Series+1); + $SerieXOffset = $this->DivisionWidth / 2 - $SeriesWidth / 2; + + $YZero = $this->GArea_Y2 - ((0-$this->VMin) * $this->DivisionRatio); + if ( $YZero > $this->GArea_Y2 ) { $YZero = $this->GArea_Y2; } + + $SerieID = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } + + $XPos = $this->GArea_X1 + $this->GAreaXOffset - $SerieXOffset + $SeriesWidth * $SerieID; + $XLast = -1; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName])) + { + if ( is_numeric($Data[$Key][$ColName]) ) + { + $Value = $Data[$Key][$ColName]; + $YPos = $this->GArea_Y2 - (($Value-$this->VMin) * $this->DivisionRatio); + + /* Save point into the image map if option activated */ + if ( $this->BuildMap ) + { + $this->addToImageMap($XPos+1,min($YZero,$YPos),$XPos+$SeriesWidth-1,max($YZero,$YPos),$DataDescription["Description"][$ColName],$Data[$Key][$ColName].$DataDescription["Unit"]["Y"],"Bar"); + } + + if ( $Shadow && $Alpha == 100 ) + $this->drawRectangle($XPos+1,$YZero,$XPos+$SeriesWidth-1,$YPos,25,25,25,TRUE,$Alpha); + + $this->drawFilledRectangle($XPos+1,$YZero,$XPos+$SeriesWidth-1,$YPos,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"],TRUE,$Alpha); + } + } + $XPos = $XPos + $this->DivisionWidth; + } + $SerieID++; + } + } + + /* This function draw a stacked bar graph */ + function drawStackedBarGraph($Data,$DataDescription,$Alpha=50,$Contiguous=FALSE) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawBarGraph",$DataDescription); + $this->validateData("drawBarGraph",$Data); + + $GraphID = 0; + $Series = count($DataDescription["Values"]); + if ( $Contiguous ) + $SeriesWidth = $this->DivisionWidth; + else + $SeriesWidth = $this->DivisionWidth * .8; + + $YZero = $this->GArea_Y2 - ((0-$this->VMin) * $this->DivisionRatio); + if ( $YZero > $this->GArea_Y2 ) { $YZero = $this->GArea_Y2; } + + $SerieID = 0; $LastValue = ""; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } + + $XPos = $this->GArea_X1 + $this->GAreaXOffset - $SeriesWidth / 2; + $XLast = -1; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName])) + { + if ( is_numeric($Data[$Key][$ColName]) ) + { + $Value = $Data[$Key][$ColName]; + + if ( isset($LastValue[$Key]) ) + { + $YPos = $this->GArea_Y2 - ((($Value+$LastValue[$Key])-$this->VMin) * $this->DivisionRatio); + $YBottom = $this->GArea_Y2 - (($LastValue[$Key]-$this->VMin) * $this->DivisionRatio); + $LastValue[$Key] += $Value; + } + else + { + $YPos = $this->GArea_Y2 - (($Value-$this->VMin) * $this->DivisionRatio); + $YBottom = $YZero; + $LastValue[$Key] = $Value; + } + + /* Save point into the image map if option activated */ + if ( $this->BuildMap ) + $this->addToImageMap($XPos+1,min($YBottom,$YPos),$XPos+$SeriesWidth-1,max($YBottom,$YPos),$DataDescription["Description"][$ColName],$Data[$Key][$ColName].$DataDescription["Unit"]["Y"],"sBar"); + + $this->drawFilledRectangle($XPos+1,$YBottom,$XPos+$SeriesWidth-1,$YPos,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"],TRUE,$Alpha); + } + } + $XPos = $XPos + $this->DivisionWidth; + } + $SerieID++; + } + } + + /* This function draw a limits bar graphs */ + function drawLimitsGraph($Data,$DataDescription,$R=0,$G=0,$B=0) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawLimitsGraph",$DataDescription); + $this->validateData("drawLimitsGraph",$Data); + + $XWidth = $this->DivisionWidth / 4; + $XPos = $this->GArea_X1 + $this->GAreaXOffset; + + foreach ( $Data as $Key => $Values ) + { + $Min = $Data[$Key][$DataDescription["Values"][0]]; + $Max = $Data[$Key][$DataDescription["Values"][0]]; + $GraphID = 0; $MaxID = 0; $MinID = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + if ( isset($Data[$Key][$ColName]) ) + { + if ( $Data[$Key][$ColName] > $Max && is_numeric($Data[$Key][$ColName])) + { $Max = $Data[$Key][$ColName]; $MaxID = $GraphID; } + } + if ( isset($Data[$Key][$ColName]) && is_numeric($Data[$Key][$ColName])) + { + if ( $Data[$Key][$ColName] < $Min ) + { $Min = $Data[$Key][$ColName]; $MinID = $GraphID; } + $GraphID++; + } + } + + $YPos = $this->GArea_Y2 - (($Max-$this->VMin) * $this->DivisionRatio); + $X1 = floor($XPos - $XWidth); $Y1 = floor($YPos) - .2; + $X2 = floor($XPos + $XWidth); + if ( $X1 <= $this->GArea_X1 ) { $X1 = $this->GArea_X1 + 1; } + if ( $X2 >= $this->GArea_X2 ) { $X2 = $this->GArea_X2 - 1; } + + $YPos = $this->GArea_Y2 - (($Min-$this->VMin) * $this->DivisionRatio); + $Y2 = floor($YPos) + .2; + + $this->drawLine(floor($XPos)-.2,$Y1+1,floor($XPos)-.2,$Y2-1,$R,$G,$B,TRUE); + $this->drawLine(floor($XPos)+.2,$Y1+1,floor($XPos)+.2,$Y2-1,$R,$G,$B,TRUE); + $this->drawLine($X1,$Y1,$X2,$Y1,$this->Palette[$MaxID]["R"],$this->Palette[$MaxID]["G"],$this->Palette[$MaxID]["B"],FALSE); + $this->drawLine($X1,$Y2,$X2,$Y2,$this->Palette[$MinID]["R"],$this->Palette[$MinID]["G"],$this->Palette[$MinID]["B"],FALSE); + + $XPos = $XPos + $this->DivisionWidth; + } + } + + /* This function draw radar axis centered on the graph area */ + function drawRadarAxis($Data,$DataDescription,$Mosaic=TRUE,$BorderOffset=10,$A_R=60,$A_G=60,$A_B=60,$S_R=200,$S_G=200,$S_B=200,$MaxValue=-1) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawRadarAxis",$DataDescription); + $this->validateData("drawRadarAxis",$Data); + + $C_TextColor = $this->AllocateColor($this->Picture,$A_R,$A_G,$A_B); + + /* Draw radar axis */ + $Points = count($Data); + $Radius = ( $this->GArea_Y2 - $this->GArea_Y1 ) / 2 - $BorderOffset; + $XCenter = ( $this->GArea_X2 - $this->GArea_X1 ) / 2 + $this->GArea_X1; + $YCenter = ( $this->GArea_Y2 - $this->GArea_Y1 ) / 2 + $this->GArea_Y1; + + /* Search for the max value */ + if ( $MaxValue == -1 ) + { + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName])) + if ( $Data[$Key][$ColName] > $MaxValue ) { $MaxValue = $Data[$Key][$ColName]; } + } + } + } + + /* Draw the mosaic */ + if ( $Mosaic ) + { + $RadiusScale = $Radius / $MaxValue; + for ( $t=1; $t<=$MaxValue-1; $t++) + { + $TRadius = $RadiusScale * $t; + $LastX1 = -1; + + for ( $i=0; $i<=$Points; $i++) + { + $Angle = -90 + $i * 360/$Points; + $X1 = cos($Angle * 3.1418 / 180 ) * $TRadius + $XCenter; + $Y1 = sin($Angle * 3.1418 / 180 ) * $TRadius + $YCenter; + $X2 = cos($Angle * 3.1418 / 180 ) * ($TRadius+$RadiusScale) + $XCenter; + $Y2 = sin($Angle * 3.1418 / 180 ) * ($TRadius+$RadiusScale) + $YCenter; + + if ( $t % 2 == 1 && $LastX1 != -1) + { + $Plots = ""; + $Plots[] = $X1; $Plots[] = $Y1; + $Plots[] = $X2; $Plots[] = $Y2; + $Plots[] = $LastX2; $Plots[] = $LastY2; + $Plots[] = $LastX1; $Plots[] = $LastY1; + + $C_Graph = $this->AllocateColor($this->Picture,250,250,250); + imagefilledpolygon($this->Picture,$Plots,(count($Plots)+1)/2,$C_Graph); + } + + $LastX1 = $X1; $LastY1= $Y1; + $LastX2 = $X2; $LastY2= $Y2; + } + } + } + + + /* Draw the spider web */ + for ( $t=1; $t<=$MaxValue; $t++) + { + $TRadius = ( $Radius / $MaxValue ) * $t; + $LastX = -1; + + for ( $i=0; $i<=$Points; $i++) + { + $Angle = -90 + $i * 360/$Points; + $X = cos($Angle * 3.1418 / 180 ) * $TRadius + $XCenter; + $Y = sin($Angle * 3.1418 / 180 ) * $TRadius + $YCenter; + + if ( $LastX != -1 ) + $this->drawDottedLine($LastX,$LastY,$X,$Y,4,$S_R,$S_G,$S_B); + + $LastX = $X; $LastY= $Y; + } + } + + /* Draw the axis */ + for ( $i=0; $i<=$Points; $i++) + { + $Angle = -90 + $i * 360/$Points; + $X = cos($Angle * 3.1418 / 180 ) * $Radius + $XCenter; + $Y = sin($Angle * 3.1418 / 180 ) * $Radius + $YCenter; + + $this->drawLine($XCenter,$YCenter,$X,$Y,$A_R,$A_G,$A_B); + + $XOffset = 0; $YOffset = 0; + if (isset($Data[$i][$DataDescription["Position"]])) + { + $Label = $Data[$i][$DataDescription["Position"]]; + + $Positions = imagettfbbox($this->FontSize,0,$this->FontName,$Label); + $Width = $Positions[2] - $Positions[6]; + $Height = $Positions[3] - $Positions[7]; + + if ( $Angle >= 0 && $Angle <= 90 ) + $YOffset = $Height; + + if ( $Angle > 90 && $Angle <= 180 ) + { $YOffset = $Height; $XOffset = -$Width; } + + if ( $Angle > 180 && $Angle <= 270 ) + { $XOffset = -$Width; } + + imagettftext($this->Picture,$this->FontSize,0,$X+$XOffset,$Y+$YOffset,$C_TextColor,$this->FontName,$Label); + } + } + + /* Write the values */ + for ( $t=1; $t<=$MaxValue; $t++) + { + $TRadius = ( $Radius / $MaxValue ) * $t; + + $Angle = -90 + 360 / $Points; + $X1 = $XCenter; + $Y1 = $YCenter - $TRadius; + $X2 = cos($Angle * 3.1418 / 180 ) * $TRadius + $XCenter; + $Y2 = sin($Angle * 3.1418 / 180 ) * $TRadius + $YCenter; + + $XPos = floor(($X2-$X1)/2) + $X1; + $YPos = floor(($Y2-$Y1)/2) + $Y1; + + $Positions = imagettfbbox($this->FontSize,0,$this->FontName,$t); + $X = $XPos - ( $X+$Positions[2] - $X+$Positions[6] ) / 2; + $Y = $YPos + $this->FontSize; + + $this->drawFilledRoundedRectangle($X+$Positions[6]-2,$Y+$Positions[7]-1,$X+$Positions[2]+4,$Y+$Positions[3]+1,2,240,240,240); + $this->drawRoundedRectangle($X+$Positions[6]-2,$Y+$Positions[7]-1,$X+$Positions[2]+4,$Y+$Positions[3]+1,2,220,220,220); + imagettftext($this->Picture,$this->FontSize,0,$X,$Y,$C_TextColor,$this->FontName,$t); + } + } + + /* This function draw a radar graph centered on the graph area */ + function drawRadar($Data,$DataDescription,$BorderOffset=10,$MaxValue=-1) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawRadar",$DataDescription); + $this->validateData("drawRadar",$Data); + + $Points = count($Data); + $Radius = ( $this->GArea_Y2 - $this->GArea_Y1 ) / 2 - $BorderOffset; + $XCenter = ( $this->GArea_X2 - $this->GArea_X1 ) / 2 + $this->GArea_X1; + $YCenter = ( $this->GArea_Y2 - $this->GArea_Y1 ) / 2 + $this->GArea_Y1; + + /* Search for the max value */ + if ( $MaxValue == -1 ) + { + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName])) + if ( $Data[$Key][$ColName] > $MaxValue ) { $MaxValue = $Data[$Key][$ColName]; } + } + } + } + + $GraphID = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } + + $Angle = -90; + $XLast = -1; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName])) + { + $Value = $Data[$Key][$ColName]; + $Strength = ( $Radius / $MaxValue ) * $Value; + + $XPos = cos($Angle * 3.1418 / 180 ) * $Strength + $XCenter; + $YPos = sin($Angle * 3.1418 / 180 ) * $Strength + $YCenter; + + if ( $XLast != -1 ) + $this->drawLine($XLast,$YLast,$XPos,$YPos,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); + + if ( $XLast == -1 ) + { $FirstX = $XPos; $FirstY = $YPos; } + + $Angle = $Angle + (360/$Points); + $XLast = $XPos; + $YLast = $YPos; + } + } + $this->drawLine($XPos,$YPos,$FirstX,$FirstY,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); + $GraphID++; + } + } + + /* This function draw a radar graph centered on the graph area */ + function drawFilledRadar($Data,$DataDescription,$Alpha=50,$BorderOffset=10,$MaxValue=-1) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawFilledRadar",$DataDescription); + $this->validateData("drawFilledRadar",$Data); + + $Points = count($Data); + $LayerWidth = $this->GArea_X2-$this->GArea_X1; + $LayerHeight = $this->GArea_Y2-$this->GArea_Y1; + $Radius = ( $this->GArea_Y2 - $this->GArea_Y1 ) / 2 - $BorderOffset; + $XCenter = ( $this->GArea_X2 - $this->GArea_X1 ) / 2; + $YCenter = ( $this->GArea_Y2 - $this->GArea_Y1 ) / 2; + + /* Search for the max value */ + if ( $MaxValue == -1 ) + { + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName])) + if ( $Data[$Key][$ColName] > $MaxValue && is_numeric($Data[$Key][$ColName])) { $MaxValue = $Data[$Key][$ColName]; } + } + } + } + + $GraphID = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } + + $Angle = -90; + $XLast = -1; + $Plots = ""; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName])) + { + $Value = $Data[$Key][$ColName]; + if ( !is_numeric($Value) ) { $Value = 0; } + $Strength = ( $Radius / $MaxValue ) * $Value; + + $XPos = cos($Angle * 3.1418 / 180 ) * $Strength + $XCenter; + $YPos = sin($Angle * 3.1418 / 180 ) * $Strength + $YCenter; + + $Plots[] = $XPos; + $Plots[] = $YPos; + + $Angle = $Angle + (360/$Points); + $XLast = $XPos; + $YLast = $YPos; + } + } + + if (isset($Plots[0])) + { + $Plots[] = $Plots[0]; + $Plots[] = $Plots[1]; + + $this->Layers[0] = imagecreatetruecolor($LayerWidth,$LayerHeight); + $C_White = $this->AllocateColor($this->Layers[0],255,255,255); + imagefilledrectangle($this->Layers[0],0,0,$LayerWidth,$LayerHeight,$C_White); + imagecolortransparent($this->Layers[0],$C_White); + + $C_Graph = $this->AllocateColor($this->Layers[0],$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); + imagefilledpolygon($this->Layers[0],$Plots,(count($Plots)+1)/2,$C_Graph); + + imagecopymerge($this->Picture,$this->Layers[0],$this->GArea_X1,$this->GArea_Y1,0,0,$LayerWidth,$LayerHeight,$Alpha); + imagedestroy($this->Layers[0]); + + for($i=0;$i<=count($Plots)-4;$i=$i+2) + $this->drawLine($Plots[$i]+$this->GArea_X1,$Plots[$i+1]+$this->GArea_Y1,$Plots[$i+2]+$this->GArea_X1,$Plots[$i+3]+$this->GArea_Y1,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); + } + + $GraphID++; + } + } + + /* This function draw a flat pie chart */ + function drawBasicPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$R=255,$G=255,$B=255,$Decimals=0) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawBasicPieGraph",$DataDescription,FALSE); + $this->validateData("drawBasicPieGraph",$Data); + + /* Determine pie sum */ + $Series = 0; $PieSum = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + if ( $ColName != $DataDescription["Position"] ) + { + $Series++; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName])) + $PieSum = $PieSum + $Data[$Key][$ColName]; $iValues[] = $Data[$Key][$ColName]; $iLabels[] = $Data[$Key][$DataDescription["Position"]]; + } + } + } + + /* Validate serie */ + if ( $Series != 1 ) + RaiseFatal("Pie chart can only accept one serie of data."); + + $SpliceRatio = 360 / $PieSum; + $SplicePercent = 100 / $PieSum; + + /* Calculate all polygons */ + $Angle = 0; $TopPlots = ""; + foreach($iValues as $Key => $Value) + { + $TopPlots[$Key][] = $XPos; + $TopPlots[$Key][] = $YPos; + + /* Process labels position & size */ + $Caption = ""; + if ( !($DrawLabels == PIE_NOLABEL) ) + { + $TAngle = $Angle+($Value*$SpliceRatio/2); + if ($DrawLabels == PIE_PERCENTAGE) + $Caption = (round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; + elseif ($DrawLabels == PIE_LABELS) + $Caption = $iLabels[$Key]; + elseif ($DrawLabels == PIE_PERCENTAGE_LABEL) + $Caption = $iLabels[$Key]."\r\n".(round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; + elseif ($DrawLabels == PIE_PERCENTAGE_LABEL) + $Caption = $iLabels[$Key]."\r\n".(round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; + + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Caption); + $TextWidth = $Position[2]-$Position[0]; + $TextHeight = abs($Position[1])+abs($Position[3]); + + $TX = cos(($TAngle) * 3.1418 / 180 ) * ($Radius+10) + $XPos; + + if ( $TAngle > 0 && $TAngle < 180 ) + $TY = sin(($TAngle) * 3.1418 / 180 ) * ($Radius+10) + $YPos + 4; + else + $TY = sin(($TAngle) * 3.1418 / 180 ) * ($Radius+4) + $YPos - ($TextHeight/2); + + if ( $TAngle > 90 && $TAngle < 270 ) + $TX = $TX - $TextWidth; + + $C_TextColor = $this->AllocateColor($this->Picture,70,70,70); + imagettftext($this->Picture,$this->FontSize,0,$TX,$TY,$C_TextColor,$this->FontName,$Caption); + } + + /* Process pie slices */ + for($iAngle=$Angle;$iAngle<=$Angle+$Value*$SpliceRatio;$iAngle=$iAngle+.5) + { + $TopX = cos($iAngle * 3.1418 / 180 ) * $Radius + $XPos; + $TopY = sin($iAngle * 3.1418 / 180 ) * $Radius + $YPos; + + $TopPlots[$Key][] = $TopX; + $TopPlots[$Key][] = $TopY; + } + + $TopPlots[$Key][] = $XPos; + $TopPlots[$Key][] = $YPos; + + $Angle = $iAngle; + } + $PolyPlots = $TopPlots; + + /* Set array values type to float --- PHP Bug with imagefilledpolygon casting to integer */ + foreach ($TopPlots as $Key => $Value) + { foreach ($TopPlots[$Key] as $Key2 => $Value2) { settype($TopPlots[$Key][$Key2],"float"); } } + + /* Draw Top polygons */ + foreach ($PolyPlots as $Key => $Value) + { + $C_GraphLo = $this->AllocateColor($this->Picture,$this->Palette[$Key]["R"],$this->Palette[$Key]["G"],$this->Palette[$Key]["B"]); + imagefilledpolygon($this->Picture,$PolyPlots[$Key],(count($PolyPlots[$Key])+1)/2,$C_GraphLo); + } + + $this->drawCircle($XPos-.5,$YPos-.5,$Radius,$R,$G,$B); + $this->drawCircle($XPos-.5,$YPos-.5,$Radius+.5,$R,$G,$B); + + /* Draw Top polygons */ + foreach ($TopPlots as $Key => $Value) + { + for($j=0;$j<=count($TopPlots[$Key])-4;$j=$j+2) + $this->drawLine($TopPlots[$Key][$j],$TopPlots[$Key][$j+1],$TopPlots[$Key][$j+2],$TopPlots[$Key][$j+3],$R,$G,$B); + } + } + + function drawFlatPieGraphWithShadow($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$SpliceDistance=0,$Decimals=0) + { + $this->drawFlatPieGraph($Data,$DataDescription,$XPos+$this->ShadowXDistance,$YPos+$this->ShadowYDistance,$Radius,PIE_NOLABEL,$SpliceDistance,$Decimals,TRUE); + $this->drawFlatPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius,$DrawLabels,$SpliceDistance,$Decimals,FALSE); + } + + /* This function draw a flat pie chart */ + function drawFlatPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$SpliceDistance=0,$Decimals=0,$AllBlack=FALSE) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawFlatPieGraph",$DataDescription,FALSE); + $this->validateData("drawFlatPieGraph",$Data); + + $ShadowStatus = $this->ShadowActive ; $this->ShadowActive = FALSE; + + /* Determine pie sum */ + $Series = 0; $PieSum = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + if ( $ColName != $DataDescription["Position"] ) + { + $Series++; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName])) + $PieSum = $PieSum + $Data[$Key][$ColName]; $iValues[] = $Data[$Key][$ColName]; $iLabels[] = $Data[$Key][$DataDescription["Position"]]; + } + } + } + + /* Validate serie */ + if ( $Series != 1 ) + { + RaiseFatal("Pie chart can only accept one serie of data."); + return(0); + } + + $SpliceRatio = 360 / $PieSum; + $SplicePercent = 100 / $PieSum; + + /* Calculate all polygons */ + $Angle = 0; $TopPlots = ""; + foreach($iValues as $Key => $Value) + { + $XOffset = cos(($Angle+($Value/2*$SpliceRatio)) * 3.1418 / 180 ) * $SpliceDistance; + $YOffset = sin(($Angle+($Value/2*$SpliceRatio)) * 3.1418 / 180 ) * $SpliceDistance; + + $TopPlots[$Key][] = round($XPos + $XOffset); + $TopPlots[$Key][] = round($YPos + $YOffset); + + if ( $AllBlack ) + { $Rc = $this->ShadowRColor; $Gc = $this->ShadowGColor; $Bc = $this->ShadowBColor; } + else + { $Rc = $this->Palette[$Key]["R"]; $Gc = $this->Palette[$Key]["G"]; $Bc = $this->Palette[$Key]["B"]; } + + $XLineLast = ""; $YLineLast = ""; + + /* Process labels position & size */ + $Caption = ""; + if ( !($DrawLabels == PIE_NOLABEL) ) + { + $TAngle = $Angle+($Value*$SpliceRatio/2); + if ($DrawLabels == PIE_PERCENTAGE) + $Caption = (round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; + elseif ($DrawLabels == PIE_LABELS) + $Caption = $iLabels[$Key]; + elseif ($DrawLabels == PIE_PERCENTAGE_LABEL) + $Caption = $iLabels[$Key]."\r\n".(round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; + elseif ($DrawLabels == PIE_PERCENTAGE_LABEL) + $Caption = $iLabels[$Key]."\r\n".(round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; + + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Caption); + $TextWidth = $Position[2]-$Position[0]; + $TextHeight = abs($Position[1])+abs($Position[3]); + + $TX = cos(($TAngle) * 3.1418 / 180 ) * ($Radius+10+$SpliceDistance) + $XPos; + + if ( $TAngle > 0 && $TAngle < 180 ) + $TY = sin(($TAngle) * 3.1418 / 180 ) * ($Radius+10+$SpliceDistance) + $YPos + 4; + else + $TY = sin(($TAngle) * 3.1418 / 180 ) * ($Radius+$SpliceDistance+4) + $YPos - ($TextHeight/2); + + if ( $TAngle > 90 && $TAngle < 270 ) + $TX = $TX - $TextWidth; + + $C_TextColor = $this->AllocateColor($this->Picture,70,70,70); + imagettftext($this->Picture,$this->FontSize,0,$TX,$TY,$C_TextColor,$this->FontName,$Caption); + } + + /* Process pie slices */ + if ( !$AllBlack ) + $LineColor = $this->AllocateColor($this->Picture,$Rc,$Gc,$Bc); + else + $LineColor = $this->AllocateColor($this->Picture,$Rc,$Gc,$Bc); + + $XLineLast = ""; $YLineLast = ""; + for($iAngle=$Angle;$iAngle<=$Angle+$Value*$SpliceRatio;$iAngle=$iAngle+.5) + { + $PosX = cos($iAngle * 3.1418 / 180 ) * $Radius + $XPos + $XOffset; + $PosY = sin($iAngle * 3.1418 / 180 ) * $Radius + $YPos + $YOffset; + + $TopPlots[$Key][] = round($PosX); $TopPlots[$Key][] = round($PosY); + + if ( $iAngle == $Angle || $iAngle == $Angle+$Value*$SpliceRatio || $iAngle +.5 > $Angle+$Value*$SpliceRatio) + $this->drawLine($XPos+$XOffset,$YPos+$YOffset,$PosX,$PosY,$Rc,$Gc,$Bc); + + if ( $XLineLast != "" ) + $this->drawLine($XLineLast,$YLineLast,$PosX,$PosY,$Rc,$Gc,$Bc); + + $XLineLast = $PosX; $YLineLast = $PosY; + } + + $TopPlots[$Key][] = round($XPos + $XOffset); $TopPlots[$Key][] = round($YPos + $YOffset); + + $Angle = $iAngle; + } + $PolyPlots = $TopPlots; + + /* Draw Top polygons */ + foreach ($PolyPlots as $Key => $Value) + { + if ( !$AllBlack ) + $C_GraphLo = $this->AllocateColor($this->Picture,$this->Palette[$Key]["R"],$this->Palette[$Key]["G"],$this->Palette[$Key]["B"]); + else + $C_GraphLo = $this->AllocateColor($this->Picture,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor); + + imagefilledpolygon($this->Picture,$PolyPlots[$Key],(count($PolyPlots[$Key])+1)/2,$C_GraphLo); + } + $this->ShadowActive = $ShadowStatus; + } + + /* This function draw a pseudo-3D pie chart */ + function drawPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$EnhanceColors=TRUE,$Skew=60,$SpliceHeight=20,$SpliceDistance=0,$Decimals=0) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawPieGraph",$DataDescription,FALSE); + $this->validateData("drawPieGraph",$Data); + + /* Determine pie sum */ + $Series = 0; $PieSum = 0; $rPieSum = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + if ( $ColName != $DataDescription["Position"] ) + { + $Series++; + foreach ( $Data as $Key => $Values ) + if ( isset($Data[$Key][$ColName])) + { + if ( $Data[$Key][$ColName] == 0 ) + { $iValues[] = 0; $rValues[] = 0; $iLabels[] = $Data[$Key][$DataDescription["Position"]]; } + // Removed : $PieSum++; $rValues[] = 1; + else + { $PieSum += $Data[$Key][$ColName]; $iValues[] = $Data[$Key][$ColName]; $iLabels[] = $Data[$Key][$DataDescription["Position"]]; $rValues[] = $Data[$Key][$ColName]; $rPieSum += $Data[$Key][$ColName];} + } + } + } + + /* Validate serie */ + if ( $Series != 1 ) + RaiseFatal("Pie chart can only accept one serie of data."); + + $SpliceDistanceRatio = $SpliceDistance; + $SkewHeight = ($Radius * $Skew) / 100; + $SpliceRatio = (360 - $SpliceDistanceRatio * count($iValues) ) / $PieSum; + $SplicePercent = 100 / $PieSum; + $rSplicePercent = 100 / $rPieSum; + + /* Calculate all polygons */ + $Angle = 0; $CDev = 5; + $TopPlots = ""; $BotPlots = ""; + $aTopPlots = ""; $aBotPlots = ""; + foreach($iValues as $Key => $Value) + { + $XCenterPos = cos(($Angle-$CDev+($Value*$SpliceRatio+$SpliceDistanceRatio)/2) * 3.1418 / 180 ) * $SpliceDistance + $XPos; + $YCenterPos = sin(($Angle-$CDev+($Value*$SpliceRatio+$SpliceDistanceRatio)/2) * 3.1418 / 180 ) * $SpliceDistance + $YPos; + $XCenterPos2 = cos(($Angle+$CDev+($Value*$SpliceRatio+$SpliceDistanceRatio)/2) * 3.1418 / 180 ) * $SpliceDistance + $XPos; + $YCenterPos2 = sin(($Angle+$CDev+($Value*$SpliceRatio+$SpliceDistanceRatio)/2) * 3.1418 / 180 ) * $SpliceDistance + $YPos; + + $TopPlots[$Key][] = round($XCenterPos); $BotPlots[$Key][] = round($XCenterPos); + $TopPlots[$Key][] = round($YCenterPos); $BotPlots[$Key][] = round($YCenterPos + $SpliceHeight); + $aTopPlots[$Key][] = $XCenterPos; $aBotPlots[$Key][] = $XCenterPos; + $aTopPlots[$Key][] = $YCenterPos; $aBotPlots[$Key][] = $YCenterPos + $SpliceHeight; + + /* Process labels position & size */ + $Caption = ""; + if ( !($DrawLabels == PIE_NOLABEL) ) + { + $TAngle = $Angle+($Value*$SpliceRatio/2); + if ($DrawLabels == PIE_PERCENTAGE) + $Caption = (round($rValues[$Key] * pow(10,$Decimals) * $rSplicePercent)/pow(10,$Decimals))."%"; + elseif ($DrawLabels == PIE_LABELS) + $Caption = $iLabels[$Key]; + elseif ($DrawLabels == PIE_PERCENTAGE_LABEL) + $Caption = $iLabels[$Key]."\r\n".(round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; + + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Caption); + $TextWidth = $Position[2]-$Position[0]; + $TextHeight = abs($Position[1])+abs($Position[3]); + + $TX = cos(($TAngle) * 3.1418 / 180 ) * ($Radius + 10)+ $XPos; + + if ( $TAngle > 0 && $TAngle < 180 ) + $TY = sin(($TAngle) * 3.1418 / 180 ) * ($SkewHeight + 10) + $YPos + $SpliceHeight + 4; + else + $TY = sin(($TAngle) * 3.1418 / 180 ) * ($SkewHeight + 4) + $YPos - ($TextHeight/2); + + if ( $TAngle > 90 && $TAngle < 270 ) + $TX = $TX - $TextWidth; + + $C_TextColor = $this->AllocateColor($this->Picture,70,70,70); + imagettftext($this->Picture,$this->FontSize,0,$TX,$TY,$C_TextColor,$this->FontName,$Caption); + } + + /* Process pie slices */ + for($iAngle=$Angle;$iAngle<=$Angle+$Value*$SpliceRatio;$iAngle=$iAngle+.5) + { + $TopX = cos($iAngle * 3.1418 / 180 ) * $Radius + $XPos; + $TopY = sin($iAngle * 3.1418 / 180 ) * $SkewHeight + $YPos; + + $TopPlots[$Key][] = round($TopX); $BotPlots[$Key][] = round($TopX); + $TopPlots[$Key][] = round($TopY); $BotPlots[$Key][] = round($TopY + $SpliceHeight); + $aTopPlots[$Key][] = $TopX; $aBotPlots[$Key][] = $TopX; + $aTopPlots[$Key][] = $TopY; $aBotPlots[$Key][] = $TopY + $SpliceHeight; + } + + $TopPlots[$Key][] = round($XCenterPos2); $BotPlots[$Key][] = round($XCenterPos2); + $TopPlots[$Key][] = round($YCenterPos2); $BotPlots[$Key][] = round($YCenterPos2 + $SpliceHeight); + $aTopPlots[$Key][] = $XCenterPos2; $aBotPlots[$Key][] = $XCenterPos2; + $aTopPlots[$Key][] = $YCenterPos2; $aBotPlots[$Key][] = $YCenterPos2 + $SpliceHeight; + + $Angle = $iAngle + $SpliceDistanceRatio; + } + + /* Draw Bottom polygons */ + foreach($iValues as $Key => $Value) + { + $C_GraphLo = $this->AllocateColor($this->Picture,$this->Palette[$Key]["R"],$this->Palette[$Key]["G"],$this->Palette[$Key]["B"],-20); + imagefilledpolygon($this->Picture,$BotPlots[$Key],(count($BotPlots[$Key])+1)/2,$C_GraphLo); + + if ( $EnhanceColors ) { $En = -10; } else { $En = 0; } + + for($j=0;$j<=count($aBotPlots[$Key])-4;$j=$j+2) + $this->drawLine($aBotPlots[$Key][$j],$aBotPlots[$Key][$j+1],$aBotPlots[$Key][$j+2],$aBotPlots[$Key][$j+3],$this->Palette[$Key]["R"]+$En,$this->Palette[$Key]["G"]+$En,$this->Palette[$Key]["B"]+$En); + } + + /* Draw pie layers */ + if ( $EnhanceColors ) { $ColorRatio = 30 / $SpliceHeight; } else { $ColorRatio = 25 / $SpliceHeight; } + for($i=$SpliceHeight-1;$i>=1;$i--) + { + foreach($iValues as $Key => $Value) + { + $C_GraphLo = $this->AllocateColor($this->Picture,$this->Palette[$Key]["R"],$this->Palette[$Key]["G"],$this->Palette[$Key]["B"],-10); + $Plots = ""; $Plot = 0; + foreach($TopPlots[$Key] as $Key2 => $Value2) + { + $Plot++; + if ( $Plot % 2 == 1 ) + $Plots[] = $Value2; + else + $Plots[] = $Value2+$i; + } + imagefilledpolygon($this->Picture,$Plots,(count($Plots)+1)/2,$C_GraphLo); + + $Index = count($Plots); + if ($EnhanceColors ) {$ColorFactor = -20 + ($SpliceHeight - $i) * $ColorRatio; } else { $ColorFactor = 0; } + + $this->drawAntialiasPixel($Plots[0],$Plots[1],$this->Palette[$Key]["R"]+$ColorFactor,$this->Palette[$Key]["G"]+$ColorFactor,$this->Palette[$Key]["B"]+$ColorFactor); + $this->drawAntialiasPixel($Plots[2],$Plots[3],$this->Palette[$Key]["R"]+$ColorFactor,$this->Palette[$Key]["G"]+$ColorFactor,$this->Palette[$Key]["B"]+$ColorFactor); + $this->drawAntialiasPixel($Plots[$Index-4],$Plots[$Index-3],$this->Palette[$Key]["R"]+$ColorFactor,$this->Palette[$Key]["G"]+$ColorFactor,$this->Palette[$Key]["B"]+$ColorFactor); + } + } + + /* Draw Top polygons */ + for($Key=count($iValues)-1;$Key>=0;$Key--) + { + $C_GraphLo = $this->AllocateColor($this->Picture,$this->Palette[$Key]["R"],$this->Palette[$Key]["G"],$this->Palette[$Key]["B"]); + imagefilledpolygon($this->Picture,$TopPlots[$Key],(count($TopPlots[$Key])+1)/2,$C_GraphLo); + + if ( $EnhanceColors ) { $En = 10; } else { $En = 0; } + for($j=0;$j<=count($aTopPlots[$Key])-4;$j=$j+2) + $this->drawLine($aTopPlots[$Key][$j],$aTopPlots[$Key][$j+1],$aTopPlots[$Key][$j+2],$aTopPlots[$Key][$j+3],$this->Palette[$Key]["R"]+$En,$this->Palette[$Key]["G"]+$En,$this->Palette[$Key]["B"]+$En); + } + } + + /* This function can be used to set the background color */ + function drawBackground($R,$G,$B) + { + 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; } + + $C_Background = $this->AllocateColor($this->Picture,$R,$G,$B); + imagefilledrectangle($this->Picture,0,0,$this->XSize,$this->YSize,$C_Background); + } + + /* This function can be used to set the background color */ + function drawGraphAreaGradient($R,$G,$B,$Decay,$Target=TARGET_GRAPHAREA) + { + 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 ( $Target == TARGET_GRAPHAREA ) { $X1 = $this->GArea_X1+1; $X2 = $this->GArea_X2-1; $Y1 = $this->GArea_Y1+1; $Y2 = $this->GArea_Y2; } + if ( $Target == TARGET_BACKGROUND ) { $X1 = 0; $X2 = $this->XSize; $Y1 = 0; $Y2 = $this->YSize; } + + /* Positive gradient */ + if ( $Decay > 0 ) + { + $YStep = ($Y2 - $Y1 - 2) / $Decay; + for($i=0;$i<=$Decay;$i++) + { + $R-=1;$G-=1;$B-=1; + $Yi1 = $Y1 + ( $i * $YStep ); + $Yi2 = ceil( $Yi1 + ( $i * $YStep ) + $YStep ); + if ( $Yi2 >= $Yi2 ) { $Yi2 = $Y2-1; } + + $C_Background = $this->AllocateColor($this->Picture,$R,$G,$B); + imagefilledrectangle($this->Picture,$X1,$Yi1,$X2,$Yi2,$C_Background); + } + } + + /* Negative gradient */ + if ( $Decay < 0 ) + { + $YStep = ($Y2 - $Y1 - 2) / -$Decay; + $Yi1 = $Y1; $Yi2 = $Y1+$YStep; + for($i=-$Decay;$i>=0;$i--) + { + $R+=1;$G+=1;$B+=1; + $C_Background = $this->AllocateColor($this->Picture,$R,$G,$B); + imagefilledrectangle($this->Picture,$X1,$Yi1,$X2,$Yi2,$C_Background); + + $Yi1+= $YStep; + $Yi2+= $YStep; + if ( $Yi2 >= $Yi2 ) { $Yi2 = $Y2-1; } + } + } + } + + /* This function create a rectangle with antialias */ + function drawRectangle($X1,$Y1,$X2,$Y2,$R,$G,$B) + { + 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; } + + $C_Rectangle = $this->AllocateColor($this->Picture,$R,$G,$B); + + $X1=$X1-.2;$Y1=$Y1-.2; + $X2=$X2+.2;$Y2=$Y2+.2; + $this->drawLine($X1,$Y1,$X2,$Y1,$R,$G,$B); + $this->drawLine($X2,$Y1,$X2,$Y2,$R,$G,$B); + $this->drawLine($X2,$Y2,$X1,$Y2,$R,$G,$B); + $this->drawLine($X1,$Y2,$X1,$Y1,$R,$G,$B); + } + + /* This function create a filled rectangle with antialias */ + function drawFilledRectangle($X1,$Y1,$X2,$Y2,$R,$G,$B,$DrawBorder=TRUE,$Alpha=100,$NoFallBack=FALSE) + { + if ( $X2 < $X1 ) { list($X1, $X2) = array($X2, $X1); } + if ( $Y2 < $Y1 ) { list($Y1, $Y2) = array($Y2, $Y1); } + + 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 == 100 ) + { + /* Process shadows */ + if ( $this->ShadowActive && !$NoFallBack ) + { + $this->drawFilledRectangle($X1+$this->ShadowXDistance,$Y1+$this->ShadowYDistance,$X2+$this->ShadowXDistance,$Y2+$this->ShadowYDistance,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor,FALSE,$this->ShadowAlpha,TRUE); + if ( $this->ShadowBlur != 0 ) + { + $AlphaDecay = ($this->ShadowAlpha / $this->ShadowBlur); + + for($i=1; $i<=$this->ShadowBlur; $i++) + $this->drawFilledRectangle($X1+$this->ShadowXDistance-$i/2,$Y1+$this->ShadowYDistance-$i/2,$X2+$this->ShadowXDistance-$i/2,$Y2+$this->ShadowYDistance-$i/2,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor,FALSE,$this->ShadowAlpha-$AlphaDecay*$i,TRUE); + for($i=1; $i<=$this->ShadowBlur; $i++) + $this->drawFilledRectangle($X1+$this->ShadowXDistance+$i/2,$Y1+$this->ShadowYDistance+$i/2,$X2+$this->ShadowXDistance+$i/2,$Y2+$this->ShadowYDistance+$i/2,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor,FALSE,$this->ShadowAlpha-$AlphaDecay*$i,TRUE); + } + } + + $C_Rectangle = $this->AllocateColor($this->Picture,$R,$G,$B); + imagefilledrectangle($this->Picture,round($X1),round($Y1),round($X2),round($Y2),$C_Rectangle); + } + else + { + $LayerWidth = abs($X2-$X1)+2; + $LayerHeight = abs($Y2-$Y1)+2; + + $this->Layers[0] = imagecreatetruecolor($LayerWidth,$LayerHeight); + $C_White = $this->AllocateColor($this->Layers[0],255,255,255); + imagefilledrectangle($this->Layers[0],0,0,$LayerWidth,$LayerHeight,$C_White); + imagecolortransparent($this->Layers[0],$C_White); + + $C_Rectangle = $this->AllocateColor($this->Layers[0],$R,$G,$B); + imagefilledrectangle($this->Layers[0],round(1),round(1),round($LayerWidth-1),round($LayerHeight-1),$C_Rectangle); + + imagecopymerge($this->Picture,$this->Layers[0],round(min($X1,$X2)-1),round(min($Y1,$Y2)-1),0,0,$LayerWidth,$LayerHeight,$Alpha); + imagedestroy($this->Layers[0]); + } + + if ( $DrawBorder ) + { + $ShadowSettings = $this->ShadowActive; $this->ShadowActive = FALSE; + $this->drawRectangle($X1,$Y1,$X2,$Y2,$R,$G,$B); + $this->ShadowActive = $ShadowSettings; + } + } + + /* This function create a rectangle with rounded corners and antialias */ + function drawRoundedRectangle($X1,$Y1,$X2,$Y2,$Radius,$R,$G,$B) + { + 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; } + + $C_Rectangle = $this->AllocateColor($this->Picture,$R,$G,$B); + + $Step = 90 / ((3.1418 * $Radius)/2); + + for($i=0;$i<=90;$i=$i+$Step) + { + $X = cos(($i+180)*3.1418/180) * $Radius + $X1 + $Radius; + $Y = sin(($i+180)*3.1418/180) * $Radius + $Y1 + $Radius; + $this->drawAntialiasPixel($X,$Y,$R,$G,$B); + + $X = cos(($i-90)*3.1418/180) * $Radius + $X2 - $Radius; + $Y = sin(($i-90)*3.1418/180) * $Radius + $Y1 + $Radius; + $this->drawAntialiasPixel($X,$Y,$R,$G,$B); + + $X = cos(($i)*3.1418/180) * $Radius + $X2 - $Radius; + $Y = sin(($i)*3.1418/180) * $Radius + $Y2 - $Radius; + $this->drawAntialiasPixel($X,$Y,$R,$G,$B); + + $X = cos(($i+90)*3.1418/180) * $Radius + $X1 + $Radius; + $Y = sin(($i+90)*3.1418/180) * $Radius + $Y2 - $Radius; + $this->drawAntialiasPixel($X,$Y,$R,$G,$B); + } + + $X1=$X1-.2;$Y1=$Y1-.2; + $X2=$X2+.2;$Y2=$Y2+.2; + $this->drawLine($X1+$Radius,$Y1,$X2-$Radius,$Y1,$R,$G,$B); + $this->drawLine($X2,$Y1+$Radius,$X2,$Y2-$Radius,$R,$G,$B); + $this->drawLine($X2-$Radius,$Y2,$X1+$Radius,$Y2,$R,$G,$B); + $this->drawLine($X1,$Y2-$Radius,$X1,$Y1+$Radius,$R,$G,$B); + } + + /* This function create a filled rectangle with rounded corners and antialias */ + function drawFilledRoundedRectangle($X1,$Y1,$X2,$Y2,$Radius,$R,$G,$B) + { + 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; } + + $C_Rectangle = $this->AllocateColor($this->Picture,$R,$G,$B); + + $Step = 90 / ((3.1418 * $Radius)/2); + + for($i=0;$i<=90;$i=$i+$Step) + { + $Xi1 = cos(($i+180)*3.1418/180) * $Radius + $X1 + $Radius; + $Yi1 = sin(($i+180)*3.1418/180) * $Radius + $Y1 + $Radius; + + $Xi2 = cos(($i-90)*3.1418/180) * $Radius + $X2 - $Radius; + $Yi2 = sin(($i-90)*3.1418/180) * $Radius + $Y1 + $Radius; + + $Xi3 = cos(($i)*3.1418/180) * $Radius + $X2 - $Radius; + $Yi3 = sin(($i)*3.1418/180) * $Radius + $Y2 - $Radius; + + $Xi4 = cos(($i+90)*3.1418/180) * $Radius + $X1 + $Radius; + $Yi4 = sin(($i+90)*3.1418/180) * $Radius + $Y2 - $Radius; + + imageline($this->Picture,$Xi1,$Yi1,$X1+$Radius,$Yi1,$C_Rectangle); + imageline($this->Picture,$X2-$Radius,$Yi2,$Xi2,$Yi2,$C_Rectangle); + imageline($this->Picture,$X2-$Radius,$Yi3,$Xi3,$Yi3,$C_Rectangle); + imageline($this->Picture,$Xi4,$Yi4,$X1+$Radius,$Yi4,$C_Rectangle); + + $this->drawAntialiasPixel($Xi1,$Yi1,$R,$G,$B); + $this->drawAntialiasPixel($Xi2,$Yi2,$R,$G,$B); + $this->drawAntialiasPixel($Xi3,$Yi3,$R,$G,$B); + $this->drawAntialiasPixel($Xi4,$Yi4,$R,$G,$B); + } + + imagefilledrectangle($this->Picture,$X1,$Y1+$Radius,$X2,$Y2-$Radius,$C_Rectangle); + imagefilledrectangle($this->Picture,$X1+$Radius,$Y1,$X2-$Radius,$Y2,$C_Rectangle); + + $X1=$X1-.2;$Y1=$Y1-.2; + $X2=$X2+.2;$Y2=$Y2+.2; + $this->drawLine($X1+$Radius,$Y1,$X2-$Radius,$Y1,$R,$G,$B); + $this->drawLine($X2,$Y1+$Radius,$X2,$Y2-$Radius,$R,$G,$B); + $this->drawLine($X2-$Radius,$Y2,$X1+$Radius,$Y2,$R,$G,$B); + $this->drawLine($X1,$Y2-$Radius,$X1,$Y1+$Radius,$R,$G,$B); + } + + /* This function create a circle with antialias */ + function drawCircle($Xc,$Yc,$Height,$R,$G,$B,$Width=0) + { + 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; } + + $C_Circle = $this->AllocateColor($this->Picture,$R,$G,$B); + $Step = 360 / (2 * 3.1418 * max($Width,$Height)); + + for($i=0;$i<=360;$i=$i+$Step) + { + $X = cos($i*3.1418/180) * $Height + $Xc; + $Y = sin($i*3.1418/180) * $Width + $Yc; + $this->drawAntialiasPixel($X,$Y,$R,$G,$B); + } + } + + /* This function create a filled circle/ellipse with antialias */ + function drawFilledCircle($Xc,$Yc,$Height,$R,$G,$B,$Width=0) + { + 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; } + + $C_Circle = $this->AllocateColor($this->Picture,$R,$G,$B); + $Step = 360 / (2 * 3.1418 * max($Width,$Height)); + + for($i=90;$i<=270;$i=$i+$Step) + { + $X1 = cos($i*3.1418/180) * $Height + $Xc; + $Y1 = sin($i*3.1418/180) * $Width + $Yc; + $X2 = cos((180-$i)*3.1418/180) * $Height + $Xc; + $Y2 = sin((180-$i)*3.1418/180) * $Width + $Yc; + + $this->drawAntialiasPixel($X1-1,$Y1-1,$R,$G,$B); + $this->drawAntialiasPixel($X2-1,$Y2-1,$R,$G,$B); + + if ( ($Y1-1) > $Yc - max($Width,$Height) ) + imageline($this->Picture,$X1,$Y1-1,$X2-1,$Y2-1,$C_Circle); + } + } + + /* This function will draw a filled ellipse */ + function drawEllipse($Xc,$Yc,$Height,$Width,$R,$G,$B) + { $this->drawCircle($Xc,$Yc,$Height,$R,$G,$B,$Width); } + + /* This function will draw an ellipse */ + function drawFilledEllipse($Xc,$Yc,$Height,$Width,$R,$G,$B) + { $this->drawFilledCircle($Xc,$Yc,$Height,$R,$G,$B,$Width); } + + /* This function create a line with antialias */ + function drawLine($X1,$Y1,$X2,$Y2,$R,$G,$B,$GraphFunction=FALSE) + { + if ( $this->LineDotSize > 1 ) { $this->drawDottedLine($X1,$Y1,$X2,$Y2,$this->LineDotSize,$R,$G,$B,$GraphFunction); return(0); } + 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; } + + $Distance = sqrt(($X2-$X1)*($X2-$X1)+($Y2-$Y1)*($Y2-$Y1)); + if ( $Distance == 0 ) + 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 ( ($X >= $this->GArea_X1 && $X <= $this->GArea_X2 && $Y >= $this->GArea_Y1 && $Y <= $this->GArea_Y2) || !$GraphFunction ) + { + if ( $this->LineWidth == 1 ) + $this->drawAntialiasPixel($X,$Y,$R,$G,$B); + else + { + $StartOffset = -($this->LineWidth/2); $EndOffset = ($this->LineWidth/2); + for($j=$StartOffset;$j<=$EndOffset;$j++) + $this->drawAntialiasPixel($X+$j,$Y+$j,$R,$G,$B); + } + } + } + } + + /* This function create a line with antialias */ + function drawDottedLine($X1,$Y1,$X2,$Y2,$DotSize,$R,$G,$B,$GraphFunction=FALSE) + { + 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; } + + $Distance = sqrt(($X2-$X1)*($X2-$X1)+($Y2-$Y1)*($Y2-$Y1)); + + $XStep = ($X2-$X1) / $Distance; + $YStep = ($Y2-$Y1) / $Distance; + + $DotIndex = 0; + for($i=0;$i<=$Distance;$i++) + { + $X = $i * $XStep + $X1; + $Y = $i * $YStep + $Y1; + + if ( $DotIndex <= $DotSize) + { + if ( ($X >= $this->GArea_X1 && $X <= $this->GArea_X2 && $Y >= $this->GArea_Y1 && $Y <= $this->GArea_Y2) || !$GraphFunction ) + { + if ( $this->LineWidth == 1 ) + $this->drawAntialiasPixel($X,$Y,$R,$G,$B); + else + { + $StartOffset = -($this->LineWidth/2); $EndOffset = ($this->LineWidth/2); + for($j=$StartOffset;$j<=$EndOffset;$j++) + $this->drawAntialiasPixel($X+$j,$Y+$j,$R,$G,$B); + } + } + } + + $DotIndex++; + if ( $DotIndex == $DotSize * 2 ) + $DotIndex = 0; + } + } + + /* Load a PNG file and draw it over the chart */ + function drawFromPNG($FileName,$X,$Y,$Alpha=100) + { $this->drawFromPicture(1,$FileName,$X,$Y,$Alpha); } + + /* Load a GIF file and draw it over the chart */ + function drawFromGIF($FileName,$X,$Y,$Alpha=100) + { $this->drawFromPicture(2,$FileName,$X,$Y,$Alpha); } + + /* Load a JPEG file and draw it over the chart */ + function drawFromJPG($FileName,$X,$Y,$Alpha=100) + { $this->drawFromPicture(3,$FileName,$X,$Y,$Alpha); } + + /* Generic loader function for external pictures */ + function drawFromPicture($PicType,$FileName,$X,$Y,$Alpha=100) + { + if ( file_exists($FileName)) + { + $Infos = getimagesize($FileName); + $Width = $Infos[0]; + $Height = $Infos[1]; + if ( $PicType == 1 ) { $Raster = imagecreatefrompng($FileName); } + if ( $PicType == 2 ) { $Raster = imagecreatefromgif($FileName); } + if ( $PicType == 3 ) { $Raster = imagecreatefromjpeg($FileName); } + + imagecopymerge($this->Picture,$Raster,$X,$Y,0,0,$Width,$Height,$Alpha); + imagedestroy($Raster); + } + } + + /* Draw an alpha pixel */ + function drawAlphaPixel($X,$Y,$Alpha,$R,$G,$B) + { + 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 ( $X < 0 || $Y < 0 || $X >= $this->XSize || $Y >= $this->YSize ) + return(-1); + + $RGB2 = imagecolorat($this->Picture, $X, $Y); + $R2 = ($RGB2 >> 16) & 0xFF; + $G2 = ($RGB2 >> 8) & 0xFF; + $B2 = $RGB2 & 0xFF; + + $iAlpha = (100 - $Alpha)/100; + $Alpha = $Alpha / 100; + + $Ra = floor($R*$Alpha+$R2*$iAlpha); + $Ga = floor($G*$Alpha+$G2*$iAlpha); + $Ba = floor($B*$Alpha+$B2*$iAlpha); + + $C_Aliased = $this->AllocateColor($this->Picture,$Ra,$Ga,$Ba); + imagesetpixel($this->Picture,$X,$Y,$C_Aliased); + } + + /* Color helper */ + function AllocateColor($Picture,$R,$G,$B,$Factor=0) + { + $R = $R + $Factor; + $G = $G + $Factor; + $B = $B + $Factor; + 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; } + + return(imagecolorallocate($Picture,$R,$G,$B)); + } + + /* Add a border to the picture */ + function addBorder($Size=3,$R=0,$G=0,$B=0) + { + $Width = $this->XSize+2*$Size; + $Height = $this->YSize+2*$Size; + + $Resampled = imagecreatetruecolor($Width,$Height); + $C_Background = $this->AllocateColor($Resampled,$R,$G,$B); + imagefilledrectangle($Resampled,0,0,$Width,$Height,$C_Background); + + imagecopy($Resampled,$this->Picture,$Size,$Size,0,0,$this->XSize,$this->YSize); + imagedestroy($this->Picture); + + $this->XSize = $Width; + $this->YSize = $Height; + + $this->Picture = imagecreatetruecolor($this->XSize,$this->YSize); + $C_White = $this->AllocateColor($this->Picture,255,255,255); + imagefilledrectangle($this->Picture,0,0,$this->XSize,$this->YSize,$C_White); + imagecolortransparent($this->Picture,$C_White); + imagecopy($this->Picture,$Resampled,0,0,0,0,$this->XSize,$this->YSize); + } + + /* Render the current picture to a file */ + function Render($FileName) + { + if ( $this->ErrorReporting ) + $this->printErrors($this->ErrorInterface); + + /* Save image map if requested */ + if ( $this->BuildMap ) + $this->SaveImageMap(); + + imagepng($this->Picture,$FileName); + } + + /* Render the current picture to STDOUT */ + function Stroke() + { + if ( $this->ErrorReporting ) + $this->printErrors("GD"); + + /* Save image map if requested */ + if ( $this->BuildMap ) + $this->SaveImageMap(); + + header('Content-type: image/png'); + imagepng($this->Picture); + } + + /* Private functions for internal processing */ + function drawAntialiasPixel($X,$Y,$R,$G,$B,$Alpha=100,$NoFallBack=FALSE) + { + /* Process shadows */ + if ( $this->ShadowActive && !$NoFallBack ) + { + $this->drawAntialiasPixel($X+$this->ShadowXDistance,$Y+$this->ShadowYDistance,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor,$this->ShadowAlpha,TRUE); + if ( $this->ShadowBlur != 0 ) + { + $AlphaDecay = ($this->ShadowAlpha / $this->ShadowBlur); + + for($i=1; $i<=$this->ShadowBlur; $i++) + $this->drawAntialiasPixel($X+$this->ShadowXDistance-$i/2,$Y+$this->ShadowYDistance-$i/2,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor,$this->ShadowAlpha-$AlphaDecay*$i,TRUE); + for($i=1; $i<=$this->ShadowBlur; $i++) + $this->drawAntialiasPixel($X+$this->ShadowXDistance+$i/2,$Y+$this->ShadowYDistance+$i/2,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor,$this->ShadowAlpha-$AlphaDecay*$i,TRUE); + } + } + + 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; } + + $Plot = ""; + $Xi = floor($X); + $Yi = floor($Y); + + if ( $Xi == $X && $Yi == $Y) + { + if ( $Alpha == 100 ) + { + $C_Aliased = $this->AllocateColor($this->Picture,$R,$G,$B); + imagesetpixel($this->Picture,$X,$Y,$C_Aliased); + } + 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); } + } + } + + /* Validate data contained in the description array */ + function validateDataDescription($FunctionName,&$DataDescription,$DescriptionRequired=TRUE) + { + if (!isset($DataDescription["Position"])) + { + $this->Errors[] = "[Warning] ".$FunctionName." - Y Labels are not set."; + $DataDescription["Position"] = "Name"; + } + + if ( $DescriptionRequired ) + { + if (!isset($DataDescription["Description"])) + { + $this->Errors[] = "[Warning] ".$FunctionName." - Series descriptions are not set."; + foreach($DataDescription["Values"] as $key => $Value) + { + $DataDescription["Description"][$Value] = $Value; + } + } + + if (count($DataDescription["Description"]) < count($DataDescription["Values"])) + { + $this->Errors[] = "[Warning] ".$FunctionName." - Some series descriptions are not set."; + foreach($DataDescription["Values"] as $key => $Value) + { + if ( !isset($DataDescription["Description"][$Value])) + $DataDescription["Description"][$Value] = $Value; + } + } + } + } + + /* Validate data contained in the data array */ + function validateData($FunctionName,&$Data) + { + $DataSummary = array(); + + foreach($Data as $key => $Values) + { + foreach($Values as $key2 => $Value) + { + if (!isset($DataSummary[$key2])) + $DataSummary[$key2] = 1; + else + $DataSummary[$key2]++; + } + } + + if ( max($DataSummary) == 0 ) + $this->Errors[] = "[Warning] ".$FunctionName." - No data set."; + + foreach($DataSummary as $key => $Value) + { + if ($Value < max($DataSummary)) + { + $this->Errors[] = "[Warning] ".$FunctionName." - Missing data in serie ".$key."."; + } + } + } + + /* Print all error messages on the CLI or graphically */ + function printErrors($Mode="CLI") + { + if (count($this->Errors) == 0) + return(0); + + if ( $Mode == "CLI" ) + { + foreach($this->Errors as $key => $Value) + echo $Value."\r\n"; + } + elseif ( $Mode == "GD" ) + { + $this->setLineStyle($Width=1); + $MaxWidth = 0; + foreach($this->Errors as $key => $Value) + { + $Position = imageftbbox($this->ErrorFontSize,0,$this->ErrorFontName,$Value); + $TextWidth = $Position[2]-$Position[0]; + if ( $TextWidth > $MaxWidth ) { $MaxWidth = $TextWidth; } + } + $this->drawFilledRoundedRectangle($this->XSize-($MaxWidth+20),$this->YSize-(20+(($this->ErrorFontSize+4)*count($this->Errors))),$this->XSize-10,$this->YSize-10,6,233,185,185); + $this->drawRoundedRectangle($this->XSize-($MaxWidth+20),$this->YSize-(20+(($this->ErrorFontSize+4)*count($this->Errors))),$this->XSize-10,$this->YSize-10,6,193,145,145); + + $C_TextColor = $this->AllocateColor($this->Picture,133,85,85); + $YPos = $this->YSize - (18 + (count($this->Errors)-1) * ($this->ErrorFontSize + 4)); + foreach($this->Errors as $key => $Value) + { + imagettftext($this->Picture,$this->ErrorFontSize,0,$this->XSize-($MaxWidth+15),$YPos,$C_TextColor,$this->ErrorFontName,$Value); + $YPos = $YPos + ($this->ErrorFontSize + 4); + } + } + } + + /* Activate the image map creation process */ + function setImageMap($Mode=TRUE,$GraphID="MyGraph") + { + $this->BuildMap = $Mode; + $this->MapID = $GraphID; + } + + /* Add a box into the image map */ + function addToImageMap($X1,$Y1,$X2,$Y2,$SerieName,$Value,$CallerFunction) + { + if ( $this->MapFunction == NULL || $this->MapFunction == $CallerFunction ) + { + $this->ImageMap[] = round($X1).",".round($Y1).",".round($X2).",".round($Y2).",".$SerieName.",".$Value; + $this->MapFunction = $CallerFunction; + } + } + + /* Load and cleanup the image map from disk */ + function getImageMap($MapName,$Flush=TRUE) + { + /* Strip HTML query strings */ + $Values = $this->tmpFolder.$MapName; + $Value = split("\?",$Values); + $FileName = $Value[0]; + + if ( file_exists($FileName) ) + { + $Handle = fopen($FileName, "r"); + $MapContent = fread($Handle, filesize($FileName)); + fclose($Handle); + echo $MapContent; + + if ( $Flush ) + unlink($FileName); + + exit(); + } + else + { + header("HTTP/1.0 404 Not Found"); + exit(); + } + } + + /* Save the image map to the disk */ + function SaveImageMap() + { + if ( !$this->BuildMap ) { return(-1); } + + if ( $this->ImageMap == NULL ) + { + $this->Errors[] = "[Warning] SaveImageMap - Image map is empty."; + return(-1); + } + + $Handle = fopen($this->tmpFolder.$this->MapID, 'w'); + if ( !$Handle ) + { + $this->Errors[] = "[Warning] SaveImageMap - Cannot save the image map."; + return(-1); + } + else + { + foreach($this->ImageMap as $Key => $Value) + fwrite($Handle, htmlentities($Value)."\r"); + } + fclose ($Handle); + } + + /* Convert seconds to a time format string */ + function ToTime($Value) + { + $Hour = floor($Value/3600); + $Minute = floor(($Value - $Hour*3600)/60); + $Second = floor($Value - $Hour*3600 - $Minute*60); + + if (strlen($Hour) == 1 ) { $Hour = "0".$Hour; } + if (strlen($Minute) == 1 ) { $Minute = "0".$Minute; } + if (strlen($Second) == 1 ) { $Second = "0".$Second; } + + return($Hour.":".$Minute.":".$Second); + } + + /* Convert to metric system */ + function ToMetric($Value) + { + $Go = floor($Value/1000000000); + $Mo = floor(($Value - $Go*1000000000)/1000000); + $Ko = floor(($Value - $Go*1000000000 - $Mo*1000000)/1000); + $o = floor($Value - $Go*1000000000 - $Mo*1000000 - $Ko*1000); + + if ($Go != 0) { return($Go.".".$Mo."g"); } + if ($Mo != 0) { return($Mo.".".$ko."m"); } + if ($Ko != 0) { return($Ko.".".$o)."k"; } + return($o); + } + + /* Convert to curency */ + function ToCurrency($Value) + { + $Go = floor($Value/1000000000); + $Mo = floor(($Value - $Go*1000000000)/1000000); + $Ko = floor(($Value - $Go*1000000000 - $Mo*1000000)/1000); + $o = floor($Value - $Go*1000000000 - $Mo*1000000 - $Ko*1000); + + if ( strlen($o) == 1 ) { $o = "00".$o; } + if ( strlen($o) == 2 ) { $o = "0".$o; } + + $ResultString = $o; + if ( $Ko != 0 ) { $ResultString = $Ko.".".$ResultString; } + if ( $Mo != 0 ) { $ResultString = $Mo.".".$ResultString; } + if ( $Go != 0 ) { $ResultString = $Go.".".$ResultString; } + + $ResultString = $this->Currency.$ResultString; + return($ResultString); + } + + /* Set date format for axis labels */ + function setDateFormat($Format) + { + $this->DateFormat = $Format; + } + + /* Convert TS to a date format string */ + function ToDate($Value) + { + return(date($this->DateFormat,$Value)); + } + + /* Check if a number is a full integer (for scaling) */ + function isRealInt($Value) + { + if ($Value == floor($Value)) + return(TRUE); + return(FALSE); + } + } + + function RaiseFatal($Message) + { + echo "[FATAL] ".$Message."\r\n"; + exit(); + } +?> \ No newline at end of file diff --git a/libraries/chart/pChart/pData.class b/libraries/chart/pChart/pData.class new file mode 100644 index 000000000..49d2fcc56 --- /dev/null +++ b/libraries/chart/pChart/pData.class @@ -0,0 +1,260 @@ +. + + Class initialisation : + pData() + Data populating methods : + ImportFromCSV($FileName,$Delimiter=",",$DataColumns=-1,$HasHeader=FALSE,$DataName=-1) + AddPoint($Value,$Serie="Serie1",$Description="") + Series manipulation methods : + AddSerie($SerieName="Serie1") + AddAllSeries() + RemoveSerie($SerieName="Serie1") + SetAbsciseLabelSerie($SerieName = "Name") + SetSerieName($Name,$SerieName="Serie1") + + SetSerieSymbol($Name,$Symbol) + SetXAxisName($Name="X Axis") + SetYAxisName($Name="Y Axis") + SetXAxisFormat($Format="number") + SetYAxisFormat($Format="number") + SetXAxisUnit($Unit="") + SetYAxisUnit($Unit="") + removeSerieName($SerieName) + removeAllSeries() + Data retrieval methods : + GetData() + GetDataDescription() + */ + + /* pData class definition */ + class pData + { + var $Data; + var $DataDescription; + + function pData() + { + $this->Data = ""; + $this->DataDescription = ""; + $this->DataDescription["Position"] = "Name"; + $this->DataDescription["Format"]["X"] = "number"; + $this->DataDescription["Format"]["Y"] = "number"; + $this->DataDescription["Unit"]["X"] = NULL; + $this->DataDescription["Unit"]["Y"] = NULL; + } + + function ImportFromCSV($FileName,$Delimiter=",",$DataColumns=-1,$HasHeader=FALSE,$DataName=-1) + { + $handle = @fopen($FileName,"r"); + if ($handle) + { + $HeaderParsed = FALSE; + while (!feof($handle)) + { + $buffer = fgets($handle, 4096); + $buffer = str_replace(chr(10),"",$buffer); + $buffer = str_replace(chr(13),"",$buffer); + $Values = split($Delimiter,$buffer); + + if ( $buffer != "" ) + { + if ( $HasHeader == TRUE && $HeaderParsed == FALSE ) + { + if ( $DataColumns == -1 ) + { + $ID = 1; + foreach($Values as $key => $Value) + { $this->SetSerieName($Value,"Serie".$ID); $ID++; } + } + else + { + $SerieName = ""; + + foreach($DataColumns as $key => $Value) + $this->SetSerieName($Values[$Value],"Serie".$Value); + } + $HeaderParsed = TRUE; + } + else + { + if ( $DataColumns == -1 ) + { + $ID = 1; + foreach($Values as $key => $Value) + { $this->AddPoint(intval($Value),"Serie".$ID); $ID++; } + } + else + { + $SerieName = ""; + if ( $DataName != -1 ) + $SerieName = $Values[$DataName]; + + foreach($DataColumns as $key => $Value) + $this->AddPoint($Values[$Value],"Serie".$Value,$SerieName); + } + } + } + } + fclose($handle); + } + } + + function AddPoint($Value,$Serie="Serie1",$Description="") + { + if (is_array($Value) && count($Value) == 1) + $Value = $Value[0]; + + $ID = 0; + for($i=0;$i<=count($this->Data);$i++) + { if(isset($this->Data[$i][$Serie])) { $ID = $i+1; } } + + if ( count($Value) == 1 ) + { + $this->Data[$ID][$Serie] = $Value; + if ( $Description != "" ) + $this->Data[$ID]["Name"] = $Description; + elseif (!isset($this->Data[$ID]["Name"])) + $this->Data[$ID]["Name"] = $ID; + } + else + { + foreach($Value as $key => $Val) + { + $this->Data[$ID][$Serie] = $Val; + if (!isset($this->Data[$ID]["Name"])) + $this->Data[$ID]["Name"] = $ID; + $ID++; + } + } + } + + function AddSerie($SerieName="Serie1") + { + if ( !isset($this->DataDescription["Values"]) ) + { + $this->DataDescription["Values"][] = $SerieName; + } + else + { + $Found = FALSE; + foreach($this->DataDescription["Values"] as $key => $Value ) + if ( $Value == $SerieName ) { $Found = TRUE; } + + if ( !$Found ) + $this->DataDescription["Values"][] = $SerieName; + } + } + + function AddAllSeries() + { + unset($this->DataDescription["Values"]); + + if ( isset($this->Data[0]) ) + { + foreach($this->Data[0] as $Key => $Value) + { + if ( $Key != "Name" ) + $this->DataDescription["Values"][] = $Key; + } + } + } + + function RemoveSerie($SerieName="Serie1") + { + if ( !isset($this->DataDescription["Values"]) ) + return(0); + + $Found = FALSE; + foreach($this->DataDescription["Values"] as $key => $Value ) + { + if ( $Value == $SerieName ) + unset($this->DataDescription["Values"][$key]); + } + } + + function SetAbsciseLabelSerie($SerieName = "Name") + { + $this->DataDescription["Position"] = $SerieName; + } + + function SetSerieName($Name,$SerieName="Serie1") + { + $this->DataDescription["Description"][$SerieName] = $Name; + } + + function SetXAxisName($Name="X Axis") + { + $this->DataDescription["Axis"]["X"] = $Name; + } + + function SetYAxisName($Name="Y Axis") + { + $this->DataDescription["Axis"]["Y"] = $Name; + } + + function SetXAxisFormat($Format="number") + { + $this->DataDescription["Format"]["X"] = $Format; + } + + function SetYAxisFormat($Format="number") + { + $this->DataDescription["Format"]["Y"] = $Format; + } + + function SetXAxisUnit($Unit="") + { + $this->DataDescription["Unit"]["X"] = $Unit; + } + + function SetYAxisUnit($Unit="") + { + $this->DataDescription["Unit"]["Y"] = $Unit; + } + + function SetSerieSymbol($Name,$Symbol) + { + $this->DataDescription["Symbol"][$Name] = $Symbol; + } + + function removeSerieName($SerieName) + { + if ( isset($this->DataDescription["Description"][$SerieName]) ) + unset($this->DataDescription["Description"][$SerieName]); + } + + function removeAllSeries() + { + foreach($this->DataDescription["Values"] as $Key => $Value) + unset($this->DataDescription["Values"][$Key]); + } + + function GetData() + { + return($this->Data); + } + + function GetDataDescription() + { + return($this->DataDescription); + } + } +?> \ No newline at end of file diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php new file mode 100644 index 000000000..fbf1a1c69 --- /dev/null +++ b/libraries/chart/pma_pchart_chart.php @@ -0,0 +1,25 @@ +imageEncoded.'" />'; + } +} + +?> diff --git a/libraries/chart/pma_pchart_pie.php b/libraries/chart/pma_pchart_pie.php new file mode 100644 index 000000000..f2b305708 --- /dev/null +++ b/libraries/chart/pma_pchart_pie.php @@ -0,0 +1,68 @@ +AddPoint(array_values($data),"Serie1"); + $DataSet->AddPoint(array_keys($data),"Serie2"); + $DataSet->AddAllSeries(); + $DataSet->SetAbsciseLabelSerie("Serie2"); + + // Initialise the graph + $Test = new pChart($this->width, $this->height); + foreach ($this->colors as $key => $color) { + $Test->setColorPalette( + $key, + hexdec(substr($color, 1, 2)), + hexdec(substr($color, 3, 2)), + hexdec(substr($color, 5, 2)) + ); + } + $Test->setFontProperties($this->fontPath.'tahoma.ttf', 8); + $Test->drawFilledRoundedRectangle( + $this->border1Width, + $this->border1Width, + $this->width - $this->border1Width, + $this->height - $this->border1Width, + 5,240,240,240); + $Test->drawRoundedRectangle( + $this->border1Width, + $this->border1Width, + $this->width - $this->border1Width, + $this->height - $this->border1Width, + 5,230,230,230); + + // Draw the pie chart + $Test->AntialiasQuality = 0; + $Test->setShadowProperties(2,2,200,200,200); + //$Test->drawFlatPieGraphWithShadow($DataSet->GetData(),$DataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,8); + //$Test->drawBasicPieGraph($DataSet->GetData(),$DataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,255,255,218,2); + $Test->drawPieGraph($DataSet->GetData(),$DataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,FALSE,60,30,10,1); + $Test->clearShadow(); + + $Test->drawTitle(10,20,$titleText,0,0,0); + $Test->drawPieLegend(340,15,$DataSet->GetData(),$DataSet->GetDataDescription(),250,250,250); + + ob_start(); + imagepng($Test->Picture); + $output = ob_get_contents(); + ob_end_clean(); + + $this->imageEncoded = base64_encode($output); + } +} + +?> From 7074f1b90ee7e9afe694caa6b9550679fbf52ad5 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Thu, 17 Jun 2010 16:01:56 +0300 Subject: [PATCH 08/80] color changes to make them more distinguishable --- libraries/chart/pma_chart.php | 40 ++++++++++++++++--------------- libraries/chart/pma_ofc_chart.php | 8 +++---- libraries/chart/pma_ofc_pie.php | 8 +++---- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/libraries/chart/pma_chart.php b/libraries/chart/pma_chart.php index a1d798070..0288b5d3a 100644 --- a/libraries/chart/pma_chart.php +++ b/libraries/chart/pma_chart.php @@ -9,24 +9,26 @@ class PMA_Chart /* * Colors for the different slices in the pie chart. - */ + */ protected $colors = array( - '#70484A', - '#705948', - '#6D4870', - '#70485E', - '#485E70', - '#484A70', - '#487059', - '#48706D', - '#594870', - '#5E7048', - '#839CAF', - '#95775F', - '#5F7E95', - '#706D48', - '#4A7048', - '#AF9683', + '#BCE02E', + '#E0642E', + '#E0D62E', + '#2E97E0', + '#B02EE0', + '#E02E75', + '#5CE02E', + '#E0B02E', + '#000000', + '#0022E0', + '#726CB1', + '#481A36', + '#BAC658', + '#127224', + '#825119', + '#238C74', + '#4C489B', + '#1D674A', ); /* @@ -44,9 +46,9 @@ class PMA_Chart */ protected $height = 250; - function __construct() + function __construct($options = null) { - + $this->handleOptions($options); } /* diff --git a/libraries/chart/pma_ofc_chart.php b/libraries/chart/pma_ofc_chart.php index c04bb2068..eb75e7126 100644 --- a/libraries/chart/pma_ofc_chart.php +++ b/libraries/chart/pma_ofc_chart.php @@ -1,6 +1,6 @@ handleOptions($options); - - include './libraries/chart/ofc/open-flash-chart.php'; + require_once './libraries/chart/ofc/open-flash-chart.php'; // create and style chart title $title = new title($titleText); From d1708970d6e5f407adf2a18a8dfe6c5720773efe Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Thu, 17 Jun 2010 17:10:19 +0300 Subject: [PATCH 09/80] moved chart dependant code to the chart lib. --- libraries/chart.lib.php | 44 +++++++++++++++++++++++++++++++++++++--- libraries/common.lib.php | 32 ++--------------------------- server_status.php | 8 +------- 3 files changed, 44 insertions(+), 40 deletions(-) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index bf3b2c699..5b779c3b1 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -1,4 +1,8 @@ $dataValue) { + $key = ucwords(str_replace(array('Com_', '_'), array('', ' '), $dataKey)); + $value = (int)$dataValue; + $chartData[$key] = $value; + } + + //$chart = new PMA_OFC_Pie(__('Query type'), $chartData, $options); + $chart = new PMA_pChart_Pie(__('Query type'), $chartData); + echo $chart->toString(); +} - $chart = new PMA_OFC_Pie($titleText, $data, $options); +/* + * Formats a chart for profiling page. + */ +function PMA_chart_profiling($data) +{ + $chartData = array(); + foreach($data as $dataValue) { + $value = (int)($dataValue['Duration']*1000000); + $key = ucwords($dataValue['Status']); + $chartData[$key] = $value; + } + + $chart = new PMA_pChart_Pie( + __('Query execution time comparison (in microseconds)'), + $chartData, + array( + 'bgColor' => '#e5e5e5', + 'width' => 500, + 'height' => 325, + ) + ); echo $chart->toString(); } diff --git a/libraries/common.lib.php b/libraries/common.lib.php index 8002bcb48..2b471934c 100644 --- a/libraries/common.lib.php +++ b/libraries/common.lib.php @@ -1363,43 +1363,15 @@ function PMA_profilingResults($profiling_results, $show_chart = false) echo '

'; if ($show_chart) { + require_once './libraries/chart.lib.php'; echo '
'; - PMA_profilingResultsChart($profiling_results); + PMA_chart_profiling($profiling_results); echo '
'; } echo '' . "\n"; } -/** - * Displays the results of SHOW PROFILE as a chart - * - * @param array the results - * @access public - * - */ -function PMA_profilingResultsChart($profiling_results) -{ - require_once './libraries/chart.lib.php'; - - $chart_data = array(); - foreach($profiling_results as $one_result) { - $value = (int)($one_result['Duration']*1000000); - $key = ucwords($one_result['Status']); - $chart_data[$key] = $value; - } - - echo PMA_chart_pie( - __('Query execution time comparison (in microseconds)'), - $chart_data, - array( - 'bgColor' => '#e5e5e5', - 'width' => 500, - 'height' => 300, - ) - ); -} - /** * Formats $value to byte view * diff --git a/server_status.php b/server_status.php index d82fc1963..3869cbbdf 100644 --- a/server_status.php +++ b/server_status.php @@ -592,13 +592,7 @@ foreach ($used_queries as $name => $value) {
$value) { - $key = str_replace(array('Com_', '_'), array('', ' '), $key); - $chart_data[ucwords($key)] = (int)$value; - } - echo PMA_chart_pie(__('Query type'), $chart_data); + echo PMA_chart_status($used_queries); ?>
From c152e0dd3e5776fe5ae6fe7f0543d07e48822aa7 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Thu, 17 Jun 2010 17:14:04 +0300 Subject: [PATCH 10/80] modified status chart size. --- libraries/chart.lib.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index 5b779c3b1..b653f9883 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -25,7 +25,13 @@ function PMA_chart_status($data) } //$chart = new PMA_OFC_Pie(__('Query type'), $chartData, $options); - $chart = new PMA_pChart_Pie(__('Query type'), $chartData); + $chart = new PMA_pChart_Pie( + __('Query statistics'), + $chartData, + array( + 'width' => 500, + 'height' => 325, + )); echo $chart->toString(); } From 13c2a8cd24b333e31f6a3d9a688c1c61c851b479 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Thu, 17 Jun 2010 17:39:32 +0300 Subject: [PATCH 11/80] fixed default sizes and colors. Fixed some var names. --- libraries/chart.lib.php | 14 ++-------- libraries/chart/pma_chart.php | 11 +++++--- libraries/chart/pma_pchart_pie.php | 42 ++++++++++++++++-------------- 3 files changed, 33 insertions(+), 34 deletions(-) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index b653f9883..cb48945a9 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -27,11 +27,7 @@ function PMA_chart_status($data) //$chart = new PMA_OFC_Pie(__('Query type'), $chartData, $options); $chart = new PMA_pChart_Pie( __('Query statistics'), - $chartData, - array( - 'width' => 500, - 'height' => 325, - )); + $chartData); echo $chart->toString(); } @@ -49,13 +45,7 @@ function PMA_chart_profiling($data) $chart = new PMA_pChart_Pie( __('Query execution time comparison (in microseconds)'), - $chartData, - array( - 'bgColor' => '#e5e5e5', - 'width' => 500, - 'height' => 325, - ) - ); + $chartData); echo $chart->toString(); } diff --git a/libraries/chart/pma_chart.php b/libraries/chart/pma_chart.php index 0288b5d3a..e5b9fdeee 100644 --- a/libraries/chart/pma_chart.php +++ b/libraries/chart/pma_chart.php @@ -34,17 +34,17 @@ class PMA_Chart /* * Chart background color. */ - protected $bgColor = '#f5f5f5'; + protected $bgColor = '#E5E5E5'; /* * The width of the chart. */ - protected $width = 400; + protected $width = 500; /* * The height of the chart. */ - protected $height = 250; + protected $height = 325; function __construct($options = null) { @@ -70,6 +70,11 @@ class PMA_Chart if (isset($options['height'])) $this->height = $options['height']; } + + function getBgColorComp($component) + { + return hexdec(substr($this->bgColor, ($component * 2) + 1, 2)); + } } ?> diff --git a/libraries/chart/pma_pchart_pie.php b/libraries/chart/pma_pchart_pie.php index f2b305708..4bf886fa2 100644 --- a/libraries/chart/pma_pchart_pie.php +++ b/libraries/chart/pma_pchart_pie.php @@ -15,49 +15,53 @@ class PMA_pChart_Pie extends PMA_pChart_Chart require_once './libraries/chart/pChart/pChart.class'; // Dataset definition - $DataSet = new pData; - $DataSet->AddPoint(array_values($data),"Serie1"); - $DataSet->AddPoint(array_keys($data),"Serie2"); - $DataSet->AddAllSeries(); - $DataSet->SetAbsciseLabelSerie("Serie2"); + $dataSet = new pData; + $dataSet->AddPoint(array_values($data),"Values"); + $dataSet->AddPoint(array_keys($data),"Keys"); + $dataSet->AddAllSeries(); + $dataSet->SetAbsciseLabelSerie("Keys"); // Initialise the graph - $Test = new pChart($this->width, $this->height); + $chart = new pChart($this->width, $this->height); foreach ($this->colors as $key => $color) { - $Test->setColorPalette( + $chart->setColorPalette( $key, hexdec(substr($color, 1, 2)), hexdec(substr($color, 3, 2)), hexdec(substr($color, 5, 2)) ); } - $Test->setFontProperties($this->fontPath.'tahoma.ttf', 8); - $Test->drawFilledRoundedRectangle( + $chart->setFontProperties($this->fontPath.'tahoma.ttf', 8); + $chart->drawFilledRoundedRectangle( $this->border1Width, $this->border1Width, $this->width - $this->border1Width, $this->height - $this->border1Width, - 5,240,240,240); - $Test->drawRoundedRectangle( + 5, + $this->getBgColorComp(0), + $this->getBgColorComp(1), + $this->getBgColorComp(2) + ); + $chart->drawRoundedRectangle( $this->border1Width, $this->border1Width, $this->width - $this->border1Width, $this->height - $this->border1Width, - 5,230,230,230); + 5,0,0,0); // Draw the pie chart - $Test->AntialiasQuality = 0; - $Test->setShadowProperties(2,2,200,200,200); + $chart->AntialiasQuality = 0; + $chart->setShadowProperties(2,2,200,200,200); //$Test->drawFlatPieGraphWithShadow($DataSet->GetData(),$DataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,8); //$Test->drawBasicPieGraph($DataSet->GetData(),$DataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,255,255,218,2); - $Test->drawPieGraph($DataSet->GetData(),$DataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,FALSE,60,30,10,1); - $Test->clearShadow(); + $chart->drawPieGraph($dataSet->GetData(),$dataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,FALSE,60,30,10,1); + $chart->clearShadow(); - $Test->drawTitle(10,20,$titleText,0,0,0); - $Test->drawPieLegend(340,15,$DataSet->GetData(),$DataSet->GetDataDescription(),250,250,250); + $chart->drawTitle(20,20,$titleText,0,0,0); + $chart->drawPieLegend(350,15,$dataSet->GetData(),$dataSet->GetDataDescription(),250,250,250); ob_start(); - imagepng($Test->Picture); + imagepng($chart->Picture); $output = ob_get_contents(); ob_end_clean(); From f9d20c8c7a82de57b965464782fb254244e7dec2 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Thu, 17 Jun 2010 19:04:59 +0300 Subject: [PATCH 12/80] added chart button. Will be used later to draw a chart of the query results. --- libraries/display_tbl.lib.php | 6 ++++++ themes/original/img/b_chart.png | Bin 0 -> 3118 bytes 2 files changed, 6 insertions(+) create mode 100644 themes/original/img/b_chart.png diff --git a/libraries/display_tbl.lib.php b/libraries/display_tbl.lib.php index 5238d937f..2e54a8b19 100644 --- a/libraries/display_tbl.lib.php +++ b/libraries/display_tbl.lib.php @@ -2224,6 +2224,12 @@ function PMA_displayResultsOperations($the_disp_mode, $analyzed_sql) { 'tbl_export.php' . PMA_generate_common_url($_url_params), PMA_getIcon('b_tblexport.png', __('Export'), false, true), '', true, true, '') . "\n"; + + // show chart + echo PMA_linkOrButton( + 'tbl_chart.php' . PMA_generate_common_url($_url_params), + PMA_getIcon('b_chart.png', __('Show chart'), false, true), + '', true, true, '') . "\n"; } // CREATE VIEW diff --git a/themes/original/img/b_chart.png b/themes/original/img/b_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..388ec3006553ee7c932952662af4e2545356d1cd GIT binary patch literal 3118 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7I14-?iy0WWg+Z8+Vb&Z8 z1_mzwOlRkSfQjkW+Vq$V4?QMNR>)4#kBxMFS5Cy1KGRpIFer+}GF8BO0i~)5Udz{fXkDzUIXp zU8jCOtX`abZO`{-Xa8-zZufl6=ee8DvmfB#ndV^}XxhND(n(J6LG$q=#~wb>b7d=7!LT(K42iz{-6Jq)65vgh8D&HB@->Y zIT}P59IE=9mN7WEF*eMdp%%=rfQ2F9baK*Th5%iL1oir7ml+!7{+LO86pfAMAE#ESTfwuWiapzPxD~du$|$+IRWlX3>-WR27w)| znhY$}3<)Qcl`9xpW-^GleG0evsJ%|$xfTOM#mr4MJ5?-Q8>2aN3)#cN_2e|pd5UX` zm?bhL&T`N@R5?@9sL_P~!RIp!3=1ZT3O;E5{I}v9-@0?>%=)(R#p}M>&-Py_De3XQ zr{`A}I503gEUCNrPe*^VRD(5JL+-yts_$4b;Q;wm;6nz~Hi=QEP*v^p}GYItSQf4zk`k$o(h5ti?&?$RQ^IC$5wR znW6;EHBC+$ZD%*gY9;7jaga4R5SY<6xqwgaQ0NXm+XDVyi5&9|YV2v`WN|#fA)Kgq ztAjDAD?+)CLwsiI5524k8#^I(fR~~ zQPZEcJ?@568aD;nUg6p5ymN)QREygp?h7d;hO_#`7Ra3h?;vuCx`Q)vX>`m;JQ*;!xPqaRn z`{eKw<0sNj6hB3C%}sJBT=FCMkw(y|EHBBY0#8kzvZc;2atvKOE9mZug&~5b{ZUS9 z7j6q$AK1P^*rarp<=JL2Pw%B`7frn^l_8$-J#+nwl3jv#r^@+FzYu=u^h@^_(_b)u zDd*vB6Ky`;k**;*TY_C8U9wza{S2RFl9#(BkB1nT8@`_Ld?x?Q{Ll!kZCW*=6HjqX z^_r?SRa#3wWaX-5tM0Ah4*eW@I;4MPTyX6=w@~BY$16FnOj{kgYHq;mVCmrWmDVfT zSEaAW53yfT7x}l7E%LC>VSnc(feSXqKi+dpfje1pbA^s#Ht*`T(nixGY8%hqtSQsl zJ>#$J?rz&vD;HWi8+#dtZw~rACC#4w@r=SBb4vU;pKC0i{<*H}p2&O6N1D>hOni14 zrp9Einl^n}#A=V#fveqL?=@TZcKO_8dtG-&{%+)RJnp3)qwb#Ge~xwT^WdAocb9W5 z7xT5X`npbURrXTpg}YtK_vbBtH)GzuxQ2N?`OEKB?tT7CrdI!N$lu&w%fGtwM6hk< zQDM8yb56qMsA*xojjaCh+aCj+V-GtxFHM}9IQ?PE#GMyy7GHJib>r{JJQnj<<#Fz@ z++&N?*whr&ynSE!zMB=~yK|Z5GHV}epW|oGoLzMG+Dy~gwuaY@p3i|aQRNZ$$qQnT}wZ_ z;p4WG+g5Iu-0<`U+wFDRa<|ncrYDJ~Z$G;3@Vm)-C)e((?fq-Z&f9*IZ?$ZcY+dn| zA`z=Ft9!G~&3R{Ed-Th+m-^`u=LOE+Fn+vE__XGc%(=m{FT1CUr|&Fo{@l^s>D_c% zZ@Qh{Z0TcnPwai-Rr0kk_F>hfuXAT_o_*-;ireeonZ3(=*M4XI8I$>%^CFFlFC0GM z{2=h@MSJe~Qw_53uc`BQ_HRtz`dnE*S$|^q+Upy(FD+m7J@LJ`-8Z|U`H$@$+nC=o zx)&LL#{9tc6WdSwAI_f_-+JGbFfd-#Ydz*y$+h*x$6a>FL3>iWw)~OjxV<{rQY@6VGMxwFcC^xORa(@mXT`;W{4m z*7nx$Hv7JUjtHrXhSN>UFWzx3zVGtOWtz*q+3AM1Em6GT&vg%l?>N zTI89l5pyFvbG&6N^|aQR<>lEq&E}ym{zJB zHD0RobZ3kD$_aaXczy29wwfn4t4tx+$kuAFVe_Pk6AGPHDf&*{mi{XJSz6iYHL0ze z{vFNh-mWh&l+efI5{&8Kcp zFrV{&{{Oc^hlCzZ+P1XKJ6u;b;@RFcS(ck@3M+4OJr-rvZVO{uW3!`cn^x{s|J859 zr?0Eqt5)Tk-57W9RMWw&jM=ZbL%E)|*1o=T{cWs&gns1xt%<+d=1SX%c6O~3xh+0j zwEl+1orFOT=;tu4Iw!?wKr z`pxyW{`9jNw|6&hbKbdlzs-(4smo8EJ8NwpvLxh7$gdEycbD#NO}zdi@8Ub@>OJ2~ z-dw#Mz32O1yOaBFhcbrxUQN52`rGsO=I{3FI#<2?G3|G5>{`Fv!nennFERgRSLWMx zedm>{vX^W_g8Hv%zjo(4F2C>J-1p_Wyk@+iy>pH|QZ8_*eDd-;=l$<;yjHi$daBnv zWWOw5CYvs+pXD^`(=4~y!LxoxCq?h_KVx_C+N*n2f81}&^UpD{iLCVc9C9-A*2|{L zlhZ$)@0mMwZf%|3&pQdX7j3J4o_y|p7JvTxT>>Q!FS-8jer~a_1KrRSNSyZdEtD@QW)!(h%=ES4z)+>iz|hdl z!0_`w14F}028L1t28LG&3=CE?7#PI!C&eFiV_;y6^mK6yskpV|vTdG-qd?ok?YpYe zu03*-VR2e_fR|&Az;C8!94Q=y3Id%U^^EUcj*v>v{s%zO{(6@Eo2L{OsjNeV*`H{r*1gM17-zgod)T9p{n8T9(^lS8C_Pe|Y)J>XV6}V8z;==jQ`B7jfux zCM=9j*!TF_dB)r2NjxK^ZuDv&%9M>)scOZvs3lmW*KLme6m!a^5CfjQBv=`wqU`kKlEr@shP`ahvyLT29%Nu(VDNPHb6Mw<&;$U` CS;Dgb literal 0 HcmV?d00001 From 8eb93f5a68bf81c2475dca4477d7e5e9e3a4964f Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Thu, 17 Jun 2010 20:54:32 +0300 Subject: [PATCH 13/80] Increased default size. --- libraries/chart/pma_chart.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/chart/pma_chart.php b/libraries/chart/pma_chart.php index e5b9fdeee..d89ef139e 100644 --- a/libraries/chart/pma_chart.php +++ b/libraries/chart/pma_chart.php @@ -29,6 +29,7 @@ class PMA_Chart '#238C74', '#4C489B', '#1D674A', + '#87C9BF', ); /* @@ -39,7 +40,7 @@ class PMA_Chart /* * The width of the chart. */ - protected $width = 500; + protected $width = 520; /* * The height of the chart. From 9970ce91da7655537ff442e98e987612f5bd39d0 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Mon, 21 Jun 2010 17:34:50 +0300 Subject: [PATCH 14/80] restructured the code to be more OOP friendly --- libraries/chart/pma_pchart_chart.php | 37 ++++++++++++++++++--- libraries/chart/pma_pchart_pie.php | 49 ++++++++++++---------------- 2 files changed, 53 insertions(+), 33 deletions(-) diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php index fbf1a1c69..356f435a4 100644 --- a/libraries/chart/pma_pchart_chart.php +++ b/libraries/chart/pma_pchart_chart.php @@ -2,22 +2,51 @@ require_once 'pma_chart.php'; +include "pChart/pData.class"; +include "pChart/pChart.class"; + /* * Base class for every chart implemented using pChart. */ -class PMA_pChart_Chart extends PMA_Chart +abstract class PMA_pChart_Chart extends PMA_Chart { + protected $titleText; + protected $data; + + protected $dataSet; + protected $chart; + protected $imageEncoded; protected $fontPath = './libraries/chart/pChart/fonts/'; - function __construct($options = null) + public function __construct($titleText, $data, $options = null) { parent::__construct($options); - } - function toString() + $this->titleText = $titleText; + $this->data = $data; + } + + abstract protected function prepareDataSet(); + abstract protected function prepareChart(); + + protected function render() { + ob_start(); + imagepng($this->chart->Picture); + $output = ob_get_contents(); + ob_end_clean(); + + $this->imageEncoded = base64_encode($output); + } + + public function toString() + { + $this->prepareDataSet(); + $this->prepareChart(); + $this->render(); + return ''; } } diff --git a/libraries/chart/pma_pchart_pie.php b/libraries/chart/pma_pchart_pie.php index 4bf886fa2..9b9f0d08c 100644 --- a/libraries/chart/pma_pchart_pie.php +++ b/libraries/chart/pma_pchart_pie.php @@ -7,32 +7,30 @@ class PMA_pChart_Pie extends PMA_pChart_Chart private $border1Width = 7; private $border2Width = 5; - function __construct($titleText, $data, $options = null) + protected function prepareDataSet() { - parent::__construct($options); - - require_once './libraries/chart/pChart/pData.class'; - require_once './libraries/chart/pChart/pChart.class'; - // Dataset definition - $dataSet = new pData; - $dataSet->AddPoint(array_values($data),"Values"); - $dataSet->AddPoint(array_keys($data),"Keys"); - $dataSet->AddAllSeries(); - $dataSet->SetAbsciseLabelSerie("Keys"); + $this->dataSet = new pData; + $this->dataSet->AddPoint(array_values($this->data),"Values"); + $this->dataSet->AddPoint(array_keys($this->data),"Keys"); + $this->dataSet->AddAllSeries(); + $this->dataSet->SetAbsciseLabelSerie("Keys"); + } + protected function prepareChart() + { // Initialise the graph - $chart = new pChart($this->width, $this->height); + $this->chart = new pChart($this->width, $this->height); foreach ($this->colors as $key => $color) { - $chart->setColorPalette( + $this->chart->setColorPalette( $key, hexdec(substr($color, 1, 2)), hexdec(substr($color, 3, 2)), hexdec(substr($color, 5, 2)) ); } - $chart->setFontProperties($this->fontPath.'tahoma.ttf', 8); - $chart->drawFilledRoundedRectangle( + $this->chart->setFontProperties($this->fontPath.'tahoma.ttf', 8); + $this->chart->drawFilledRoundedRectangle( $this->border1Width, $this->border1Width, $this->width - $this->border1Width, @@ -42,7 +40,7 @@ class PMA_pChart_Pie extends PMA_pChart_Chart $this->getBgColorComp(1), $this->getBgColorComp(2) ); - $chart->drawRoundedRectangle( + $this->chart->drawRoundedRectangle( $this->border1Width, $this->border1Width, $this->width - $this->border1Width, @@ -50,22 +48,15 @@ class PMA_pChart_Pie extends PMA_pChart_Chart 5,0,0,0); // Draw the pie chart - $chart->AntialiasQuality = 0; - $chart->setShadowProperties(2,2,200,200,200); + $this->chart->AntialiasQuality = 0; + $this->chart->setShadowProperties(2,2,200,200,200); //$Test->drawFlatPieGraphWithShadow($DataSet->GetData(),$DataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,8); //$Test->drawBasicPieGraph($DataSet->GetData(),$DataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,255,255,218,2); - $chart->drawPieGraph($dataSet->GetData(),$dataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,FALSE,60,30,10,1); - $chart->clearShadow(); + $this->chart->drawPieGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,FALSE,60,30,10,1); + $this->chart->clearShadow(); - $chart->drawTitle(20,20,$titleText,0,0,0); - $chart->drawPieLegend(350,15,$dataSet->GetData(),$dataSet->GetDataDescription(),250,250,250); - - ob_start(); - imagepng($chart->Picture); - $output = ob_get_contents(); - ob_end_clean(); - - $this->imageEncoded = base64_encode($output); + $this->chart->drawTitle(20,20,$this->titleText,0,0,0); + $this->chart->drawPieLegend(350,15,$this->dataSet->GetData(),$this->dataSet->GetDataDescription(),250,250,250); } } From 12d875dadc8539b6a7d2934d912878d723814e5c Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Mon, 21 Jun 2010 17:35:42 +0300 Subject: [PATCH 15/80] early code to show a chart for query results --- libraries/chart.lib.php | 24 +++++++++ libraries/chart/pma_pchart_bar.php | 53 +++++++++++++++++++ libraries/display_tbl.lib.php | 2 +- tbl_chart.php | 82 ++++++++++++++++++++++++++++++ 4 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 libraries/chart/pma_pchart_bar.php create mode 100644 tbl_chart.php diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index cb48945a9..3a4b50315 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -1,7 +1,9 @@ toString(); } +/* + * Formats a chart for query results page. + */ +function PMA_chart_results($data) +{ + $chartData = array(); + + // loop through the rows + foreach ($data as $row) { + + // loop through the columns in the row + foreach ($row as $key => $value) { + $chartData[$key][] = $value; + } + } + + $chart = new PMA_pChart_bar( + __('Query results'), + $chartData); + echo $chart->toString(); +} + ?> diff --git a/libraries/chart/pma_pchart_bar.php b/libraries/chart/pma_pchart_bar.php new file mode 100644 index 000000000..9e4d88e17 --- /dev/null +++ b/libraries/chart/pma_pchart_bar.php @@ -0,0 +1,53 @@ +data); + $keys = array_keys($this->data); + + // Dataset definition + $this->dataSet = new pData; + $this->dataSet->AddPoint($values[1], "Values"); + $this->dataSet->AddPoint($values[0], "Keys"); + $this->dataSet->AddAllSeries(); + //$DataSet->RemoveSerie("Serie3"); + $this->dataSet->SetAbsciseLabelSerie("Keys"); + $this->dataSet->SetXAxisName($keys[0]); + $this->dataSet->SetYAxisName($keys[1]); + //$DataSet->SetYAxisUnit("°C"); + //$DataSet->SetXAxisUnit("h"); + } + + protected function prepareChart() + { + // Initialise the graph + $this->chart = new pChart($this->width, $this->height); + $this->chart->drawGraphAreaGradient(132,173,131,50,TARGET_BACKGROUND); + + $this->chart->setFontProperties($this->fontPath.'tahoma.ttf', 8); + $this->chart->setGraphArea($this->areaMargins[3],$this->labelHeight + $this->areaMargins[0],$this->width - $this->areaMargins[1],$this->height - $this->areaMargins[2]); + $this->chart->drawGraphArea(213,217,221,FALSE); + $this->chart->drawScale($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),SCALE_ADDALL,213,217,221,TRUE,0,2,TRUE); + $this->chart->drawGraphAreaGradient(163,203,167,50); + $this->chart->drawGrid(4,TRUE,230,230,230,20); + + // Draw the bar chart + $this->chart->drawStackedBarGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),70); + + // Draw the title + $this->chart->drawTextBox(0,0,$this->width,$this->labelHeight,$titleText,0,255,255,255,ALIGN_CENTER,TRUE,0,0,0,30); + + $this->chart->addBorder(2); + } +} + +?> diff --git a/libraries/display_tbl.lib.php b/libraries/display_tbl.lib.php index 2e54a8b19..11e7a0340 100644 --- a/libraries/display_tbl.lib.php +++ b/libraries/display_tbl.lib.php @@ -2228,7 +2228,7 @@ function PMA_displayResultsOperations($the_disp_mode, $analyzed_sql) { // show chart echo PMA_linkOrButton( 'tbl_chart.php' . PMA_generate_common_url($_url_params), - PMA_getIcon('b_chart.png', __('Show chart'), false, true), + PMA_getIcon('b_chart.png', __('Display chart'), false, true), '', true, true, '') . "\n"; } diff --git a/tbl_chart.php b/tbl_chart.php new file mode 100644 index 000000000..daafd36ff --- /dev/null +++ b/tbl_chart.php @@ -0,0 +1,82 @@ + $value) { + $chartData[$key][] = $value; + }*/ +} + +/** + * Displays top menu links + * We use db links because a chart is not necessarily on a single table + */ +$num_tables = 0; +require_once './libraries/db_links.inc.php'; + +$url_params['db'] = $GLOBALS['db']; +$url_params['reload'] = 1; + +/** + * Displays the page + */ +?> + +
+
+ +
+ + + +
+
+ +
+
+
+ From c5b49bb839f472487073d8b6508436aa4e0cff42 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Tue, 22 Jun 2010 14:24:23 +0300 Subject: [PATCH 16/80] added stacked bar chart --- libraries/chart.lib.php | 74 ++++++++++++++++++++++---- libraries/chart/pma_pchart_bar.php | 2 +- libraries/chart/pma_pchart_stacked.php | 67 +++++++++++++++++++++++ 3 files changed, 132 insertions(+), 11 deletions(-) create mode 100644 libraries/chart/pma_pchart_stacked.php diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index 3a4b50315..e36b338fb 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -4,6 +4,7 @@ require_once './libraries/chart/pma_ofc_pie.php'; require_once './libraries/chart/pma_pChart_pie.php'; require_once './libraries/chart/pma_pChart_bar.php'; +require_once './libraries/chart/pma_pChart_stacked.php'; /** * Chart functions used to generate various types @@ -57,19 +58,72 @@ function PMA_chart_profiling($data) function PMA_chart_results($data) { $chartData = array(); + $chart = null; + $chartTitle = __('Query results'); - // loop through the rows - foreach ($data as $row) { - - // loop through the columns in the row - foreach ($row as $key => $value) { - $chartData[$key][] = $value; - } + if (!isset($data[0])) { + // empty data + return; + } + + if (count($data[0]) == 2) { + // Two columns in every row. + // This data is suitable for a simple bar chart. + + // loop through the rows + foreach ($data as $row) { + // loop through the columns in the row + foreach ($row as $key => $value) { + $chartData[$key][] = $value; + } + } + + $chart = new PMA_pChart_bar($chartTitle, $chartData); + } + else if (count($data[0]) == 3) { + // Three columns (x axis, y axis, series) in every row. + // This data is suitable for a stacked bar chart. + $keys = array_keys($data[0]); + $xAxisKey = $keys[0]; + $yAxisKey = $keys[1]; + $seriesKey = $keys[2]; + + // get all the series labels + $seriesLabels = array(); + foreach ($data as $row) { + $seriesLabels[] = $row[$seriesKey]; + } + $seriesLabels = array_unique($seriesLabels); + + // loop through the rows + $currentXLabel = $data[0][$xAxisKey]; + foreach ($data as $row) { + + // save the label + // use the same as the value to get rid of duplicate results + $chartData[$xAxisKey][$row[$xAxisKey]] = $row[$xAxisKey]; + + // make sure to set value to every serie + $currentSeriesLabel = (string)$row[$seriesKey]; + foreach ($seriesLabels as $seriesLabelsValue) { + if ($currentSeriesLabel == $seriesLabelsValue) { + // the value os for this serie + $chartData[$yAxisKey][$seriesLabelsValue][$row[$xAxisKey]] = (int)$row[$yAxisKey]; + } + else if (!isset($chartData[$yAxisKey][$seriesLabelsValue][$row[$xAxisKey]])) { + // if the value for this serie is not set, set it to 0 + $chartData[$yAxisKey][$seriesLabelsValue][$row[$xAxisKey]] = 0; + } + } + } + + $chart = new PMA_pChart_stacked($chartTitle, $chartData); + } + else { + // unknown data + return; } - $chart = new PMA_pChart_bar( - __('Query results'), - $chartData); echo $chart->toString(); } diff --git a/libraries/chart/pma_pchart_bar.php b/libraries/chart/pma_pchart_bar.php index 9e4d88e17..39e385a47 100644 --- a/libraries/chart/pma_pchart_bar.php +++ b/libraries/chart/pma_pchart_bar.php @@ -44,7 +44,7 @@ class PMA_pChart_bar extends PMA_pChart_Chart $this->chart->drawStackedBarGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),70); // Draw the title - $this->chart->drawTextBox(0,0,$this->width,$this->labelHeight,$titleText,0,255,255,255,ALIGN_CENTER,TRUE,0,0,0,30); + $this->chart->drawTextBox(0,0,$this->width,$this->labelHeight,$this->titleText,0,255,255,255,ALIGN_CENTER,TRUE,0,0,0,30); $this->chart->addBorder(2); } diff --git a/libraries/chart/pma_pchart_stacked.php b/libraries/chart/pma_pchart_stacked.php new file mode 100644 index 000000000..b1b541091 --- /dev/null +++ b/libraries/chart/pma_pchart_stacked.php @@ -0,0 +1,67 @@ +data); + $keys = array_keys($this->data); + + // Dataset definition + $this->dataSet = new pData; + $this->dataSet->AddPoint($values[0], "Keys"); + + $i = 0; + foreach ($values[1] as $seriesName => $seriesData) { + $this->dataSet->AddPoint($seriesData, "Values".$i); + $this->dataSet->SetSerieName($seriesName, "Values".$i); + $i++; + } + $this->dataSet->AddAllSeries(); + + $this->dataSet->RemoveSerie("Keys"); + $this->dataSet->SetAbsciseLabelSerie("Keys"); + + $this->dataSet->SetXAxisName($keys[0]); + $this->dataSet->SetYAxisName($keys[1]); + } + + protected function prepareChart() + { + // Initialise the graph + $this->chart = new pChart($this->width, $this->height); + $this->chart->drawGraphAreaGradient(132,173,131,50,TARGET_BACKGROUND); + + $this->chart->setFontProperties($this->fontPath.'tahoma.ttf', 8); + + $legendSize = $this->chart->getLegendBoxSize($this->dataSet->GetDataDescription()); + + $this->chart->setGraphArea($this->areaMargins[3],$this->labelHeight + $this->areaMargins[0],$this->width - $this->areaMargins[1] - $legendSize[0],$this->height - $this->areaMargins[2]); + $this->chart->drawGraphArea(213,217,221,FALSE); + $this->chart->drawScale($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),SCALE_ADDALLSTART0,213,217,221,TRUE,0,2,TRUE); + $this->chart->drawGraphAreaGradient(163,203,167,50); + $this->chart->drawGrid(4,TRUE,230,230,230,20); + + // Draw the bar chart + $this->chart->drawStackedBarGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),70); + + // Draw the title + $this->chart->drawTextBox(0,0,$this->width,$this->labelHeight,$this->titleText,0,255,255,255,ALIGN_CENTER,TRUE,0,0,0,30); + + // Draw the legend + $this->chart->drawLegend($this->width - $this->areaMargins[1] - $legendSize[0] + $this->legendLeftMargin,$this->labelHeight + $this->areaMargins[0],$this->dataSet->GetDataDescription(),250,250,250,50,50,50); + + $this->chart->addBorder(2); + } +} + +?> From eeead429908320594f2262c1071a99f02fb5aace Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Tue, 22 Jun 2010 15:25:06 +0300 Subject: [PATCH 17/80] Moved settings to an array. Form fields to choose settings for query result chart. --- libraries/chart.lib.php | 9 +- libraries/chart/pma_chart.php | 119 +++++++++++++++---------- libraries/chart/pma_pchart_bar.php | 39 ++++++-- libraries/chart/pma_pchart_chart.php | 9 +- libraries/chart/pma_pchart_pie.php | 41 ++++++--- libraries/chart/pma_pchart_stacked.php | 39 +++++--- tbl_chart.php | 32 ++++++- 7 files changed, 199 insertions(+), 89 deletions(-) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index e36b338fb..a4b26a92c 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -55,7 +55,7 @@ function PMA_chart_profiling($data) /* * Formats a chart for query results page. */ -function PMA_chart_results($data) +function PMA_chart_results($data, &$chartSettings) { $chartData = array(); $chart = null; @@ -78,7 +78,7 @@ function PMA_chart_results($data) } } - $chart = new PMA_pChart_bar($chartTitle, $chartData); + $chart = new PMA_pChart_bar($chartTitle, $chartData, $chartSettings); } else if (count($data[0]) == 3) { // Three columns (x axis, y axis, series) in every row. @@ -117,14 +117,15 @@ function PMA_chart_results($data) } } - $chart = new PMA_pChart_stacked($chartTitle, $chartData); + $chart = new PMA_pChart_stacked($chartTitle, $chartData, $chartSettings); } else { // unknown data return; } - echo $chart->toString(); + $chartSettings = $chart->getSettings(); + return $chart->toString(); } ?> diff --git a/libraries/chart/pma_chart.php b/libraries/chart/pma_chart.php index d89ef139e..6202273be 100644 --- a/libraries/chart/pma_chart.php +++ b/libraries/chart/pma_chart.php @@ -3,50 +3,55 @@ class PMA_Chart { /* - * The style of the chart title. + * The settings array. All the default values are here. */ - protected $titleStyle = 'font-size: 12px; font-weight: bold;'; + protected $settings = array( + /* + * The style of the chart title. + */ + 'titleStyle' => 'font-size: 12px; font-weight: bold;', - /* - * Colors for the different slices in the pie chart. - */ - protected $colors = array( - '#BCE02E', - '#E0642E', - '#E0D62E', - '#2E97E0', - '#B02EE0', - '#E02E75', - '#5CE02E', - '#E0B02E', - '#000000', - '#0022E0', - '#726CB1', - '#481A36', - '#BAC658', - '#127224', - '#825119', - '#238C74', - '#4C489B', - '#1D674A', - '#87C9BF', + /* + * Colors for the different slices in the pie chart. + */ + 'colors' => array( + '#BCE02E', + '#E0642E', + '#E0D62E', + '#2E97E0', + '#B02EE0', + '#E02E75', + '#5CE02E', + '#E0B02E', + '#000000', + '#0022E0', + '#726CB1', + '#481A36', + '#BAC658', + '#127224', + '#825119', + '#238C74', + '#4C489B', + '#1D674A', + '#87C9BF', + ), + + /* + * Chart background color. + */ + 'bgColor' => '#E5E5E5', + + /* + * The width of the chart. + */ + 'width' => 520, + + /* + * The height of the chart. + */ + 'height' => 325, ); - /* - * Chart background color. - */ - protected $bgColor = '#E5E5E5'; - - /* - * The width of the chart. - */ - protected $width = 520; - - /* - * The height of the chart. - */ - protected $height = 325; - function __construct($options = null) { $this->handleOptions($options); @@ -64,17 +69,37 @@ class PMA_Chart if (is_null($options)) return; - if (isset($options['bgColor'])) - $this->bgColor = $options['bgColor']; - if (isset($options['width'])) - $this->width = $options['width']; - if (isset($options['height'])) - $this->height = $options['height']; + $this->settings = array_merge($this->settings, $options); + } + + function getTitleStyle() + { + return $this->settings['titleStyle']; + } + + function getColors() + { + return $this->settings['colors']; + } + + function getWidth() + { + return $this->settings['width']; + } + + function getHeight() + { + return $this->settings['height']; } function getBgColorComp($component) { - return hexdec(substr($this->bgColor, ($component * 2) + 1, 2)); + return hexdec(substr($this->settings['bgColor'], ($component * 2) + 1, 2)); + } + + function getSettings() + { + return $this->settings; } } diff --git a/libraries/chart/pma_pchart_bar.php b/libraries/chart/pma_pchart_bar.php index 39e385a47..613d8c2d1 100644 --- a/libraries/chart/pma_pchart_bar.php +++ b/libraries/chart/pma_pchart_bar.php @@ -2,12 +2,22 @@ require_once 'pma_pchart_chart.php'; +define('TOP', 0); +define('RIGHT', 1); +define('BOTTOM', 2); +define('LEFT', 3); + class PMA_pChart_bar extends PMA_pChart_Chart { - private $labelHeight = 20; + public function __construct($titleText, $data, $options = null) + { + parent::__construct($titleText, $data, $options); - // as in CSS (top, right, bottom, left) - private $areaMargins = array(20, 20, 40, 60); + $this->settings['labelHeight'] = 20; + + // as in CSS (top, right, bottom, left) + $this->settings['areaMargins'] = array(20, 20, 40, 60); + } protected function prepareDataSet() { @@ -30,11 +40,16 @@ class PMA_pChart_bar extends PMA_pChart_Chart protected function prepareChart() { // Initialise the graph - $this->chart = new pChart($this->width, $this->height); + $this->chart = new pChart($this->getWidth(), $this->getHeight()); $this->chart->drawGraphAreaGradient(132,173,131,50,TARGET_BACKGROUND); - $this->chart->setFontProperties($this->fontPath.'tahoma.ttf', 8); - $this->chart->setGraphArea($this->areaMargins[3],$this->labelHeight + $this->areaMargins[0],$this->width - $this->areaMargins[1],$this->height - $this->areaMargins[2]); + $this->chart->setFontProperties($this->getFontPath().'tahoma.ttf', 8); + $this->chart->setGraphArea( + $this->getAreaMargin(LEFT), + $this->getLabelHeight() + $this->getAreaMargin(TOP), + $this->getWidth() - $this->getAreaMargin(RIGHT), + $this->getHeight() - $this->getAreaMargin(BOTTOM) + ); $this->chart->drawGraphArea(213,217,221,FALSE); $this->chart->drawScale($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),SCALE_ADDALL,213,217,221,TRUE,0,2,TRUE); $this->chart->drawGraphAreaGradient(163,203,167,50); @@ -44,10 +59,20 @@ class PMA_pChart_bar extends PMA_pChart_Chart $this->chart->drawStackedBarGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),70); // Draw the title - $this->chart->drawTextBox(0,0,$this->width,$this->labelHeight,$this->titleText,0,255,255,255,ALIGN_CENTER,TRUE,0,0,0,30); + $this->chart->drawTextBox(0,0,$this->getWidth(),$this->getLabelHeight(),$this->titleText,0,255,255,255,ALIGN_CENTER,TRUE,0,0,0,30); $this->chart->addBorder(2); } + + protected function getLabelHeight() + { + return $this->settings['labelHeight']; + } + + protected function getAreaMargin($side) + { + return $this->settings['areaMargins'][$side]; + } } ?> diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php index 356f435a4..8ff41fe49 100644 --- a/libraries/chart/pma_pchart_chart.php +++ b/libraries/chart/pma_pchart_chart.php @@ -18,14 +18,14 @@ abstract class PMA_pChart_Chart extends PMA_Chart protected $imageEncoded; - protected $fontPath = './libraries/chart/pChart/fonts/'; - public function __construct($titleText, $data, $options = null) { parent::__construct($options); $this->titleText = $titleText; $this->data = $data; + + $this->settings['fontPath'] = './libraries/chart/pChart/fonts/'; } abstract protected function prepareDataSet(); @@ -49,6 +49,11 @@ abstract class PMA_pChart_Chart extends PMA_Chart return ''; } + + protected function getFontPath() + { + return $this->settings['fontPath']; + } } ?> diff --git a/libraries/chart/pma_pchart_pie.php b/libraries/chart/pma_pchart_pie.php index 9b9f0d08c..bd93e8978 100644 --- a/libraries/chart/pma_pchart_pie.php +++ b/libraries/chart/pma_pchart_pie.php @@ -4,8 +4,13 @@ require_once 'pma_pchart_chart.php'; class PMA_pChart_Pie extends PMA_pChart_Chart { - private $border1Width = 7; - private $border2Width = 5; + public function __construct($titleText, $data, $options = null) + { + parent::__construct($titleText, $data, $options); + + $this->settings['border1Width'] = 7; + $this->settings['border2Width'] = 8; + } protected function prepareDataSet() { @@ -20,8 +25,8 @@ class PMA_pChart_Pie extends PMA_pChart_Chart protected function prepareChart() { // Initialise the graph - $this->chart = new pChart($this->width, $this->height); - foreach ($this->colors as $key => $color) { + $this->chart = new pChart($this->getWidth(), $this->getHeight()); + foreach ($this->getColors() as $key => $color) { $this->chart->setColorPalette( $key, hexdec(substr($color, 1, 2)), @@ -29,22 +34,22 @@ class PMA_pChart_Pie extends PMA_pChart_Chart hexdec(substr($color, 5, 2)) ); } - $this->chart->setFontProperties($this->fontPath.'tahoma.ttf', 8); + $this->chart->setFontProperties($this->getFontPath().'tahoma.ttf', 8); $this->chart->drawFilledRoundedRectangle( - $this->border1Width, - $this->border1Width, - $this->width - $this->border1Width, - $this->height - $this->border1Width, + $this->getBorder1Width(), + $this->getBorder1Width(), + $this->getWidth() - $this->getBorder1Width(), + $this->getHeight() - $this->getBorder1Width(), 5, $this->getBgColorComp(0), $this->getBgColorComp(1), $this->getBgColorComp(2) ); $this->chart->drawRoundedRectangle( - $this->border1Width, - $this->border1Width, - $this->width - $this->border1Width, - $this->height - $this->border1Width, + $this->getBorder2Width(), + $this->getBorder2Width(), + $this->getWidth() - $this->getBorder2Width(), + $this->getHeight() - $this->getBorder2Width(), 5,0,0,0); // Draw the pie chart @@ -58,6 +63,16 @@ class PMA_pChart_Pie extends PMA_pChart_Chart $this->chart->drawTitle(20,20,$this->titleText,0,0,0); $this->chart->drawPieLegend(350,15,$this->dataSet->GetData(),$this->dataSet->GetDataDescription(),250,250,250); } + + protected function getBorder1Width() + { + return $this->settings['border1Width']; + } + + protected function getBorder2Width() + { + return $this->settings['border2Width']; + } } ?> diff --git a/libraries/chart/pma_pchart_stacked.php b/libraries/chart/pma_pchart_stacked.php index b1b541091..d3fae5195 100644 --- a/libraries/chart/pma_pchart_stacked.php +++ b/libraries/chart/pma_pchart_stacked.php @@ -1,15 +1,15 @@ settings['legendLeftMargin'] = 10; + } protected function prepareDataSet() { @@ -38,14 +38,19 @@ class PMA_pChart_stacked extends PMA_pChart_Chart protected function prepareChart() { // Initialise the graph - $this->chart = new pChart($this->width, $this->height); + $this->chart = new pChart($this->getWidth(), $this->getHeight()); $this->chart->drawGraphAreaGradient(132,173,131,50,TARGET_BACKGROUND); - $this->chart->setFontProperties($this->fontPath.'tahoma.ttf', 8); + $this->chart->setFontProperties($this->getFontPath().'tahoma.ttf', 8); $legendSize = $this->chart->getLegendBoxSize($this->dataSet->GetDataDescription()); - $this->chart->setGraphArea($this->areaMargins[3],$this->labelHeight + $this->areaMargins[0],$this->width - $this->areaMargins[1] - $legendSize[0],$this->height - $this->areaMargins[2]); + $this->chart->setGraphArea( + $this->getAreaMargin(LEFT), + $this->getLabelHeight() + $this->getAreaMargin(TOP), + $this->getWidth() - $this->getAreaMargin(RIGHT) - $legendSize[0], + $this->getHeight() - $this->getAreaMargin(BOTTOM) + ); $this->chart->drawGraphArea(213,217,221,FALSE); $this->chart->drawScale($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),SCALE_ADDALLSTART0,213,217,221,TRUE,0,2,TRUE); $this->chart->drawGraphAreaGradient(163,203,167,50); @@ -55,13 +60,23 @@ class PMA_pChart_stacked extends PMA_pChart_Chart $this->chart->drawStackedBarGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),70); // Draw the title - $this->chart->drawTextBox(0,0,$this->width,$this->labelHeight,$this->titleText,0,255,255,255,ALIGN_CENTER,TRUE,0,0,0,30); + $this->chart->drawTextBox(0,0,$this->getWidth(),$this->getLabelHeight(),$this->titleText,0,255,255,255,ALIGN_CENTER,TRUE,0,0,0,30); // Draw the legend - $this->chart->drawLegend($this->width - $this->areaMargins[1] - $legendSize[0] + $this->legendLeftMargin,$this->labelHeight + $this->areaMargins[0],$this->dataSet->GetDataDescription(),250,250,250,50,50,50); + $this->chart->drawLegend( + $this->getWidth() - $this->getAreaMargin(RIGHT) - $legendSize[0] + $this->getLegendMargin(LEFT), + $this->getLabelHeight() + $this->getAreaMargin(TOP), + $this->dataSet->GetDataDescription(), + 250,250,250,50,50,50 + ); $this->chart->addBorder(2); } + + protected function getLegendMargin($side) + { + return $this->settings['legendLeftMargin']; + } } ?> diff --git a/tbl_chart.php b/tbl_chart.php index daafd36ff..070da7be7 100644 --- a/tbl_chart.php +++ b/tbl_chart.php @@ -45,6 +45,15 @@ while ($row = PMA_DBI_fetch_assoc($result)) { }*/ } +// get settings if any posted +$chartSettings = array(); +if (PMA_isValid($_REQUEST['chartSettings'], 'array')) { + $chartSettings = $_REQUEST['chartSettings']; +} + +// get the chart and settings used to generate chart +$chart = PMA_chart_results($data, $chartSettings); + /** * Displays top menu links * We use db links because a chart is not necessarily on a single table @@ -59,17 +68,32 @@ $url_params['reload'] = 1; * Displays the page */ ?> - +
-
+
- + +
+ +
+ + + + + + + + + + + +
- +
From 1cae244e8987ff294eed39cf4cd8ac8f3e08897c Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Wed, 23 Jun 2010 13:30:20 +0300 Subject: [PATCH 18/80] fixed case error --- libraries/chart.lib.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index a4b26a92c..f2c764ca2 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -2,9 +2,9 @@ require_once './libraries/chart/pma_ofc_pie.php'; -require_once './libraries/chart/pma_pChart_pie.php'; -require_once './libraries/chart/pma_pChart_bar.php'; -require_once './libraries/chart/pma_pChart_stacked.php'; +require_once './libraries/chart/pma_pchart_pie.php'; +require_once './libraries/chart/pma_pchart_bar.php'; +require_once './libraries/chart/pma_pchart_stacked.php'; /** * Chart functions used to generate various types From 278ee6e2cabe1c38d3568cf8d342913f00393324 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Wed, 23 Jun 2010 13:32:23 +0300 Subject: [PATCH 19/80] added curly braces where needed --- libraries/chart/pma_chart.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/chart/pma_chart.php b/libraries/chart/pma_chart.php index 6202273be..423641a0d 100644 --- a/libraries/chart/pma_chart.php +++ b/libraries/chart/pma_chart.php @@ -66,8 +66,9 @@ class PMA_Chart */ function handleOptions($options) { - if (is_null($options)) + if (is_null($options)) { return; + } $this->settings = array_merge($this->settings, $options); } From c2e7aef7bae96b1155cef26f9cdcf6505591b897 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Wed, 23 Jun 2010 14:06:57 +0300 Subject: [PATCH 20/80] added configurable settings for title and labels --- libraries/chart.lib.php | 7 ++++++- libraries/chart/pma_chart.php | 20 ++++++++++++++++++++ libraries/chart/pma_pchart_bar.php | 14 ++++++++++++-- tbl_chart.php | 17 +++++++++++++---- 4 files changed, 51 insertions(+), 7 deletions(-) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index f2c764ca2..e48bf4a84 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -59,7 +59,12 @@ function PMA_chart_results($data, &$chartSettings) { $chartData = array(); $chart = null; - $chartTitle = __('Query results'); + if (!empty($chartSettings['title'])) { + $chartTitle = $chartSettings['title']; + } + else { + $chartTitle = __('Query results'); + } if (!isset($data[0])) { // empty data diff --git a/libraries/chart/pma_chart.php b/libraries/chart/pma_chart.php index 423641a0d..357dafa4a 100644 --- a/libraries/chart/pma_chart.php +++ b/libraries/chart/pma_chart.php @@ -50,6 +50,16 @@ class PMA_Chart * The height of the chart. */ 'height' => 325, + + /* + * Default X Axis label. If empty, label will be taken from the data. + */ + 'xLabel' => '', + + /* + * Default Y Axis label. If empty, label will be taken from the data. + */ + 'yLabel' => '', ); function __construct($options = null) @@ -98,6 +108,16 @@ class PMA_Chart return hexdec(substr($this->settings['bgColor'], ($component * 2) + 1, 2)); } + function getXLabel() + { + return $this->settings['xLabel']; + } + + function getYLabel() + { + return $this->settings['yLabel']; + } + function getSettings() { return $this->settings; diff --git a/libraries/chart/pma_pchart_bar.php b/libraries/chart/pma_pchart_bar.php index 613d8c2d1..d8947f83d 100644 --- a/libraries/chart/pma_pchart_bar.php +++ b/libraries/chart/pma_pchart_bar.php @@ -31,8 +31,18 @@ class PMA_pChart_bar extends PMA_pChart_Chart $this->dataSet->AddAllSeries(); //$DataSet->RemoveSerie("Serie3"); $this->dataSet->SetAbsciseLabelSerie("Keys"); - $this->dataSet->SetXAxisName($keys[0]); - $this->dataSet->SetYAxisName($keys[1]); + + $xLabel = $this->getXLabel(); + if (empty($xLabel)) { + $xLabel = $keys[0]; + } + $this->dataSet->SetXAxisName($xLabel); + + $yLabel = $this->getYLabel(); + if (empty($yLabel)) { + $yLabel = $keys[1]; + } + $this->dataSet->SetYAxisName($yLabel); //$DataSet->SetYAxisUnit("°C"); //$DataSet->SetXAxisUnit("h"); } diff --git a/tbl_chart.php b/tbl_chart.php index 070da7be7..6aae9844f 100644 --- a/tbl_chart.php +++ b/tbl_chart.php @@ -25,7 +25,7 @@ require_once './libraries/common.inc.php'; */ require './libraries/db_common.inc.php'; $url_params['goto'] = $cfg['DefaultTabDatabase']; -$url_params['back'] = 'view_create.php'; +$url_params['back'] = 'tbl_chart.php'; /* * Import chart functions @@ -40,9 +40,6 @@ $data = array(); $result = PMA_DBI_try_query($sql_query); while ($row = PMA_DBI_fetch_assoc($result)) { $data[] = $row; - /*foreach ($row as $key => $value) { - $chartData[$key][] = $value; - }*/ } // get settings if any posted @@ -89,6 +86,18 @@ $url_params['reload'] = 1; + + + + + + + + + + + + From f1e30fea1ee1c61819e1083a54ce3ce07915e559 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Tue, 6 Jul 2010 17:02:48 +0300 Subject: [PATCH 21/80] debug on the demo server --- libraries/chart.lib.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index e48bf4a84..1c634a8ca 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -46,9 +46,12 @@ function PMA_chart_profiling($data) $chartData[$key] = $value; } + error_reporting(E_ALL); + echo "before new"; $chart = new PMA_pChart_Pie( __('Query execution time comparison (in microseconds)'), $chartData); + echo "after new"; echo $chart->toString(); } @@ -105,7 +108,7 @@ function PMA_chart_results($data, &$chartSettings) foreach ($data as $row) { // save the label - // use the same as the value to get rid of duplicate results + // use the same value as the key and the value to get rid of duplicate results $chartData[$xAxisKey][$row[$xAxisKey]] = $row[$xAxisKey]; // make sure to set value to every serie From c342ad07e0e9c8ee1552ced4360ff2dbd07213f5 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Tue, 6 Jul 2010 17:30:32 +0300 Subject: [PATCH 22/80] debug on the demo server --- libraries/chart.lib.php | 3 --- libraries/chart/pma_pchart_chart.php | 5 +++++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index 1c634a8ca..8c41e62eb 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -46,12 +46,9 @@ function PMA_chart_profiling($data) $chartData[$key] = $value; } - error_reporting(E_ALL); - echo "before new"; $chart = new PMA_pChart_Pie( __('Query execution time comparison (in microseconds)'), $chartData); - echo "after new"; echo $chart->toString(); } diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php index 8ff41fe49..3c6648ad4 100644 --- a/libraries/chart/pma_pchart_chart.php +++ b/libraries/chart/pma_pchart_chart.php @@ -33,10 +33,12 @@ abstract class PMA_pChart_Chart extends PMA_Chart protected function render() { + echo "before ob_start"; ob_start(); imagepng($this->chart->Picture); $output = ob_get_contents(); ob_end_clean(); + echo "after ob_end_clean"; $this->imageEncoded = base64_encode($output); } @@ -44,8 +46,11 @@ abstract class PMA_pChart_Chart extends PMA_Chart public function toString() { $this->prepareDataSet(); + echo "after neprepareDataSetw"; $this->prepareChart(); + echo "after prepareChart"; $this->render(); + echo "after render"; return ''; } From 14ab690286cfe339ac661883228c59601be01bc1 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Tue, 6 Jul 2010 18:23:05 +0300 Subject: [PATCH 23/80] debug on the demo server --- libraries/chart/pma_pchart_pie.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libraries/chart/pma_pchart_pie.php b/libraries/chart/pma_pchart_pie.php index bd93e8978..d8aa55244 100644 --- a/libraries/chart/pma_pchart_pie.php +++ b/libraries/chart/pma_pchart_pie.php @@ -26,6 +26,7 @@ class PMA_pChart_Pie extends PMA_pChart_Chart { // Initialise the graph $this->chart = new pChart($this->getWidth(), $this->getHeight()); + echo "after new\n"; foreach ($this->getColors() as $key => $color) { $this->chart->setColorPalette( $key, @@ -34,7 +35,9 @@ class PMA_pChart_Pie extends PMA_pChart_Chart hexdec(substr($color, 5, 2)) ); } + echo "after palette\n"; $this->chart->setFontProperties($this->getFontPath().'tahoma.ttf', 8); + echo "after font\n"; $this->chart->drawFilledRoundedRectangle( $this->getBorder1Width(), $this->getBorder1Width(), @@ -45,12 +48,14 @@ class PMA_pChart_Pie extends PMA_pChart_Chart $this->getBgColorComp(1), $this->getBgColorComp(2) ); + echo "after drawFilledRoundedRectangle\n"; $this->chart->drawRoundedRectangle( $this->getBorder2Width(), $this->getBorder2Width(), $this->getWidth() - $this->getBorder2Width(), $this->getHeight() - $this->getBorder2Width(), 5,0,0,0); + echo "after drawRoundedRectangle\n"; // Draw the pie chart $this->chart->AntialiasQuality = 0; @@ -58,10 +63,13 @@ class PMA_pChart_Pie extends PMA_pChart_Chart //$Test->drawFlatPieGraphWithShadow($DataSet->GetData(),$DataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,8); //$Test->drawBasicPieGraph($DataSet->GetData(),$DataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,255,255,218,2); $this->chart->drawPieGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,FALSE,60,30,10,1); + echo "after drawPieGraph\n"; $this->chart->clearShadow(); $this->chart->drawTitle(20,20,$this->titleText,0,0,0); + echo "after drawTitle\n"; $this->chart->drawPieLegend(350,15,$this->dataSet->GetData(),$this->dataSet->GetDataDescription(),250,250,250); + echo "after drawPieLegend\n"; } protected function getBorder1Width() From c9a785cf038b081219f7493d946f65298d5e3f45 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Tue, 6 Jul 2010 19:22:41 +0300 Subject: [PATCH 24/80] debug on the demo server --- libraries/chart/pma_pchart_pie.php | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/chart/pma_pchart_pie.php b/libraries/chart/pma_pchart_pie.php index d8aa55244..c12a0dcdd 100644 --- a/libraries/chart/pma_pchart_pie.php +++ b/libraries/chart/pma_pchart_pie.php @@ -25,6 +25,7 @@ class PMA_pChart_Pie extends PMA_pChart_Chart protected function prepareChart() { // Initialise the graph + echo "before new\n"; $this->chart = new pChart($this->getWidth(), $this->getHeight()); echo "after new\n"; foreach ($this->getColors() as $key => $color) { From c1ed3e22915d91bfa613058e42a8f70fdd0a6e59 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Tue, 6 Jul 2010 21:23:03 +0300 Subject: [PATCH 25/80] debug on the demo server --- libraries/chart/pChart/pChart.class | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libraries/chart/pChart/pChart.class b/libraries/chart/pChart/pChart.class index c407b7e2c..d2b43311c 100644 --- a/libraries/chart/pChart/pChart.class +++ b/libraries/chart/pChart/pChart.class @@ -198,12 +198,15 @@ { $this->XSize = $XSize; $this->YSize = $YSize; + echo "before imagecreatetruecolor\n"; $this->Picture = imagecreatetruecolor($XSize,$YSize); - + echo "before this->AllocateColor\n"; $C_White =$this->AllocateColor($this->Picture,255,255,255); + echo "before imagefilledrectangle\n"; imagefilledrectangle($this->Picture,0,0,$XSize,$YSize,$C_White); + echo "before imagecolortransparent"; imagecolortransparent($this->Picture,$C_White); - + echo "after imagecolortransparent"; $this->setFontProperties("tahoma.ttf",8); } From 45fd079c9cf51f25fbcd8fd874255a54e861dbe7 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Tue, 6 Jul 2010 22:23:34 +0300 Subject: [PATCH 26/80] debug on the demo server --- libraries/chart/pChart/pChart.class | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/chart/pChart/pChart.class b/libraries/chart/pChart/pChart.class index d2b43311c..169040e26 100644 --- a/libraries/chart/pChart/pChart.class +++ b/libraries/chart/pChart/pChart.class @@ -199,6 +199,8 @@ $this->XSize = $XSize; $this->YSize = $YSize; echo "before imagecreatetruecolor\n"; + echo "php version:".phpversion(); + var_dump(gd_info()); $this->Picture = imagecreatetruecolor($XSize,$YSize); echo "before this->AllocateColor\n"; $C_White =$this->AllocateColor($this->Picture,255,255,255); From 7958e84fffcc464e4a92512e37609c3340a9485b Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Tue, 6 Jul 2010 23:26:36 +0300 Subject: [PATCH 27/80] debug on the demo server --- libraries/chart/pChart/pChart.class | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/chart/pChart/pChart.class b/libraries/chart/pChart/pChart.class index 169040e26..9acbdafcf 100644 --- a/libraries/chart/pChart/pChart.class +++ b/libraries/chart/pChart/pChart.class @@ -200,7 +200,7 @@ $this->YSize = $YSize; echo "before imagecreatetruecolor\n"; echo "php version:".phpversion(); - var_dump(gd_info()); + var_dump(function_exists('gd_info')); $this->Picture = imagecreatetruecolor($XSize,$YSize); echo "before this->AllocateColor\n"; $C_White =$this->AllocateColor($this->Picture,255,255,255); From d387343ee00115b046572ab2757dce044364503d Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Wed, 7 Jul 2010 09:29:29 +0300 Subject: [PATCH 28/80] removed debug info added check for gd library --- libraries/chart/pChart/pChart.class | 7 ------- libraries/chart/pma_pchart_chart.php | 18 +++++++++--------- libraries/chart/pma_pchart_pie.php | 11 +---------- 3 files changed, 10 insertions(+), 26 deletions(-) diff --git a/libraries/chart/pChart/pChart.class b/libraries/chart/pChart/pChart.class index 9acbdafcf..6d521a2d7 100644 --- a/libraries/chart/pChart/pChart.class +++ b/libraries/chart/pChart/pChart.class @@ -198,17 +198,10 @@ { $this->XSize = $XSize; $this->YSize = $YSize; - echo "before imagecreatetruecolor\n"; - echo "php version:".phpversion(); - var_dump(function_exists('gd_info')); $this->Picture = imagecreatetruecolor($XSize,$YSize); - echo "before this->AllocateColor\n"; $C_White =$this->AllocateColor($this->Picture,255,255,255); - echo "before imagefilledrectangle\n"; imagefilledrectangle($this->Picture,0,0,$XSize,$YSize,$C_White); - echo "before imagecolortransparent"; imagecolortransparent($this->Picture,$C_White); - echo "after imagecolortransparent"; $this->setFontProperties("tahoma.ttf",8); } diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php index 3c6648ad4..dd83fd91a 100644 --- a/libraries/chart/pma_pchart_chart.php +++ b/libraries/chart/pma_pchart_chart.php @@ -33,26 +33,26 @@ abstract class PMA_pChart_Chart extends PMA_Chart protected function render() { - echo "before ob_start"; ob_start(); imagepng($this->chart->Picture); $output = ob_get_contents(); ob_end_clean(); - echo "after ob_end_clean"; $this->imageEncoded = base64_encode($output); } public function toString() { - $this->prepareDataSet(); - echo "after neprepareDataSetw"; - $this->prepareChart(); - echo "after prepareChart"; - $this->render(); - echo "after render"; + if (function_exists('gd_info')) { + $this->prepareDataSet(); + $this->prepareChart(); + $this->render(); - return ''; + return ''; + } + else { + return 'Missing GD library.'; + } } protected function getFontPath() diff --git a/libraries/chart/pma_pchart_pie.php b/libraries/chart/pma_pchart_pie.php index c12a0dcdd..418dab7a0 100644 --- a/libraries/chart/pma_pchart_pie.php +++ b/libraries/chart/pma_pchart_pie.php @@ -25,9 +25,7 @@ class PMA_pChart_Pie extends PMA_pChart_Chart protected function prepareChart() { // Initialise the graph - echo "before new\n"; $this->chart = new pChart($this->getWidth(), $this->getHeight()); - echo "after new\n"; foreach ($this->getColors() as $key => $color) { $this->chart->setColorPalette( $key, @@ -36,9 +34,7 @@ class PMA_pChart_Pie extends PMA_pChart_Chart hexdec(substr($color, 5, 2)) ); } - echo "after palette\n"; $this->chart->setFontProperties($this->getFontPath().'tahoma.ttf', 8); - echo "after font\n"; $this->chart->drawFilledRoundedRectangle( $this->getBorder1Width(), $this->getBorder1Width(), @@ -49,28 +45,23 @@ class PMA_pChart_Pie extends PMA_pChart_Chart $this->getBgColorComp(1), $this->getBgColorComp(2) ); - echo "after drawFilledRoundedRectangle\n"; $this->chart->drawRoundedRectangle( $this->getBorder2Width(), $this->getBorder2Width(), $this->getWidth() - $this->getBorder2Width(), $this->getHeight() - $this->getBorder2Width(), 5,0,0,0); - echo "after drawRoundedRectangle\n"; - + // Draw the pie chart $this->chart->AntialiasQuality = 0; $this->chart->setShadowProperties(2,2,200,200,200); //$Test->drawFlatPieGraphWithShadow($DataSet->GetData(),$DataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,8); //$Test->drawBasicPieGraph($DataSet->GetData(),$DataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,255,255,218,2); $this->chart->drawPieGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,FALSE,60,30,10,1); - echo "after drawPieGraph\n"; $this->chart->clearShadow(); $this->chart->drawTitle(20,20,$this->titleText,0,0,0); - echo "after drawTitle\n"; $this->chart->drawPieLegend(350,15,$this->dataSet->GetData(),$this->dataSet->GetDataDescription(),250,250,250); - echo "after drawPieLegend\n"; } protected function getBorder1Width() From 09a7a4c9126d0a4175c047c44eab437347889218 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Wed, 7 Jul 2010 13:51:30 +0300 Subject: [PATCH 29/80] added error messaged --- libraries/chart.lib.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index 8c41e62eb..3e81345c2 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -68,7 +68,7 @@ function PMA_chart_results($data, &$chartSettings) if (!isset($data[0])) { // empty data - return; + return __('No data found for the chart.'); } if (count($data[0]) == 2) { @@ -126,7 +126,7 @@ function PMA_chart_results($data, &$chartSettings) } else { // unknown data - return; + return __('Unknown data format.'); } $chartSettings = $chart->getSettings(); From 31622c3f83cb75bca67a171ac31bddb3290a798b Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Wed, 7 Jul 2010 16:34:02 +0300 Subject: [PATCH 30/80] added getPieLegendBoxSize($Data) method --- libraries/chart/pChart/pChart.class | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/libraries/chart/pChart/pChart.class b/libraries/chart/pChart/pChart.class index 6d521a2d7..947f3ef6f 100644 --- a/libraries/chart/pChart/pChart.class +++ b/libraries/chart/pChart/pChart.class @@ -975,6 +975,23 @@ return(array($MaxWidth,$MaxHeight)); } + function getPieLegendBoxSize($Data) + { + $MaxWidth = 0; $MaxHeight = 8; + foreach($Data as $Value) + { + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value['Keys']); + $TextWidth = $Position[2]-$Position[0]; + $TextHeight = $Position[1]-$Position[7]; + if ( $TextWidth > $MaxWidth) { $MaxWidth = $TextWidth; } + $MaxHeight = $MaxHeight + $TextHeight + 4; + } + $MaxHeight = $MaxHeight - 3; + $MaxWidth = $MaxWidth + 32; + + return(array($MaxWidth,$MaxHeight)); + } + /* Draw the data legends */ function drawLegend($XPos,$YPos,$DataDescription,$R,$G,$B,$Rs=-1,$Gs=-1,$Bs=-1,$Rt=0,$Gt=0,$Bt=0,$Border=TRUE) { From e22cd9aab4dfcb3714aae10b949f8819f4e4e248 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Wed, 7 Jul 2010 16:37:09 +0300 Subject: [PATCH 31/80] Restructured code. This allows more chart types and removes some code duplication. Added line charts. --- libraries/chart.lib.php | 35 ++++++++- libraries/chart/pma_pchart_bar.php | 88 --------------------- libraries/chart/pma_pchart_chart.php | 91 +++++++++++++++++++++- libraries/chart/pma_pchart_multi.php | 80 +++++++++++++++++++ libraries/chart/pma_pchart_multi_line.php | 24 ++++++ libraries/chart/pma_pchart_pie.php | 74 +++++++----------- libraries/chart/pma_pchart_single.php | 43 ++++++++++ libraries/chart/pma_pchart_single_bar.php | 21 +++++ libraries/chart/pma_pchart_single_line.php | 20 +++++ libraries/chart/pma_pchart_stacked.php | 82 ------------------- libraries/chart/pma_pchart_stacked_bar.php | 21 +++++ tbl_chart.php | 12 ++- 12 files changed, 365 insertions(+), 226 deletions(-) delete mode 100644 libraries/chart/pma_pchart_bar.php create mode 100644 libraries/chart/pma_pchart_multi.php create mode 100644 libraries/chart/pma_pchart_multi_line.php create mode 100644 libraries/chart/pma_pchart_single.php create mode 100644 libraries/chart/pma_pchart_single_bar.php create mode 100644 libraries/chart/pma_pchart_single_line.php delete mode 100644 libraries/chart/pma_pchart_stacked.php create mode 100644 libraries/chart/pma_pchart_stacked_bar.php diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index 3e81345c2..e135a7193 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -3,8 +3,10 @@ require_once './libraries/chart/pma_ofc_pie.php'; require_once './libraries/chart/pma_pchart_pie.php'; -require_once './libraries/chart/pma_pchart_bar.php'; -require_once './libraries/chart/pma_pchart_stacked.php'; +require_once './libraries/chart/pma_pchart_single_bar.php'; +require_once './libraries/chart/pma_pchart_stacked_bar.php'; +require_once './libraries/chart/pma_pchart_single_line.php'; +require_once './libraries/chart/pma_pchart_multi_line.php'; /** * Chart functions used to generate various types @@ -59,6 +61,8 @@ function PMA_chart_results($data, &$chartSettings) { $chartData = array(); $chart = null; + + // set default title if not already set if (!empty($chartSettings['title'])) { $chartTitle = $chartSettings['title']; } @@ -66,6 +70,11 @@ function PMA_chart_results($data, &$chartSettings) $chartTitle = __('Query results'); } + // set default type if not already set + if (empty($chartSettings['type'])) { + $chartSettings['type'] = 'bar'; + } + if (!isset($data[0])) { // empty data return __('No data found for the chart.'); @@ -83,7 +92,16 @@ function PMA_chart_results($data, &$chartSettings) } } - $chart = new PMA_pChart_bar($chartTitle, $chartData, $chartSettings); + switch ($chartSettings['type']) + { + case 'bar': + default: + $chart = new PMA_pChart_single_bar($chartTitle, $chartData, $chartSettings); + break; + case 'line': + $chart = new PMA_pChart_single_line($chartTitle, $chartData, $chartSettings); + break; + } } else if (count($data[0]) == 3) { // Three columns (x axis, y axis, series) in every row. @@ -122,7 +140,16 @@ function PMA_chart_results($data, &$chartSettings) } } - $chart = new PMA_pChart_stacked($chartTitle, $chartData, $chartSettings); + switch ($chartSettings['type']) + { + case 'bar': + default: + $chart = new PMA_pChart_stacked_bar($chartTitle, $chartData, $chartSettings); + break; + case 'line': + $chart = new PMA_pChart_multi_line($chartTitle, $chartData, $chartSettings); + break; + } } else { // unknown data diff --git a/libraries/chart/pma_pchart_bar.php b/libraries/chart/pma_pchart_bar.php deleted file mode 100644 index d8947f83d..000000000 --- a/libraries/chart/pma_pchart_bar.php +++ /dev/null @@ -1,88 +0,0 @@ -settings['labelHeight'] = 20; - - // as in CSS (top, right, bottom, left) - $this->settings['areaMargins'] = array(20, 20, 40, 60); - } - - protected function prepareDataSet() - { - $values = array_values($this->data); - $keys = array_keys($this->data); - - // Dataset definition - $this->dataSet = new pData; - $this->dataSet->AddPoint($values[1], "Values"); - $this->dataSet->AddPoint($values[0], "Keys"); - $this->dataSet->AddAllSeries(); - //$DataSet->RemoveSerie("Serie3"); - $this->dataSet->SetAbsciseLabelSerie("Keys"); - - $xLabel = $this->getXLabel(); - if (empty($xLabel)) { - $xLabel = $keys[0]; - } - $this->dataSet->SetXAxisName($xLabel); - - $yLabel = $this->getYLabel(); - if (empty($yLabel)) { - $yLabel = $keys[1]; - } - $this->dataSet->SetYAxisName($yLabel); - //$DataSet->SetYAxisUnit("°C"); - //$DataSet->SetXAxisUnit("h"); - } - - protected function prepareChart() - { - // Initialise the graph - $this->chart = new pChart($this->getWidth(), $this->getHeight()); - $this->chart->drawGraphAreaGradient(132,173,131,50,TARGET_BACKGROUND); - - $this->chart->setFontProperties($this->getFontPath().'tahoma.ttf', 8); - $this->chart->setGraphArea( - $this->getAreaMargin(LEFT), - $this->getLabelHeight() + $this->getAreaMargin(TOP), - $this->getWidth() - $this->getAreaMargin(RIGHT), - $this->getHeight() - $this->getAreaMargin(BOTTOM) - ); - $this->chart->drawGraphArea(213,217,221,FALSE); - $this->chart->drawScale($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),SCALE_ADDALL,213,217,221,TRUE,0,2,TRUE); - $this->chart->drawGraphAreaGradient(163,203,167,50); - $this->chart->drawGrid(4,TRUE,230,230,230,20); - - // Draw the bar chart - $this->chart->drawStackedBarGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),70); - - // Draw the title - $this->chart->drawTextBox(0,0,$this->getWidth(),$this->getLabelHeight(),$this->titleText,0,255,255,255,ALIGN_CENTER,TRUE,0,0,0,30); - - $this->chart->addBorder(2); - } - - protected function getLabelHeight() - { - return $this->settings['labelHeight']; - } - - protected function getAreaMargin($side) - { - return $this->settings['areaMargins'][$side]; - } -} - -?> diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php index dd83fd91a..dce0faf74 100644 --- a/libraries/chart/pma_pchart_chart.php +++ b/libraries/chart/pma_pchart_chart.php @@ -1,5 +1,10 @@ data = $data; $this->settings['fontPath'] = './libraries/chart/pChart/fonts/'; + + $this->settings['scale'] = SCALE_ADDALLSTART0; + + $this->settings['labelHeight'] = 20; + + // as in CSS (top, right, bottom, left) + $this->settings['areaMargins'] = array(20, 20, 40, 60); + + // create pChart object + $this->chart = new pChart($this->getWidth(), $this->getHeight()); + + // create pData object + $this->dataSet = new pData; + + // initialize colors + foreach ($this->getColors() as $key => $color) { + $this->chart->setColorPalette( + $key, + hexdec(substr($color, 1, 2)), + hexdec(substr($color, 3, 2)), + hexdec(substr($color, 5, 2)) + ); + } } abstract protected function prepareDataSet(); - abstract protected function prepareChart(); + + protected function prepareChart() + { + $this->drawBackground(); + $this->drawChart(); + } + + protected function drawBackground() + { + $this->drawCommon(); + $this->drawTitle(); + $this->setGraphAreaDimensions(); + $this->drawGraphArea(); + } + + protected function drawCommon() + { + $this->chart->setFontProperties($this->getFontPath().'tahoma.ttf', 8); + $this->chart->drawGraphAreaGradient(132,173,131,50,TARGET_BACKGROUND); + $this->chart->addBorder(2); + } + + protected function drawTitle() + { + // Draw the title + $this->chart->drawTextBox(0,0,$this->getWidth(),$this->getLabelHeight(),$this->titleText,0,255,255,255,ALIGN_CENTER,TRUE,0,0,0,30); + } + + protected function setGraphAreaDimensions() + { + $this->chart->setGraphArea( + $this->getAreaMargin(LEFT), + $this->getLabelHeight() + $this->getAreaMargin(TOP), + $this->getWidth() - $this->getAreaMargin(RIGHT), + $this->getHeight() - $this->getAreaMargin(BOTTOM) + ); + } + + protected function drawGraphArea() + { + $this->chart->drawGraphArea(213,217,221,FALSE); + $this->chart->drawScale($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),$this->getScale(),213,217,221,TRUE,0,2,TRUE); + $this->chart->drawGraphAreaGradient(163,203,167,50); + $this->chart->drawGrid(4,TRUE,230,230,230,20); + } + + protected abstract function drawChart(); protected function render() { @@ -55,10 +129,25 @@ abstract class PMA_pChart_Chart extends PMA_Chart } } + protected function getLabelHeight() + { + return $this->settings['labelHeight']; + } + + protected function getAreaMargin($side) + { + return $this->settings['areaMargins'][$side]; + } + protected function getFontPath() { return $this->settings['fontPath']; } + + protected function getScale() + { + return $this->settings['scale']; + } } ?> diff --git a/libraries/chart/pma_pchart_multi.php b/libraries/chart/pma_pchart_multi.php new file mode 100644 index 000000000..0be03bf38 --- /dev/null +++ b/libraries/chart/pma_pchart_multi.php @@ -0,0 +1,80 @@ +settings['legendMargins'] = array(20, 10, 0, 0); + } + + protected function prepareDataSet() + { + $values = array_values($this->data); + $keys = array_keys($this->data); + + // Dataset definition + $this->dataSet->AddPoint($values[0], "Keys"); + + $i = 0; + foreach ($values[1] as $seriesName => $seriesData) { + $this->dataSet->AddPoint($seriesData, "Values".$i); + $this->dataSet->SetSerieName($seriesName, "Values".$i); + $i++; + } + $this->dataSet->AddAllSeries(); + + $this->dataSet->RemoveSerie("Keys"); + $this->dataSet->SetAbsciseLabelSerie("Keys"); + + $this->dataSet->SetXAxisName($keys[0]); + $this->dataSet->SetYAxisName($keys[1]); + } + + protected function setGraphAreaDimensions() + { + $this->chart->setGraphArea( + $this->getAreaMargin(LEFT), + $this->getLabelHeight() + $this->getAreaMargin(TOP), + $this->getWidth() - $this->getAreaMargin(RIGHT) - $this->getLegendBoxWidth() - $this->getLegendMargin(LEFT) - $this->getLegendMargin(RIGHT), + $this->getHeight() - $this->getAreaMargin(BOTTOM) + ); + } + + protected function drawChart() + { + $this->drawLegend(); + } + + protected function drawLegend() + { + // Draw the legend + $this->chart->drawLegend( + $this->getWidth() - $this->getLegendMargin(RIGHT) - $this->getLegendBoxWidth(), + $this->getLabelHeight() + $this->getLegendMargin(TOP), + $this->dataSet->GetDataDescription(), + 250,250,250,50,50,50 + ); + } + + protected function getLegendMargin($side) + { + return $this->settings['legendMargins'][$side]; + } + + protected function getLegendBoxWidth() + { + $legendSize = $this->chart->getLegendBoxSize($this->dataSet->GetDataDescription()); + return $legendSize[0]; + } +} + +?> diff --git a/libraries/chart/pma_pchart_multi_line.php b/libraries/chart/pma_pchart_multi_line.php new file mode 100644 index 000000000..7c10b6c0a --- /dev/null +++ b/libraries/chart/pma_pchart_multi_line.php @@ -0,0 +1,24 @@ +settings['scale'] = SCALE_NORMAL; + } + + protected function drawChart() + { + parent::drawChart(); + + // Draw the bar chart + $this->chart->drawLineGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription()); + $this->chart->drawPlotGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),4,2,-1,-1,-1,TRUE); + } +} + +?> diff --git a/libraries/chart/pma_pchart_pie.php b/libraries/chart/pma_pchart_pie.php index 418dab7a0..1dbef08d6 100644 --- a/libraries/chart/pma_pchart_pie.php +++ b/libraries/chart/pma_pchart_pie.php @@ -1,77 +1,55 @@ settings['border1Width'] = 7; - $this->settings['border2Width'] = 8; + $this->settings['areaMargins'] = array(20, 20, 20, 10); } protected function prepareDataSet() { // Dataset definition - $this->dataSet = new pData; $this->dataSet->AddPoint(array_values($this->data),"Values"); $this->dataSet->AddPoint(array_keys($this->data),"Keys"); $this->dataSet->AddAllSeries(); $this->dataSet->SetAbsciseLabelSerie("Keys"); } - protected function prepareChart() + protected function drawGraphArea() { - // Initialise the graph - $this->chart = new pChart($this->getWidth(), $this->getHeight()); - foreach ($this->getColors() as $key => $color) { - $this->chart->setColorPalette( - $key, - hexdec(substr($color, 1, 2)), - hexdec(substr($color, 3, 2)), - hexdec(substr($color, 5, 2)) - ); - } - $this->chart->setFontProperties($this->getFontPath().'tahoma.ttf', 8); - $this->chart->drawFilledRoundedRectangle( - $this->getBorder1Width(), - $this->getBorder1Width(), - $this->getWidth() - $this->getBorder1Width(), - $this->getHeight() - $this->getBorder1Width(), - 5, - $this->getBgColorComp(0), - $this->getBgColorComp(1), - $this->getBgColorComp(2) - ); - $this->chart->drawRoundedRectangle( - $this->getBorder2Width(), - $this->getBorder2Width(), - $this->getWidth() - $this->getBorder2Width(), - $this->getHeight() - $this->getBorder2Width(), - 5,0,0,0); - - // Draw the pie chart - $this->chart->AntialiasQuality = 0; - $this->chart->setShadowProperties(2,2,200,200,200); - //$Test->drawFlatPieGraphWithShadow($DataSet->GetData(),$DataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,8); - //$Test->drawBasicPieGraph($DataSet->GetData(),$DataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,255,255,218,2); - $this->chart->drawPieGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,FALSE,60,30,10,1); - $this->chart->clearShadow(); - - $this->chart->drawTitle(20,20,$this->titleText,0,0,0); - $this->chart->drawPieLegend(350,15,$this->dataSet->GetData(),$this->dataSet->GetDataDescription(),250,250,250); + $this->chart->drawGraphArea(213,217,221,FALSE); + $this->chart->drawGraphAreaGradient(163,203,167,50); } - protected function getBorder1Width() + protected function drawChart() { - return $this->settings['border1Width']; + parent::drawChart(); + + $this->chart->drawPieGraph( + $this->dataSet->GetData(), + $this->dataSet->GetDataDescription(), + 180,160,120,PIE_PERCENTAGE,FALSE,60,30,10,1); } - protected function getBorder2Width() + protected function drawLegend() { - return $this->settings['border2Width']; + $this->chart->drawPieLegend( + $this->getWidth() - $this->getLegendMargin(RIGHT) - $this->getLegendBoxWidth(), + $this->getLabelHeight() + $this->getLegendMargin(TOP), + $this->dataSet->GetData(), + $this->dataSet->GetDataDescription(), + 250,250,250); + } + + protected function getLegendBoxWidth() + { + $legendSize = $this->chart->getPieLegendBoxSize($this->dataSet->GetData()); + return $legendSize[0]; } } diff --git a/libraries/chart/pma_pchart_single.php b/libraries/chart/pma_pchart_single.php new file mode 100644 index 000000000..a1b45e029 --- /dev/null +++ b/libraries/chart/pma_pchart_single.php @@ -0,0 +1,43 @@ +data); + $keys = array_keys($this->data); + + // Dataset definition + $this->dataSet->AddPoint($values[1], "Values"); + $this->dataSet->AddPoint($values[0], "Keys"); + $this->dataSet->AddAllSeries(); + //$DataSet->RemoveSerie("Serie3"); + $this->dataSet->SetAbsciseLabelSerie("Keys"); + + $xLabel = $this->getXLabel(); + if (empty($xLabel)) { + $xLabel = $keys[0]; + } + $this->dataSet->SetXAxisName($xLabel); + + $yLabel = $this->getYLabel(); + if (empty($yLabel)) { + $yLabel = $keys[1]; + } + $this->dataSet->SetYAxisName($yLabel); + //$DataSet->SetYAxisUnit("°C"); + //$DataSet->SetXAxisUnit("h"); + } +} + +?> diff --git a/libraries/chart/pma_pchart_single_bar.php b/libraries/chart/pma_pchart_single_bar.php new file mode 100644 index 000000000..1005a1ea5 --- /dev/null +++ b/libraries/chart/pma_pchart_single_bar.php @@ -0,0 +1,21 @@ +chart->drawStackedBarGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),70); + //$this->chart->drawLineGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription()); + //$this->chart->drawPlotGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),4,2,-1,-1,-1,TRUE); + } +} + +?> diff --git a/libraries/chart/pma_pchart_single_line.php b/libraries/chart/pma_pchart_single_line.php new file mode 100644 index 000000000..8bf55de58 --- /dev/null +++ b/libraries/chart/pma_pchart_single_line.php @@ -0,0 +1,20 @@ +chart->drawLineGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription()); + $this->chart->drawPlotGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),4,2,-1,-1,-1,TRUE); + } +} + +?> diff --git a/libraries/chart/pma_pchart_stacked.php b/libraries/chart/pma_pchart_stacked.php deleted file mode 100644 index d3fae5195..000000000 --- a/libraries/chart/pma_pchart_stacked.php +++ /dev/null @@ -1,82 +0,0 @@ -settings['legendLeftMargin'] = 10; - } - - protected function prepareDataSet() - { - $values = array_values($this->data); - $keys = array_keys($this->data); - - // Dataset definition - $this->dataSet = new pData; - $this->dataSet->AddPoint($values[0], "Keys"); - - $i = 0; - foreach ($values[1] as $seriesName => $seriesData) { - $this->dataSet->AddPoint($seriesData, "Values".$i); - $this->dataSet->SetSerieName($seriesName, "Values".$i); - $i++; - } - $this->dataSet->AddAllSeries(); - - $this->dataSet->RemoveSerie("Keys"); - $this->dataSet->SetAbsciseLabelSerie("Keys"); - - $this->dataSet->SetXAxisName($keys[0]); - $this->dataSet->SetYAxisName($keys[1]); - } - - protected function prepareChart() - { - // Initialise the graph - $this->chart = new pChart($this->getWidth(), $this->getHeight()); - $this->chart->drawGraphAreaGradient(132,173,131,50,TARGET_BACKGROUND); - - $this->chart->setFontProperties($this->getFontPath().'tahoma.ttf', 8); - - $legendSize = $this->chart->getLegendBoxSize($this->dataSet->GetDataDescription()); - - $this->chart->setGraphArea( - $this->getAreaMargin(LEFT), - $this->getLabelHeight() + $this->getAreaMargin(TOP), - $this->getWidth() - $this->getAreaMargin(RIGHT) - $legendSize[0], - $this->getHeight() - $this->getAreaMargin(BOTTOM) - ); - $this->chart->drawGraphArea(213,217,221,FALSE); - $this->chart->drawScale($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),SCALE_ADDALLSTART0,213,217,221,TRUE,0,2,TRUE); - $this->chart->drawGraphAreaGradient(163,203,167,50); - $this->chart->drawGrid(4,TRUE,230,230,230,20); - - // Draw the bar chart - $this->chart->drawStackedBarGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),70); - - // Draw the title - $this->chart->drawTextBox(0,0,$this->getWidth(),$this->getLabelHeight(),$this->titleText,0,255,255,255,ALIGN_CENTER,TRUE,0,0,0,30); - - // Draw the legend - $this->chart->drawLegend( - $this->getWidth() - $this->getAreaMargin(RIGHT) - $legendSize[0] + $this->getLegendMargin(LEFT), - $this->getLabelHeight() + $this->getAreaMargin(TOP), - $this->dataSet->GetDataDescription(), - 250,250,250,50,50,50 - ); - - $this->chart->addBorder(2); - } - - protected function getLegendMargin($side) - { - return $this->settings['legendLeftMargin']; - } -} - -?> diff --git a/libraries/chart/pma_pchart_stacked_bar.php b/libraries/chart/pma_pchart_stacked_bar.php new file mode 100644 index 000000000..53575058d --- /dev/null +++ b/libraries/chart/pma_pchart_stacked_bar.php @@ -0,0 +1,21 @@ +chart->drawStackedBarGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),70); + } +} + +?> diff --git a/tbl_chart.php b/tbl_chart.php index 6aae9844f..11f2d7340 100644 --- a/tbl_chart.php +++ b/tbl_chart.php @@ -88,15 +88,21 @@ $url_params['reload'] = 1; - + - + - + + + + + >Bar + >Line + From 2e421895edf8cb8557ec2c12158c96a8e2ab6d73 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Wed, 7 Jul 2010 16:57:06 +0300 Subject: [PATCH 32/80] using background color setting now --- libraries/chart/pma_chart.php | 8 ++++++-- libraries/chart/pma_pchart_chart.php | 10 +++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/libraries/chart/pma_chart.php b/libraries/chart/pma_chart.php index 357dafa4a..d31f97f33 100644 --- a/libraries/chart/pma_chart.php +++ b/libraries/chart/pma_chart.php @@ -1,5 +1,9 @@ '#E5E5E5', + 'bgColor' => '#84AD83', /* * The width of the chart. @@ -103,7 +107,7 @@ class PMA_Chart return $this->settings['height']; } - function getBgColorComp($component) + function getBgColor($component) { return hexdec(substr($this->settings['bgColor'], ($component * 2) + 1, 2)); } diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php index dce0faf74..10c19c8dc 100644 --- a/libraries/chart/pma_pchart_chart.php +++ b/libraries/chart/pma_pchart_chart.php @@ -7,8 +7,8 @@ define('LEFT', 3); require_once 'pma_chart.php'; -include "pChart/pData.class"; -include "pChart/pChart.class"; +require_once 'pChart/pData.class'; +require_once 'pChart/pChart.class'; /* * Base class for every chart implemented using pChart. @@ -75,7 +75,11 @@ abstract class PMA_pChart_Chart extends PMA_Chart protected function drawCommon() { $this->chart->setFontProperties($this->getFontPath().'tahoma.ttf', 8); - $this->chart->drawGraphAreaGradient(132,173,131,50,TARGET_BACKGROUND); + $this->chart->drawGraphAreaGradient( + $this->getBgColor(RED), + $this->getBgColor(GREEN), + $this->getBgColor(BLUE), + 50,TARGET_BACKGROUND); $this->chart->addBorder(2); } From c530e97fb7a7cc28eebd410c39c11c0786b6eea8 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Wed, 7 Jul 2010 16:57:30 +0300 Subject: [PATCH 33/80] decreased the size of the points in the line chart --- libraries/chart/pma_pchart_multi_line.php | 2 +- libraries/chart/pma_pchart_single_line.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/chart/pma_pchart_multi_line.php b/libraries/chart/pma_pchart_multi_line.php index 7c10b6c0a..078728470 100644 --- a/libraries/chart/pma_pchart_multi_line.php +++ b/libraries/chart/pma_pchart_multi_line.php @@ -17,7 +17,7 @@ class PMA_pChart_multi_line extends PMA_pChart_multi // Draw the bar chart $this->chart->drawLineGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription()); - $this->chart->drawPlotGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),4,2,-1,-1,-1,TRUE); + $this->chart->drawPlotGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),3,1,-1,-1,-1,TRUE); } } diff --git a/libraries/chart/pma_pchart_single_line.php b/libraries/chart/pma_pchart_single_line.php index 8bf55de58..b5f86ffbf 100644 --- a/libraries/chart/pma_pchart_single_line.php +++ b/libraries/chart/pma_pchart_single_line.php @@ -13,7 +13,7 @@ class PMA_pChart_single_line extends PMA_pChart_single { // Draw the line chart $this->chart->drawLineGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription()); - $this->chart->drawPlotGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),4,2,-1,-1,-1,TRUE); + $this->chart->drawPlotGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),3,1,-1,-1,-1,TRUE); } } From 4d6fd853d341fcacd3bbdb878cba821a514cd5de Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Wed, 7 Jul 2010 17:41:45 +0300 Subject: [PATCH 34/80] Added multi bar chart. Added margin options. --- libraries/chart.lib.php | 30 +++++++++++++++++++---- libraries/chart/pma_pchart_chart.php | 9 ++++++- libraries/chart/pma_pchart_multi.php | 9 ++++++- libraries/chart/pma_pchart_multi_bar.php | 23 ++++++++++++++++++ tbl_chart.php | 31 ++++++++++++++++++++++++ 5 files changed, 95 insertions(+), 7 deletions(-) create mode 100644 libraries/chart/pma_pchart_multi_bar.php diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index e135a7193..b245b2a4a 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -4,6 +4,7 @@ require_once './libraries/chart/pma_ofc_pie.php'; require_once './libraries/chart/pma_pchart_pie.php'; require_once './libraries/chart/pma_pchart_single_bar.php'; +require_once './libraries/chart/pma_pchart_multi_bar.php'; require_once './libraries/chart/pma_pchart_stacked_bar.php'; require_once './libraries/chart/pma_pchart_single_line.php'; require_once './libraries/chart/pma_pchart_multi_line.php'; @@ -75,6 +76,11 @@ function PMA_chart_results($data, &$chartSettings) $chartSettings['type'] = 'bar'; } + // set default bar type if needed + if ($chartSettings['type'] == 'bar' && empty($chartSettings['barType'])) { + $chartSettings['barType'] = 'stacked'; + } + if (!isset($data[0])) { // empty data return __('No data found for the chart.'); @@ -92,8 +98,9 @@ function PMA_chart_results($data, &$chartSettings) } } - switch ($chartSettings['type']) - { + $chartSettings['multi'] = false; + + switch ($chartSettings['type']) { case 'bar': default: $chart = new PMA_pChart_single_bar($chartTitle, $chartData, $chartSettings); @@ -140,12 +147,25 @@ function PMA_chart_results($data, &$chartSettings) } } - switch ($chartSettings['type']) - { + $chartSettings['multi'] = true; + + // determine the chart type + switch ($chartSettings['type']) { case 'bar': default: - $chart = new PMA_pChart_stacked_bar($chartTitle, $chartData, $chartSettings); + + // determine the bar chart type + switch ($chartSettings['barType']) { + case 'stacked': + default: + $chart = new PMA_pChart_stacked_bar($chartTitle, $chartData, $chartSettings); + break; + case 'multi': + $chart = new PMA_pChart_multi_bar($chartTitle, $chartData, $chartSettings); + break; + } break; + case 'line': $chart = new PMA_pChart_multi_line($chartTitle, $chartData, $chartSettings); break; diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php index 10c19c8dc..57f10fd69 100644 --- a/libraries/chart/pma_pchart_chart.php +++ b/libraries/chart/pma_pchart_chart.php @@ -37,7 +37,7 @@ abstract class PMA_pChart_Chart extends PMA_Chart $this->settings['labelHeight'] = 20; // as in CSS (top, right, bottom, left) - $this->settings['areaMargins'] = array(20, 20, 40, 60); + $this->setAreaMargins(array(20, 20, 40, 60)); // create pChart object $this->chart = new pChart($this->getWidth(), $this->getHeight()); @@ -138,6 +138,13 @@ abstract class PMA_pChart_Chart extends PMA_Chart return $this->settings['labelHeight']; } + protected function setAreaMargins($areaMargins) + { + if (!isset($this->settings['areaMargins'])) { + $this->settings['areaMargins'] = $areaMargins; + } + } + protected function getAreaMargin($side) { return $this->settings['areaMargins'][$side]; diff --git a/libraries/chart/pma_pchart_multi.php b/libraries/chart/pma_pchart_multi.php index 0be03bf38..b4f67db40 100644 --- a/libraries/chart/pma_pchart_multi.php +++ b/libraries/chart/pma_pchart_multi.php @@ -13,7 +13,7 @@ abstract class PMA_pChart_multi extends PMA_pChart_chart parent::__construct($titleText, $data, $options); // as in CSS (top, right, bottom, left) - $this->settings['legendMargins'] = array(20, 10, 0, 0); + $this->setLegendMargins(array(20, 10, 0, 0)); } protected function prepareDataSet() @@ -65,6 +65,13 @@ abstract class PMA_pChart_multi extends PMA_pChart_chart ); } + protected function setLegendMargins($legendMargins) + { + if (!isset($this->settings['legendMargins'])) { + $this->settings['legendMargins'] = $legendMargins; + } + } + protected function getLegendMargin($side) { return $this->settings['legendMargins'][$side]; diff --git a/libraries/chart/pma_pchart_multi_bar.php b/libraries/chart/pma_pchart_multi_bar.php new file mode 100644 index 000000000..194ba2cc7 --- /dev/null +++ b/libraries/chart/pma_pchart_multi_bar.php @@ -0,0 +1,23 @@ +settings['scale'] = SCALE_NORMAL; + } + + protected function drawChart() + { + parent::drawChart(); + + // Draw the bar chart + $this->chart->drawBarGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),70); + } +} + +?> diff --git a/tbl_chart.php b/tbl_chart.php index 11f2d7340..dffd4fae0 100644 --- a/tbl_chart.php +++ b/tbl_chart.php @@ -98,12 +98,43 @@ $url_params['reload'] = 1; + + + + + + + + + + + + + + + + + + + + + >Bar >Line + + + + + >Stacked + >Multi + + + + From 933238bcfb258a2f3b7276e804a13b1c4cd27c62 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Thu, 8 Jul 2010 11:24:49 +0300 Subject: [PATCH 35/80] fixed a bug where GD function was used before the check if GD is available. --- libraries/chart/pma_pchart_chart.php | 11 ++++++++--- libraries/chart/pma_pchart_single_bar.php | 2 -- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php index 57f10fd69..e9485fca1 100644 --- a/libraries/chart/pma_pchart_chart.php +++ b/libraries/chart/pma_pchart_chart.php @@ -38,7 +38,10 @@ abstract class PMA_pChart_Chart extends PMA_Chart // as in CSS (top, right, bottom, left) $this->setAreaMargins(array(20, 20, 40, 60)); + } + protected function init() + { // create pChart object $this->chart = new pChart($this->getWidth(), $this->getHeight()); @@ -54,6 +57,8 @@ abstract class PMA_pChart_Chart extends PMA_Chart hexdec(substr($color, 5, 2)) ); } + + $this->chart->setFontProperties($this->getFontPath().'tahoma.ttf', 8); } abstract protected function prepareDataSet(); @@ -74,7 +79,6 @@ abstract class PMA_pChart_Chart extends PMA_Chart protected function drawCommon() { - $this->chart->setFontProperties($this->getFontPath().'tahoma.ttf', 8); $this->chart->drawGraphAreaGradient( $this->getBgColor(RED), $this->getBgColor(GREEN), @@ -122,14 +126,15 @@ abstract class PMA_pChart_Chart extends PMA_Chart public function toString() { if (function_exists('gd_info')) { + $this->init(); $this->prepareDataSet(); $this->prepareChart(); $this->render(); - return ''; + return ''; } else { - return 'Missing GD library.'; + return __('GD library needed for chart is missing.'); } } diff --git a/libraries/chart/pma_pchart_single_bar.php b/libraries/chart/pma_pchart_single_bar.php index 1005a1ea5..024826af7 100644 --- a/libraries/chart/pma_pchart_single_bar.php +++ b/libraries/chart/pma_pchart_single_bar.php @@ -13,8 +13,6 @@ class PMA_pChart_single_bar extends PMA_pChart_single { // Draw the bar chart $this->chart->drawStackedBarGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),70); - //$this->chart->drawLineGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription()); - //$this->chart->drawPlotGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),4,2,-1,-1,-1,TRUE); } } From dfe34ad8d4860899c7415c94be5a0db9653860ad Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Thu, 8 Jul 2010 12:40:03 +0300 Subject: [PATCH 36/80] added chart type PIE to the query results charts --- libraries/chart.lib.php | 53 ++++++++++++++++++++---------- libraries/chart/pma_pchart_pie.php | 13 ++++++-- tbl_chart.php | 7 +++- 3 files changed, 53 insertions(+), 20 deletions(-) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index b245b2a4a..7267d6987 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -81,6 +81,12 @@ function PMA_chart_results($data, &$chartSettings) $chartSettings['barType'] = 'stacked'; } + // default for legend + $chartSettings['legend'] = false; + + // default for muti series + $chartSettings['multi'] = false; + if (!isset($data[0])) { // empty data return __('No data found for the chart.'); @@ -90,29 +96,42 @@ function PMA_chart_results($data, &$chartSettings) // Two columns in every row. // This data is suitable for a simple bar chart. - // loop through the rows - foreach ($data as $row) { - // loop through the columns in the row - foreach ($row as $key => $value) { - $chartData[$key][] = $value; + if ($chartSettings['type'] == 'pie') { + // loop through the rows, data for pie chart has to be formated + // in a different way then in other charts. + foreach ($data as $row) { + $values = array_values($row); + $chartData[$values[0]] = $values[1]; } - } - $chartSettings['multi'] = false; - - switch ($chartSettings['type']) { - case 'bar': - default: - $chart = new PMA_pChart_single_bar($chartTitle, $chartData, $chartSettings); - break; - case 'line': - $chart = new PMA_pChart_single_line($chartTitle, $chartData, $chartSettings); - break; + $chartSettings['legend'] = true; + $chart = new PMA_pChart_pie($chartTitle, $chartData, $chartSettings); } + else { + // loop through the rows + foreach ($data as $row) { + // loop through the columns in the row + foreach ($row as $key => $value) { + $chartData[$key][] = $value; + } + } + + switch ($chartSettings['type']) { + case 'bar': + default: + $chart = new PMA_pChart_single_bar($chartTitle, $chartData, $chartSettings); + break; + case 'line': + $chart = new PMA_pChart_single_line($chartTitle, $chartData, $chartSettings); + break; + } + } } else if (count($data[0]) == 3) { // Three columns (x axis, y axis, series) in every row. // This data is suitable for a stacked bar chart. + $chartSettings['multi'] = true; + $keys = array_keys($data[0]); $xAxisKey = $keys[0]; $yAxisKey = $keys[1]; @@ -147,7 +166,7 @@ function PMA_chart_results($data, &$chartSettings) } } - $chartSettings['multi'] = true; + $chartSettings['legend'] = true; // determine the chart type switch ($chartSettings['type']) { diff --git a/libraries/chart/pma_pchart_pie.php b/libraries/chart/pma_pchart_pie.php index 1dbef08d6..5e01d9a1a 100644 --- a/libraries/chart/pma_pchart_pie.php +++ b/libraries/chart/pma_pchart_pie.php @@ -8,7 +8,7 @@ class PMA_pChart_Pie extends PMA_pChart_multi { parent::__construct($titleText, $data, $options); - $this->settings['areaMargins'] = array(20, 20, 20, 10); + $this->setAreaMargins(array(20, 20, 20, 10)); } protected function prepareDataSet() @@ -30,10 +30,19 @@ class PMA_pChart_Pie extends PMA_pChart_multi { parent::drawChart(); + // draw pie chart in the middle of graph area + $middleX = ($this->chart->GArea_X1 + $this->chart->GArea_X2) / 2; + $middleY = ($this->chart->GArea_Y1 + $this->chart->GArea_Y2) / 2; + $this->chart->drawPieGraph( $this->dataSet->GetData(), $this->dataSet->GetDataDescription(), - 180,160,120,PIE_PERCENTAGE,FALSE,60,30,10,1); + $middleX, + // pie graph is skewed. Upper part is shorter than the + // lower part. This is why we set an offset to the + // Y middle coordiantes. + $middleY - 15, + 120,PIE_PERCENTAGE,FALSE,60,30,10,1); } protected function drawLegend() diff --git a/tbl_chart.php b/tbl_chart.php index dffd4fae0..22b587f91 100644 --- a/tbl_chart.php +++ b/tbl_chart.php @@ -91,6 +91,7 @@ $url_params['reload'] = 1; + @@ -98,6 +99,7 @@ $url_params['reload'] = 1; + @@ -108,7 +110,7 @@ $url_params['reload'] = 1; - + @@ -123,6 +125,9 @@ $url_params['reload'] = 1; >Bar >Line + + >Pie + From 881bd0909febd4feab6144b8547e7881808afba4 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Thu, 8 Jul 2010 13:47:29 +0300 Subject: [PATCH 37/80] added value skip option to the radar chart in pChar.class --- libraries/chart/pChart/pChart.class | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/chart/pChart/pChart.class b/libraries/chart/pChart/pChart.class index 947f3ef6f..c5f739535 100644 --- a/libraries/chart/pChart/pChart.class +++ b/libraries/chart/pChart/pChart.class @@ -2088,7 +2088,7 @@ } /* This function draw radar axis centered on the graph area */ - function drawRadarAxis($Data,$DataDescription,$Mosaic=TRUE,$BorderOffset=10,$A_R=60,$A_G=60,$A_B=60,$S_R=200,$S_G=200,$S_B=200,$MaxValue=-1) + function drawRadarAxis($Data,$DataDescription,$Mosaic=TRUE,$BorderOffset=10,$A_R=60,$A_G=60,$A_B=60,$S_R=200,$S_G=200,$S_B=200,$MaxValue=-1,$valueMod=1) { /* Validate the Data and DataDescription array */ $this->validateDataDescription("drawRadarAxis",$DataDescription); @@ -2204,6 +2204,9 @@ /* Write the values */ for ( $t=1; $t<=$MaxValue; $t++) { + if ($t % $valueMod != 0) + { continue; } + $TRadius = ( $Radius / $MaxValue ) * $t; $Angle = -90 + 360 / $Points; From f53b1a52941fa839c76356a6de80c0fd11e97519 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Thu, 8 Jul 2010 14:19:16 +0300 Subject: [PATCH 38/80] added radar chart type to the query results charts. --- libraries/chart.lib.php | 8 +++ libraries/chart/pma_pchart_multi_radar.php | 68 +++++++++++++++++++++ libraries/chart/pma_pchart_single.php | 8 +-- libraries/chart/pma_pchart_single_radar.php | 59 ++++++++++++++++++ tbl_chart.php | 3 +- 5 files changed, 141 insertions(+), 5 deletions(-) create mode 100644 libraries/chart/pma_pchart_multi_radar.php create mode 100644 libraries/chart/pma_pchart_single_radar.php diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index 7267d6987..794f06cfa 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -8,6 +8,8 @@ require_once './libraries/chart/pma_pchart_multi_bar.php'; require_once './libraries/chart/pma_pchart_stacked_bar.php'; require_once './libraries/chart/pma_pchart_single_line.php'; require_once './libraries/chart/pma_pchart_multi_line.php'; +require_once './libraries/chart/pma_pchart_single_radar.php'; +require_once './libraries/chart/pma_pchart_multi_radar.php'; /** * Chart functions used to generate various types @@ -124,6 +126,9 @@ function PMA_chart_results($data, &$chartSettings) case 'line': $chart = new PMA_pChart_single_line($chartTitle, $chartData, $chartSettings); break; + case 'radar': + $chart = new PMA_pChart_single_radar($chartTitle, $chartData, $chartSettings); + break; } } } @@ -188,6 +193,9 @@ function PMA_chart_results($data, &$chartSettings) case 'line': $chart = new PMA_pChart_multi_line($chartTitle, $chartData, $chartSettings); break; + case 'radar': + $chart = new PMA_pChart_multi_radar($chartTitle, $chartData, $chartSettings); + break; } } else { diff --git a/libraries/chart/pma_pchart_multi_radar.php b/libraries/chart/pma_pchart_multi_radar.php new file mode 100644 index 000000000..e50634029 --- /dev/null +++ b/libraries/chart/pma_pchart_multi_radar.php @@ -0,0 +1,68 @@ +normalizeValues(); + } + + /* + * Get the largest value from the data and normalize all the other values. + */ + private function normalizeValues() + { + $maxValue = 0; + $keys = array_keys($this->data); + $valueKey = $keys[1]; + foreach ($this->data[$valueKey] as $values) { + if (max($values) > $maxValue) { + $maxValue = max($values); + } + } + + foreach ($this->data[$valueKey] as &$values) { + foreach ($values as &$value) { + $value = $value / $maxValue * 10; + } + } + } + + protected function drawGraphArea() + { + $this->chart->drawGraphArea(213,217,221,FALSE); + $this->chart->drawGraphAreaGradient(163,203,167,50); + } + + protected function drawChart() + { + parent::drawChart(); + + // when drawing radar graph we can specify the border from the top of + // graph area. We want border to be dynamic, so that either the top + // or the side of the radar is some distance away from the top or the + // side of the graph area. + $areaWidth = $this->chart->GArea_X2 - $this->chart->GArea_X1; + $areaHeight = $this->chart->GArea_Y2 - $this->chart->GArea_Y1; + + if ($areaHeight > $areaWidth) { + $borderOffset = ($areaHeight - $areaWidth) / 2; + } + else { + $borderOffset = 0; + } + + // the least ammount that radar is away from the graph area side. + $borderOffset += 40; + + // Draw the radar chart + $this->chart->drawRadarAxis($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),TRUE,$borderOffset,120,120,120,230,230,230,-1,2); + $this->chart->drawFilledRadar($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),50,$borderOffset); + } +} + +?> diff --git a/libraries/chart/pma_pchart_single.php b/libraries/chart/pma_pchart_single.php index a1b45e029..70b0b7101 100644 --- a/libraries/chart/pma_pchart_single.php +++ b/libraries/chart/pma_pchart_single.php @@ -20,8 +20,10 @@ abstract class PMA_pChart_single extends PMA_pChart_chart // Dataset definition $this->dataSet->AddPoint($values[1], "Values"); $this->dataSet->AddPoint($values[0], "Keys"); - $this->dataSet->AddAllSeries(); - //$DataSet->RemoveSerie("Serie3"); + + //$this->dataSet->AddAllSeries(); + $this->dataSet->AddSerie("Values"); + $this->dataSet->SetAbsciseLabelSerie("Keys"); $xLabel = $this->getXLabel(); @@ -35,8 +37,6 @@ abstract class PMA_pChart_single extends PMA_pChart_chart $yLabel = $keys[1]; } $this->dataSet->SetYAxisName($yLabel); - //$DataSet->SetYAxisUnit("°C"); - //$DataSet->SetXAxisUnit("h"); } } diff --git a/libraries/chart/pma_pchart_single_radar.php b/libraries/chart/pma_pchart_single_radar.php new file mode 100644 index 000000000..48c6d00f1 --- /dev/null +++ b/libraries/chart/pma_pchart_single_radar.php @@ -0,0 +1,59 @@ +normalizeValues(); + } + + /* + * Get the largest value from the data and normalize all the other values. + */ + private function normalizeValues() + { + $maxValue = 0; + $keys = array_keys($this->data); + $valueKey = $keys[1]; + $maxValue = max($this->data[$valueKey]); + + foreach ($this->data[$valueKey] as &$value) { + $value = $value / $maxValue * 10; + } + } + + protected function drawGraphArea() + { + $this->chart->drawGraphArea(213,217,221,FALSE); + $this->chart->drawGraphAreaGradient(163,203,167,50); + } + + protected function drawChart() + { + // when drawing radar graph we can specify the border from the top of + // graph area. We want border to be dynamic, so that either the top + // or the side of the radar is some distance away from the top or the + // side of the graph area. + $areaWidth = $this->chart->GArea_X2 - $this->chart->GArea_X1; + $areaHeight = $this->chart->GArea_Y2 - $this->chart->GArea_Y1; + + if ($areaHeight > $areaWidth) { + $borderOffset = ($areaHeight - $areaWidth) / 2; + } + else { + $borderOffset = 0; + } + + // the least ammount that radar is away from the graph area side. + $borderOffset += 40; + + $this->chart->drawRadarAxis($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),TRUE,$borderOffset,120,120,120,230,230,230,-1,2); + $this->chart->drawFilledRadar($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),50,$borderOffset); + } +} + +?> diff --git a/tbl_chart.php b/tbl_chart.php index 22b587f91..04e3db7fe 100644 --- a/tbl_chart.php +++ b/tbl_chart.php @@ -91,7 +91,7 @@ $url_params['reload'] = 1; - + @@ -125,6 +125,7 @@ $url_params['reload'] = 1; >Bar >Line + >Radar >Pie From 45e740e96b8f0b042d7974d2abc617095f7cb4eb Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Thu, 8 Jul 2010 19:52:38 +0300 Subject: [PATCH 39/80] fixed option hendling --- libraries/chart.lib.php | 5 ++-- libraries/chart/pma_chart.php | 37 +++++++++++++++++----------- libraries/chart/pma_pchart_chart.php | 6 ++--- libraries/chart/pma_pchart_pie.php | 2 +- 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index 794f06cfa..6855dd12b 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -35,7 +35,7 @@ function PMA_chart_status($data) //$chart = new PMA_OFC_Pie(__('Query type'), $chartData, $options); $chart = new PMA_pChart_Pie( __('Query statistics'), - $chartData); + array_slice($chartData, 0, 20, true)); echo $chart->toString(); } @@ -203,8 +203,9 @@ function PMA_chart_results($data, &$chartSettings) return __('Unknown data format.'); } + $chartCode = $chart->toString(); $chartSettings = $chart->getSettings(); - return $chart->toString(); + return $chartCode; } ?> diff --git a/libraries/chart/pma_chart.php b/libraries/chart/pma_chart.php index d31f97f33..735b0a484 100644 --- a/libraries/chart/pma_chart.php +++ b/libraries/chart/pma_chart.php @@ -66,63 +66,70 @@ class PMA_Chart 'yLabel' => '', ); + /* + * Options that the user has specified + */ + private $userSpecifiedSettings = null; + function __construct($options = null) { - $this->handleOptions($options); + $this->userSpecifiedSettings = $options; + } + + protected function init() + { + $this->handleOptions(); } /* * A function which handles passed parameters. Useful if desired * chart needs to be a little bit different from the default one. - * - * Option handling could be made more efficient if options would be - * stored in an array. */ - function handleOptions($options) + private function handleOptions() { - if (is_null($options)) { + if (is_null($this->userSpecifiedSettings)) { return; } - $this->settings = array_merge($this->settings, $options); + $this->settings = array_merge($this->settings, $this->userSpecifiedSettings); } - function getTitleStyle() + protected function getTitleStyle() { return $this->settings['titleStyle']; } - function getColors() + protected function getColors() { return $this->settings['colors']; } - function getWidth() + protected function getWidth() { return $this->settings['width']; } - function getHeight() + protected function getHeight() { return $this->settings['height']; } - function getBgColor($component) + protected function getBgColor($component) { return hexdec(substr($this->settings['bgColor'], ($component * 2) + 1, 2)); } - function getXLabel() + protected function getXLabel() { return $this->settings['xLabel']; } - function getYLabel() + protected function getYLabel() { return $this->settings['yLabel']; } - function getSettings() + public function getSettings() { return $this->settings; } diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php index e9485fca1..8965ee62f 100644 --- a/libraries/chart/pma_pchart_chart.php +++ b/libraries/chart/pma_pchart_chart.php @@ -42,6 +42,8 @@ abstract class PMA_pChart_Chart extends PMA_Chart protected function init() { + parent::init(); + // create pChart object $this->chart = new pChart($this->getWidth(), $this->getHeight()); @@ -145,9 +147,7 @@ abstract class PMA_pChart_Chart extends PMA_Chart protected function setAreaMargins($areaMargins) { - if (!isset($this->settings['areaMargins'])) { - $this->settings['areaMargins'] = $areaMargins; - } + $this->settings['areaMargins'] = $areaMargins; } protected function getAreaMargin($side) diff --git a/libraries/chart/pma_pchart_pie.php b/libraries/chart/pma_pchart_pie.php index 5e01d9a1a..f740dc6cd 100644 --- a/libraries/chart/pma_pchart_pie.php +++ b/libraries/chart/pma_pchart_pie.php @@ -8,7 +8,7 @@ class PMA_pChart_Pie extends PMA_pChart_multi { parent::__construct($titleText, $data, $options); - $this->setAreaMargins(array(20, 20, 20, 10)); + $this->setAreaMargins(array(20, 10, 20, 20)); } protected function prepareDataSet() From 48f2caccae987a242912d4f17e87ebe3043c70f2 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Thu, 8 Jul 2010 20:26:40 +0300 Subject: [PATCH 40/80] error handling --- libraries/chart.lib.php | 14 ++++++++++++-- libraries/chart/pma_chart.php | 10 ++++++++++ libraries/chart/pma_pchart_chart.php | 3 ++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index 6855dd12b..68639fff9 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -36,7 +36,9 @@ function PMA_chart_status($data) $chart = new PMA_pChart_Pie( __('Query statistics'), array_slice($chartData, 0, 20, true)); - echo $chart->toString(); + $chartCode = $chart->toString(); + PMA_handle_chart_err($chart->getErrors()); + echo $chartCode; } /* @@ -54,7 +56,9 @@ function PMA_chart_profiling($data) $chart = new PMA_pChart_Pie( __('Query execution time comparison (in microseconds)'), $chartData); - echo $chart->toString(); + $chartCode = $chart->toString(); + PMA_handle_chart_err($chart->getErrors()); + echo $chartCode; } /* @@ -205,7 +209,13 @@ function PMA_chart_results($data, &$chartSettings) $chartCode = $chart->toString(); $chartSettings = $chart->getSettings(); + PMA_handle_chart_err($chart->getErrors()); return $chartCode; } +function PMA_handle_chart_err($errors) +{ + PMA_warnMissingExtension('GD', false, 'GD extension is needed for charts.'); +} + ?> diff --git a/libraries/chart/pma_chart.php b/libraries/chart/pma_chart.php index 735b0a484..5baf2bd38 100644 --- a/libraries/chart/pma_chart.php +++ b/libraries/chart/pma_chart.php @@ -71,6 +71,11 @@ class PMA_Chart */ private $userSpecifiedSettings = null; + /* + * Error codes will be stored here + */ + protected $errors = null; + function __construct($options = null) { $this->userSpecifiedSettings = $options; @@ -133,6 +138,11 @@ class PMA_Chart { return $this->settings; } + + public function getErrors() + { + return $this->errors; + } } ?> diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php index 8965ee62f..710a60fc0 100644 --- a/libraries/chart/pma_pchart_chart.php +++ b/libraries/chart/pma_pchart_chart.php @@ -136,7 +136,8 @@ abstract class PMA_pChart_Chart extends PMA_Chart return ''; } else { - return __('GD library needed for chart is missing.'); + $this->errors = 1; // stub + return ''; } } From cd1cbce4efe567a05cd9c002987005b8ecc4b6c1 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Thu, 8 Jul 2010 20:29:27 +0300 Subject: [PATCH 41/80] data overflow fix --- libraries/chart.lib.php | 4 ++-- libraries/chart/pma_chart.php | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index 68639fff9..fe9dfd2b6 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -35,7 +35,7 @@ function PMA_chart_status($data) //$chart = new PMA_OFC_Pie(__('Query type'), $chartData, $options); $chart = new PMA_pChart_Pie( __('Query statistics'), - array_slice($chartData, 0, 20, true)); + array_slice($chartData, 0, 18, true)); $chartCode = $chart->toString(); PMA_handle_chart_err($chart->getErrors()); echo $chartCode; @@ -55,7 +55,7 @@ function PMA_chart_profiling($data) $chart = new PMA_pChart_Pie( __('Query execution time comparison (in microseconds)'), - $chartData); + array_slice($chartData, 0, 18, true)); $chartCode = $chart->toString(); PMA_handle_chart_err($chart->getErrors()); echo $chartCode; diff --git a/libraries/chart/pma_chart.php b/libraries/chart/pma_chart.php index 5baf2bd38..9b5161099 100644 --- a/libraries/chart/pma_chart.php +++ b/libraries/chart/pma_chart.php @@ -36,7 +36,6 @@ class PMA_Chart '#825119', '#238C74', '#4C489B', - '#1D674A', '#87C9BF', ), From 7eedd0387db12235f529b11158683dca6c4b6522 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Fri, 9 Jul 2010 16:08:53 +0300 Subject: [PATCH 42/80] Fixed a case where a notice was generated when the first point was added to the data set. --- libraries/chart/pChart/pData.class | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/chart/pChart/pData.class b/libraries/chart/pChart/pData.class index 49d2fcc56..efc2a6508 100644 --- a/libraries/chart/pChart/pData.class +++ b/libraries/chart/pChart/pData.class @@ -52,7 +52,7 @@ function pData() { - $this->Data = ""; + $this->Data = array(); $this->DataDescription = ""; $this->DataDescription["Position"] = "Name"; $this->DataDescription["Format"]["X"] = "number"; From 08e048b3077c6d68e424372a7fc6f6958030ff55 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Fri, 9 Jul 2010 16:16:22 +0300 Subject: [PATCH 43/80] fixed chart error handler. --- libraries/chart.lib.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index fe9dfd2b6..0f2015a1e 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -213,9 +213,14 @@ function PMA_chart_results($data, &$chartSettings) return $chartCode; } +/* + * Simple handler of chart errors. + */ function PMA_handle_chart_err($errors) { - PMA_warnMissingExtension('GD', false, 'GD extension is needed for charts.'); + if (!empty($errors)) { + PMA_warnMissingExtension('GD', false, 'GD extension is needed for charts.'); + } } ?> From e5c8b5a8945810af7178901056b7330f92191e8e Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Fri, 9 Jul 2010 16:17:16 +0300 Subject: [PATCH 44/80] default labels are returned to the settings form. --- libraries/chart/pma_chart.php | 10 ++++++++++ libraries/chart/pma_pchart_single.php | 10 +++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/libraries/chart/pma_chart.php b/libraries/chart/pma_chart.php index 9b5161099..305f3e220 100644 --- a/libraries/chart/pma_chart.php +++ b/libraries/chart/pma_chart.php @@ -123,11 +123,21 @@ class PMA_Chart return hexdec(substr($this->settings['bgColor'], ($component * 2) + 1, 2)); } + protected function setXLabel($label) + { + $this->settings['xLabel'] = $label; + } + protected function getXLabel() { return $this->settings['xLabel']; } + protected function setYLabel($label) + { + $this->settings['yLabel'] = $label; + } + protected function getYLabel() { return $this->settings['yLabel']; diff --git a/libraries/chart/pma_pchart_single.php b/libraries/chart/pma_pchart_single.php index 70b0b7101..097fd0ac9 100644 --- a/libraries/chart/pma_pchart_single.php +++ b/libraries/chart/pma_pchart_single.php @@ -28,15 +28,15 @@ abstract class PMA_pChart_single extends PMA_pChart_chart $xLabel = $this->getXLabel(); if (empty($xLabel)) { - $xLabel = $keys[0]; + $this->setXLabel($keys[0]); } - $this->dataSet->SetXAxisName($xLabel); - $yLabel = $this->getYLabel(); if (empty($yLabel)) { - $yLabel = $keys[1]; + $this->setYLabel($keys[1]); } - $this->dataSet->SetYAxisName($yLabel); + + $this->dataSet->SetXAxisName($this->getXLabel()); + $this->dataSet->SetYAxisName($this->getYLabel()); } } From 6b806f20477abf750fe071f89cb74c1d9a095f53 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Fri, 9 Jul 2010 16:27:25 +0300 Subject: [PATCH 45/80] Chart title has been put to the settings array. --- libraries/chart.lib.php | 34 ++++++++++----------- libraries/chart/pma_chart.php | 11 +++++++ libraries/chart/pma_pchart_chart.php | 5 ++- libraries/chart/pma_pchart_multi.php | 4 +-- libraries/chart/pma_pchart_multi_bar.php | 4 +-- libraries/chart/pma_pchart_multi_line.php | 4 +-- libraries/chart/pma_pchart_multi_radar.php | 4 +-- libraries/chart/pma_pchart_pie.php | 4 +-- libraries/chart/pma_pchart_single.php | 4 +-- libraries/chart/pma_pchart_single_bar.php | 4 +-- libraries/chart/pma_pchart_single_line.php | 4 +-- libraries/chart/pma_pchart_single_radar.php | 4 +-- libraries/chart/pma_pchart_stacked_bar.php | 4 +-- tbl_chart.php | 4 +-- 14 files changed, 51 insertions(+), 43 deletions(-) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index 0f2015a1e..1b7c3079c 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -32,10 +32,10 @@ function PMA_chart_status($data) $chartData[$key] = $value; } - //$chart = new PMA_OFC_Pie(__('Query type'), $chartData, $options); $chart = new PMA_pChart_Pie( - __('Query statistics'), - array_slice($chartData, 0, 18, true)); + array_slice($chartData, 0, 18, true), + array('titleText' => __('Query statistics')) + ); $chartCode = $chart->toString(); PMA_handle_chart_err($chart->getErrors()); echo $chartCode; @@ -54,8 +54,9 @@ function PMA_chart_profiling($data) } $chart = new PMA_pChart_Pie( - __('Query execution time comparison (in microseconds)'), - array_slice($chartData, 0, 18, true)); + array_slice($chartData, 0, 18, true), + array('titleText' => __('Query execution time comparison (in microseconds)')) + ); $chartCode = $chart->toString(); PMA_handle_chart_err($chart->getErrors()); echo $chartCode; @@ -70,11 +71,8 @@ function PMA_chart_results($data, &$chartSettings) $chart = null; // set default title if not already set - if (!empty($chartSettings['title'])) { - $chartTitle = $chartSettings['title']; - } - else { - $chartTitle = __('Query results'); + if (empty($chartSettings['titleText'])) { + $chartSettings['titleText'] = __('Query results'); } // set default type if not already set @@ -111,7 +109,7 @@ function PMA_chart_results($data, &$chartSettings) } $chartSettings['legend'] = true; - $chart = new PMA_pChart_pie($chartTitle, $chartData, $chartSettings); + $chart = new PMA_pChart_pie($chartData, $chartSettings); } else { // loop through the rows @@ -125,13 +123,13 @@ function PMA_chart_results($data, &$chartSettings) switch ($chartSettings['type']) { case 'bar': default: - $chart = new PMA_pChart_single_bar($chartTitle, $chartData, $chartSettings); + $chart = new PMA_pChart_single_bar($chartData, $chartSettings); break; case 'line': - $chart = new PMA_pChart_single_line($chartTitle, $chartData, $chartSettings); + $chart = new PMA_pChart_single_line($chartData, $chartSettings); break; case 'radar': - $chart = new PMA_pChart_single_radar($chartTitle, $chartData, $chartSettings); + $chart = new PMA_pChart_single_radar($chartData, $chartSettings); break; } } @@ -186,19 +184,19 @@ function PMA_chart_results($data, &$chartSettings) switch ($chartSettings['barType']) { case 'stacked': default: - $chart = new PMA_pChart_stacked_bar($chartTitle, $chartData, $chartSettings); + $chart = new PMA_pChart_stacked_bar($chartData, $chartSettings); break; case 'multi': - $chart = new PMA_pChart_multi_bar($chartTitle, $chartData, $chartSettings); + $chart = new PMA_pChart_multi_bar($chartData, $chartSettings); break; } break; case 'line': - $chart = new PMA_pChart_multi_line($chartTitle, $chartData, $chartSettings); + $chart = new PMA_pChart_multi_line($chartData, $chartSettings); break; case 'radar': - $chart = new PMA_pChart_multi_radar($chartTitle, $chartData, $chartSettings); + $chart = new PMA_pChart_multi_radar($chartData, $chartSettings); break; } } diff --git a/libraries/chart/pma_chart.php b/libraries/chart/pma_chart.php index 305f3e220..9ecfa7ad2 100644 --- a/libraries/chart/pma_chart.php +++ b/libraries/chart/pma_chart.php @@ -10,6 +10,12 @@ class PMA_Chart * The settings array. All the default values are here. */ protected $settings = array( + + /* + * Default title for every chart. + */ + 'titleText' => 'Chart', + /* * The style of the chart title. */ @@ -98,6 +104,11 @@ class PMA_Chart $this->settings = array_merge($this->settings, $this->userSpecifiedSettings); } + protected function getTitleText() + { + return $this->settings['titleText']; + } + protected function getTitleStyle() { return $this->settings['titleStyle']; diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php index 710a60fc0..80d7f68c2 100644 --- a/libraries/chart/pma_pchart_chart.php +++ b/libraries/chart/pma_pchart_chart.php @@ -23,11 +23,10 @@ abstract class PMA_pChart_Chart extends PMA_Chart protected $imageEncoded; - public function __construct($titleText, $data, $options = null) + public function __construct($data, $options = null) { parent::__construct($options); - $this->titleText = $titleText; $this->data = $data; $this->settings['fontPath'] = './libraries/chart/pChart/fonts/'; @@ -92,7 +91,7 @@ abstract class PMA_pChart_Chart extends PMA_Chart protected function drawTitle() { // Draw the title - $this->chart->drawTextBox(0,0,$this->getWidth(),$this->getLabelHeight(),$this->titleText,0,255,255,255,ALIGN_CENTER,TRUE,0,0,0,30); + $this->chart->drawTextBox(0,0,$this->getWidth(),$this->getLabelHeight(),$this->getTitleText(),0,255,255,255,ALIGN_CENTER,TRUE,0,0,0,30); } protected function setGraphAreaDimensions() diff --git a/libraries/chart/pma_pchart_multi.php b/libraries/chart/pma_pchart_multi.php index b4f67db40..9114b8e51 100644 --- a/libraries/chart/pma_pchart_multi.php +++ b/libraries/chart/pma_pchart_multi.php @@ -8,9 +8,9 @@ require_once 'pma_pchart_chart.php'; */ abstract class PMA_pChart_multi extends PMA_pChart_chart { - public function __construct($titleText, $data, $options = null) + public function __construct($data, $options = null) { - parent::__construct($titleText, $data, $options); + parent::__construct($data, $options); // as in CSS (top, right, bottom, left) $this->setLegendMargins(array(20, 10, 0, 0)); diff --git a/libraries/chart/pma_pchart_multi_bar.php b/libraries/chart/pma_pchart_multi_bar.php index 194ba2cc7..a268f9351 100644 --- a/libraries/chart/pma_pchart_multi_bar.php +++ b/libraries/chart/pma_pchart_multi_bar.php @@ -4,9 +4,9 @@ require_once 'pma_pchart_multi.php'; class PMA_pChart_multi_bar extends PMA_pChart_multi { - public function __construct($titleText, $data, $options = null) + public function __construct($data, $options = null) { - parent::__construct($titleText, $data, $options); + parent::__construct($data, $options); $this->settings['scale'] = SCALE_NORMAL; } diff --git a/libraries/chart/pma_pchart_multi_line.php b/libraries/chart/pma_pchart_multi_line.php index 078728470..576b40ff8 100644 --- a/libraries/chart/pma_pchart_multi_line.php +++ b/libraries/chart/pma_pchart_multi_line.php @@ -4,9 +4,9 @@ require_once 'pma_pchart_multi.php'; class PMA_pChart_multi_line extends PMA_pChart_multi { - public function __construct($titleText, $data, $options = null) + public function __construct($data, $options = null) { - parent::__construct($titleText, $data, $options); + parent::__construct($data, $options); $this->settings['scale'] = SCALE_NORMAL; } diff --git a/libraries/chart/pma_pchart_multi_radar.php b/libraries/chart/pma_pchart_multi_radar.php index e50634029..1a3170714 100644 --- a/libraries/chart/pma_pchart_multi_radar.php +++ b/libraries/chart/pma_pchart_multi_radar.php @@ -4,9 +4,9 @@ require_once 'pma_pchart_multi.php'; class PMA_pChart_multi_radar extends PMA_pChart_multi { - public function __construct($titleText, $data, $options = null) + public function __construct($data, $options = null) { - parent::__construct($titleText, $data, $options); + parent::__construct($data, $options); $this->normalizeValues(); } diff --git a/libraries/chart/pma_pchart_pie.php b/libraries/chart/pma_pchart_pie.php index f740dc6cd..cd848eda7 100644 --- a/libraries/chart/pma_pchart_pie.php +++ b/libraries/chart/pma_pchart_pie.php @@ -4,9 +4,9 @@ require_once 'pma_pchart_multi.php'; class PMA_pChart_Pie extends PMA_pChart_multi { - public function __construct($titleText, $data, $options = null) + public function __construct($data, $options = null) { - parent::__construct($titleText, $data, $options); + parent::__construct($data, $options); $this->setAreaMargins(array(20, 10, 20, 20)); } diff --git a/libraries/chart/pma_pchart_single.php b/libraries/chart/pma_pchart_single.php index 097fd0ac9..d6d4c34c2 100644 --- a/libraries/chart/pma_pchart_single.php +++ b/libraries/chart/pma_pchart_single.php @@ -7,9 +7,9 @@ require_once 'pma_pchart_chart.php'; */ abstract class PMA_pChart_single extends PMA_pChart_chart { - public function __construct($titleText, $data, $options = null) + public function __construct($data, $options = null) { - parent::__construct($titleText, $data, $options); + parent::__construct($data, $options); } protected function prepareDataSet() diff --git a/libraries/chart/pma_pchart_single_bar.php b/libraries/chart/pma_pchart_single_bar.php index 024826af7..d08e4f6e7 100644 --- a/libraries/chart/pma_pchart_single_bar.php +++ b/libraries/chart/pma_pchart_single_bar.php @@ -4,9 +4,9 @@ require_once 'pma_pchart_single.php'; class PMA_pChart_single_bar extends PMA_pChart_single { - public function __construct($titleText, $data, $options = null) + public function __construct($data, $options = null) { - parent::__construct($titleText, $data, $options); + parent::__construct($data, $options); } protected function drawChart() diff --git a/libraries/chart/pma_pchart_single_line.php b/libraries/chart/pma_pchart_single_line.php index b5f86ffbf..4104ad28e 100644 --- a/libraries/chart/pma_pchart_single_line.php +++ b/libraries/chart/pma_pchart_single_line.php @@ -4,9 +4,9 @@ require_once 'pma_pchart_single.php'; class PMA_pChart_single_line extends PMA_pChart_single { - public function __construct($titleText, $data, $options = null) + public function __construct($data, $options = null) { - parent::__construct($titleText, $data, $options); + parent::__construct($data, $options); } protected function drawChart() diff --git a/libraries/chart/pma_pchart_single_radar.php b/libraries/chart/pma_pchart_single_radar.php index 48c6d00f1..b1c017e32 100644 --- a/libraries/chart/pma_pchart_single_radar.php +++ b/libraries/chart/pma_pchart_single_radar.php @@ -4,9 +4,9 @@ require_once 'pma_pchart_single.php'; class PMA_pChart_single_radar extends PMA_pChart_single { - public function __construct($titleText, $data, $options = null) + public function __construct($data, $options = null) { - parent::__construct($titleText, $data, $options); + parent::__construct($data, $options); $this->normalizeValues(); } diff --git a/libraries/chart/pma_pchart_stacked_bar.php b/libraries/chart/pma_pchart_stacked_bar.php index 53575058d..5b8fcedca 100644 --- a/libraries/chart/pma_pchart_stacked_bar.php +++ b/libraries/chart/pma_pchart_stacked_bar.php @@ -4,9 +4,9 @@ require_once 'pma_pchart_multi.php'; class PMA_pChart_stacked_bar extends PMA_pChart_multi { - public function __construct($titleText, $data, $options = null) + public function __construct($data, $options = null) { - parent::__construct($titleText, $data, $options); + parent::__construct($data, $options); } protected function drawChart() diff --git a/tbl_chart.php b/tbl_chart.php index 04e3db7fe..f2c9d5ee9 100644 --- a/tbl_chart.php +++ b/tbl_chart.php @@ -87,8 +87,8 @@ $url_params['reload'] = 1; - - + + From 3df1126c8539d410c0bc376a04c94401dbc109ed Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Fri, 9 Jul 2010 16:29:14 +0300 Subject: [PATCH 46/80] fixed custom axis lables on the multi chart. --- libraries/chart/pma_pchart_multi.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/libraries/chart/pma_pchart_multi.php b/libraries/chart/pma_pchart_multi.php index 9114b8e51..5570d2a2a 100644 --- a/libraries/chart/pma_pchart_multi.php +++ b/libraries/chart/pma_pchart_multi.php @@ -35,8 +35,17 @@ abstract class PMA_pChart_multi extends PMA_pChart_chart $this->dataSet->RemoveSerie("Keys"); $this->dataSet->SetAbsciseLabelSerie("Keys"); - $this->dataSet->SetXAxisName($keys[0]); - $this->dataSet->SetYAxisName($keys[1]); + $xLabel = $this->getXLabel(); + if (empty($xLabel)) { + $this->setXLabel($keys[0]); + } + $yLabel = $this->getYLabel(); + if (empty($yLabel)) { + $this->setYLabel($keys[1]); + } + + $this->dataSet->SetXAxisName($this->getXLabel()); + $this->dataSet->SetYAxisName($this->getYLabel()); } protected function setGraphAreaDimensions() From 979aa9a7ed7b4179d41de6998d6e8b4183611d22 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Fri, 9 Jul 2010 17:34:28 +0300 Subject: [PATCH 47/80] graceful error handling --- libraries/chart.lib.php | 14 ++++++++---- libraries/chart/pma_chart.php | 2 +- libraries/chart/pma_pchart_chart.php | 2 +- tbl_chart.php | 32 +++++++++++++++++----------- 4 files changed, 32 insertions(+), 18 deletions(-) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index 1b7c3079c..03fd2118e 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -1,5 +1,8 @@ toString(); $chartSettings = $chart->getSettings(); - PMA_handle_chart_err($chart->getErrors()); + $chartErrors = array_merge($chartErrors, $chart->getErrors()); + PMA_handle_chart_err($chartErrors); + return $chartCode; } @@ -216,7 +222,7 @@ function PMA_chart_results($data, &$chartSettings) */ function PMA_handle_chart_err($errors) { - if (!empty($errors)) { + if (in_array(ERR_NO_GD, $errors)) { PMA_warnMissingExtension('GD', false, 'GD extension is needed for charts.'); } } diff --git a/libraries/chart/pma_chart.php b/libraries/chart/pma_chart.php index 9ecfa7ad2..232a98e05 100644 --- a/libraries/chart/pma_chart.php +++ b/libraries/chart/pma_chart.php @@ -79,7 +79,7 @@ class PMA_Chart /* * Error codes will be stored here */ - protected $errors = null; + protected $errors = array(); function __construct($options = null) { diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php index 80d7f68c2..363a57541 100644 --- a/libraries/chart/pma_pchart_chart.php +++ b/libraries/chart/pma_pchart_chart.php @@ -135,7 +135,7 @@ abstract class PMA_pChart_Chart extends PMA_Chart return ''; } else { - $this->errors = 1; // stub + array_push($this->errors, ERR_NO_GD); return ''; } } diff --git a/tbl_chart.php b/tbl_chart.php index f2c9d5ee9..f00a291b2 100644 --- a/tbl_chart.php +++ b/tbl_chart.php @@ -25,7 +25,7 @@ require_once './libraries/common.inc.php'; */ require './libraries/db_common.inc.php'; $url_params['goto'] = $cfg['DefaultTabDatabase']; -$url_params['back'] = 'tbl_chart.php'; +$url_params['back'] = 'sql.php'; /* * Import chart functions @@ -48,8 +48,16 @@ if (PMA_isValid($_REQUEST['chartSettings'], 'array')) { $chartSettings = $_REQUEST['chartSettings']; } -// get the chart and settings used to generate chart -$chart = PMA_chart_results($data, $chartSettings); +// get the chart and settings and errors after chart generation +$chartErrors = array(); +$chart = PMA_chart_results($data, $chartSettings, $chartErrors); + +if (empty($chartErrors)) { + $message = PMA_Message::success(__('Chart generated successfully.')); +} +else { + $message = PMA_Message::error(__('The result of this query can\'t be used for a chart.')); +} /** * Displays top menu links @@ -80,33 +88,33 @@ $url_params['reload'] = 1; - + - + - + - + - + From c40e145597f1dddf04a99f3f776c1e83637b3653 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Tue, 20 Jul 2010 20:29:19 +0300 Subject: [PATCH 48/80] added JS tooltips to the bar and line charts. Other types generate warnings for now. --- js/overlib.js | 1491 ++++++++++++++++++++++++++ js/pMap.js | 70 ++ libraries/chart/pma_pchart_chart.php | 16 +- tbl_chart.php | 3 + 4 files changed, 1579 insertions(+), 1 deletion(-) create mode 100644 js/overlib.js create mode 100644 js/pMap.js diff --git a/js/overlib.js b/js/overlib.js new file mode 100644 index 000000000..45a270128 --- /dev/null +++ b/js/overlib.js @@ -0,0 +1,1491 @@ +//\///// +//\ overLIB 4.21 - You may not remove or change this notice. +//\ Copyright Erik Bosrup 1998-2004. All rights reserved. +//\ +//\ Contributors are listed on the homepage. +//\ This file might be old, always check for the latest version at: +//\ http://www.bosrup.com/web/overlib/ +//\ +//\ Please read the license agreement (available through the link above) +//\ before using overLIB. Direct any licensing questions to erik@bosrup.com. +//\ +//\ Do not sell this as your own work or remove this copyright notice. +//\ For full details on copying or changing this script please read the +//\ license agreement at the link above. Please give credit on sites that +//\ use overLIB and submit changes of the script so other people can use +//\ them as well. +// $Revision: 1.119 $ $Date: 2005/07/02 23:41:44 $ +//\///// +//\mini + +//////// +// PRE-INIT +// Ignore these lines, configuration is below. +//////// +var olLoaded = 0;var pmStart = 10000000; var pmUpper = 10001000; var pmCount = pmStart+1; var pmt=''; var pms = new Array(); var olInfo = new Info('4.21', 1); +var FREPLACE = 0; var FBEFORE = 1; var FAFTER = 2; var FALTERNATE = 3; var FCHAIN=4; +var olHideForm=0; // parameter for hiding SELECT and ActiveX elements in IE5.5+ +var olHautoFlag = 0; // flags for over-riding VAUTO and HAUTO if corresponding +var olVautoFlag = 0; // positioning commands are used on the command line +var hookPts = new Array(), postParse = new Array(), cmdLine = new Array(), runTime = new Array(); +// for plugins +registerCommands('donothing,inarray,caparray,sticky,background,noclose,caption,left,right,center,offsetx,offsety,fgcolor,bgcolor,textcolor,capcolor,closecolor,width,border,cellpad,status,autostatus,autostatuscap,height,closetext,snapx,snapy,fixx,fixy,relx,rely,fgbackground,bgbackground,padx,pady,fullhtml,above,below,capicon,textfont,captionfont,closefont,textsize,captionsize,closesize,timeout,function,delay,hauto,vauto,closeclick,wrap,followmouse,mouseoff,closetitle,cssoff,compatmode,cssclass,fgclass,bgclass,textfontclass,captionfontclass,closefontclass'); + +//////// +// DEFAULT CONFIGURATION +// Settings you want everywhere are set here. All of this can also be +// changed on your html page or through an overLIB call. +//////// +if (typeof ol_fgcolor=='undefined') var ol_fgcolor="#606060"; +if (typeof ol_bgcolor=='undefined') var ol_bgcolor="#373737"; +if (typeof ol_textcolor=='undefined') var ol_textcolor="#BEBEBE"; +if (typeof ol_capcolor=='undefined') var ol_capcolor="#DEDEDE"; +if (typeof ol_closecolor=='undefined') var ol_closecolor="#9999FF"; +if (typeof ol_textfont=='undefined') var ol_textfont="Tahoma,Verdana,Arial,Helvetica"; +if (typeof ol_captionfont=='undefined') var ol_captionfont="Tahoma,Verdana,Arial,Helvetica"; +if (typeof ol_closefont=='undefined') var ol_closefont="Tahoma,Verdana,Arial,Helvetica"; +if (typeof ol_textsize=='undefined') var ol_textsize="1"; +if (typeof ol_captionsize=='undefined') var ol_captionsize="1"; +if (typeof ol_closesize=='undefined') var ol_closesize="1"; +if (typeof ol_width=='undefined') var ol_width="200"; +if (typeof ol_border=='undefined') var ol_border="2"; +if (typeof ol_cellpad=='undefined') var ol_cellpad=2; +if (typeof ol_offsetx=='undefined') var ol_offsetx=10; +if (typeof ol_offsety=='undefined') var ol_offsety=10; +if (typeof ol_text=='undefined') var ol_text="Default Text"; +if (typeof ol_cap=='undefined') var ol_cap=""; +if (typeof ol_sticky=='undefined') var ol_sticky=0; +if (typeof ol_background=='undefined') var ol_background=""; +if (typeof ol_close=='undefined') var ol_close="Close"; +if (typeof ol_hpos=='undefined') var ol_hpos=RIGHT; +if (typeof ol_status=='undefined') var ol_status=""; +if (typeof ol_autostatus=='undefined') var ol_autostatus=0; +if (typeof ol_height=='undefined') var ol_height=-1; +if (typeof ol_snapx=='undefined') var ol_snapx=0; +if (typeof ol_snapy=='undefined') var ol_snapy=0; +if (typeof ol_fixx=='undefined') var ol_fixx=-1; +if (typeof ol_fixy=='undefined') var ol_fixy=-1; +if (typeof ol_relx=='undefined') var ol_relx=null; +if (typeof ol_rely=='undefined') var ol_rely=null; +if (typeof ol_fgbackground=='undefined') var ol_fgbackground=""; +if (typeof ol_bgbackground=='undefined') var ol_bgbackground=""; +if (typeof ol_padxl=='undefined') var ol_padxl=1; +if (typeof ol_padxr=='undefined') var ol_padxr=1; +if (typeof ol_padyt=='undefined') var ol_padyt=1; +if (typeof ol_padyb=='undefined') var ol_padyb=1; +if (typeof ol_fullhtml=='undefined') var ol_fullhtml=0; +if (typeof ol_vpos=='undefined') var ol_vpos=BELOW; +if (typeof ol_aboveheight=='undefined') var ol_aboveheight=0; +if (typeof ol_capicon=='undefined') var ol_capicon=""; +if (typeof ol_frame=='undefined') var ol_frame=self; +if (typeof ol_timeout=='undefined') var ol_timeout=0; +if (typeof ol_function=='undefined') var ol_function=null; +if (typeof ol_delay=='undefined') var ol_delay=0; +if (typeof ol_hauto=='undefined') var ol_hauto=0; +if (typeof ol_vauto=='undefined') var ol_vauto=0; +if (typeof ol_closeclick=='undefined') var ol_closeclick=0; +if (typeof ol_wrap=='undefined') var ol_wrap=0; +if (typeof ol_followmouse=='undefined') var ol_followmouse=1; +if (typeof ol_mouseoff=='undefined') var ol_mouseoff=0; +if (typeof ol_closetitle=='undefined') var ol_closetitle='Close'; +if (typeof ol_compatmode=='undefined') var ol_compatmode=0; +if (typeof ol_css=='undefined') var ol_css=CSSOFF; +if (typeof ol_fgclass=='undefined') var ol_fgclass=""; +if (typeof ol_bgclass=='undefined') var ol_bgclass=""; +if (typeof ol_textfontclass=='undefined') var ol_textfontclass=""; +if (typeof ol_captionfontclass=='undefined') var ol_captionfontclass=""; +if (typeof ol_closefontclass=='undefined') var ol_closefontclass=""; + +//////// +// ARRAY CONFIGURATION +//////// + +// You can use these arrays to store popup text here instead of in the html. +if (typeof ol_texts=='undefined') var ol_texts = new Array("Text 0", "Text 1"); +if (typeof ol_caps=='undefined') var ol_caps = new Array("Caption 0", "Caption 1"); + +//////// +// END OF CONFIGURATION +// Don't change anything below this line, all configuration is above. +//////// + + + + + +//////// +// INIT +//////// +// Runtime variables init. Don't change for config! +var o3_text=""; +var o3_cap=""; +var o3_sticky=0; +var o3_background=""; +var o3_close="Close"; +var o3_hpos=RIGHT; +var o3_offsetx=2; +var o3_offsety=2; +var o3_fgcolor=""; +var o3_bgcolor=""; +var o3_textcolor=""; +var o3_capcolor=""; +var o3_closecolor=""; +var o3_width=100; +var o3_border=1; +var o3_cellpad=2; +var o3_status=""; +var o3_autostatus=0; +var o3_height=-1; +var o3_snapx=0; +var o3_snapy=0; +var o3_fixx=-1; +var o3_fixy=-1; +var o3_relx=null; +var o3_rely=null; +var o3_fgbackground=""; +var o3_bgbackground=""; +var o3_padxl=0; +var o3_padxr=0; +var o3_padyt=0; +var o3_padyb=0; +var o3_fullhtml=0; +var o3_vpos=BELOW; +var o3_aboveheight=0; +var o3_capicon=""; +var o3_textfont="Verdana,Arial,Helvetica"; +var o3_captionfont="Verdana,Arial,Helvetica"; +var o3_closefont="Verdana,Arial,Helvetica"; +var o3_textsize="1"; +var o3_captionsize="1"; +var o3_closesize="1"; +var o3_frame=self; +var o3_timeout=0; +var o3_timerid=0; +var o3_allowmove=0; +var o3_function=null; +var o3_delay=0; +var o3_delayid=0; +var o3_hauto=0; +var o3_vauto=0; +var o3_closeclick=0; +var o3_wrap=0; +var o3_followmouse=1; +var o3_mouseoff=0; +var o3_closetitle=''; +var o3_compatmode=0; +var o3_css=CSSOFF; +var o3_fgclass=""; +var o3_bgclass=""; +var o3_textfontclass=""; +var o3_captionfontclass=""; +var o3_closefontclass=""; + +// Display state variables +var o3_x = 0; +var o3_y = 0; +var o3_showingsticky = 0; +var o3_removecounter = 0; + +// Our layer +var over = null; +var fnRef, hoveringSwitch = false; +var olHideDelay; + +// Decide browser version +var isMac = (navigator.userAgent.indexOf("Mac") != -1); +var olOp = (navigator.userAgent.toLowerCase().indexOf('opera') > -1 && document.createTextNode); // Opera 7 +var olNs4 = (navigator.appName=='Netscape' && parseInt(navigator.appVersion) == 4); +var olNs6 = (document.getElementById) ? true : false; +var olKq = (olNs6 && /konqueror/i.test(navigator.userAgent)); +var olIe4 = (document.all) ? true : false; +var olIe5 = false; +var olIe55 = false; // Added additional variable to identify IE5.5+ +var docRoot = 'document.body'; + +// Resize fix for NS4.x to keep track of layer +if (olNs4) { + var oW = window.innerWidth; + var oH = window.innerHeight; + window.onresize = function() { if (oW != window.innerWidth || oH != window.innerHeight) location.reload(); } +} + +// Microsoft Stupidity Check(tm). +if (olIe4) { + var agent = navigator.userAgent; + if (/MSIE/.test(agent)) { + var versNum = parseFloat(agent.match(/MSIE[ ](\d\.\d+)\.*/i)[1]); + if (versNum >= 5){ + olIe5=true; + olIe55=(versNum>=5.5&&!olOp) ? true : false; + if (olNs6) olNs6=false; + } + } + if (olNs6) olIe4 = false; +} + +// Check for compatability mode. +if (document.compatMode && document.compatMode == 'CSS1Compat') { + docRoot= ((olIe4 && !olOp) ? 'document.documentElement' : docRoot); +} + +// Add window onload handlers to indicate when all modules have been loaded +// For Netscape 6+ and Mozilla, uses addEventListener method on the window object +// For IE it uses the attachEvent method of the window object and for Netscape 4.x +// it sets the window.onload handler to the OLonload_handler function for Bubbling +if(window.addEventListener) window.addEventListener("load",OLonLoad_handler,false); +else if (window.attachEvent) window.attachEvent("onload",OLonLoad_handler); + +var capExtent; + +//////// +// PUBLIC FUNCTIONS +//////// + +// overlib(arg0,...,argN) +// Loads parameters into global runtime variables. +function overlib() { + if (!olLoaded || isExclusive(overlib.arguments)) return true; + if (olCheckMouseCapture) olMouseCapture(); + if (over) { + over = (typeof over.id != 'string') ? o3_frame.document.all['overDiv'] : over; + cClick(); + } + + // Load defaults to runtime. + olHideDelay=0; + o3_text=ol_text; + o3_cap=ol_cap; + o3_sticky=ol_sticky; + o3_background=ol_background; + o3_close=ol_close; + o3_hpos=ol_hpos; + o3_offsetx=ol_offsetx; + o3_offsety=ol_offsety; + o3_fgcolor=ol_fgcolor; + o3_bgcolor=ol_bgcolor; + o3_textcolor=ol_textcolor; + o3_capcolor=ol_capcolor; + o3_closecolor=ol_closecolor; + o3_width=ol_width; + o3_border=ol_border; + o3_cellpad=ol_cellpad; + o3_status=ol_status; + o3_autostatus=ol_autostatus; + o3_height=ol_height; + o3_snapx=ol_snapx; + o3_snapy=ol_snapy; + o3_fixx=ol_fixx; + o3_fixy=ol_fixy; + o3_relx=ol_relx; + o3_rely=ol_rely; + o3_fgbackground=ol_fgbackground; + o3_bgbackground=ol_bgbackground; + o3_padxl=ol_padxl; + o3_padxr=ol_padxr; + o3_padyt=ol_padyt; + o3_padyb=ol_padyb; + o3_fullhtml=ol_fullhtml; + o3_vpos=ol_vpos; + o3_aboveheight=ol_aboveheight; + o3_capicon=ol_capicon; + o3_textfont=ol_textfont; + o3_captionfont=ol_captionfont; + o3_closefont=ol_closefont; + o3_textsize=ol_textsize; + o3_captionsize=ol_captionsize; + o3_closesize=ol_closesize; + o3_timeout=ol_timeout; + o3_function=ol_function; + o3_delay=ol_delay; + o3_hauto=ol_hauto; + o3_vauto=ol_vauto; + o3_closeclick=ol_closeclick; + o3_wrap=ol_wrap; + o3_followmouse=ol_followmouse; + o3_mouseoff=ol_mouseoff; + o3_closetitle=ol_closetitle; + o3_css=ol_css; + o3_compatmode=ol_compatmode; + o3_fgclass=ol_fgclass; + o3_bgclass=ol_bgclass; + o3_textfontclass=ol_textfontclass; + o3_captionfontclass=ol_captionfontclass; + o3_closefontclass=ol_closefontclass; + + setRunTimeVariables(); + + fnRef = ''; + + // Special for frame support, over must be reset... + o3_frame = ol_frame; + + if(!(over=createDivContainer())) return false; + + parseTokens('o3_', overlib.arguments); + if (!postParseChecks()) return false; + + if (o3_delay == 0) { + return runHook("olMain", FREPLACE); + } else { + o3_delayid = setTimeout("runHook('olMain', FREPLACE)", o3_delay); + return false; + } +} + +// Clears popups if appropriate +function nd(time) { + if (olLoaded && !isExclusive()) { + hideDelay(time); // delay popup close if time specified + + if (o3_removecounter >= 1) { o3_showingsticky = 0 }; + + if (o3_showingsticky == 0) { + o3_allowmove = 0; + if (over != null && o3_timerid == 0) runHook("hideObject", FREPLACE, over); + } else { + o3_removecounter++; + } + } + + return true; +} + +// The Close onMouseOver function for stickies +function cClick() { + if (olLoaded) { + runHook("hideObject", FREPLACE, over); + o3_showingsticky = 0; + } + return false; +} + +// Method for setting page specific defaults. +function overlib_pagedefaults() { + parseTokens('ol_', overlib_pagedefaults.arguments); +} + + +//////// +// OVERLIB MAIN FUNCTION +//////// + +// This function decides what it is we want to display and how we want it done. +function olMain() { + var layerhtml, styleType; + runHook("olMain", FBEFORE); + + if (o3_background!="" || o3_fullhtml) { + // Use background instead of box. + layerhtml = runHook('ol_content_background', FALTERNATE, o3_css, o3_text, o3_background, o3_fullhtml); + } else { + // They want a popup box. + styleType = (pms[o3_css-1-pmStart] == "cssoff" || pms[o3_css-1-pmStart] == "cssclass"); + + // Prepare popup background + if (o3_fgbackground != "") o3_fgbackground = "background=\""+o3_fgbackground+"\""; + if (o3_bgbackground != "") o3_bgbackground = (styleType ? "background=\""+o3_bgbackground+"\"" : o3_bgbackground); + + // Prepare popup colors + if (o3_fgcolor != "") o3_fgcolor = (styleType ? "bgcolor=\""+o3_fgcolor+"\"" : o3_fgcolor); + if (o3_bgcolor != "") o3_bgcolor = (styleType ? "bgcolor=\""+o3_bgcolor+"\"" : o3_bgcolor); + + // Prepare popup height + if (o3_height > 0) o3_height = (styleType ? "height=\""+o3_height+"\"" : o3_height); + else o3_height = ""; + + // Decide which kinda box. + if (o3_cap=="") { + // Plain + layerhtml = runHook('ol_content_simple', FALTERNATE, o3_css, o3_text); + } else { + // With caption + if (o3_sticky) { + // Show close text + layerhtml = runHook('ol_content_caption', FALTERNATE, o3_css, o3_text, o3_cap, o3_close); + } else { + // No close text + layerhtml = runHook('ol_content_caption', FALTERNATE, o3_css, o3_text, o3_cap, ""); + } + } + } + + // We want it to stick! + if (o3_sticky) { + if (o3_timerid > 0) { + clearTimeout(o3_timerid); + o3_timerid = 0; + } + o3_showingsticky = 1; + o3_removecounter = 0; + } + + // Created a separate routine to generate the popup to make it easier + // to implement a plugin capability + if (!runHook("createPopup", FREPLACE, layerhtml)) return false; + + // Prepare status bar + if (o3_autostatus > 0) { + o3_status = o3_text; + if (o3_autostatus > 1) o3_status = o3_cap; + } + + // When placing the layer the first time, even stickies may be moved. + o3_allowmove = 0; + + // Initiate a timer for timeout + if (o3_timeout > 0) { + if (o3_timerid > 0) clearTimeout(o3_timerid); + o3_timerid = setTimeout("cClick()", o3_timeout); + } + + // Show layer + runHook("disp", FREPLACE, o3_status); + runHook("olMain", FAFTER); + + return (olOp && event && event.type == 'mouseover' && !o3_status) ? '' : (o3_status != ''); +} + +//////// +// LAYER GENERATION FUNCTIONS +//////// +// These functions just handle popup content with tags that should adhere to the W3C standards specification. + +// Makes simple table without caption +function ol_content_simple(text) { + var cpIsMultiple = /,/.test(o3_cellpad); + var txt = '
- - - - + + + +
' : ((!olNs4&&cpIsMultiple) ? ' style="'+setCellPadStr(o3_cellpad)+'">' : '>'))+(o3_textfontclass ? '' : wrapStr(0,o3_textsize,'text'))+text+(o3_textfontclass ? '' : wrapStr(1,o3_textsize))+'
'; + + set_background(""); + return txt; +} + +// Makes table with caption and optional close link +function ol_content_caption(text,title,close) { + var nameId, txt, cpIsMultiple = /,/.test(o3_cellpad); + var closing, closeevent; + + closing = ""; + closeevent = "onmouseover"; + if (o3_closeclick == 1) closeevent = (o3_closetitle ? "title='" + o3_closetitle +"'" : "") + " onclick"; + if (o3_capicon != "") { + nameId = ' hspace = \"5\"'+' align = \"middle\" alt = \"\"'; + if (typeof o3_dragimg != 'undefined' && o3_dragimg) nameId =' hspace=\"5\"'+' name=\"'+o3_dragimg+'\" id=\"'+o3_dragimg+'\" align=\"middle\" alt=\"Drag Enabled\" title=\"Drag Enabled\"'; + o3_capicon = ''; + } + + if (close != "") + closing = '
'+(o3_closefontclass ? '' : wrapStr(0,o3_closesize,'close'))+close+(o3_closefontclass ? '' : wrapStr(1,o3_closesize,'close'))+''; + txt = '
' : '>')+(o3_captionfontclass ? '' : ''+wrapStr(0,o3_captionsize,'caption'))+o3_capicon+title+(o3_captionfontclass ? '' : wrapStr(1,o3_captionsize)+'')+''+closing+'
' :((!olNs4&&cpIsMultiple) ? ' style="'+setCellPadStr(o3_cellpad)+'">' : '>'))+(o3_textfontclass ? '' : wrapStr(0,o3_textsize,'text'))+text+(o3_textfontclass ? '' : wrapStr(1,o3_textsize)) + '
'; + + set_background(""); + return txt; +} + +// Sets the background picture,padding and lots more. :) +function ol_content_background(text,picture,hasfullhtml) { + if (hasfullhtml) { + txt=text; + } else { + txt='
'+(o3_textfontclass ? '' : wrapStr(0,o3_textsize,'text'))+text+(o3_textfontclass ? '' : wrapStr(1,o3_textsize))+'
'; + } + + set_background(picture); + return txt; +} + +// Loads a picture into the div. +function set_background(pic) { + if (pic == "") { + if (olNs4) { + over.background.src = null; + } else if (over.style) { + over.style.backgroundImage = "none"; + } + } else { + if (olNs4) { + over.background.src = pic; + } else if (over.style) { + over.style.width=o3_width + 'px'; + over.style.backgroundImage = "url("+pic+")"; + } + } +} + +//////// +// HANDLING FUNCTIONS +//////// +var olShowId=-1; + +// Displays the popup +function disp(statustext) { + runHook("disp", FBEFORE); + + if (o3_allowmove == 0) { + runHook("placeLayer", FREPLACE); + (olNs6&&olShowId<0) ? olShowId=setTimeout("runHook('showObject', FREPLACE, over)", 1) : runHook("showObject", FREPLACE, over); + o3_allowmove = (o3_sticky || o3_followmouse==0) ? 0 : 1; + } + + runHook("disp", FAFTER); + + if (statustext != "") self.status = statustext; +} + +// Creates the actual popup structure +function createPopup(lyrContent){ + runHook("createPopup", FBEFORE); + + if (o3_wrap) { + var wd,ww,theObj = (olNs4 ? over : over.style); + theObj.top = theObj.left = ((olIe4&&!olOp) ? 0 : -10000) + (!olNs4 ? 'px' : 0); + layerWrite(lyrContent); + wd = (olNs4 ? over.clip.width : over.offsetWidth); + if (wd > (ww=windowWidth())) { + lyrContent=lyrContent.replace(/\ /g, ' '); + o3_width=ww; + o3_wrap=0; + } + } + + layerWrite(lyrContent); + + // Have to set o3_width for placeLayer() routine if o3_wrap is turned on + if (o3_wrap) o3_width=(olNs4 ? over.clip.width : over.offsetWidth); + + runHook("createPopup", FAFTER, lyrContent); + + return true; +} + +// Decides where we want the popup. +function placeLayer() { + var placeX, placeY, widthFix = 0; + + // HORIZONTAL PLACEMENT, re-arranged to work in Safari + if (o3_frame.innerWidth) widthFix=18; + iwidth = windowWidth(); + + // Horizontal scroll offset + winoffset=(olIe4) ? eval('o3_frame.'+docRoot+'.scrollLeft') : o3_frame.pageXOffset; + + placeX = runHook('horizontalPlacement',FCHAIN,iwidth,winoffset,widthFix); + + // VERTICAL PLACEMENT, re-arranged to work in Safari + if (o3_frame.innerHeight) { + iheight=o3_frame.innerHeight; + } else if (eval('o3_frame.'+docRoot)&&eval("typeof o3_frame."+docRoot+".clientHeight=='number'")&&eval('o3_frame.'+docRoot+'.clientHeight')) { + iheight=eval('o3_frame.'+docRoot+'.clientHeight'); + } + + // Vertical scroll offset + scrolloffset=(olIe4) ? eval('o3_frame.'+docRoot+'.scrollTop') : o3_frame.pageYOffset; + placeY = runHook('verticalPlacement',FCHAIN,iheight,scrolloffset); + + // Actually move the object. + repositionTo(over, placeX, placeY); +} + +// Moves the layer +function olMouseMove(e) { + var e = (e) ? e : event; + + if (e.pageX) { + o3_x = e.pageX; + o3_y = e.pageY; + } else if (e.clientX) { + o3_x = eval('e.clientX+o3_frame.'+docRoot+'.scrollLeft'); + o3_y = eval('e.clientY+o3_frame.'+docRoot+'.scrollTop'); + } + + if (o3_allowmove == 1) runHook("placeLayer", FREPLACE); + + // MouseOut handler + if (hoveringSwitch && !olNs4 && runHook("cursorOff", FREPLACE)) { + (olHideDelay ? hideDelay(olHideDelay) : cClick()); + hoveringSwitch = !hoveringSwitch; + } +} + +// Fake function for 3.0 users. +function no_overlib() { return ver3fix; } + +// Capture the mouse and chain other scripts. +function olMouseCapture() { + capExtent = document; + var fN, str = '', l, k, f, wMv, sS, mseHandler = olMouseMove; + var re = /function[ ]*(\w*)\(/; + + wMv = (!olIe4 && window.onmousemove); + if (document.onmousemove || wMv) { + if (wMv) capExtent = window; + f = capExtent.onmousemove.toString(); + fN = f.match(re); + if (fN == null) { + str = f+'(e); '; + } else if (fN[1] == 'anonymous' || fN[1] == 'olMouseMove' || (wMv && fN[1] == 'onmousemove')) { + if (!olOp && wMv) { + l = f.indexOf('{')+1; + k = f.lastIndexOf('}'); + sS = f.substring(l,k); + if ((l = sS.indexOf('(')) != -1) { + sS = sS.substring(0,l).replace(/^\s+/,'').replace(/\s+$/,''); + if (eval("typeof " + sS + " == 'undefined'")) window.onmousemove = null; + else str = sS + '(e);'; + } + } + if (!str) { + olCheckMouseCapture = false; + return; + } + } else { + if (fN[1]) str = fN[1]+'(e); '; + else { + l = f.indexOf('{')+1; + k = f.lastIndexOf('}'); + str = f.substring(l,k) + '\n'; + } + } + str += 'olMouseMove(e); '; + mseHandler = new Function('e', str); + } + + capExtent.onmousemove = mseHandler; + if (olNs4) capExtent.captureEvents(Event.MOUSEMOVE); +} + +//////// +// PARSING FUNCTIONS +//////// + +// Does the actual command parsing. +function parseTokens(pf, ar) { + // What the next argument is expected to be. + var v, i, mode=-1, par = (pf != 'ol_'); + var fnMark = (par && !ar.length ? 1 : 0); + + for (i = 0; i < ar.length; i++) { + if (mode < 0) { + // Arg is maintext,unless its a number between pmStart and pmUpper + // then its a command. + if (typeof ar[i] == 'number' && ar[i] > pmStart && ar[i] < pmUpper) { + fnMark = (par ? 1 : 0); + i--; // backup one so that the next block can parse it + } else { + switch(pf) { + case 'ol_': + ol_text = ar[i].toString(); + break; + default: + o3_text=ar[i].toString(); + } + } + mode = 0; + } else { + // Note: NS4 doesn't like switch cases with vars. + if (ar[i] >= pmCount || ar[i]==DONOTHING) { continue; } + if (ar[i]==INARRAY) { fnMark = 0; eval(pf+'text=ol_texts['+ar[++i]+'].toString()'); continue; } + if (ar[i]==CAPARRAY) { eval(pf+'cap=ol_caps['+ar[++i]+'].toString()'); continue; } + if (ar[i]==STICKY) { if (pf!='ol_') eval(pf+'sticky=1'); continue; } + if (ar[i]==BACKGROUND) { eval(pf+'background="'+ar[++i]+'"'); continue; } + if (ar[i]==NOCLOSE) { if (pf!='ol_') opt_NOCLOSE(); continue; } + if (ar[i]==CAPTION) { eval(pf+"cap='"+escSglQuote(ar[++i])+"'"); continue; } + if (ar[i]==CENTER || ar[i]==LEFT || ar[i]==RIGHT) { eval(pf+'hpos='+ar[i]); if(pf!='ol_') olHautoFlag=1; continue; } + if (ar[i]==OFFSETX) { eval(pf+'offsetx='+ar[++i]); continue; } + if (ar[i]==OFFSETY) { eval(pf+'offsety='+ar[++i]); continue; } + if (ar[i]==FGCOLOR) { eval(pf+'fgcolor="'+ar[++i]+'"'); continue; } + if (ar[i]==BGCOLOR) { eval(pf+'bgcolor="'+ar[++i]+'"'); continue; } + if (ar[i]==TEXTCOLOR) { eval(pf+'textcolor="'+ar[++i]+'"'); continue; } + if (ar[i]==CAPCOLOR) { eval(pf+'capcolor="'+ar[++i]+'"'); continue; } + if (ar[i]==CLOSECOLOR) { eval(pf+'closecolor="'+ar[++i]+'"'); continue; } + if (ar[i]==WIDTH) { eval(pf+'width='+ar[++i]); continue; } + if (ar[i]==BORDER) { eval(pf+'border='+ar[++i]); continue; } + if (ar[i]==CELLPAD) { i=opt_MULTIPLEARGS(++i,ar,(pf+'cellpad')); continue; } + if (ar[i]==STATUS) { eval(pf+"status='"+escSglQuote(ar[++i])+"'"); continue; } + if (ar[i]==AUTOSTATUS) { eval(pf +'autostatus=('+pf+'autostatus == 1) ? 0 : 1'); continue; } + if (ar[i]==AUTOSTATUSCAP) { eval(pf +'autostatus=('+pf+'autostatus == 2) ? 0 : 2'); continue; } + if (ar[i]==HEIGHT) { eval(pf+'height='+pf+'aboveheight='+ar[++i]); continue; } // Same param again. + if (ar[i]==CLOSETEXT) { eval(pf+"close='"+escSglQuote(ar[++i])+"'"); continue; } + if (ar[i]==SNAPX) { eval(pf+'snapx='+ar[++i]); continue; } + if (ar[i]==SNAPY) { eval(pf+'snapy='+ar[++i]); continue; } + if (ar[i]==FIXX) { eval(pf+'fixx='+ar[++i]); continue; } + if (ar[i]==FIXY) { eval(pf+'fixy='+ar[++i]); continue; } + if (ar[i]==RELX) { eval(pf+'relx='+ar[++i]); continue; } + if (ar[i]==RELY) { eval(pf+'rely='+ar[++i]); continue; } + if (ar[i]==FGBACKGROUND) { eval(pf+'fgbackground="'+ar[++i]+'"'); continue; } + if (ar[i]==BGBACKGROUND) { eval(pf+'bgbackground="'+ar[++i]+'"'); continue; } + if (ar[i]==PADX) { eval(pf+'padxl='+ar[++i]); eval(pf+'padxr='+ar[++i]); continue; } + if (ar[i]==PADY) { eval(pf+'padyt='+ar[++i]); eval(pf+'padyb='+ar[++i]); continue; } + if (ar[i]==FULLHTML) { if (pf!='ol_') eval(pf+'fullhtml=1'); continue; } + if (ar[i]==BELOW || ar[i]==ABOVE) { eval(pf+'vpos='+ar[i]); if (pf!='ol_') olVautoFlag=1; continue; } + if (ar[i]==CAPICON) { eval(pf+'capicon="'+ar[++i]+'"'); continue; } + if (ar[i]==TEXTFONT) { eval(pf+"textfont='"+escSglQuote(ar[++i])+"'"); continue; } + if (ar[i]==CAPTIONFONT) { eval(pf+"captionfont='"+escSglQuote(ar[++i])+"'"); continue; } + if (ar[i]==CLOSEFONT) { eval(pf+"closefont='"+escSglQuote(ar[++i])+"'"); continue; } + if (ar[i]==TEXTSIZE) { eval(pf+'textsize="'+ar[++i]+'"'); continue; } + if (ar[i]==CAPTIONSIZE) { eval(pf+'captionsize="'+ar[++i]+'"'); continue; } + if (ar[i]==CLOSESIZE) { eval(pf+'closesize="'+ar[++i]+'"'); continue; } + if (ar[i]==TIMEOUT) { eval(pf+'timeout='+ar[++i]); continue; } + if (ar[i]==FUNCTION) { if (pf=='ol_') { if (typeof ar[i+1]!='number') { v=ar[++i]; ol_function=(typeof v=='function' ? v : null); }} else {fnMark = 0; v = null; if (typeof ar[i+1]!='number') v = ar[++i]; opt_FUNCTION(v); } continue; } + if (ar[i]==DELAY) { eval(pf+'delay='+ar[++i]); continue; } + if (ar[i]==HAUTO) { eval(pf+'hauto=('+pf+'hauto == 0) ? 1 : 0'); continue; } + if (ar[i]==VAUTO) { eval(pf+'vauto=('+pf+'vauto == 0) ? 1 : 0'); continue; } + if (ar[i]==CLOSECLICK) { eval(pf +'closeclick=('+pf+'closeclick == 0) ? 1 : 0'); continue; } + if (ar[i]==WRAP) { eval(pf +'wrap=('+pf+'wrap == 0) ? 1 : 0'); continue; } + if (ar[i]==FOLLOWMOUSE) { eval(pf +'followmouse=('+pf+'followmouse == 1) ? 0 : 1'); continue; } + if (ar[i]==MOUSEOFF) { eval(pf +'mouseoff=('+pf+'mouseoff==0) ? 1 : 0'); v=ar[i+1]; if (pf != 'ol_' && eval(pf+'mouseoff') && typeof v == 'number' && (v < pmStart || v > pmUpper)) olHideDelay=ar[++i]; continue; } + if (ar[i]==CLOSETITLE) { eval(pf+"closetitle='"+escSglQuote(ar[++i])+"'"); continue; } + if (ar[i]==CSSOFF||ar[i]==CSSCLASS) { eval(pf+'css='+ar[i]); continue; } + if (ar[i]==COMPATMODE) { eval(pf+'compatmode=('+pf+'compatmode==0) ? 1 : 0'); continue; } + if (ar[i]==FGCLASS) { eval(pf+'fgclass="'+ar[++i]+'"'); continue; } + if (ar[i]==BGCLASS) { eval(pf+'bgclass="'+ar[++i]+'"'); continue; } + if (ar[i]==TEXTFONTCLASS) { eval(pf+'textfontclass="'+ar[++i]+'"'); continue; } + if (ar[i]==CAPTIONFONTCLASS) { eval(pf+'captionfontclass="'+ar[++i]+'"'); continue; } + if (ar[i]==CLOSEFONTCLASS) { eval(pf+'closefontclass="'+ar[++i]+'"'); continue; } + i = parseCmdLine(pf, i, ar); + } + } + + if (fnMark && o3_function) o3_text = o3_function(); + + if ((pf == 'o3_') && o3_wrap) { + o3_width = 0; + + var tReg=/<.*\n*>/ig; + if (!tReg.test(o3_text)) o3_text = o3_text.replace(/[ ]+/g, ' '); + if (!tReg.test(o3_cap))o3_cap = o3_cap.replace(/[ ]+/g, ' '); + } + if ((pf == 'o3_') && o3_sticky) { + if (!o3_close && (o3_frame != ol_frame)) o3_close = ol_close; + if (o3_mouseoff && (o3_frame == ol_frame)) opt_NOCLOSE(' '); + } +} + + +//////// +// LAYER FUNCTIONS +//////// + +// Writes to a layer +function layerWrite(txt) { + txt += "\n"; + if (olNs4) { + var lyr = o3_frame.document.layers['overDiv'].document + lyr.write(txt) + lyr.close() + } else if (typeof over.innerHTML != 'undefined') { + if (olIe5 && isMac) over.innerHTML = ''; + over.innerHTML = txt; + } else { + range = o3_frame.document.createRange(); + range.setStartAfter(over); + domfrag = range.createContextualFragment(txt); + + while (over.hasChildNodes()) { + over.removeChild(over.lastChild); + } + + over.appendChild(domfrag); + } +} + +// Make an object visible +function showObject(obj) { + runHook("showObject", FBEFORE); + + var theObj=(olNs4 ? obj : obj.style); + theObj.visibility = 'visible'; + + runHook("showObject", FAFTER); +} + +// Hides an object +function hideObject(obj) { + runHook("hideObject", FBEFORE); + + var theObj=(olNs4 ? obj : obj.style); + if (olNs6 && olShowId>0) { clearTimeout(olShowId); olShowId=0; } + theObj.visibility = 'hidden'; + theObj.top = theObj.left = ((olIe4&&!olOp) ? 0 : -10000) + (!olNs4 ? 'px' : 0); + + if (o3_timerid > 0) clearTimeout(o3_timerid); + if (o3_delayid > 0) clearTimeout(o3_delayid); + + o3_timerid = 0; + o3_delayid = 0; + self.status = ""; + + if (obj.onmouseout||obj.onmouseover) { + if (olNs4) obj.releaseEvents(Event.MOUSEOUT || Event.MOUSEOVER); + obj.onmouseout = obj.onmouseover = null; + } + + runHook("hideObject", FAFTER); +} + +// Move a layer +function repositionTo(obj, xL, yL) { + var theObj=(olNs4 ? obj : obj.style); + theObj.left = xL + (!olNs4 ? 'px' : 0); + theObj.top = yL + (!olNs4 ? 'px' : 0); +} + +// Check position of cursor relative to overDiv DIVision; mouseOut function +function cursorOff() { + var left = parseInt(over.style.left); + var top = parseInt(over.style.top); + var right = left + (over.offsetWidth >= parseInt(o3_width) ? over.offsetWidth : parseInt(o3_width)); + var bottom = top + (over.offsetHeight >= o3_aboveheight ? over.offsetHeight : o3_aboveheight); + + if (o3_x < left || o3_x > right || o3_y < top || o3_y > bottom) return true; + + return false; +} + + +//////// +// COMMAND FUNCTIONS +//////// + +// Calls callme or the default function. +function opt_FUNCTION(callme) { + o3_text = (callme ? (typeof callme=='string' ? (/.+\(.*\)/.test(callme) ? eval(callme) : callme) : callme()) : (o3_function ? o3_function() : 'No Function')); + + return 0; +} + +// Handle hovering +function opt_NOCLOSE(unused) { + if (!unused) o3_close = ""; + + if (olNs4) { + over.captureEvents(Event.MOUSEOUT || Event.MOUSEOVER); + over.onmouseover = function () { if (o3_timerid > 0) { clearTimeout(o3_timerid); o3_timerid = 0; } } + over.onmouseout = function (e) { if (olHideDelay) hideDelay(olHideDelay); else cClick(e); } + } else { + over.onmouseover = function () {hoveringSwitch = true; if (o3_timerid > 0) { clearTimeout(o3_timerid); o3_timerid =0; } } + } + + return 0; +} + +// Function to scan command line arguments for multiples +function opt_MULTIPLEARGS(i, args, parameter) { + var k=i, re, pV, str=''; + + for(k=i; kpmStart) break; + str += args[k] + ','; + } + if (str) str = str.substring(0,--str.length); + + k--; // reduce by one so the for loop this is in works correctly + pV=(olNs4 && /cellpad/i.test(parameter)) ? str.split(',')[0] : str; + eval(parameter + '="' + pV + '"'); + + return k; +} + +// Remove   in texts when done. +function nbspCleanup() { + if (o3_wrap) { + o3_text = o3_text.replace(/\ /g, ' '); + o3_cap = o3_cap.replace(/\ /g, ' '); + } +} + +// Escape embedded single quotes in text strings +function escSglQuote(str) { + return str.toString().replace(/'/g,"\\'"); +} + +// Onload handler for window onload event +function OLonLoad_handler(e) { + var re = /\w+\(.*\)[;\s]+/g, olre = /overlib\(|nd\(|cClick\(/, fn, l, i; + + if(!olLoaded) olLoaded=1; + + // Remove it for Gecko based browsers + if(window.removeEventListener && e.eventPhase == 3) window.removeEventListener("load",OLonLoad_handler,false); + else if(window.detachEvent) { // and for IE and Opera 4.x but execute calls to overlib, nd, or cClick() + window.detachEvent("onload",OLonLoad_handler); + var fN = document.body.getAttribute('onload'); + if (fN) { + fN=fN.toString().match(re); + if (fN && fN.length) { + for (i=0; i' : '
') : ''; + else { + fontStr='o3_'+whichString+'font'; + fontColor='o3_'+((whichString=='caption')? 'cap' : whichString)+'color'; + return (hasDims&&!olNs4) ? (isClose ? '' : '
') : ''; + } +} + +// Quotes Multi word font names; needed for CSS Standards adherence in font-family +function quoteMultiNameFonts(theFont) { + var v, pM=theFont.split(','); + for (var i=0; i 0) clearTimeout(o3_timerid); + + o3_timerid=setTimeout("cClick()",(o3_timeout=time)); + } +} + +// Was originally in the placeLayer() routine; separated out for future ease +function horizontalPlacement(browserWidth, horizontalScrollAmount, widthFix) { + var placeX, iwidth=browserWidth, winoffset=horizontalScrollAmount; + var parsedWidth = parseInt(o3_width); + + if (o3_fixx > -1 || o3_relx != null) { + // Fixed position + placeX=(o3_relx != null ? ( o3_relx < 0 ? winoffset +o3_relx+ iwidth - parsedWidth - widthFix : winoffset+o3_relx) : o3_fixx); + } else { + // If HAUTO, decide what to use. + if (o3_hauto == 1) { + if ((o3_x - winoffset) > (iwidth / 2)) { + o3_hpos = LEFT; + } else { + o3_hpos = RIGHT; + } + } + + // From mouse + if (o3_hpos == CENTER) { // Center + placeX = o3_x+o3_offsetx-(parsedWidth/2); + + if (placeX < winoffset) placeX = winoffset; + } + + if (o3_hpos == RIGHT) { // Right + placeX = o3_x+o3_offsetx; + + if ((placeX+parsedWidth) > (winoffset+iwidth - widthFix)) { + placeX = iwidth+winoffset - parsedWidth - widthFix; + if (placeX < 0) placeX = 0; + } + } + if (o3_hpos == LEFT) { // Left + placeX = o3_x-o3_offsetx-parsedWidth; + if (placeX < winoffset) placeX = winoffset; + } + + // Snapping! + if (o3_snapx > 1) { + var snapping = placeX % o3_snapx; + + if (o3_hpos == LEFT) { + placeX = placeX - (o3_snapx+snapping); + } else { + // CENTER and RIGHT + placeX = placeX+(o3_snapx - snapping); + } + + if (placeX < winoffset) placeX = winoffset; + } + } + + return placeX; +} + +// was originally in the placeLayer() routine; separated out for future ease +function verticalPlacement(browserHeight,verticalScrollAmount) { + var placeY, iheight=browserHeight, scrolloffset=verticalScrollAmount; + var parsedHeight=(o3_aboveheight ? parseInt(o3_aboveheight) : (olNs4 ? over.clip.height : over.offsetHeight)); + + if (o3_fixy > -1 || o3_rely != null) { + // Fixed position + placeY=(o3_rely != null ? (o3_rely < 0 ? scrolloffset+o3_rely+iheight - parsedHeight : scrolloffset+o3_rely) : o3_fixy); + } else { + // If VAUTO, decide what to use. + if (o3_vauto == 1) { + if ((o3_y - scrolloffset) > (iheight / 2) && o3_vpos == BELOW && (o3_y + parsedHeight + o3_offsety - (scrolloffset + iheight) > 0)) { + o3_vpos = ABOVE; + } else if (o3_vpos == ABOVE && (o3_y - (parsedHeight + o3_offsety) - scrolloffset < 0)) { + o3_vpos = BELOW; + } + } + + // From mouse + if (o3_vpos == ABOVE) { + if (o3_aboveheight == 0) o3_aboveheight = parsedHeight; + + placeY = o3_y - (o3_aboveheight+o3_offsety); + if (placeY < scrolloffset) placeY = scrolloffset; + } else { + // BELOW + placeY = o3_y+o3_offsety; + } + + // Snapping! + if (o3_snapy > 1) { + var snapping = placeY % o3_snapy; + + if (o3_aboveheight > 0 && o3_vpos == ABOVE) { + placeY = placeY - (o3_snapy+snapping); + } else { + placeY = placeY+(o3_snapy - snapping); + } + + if (placeY < scrolloffset) placeY = scrolloffset; + } + } + + return placeY; +} + +// checks positioning flags +function checkPositionFlags() { + if (olHautoFlag) olHautoFlag = o3_hauto=0; + if (olVautoFlag) olVautoFlag = o3_vauto=0; + return true; +} + +// get Browser window width +function windowWidth() { + var w; + if (o3_frame.innerWidth) w=o3_frame.innerWidth; + else if (eval('o3_frame.'+docRoot)&&eval("typeof o3_frame."+docRoot+".clientWidth=='number'")&&eval('o3_frame.'+docRoot+'.clientWidth')) + w=eval('o3_frame.'+docRoot+'.clientWidth'); + return w; +} + +// create the div container for popup content if it doesn't exist +function createDivContainer(id,frm,zValue) { + id = (id || 'overDiv'), frm = (frm || o3_frame), zValue = (zValue || 1000); + var objRef, divContainer = layerReference(id); + + if (divContainer == null) { + if (olNs4) { + divContainer = frm.document.layers[id] = new Layer(window.innerWidth, frm); + objRef = divContainer; + } else { + var body = (olIe4 ? frm.document.all.tags('BODY')[0] : frm.document.getElementsByTagName("BODY")[0]); + if (olIe4&&!document.getElementById) { + body.insertAdjacentHTML("beforeEnd",'
'); + divContainer=layerReference(id); + } else { + divContainer = frm.document.createElement("DIV"); + divContainer.id = id; + body.appendChild(divContainer); + } + objRef = divContainer.style; + } + + objRef.position = 'absolute'; + objRef.visibility = 'hidden'; + objRef.zIndex = zValue; + if (olIe4&&!olOp) objRef.left = objRef.top = '0px'; + else objRef.left = objRef.top = -10000 + (!olNs4 ? 'px' : 0); + } + + return divContainer; +} + +// get reference to a layer with ID=id +function layerReference(id) { + return (olNs4 ? o3_frame.document.layers[id] : (document.all ? o3_frame.document.all[id] : o3_frame.document.getElementById(id))); +} +//////// +// UTILITY FUNCTIONS +//////// + +// Checks if something is a function. +function isFunction(fnRef) { + var rtn = true; + + if (typeof fnRef == 'object') { + for (var i = 0; i < fnRef.length; i++) { + if (typeof fnRef[i]=='function') continue; + rtn = false; + break; + } + } else if (typeof fnRef != 'function') { + rtn = false; + } + + return rtn; +} + +// Converts an array into an argument string for use in eval. +function argToString(array, strtInd, argName) { + var jS = strtInd, aS = '', ar = array; + argName=(argName ? argName : 'ar'); + + if (ar.length > jS) { + for (var k = jS; k < ar.length; k++) aS += argName+'['+k+'], '; + aS = aS.substring(0, aS.length-2); + } + + return aS; +} + +// Places a hook in the correct position in a hook point. +function reOrder(hookPt, fnRef, order) { + var newPt = new Array(), match, i, j; + + if (!order || typeof order == 'undefined' || typeof order == 'number') return hookPt; + + if (typeof order=='function') { + if (typeof fnRef=='object') { + newPt = newPt.concat(fnRef); + } else { + newPt[newPt.length++]=fnRef; + } + + for (i = 0; i < hookPt.length; i++) { + match = false; + if (typeof fnRef == 'function' && hookPt[i] == fnRef) { + continue; + } else { + for(j = 0; j < fnRef.length; j++) if (hookPt[i] == fnRef[j]) { + match = true; + break; + } + } + if (!match) newPt[newPt.length++] = hookPt[i]; + } + + newPt[newPt.length++] = order; + + } else if (typeof order == 'object') { + if (typeof fnRef == 'object') { + newPt = newPt.concat(fnRef); + } else { + newPt[newPt.length++] = fnRef; + } + + for (j = 0; j < hookPt.length; j++) { + match = false; + if (typeof fnRef == 'function' && hookPt[j] == fnRef) { + continue; + } else { + for (i = 0; i < fnRef.length; i++) if (hookPt[j] == fnRef[i]) { + match = true; + break; + } + } + if (!match) newPt[newPt.length++]=hookPt[j]; + } + + for (i = 0; i < newPt.length; i++) hookPt[i] = newPt[i]; + newPt.length = 0; + + for (j = 0; j < hookPt.length; j++) { + match = false; + for (i = 0; i < order.length; i++) { + if (hookPt[j] == order[i]) { + match = true; + break; + } + } + if (!match) newPt[newPt.length++] = hookPt[j]; + } + newPt = newPt.concat(order); + } + + hookPt = newPt; + + return hookPt; +} + +//////// +// PLUGIN ACTIVATION FUNCTIONS +//////// + +// Runs plugin functions to set runtime variables. +function setRunTimeVariables(){ + if (typeof runTime != 'undefined' && runTime.length) { + for (var k = 0; k < runTime.length; k++) { + runTime[k](); + } + } +} + +// Runs plugin functions to parse commands. +function parseCmdLine(pf, i, args) { + if (typeof cmdLine != 'undefined' && cmdLine.length) { + for (var k = 0; k < cmdLine.length; k++) { + var j = cmdLine[k](pf, i, args); + if (j >- 1) { + i = j; + break; + } + } + } + + return i; +} + +// Runs plugin functions to do things after parse. +function postParseChecks(pf,args){ + if (typeof postParse != 'undefined' && postParse.length) { + for (var k = 0; k < postParse.length; k++) { + if (postParse[k](pf,args)) continue; + return false; // end now since have an error + } + } + return true; +} + + +//////// +// PLUGIN REGISTRATION FUNCTIONS +//////// + +// Registers commands and creates constants. +function registerCommands(cmdStr) { + if (typeof cmdStr!='string') return; + + var pM = cmdStr.split(','); + pms = pms.concat(pM); + + for (var i = 0; i< pM.length; i++) { + eval(pM[i].toUpperCase()+'='+pmCount++); + } +} + +// Registers no-parameter commands +function registerNoParameterCommands(cmdStr) { + if (!cmdStr && typeof cmdStr != 'string') return; + pmt=(!pmt) ? cmdStr : pmt + ',' + cmdStr; +} + +// Register a function to hook at a certain point. +function registerHook(fnHookTo, fnRef, hookType, optPm) { + var hookPt, last = typeof optPm; + + if (fnHookTo == 'plgIn'||fnHookTo == 'postParse') return; + if (typeof hookPts[fnHookTo] == 'undefined') hookPts[fnHookTo] = new FunctionReference(); + + hookPt = hookPts[fnHookTo]; + + if (hookType != null) { + if (hookType == FREPLACE) { + hookPt.ovload = fnRef; // replace normal overlib routine + if (fnHookTo.indexOf('ol_content_') > -1) hookPt.alt[pms[CSSOFF-1-pmStart]]=fnRef; + + } else if (hookType == FBEFORE || hookType == FAFTER) { + var hookPt=(hookType == 1 ? hookPt.before : hookPt.after); + + if (typeof fnRef == 'object') { + hookPt = hookPt.concat(fnRef); + } else { + hookPt[hookPt.length++] = fnRef; + } + + if (optPm) hookPt = reOrder(hookPt, fnRef, optPm); + + } else if (hookType == FALTERNATE) { + if (last=='number') hookPt.alt[pms[optPm-1-pmStart]] = fnRef; + } else if (hookType == FCHAIN) { + hookPt = hookPt.chain; + if (typeof fnRef=='object') hookPt=hookPt.concat(fnRef); // add other functions + else hookPt[hookPt.length++]=fnRef; + } + + return; + } +} + +// Register a function that will set runtime variables. +function registerRunTimeFunction(fn) { + if (isFunction(fn)) { + if (typeof fn == 'object') { + runTime = runTime.concat(fn); + } else { + runTime[runTime.length++] = fn; + } + } +} + +// Register a function that will handle command parsing. +function registerCmdLineFunction(fn){ + if (isFunction(fn)) { + if (typeof fn == 'object') { + cmdLine = cmdLine.concat(fn); + } else { + cmdLine[cmdLine.length++] = fn; + } + } +} + +// Register a function that does things after command parsing. +function registerPostParseFunction(fn){ + if (isFunction(fn)) { + if (typeof fn == 'object') { + postParse = postParse.concat(fn); + } else { + postParse[postParse.length++] = fn; + } + } +} + +//////// +// PLUGIN REGISTRATION FUNCTIONS +//////// + +// Runs any hooks registered. +function runHook(fnHookTo, hookType) { + var l = hookPts[fnHookTo], k, rtnVal = null, optPm, arS, ar = runHook.arguments; + + if (hookType == FREPLACE) { + arS = argToString(ar, 2); + + if (typeof l == 'undefined' || !(l = l.ovload)) rtnVal = eval(fnHookTo+'('+arS+')'); + else rtnVal = eval('l('+arS+')'); + + } else if (hookType == FBEFORE || hookType == FAFTER) { + if (typeof l != 'undefined') { + l=(hookType == 1 ? l.before : l.after); + + if (l.length) { + arS = argToString(ar, 2); + for (var k = 0; k < l.length; k++) eval('l[k]('+arS+')'); + } + } + } else if (hookType == FALTERNATE) { + optPm = ar[2]; + arS = argToString(ar, 3); + + if (typeof l == 'undefined' || (l = l.alt[pms[optPm-1-pmStart]]) == 'undefined') { + rtnVal = eval(fnHookTo+'('+arS+')'); + } else { + rtnVal = eval('l('+arS+')'); + } + } else if (hookType == FCHAIN) { + arS=argToString(ar,2); + l=l.chain; + + for (k=l.length; k > 0; k--) if((rtnVal=eval('l[k-1]('+arS+')'))!=void(0)) break; + } + + return rtnVal; +} + +//////// +// OBJECT CONSTRUCTORS +//////// + +// Object for handling hooks. +function FunctionReference() { + this.ovload = null; + this.before = new Array(); + this.after = new Array(); + this.alt = new Array(); + this.chain = new Array(); +} + +// Object for simple access to the overLIB version used. +// Examples: simpleversion:351 major:3 minor:5 revision:1 +function Info(version, prerelease) { + this.version = version; + this.prerelease = prerelease; + + this.simpleversion = Math.round(this.version*100); + this.major = parseInt(this.simpleversion / 100); + this.minor = parseInt(this.simpleversion / 10) - this.major * 10; + this.revision = parseInt(this.simpleversion) - this.major * 100 - this.minor * 10; + this.meets = meets; +} + +// checks for Core Version required +function meets(reqdVersion) { + return (!reqdVersion) ? false : this.simpleversion >= Math.round(100*parseFloat(reqdVersion)); +} + + +//////// +// STANDARD REGISTRATIONS +//////// +registerHook("ol_content_simple", ol_content_simple, FALTERNATE, CSSOFF); +registerHook("ol_content_caption", ol_content_caption, FALTERNATE, CSSOFF); +registerHook("ol_content_background", ol_content_background, FALTERNATE, CSSOFF); +registerHook("ol_content_simple", ol_content_simple, FALTERNATE, CSSCLASS); +registerHook("ol_content_caption", ol_content_caption, FALTERNATE, CSSCLASS); +registerHook("ol_content_background", ol_content_background, FALTERNATE, CSSCLASS); +registerPostParseFunction(checkPositionFlags); +registerHook("hideObject", nbspCleanup, FAFTER); +registerHook("horizontalPlacement", horizontalPlacement, FCHAIN); +registerHook("verticalPlacement", verticalPlacement, FCHAIN); +if (olNs4||(olIe5&&isMac)||olKq) olLoaded=1; +registerNoParameterCommands('sticky,autostatus,autostatuscap,fullhtml,hauto,vauto,closeclick,wrap,followmouse,mouseoff,compatmode'); +/////// +// ESTABLISH MOUSECAPTURING +/////// + +// Capture events, alt. diffuses the overlib function. +var olCheckMouseCapture=true; +if ((olNs4 || olNs6 || olIe4)) { + olMouseCapture(); +} else { + overlib = no_overlib; + nd = no_overlib; + ver3fix = true; +} diff --git a/js/pMap.js b/js/pMap.js new file mode 100644 index 000000000..2f486435f --- /dev/null +++ b/js/pMap.js @@ -0,0 +1,70 @@ + /* + pMap - a JavaScript to add image map support to pChart graphs! + Copyright (C) 2008 Jean-Damien POGOLOTTI + Version 1.1 last updated on 08/20/08 + + http://pchart.sourceforge.net + + 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 1,2,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 . + */ + + var pMap_IE = document.all?true:false; + var pMap_ImageMap = new Array(); + var pMap_ImageID = ""; + var pMap_MouseX = 0; + var pMap_MouseY = 0; + var pMap_CurrentMap = -1; + var pMap_URL = ""; + var pMap_Tries = 0; + var pMap_MaxTries = 5; + var pMap_HTTP_Timeout = 1000; + var pMap_MUTEX = false; + var pMap_MUTEX_Timeout = 100; + + if (!pMap_IE) { document.captureEvents(Event.MOUSEMOVE); } + + function getMousePosition(e) + { + /* Protect against event storm */ + if (pMap_MUTEX) { return(0);} + pMap_MUTEX = true; + setTimeout("pMap_MUTEX=false",pMap_MUTEX_Timeout); + + /* Determine mouse position over the chart */ + if (pMap_IE) + { pMap_MouseX = event.clientX + document.body.scrollLeft; pMap_MouseY = event.clientY + document.body.scrollTop; } + else + { pMap_MouseX = e.pageX; pMap_MouseY = e.pageY; } + pMap_MouseX -= document.getElementById(pMap_ImageID).offsetLeft; + pMap_MouseY -= document.getElementById(pMap_ImageID).offsetTop; + + /* Check if we are flying over a map zone */ + Found = false; + for (Map in pMap_ImageMap) + { + Values = pMap_ImageMap[Map].split(","); + if ( pMap_MouseX>=Values[0] && pMap_MouseX<=Values[2]) + { + if ( pMap_MouseY>=Values[1] && pMap_MouseY<=Values[3] ) + { + Found = true; + if ( pMap_CurrentMap != Map ) + { overlib(Values[5], CAPTION, Values[4], WIDTH, 80); pMap_CurrentMap = Map; } + } + } + if ( !Found && pMap_CurrentMap != -1 ) { nd(); pMap_CurrentMap = -1; } + } + } + + function LoadImageMap(ID, map) { pMap_ImageID = ID, pMap_ImageMap = map.split("-"); } diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php index 363a57541..ebd9c562f 100644 --- a/libraries/chart/pma_pchart_chart.php +++ b/libraries/chart/pma_pchart_chart.php @@ -60,6 +60,8 @@ abstract class PMA_pChart_Chart extends PMA_Chart } $this->chart->setFontProperties($this->getFontPath().'tahoma.ttf', 8); + + $this->chart->setImageMap(true, 'mapid'); } abstract protected function prepareDataSet(); @@ -132,7 +134,14 @@ abstract class PMA_pChart_Chart extends PMA_Chart $this->prepareChart(); $this->render(); - return ''; + $returnData = ''; + $returnData .= ' + + '; + + return $returnData; } else { array_push($this->errors, ERR_NO_GD); @@ -164,6 +173,11 @@ abstract class PMA_pChart_Chart extends PMA_Chart { return $this->settings['scale']; } + + protected function getImageMap() + { + return $this->chart->ImageMap; + } } ?> diff --git a/tbl_chart.php b/tbl_chart.php index f00a291b2..a0fdfb828 100644 --- a/tbl_chart.php +++ b/tbl_chart.php @@ -20,6 +20,9 @@ if (! defined('PMA_NO_VARIABLES_IMPORT')) { */ require_once './libraries/common.inc.php'; +$GLOBALS['js_include'][] = 'overlib.js'; +$GLOBALS['js_include'][] = 'pMap.js'; + /** * Runs common work */ From 2f78d2d147ae22563e1c0d44e9f0a60155efee0e Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Tue, 20 Jul 2010 23:29:13 +0300 Subject: [PATCH 49/80] tooltip on the pie working. Now only on the query results chart. --- js/pMap.js | 62 ++++++++++++++++++++++------ libraries/chart/pChart/pChart.class | 33 +++++++++++++-- libraries/chart/pma_pchart_chart.php | 2 +- 3 files changed, 80 insertions(+), 17 deletions(-) diff --git a/js/pMap.js b/js/pMap.js index 2f486435f..1c73ba62d 100644 --- a/js/pMap.js +++ b/js/pMap.js @@ -24,7 +24,7 @@ var pMap_ImageID = ""; var pMap_MouseX = 0; var pMap_MouseY = 0; - var pMap_CurrentMap = -1; + var pMap_CurrentKey = -1; var pMap_URL = ""; var pMap_Tries = 0; var pMap_MaxTries = 5; @@ -49,22 +49,58 @@ pMap_MouseX -= document.getElementById(pMap_ImageID).offsetLeft; pMap_MouseY -= document.getElementById(pMap_ImageID).offsetTop; - /* Check if we are flying over a map zone */ + /* Check if we are flying over a map zone + * Lets use the following method to check if a given + * point is in any convex polygon. + * http://www.programmingforums.org/post168124-3.html + */ Found = false; - for (Map in pMap_ImageMap) + for (Key in pMap_ImageMap) { - Values = pMap_ImageMap[Map].split(","); - if ( pMap_MouseX>=Values[0] && pMap_MouseX<=Values[2]) + Values = Key.split("--"); + SeriesName = Values[0]; + SeriesValue = Values[1]; + SignSum = 0; + for (i = 0; i <= pMap_ImageMap[Key].length - 1; i++) { - if ( pMap_MouseY>=Values[1] && pMap_MouseY<=Values[3] ) - { - Found = true; - if ( pMap_CurrentMap != Map ) - { overlib(Values[5], CAPTION, Values[4], WIDTH, 80); pMap_CurrentMap = Map; } - } + if (i == pMap_ImageMap[Key].length - 1) + { + index1 = i; + index2 = 0; + } + else + { + index1 = i; + index2 = i+1; + } + result = getDeterminant( + pMap_ImageMap[Key][index1][0], + pMap_ImageMap[Key][index1][1], + pMap_ImageMap[Key][index2][0], + pMap_ImageMap[Key][index2][1], + pMap_MouseX, + pMap_MouseY + ); + if (result > 0) { SignSum += 1; } else { SignSum += -1; } + } + //console.log(Key+": "+SignSum); + if (Math.abs(SignSum) == pMap_ImageMap[Key].length) + { + Found = true; + if ( pMap_CurrentKey != Key ) + { overlib(SeriesValue, CAPTION, SeriesName, WIDTH, 80); pMap_CurrentKey = Key; } } - if ( !Found && pMap_CurrentMap != -1 ) { nd(); pMap_CurrentMap = -1; } } + if ( !Found && pMap_CurrentKey != -1 ) { nd(); pMap_CurrentKey = -1; } } - function LoadImageMap(ID, map) { pMap_ImageID = ID, pMap_ImageMap = map.split("-"); } + function getDeterminant(X1, Y1, X2, Y2, X3, Y3) + { + return (X2*Y3 - X3*Y2) - (X1*Y3 - X3*Y1) + (X1*Y2 - X2*Y1); + } + + function LoadImageMap(ID, map) + { + pMap_ImageID = ID; + pMap_ImageMap = JSON.parse(map); + } diff --git a/libraries/chart/pChart/pChart.class b/libraries/chart/pChart/pChart.class index c5f739535..538617268 100644 --- a/libraries/chart/pChart/pChart.class +++ b/libraries/chart/pChart/pChart.class @@ -2748,6 +2748,25 @@ } } + /* Add points to Image Map. + * The center point abd the first, middle and last of the arc is taken. + */ + foreach ($TopPlots as $key => $PointArr) + { + // last point of the arc + $this->addPointToImageMap($PointArr[count($PointArr)-4],$PointArr[count($PointArr)-3],$Data[$key][$DataDescription['Values'][1]],$Data[$key][$DataDescription['Values'][0]],"Pie"); + + // the point at the middle + $this->addPointToImageMap($PointArr[0],$PointArr[1],$Data[$key][$DataDescription['Values'][1]],$Data[$key][$DataDescription['Values'][0]],"Pie"); + + // firs point in the arc + $this->addPointToImageMap($PointArr[2],$PointArr[3],$Data[$key][$DataDescription['Values'][1]],$Data[$key][$DataDescription['Values'][0]],"Pie"); + + // point in the middle of the arc + $middle = count($PointArr)/2; + $this->addPointToImageMap($PointArr[$middle + ($middle % 2)],$PointArr[$middle + ($middle % 2)+1],$Data[$key][$DataDescription['Values'][1]],$Data[$key][$DataDescription['Values'][0]],"Pie"); + } + /* Draw Top polygons */ for($Key=count($iValues)-1;$Key>=0;$Key--) { @@ -3371,9 +3390,17 @@ /* Add a box into the image map */ function addToImageMap($X1,$Y1,$X2,$Y2,$SerieName,$Value,$CallerFunction) { - if ( $this->MapFunction == NULL || $this->MapFunction == $CallerFunction ) - { - $this->ImageMap[] = round($X1).",".round($Y1).",".round($X2).",".round($Y2).",".$SerieName.",".$Value; + $this->addPointToImageMap($X1,$Y1,$SerieName,$Value,$CallerFunction); + $this->addPointToImageMap($X2,$Y1,$SerieName,$Value,$CallerFunction); + $this->addPointToImageMap($X2,$Y2,$SerieName,$Value,$CallerFunction); + $this->addPointToImageMap($X1,$Y2,$SerieName,$Value,$CallerFunction); + } + + function addPointToImageMap($X1,$Y1,$SerieName,$Value,$CallerFunction) + { + if ( $this->MapFunction == NULL || $this->MapFunction == $CallerFunction) + { + $this->ImageMap["$SerieName--$Value"][] = array(round($X1), round($Y1)); $this->MapFunction = $CallerFunction; } } diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php index ebd9c562f..910d8040b 100644 --- a/libraries/chart/pma_pchart_chart.php +++ b/libraries/chart/pma_pchart_chart.php @@ -137,7 +137,7 @@ abstract class PMA_pChart_Chart extends PMA_Chart $returnData = ''; $returnData .= ' '; From 557eb2096bedb5f46f49d10b8e3349f7273d4fe3 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Wed, 21 Jul 2010 19:32:17 +0300 Subject: [PATCH 50/80] added tooltips for radar charts. --- libraries/chart/pChart/pChart.class | 47 ++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/libraries/chart/pChart/pChart.class b/libraries/chart/pChart/pChart.class index 538617268..6298c595c 100644 --- a/libraries/chart/pChart/pChart.class +++ b/libraries/chart/pChart/pChart.class @@ -2198,6 +2198,28 @@ { $XOffset = -$Width; } imagettftext($this->Picture,$this->FontSize,0,$X+$XOffset,$Y+$YOffset,$C_TextColor,$this->FontName,$Label); + + if ( $this->BuildMap ) + { + $vecX = $X - $XCenter; + $vecY = $Y - $YCenter; + + // get a perpendicular vector + $vecXtemp = $vecX; + $vecX = -$vecY; + $vecY = $vecXtemp; + + // normalization + $vecLength = sqrt($vecX * $vecX + $vecY * $vecY); + $vecX = $vecX / $vecLength; + $vecY = $vecY / $vecLength; + + $offset = 10; + $this->addPointToImageMap($X+$vecX*-$offset,$Y+$vecY*-$offset,$Label,'Value','Radar'); + $this->addPointToImageMap($X+$vecX*+$offset,$Y+$vecY*+$offset,$Label,'Value','Radar'); + $this->addPointToImageMap($XCenter+$vecX*+$offset,$YCenter+$vecY*+$offset,$Label,'Value','Radar'); + $this->addPointToImageMap($XCenter+$vecX*-$offset,$YCenter+$vecY*-$offset,$Label,'Value','Radar'); + } } } @@ -2748,23 +2770,26 @@ } } + if ( $this->BuildMap ) + { /* Add points to Image Map. * The center point abd the first, middle and last of the arc is taken. */ - foreach ($TopPlots as $key => $PointArr) - { - // last point of the arc - $this->addPointToImageMap($PointArr[count($PointArr)-4],$PointArr[count($PointArr)-3],$Data[$key][$DataDescription['Values'][1]],$Data[$key][$DataDescription['Values'][0]],"Pie"); + foreach ($TopPlots as $key => $PointArr) + { + // last point of the arc + $this->addPointToImageMap($PointArr[count($PointArr)-4],$PointArr[count($PointArr)-3],$Data[$key][$DataDescription['Values'][1]],$Data[$key][$DataDescription['Values'][0]],"Pie"); - // the point at the middle - $this->addPointToImageMap($PointArr[0],$PointArr[1],$Data[$key][$DataDescription['Values'][1]],$Data[$key][$DataDescription['Values'][0]],"Pie"); + // the point at the middle + $this->addPointToImageMap($PointArr[0],$PointArr[1],$Data[$key][$DataDescription['Values'][1]],$Data[$key][$DataDescription['Values'][0]],"Pie"); - // firs point in the arc - $this->addPointToImageMap($PointArr[2],$PointArr[3],$Data[$key][$DataDescription['Values'][1]],$Data[$key][$DataDescription['Values'][0]],"Pie"); + // firs point in the arc + $this->addPointToImageMap($PointArr[2],$PointArr[3],$Data[$key][$DataDescription['Values'][1]],$Data[$key][$DataDescription['Values'][0]],"Pie"); - // point in the middle of the arc - $middle = count($PointArr)/2; - $this->addPointToImageMap($PointArr[$middle + ($middle % 2)],$PointArr[$middle + ($middle % 2)+1],$Data[$key][$DataDescription['Values'][1]],$Data[$key][$DataDescription['Values'][0]],"Pie"); + // point in the middle of the arc + $middle = count($PointArr)/2; + $this->addPointToImageMap($PointArr[$middle + ($middle % 2)],$PointArr[$middle + ($middle % 2)+1],$Data[$key][$DataDescription['Values'][1]],$Data[$key][$DataDescription['Values'][0]],"Pie"); + } } /* Draw Top polygons */ From bcbd662f4856e3d7c413d182d2cf017c556daf64 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Wed, 21 Jul 2010 19:35:15 +0300 Subject: [PATCH 51/80] added tooltip JS includes for other chart places. --- server_status.php | 3 +++ sql.php | 2 ++ 2 files changed, 5 insertions(+) diff --git a/server_status.php b/server_status.php index 3869cbbdf..7afe8441f 100644 --- a/server_status.php +++ b/server_status.php @@ -17,6 +17,9 @@ if (! defined('PMA_NO_VARIABLES_IMPORT')) { } require_once './libraries/common.inc.php'; +$GLOBALS['js_include'][] = 'overlib.js'; +$GLOBALS['js_include'][] = 'pMap.js'; + /** * Does the common work */ diff --git a/sql.php b/sql.php index 1ec8f0dab..33321f8d9 100644 --- a/sql.php +++ b/sql.php @@ -16,6 +16,8 @@ require_once './libraries/check_user_privileges.lib.php'; require_once './libraries/bookmark.lib.php'; $GLOBALS['js_include'][] = 'jquery/jquery-ui-1.8.custom.js'; +$GLOBALS['js_include'][] = 'overlib.js'; +$GLOBALS['js_include'][] = 'pMap.js'; /** * Defines the url to return to in case of error in a sql statement From e3736762aeecf47c4c4a062af49c5f5edc61448f Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Thu, 22 Jul 2010 14:30:02 +0300 Subject: [PATCH 52/80] cleaned JS for tooltips --- js/pMap.js | 158 +++++++++++++-------------- libraries/chart/pma_pchart_chart.php | 4 +- 2 files changed, 81 insertions(+), 81 deletions(-) diff --git a/js/pMap.js b/js/pMap.js index 1c73ba62d..a40dee9e4 100644 --- a/js/pMap.js +++ b/js/pMap.js @@ -1,7 +1,9 @@ /* pMap - a JavaScript to add image map support to pChart graphs! Copyright (C) 2008 Jean-Damien POGOLOTTI + Copyright (C) 2010 Martynas Mickevicius Version 1.1 last updated on 08/20/08 + Version 1.2 last updated on 07/22/10 http://pchart.sourceforge.net @@ -19,88 +21,86 @@ along with this program. If not, see . */ - var pMap_IE = document.all?true:false; - var pMap_ImageMap = new Array(); - var pMap_ImageID = ""; - var pMap_MouseX = 0; - var pMap_MouseY = 0; - var pMap_CurrentKey = -1; - var pMap_URL = ""; - var pMap_Tries = 0; - var pMap_MaxTries = 5; - var pMap_HTTP_Timeout = 1000; - var pMap_MUTEX = false; - var pMap_MUTEX_Timeout = 100; +var imageMap = { + 'mouseMoved': function(event, cont) { + // get mouse coordinated relative to image + mouseX = event.pageX - cont.offsetLeft; + mouseY = event.pageY - cont.offsetTop; - if (!pMap_IE) { document.captureEvents(Event.MOUSEMOVE); } + //console.log("X: " + mouseX + ", Y: " + mouseY); - function getMousePosition(e) - { - /* Protect against event storm */ - if (pMap_MUTEX) { return(0);} - pMap_MUTEX = true; - setTimeout("pMap_MUTEX=false",pMap_MUTEX_Timeout); + //return; - /* Determine mouse position over the chart */ - if (pMap_IE) - { pMap_MouseX = event.clientX + document.body.scrollLeft; pMap_MouseY = event.clientY + document.body.scrollTop; } - else - { pMap_MouseX = e.pageX; pMap_MouseY = e.pageY; } - pMap_MouseX -= document.getElementById(pMap_ImageID).offsetLeft; - pMap_MouseY -= document.getElementById(pMap_ImageID).offsetTop; + /* Check if we are flying over a map zone + * Lets use the following method to check if a given + * point is in any convex polygon. + * http://www.programmingforums.org/post168124-3.html + */ + found = false; + for (key in this.imageMap) + { + values = key.split("--"); + seriesName = values[0]; + seriesValue = values[1]; - /* Check if we are flying over a map zone - * Lets use the following method to check if a given - * point is in any convex polygon. - * http://www.programmingforums.org/post168124-3.html - */ - Found = false; - for (Key in pMap_ImageMap) - { - Values = Key.split("--"); - SeriesName = Values[0]; - SeriesValue = Values[1]; - SignSum = 0; - for (i = 0; i <= pMap_ImageMap[Key].length - 1; i++) - { - if (i == pMap_ImageMap[Key].length - 1) - { - index1 = i; - index2 = 0; - } - else - { - index1 = i; - index2 = i+1; - } - result = getDeterminant( - pMap_ImageMap[Key][index1][0], - pMap_ImageMap[Key][index1][1], - pMap_ImageMap[Key][index2][0], - pMap_ImageMap[Key][index2][1], - pMap_MouseX, - pMap_MouseY - ); - if (result > 0) { SignSum += 1; } else { SignSum += -1; } - } - //console.log(Key+": "+SignSum); - if (Math.abs(SignSum) == pMap_ImageMap[Key].length) - { - Found = true; - if ( pMap_CurrentKey != Key ) - { overlib(SeriesValue, CAPTION, SeriesName, WIDTH, 80); pMap_CurrentKey = Key; } - } + signSum = 0; + for (i = 0; i <= this.imageMap[key].length - 1; i++) + { + if (i == this.imageMap[key].length - 1) + { + index1 = i; + index2 = 0; + } + else + { + index1 = i; + index2 = i+1; + } + result = this.getDeterminant( + this.imageMap[key][index1][0], + this.imageMap[key][index1][1], + this.imageMap[key][index2][0], + this.imageMap[key][index2][1], + mouseX, + mouseY + ); + if (result > 0) { signSum += 1; } else { signSum += -1; } + } + //console.log(Key+": "+SignSum); + if (Math.abs(signSum) == this.imageMap[key].length) + { + found = true; + if (this.currentKey != key) + { + overlib(seriesValue, CAPTION, seriesName, WIDTH, 80); + this.currentKey = key; + } + } + } + if (!found && this.currentKey != -1 ) + { + nd(); + this.currentKey = -1; + } + }, + + 'getDeterminant': function (X1, Y1, X2, Y2, X3, Y3) { + return (X2*Y3 - X3*Y2) - (X1*Y3 - X3*Y1) + (X1*Y2 - X2*Y1); + }, + + 'loadImageMap': function(map) { + imageMap.imageMap = JSON.parse(map); + }, + + 'init': function() { + $("img#chart").bind('mousemove',function(e) { + imageMap.mouseMoved(e, this); + }); + + this.currentKey = -1; } - if ( !Found && pMap_CurrentKey != -1 ) { nd(); pMap_CurrentKey = -1; } - } +}; - function getDeterminant(X1, Y1, X2, Y2, X3, Y3) - { - return (X2*Y3 - X3*Y2) - (X1*Y3 - X3*Y1) + (X1*Y2 - X2*Y1); - } - - function LoadImageMap(ID, map) - { - pMap_ImageID = ID; - pMap_ImageMap = JSON.parse(map); - } +$(document).ready(function() { + imageMap.init() +}); diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php index 910d8040b..dfba08169 100644 --- a/libraries/chart/pma_pchart_chart.php +++ b/libraries/chart/pma_pchart_chart.php @@ -134,10 +134,10 @@ abstract class PMA_pChart_Chart extends PMA_Chart $this->prepareChart(); $this->render(); - $returnData = ''; + $returnData = ''; $returnData .= ' '; From 25a59f23d5d97e0d9459feba97eb63959c7b4f76 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Fri, 23 Jul 2010 13:19:30 +0300 Subject: [PATCH 53/80] chart is rendered in parts. Fixes the issue with browsers which have limited size on base64 images. --- js/pMap.js | 10 +++++-- libraries/chart/pma_pchart_chart.php | 40 +++++++++++++++++++++------- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/js/pMap.js b/js/pMap.js index a40dee9e4..fbcd817b8 100644 --- a/js/pMap.js +++ b/js/pMap.js @@ -89,11 +89,17 @@ var imageMap = { }, 'loadImageMap': function(map) { - imageMap.imageMap = JSON.parse(map); + this.imageMap = JSON.parse(map); + for (key in this.imageMap) + { + // FIXME + // without this loop image map does not work + // on IE8 in the status page + } }, 'init': function() { - $("img#chart").bind('mousemove',function(e) { + $("div#chart").bind('mousemove',function(e) { imageMap.mouseMoved(e, this); }); diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php index dfba08169..87ca65f70 100644 --- a/libraries/chart/pma_pchart_chart.php +++ b/libraries/chart/pma_pchart_chart.php @@ -21,7 +21,7 @@ abstract class PMA_pChart_Chart extends PMA_Chart protected $dataSet; protected $chart; - protected $imageEncoded; + protected $partsEncoded = array(); public function __construct($data, $options = null) { @@ -116,14 +116,32 @@ abstract class PMA_pChart_Chart extends PMA_Chart protected abstract function drawChart(); - protected function render() + protected function render($parts = 1) { - ob_start(); - imagepng($this->chart->Picture); - $output = ob_get_contents(); - ob_end_clean(); + $fullWidth = 0; - $this->imageEncoded = base64_encode($output); + for ($i = 0; $i < $parts; $i++) { + $partHeight = $this->chart->YSize; + $partWidth = round($this->chart->XSize / $parts); + $fullWidth += $partWidth; + $partX = $partWidth * $i; + + if ($i == $parts - 1) { + // compensate for the rounding errors in the last part + $partWidth += $this->chart->XSize - $fullWidth; + } + + $part = imagecreatetruecolor($partWidth, $partHeight); + imagecopy($part, $this->chart->Picture, 0, 0, $partX, 0, $partWidth, $partHeight); + + ob_start(); + imagepng($part, NULL, 9, PNG_ALL_FILTERS); + $output = ob_get_contents(); + ob_end_clean(); + + $partEncoded = base64_encode($output); + $this->partsEncoded[$i] = $partEncoded; + } } public function toString() @@ -132,9 +150,13 @@ abstract class PMA_pChart_Chart extends PMA_Chart $this->init(); $this->prepareDataSet(); $this->prepareChart(); - $this->render(); + $this->render(20); - $returnData = ''; + $returnData = '
'; + foreach ($this->partsEncoded as $part) { + $returnData .= ''; + } + $returnData .= '
'; $returnData .= ' '; @@ -241,7 +241,7 @@ abstract class PMA_pChart_Chart extends PMA_Chart protected function getImageMap() { - return $this->chart->ImageMap; + return $this->chart->getImageMap(); } } From 55089f12dbd9493a92bab79e2d11a956368ad61f Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Thu, 29 Jul 2010 20:22:55 +0300 Subject: [PATCH 71/80] getting title shadow back. Will see how it looks on the demo server. --- libraries/chart/pma_pchart_chart.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php index e5c8bf649..97af13604 100644 --- a/libraries/chart/pma_pchart_chart.php +++ b/libraries/chart/pma_pchart_chart.php @@ -99,7 +99,7 @@ abstract class PMA_pChart_Chart extends PMA_Chart protected function drawTitle() { // Draw the title - $this->chart->drawTextBox(0,0,$this->getWidth(),$this->getLabelHeight(),$this->getTitleText(),0,250,250,250,ALIGN_CENTER,FALSE,0,0,0,30); + $this->chart->drawTextBox(0,0,$this->getWidth(),$this->getLabelHeight(),$this->getTitleText(),0,250,250,250,ALIGN_CENTER,True,0,0,0,30); } protected function setGraphAreaDimensions() From 68f4a8daf70a832f2f7d87c379250d6816895c0a Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Thu, 29 Jul 2010 20:26:16 +0300 Subject: [PATCH 72/80] removed OFC implementation, since we are not going to use it. --- flash/open-flash-chart.swf | Bin 276186 -> 0 bytes libraries/chart.lib.php | 2 - libraries/chart/pma_ofc_chart.php | 89 ------------------------------ libraries/chart/pma_ofc_pie.php | 46 --------------- 4 files changed, 137 deletions(-) delete mode 100644 flash/open-flash-chart.swf delete mode 100644 libraries/chart/pma_ofc_chart.php delete mode 100644 libraries/chart/pma_ofc_pie.php diff --git a/flash/open-flash-chart.swf b/flash/open-flash-chart.swf deleted file mode 100644 index 3a01e52aeeaba86b1a932c09ad48bb447e8ad8f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276186 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%0AswSAXJNzV>MU?tF`JR^B}b7* zM29nb;u#ITrw2k3`9d38Iof9>Y}9Dq=A^lYNzjl_wP}MzyHw)g3_jm!4=%7~FgF^? z7&Uw?;QMvZZBp}dzaDnCE@!?1u_a3_w+QAPVv*##+q__-OxJ{`0UKo6w;i5X7%|_b zeOll13+WL?jn0t{TryF7oCUHf>W?-T@YXf%P+2z)+}q0A@Spm{7p`^({5KO>kmW-I6=q;$<`c+A9i^4}G#yEqGj{+EEm`)y**~BE@ z(O4sq-y3r%JRtVe!lH=JJUn06;=f&WcnNgc^YOaf8$*5aFesx$^1-wW934*C380V|KM94UbKRJ*^UAY zk*I__T4(q_$9}YX(-O0TN!H+6uk-tZXJt(p8|7qn@tjYbss3%tEayyxoox08FK`<& z>*jx9s%grSKT@pQe(#WE{FR0B?MZ(P;~Cn&Tq|6`Gl$9Y3Tt(9!1>o3`A={ivpcBV z;@p3rl({{uZBhOqfx`tI4!k)>?o3>MLO6-c{nY&%L znrGj(xN^!pKkxXggj0Mm!t)Nxd)zy@aDIZs>4ic8w_5Kw*mk@-b}vDa#hG!%k%jXg z@bEaL*u2W(Z$Ec<4GZ60rk5^P7&_Dz?t93ap`IMCx#L_M-^pb~8H`_?58J(|wNI*I zc-_j+ezCi~fNj~~L_Sy9gO*bpt*pBwnjahTdCEM$5L+>`({%2E$jL_)FHe54KW9$= z@(J}7lbdIqc8z_S_$TuW=c1o7R*Y7xJH$%F9&L7=@tLQJr>XnmWYrteJLVs?jOvoJ zKfciRxnaKLwb;hjF$aEh%S07+Iv)-wle8^wb&d-UTztJCFKp4i)fQVmSY6})c=g3s zsW0z%kF1>LoVb0%cPqZ!mF{oy9?vQ-xM%X<>+TcZZJ)fgd$n0G{X6p&=A5bysf

-KjIcLcI{ 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 b(Ue#5|5`uoQTlmUp8a1_+&_5>X>M%*Oag35 diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index a8e2577f7..f4d5cdd51 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -3,8 +3,6 @@ define('ERR_NO_GD', 0); define('ERR_UNKNOWN_FORMAT', 1); -require_once './libraries/chart/pma_ofc_pie.php'; - require_once './libraries/chart/pma_pchart_pie.php'; require_once './libraries/chart/pma_pchart_single_bar.php'; require_once './libraries/chart/pma_pchart_multi_bar.php'; diff --git a/libraries/chart/pma_ofc_chart.php b/libraries/chart/pma_ofc_chart.php deleted file mode 100644 index eb75e7126..000000000 --- a/libraries/chart/pma_ofc_chart.php +++ /dev/null @@ -1,89 +0,0 @@ -'; - $out[] = 'function '.$data_func_name.'()'; - $out[] = '{'; - $out[] = "return '".str_replace("\n", '', $data)."';"; - $out[] = '}'; - $out[] = ''; - - $out[] = 'width.'" height="'.$this->height.'" id="'.$obj_id.'" align="middle">'; - $out[] = ''; - $out[] = ''; - $out[] = ''; - $out[] = ''; - $out[] = ''; - $out[] = ''; - - return implode("\n", $out); - } - - function toString() - { - return $this->get_embed_code($this->chart->toPrettyString()); - } -} - -?> \ No newline at end of file diff --git a/libraries/chart/pma_ofc_pie.php b/libraries/chart/pma_ofc_pie.php deleted file mode 100644 index 2b5ea7e90..000000000 --- a/libraries/chart/pma_ofc_pie.php +++ /dev/null @@ -1,46 +0,0 @@ -set_style($this->titleStyle); - - // create the main chart element - pie - $pie = new pie(); - $pie->set_alpha(1); - $pie->set_start_angle(35); - $pie->add_animation(new pie_fade()); - $pie->add_animation(new pie_bounce(10)); - $pie->set_tooltip('#val# '._('of').' #total#
#percent# '._('of').' 100%'); - $pie->set_colours($this->colors); - - $values = array(); - foreach($data as $key => $value) { - $values[] = new pie_value($value, $key); - } - - $pie->set_values($values); - $pie->gradient_fill(); - - // create chart - $this->chart = new open_flash_chart(); - $this->chart->x_axis = null; - $this->chart->set_bg_colour($this->bgColor); - $this->chart->set_title($title); - $this->chart->add_element($pie); - } -} - -?> From 47f67613a2066b69bdf03ff8e43a857f59e8e230 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Thu, 5 Aug 2010 16:47:28 +0300 Subject: [PATCH 73/80] fixed a notice which was generated on non supported query result format --- libraries/chart.lib.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index f4d5cdd51..3939e552e 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -81,6 +81,11 @@ function PMA_chart_results($data, &$chartSettings, &$chartErrors = array()) $chartSettings['type'] = 'bar'; } + // set default type if not already set + if (empty($chartSettings['continuous'])) { + $chartSettings['continuous'] = 'off'; + } + // set default bar type if needed if ($chartSettings['type'] == 'bar' && empty($chartSettings['barType'])) { $chartSettings['barType'] = 'stacked'; From 59f220eb1307fd881ba43e809e0a729432d83d86 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Fri, 6 Aug 2010 13:22:04 +0300 Subject: [PATCH 74/80] added check for json encoder, cleaned up error handling a bit --- js/pMap.js | 6 +++ libraries/chart.lib.php | 14 ++++--- libraries/chart/pChart/pChart.class | 4 +- libraries/chart/pma_pchart_chart.php | 61 +++++++++++++++------------- tbl_chart.php | 7 ++-- 5 files changed, 52 insertions(+), 40 deletions(-) diff --git a/js/pMap.js b/js/pMap.js index fc3f73849..bfcd4d235 100644 --- a/js/pMap.js +++ b/js/pMap.js @@ -23,6 +23,12 @@ var imageMap = { 'mouseMoved': function(event, cont) { + // return if no imageMap set + // this can happen if server has no json + if (!this.imageMap) { + return; + } + // get mouse coordinated relative to image var mouseX = event.pageX - cont.offsetLeft; var mouseY = event.pageY - cont.offsetTop; diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index 3939e552e..b8213f2ad 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -1,7 +1,7 @@ toString(); $chartSettings = $chart->getSettings(); - $chartErrors = array_merge($chartErrors, $chart->getErrors()); + $chartErrors = $chart->getErrors(); PMA_handle_chart_err($chartErrors); return $chartCode; @@ -241,6 +240,9 @@ function PMA_handle_chart_err($errors) if (in_array(ERR_NO_GD, $errors)) { PMA_warnMissingExtension('GD', false, 'GD extension is needed for charts.'); } + else if (in_array(ERR_NO_JSON, $errors)) { + PMA_warnMissingExtension('JSON', false, 'JSON encoder is needed for chart tooltips.'); + } } ?> diff --git a/libraries/chart/pChart/pChart.class b/libraries/chart/pChart/pChart.class index eb2bc4693..2b5a07721 100644 --- a/libraries/chart/pChart/pChart.class +++ b/libraries/chart/pChart/pChart.class @@ -3495,7 +3495,7 @@ /* Get the current image map */ function getImageMap() { - return json_encode($this->ImageMap); + return $this->ImageMap; } /* Load and cleanup the image map from disk */ @@ -3544,7 +3544,7 @@ } else { - fwrite($Handle, $this->getImageMap()); + fwrite($Handle, serialize($this->getImageMap())); } fclose ($Handle); } diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php index 97af13604..bcca2ac28 100644 --- a/libraries/chart/pma_pchart_chart.php +++ b/libraries/chart/pma_pchart_chart.php @@ -171,37 +171,42 @@ abstract class PMA_pChart_Chart extends PMA_Chart public function toString() { - if (function_exists('gd_info')) { - $this->init(); - $this->prepareDataSet(); - $this->prepareChart(); - - //$this->chart->debugImageMap(); - - if ($this->isContinuous()) { - $this->render(1); - } - else { - $this->render(20); - } - - $returnData = '
'; - foreach ($this->partsEncoded as $part) { - $returnData .= ''; - } - $returnData .= '
'; - $returnData .= ' - - '; - - return $returnData; - } - else { + if (!function_exists('gd_info')) { array_push($this->errors, ERR_NO_GD); return ''; } + + $this->init(); + $this->prepareDataSet(); + $this->prepareChart(); + + //$this->chart->debugImageMap(); + + if ($this->isContinuous()) { + $this->render(1); + } + else { + $this->render(20); + } + + $returnData = '
'; + foreach ($this->partsEncoded as $part) { + $returnData .= ''; + } + $returnData .= '
'; + + if (function_exists('json_encode')) { + $returnData .= ' + + '; + } + else { + array_push($this->errors, ERR_NO_JSON); + } + + return $returnData; } protected function getLabelHeight() diff --git a/tbl_chart.php b/tbl_chart.php index 31118bd8c..4e8f555e2 100644 --- a/tbl_chart.php +++ b/tbl_chart.php @@ -50,11 +50,10 @@ if (PMA_isValid($_REQUEST['chartSettings'], 'array')) { $chartSettings = $_REQUEST['chartSettings']; } -// get the chart and settings and errors after chart generation -$chartErrors = array(); -$chart = PMA_chart_results($data, $chartSettings, $chartErrors); +// get the chart and settings after chart generation +$chart = PMA_chart_results($data, $chartSettings); -if (empty($chartErrors)) { +if (!empty($chart)) { $message = PMA_Message::success(__('Chart generated successfully.')); } else { From d6185d7ace9d1e7fdba08568f3ded0e2b16462d3 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Fri, 13 Aug 2010 12:17:26 +0300 Subject: [PATCH 75/80] removed leftovers from never-used flash chart implmenetation --- libraries/chart/ofc/README.txt | 16 -- libraries/chart/ofc/dot_base.php | 231 ---------------- libraries/chart/ofc/json_format.php | 86 ------ libraries/chart/ofc/ofc_area_base.php | 40 --- libraries/chart/ofc/ofc_area_hollow.php | 10 - libraries/chart/ofc/ofc_area_line.php | 10 - libraries/chart/ofc/ofc_arrow.php | 27 -- libraries/chart/ofc/ofc_bar.php | 34 --- libraries/chart/ofc/ofc_bar_3d.php | 22 -- libraries/chart/ofc/ofc_bar_base.php | 97 ------- libraries/chart/ofc/ofc_bar_filled.php | 39 --- libraries/chart/ofc/ofc_bar_glass.php | 131 --------- libraries/chart/ofc/ofc_bar_sketch.php | 29 -- libraries/chart/ofc/ofc_bar_stack.php | 55 ---- libraries/chart/ofc/ofc_candle.php | 41 --- libraries/chart/ofc/ofc_hbar.php | 64 ----- libraries/chart/ofc/ofc_line.php | 157 ----------- libraries/chart/ofc/ofc_line_base.php | 92 ------- libraries/chart/ofc/ofc_line_dot.php | 33 --- libraries/chart/ofc/ofc_line_hollow.php | 9 - libraries/chart/ofc/ofc_line_style.php | 11 - libraries/chart/ofc/ofc_menu.php | 56 ---- libraries/chart/ofc/ofc_pie.php | 257 ------------------ libraries/chart/ofc/ofc_radar_axis.php | 47 ---- libraries/chart/ofc/ofc_radar_axis_labels.php | 15 - .../chart/ofc/ofc_radar_spoke_labels.php | 15 - libraries/chart/ofc/ofc_scatter.php | 47 ---- libraries/chart/ofc/ofc_scatter_line.php | 49 ---- libraries/chart/ofc/ofc_shape.php | 25 -- libraries/chart/ofc/ofc_sugar.php | 43 --- libraries/chart/ofc/ofc_tags.php | 133 --------- libraries/chart/ofc/ofc_title.php | 39 --- libraries/chart/ofc/ofc_tooltip.php | 67 ----- libraries/chart/ofc/ofc_upload_image.php | 70 ----- libraries/chart/ofc/ofc_x_axis.php | 140 ---------- libraries/chart/ofc/ofc_x_axis_label.php | 45 --- libraries/chart/ofc/ofc_x_axis_labels.php | 69 ----- libraries/chart/ofc/ofc_x_legend.php | 15 - libraries/chart/ofc/ofc_y_axis.php | 17 -- libraries/chart/ofc/ofc_y_axis_base.php | 116 -------- libraries/chart/ofc/ofc_y_axis_label.php | 38 --- libraries/chart/ofc/ofc_y_axis_labels.php | 57 ---- libraries/chart/ofc/ofc_y_axis_right.php | 6 - libraries/chart/ofc/ofc_y_legend.php | 15 - libraries/chart/ofc/open-flash-chart.php | 178 ------------ 45 files changed, 2793 deletions(-) delete mode 100644 libraries/chart/ofc/README.txt delete mode 100644 libraries/chart/ofc/dot_base.php delete mode 100644 libraries/chart/ofc/json_format.php delete mode 100644 libraries/chart/ofc/ofc_area_base.php delete mode 100644 libraries/chart/ofc/ofc_area_hollow.php delete mode 100644 libraries/chart/ofc/ofc_area_line.php delete mode 100644 libraries/chart/ofc/ofc_arrow.php delete mode 100644 libraries/chart/ofc/ofc_bar.php delete mode 100644 libraries/chart/ofc/ofc_bar_3d.php delete mode 100644 libraries/chart/ofc/ofc_bar_base.php delete mode 100644 libraries/chart/ofc/ofc_bar_filled.php delete mode 100644 libraries/chart/ofc/ofc_bar_glass.php delete mode 100644 libraries/chart/ofc/ofc_bar_sketch.php delete mode 100644 libraries/chart/ofc/ofc_bar_stack.php delete mode 100644 libraries/chart/ofc/ofc_candle.php delete mode 100644 libraries/chart/ofc/ofc_hbar.php delete mode 100644 libraries/chart/ofc/ofc_line.php delete mode 100644 libraries/chart/ofc/ofc_line_base.php delete mode 100644 libraries/chart/ofc/ofc_line_dot.php delete mode 100644 libraries/chart/ofc/ofc_line_hollow.php delete mode 100644 libraries/chart/ofc/ofc_line_style.php delete mode 100644 libraries/chart/ofc/ofc_menu.php delete mode 100644 libraries/chart/ofc/ofc_pie.php delete mode 100644 libraries/chart/ofc/ofc_radar_axis.php delete mode 100644 libraries/chart/ofc/ofc_radar_axis_labels.php delete mode 100644 libraries/chart/ofc/ofc_radar_spoke_labels.php delete mode 100644 libraries/chart/ofc/ofc_scatter.php delete mode 100644 libraries/chart/ofc/ofc_scatter_line.php delete mode 100644 libraries/chart/ofc/ofc_shape.php delete mode 100644 libraries/chart/ofc/ofc_sugar.php delete mode 100644 libraries/chart/ofc/ofc_tags.php delete mode 100644 libraries/chart/ofc/ofc_title.php delete mode 100644 libraries/chart/ofc/ofc_tooltip.php delete mode 100644 libraries/chart/ofc/ofc_upload_image.php delete mode 100644 libraries/chart/ofc/ofc_x_axis.php delete mode 100644 libraries/chart/ofc/ofc_x_axis_label.php delete mode 100644 libraries/chart/ofc/ofc_x_axis_labels.php delete mode 100644 libraries/chart/ofc/ofc_x_legend.php delete mode 100644 libraries/chart/ofc/ofc_y_axis.php delete mode 100644 libraries/chart/ofc/ofc_y_axis_base.php delete mode 100644 libraries/chart/ofc/ofc_y_axis_label.php delete mode 100644 libraries/chart/ofc/ofc_y_axis_labels.php delete mode 100644 libraries/chart/ofc/ofc_y_axis_right.php delete mode 100644 libraries/chart/ofc/ofc_y_legend.php delete mode 100644 libraries/chart/ofc/open-flash-chart.php diff --git a/libraries/chart/ofc/README.txt b/libraries/chart/ofc/README.txt deleted file mode 100644 index 012fbfd52..000000000 --- a/libraries/chart/ofc/README.txt +++ /dev/null @@ -1,16 +0,0 @@ -Open Flash Chart - PHP libraries. These help create data files for Open Flash Chart. -Copyright (C) 2007 - -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; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA \ No newline at end of file diff --git a/libraries/chart/ofc/dot_base.php b/libraries/chart/ofc/dot_base.php deleted file mode 100644 index 5772efcd9..000000000 --- a/libraries/chart/ofc/dot_base.php +++ /dev/null @@ -1,231 +0,0 @@ -type = $type; - if( isset( $value ) ) - $this->value( $value ); - } - - /** - * For line charts that only require a Y position - * for each point. - * @param $value as integer, the Y position - */ - function value( $value ) - { - $this->value = $value; - } - - /** - * For scatter charts that require an X and Y position for - * each point. - * - * @param $x as integer - * @param $y as integer - */ - function position( $x, $y ) - { - $this->x = $x; - $this->y = $y; - } - - /** - * @param $colour is a string, HEX colour, e.g. '#FF0000' red - */ - function colour($colour) - { - $this->colour = $colour; - return $this; - } - - /** - * The tooltip for this dot. - */ - function tooltip( $tip ) - { - $this->tip = $tip; - return $this; - } - - /** - * @param $size is an integer. Size of the dot. - */ - function size($size) - { - $tmp = 'dot-size'; - $this->$tmp = $size; - return $this; - } - - /** - * a private method - */ - function type( $type ) - { - $this->type = $type; - return $this; - } - - /** - * @param $size is an integer. The size of the hollow 'halo' around the dot that masks the line. - */ - function halo_size( $size ) - { - $tmp = 'halo-size'; - $this->$tmp = $size; - return $this; - } - - /** - * @param $do as string. One of three options (examples): - * - "http://example.com" - browse to this URL - * - "https://example.com" - browse to this URL - * - "trace:message" - print this message in the FlashDevelop debug pane - * - all other strings will be called as Javascript functions, so a string "hello_world" - * will call the JS function "hello_world(index)". It passes in the index of the - * point. - */ - function on_click( $do ) - { - $tmp = 'on-click'; - $this->$tmp = $do; - } -} - -/** - * Draw a hollow dot - */ -class hollow_dot extends dot_base -{ - function hollow_dot($value=null) - { - parent::dot_base( 'hollow-dot', $value ); - } -} - -/** - * Draw a star - */ -class star extends dot_base -{ - /** - * The constructor, takes an optional $value - */ - function star($value=null) - { - parent::dot_base( 'star', $value ); - } - - /** - * @param $angle is an integer. - */ - function rotation($angle) - { - $this->rotation = $angle; - return $this; - } - - /** - * @param $is_hollow is a boolean. - */ - function hollow($is_hollow) - { - $this->hollow = $is_hollow; - } -} - -/** - * Draw a 'bow tie' shape. - */ -class bow extends dot_base -{ - /** - * The constructor, takes an optional $value - */ - function bow($value=null) - { - parent::dot_base( 'bow', $value ); - } - - /** - * Rotate the anchor object. - * @param $angle is an integer. - */ - function rotation($angle) - { - $this->rotation = $angle; - return $this; - } -} - -/** - * An n sided shape. - */ -class anchor extends dot_base -{ - /** - * The constructor, takes an optional $value - */ - function anchor($value=null) - { - parent::dot_base( 'anchor', $value ); - } - - /** - * Rotate the anchor object. - * @param $angle is an integer. - */ - function rotation($angle) - { - $this->rotation = $angle; - return $this; - } - - /** - * @param $sides is an integer. Number of sides this shape has. - */ - function sides($sides) - { - $this->sides = $sides; - return $this; - } -} - -/** - * A simple dot - */ -class dot extends dot_base -{ - /** - * The constructor, takes an optional $value - */ - function dot($value=null) - { - parent::dot_base( 'dot', $value ); - } -} - -/** - * A simple dot - */ -class solid_dot extends dot_base -{ - /** - * The constructor, takes an optional $value - */ - function solid_dot($value=null) - { - parent::dot_base( 'solid-dot', $value ); - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/json_format.php b/libraries/chart/ofc/json_format.php deleted file mode 100644 index b8e3de5cb..000000000 --- a/libraries/chart/ofc/json_format.php +++ /dev/null @@ -1,86 +0,0 @@ - 0 && $json[$c-1] != '\\') - { - $in_string = !$in_string; - } - default: - $new_json .= $char; - break; - } - } - - return $new_json; -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_area_base.php b/libraries/chart/ofc/ofc_area_base.php deleted file mode 100644 index a6e811fd5..000000000 --- a/libraries/chart/ofc/ofc_area_base.php +++ /dev/null @@ -1,40 +0,0 @@ -type = "area"; - } - - /** - * the fill colour - */ - function set_fill_colour( $colour ) - { - $this->fill = $colour; - } - - /** - * sugar: see set_fill_colour - */ - function fill_colour( $colour ) - { - $this->set_fill_colour( $colour ); - return $this; - } - - function set_fill_alpha( $alpha ) - { - $tmp = "fill-alpha"; - $this->$tmp = $alpha; - } - - function set_loop() - { - $this->loop = true; - } -} diff --git a/libraries/chart/ofc/ofc_area_hollow.php b/libraries/chart/ofc/ofc_area_hollow.php deleted file mode 100644 index 4293af0b6..000000000 --- a/libraries/chart/ofc/ofc_area_hollow.php +++ /dev/null @@ -1,10 +0,0 @@ -type = "area_hollow"; - parent::area_base(); - } -} diff --git a/libraries/chart/ofc/ofc_area_line.php b/libraries/chart/ofc/ofc_area_line.php deleted file mode 100644 index 5731391a3..000000000 --- a/libraries/chart/ofc/ofc_area_line.php +++ /dev/null @@ -1,10 +0,0 @@ -type = "area_line"; - parent::area_base(); - } -} diff --git a/libraries/chart/ofc/ofc_arrow.php b/libraries/chart/ofc/ofc_arrow.php deleted file mode 100644 index 3c2c6e9dc..000000000 --- a/libraries/chart/ofc/ofc_arrow.php +++ /dev/null @@ -1,27 +0,0 @@ -type = "arrow"; - $this->start = array("x"=>$x, "y"=>$y); - $this->end = array("x"=>$a, "y"=>$b); - $this->colour($colour); - $this->{"barb-length"} = $barb_length; - } - - function colour( $colour ) - { - $this->colour = $colour; - return $this; - } -} diff --git a/libraries/chart/ofc/ofc_bar.php b/libraries/chart/ofc/ofc_bar.php deleted file mode 100644 index 6ddda4274..000000000 --- a/libraries/chart/ofc/ofc_bar.php +++ /dev/null @@ -1,34 +0,0 @@ -top = $top; - - if( isset( $bottom ) ) - $this->bottom = $bottom; - } - - function set_colour( $colour ) - { - $this->colour = $colour; - } - - function set_tooltip( $tip ) - { - $this->tip = $tip; - } -} - -class bar extends bar_base -{ - function bar() - { - $this->type = "bar"; - parent::bar_base(); - } -} - diff --git a/libraries/chart/ofc/ofc_bar_3d.php b/libraries/chart/ofc/ofc_bar_3d.php deleted file mode 100644 index 47552184c..000000000 --- a/libraries/chart/ofc/ofc_bar_3d.php +++ /dev/null @@ -1,22 +0,0 @@ -top = $top; - } - - function set_colour( $colour ) - { - $this->colour = $colour; - } - - function set_tooltip( $tip ) - { - $this->tip = $tip; - } -} - diff --git a/libraries/chart/ofc/ofc_bar_base.php b/libraries/chart/ofc/ofc_bar_base.php deleted file mode 100644 index c1303b86b..000000000 --- a/libraries/chart/ofc/ofc_bar_base.php +++ /dev/null @@ -1,97 +0,0 @@ -text = $text; - $tmp = 'font-size'; - $this->$tmp = $size; - } - - /** - * syntatical sugar. - */ - function key( $text, $size ) - { - $this->set_key( $text, $size ); - } - - /** - * @param $v as an array, a mix of: - * - a bar_value class. You can use this to customise the paramters of each bar. - * - integer. This is the Y position of the top of the bar. - */ - function set_values( $v ) - { - $this->values = $v; - } - - /** - * see set_values - */ - function append_value( $v ) - { - $this->values[] = $v; - } - - /** - * @param $colour as string, a HEX colour, e.g. '#ff0000' red - */ - function set_colour( $colour ) - { - $this->colour = $colour; - } - - /** - *syntatical sugar - */ - function colour( $colour ) - { - $this->set_colour( $colour ); - } - - /** - * @param $alpha as real number (range 0 to 1), e.g. 0.5 is half transparent - */ - function set_alpha( $alpha ) - { - $this->alpha = $alpha; - } - - /** - * @param $tip as string, the tip to show. May contain various magic variables. - */ - function set_tooltip( $tip ) - { - $this->tip = $tip; - } - - /** - *@param $on_show as line_on_show object - */ - function set_on_show($on_show) - { - $this->{'on-show'} = $on_show; - } - - function set_on_click( $text ) - { - $tmp = 'on-click'; - $this->$tmp = $text; - } - - function attach_to_right_y_axis() - { - $this->axis = 'right'; - } -} - diff --git a/libraries/chart/ofc/ofc_bar_filled.php b/libraries/chart/ofc/ofc_bar_filled.php deleted file mode 100644 index 837c1fc45..000000000 --- a/libraries/chart/ofc/ofc_bar_filled.php +++ /dev/null @@ -1,39 +0,0 @@ -$tmp = $outline_colour; - } -} - -class bar_filled extends bar_base -{ - function bar_filled( $colour=null, $outline_colour=null ) - { - $this->type = "bar_filled"; - parent::bar_base(); - - if( isset( $colour ) ) - $this->set_colour( $colour ); - - if( isset( $outline_colour ) ) - $this->set_outline_colour( $outline_colour ); - } - - function set_outline_colour( $outline_colour ) - { - $tmp = 'outline-colour'; - $this->$tmp = $outline_colour; - } -} - diff --git a/libraries/chart/ofc/ofc_bar_glass.php b/libraries/chart/ofc/ofc_bar_glass.php deleted file mode 100644 index e83350151..000000000 --- a/libraries/chart/ofc/ofc_bar_glass.php +++ /dev/null @@ -1,131 +0,0 @@ -type = $type; - $this->cascade = (float)$cascade; - $this->delay = (float)$delay; - } -} - -class bar_value -{ - /** - * @param $top as integer. The Y value of the top of the bar - * @param OPTIONAL $bottom as integer. The Y value of the bottom of the bar, defaults to Y min. - */ - function bar_value( $top, $bottom=null ) - { - $this->top = $top; - - if( isset( $bottom ) ) - $this->bottom = $bottom; - } - - function set_colour( $colour ) - { - $this->colour = $colour; - } - - function set_tooltip( $tip ) - { - $this->tip = $tip; - } -} - -class bar extends bar_base -{ - function bar() - { - $this->type = "bar"; - parent::bar_base(); - } -} - -class bar_glass extends bar_base -{ - function bar_glass() - { - $this->type = "bar_glass"; - parent::bar_base(); - } -} - -class bar_cylinder extends bar_base -{ - function bar_cylinder() - { - $this->type = "bar_cylinder"; - parent::bar_base(); - } -} - -class bar_cylinder_outline extends bar_base -{ - function bar_cylinder_outline() - { - $this->type = "bar_cylinder_outline"; - parent::bar_base(); - } -} - -class bar_rounded_glass extends bar_base -{ - function bar_rounded_glass() - { - $this->type = "bar_round_glass"; - parent::bar_base(); - } -} - -class bar_round extends bar_base -{ - function bar_round() - { - $this->type = "bar_round"; - parent::bar_base(); - } -} - -class bar_dome extends bar_base -{ - function bar_dome() - { - $this->type = "bar_dome"; - parent::bar_base(); - } -} - -class bar_round3d extends bar_base -{ - function bar_round3d() - { - $this->type = "bar_round3d"; - parent::bar_base(); - } -} - -class bar_3d extends bar_base -{ - function bar_3d() - { - $this->type = "bar_3d"; - parent::bar_base(); - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_bar_sketch.php b/libraries/chart/ofc/ofc_bar_sketch.php deleted file mode 100644 index ce1bcccf8..000000000 --- a/libraries/chart/ofc/ofc_bar_sketch.php +++ /dev/null @@ -1,29 +0,0 @@ -type = "bar_sketch"; - parent::bar_base(); - - $this->set_colour( $colour ); - $this->set_outline_colour( $outline_colour ); - $this->offset = $fun_factor; - } - - function set_outline_colour( $outline_colour ) - { - $tmp = 'outline-colour'; - $this->$tmp = $outline_colour; - } -} - diff --git a/libraries/chart/ofc/ofc_bar_stack.php b/libraries/chart/ofc/ofc_bar_stack.php deleted file mode 100644 index 3d9f8d9f0..000000000 --- a/libraries/chart/ofc/ofc_bar_stack.php +++ /dev/null @@ -1,55 +0,0 @@ -type = "bar_stack"; - parent::bar_base(); - } - - function append_stack( $v ) - { - $this->append_value( $v ); - } - - // an array of HEX colours strings - // e.g. array( '#ff0000', '#00ff00' ); - function set_colours( $colours ) - { - $this->colours = $colours; - } - - // an array of bar_stack_value - function set_keys( $keys ) - { - $this->keys = $keys; - } -} - -class bar_stack_value -{ - function bar_stack_value( $val, $colour ) - { - $this->val = $val; - $this->colour = $colour; - } - - function set_tooltip( $tip ) - { - $this->tip = $tip; - } -} - -class bar_stack_key -{ - function bar_stack_key( $colour, $text, $font_size ) - { - $this->colour = $colour; - $this->text = $text; - $tmp = 'font-size'; - $this->$tmp = $font_size; - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_candle.php b/libraries/chart/ofc/ofc_candle.php deleted file mode 100644 index 21ad67f8d..000000000 --- a/libraries/chart/ofc/ofc_candle.php +++ /dev/null @@ -1,41 +0,0 @@ -high = $high; - $this->top = $open; - $this->bottom = $close; - $this->low = $low; - } - - function set_colour( $colour ) - { - $this->colour = $colour; - } - - function set_tooltip( $tip ) - { - $this->tip = $tip; - } -} - -class candle extends bar_base -{ - function candle($colour, $negative_colour=null) - { - $this->type = "candle"; - parent::bar_base(); - - $this->set_colour( $colour ); - if(!is_null($negative_colour)) - $this->{'negative-colour'} = $negative_colour; - } -} - diff --git a/libraries/chart/ofc/ofc_hbar.php b/libraries/chart/ofc/ofc_hbar.php deleted file mode 100644 index 6f8c0e451..000000000 --- a/libraries/chart/ofc/ofc_hbar.php +++ /dev/null @@ -1,64 +0,0 @@ -left = $left; - $this->right = $right; - } - else - $this->right = $left; - } - - function set_colour( $colour ) - { - $this->colour = $colour; - } - - function set_tooltip( $tip ) - { - $this->tip = $tip; - } -} - -class hbar -{ - function hbar( $colour ) - { - $this->type = "hbar"; - $this->values = array(); - $this->set_colour( $colour ); - } - - function append_value( $v ) - { - $this->values[] = $v; - } - - function set_values( $v ) - { - foreach( $v as $val ) - $this->append_value( new hbar_value( $val ) ); - } - - function set_colour( $colour ) - { - $this->colour = $colour; - } - - function set_key( $text, $size ) - { - $this->text = $text; - $tmp = 'font-size'; - $this->$tmp = $size; - } - - function set_tooltip( $tip ) - { - $this->tip = $tip; - } -} - diff --git a/libraries/chart/ofc/ofc_line.php b/libraries/chart/ofc/ofc_line.php deleted file mode 100644 index e635f2c02..000000000 --- a/libraries/chart/ofc/ofc_line.php +++ /dev/null @@ -1,157 +0,0 @@ -type = $type; - $this->cascade = (float)$cascade; - $this->delay = (float)$delay; - } -} - -class line -{ - function line() - { - $this->type = "line"; - $this->values = array(); - } - - /** - * Set the default dot that all the real - * dots inherit their properties from. If you set the - * default dot to be red, all values in your chart that - * do not specify a colour will be red. Same for all the - * other attributes such as tooltip, on-click, size etc... - * - * @param $style as any class that inherits base_dot - */ - function set_default_dot_style( $style ) - { - $tmp = 'dot-style'; - $this->$tmp = $style; - } - - /** - * @param $v as array, can contain any combination of: - * - integer, Y position of the point - * - any class that inherits from dot_base - * - null - */ - function set_values( $v ) - { - $this->values = $v; - } - - /** - * Append a value to the line. - * - * @param mixed $v - */ - function append_value($v) - { - $this->values[] = $v; - } - - function set_width( $width ) - { - $this->width = $width; - } - - function set_colour( $colour ) - { - $this->colour = $colour; - } - - /** - * sytnatical sugar for set_colour - */ - function colour( $colour ) - { - $this->set_colour( $colour ); - return $this; - } - - function set_halo_size( $size ) - { - $tmp = 'halo-size'; - $this->$tmp = $size; - } - - function set_key( $text, $font_size ) - { - $this->text = $text; - $tmp = 'font-size'; - $this->$tmp = $font_size; - } - - function set_tooltip( $tip ) - { - $this->tip = $tip; - } - - /** - * @param $text as string. A javascript function name as a string. The chart will - * try to call this function, it will pass the chart id as the only parameter into - * this function. E.g: - * - */ - function set_on_click( $text ) - { - $tmp = 'on-click'; - $this->$tmp = $text; - } - - function loop() - { - $this->loop = true; - } - - function line_style( $s ) - { - $tmp = "line-style"; - $this->$tmp = $s; - } - - /** - * Sets the text for the line. - * - * @param string $text - */ - function set_text($text) - { - $this->text = $text; - } - - function attach_to_right_y_axis() - { - $this->axis = 'right'; - } - - /** - *@param $on_show as line_on_show object - */ - function set_on_show($on_show) - { - $this->{'on-show'} = $on_show; - } - - function on_show($on_show) - { - $this->set_on_show($on_show); - return $this; - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_line_base.php b/libraries/chart/ofc/ofc_line_base.php deleted file mode 100644 index fa45cbc89..000000000 --- a/libraries/chart/ofc/ofc_line_base.php +++ /dev/null @@ -1,92 +0,0 @@ -type = "line"; - $this->text = "Page views"; - $tmp = 'font-size'; - $this->$tmp = 10; - - $this->values = array(); - } - - function set_values( $v ) - { - $this->values = $v; - } - - /** - * Append a value to the line. - * - * @param mixed $v - */ - function append_value($v) - { - $this->values[] = $v; - } - - function set_width( $width ) - { - $this->width = $width; - } - - function set_colour( $colour ) - { - $this->colour = $colour; - } - - function set_dot_size( $size ) - { - $tmp = 'dot-size'; - $this->$tmp = $size; - } - - function set_halo_size( $size ) - { - $tmp = 'halo-size'; - $this->$tmp = $size; - } - - function set_key( $text, $font_size ) - { - $this->text = $text; - $tmp = 'font-size'; - $this->$tmp = $font_size; - } - - function set_tooltip( $tip ) - { - $this->tip = $tip; - } - - function set_on_click( $text ) - { - $tmp = 'on-click'; - $this->$tmp = $text; - } - - function loop() - { - $this->loop = true; - } - - function line_style( $s ) - { - $tmp = "line-style"; - $this->$tmp = $s; - } - - /** - * Sets the text for the line. - * - * @param string $text - */ - function set_text($text) - { - $this->text = $text; - } - - -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_line_dot.php b/libraries/chart/ofc/ofc_line_dot.php deleted file mode 100644 index 146691173..000000000 --- a/libraries/chart/ofc/ofc_line_dot.php +++ /dev/null @@ -1,33 +0,0 @@ -value = $value; - $this->colour = $colour; - } - - function set_colour( $colour ) - { - $this->colour = $colour; - } - - function set_size( $size ) - { - $this->size = $size; - } - - function set_tooltip( $tip ) - { - $this->tip = $tip; - } -} - -class line_dot extends line_base -{ - function line_dot() - { - $this->type = "line_dot"; - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_line_hollow.php b/libraries/chart/ofc/ofc_line_hollow.php deleted file mode 100644 index 512bb07d9..000000000 --- a/libraries/chart/ofc/ofc_line_hollow.php +++ /dev/null @@ -1,9 +0,0 @@ -type = "line_hollow"; - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_line_style.php b/libraries/chart/ofc/ofc_line_style.php deleted file mode 100644 index 4f538cf9d..000000000 --- a/libraries/chart/ofc/ofc_line_style.php +++ /dev/null @@ -1,11 +0,0 @@ -style = "dash"; - $this->on = $on; - $this->off = $off; - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_menu.php b/libraries/chart/ofc/ofc_menu.php deleted file mode 100644 index 0750a09c2..000000000 --- a/libraries/chart/ofc/ofc_menu.php +++ /dev/null @@ -1,56 +0,0 @@ -type = "text"; - $this->text = $text; - $tmp = 'javascript-function'; - $this->$tmp = $javascript_function_name; - } -} - -class ofc_menu_item_camera -{ - /** - * @param $text as string. The menu item text. - * @param $javascript_function_name as string. The javascript function name, the - * js function takes one parameter, the chart ID. So for example, our js function - * could look like this: - * - * function save_image( chart_id ) - * { - * alert( chart_id ); - * } - * - * to make a menu item call this: ofc_menu_item_camera('Save chart', 'save_image'); - */ - function ofc_menu_item_camera($text, $javascript_function_name) - { - $this->type = "camera-icon"; - $this->text = $text; - $tmp = 'javascript-function'; - $this->$tmp = $javascript_function_name; - } -} - -class ofc_menu -{ - function ofc_menu($colour, $outline_colour) - { - $this->colour = $colour; - $this->outline_colour = $outline_colour; - } - - function values($values) - { - $this->values = $values; - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_pie.php b/libraries/chart/ofc/ofc_pie.php deleted file mode 100644 index bf779c554..000000000 --- a/libraries/chart/ofc/ofc_pie.php +++ /dev/null @@ -1,257 +0,0 @@ -value = $value; - $this->label = $label; - } - - function set_colour( $colour ) - { - $this->colour = $colour; - } - - function set_label( $label, $label_colour, $font_size ) - { - $this->label = $label; - - $tmp = 'label-colour'; - $this->$tmp = $label_colour; - - $tmp = 'font-size'; - $this->$tmp = $font_size; - - } - - function set_tooltip( $tip ) - { - $this->tip = $tip; - } - - function on_click( $event ) - { - $tmp = 'on-click'; - $this->$tmp = $event; - } - - - /** - * An object that inherits from base_pie_animation - */ - function add_animation( $animation ) - { - if( !isset( $this->animate ) ) - $this->animate = array(); - - $this->animate[] = $animation; - - return $this; - } -} - -class base_pie_animation{} - -/** - * fade the pie slice from $alpha (pie set_alpha) to 100% opaque. - */ -class pie_fade extends base_pie_animation -{ - function pie_fade() - { - $this->type="fade"; - } -} - -/** - * Bounce the pie slice out a little - */ -class pie_bounce extends base_pie_animation -{ - /** - * @param $distance as integer, distance to bounce in pixels - */ - function pie_bounce( $distance ) - { - $this->type="bounce"; - $this->distance = $distance; - } -} - -/** - * Make a pie chart and fill it with pie slices - */ -class pie -{ - function pie() - { - $this->type = 'pie'; - } - - function set_colours( $colours ) - { - $this->colours = $colours; - } - - /** - * Sugar wrapped around set_colours - */ - function colours( $colours ) - { - $this->set_colours( $colours ); - return $this; - } - - /** - * @param $alpha as float (0-1) 0.75 = 3/4 visible - */ - function set_alpha( $alpha ) - { - $this->alpha = $alpha; - } - - /** - *sugar wrapped set_alpha - **/ - function alpha( $alpha ) - { - $this->set_alpha( $alpha ); - return $this; - } - - /** - * @param $v as array containing one of - * - null - * - real or integer number - * - a pie_value object - */ - function set_values( $v ) - { - $this->values = $v; - } - - /** - * sugar for set_values - */ - function values( $v ) - { - $this->set_values( $v ); - return $this; - } - - /** - * HACK to keep old code working. - */ - function set_animate( $bool ) - { - if( $bool ) - $this->add_animation( new pie_fade() ); - - } - - /** - * An object that inherits from base_pie_animation - */ - function add_animation( $animation ) - { - if( !isset( $this->animate ) ) - $this->animate = array(); - - $this->animate[] = $animation; - - return $this; - } - - /** - * @param $angle as real number - */ - function set_start_angle( $angle ) - { - $tmp = 'start-angle'; - $this->$tmp = $angle; - } - - /** - * sugar for set_start_angle - */ - function start_angle($angle) - { - $this->set_start_angle( $angle ); - return $this; - } - - /** - * @param $tip as string. The tooltip text. May contain magic varibles - */ - function set_tooltip( $tip ) - { - $this->tip = $tip; - } - - /** - * sugar for set_tooltip - */ - function tooltip( $tip ) - { - $this->set_tooltip( $tip ); - return $this; - } - - function set_gradient_fill() - { - $tmp = 'gradient-fill'; - $this->$tmp = true; - } - - function gradient_fill() - { - $this->set_gradient_fill(); - return $this; - } - - /** - * By default each label is the same colour as the slice, - * but you can ovveride that behaviour using this method. - * - * @param $label_colour as string HEX colour; - */ - function set_label_colour( $label_colour ) - { - $tmp = 'label-colour'; - $this->$tmp = $label_colour; - } - - function label_colour( $label_colour ) - { - $this->set_label_colour( $label_colour ); - return $this; - } - - /** - * Turn off the labels - */ - function set_no_labels() - { - $tmp = 'no-labels'; - $this->$tmp = true; - } - - function on_click( $event ) - { - $tmp = 'on-click'; - $this->$tmp = $event; - } - - /** - * Fix the radius of the pie chart. Take a look at the magic variable #radius# - * for helping figure out what radius to set it to. - * - * @param $radius as number - */ - function radius( $radius ) - { - $this->radius = $radius; - return $this; - } -} diff --git a/libraries/chart/ofc/ofc_radar_axis.php b/libraries/chart/ofc/ofc_radar_axis.php deleted file mode 100644 index 909c41af8..000000000 --- a/libraries/chart/ofc/ofc_radar_axis.php +++ /dev/null @@ -1,47 +0,0 @@ -set_max( $max ); - } - - function set_max( $max ) - { - $this->max = $max; - } - - function set_steps( $steps ) - { - $this->steps = $steps; - } - - function set_stroke( $s ) - { - $this->stroke = $s; - } - - function set_colour( $colour ) - { - $this->colour = $colour; - } - - function set_grid_colour( $colour ) - { - $tmp = 'grid-colour'; - $this->$tmp = $colour; - } - - function set_labels( $labels ) - { - $this->labels = $labels; - } - - function set_spoke_labels( $labels ) - { - $tmp = 'spoke-labels'; - $this->$tmp = $labels; - } -} - diff --git a/libraries/chart/ofc/ofc_radar_axis_labels.php b/libraries/chart/ofc/ofc_radar_axis_labels.php deleted file mode 100644 index 22d485e4e..000000000 --- a/libraries/chart/ofc/ofc_radar_axis_labels.php +++ /dev/null @@ -1,15 +0,0 @@ -labels = $labels; - } - - function set_colour( $colour ) - { - $this->colour = $colour; - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_radar_spoke_labels.php b/libraries/chart/ofc/ofc_radar_spoke_labels.php deleted file mode 100644 index 51ba25e9a..000000000 --- a/libraries/chart/ofc/ofc_radar_spoke_labels.php +++ /dev/null @@ -1,15 +0,0 @@ -labels = $labels; - } - - function set_colour( $colour ) - { - $this->colour = $colour; - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_scatter.php b/libraries/chart/ofc/ofc_scatter.php deleted file mode 100644 index 7159a3a64..000000000 --- a/libraries/chart/ofc/ofc_scatter.php +++ /dev/null @@ -1,47 +0,0 @@ -x = $x; - $this->y = $y; - - if( $dot_size > 0 ) - { - $tmp = 'dot-size'; - $this->$tmp = $dot_size; - } - } -} - -class scatter -{ - function scatter( $colour ) - { - $this->type = "scatter"; - $this->set_colour( $colour ); - } - - function set_colour( $colour ) - { - $this->colour = $colour; - } - - function set_default_dot_style( $style ) - { - $tmp = 'dot-style'; - $this->$tmp = $style; - } - - /** - * @param $v as array, can contain any combination of: - * - integer, Y position of the point - * - any class that inherits from scatter_value - * - null - */ - function set_values( $values ) - { - $this->values = $values; - } -} diff --git a/libraries/chart/ofc/ofc_scatter_line.php b/libraries/chart/ofc/ofc_scatter_line.php deleted file mode 100644 index d667d7e8c..000000000 --- a/libraries/chart/ofc/ofc_scatter_line.php +++ /dev/null @@ -1,49 +0,0 @@ -type = "scatter_line"; - $this->set_colour( $colour ); - $this->set_width( $width ); - } - - function set_default_dot_style( $style ) - { - $tmp = 'dot-style'; - $this->$tmp = $style; - } - - function set_colour( $colour ) - { - $this->colour = $colour; - } - - function set_width( $width ) - { - $this->width = $width; - } - - function set_values( $values ) - { - $this->values = $values; - } - - function set_step_horizontal() - { - $this->stepgraph = 'horizontal'; - } - - function set_step_vertical() - { - $this->stepgraph = 'vertical'; - } - - function set_key( $text, $font_size ) - { - $this->text = $text; - $tmp = 'font-size'; - $this->$tmp = $font_size; - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_shape.php b/libraries/chart/ofc/ofc_shape.php deleted file mode 100644 index 0cfe39f9b..000000000 --- a/libraries/chart/ofc/ofc_shape.php +++ /dev/null @@ -1,25 +0,0 @@ -x = $x; - $this->y = $y; - } -} - -class shape -{ - function shape( $colour ) - { - $this->type = "shape"; - $this->colour = $colour; - $this->values = array(); - } - - function append_value( $p ) - { - $this->values[] = $p; - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_sugar.php b/libraries/chart/ofc/ofc_sugar.php deleted file mode 100644 index a9e85555e..000000000 --- a/libraries/chart/ofc/ofc_sugar.php +++ /dev/null @@ -1,43 +0,0 @@ -colour($colour)->size($size); - } -} - -class s_box extends anchor -{ - /** - * I use this wrapper for default dot types, - * it just makes the code easier to read. - */ - function s_box($colour, $size) - { - parent::anchor(); - $this->colour($colour)->size($size)->rotation(45)->sides(4); - } -} - -class s_hollow_dot extends hollow_dot -{ - /** - * I use this wrapper for default dot types, - * it just makes the code easier to read. - */ - function s_hollow_dot($colour, $size) - { - parent::hollow_dot(); - $this->colour($colour)->size($size); - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_tags.php b/libraries/chart/ofc/ofc_tags.php deleted file mode 100644 index 7e7e24454..000000000 --- a/libraries/chart/ofc/ofc_tags.php +++ /dev/null @@ -1,133 +0,0 @@ -type = "tags"; - $this->values = array(); - } - - function colour( $colour ) - { - $this->colour = $colour; - return $this; - } - - /** - *@param $font as string. e.g. "Verdana" - *@param $size as integer. Size in px - */ - function font($font, $size) - { - $this->font = $font; - $this->{'font-size'} = $size; - return $this; - } - - /** - *@param $x as integer. Size of x padding in px - *@param $y as integer. Size of y padding in px - */ - function padding($x, $y) - { - $this->{"pad-x"} = $x; - $this->{"pad-y"} = $y; - return $this; - } - - function rotate($angle) - { - $this->rotate($angle); - return $this; - } - - function align_x_center() - { - $this->{"align-x"} = "center"; - return $this; - } - - function align_x_left() - { - $this->{"align-x"} = "left"; - return $this; - } - - function align_x_right() - { - $this->{"align-x"} = "right"; - return $this; - } - - function align_y_above() - { - $this->{"align-y"} = "above"; - return $this; - } - - function align_y_below() - { - $this->{"align-y"} = "below"; - return $this; - } - - function align_y_center() - { - $this->{"align-y"} = "center"; - return $this; - } - - /** - * This can contain some HTML, e.g: - * - "More info" - * - "ofc" - */ - function text($text) - { - $this->text = $text; - return $this; - } - - /** - * This works, but to get the mouse pointer to change - * to a little hand you need to use "stuff"-- see text() - */ - function on_click($on_click) - { - $this->{'on-click'} = $on_click; - return $this; - } - - /** - *@param $bold boolean. - *@param $underline boolean. - *@param $border boolean. - *@prarm $alpha real (0 to 1.0) - */ - function style($bold, $underline, $border, $alpha ) - { - $this->bold = $bold; - $this->border = $underline; - $this->underline = $border; - $this->alpha = $alpha; - return $this; - } - - /** - *@param $tag as ofc_tag - */ - function append_tag($tag) - { - $this->values[] = $tag; - } -} - -class ofc_tag extends ofc_tags -{ - function ofc_tag($x, $y) - { - $this->x = $x; - $this->y = $y; - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_title.php b/libraries/chart/ofc/ofc_title.php deleted file mode 100644 index cda1de006..000000000 --- a/libraries/chart/ofc/ofc_title.php +++ /dev/null @@ -1,39 +0,0 @@ -text = $text; - } - - /** - * A css string. Can optionally contain: - * - font-size - * - font-family - * - font-weight - * - color - * - background-color - * - text-align - * - margin - * - margin-left - * - margin-right - * - margin-top - * - margin-bottom - * - padding - * - padding-left - * - padding-right - * - padding-top - * - padding-bottom - * just like the css we use all the time :-) - */ - function set_style( $css ) - { - $this->style = $css; - //"{font-size: 20px; color:#0000ff; font-family: Verdana; text-align: center;}"; - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_tooltip.php b/libraries/chart/ofc/ofc_tooltip.php deleted file mode 100644 index 3104ee33b..000000000 --- a/libraries/chart/ofc/ofc_tooltip.php +++ /dev/null @@ -1,67 +0,0 @@ -shadow = $shadow; - } - - /** - * @param $stroke as integer, border width in pixels (e.g. 5 ) - */ - function set_stroke( $stroke ) - { - $this->stroke = $stroke; - } - - /** - * @param $colour as string, HEX colour e.g. '#0000ff' - */ - function set_colour( $colour ) - { - $this->colour = $colour; - } - - /** - * @param $bg as string, HEX colour e.g. '#0000ff' - */ - function set_background_colour( $bg ) - { - $this->background = $bg; - } - - /** - * @param $style as string. A css style. - */ - function set_title_style( $style ) - { - $this->title = $style; - } - - /** - * @param $style as string. A css style. - */ - function set_body_style( $style ) - { - $this->body = $style; - } - - function set_proximity() - { - $this->mouse = 1; - } - - function set_hover() - { - $this->mouse = 2; - } -} - diff --git a/libraries/chart/ofc/ofc_upload_image.php b/libraries/chart/ofc/ofc_upload_image.php deleted file mode 100644 index 0261f9aea..000000000 --- a/libraries/chart/ofc/ofc_upload_image.php +++ /dev/null @@ -1,70 +0,0 @@ - save_image debug mode, you -// will see the 'echo' text in a new window. -// - -/* - -print_r( $_GET ); -print_r( $_POST ); -print_r( $_FILES ); - -print_r( $GLOBALS ); -print_r( $GLOBALS["HTTP_RAW_POST_DATA"] ); - -*/ - - -// default path for the image to be stored // -$default_path = '../tmp-upload-images/'; - -if (!file_exists($default_path)) mkdir($default_path, 0777, true); - -// full path to the saved image including filename // -$destination = $default_path . basename( $_GET[ 'name' ] ); - -echo 'Saving your image to: '. $destination; -// print_r( $_POST ); -// print_r( $_SERVER ); -// echo $HTTP_RAW_POST_DATA; - -// -// POST data is usually string data, but we are passing a RAW .png -// so PHP is a bit confused and $_POST is empty. But it has saved -// the raw bits into $HTTP_RAW_POST_DATA -// - -$jfh = fopen($destination, 'w') or die("can't open file"); -fwrite($jfh, $HTTP_RAW_POST_DATA); -fclose($jfh); - -// -// LOOK: -// -exit(); - - -// -// PHP5: -// - - -// default path for the image to be stored // -$default_path = 'tmp-upload-images/'; - -if (!file_exists($default_path)) mkdir($default_path, 0777, true); - -// full path to the saved image including filename // -$destination = $default_path . basename( $_FILES[ 'Filedata' ][ 'name' ] ); - -// move the image into the specified directory // -if (move_uploaded_file($_FILES[ 'Filedata' ][ 'tmp_name' ], $destination)) { - echo "The file " . basename( $_FILES[ 'Filedata' ][ 'name' ] ) . " has been uploaded;"; -} else { - echo "FILE UPLOAD FAILED"; -} - - -?> diff --git a/libraries/chart/ofc/ofc_x_axis.php b/libraries/chart/ofc/ofc_x_axis.php deleted file mode 100644 index da1c7672b..000000000 --- a/libraries/chart/ofc/ofc_x_axis.php +++ /dev/null @@ -1,140 +0,0 @@ -stroke = $stroke; - } - - function stroke( $stroke ) - { - $this->set_stroke( $stroke ); - return $this; - } - - /** - *@param $colour as string HEX colour - *@param $grid_colour as string HEX colour - */ - function set_colours( $colour, $grid_colour ) - { - $this->set_colour( $colour ); - $this->set_grid_colour( $grid_colour ); - } - - /** - *@param $colour as string HEX colour - */ - function set_colour( $colour ) - { - $this->colour = $colour; - } - - function colour( $colour ) - { - $this->set_colour($colour); - return $this; - } - - function set_tick_height( $height ) - { - $tmp = 'tick-height'; - $this->$tmp = $height; - } - - function tick_height( $height ) - { - $this->set_tick_height($height); - return $this; - } - - function set_grid_colour( $colour ) - { - $tmp = 'grid-colour'; - $this->$tmp = $colour; - } - - function grid_colour( $colour ) - { - $this->set_grid_colour($colour); - return $this; - } - - /** - * @param $o is a boolean. If true, the X axis start half a step in - * This defaults to True - */ - function set_offset( $o ) - { - $this->offset = $o?true:false; - } - - function offset( $o ) - { - $this->set_offset($o); - return $this; - } - - /** - * @param $steps as integer. Which grid lines and ticks are visible. - */ - function set_steps( $steps ) - { - $this->steps = $steps; - } - - function steps( $steps ) - { - $this->set_steps($steps); - return $this; - } - - /** - * @param $val as an integer, the height in pixels of the 3D bar. Mostly - * used for the 3D bar chart. - */ - function set_3d( $val ) - { - $tmp = '3d'; - $this->$tmp = $val; - } - - /** - * @param $x_axis_labels as an x_axis_labels object - * Use this to customize the labels (colour, font, etc...) - */ - function set_labels( $x_axis_labels ) - { - //$this->labels = $v; - $this->labels = $x_axis_labels; - } - - /** - * Sugar syntax: helper function to make the examples simpler. - * @param $a is an array of labels - */ - function set_labels_from_array( $a ) - { - $x_axis_labels = new x_axis_labels(); - $x_axis_labels->set_labels( $a ); - $this->labels = $x_axis_labels; - - if( isset( $this->steps ) ) - $x_axis_labels->set_steps( $this->steps ); - } - - /** - * min and max. - */ - function set_range( $min, $max ) - { - $this->min = $min; - $this->max = $max; - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_x_axis_label.php b/libraries/chart/ofc/ofc_x_axis_label.php deleted file mode 100644 index cf116f15f..000000000 --- a/libraries/chart/ofc/ofc_x_axis_label.php +++ /dev/null @@ -1,45 +0,0 @@ -set_text( $text ); - $this->set_colour( $colour ); - $this->set_size( $size ); - $this->set_rotate( $rotate ); - } - - function set_text( $text ) - { - $this->text = $text; - } - - function set_colour( $colour ) - { - $this->colour = $colour; - } - - function set_size( $size ) - { - $this->size = $size; - } - - function set_rotate( $rotate ) - { - $this->rotate = $rotate; - } - - function set_vertical() - { - $this->rotate = "vertical"; - } - - function set_visible() - { - $this->visible = true; - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_x_axis_labels.php b/libraries/chart/ofc/ofc_x_axis_labels.php deleted file mode 100644 index af4540f95..000000000 --- a/libraries/chart/ofc/ofc_x_axis_labels.php +++ /dev/null @@ -1,69 +0,0 @@ -steps = $steps; - } - - /** - * @param $steps as integer which labels are visible - */ - function visible_steps( $steps ) - { - $this->{"visible-steps"} = $steps; - return $this; - } - - /** - * - * @param $labels as an array of [x_axis_label or string] - */ - function set_labels( $labels ) - { - $this->labels = $labels; - } - - function set_colour( $colour ) - { - $this->colour = $colour; - } - - /** - * font size in pixels - */ - function set_size( $size ) - { - $this->size = $size; - } - - /** - * rotate labels - */ - function set_vertical() - { - $this->rotate = 270; - } - - /** - * @param @angle as real. The angle of the text. - */ - function rotate( $angle ) - { - $this->rotate = $angle; - } - - /** - * @param $text as string. Replace and magic variables with actual x axis position. - */ - function text( $text ) - { - $this->text = $text; - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_x_legend.php b/libraries/chart/ofc/ofc_x_legend.php deleted file mode 100644 index 7a25af0c2..000000000 --- a/libraries/chart/ofc/ofc_x_legend.php +++ /dev/null @@ -1,15 +0,0 @@ -text = $text; - } - - function set_style( $css ) - { - $this->style = $css; - //"{font-size: 20px; color:#0000ff; font-family: Verdana; text-align: center;}"; - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_y_axis.php b/libraries/chart/ofc/ofc_y_axis.php deleted file mode 100644 index 3846c9285..000000000 --- a/libraries/chart/ofc/ofc_y_axis.php +++ /dev/null @@ -1,17 +0,0 @@ -$tmp = $colour; - } - -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_y_axis_base.php b/libraries/chart/ofc/ofc_y_axis_base.php deleted file mode 100644 index 8093a09e5..000000000 --- a/libraries/chart/ofc/ofc_y_axis_base.php +++ /dev/null @@ -1,116 +0,0 @@ -stroke = $s; - } - - /** - * @param $val as integer. The length of the ticks in pixels - */ - function set_tick_length( $val ) - { - $tmp = 'tick-length'; - $this->$tmp = $val; - } - - function set_colours( $colour, $grid_colour ) - { - $this->set_colour( $colour ); - $this->set_grid_colour( $grid_colour ); - } - - function set_colour( $colour ) - { - $this->colour = $colour; - } - - function set_grid_colour( $colour ) - { - $tmp = 'grid-colour'; - $this->$tmp = $colour; - } - - /** - * Set min and max values, also (optionally) set the steps value. - * You can reverse the chart by setting min larger than max, e.g. min = 10 - * and max = 0. - * - * @param $min as integer - * @param $max as integer - * @param $steps as integer. - */ - function set_range( $min, $max, $steps=1 ) - { - $this->min = $min; - $this->max = $max; - $this->set_steps( $steps ); - } - - /** - * Sugar for set_range - */ - function range( $min, $max, $steps=1 ) - { - $this->set_range( $min, $max, $steps ); - return $this; - } - - /** - * @param $off as Boolean. If true the Y axis is nudged up half a step. - */ - function set_offset( $off ) - { - $this->offset = $off?1:0; - } - - /** - * @param $y_axis_labels as an y_axis_labels object - * Use this to customize the labels (colour, font, etc...) - */ - function set_labels( $y_axis_labels ) - { - $this->labels = $y_axis_labels; - } - - /** - * Pass in some text for each label. This can contain magic variables "#val#" which - * will get replaced with the value for that Y axis label. Useful for: - * - "£#val#" - * - "#val#%" - * - "#val# million" - * - * @param $text as string. - */ - function set_label_text( $text ) - { - $tmp = new y_axis_labels(); - $tmp->set_text( $text ); - $this->labels = $tmp; - } - - /** - * @param $steps as integer. - * - * Only show every $steps label, e.g. every 10th - */ - function set_steps( $steps ) - { - $this->steps = $steps; - } - - /** - * Make the labels show vertical - */ - function set_vertical() - { - $this->rotate = "vertical"; - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_y_axis_label.php b/libraries/chart/ofc/ofc_y_axis_label.php deleted file mode 100644 index f2616f537..000000000 --- a/libraries/chart/ofc/ofc_y_axis_label.php +++ /dev/null @@ -1,38 +0,0 @@ -y = $y; - $this->set_text( $text ); - } - - function set_text( $text ) - { - $this->text = $text; - } - - function set_colour( $colour ) - { - $this->colour = $colour; - } - - function set_size( $size ) - { - $this->size = $size; - } - - function set_rotate( $rotate ) - { - $this->rotate = $rotate; - } - - function set_vertical() - { - $this->rotate = "vertical"; - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_y_axis_labels.php b/libraries/chart/ofc/ofc_y_axis_labels.php deleted file mode 100644 index c0708ab21..000000000 --- a/libraries/chart/ofc/ofc_y_axis_labels.php +++ /dev/null @@ -1,57 +0,0 @@ -steps = $steps; - } - - /** - * - * @param $labels as an array of [y_axis_label or string] - */ - function set_labels( $labels ) - { - $this->labels = $labels; - } - - function set_colour( $colour ) - { - $this->colour = $colour; - } - - /** - * font size in pixels - */ - function set_size( $size ) - { - $this->size = $size; - } - - /** - * rotate labels - */ - function set_vertical() - { - $this->rotate = 270; - } - - function rotate( $angle ) - { - $this->rotate = $angle; - } - - /** - * @param $text default text that all labels inherit - */ - function set_text( $text ) - { - $this->text = $text; - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/ofc_y_axis_right.php b/libraries/chart/ofc/ofc_y_axis_right.php deleted file mode 100644 index 71f7c2984..000000000 --- a/libraries/chart/ofc/ofc_y_axis_right.php +++ /dev/null @@ -1,6 +0,0 @@ -text = $text; - } - - function set_style( $css ) - { - $this->style = $css; - //"{font-size: 20px; color:#0000ff; font-family: Verdana; text-align: center;}"; - } -} \ No newline at end of file diff --git a/libraries/chart/ofc/open-flash-chart.php b/libraries/chart/ofc/open-flash-chart.php deleted file mode 100644 index b017097d0..000000000 --- a/libraries/chart/ofc/open-flash-chart.php +++ /dev/null @@ -1,178 +0,0 @@ -title = new title( "Many data lines" ); - $this->elements = array(); - } - - function set_title( $t ) - { - $this->title = $t; - } - - function set_x_axis( $x ) - { - $this->x_axis = $x; - } - - function set_y_axis( $y ) - { - $this->y_axis = $y; - } - - function add_y_axis( $y ) - { - $this->y_axis = $y; - } - - function set_y_axis_right( $y ) - { - $this->y_axis_right = $y; - } - - function add_element( $e ) - { - $this->elements[] = $e; - } - - function set_x_legend( $x ) - { - $this->x_legend = $x; - } - - function set_y_legend( $y ) - { - $this->y_legend = $y; - } - - function set_bg_colour( $colour ) - { - $this->bg_colour = $colour; - } - - function set_radar_axis( $radar ) - { - $this->radar_axis = $radar; - } - - function set_tooltip( $tooltip ) - { - $this->tooltip = $tooltip; - } - - /** - * This is a bit funky :( - * - * @param $num_decimals as integer. Truncate the decimals to $num_decimals, e.g. set it - * to 5 and 3.333333333 will display as 3.33333. 2.0 will display as 2 (or 2.00000 - see below) - * @param $is_fixed_num_decimals_forced as boolean. If true it will pad the decimals. - * @param $is_decimal_separator_comma as boolean - * @param $is_thousand_separator_disabled as boolean - * - * This needs a bit of love and attention - */ - function set_number_format($num_decimals, $is_fixed_num_decimals_forced, $is_decimal_separator_comma, $is_thousand_separator_disabled ) - { - $this->num_decimals = $num_decimals; - $this->is_fixed_num_decimals_forced = $is_fixed_num_decimals_forced; - $this->is_decimal_separator_comma = $is_decimal_separator_comma; - $this->is_thousand_separator_disabled = $is_thousand_separator_disabled; - } - - /** - * This is experimental and will change as we make it work - * - * @param $m as ofc_menu - */ - function set_menu($m) - { - $this->menu = $m; - } - - function toString() - { - if (function_exists('json_encode')) - { - return json_encode($this); - } - else - { - $json = new Services_JSON(); - return $json->encode( $this ); - } - } - - function toPrettyString() - { - return json_format( $this->toString() ); - } -} - - - -// -// there is no PHP end tag so we don't mess the headers up! -// \ No newline at end of file From eb3f96ac51c78ec51827a2636c1757d8707377fa Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Fri, 13 Aug 2010 14:34:07 +0300 Subject: [PATCH 76/80] changed comments to comply with phpdoc and added some new comments. Moved color settings to more appropriate places. --- libraries/chart.lib.php | 36 +++-- libraries/chart/pma_chart.php | 87 ++++++----- libraries/chart/pma_pchart_chart.php | 159 +++++++++++++++++++- libraries/chart/pma_pchart_multi.php | 23 ++- libraries/chart/pma_pchart_multi_bar.php | 14 ++ libraries/chart/pma_pchart_multi_line.php | 14 ++ libraries/chart/pma_pchart_multi_radar.php | 36 ++++- libraries/chart/pma_pchart_pie.php | 38 ++++- libraries/chart/pma_pchart_single.php | 14 +- libraries/chart/pma_pchart_single_bar.php | 14 ++ libraries/chart/pma_pchart_single_line.php | 14 ++ libraries/chart/pma_pchart_single_radar.php | 33 +++- libraries/chart/pma_pchart_stacked_bar.php | 14 ++ 13 files changed, 428 insertions(+), 68 deletions(-) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index b8213f2ad..1dfaf575c 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -1,5 +1,13 @@ + * @package phpMyAdmin + */ +/** + * + */ define('ERR_NO_GD', 0); define('ERR_NO_JSON', 1); @@ -13,15 +21,9 @@ require_once './libraries/chart/pma_pchart_single_radar.php'; require_once './libraries/chart/pma_pchart_multi_radar.php'; /** - * Chart functions used to generate various types - * of charts. - * - * @version $Id$ - * @package phpMyAdmin - */ - -/* - * Formats a chart for status page. + * Formats a chart for the status page. + * @param array $data data for the status chart + * @return string HTML and JS code for the chart */ function PMA_chart_status($data) { @@ -42,8 +44,10 @@ function PMA_chart_status($data) echo $chartCode; } -/* - * Formats a chart for profiling page. +/** + * Formats a chart for the profiling page. + * @param array $data data for the status chart + * @return string HTML and JS code for the chart */ function PMA_chart_profiling($data) { @@ -63,8 +67,11 @@ function PMA_chart_profiling($data) echo $chartCode; } -/* - * Formats a chart for query results page. +/** + * Formats a chart for the query results page. + * @param array $data data for the status chart + * @param array $chartSettings settings used to generate the chart + * @return string HTML and JS code for the chart */ function PMA_chart_results($data, &$chartSettings) { @@ -232,8 +239,9 @@ function PMA_chart_results($data, &$chartSettings) return $chartCode; } -/* +/** * Simple handler of chart errors. + * @param array $errors all occured errors */ function PMA_handle_chart_err($errors) { diff --git a/libraries/chart/pma_chart.php b/libraries/chart/pma_chart.php index 232a98e05..f70837f39 100644 --- a/libraries/chart/pma_chart.php +++ b/libraries/chart/pma_chart.php @@ -1,29 +1,37 @@ + * @package phpMyAdmin + */ +/** + * + */ define('RED', 0); define('GREEN', 1); define('BLUE', 2); -class PMA_Chart +/** + * The base class that all charts inherit from. + * @abstract + * @package phpMyAdmin + */ +abstract class PMA_chart { - /* - * The settings array. All the default values are here. + /** + * @var array All the default settigs values are here. */ protected $settings = array( - /* - * Default title for every chart. - */ + // Default title for every chart. 'titleText' => 'Chart', - /* - * The style of the chart title. - */ - 'titleStyle' => 'font-size: 12px; font-weight: bold;', + // The style of the chart title. + 'titleColor' => '#FAFAFA', - /* - * Colors for the different slices in the pie chart. - */ + // Colors for the different slices in the pie chart. 'colors' => array( '#BCE02E', '#E0642E', @@ -45,53 +53,50 @@ class PMA_Chart '#87C9BF', ), - /* - * Chart background color. - */ + // Chart background color. 'bgColor' => '#84AD83', - /* - * The width of the chart. - */ + // The width of the chart. 'width' => 520, - /* - * The height of the chart. - */ + // The height of the chart. 'height' => 325, - /* - * Default X Axis label. If empty, label will be taken from the data. - */ + // Default X Axis label. If empty, label will be taken from the data. 'xLabel' => '', - /* - * Default Y Axis label. If empty, label will be taken from the data. - */ + // Default Y Axis label. If empty, label will be taken from the data. 'yLabel' => '', ); - /* - * Options that the user has specified + /** + * @var array Options that the user has specified */ private $userSpecifiedSettings = null; - /* - * Error codes will be stored here + /** + * @var array Error codes will be stored here */ protected $errors = array(); + /** + * Store user specified options + * @param array $options users specified options + */ function __construct($options = null) { $this->userSpecifiedSettings = $options; } + /** + * All the variable initialization has to be done here. + */ protected function init() { $this->handleOptions(); } - /* + /** * A function which handles passed parameters. Useful if desired * chart needs to be a little bit different from the default one. */ @@ -109,9 +114,9 @@ class PMA_Chart return $this->settings['titleText']; } - protected function getTitleStyle() + protected function getTitleColor($component) { - return $this->settings['titleStyle']; + return $this->hexStrToDecComp($this->settings['titleColor'], $component); } protected function getColors() @@ -131,7 +136,7 @@ class PMA_Chart protected function getBgColor($component) { - return hexdec(substr($this->settings['bgColor'], ($component * 2) + 1, 2)); + return $this->hexStrToDecComp($this->settings['bgColor'], $component); } protected function setXLabel($label) @@ -163,6 +168,16 @@ class PMA_Chart { return $this->errors; } + + /** + * Get one the dec color component from the hex color string + * @param string $colorString color string, i.e. #5F22A99 + * @param int $component color component to get, i.e. 0 gets red. + */ + protected function hexStrToDecComp($colorString, $component) + { + return hexdec(substr($colorString, ($component * 2) + 1, 2)); + } } ?> diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php index bcca2ac28..3e8997030 100644 --- a/libraries/chart/pma_pchart_chart.php +++ b/libraries/chart/pma_pchart_chart.php @@ -1,5 +1,14 @@ + * @package phpMyAdmin + */ +/** + * + */ define('TOP', 0); define('RIGHT', 1); define('BOTTOM', 2); @@ -10,17 +19,36 @@ require_once 'pma_chart.php'; require_once 'pChart/pData.class'; require_once 'pChart/pChart.class'; -/* +/** * Base class for every chart implemented using pChart. + * @abstract + * @package phpMyAdmin */ -abstract class PMA_pChart_Chart extends PMA_Chart +abstract class PMA_pChart_chart extends PMA_chart { + /** + * @var String title text + */ protected $titleText; + + /** + * @var array data for the chart + */ protected $data; + /** + * @var object pData object that holds the description of the data + */ protected $dataSet; + + /** + * @var object pChart object that holds the chart + */ protected $chart; + /** + * @var array holds base64 encoded chart image parts + */ protected $partsEncoded = array(); public function __construct($data, $options = null) @@ -41,6 +69,21 @@ abstract class PMA_pChart_Chart extends PMA_Chart // as in CSS (top, right, bottom, left) $this->setAreaMargins(array(20, 20, 40, 60)); + + // when graph area gradient is used, this is the color of the graph + // area border + $this->settings['graphAreaColor'] = '#D5D9DD'; + + // the background color of the graph area + $this->settings['graphAreaGradientColor'] = '#A3CBA7'; + + // the color of the grid lines in the graph area + $this->settings['gridColor'] = '#E6E6E6'; + + // the color of the scale and the labels + $this->settings['scaleColor'] = '#D5D9DD'; + + $this->settings['titleBgColor'] = '#000000'; } protected function init() @@ -54,6 +97,7 @@ abstract class PMA_pChart_Chart extends PMA_Chart $this->dataSet = new pData; $this->chart->reportWarnings('GD'); + $this->chart->ErrorFontName = $this->getFontPath().'tahoma.ttf'; // initialize colors foreach ($this->getColors() as $key => $color) { @@ -70,14 +114,24 @@ abstract class PMA_pChart_Chart extends PMA_Chart $this->chart->setImageMap(true, 'mapid'); } + /** + * data is put to the $dataSet object according to what type chart is + * @abstract + */ abstract protected function prepareDataSet(); + /** + * all components of the chart are drawn + */ protected function prepareChart() { $this->drawBackground(); $this->drawChart(); } + /** + * draws the background + */ protected function drawBackground() { $this->drawCommon(); @@ -86,6 +140,9 @@ abstract class PMA_pChart_Chart extends PMA_Chart $this->drawGraphArea(); } + /** + * draws the part of the background which is common to most of the charts + */ protected function drawCommon() { $this->chart->drawGraphAreaGradient( @@ -96,12 +153,34 @@ abstract class PMA_pChart_Chart extends PMA_Chart $this->chart->addBorder(2); } + /** + * draws the chart title + */ protected function drawTitle() { // Draw the title - $this->chart->drawTextBox(0,0,$this->getWidth(),$this->getLabelHeight(),$this->getTitleText(),0,250,250,250,ALIGN_CENTER,True,0,0,0,30); + $this->chart->drawTextBox( + 0, + 0, + $this->getWidth(), + $this->getLabelHeight(), + $this->getTitleText(), + 0, + $this->getTitleColor(RED), + $this->getTitleColor(GREEN), + $this->getTitleColor(BLUE), + ALIGN_CENTER, + True, + $this->getTitleBgColor(RED), + $this->getTitleBgColor(GREEN), + $this->getTitleBgColor(BLUE), + 30 + ); } + /** + * calculates and sets the dimensions that will be used for the actual graph + */ protected function setGraphAreaDimensions() { $this->chart->setGraphArea( @@ -112,17 +191,49 @@ abstract class PMA_pChart_Chart extends PMA_Chart ); } + /** + * draws graph area (the area where all bars, lines, points will be seen) + */ protected function drawGraphArea() { - $this->chart->drawGraphArea(213,217,221,FALSE); - $this->chart->drawScale($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),$this->getScale(),213,217,221,TRUE,0,2,TRUE); - $this->chart->drawGraphAreaGradient(163,203,167,50); - $this->chart->drawGrid(4,TRUE,230,230,230,20); + $this->chart->drawGraphArea( + $this->getGraphAreaColor(RED), + $this->getGraphAreaColor(GREEN), + $this->getGraphAreaColor(BLUE), + FALSE + ); + $this->chart->drawScale( + $this->dataSet->GetData(), + $this->dataSet->GetDataDescription(), + $this->getScale(), + $this->getScaleColor(RED), + $this->getScaleColor(GREEN), + $this->getScaleColor(BLUE), + TRUE,0,2,TRUE + ); + $this->chart->drawGraphAreaGradient( + $this->getGraphAreaGradientColor(RED), + $this->getGraphAreaGradientColor(GREEN), + $this->getGraphAreaGradientColor(BLUE), + 50 + ); + $this->chart->drawGrid( + 4, + TRUE, + $this->getGridColor(RED), + $this->getGridColor(GREEN), + $this->getGridColor(BLUE), + 20 + ); } + /** + * draws the chart + * @abstract + */ protected abstract function drawChart(); - /* + /** * Renders the chart, base 64 encodes the output and puts it into * array partsEncoded. * @@ -169,6 +280,10 @@ abstract class PMA_pChart_Chart extends PMA_Chart } } + /** + * get the HTML and JS code for the configured chart + * @return string HTML and JS code for the chart + */ public function toString() { if (!function_exists('gd_info')) { @@ -181,7 +296,9 @@ abstract class PMA_pChart_Chart extends PMA_Chart $this->prepareChart(); //$this->chart->debugImageMap(); + $this->chart->printErrors('GD'); + // check if a user wanted a chart in one part if ($this->isContinuous()) { $this->render(1); } @@ -195,6 +312,7 @@ abstract class PMA_pChart_Chart extends PMA_Chart } $returnData .= '

'; + // add tooltips only if json is available if (function_exists('json_encode')) { $returnData .= '