From 79485cd126fb4111d129aaedc0ea1ec55ff59640 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Mon, 24 May 2010 21:55:44 +0200 Subject: [PATCH 01/89] test commit --- README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README b/README index 2bc2d1a88b..40e72c7494 100644 --- a/README +++ b/README @@ -1,6 +1,6 @@ $Id$ -phpMyAdmin - Readme +phpMyAdmin - Readme Hey Hey =================== A set of PHP-scripts to manage MySQL over the web. From 1cff6bd9283d6a9f3e1a3bf219ecf218ffe510fb Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Mon, 24 May 2010 22:15:00 +0200 Subject: [PATCH 02/89] Revert initial commit --- README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README b/README index 40e72c7494..2bc2d1a88b 100644 --- a/README +++ b/README @@ -1,6 +1,6 @@ $Id$ -phpMyAdmin - Readme Hey Hey +phpMyAdmin - Readme =================== A set of PHP-scripts to manage MySQL over the web. From 61e00e523e7a36570bf05cacfae53dc33621f5e8 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Fri, 4 Jun 2010 16:19:55 +0200 Subject: [PATCH 03/89] 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 0000000000..758b1953bd --- /dev/null +++ b/libraries/chart.lib.php @@ -0,0 +1,15 @@ + diff --git a/server_status.php b/server_status.php index 3ab8a49a2e..2981ed7765 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 04/89] 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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 @|{ 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 = $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 0000000000..b8e3de5cb1 --- /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 0000000000..a6e811fd55 --- /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 0000000000..4293af0b65 --- /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 0000000000..5731391a33 --- /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 0000000000..3c2c6e9dc3 --- /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 0000000000..6ddda42749 --- /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 0000000000..47552184ce --- /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 0000000000..c1303b86bb --- /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 0000000000..837c1fc458 --- /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 0000000000..e833501519 --- /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 0000000000..ce1bcccf8a --- /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 0000000000..3d9f8d9f0c --- /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 0000000000..21ad67f8d3 --- /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 0000000000..6f8c0e451f --- /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 0000000000..e635f2c028 --- /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 0000000000..fa45cbc899 --- /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 0000000000..146691173b --- /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 0000000000..512bb07d97 --- /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 0000000000..4f538cf9de --- /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 0000000000..0750a09c2b --- /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 0000000000..bf779c5541 --- /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 0000000000..909c41af8f --- /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 0000000000..22d485e4e6 --- /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 0000000000..51ba25e9a7 --- /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 0000000000..7159a3a64f --- /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 0000000000..d667d7e8cf --- /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 0000000000..0cfe39f9bc --- /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 0000000000..a9e85555ee --- /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 0000000000..7e7e244542 --- /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 0000000000..cda1de0068 --- /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 0000000000..3104ee33b9 --- /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 0000000000..0261f9aeae --- /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 0000000000..da1c7672bd --- /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 0000000000..cf116f15f0 --- /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 0000000000..af4540f95e --- /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 0000000000..7a25af0c28 --- /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 0000000000..3846c92852 --- /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 0000000000..8093a09e5f --- /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 0000000000..f2616f537e --- /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 0000000000..c0708ab219 --- /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 0000000000..71f7c29845 --- /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 0000000000..b017097d00 --- /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 05/89] 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 758b1953bd..043d394a29 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 0000000000..57fde58441 --- /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 0000000000..c04bb20687 --- /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 0000000000..f213a22488 --- /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 2981ed7765..b6e8b148f3 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 06/89] 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 b6e8b148f3..d82fc19634 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 07/89] 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 043d394a29..bf3b2c699d 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 57fde58441..a1d7980702 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 f213a22488..e8628fe065 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 ec2f8eb672..8002bcb482 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 288f150d48..1ec8f0dabc 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 08/89] 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 09/89] 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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 O@`a}xV@&j7=>7#Q^<=;R literal 0 HcmV?d00001 diff --git a/libraries/chart/pChart/pCache.class b/libraries/chart/pChart/pCache.class new file mode 100644 index 0000000000..2bcd6b0442 --- /dev/null +++ b/libraries/chart/pChart/pCache.class @@ -0,0 +1,119 @@ +. + + 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 0000000000..c407b7e2c5 --- /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 0000000000..49d2fcc568 --- /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 0000000000..fbf1a1c69b --- /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 0000000000..f2b3057084 --- /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 10/89] 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 a1d7980702..0288b5d3a7 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 c04bb20687..eb75e71262 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 11/89] 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 bf3b2c699d..5b779c3b13 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 8002bcb482..2b471934c3 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 d82fc19634..3869cbbdf7 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 12/89] 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 5b779c3b13..b653f98830 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 13/89] 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 b653f98830..cb48945a94 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 0288b5d3a7..e5b9fdeeed 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 f2b3057084..4bf886fa26 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 14/89] 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 5238d937fd..2e54a8b19d 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 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 Date: Thu, 17 Jun 2010 20:54:32 +0300 Subject: [PATCH 15/89] 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 e5b9fdeeed..d89ef139e0 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 16/89] 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 fbf1a1c69b..356f435a40 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 4bf886fa26..9b9f0d08c0 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 17/89] 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 cb48945a94..3a4b503158 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 0000000000..9e4d88e172 --- /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 2e54a8b19d..11e7a03401 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 0000000000..daafd36ffb --- /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 18/89] 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 3a4b503158..e36b338fbc 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 9e4d88e172..39e385a470 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 0000000000..b1b5410915 --- /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 19/89] 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 e36b338fbc..a4b26a92cd 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 d89ef139e0..6202273be5 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 39e385a470..613d8c2d19 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 356f435a40..8ff41fe49a 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 9b9f0d08c0..bd93e8978d 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 b1b5410915..d3fae51950 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 daafd36ffb..070da7be73 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 20/89] 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 a4b26a92cd..f2c764ca2f 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 21/89] 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 6202273be5..423641a0d7 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 22/89] 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 f2c764ca2f..e48bf4a84b 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 423641a0d7..357dafa4aa 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 613d8c2d19..d8947f83d1 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 070da7be73..6aae9844f2 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 23/89] 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 e48bf4a84b..1c634a8ca8 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 24/89] 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 1c634a8ca8..8c41e62ebe 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 8ff41fe49a..3c6648ad44 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 25/89] 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 bd93e8978d..d8aa552441 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 26/89] 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 d8aa552441..c12a0dcdd9 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 27/89] 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 c407b7e2c5..d2b43311c9 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 28/89] 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 d2b43311c9..169040e26f 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 29/89] 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 169040e26f..9acbdafcfe 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 30/89] 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 9acbdafcfe..6d521a2d7d 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 3c6648ad44..dd83fd91ad 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 c12a0dcdd9..418dab7a0c 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 31/89] 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 8c41e62ebe..3e81345c20 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 32/89] 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 6d521a2d7d..947f3ef6f5 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 33/89] 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 3e81345c20..e135a7193e 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 d8947f83d1..0000000000 --- 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 dd83fd91ad..dce0faf74c 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 0000000000..0be03bf38f --- /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 0000000000..7c10b6c0a9 --- /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 418dab7a0c..1dbef08d68 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 0000000000..a1b45e029b --- /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 0000000000..1005a1ea55 --- /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 0000000000..8bf55de580 --- /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 d3fae51950..0000000000 --- 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 0000000000..53575058da --- /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 6aae9844f2..11f2d73407 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 34/89] 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 357dafa4aa..d31f97f338 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 dce0faf74c..10c19c8dc1 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 35/89] 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 7c10b6c0a9..0787284707 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 8bf55de580..b5f86ffbf7 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 36/89] 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 e135a7193e..b245b2a4a7 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 10c19c8dc1..57f10fd69e 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 0be03bf38f..b4f67db405 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 0000000000..194ba2cc72 --- /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 11f2d73407..dffd4fae0a 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 37/89] 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 57f10fd69e..e9485fca11 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 1005a1ea55..024826af7c 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 38/89] 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 b245b2a4a7..7267d69870 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 1dbef08d68..5e01d9a1a0 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 dffd4fae0a..22b587f91d 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 39/89] 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 947f3ef6f5..c5f7395350 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 40/89] 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 7267d69870..794f06cfa3 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 0000000000..e50634029f --- /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 a1b45e029b..70b0b71012 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 0000000000..48c6d00f1a --- /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 22b587f91d..04e3db7fe3 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 41/89] 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 794f06cfa3..6855dd12be 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 d31f97f338..735b0a484a 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 e9485fca11..8965ee62f3 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 5e01d9a1a0..f740dc6cdf 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 42/89] 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 6855dd12be..68639fff99 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 735b0a484a..5baf2bd386 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 8965ee62f3..710a60fc0b 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 43/89] 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 68639fff99..fe9dfd2b6c 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 5baf2bd386..9b51610990 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 44/89] 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 49d2fcc568..efc2a6508d 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 45/89] 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 fe9dfd2b6c..0f2015a1e5 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 46/89] 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 9b51610990..305f3e220c 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 70b0b71012..097fd0ac9a 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 47/89] 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 0f2015a1e5..1b7c3079c3 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 305f3e220c..9ecfa7ad27 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 710a60fc0b..80d7f68c27 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 b4f67db405..9114b8e516 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 194ba2cc72..a268f93516 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 0787284707..576b40ff82 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 e50634029f..1a3170714f 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 f740dc6cdf..cd848eda79 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 097fd0ac9a..d6d4c34c27 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 024826af7c..d08e4f6e75 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 b5f86ffbf7..4104ad28e0 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 48c6d00f1a..b1c017e32e 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 53575058da..5b8fcedcad 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 04e3db7fe3..f2c9d5ee9d 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 48/89] 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 9114b8e516..5570d2a2a6 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 49/89] 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 1b7c3079c3..03fd2118e6 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 9ecfa7ad27..232a98e058 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 80d7f68c27..363a575415 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 f2c9d5ee9d..f00a291b2f 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 50/89] 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 0000000000..45a2701282 --- /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 0000000000..2f486435f7 --- /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 363a575415..ebd9c562fd 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 f00a291b2f..a0fdfb8284 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 51/89] 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 2f486435f7..1c73ba62d6 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 c5f7395350..5386172687 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 ebd9c562fd..910d8040bf 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 52/89] 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 5386172687..6298c595c4 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 53/89] 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 3869cbbdf7..7afe8441f6 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 1ec8f0dabc..33321f8d91 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 54/89] 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 1c73ba62d6..a40dee9e4e 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 910d8040bf..dfba08169c 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 55/89] 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 a40dee9e4e..fbcd817b8a 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 dfba08169c..87ca65f702 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 73/89] 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 e5c8bf649e..97af136046 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 74/89] 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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 @|{ 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.'" 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 2b5ea7e908..0000000000 --- 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 75/89] 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 f4d5cdd51e..3939e552e0 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 76/89] 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 fc3f738493..bfcd4d235e 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 3939e552e0..b8213f2ad6 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 eb2bc46936..2b5a077213 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 97af136046..bcca2ac288 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 31118bd8c1..4e8f555e2b 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 77/89] 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 012fbfd52f..0000000000 --- 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 5772efcd9f..0000000000 --- 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 b8e3de5cb1..0000000000 --- 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 a6e811fd55..0000000000 --- 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 4293af0b65..0000000000 --- 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 5731391a33..0000000000 --- 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 3c2c6e9dc3..0000000000 --- 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 6ddda42749..0000000000 --- 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 47552184ce..0000000000 --- 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 c1303b86bb..0000000000 --- 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 837c1fc458..0000000000 --- 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 e833501519..0000000000 --- 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 ce1bcccf8a..0000000000 --- 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 3d9f8d9f0c..0000000000 --- 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 21ad67f8d3..0000000000 --- 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 6f8c0e451f..0000000000 --- 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 e635f2c028..0000000000 --- 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 fa45cbc899..0000000000 --- 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 146691173b..0000000000 --- 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 512bb07d97..0000000000 --- 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 4f538cf9de..0000000000 --- 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 0750a09c2b..0000000000 --- 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 bf779c5541..0000000000 --- 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 909c41af8f..0000000000 --- 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 22d485e4e6..0000000000 --- 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 51ba25e9a7..0000000000 --- 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 7159a3a64f..0000000000 --- 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 d667d7e8cf..0000000000 --- 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 0cfe39f9bc..0000000000 --- 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 a9e85555ee..0000000000 --- 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 7e7e244542..0000000000 --- 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 cda1de0068..0000000000 --- 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 3104ee33b9..0000000000 --- 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 0261f9aeae..0000000000 --- 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 da1c7672bd..0000000000 --- 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 cf116f15f0..0000000000 --- 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 af4540f95e..0000000000 --- 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 7a25af0c28..0000000000 --- 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 3846c92852..0000000000 --- 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 8093a09e5f..0000000000 --- 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 f2616f537e..0000000000 --- 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 c0708ab219..0000000000 --- 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 71f7c29845..0000000000 --- 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 b017097d00..0000000000 --- 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 78/89] 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 b8213f2ad6..1dfaf575cf 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 232a98e058..f70837f391 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 bcca2ac288..3e89970308 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 .= ' '; } From e076ec85e174038c7ffe17f701342e52f4413afe Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Wed, 25 Aug 2010 16:10:27 +0200 Subject: [PATCH 85/89] Add vim mode lines --- libraries/chart.lib.php | 1 + libraries/chart/pma_chart.php | 1 + libraries/chart/pma_pchart_chart.php | 1 + libraries/chart/pma_pchart_multi.php | 1 + libraries/chart/pma_pchart_multi_bar.php | 1 + libraries/chart/pma_pchart_multi_line.php | 1 + libraries/chart/pma_pchart_multi_radar.php | 1 + libraries/chart/pma_pchart_pie.php | 1 + libraries/chart/pma_pchart_single.php | 1 + libraries/chart/pma_pchart_single_bar.php | 1 + libraries/chart/pma_pchart_single_line.php | 1 + libraries/chart/pma_pchart_single_radar.php | 1 + libraries/chart/pma_pchart_stacked_bar.php | 1 + 13 files changed, 13 insertions(+) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index 1dfaf575cf..7ed5a7d375 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -1,4 +1,5 @@ diff --git a/libraries/chart/pma_chart.php b/libraries/chart/pma_chart.php index f70837f391..ae483c89a8 100644 --- a/libraries/chart/pma_chart.php +++ b/libraries/chart/pma_chart.php @@ -1,4 +1,5 @@ * @package phpMyAdmin diff --git a/libraries/chart/pma_pchart_multi_bar.php b/libraries/chart/pma_pchart_multi_bar.php index c3fb53b66a..698db5c8ca 100644 --- a/libraries/chart/pma_pchart_multi_bar.php +++ b/libraries/chart/pma_pchart_multi_bar.php @@ -1,4 +1,5 @@ * @package phpMyAdmin diff --git a/libraries/chart/pma_pchart_multi_line.php b/libraries/chart/pma_pchart_multi_line.php index 3507f870a3..866288ce27 100644 --- a/libraries/chart/pma_pchart_multi_line.php +++ b/libraries/chart/pma_pchart_multi_line.php @@ -1,4 +1,5 @@ * @package phpMyAdmin diff --git a/libraries/chart/pma_pchart_multi_radar.php b/libraries/chart/pma_pchart_multi_radar.php index 4af060757c..d88cdc06ab 100644 --- a/libraries/chart/pma_pchart_multi_radar.php +++ b/libraries/chart/pma_pchart_multi_radar.php @@ -1,4 +1,5 @@ * @package phpMyAdmin diff --git a/libraries/chart/pma_pchart_pie.php b/libraries/chart/pma_pchart_pie.php index c8eced9d3e..ce06604b10 100644 --- a/libraries/chart/pma_pchart_pie.php +++ b/libraries/chart/pma_pchart_pie.php @@ -1,4 +1,5 @@ * @package phpMyAdmin diff --git a/libraries/chart/pma_pchart_single.php b/libraries/chart/pma_pchart_single.php index 9935b090a6..04fef80c6b 100644 --- a/libraries/chart/pma_pchart_single.php +++ b/libraries/chart/pma_pchart_single.php @@ -1,4 +1,5 @@ * @package phpMyAdmin diff --git a/libraries/chart/pma_pchart_single_bar.php b/libraries/chart/pma_pchart_single_bar.php index 3ea78cb8a9..257d8a9f27 100644 --- a/libraries/chart/pma_pchart_single_bar.php +++ b/libraries/chart/pma_pchart_single_bar.php @@ -1,4 +1,5 @@ * @package phpMyAdmin diff --git a/libraries/chart/pma_pchart_single_line.php b/libraries/chart/pma_pchart_single_line.php index 2ffe3440ac..614e1d20ef 100644 --- a/libraries/chart/pma_pchart_single_line.php +++ b/libraries/chart/pma_pchart_single_line.php @@ -1,4 +1,5 @@ * @package phpMyAdmin diff --git a/libraries/chart/pma_pchart_single_radar.php b/libraries/chart/pma_pchart_single_radar.php index db0110d212..e8e968047a 100644 --- a/libraries/chart/pma_pchart_single_radar.php +++ b/libraries/chart/pma_pchart_single_radar.php @@ -1,4 +1,5 @@ * @package phpMyAdmin diff --git a/libraries/chart/pma_pchart_stacked_bar.php b/libraries/chart/pma_pchart_stacked_bar.php index 1449c2ff9c..c8423426a7 100644 --- a/libraries/chart/pma_pchart_stacked_bar.php +++ b/libraries/chart/pma_pchart_stacked_bar.php @@ -1,4 +1,5 @@ * @package phpMyAdmin From e141acf5c6bec609cfcd72c9ac131942d59f8d2e Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Thu, 19 Aug 2010 11:03:58 +0200 Subject: [PATCH 86/89] Changed text to tooltip, and elaborated. --- tbl_chart.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tbl_chart.php b/tbl_chart.php index bd565125f3..0e9ed40492 100644 --- a/tbl_chart.php +++ b/tbl_chart.php @@ -153,7 +153,7 @@ $url_params['reload'] = 1; > - + From dcf470e6d752b80ffaf3d641eb0000e47f341d05 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Wed, 25 Aug 2010 17:44:27 +0200 Subject: [PATCH 87/89] duplicated icon from themes/original/img/b_chart.png --- themes/darkblue_orange/img/b_chart.png | Bin 0 -> 3118 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 themes/darkblue_orange/img/b_chart.png diff --git a/themes/darkblue_orange/img/b_chart.png b/themes/darkblue_orange/img/b_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..388ec3006553ee7c932952662af4e2545356d1cd GIT binary patch literal 3118 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 Date: Thu, 26 Aug 2010 10:01:08 +0200 Subject: [PATCH 88/89] updated changelog --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index eb47035a1e..10451cc9c5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -109,6 +109,7 @@ $Id$ - rfe #2973909 Users preferences - [relations] Dropped WYSIWYG-PDF configuration variable. - rfe #806035, #686260 [relations] Export relations to Dia, SVG and others ++ [interface] Added charts to status tab, profiling page and query results 3.3.7.0 (not yet released) From 51c9c1763ea70c36e0d22cc865b48f5186da1fbc Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Thu, 26 Aug 2010 17:01:12 +0200 Subject: [PATCH 89/89] Code cleanup, mostly added extra spaces --- libraries/chart.lib.php | 6 +++--- libraries/chart/pma_pchart_multi_bar.php | 2 +- libraries/chart/pma_pchart_multi_line.php | 4 ++-- libraries/chart/pma_pchart_multi_radar.php | 5 +++-- libraries/chart/pma_pchart_pie.php | 8 ++++---- libraries/chart/pma_pchart_single_bar.php | 2 +- libraries/chart/pma_pchart_single_line.php | 4 ++-- libraries/chart/pma_pchart_single_radar.php | 5 +++-- libraries/chart/pma_pchart_stacked_bar.php | 2 +- 9 files changed, 20 insertions(+), 18 deletions(-) diff --git a/libraries/chart.lib.php b/libraries/chart.lib.php index 7ed5a7d375..045da9445b 100644 --- a/libraries/chart.lib.php +++ b/libraries/chart.lib.php @@ -54,7 +54,7 @@ function PMA_chart_profiling($data) { $chartData = array(); foreach($data as $dataValue) { - $value = (int)($dataValue['Duration']*1000000); + $value = (int)($dataValue['Duration'] * 1000000); $key = ucwords($dataValue['Status']); $chartData[$key] = $value; } @@ -247,10 +247,10 @@ function PMA_chart_results($data, &$chartSettings) function PMA_handle_chart_err($errors) { if (in_array(ERR_NO_GD, $errors)) { - PMA_warnMissingExtension('GD', false, 'GD extension is needed for charts.'); + 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.'); + PMA_warnMissingExtension('JSON', false, __('JSON encoder is needed for chart tooltips.')); } } diff --git a/libraries/chart/pma_pchart_multi_bar.php b/libraries/chart/pma_pchart_multi_bar.php index 698db5c8ca..6c3969b444 100644 --- a/libraries/chart/pma_pchart_multi_bar.php +++ b/libraries/chart/pma_pchart_multi_bar.php @@ -31,7 +31,7 @@ class PMA_pChart_multi_bar extends PMA_pChart_multi parent::drawChart(); // Draw the bar chart - $this->chart->drawBarGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),70); + $this->chart->drawBarGraph($this->dataSet->GetData(), $this->dataSet->GetDataDescription(), 70); } } diff --git a/libraries/chart/pma_pchart_multi_line.php b/libraries/chart/pma_pchart_multi_line.php index 866288ce27..892c01195e 100644 --- a/libraries/chart/pma_pchart_multi_line.php +++ b/libraries/chart/pma_pchart_multi_line.php @@ -31,8 +31,8 @@ class PMA_pChart_multi_line extends PMA_pChart_multi parent::drawChart(); // Draw the bar chart - $this->chart->drawLineGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription()); - $this->chart->drawPlotGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),3,1,-1,-1,-1,TRUE); + $this->chart->drawLineGraph($this->dataSet->GetData(), $this->dataSet->GetDataDescription()); + $this->chart->drawPlotGraph($this->dataSet->GetData(), $this->dataSet->GetDataDescription(), 3, 1, -1, -1, -1, TRUE); } } diff --git a/libraries/chart/pma_pchart_multi_radar.php b/libraries/chart/pma_pchart_multi_radar.php index d88cdc06ab..2224acc9f6 100644 --- a/libraries/chart/pma_pchart_multi_radar.php +++ b/libraries/chart/pma_pchart_multi_radar.php @@ -91,8 +91,9 @@ class PMA_pChart_multi_radar extends PMA_pChart_multi $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); + $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_pie.php b/libraries/chart/pma_pchart_pie.php index ce06604b10..5bf77fcf0e 100644 --- a/libraries/chart/pma_pchart_pie.php +++ b/libraries/chart/pma_pchart_pie.php @@ -31,8 +31,8 @@ class PMA_pChart_Pie extends PMA_pChart_multi protected function prepareDataSet() { // Dataset definition - $this->dataSet->AddPoint(array_values($this->data),"Values"); - $this->dataSet->AddPoint(array_keys($this->data),"Keys"); + $this->dataSet->AddPoint(array_values($this->data), "Values"); + $this->dataSet->AddPoint(array_keys($this->data), "Keys"); $this->dataSet->AddAllSeries(); $this->dataSet->SetAbsciseLabelSerie("Keys"); } @@ -75,7 +75,7 @@ class PMA_pChart_Pie extends PMA_pChart_multi // lower part. This is why we set an offset to the // Y middle coordiantes. $middleY - 15, - 120,PIE_PERCENTAGE,FALSE,60,30,10,1); + 120, PIE_PERCENTAGE, FALSE, 60, 30, 10, 1); } /** @@ -88,7 +88,7 @@ class PMA_pChart_Pie extends PMA_pChart_multi $this->getLabelHeight() + $this->getLegendMargin(TOP), $this->dataSet->GetData(), $this->dataSet->GetDataDescription(), - 250,250,250); + 250, 250, 250); } protected function getLegendBoxWidth() diff --git a/libraries/chart/pma_pchart_single_bar.php b/libraries/chart/pma_pchart_single_bar.php index 257d8a9f27..821df636ed 100644 --- a/libraries/chart/pma_pchart_single_bar.php +++ b/libraries/chart/pma_pchart_single_bar.php @@ -28,7 +28,7 @@ class PMA_pChart_single_bar extends PMA_pChart_single { // Draw the bar chart // use stacked bar graph function, because it gives bars with alpha - $this->chart->drawStackedBarGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),70); + $this->chart->drawStackedBarGraph($this->dataSet->GetData(), $this->dataSet->GetDataDescription(), 70); } } diff --git a/libraries/chart/pma_pchart_single_line.php b/libraries/chart/pma_pchart_single_line.php index 614e1d20ef..a0ac7422ac 100644 --- a/libraries/chart/pma_pchart_single_line.php +++ b/libraries/chart/pma_pchart_single_line.php @@ -27,8 +27,8 @@ class PMA_pChart_single_line extends PMA_pChart_single protected function drawChart() { // Draw the line chart - $this->chart->drawLineGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription()); - $this->chart->drawPlotGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),3,1,-1,-1,-1,TRUE); + $this->chart->drawLineGraph($this->dataSet->GetData(), $this->dataSet->GetDataDescription()); + $this->chart->drawPlotGraph($this->dataSet->GetData(), $this->dataSet->GetDataDescription(), 3, 1, -1, -1, -1, TRUE); } } diff --git a/libraries/chart/pma_pchart_single_radar.php b/libraries/chart/pma_pchart_single_radar.php index e8e968047a..1b31cd057a 100644 --- a/libraries/chart/pma_pchart_single_radar.php +++ b/libraries/chart/pma_pchart_single_radar.php @@ -79,8 +79,9 @@ class PMA_pChart_single_radar extends PMA_pChart_single // 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); + $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_stacked_bar.php b/libraries/chart/pma_pchart_stacked_bar.php index c8423426a7..4a633f0054 100644 --- a/libraries/chart/pma_pchart_stacked_bar.php +++ b/libraries/chart/pma_pchart_stacked_bar.php @@ -29,7 +29,7 @@ class PMA_pChart_stacked_bar extends PMA_pChart_multi parent::drawChart(); // Draw the bar chart - $this->chart->drawStackedBarGraph($this->dataSet->GetData(),$this->dataSet->GetDataDescription(),70); + $this->chart->drawStackedBarGraph($this->dataSet->GetData(), $this->dataSet->GetDataDescription(), 70); } }