الشركة الأفضل لبرمجة المواقع والتطبيقات و عرض أفضل سرفيرس في العالم العربي



Statistics and counters: Graph Maker Function


Graph Maker Function

 
function GraphRows($rows, $opts) 
#  options 
#     
#    box_x_size: width of values area 
#    box_y_size: height of the values area 
#    x_size: total width of the graph 
#    y_size: total height of the graph 
#    x_val: array element of record to assign as x_value 
#    y_val: array element to assign as y_value 
#    x_label: label for the Bottom of the graph 
#    y_label: label for the left side 
#    font: font number to use from system 
#    font_file: file to use as the font 
#    show_x_val: true == show X value of each bar with the y_label 
#    show_y_val: true == show Y value labels 
#    title: string for top of graph 
#    bar_color: color array to use for bars 
#    box_color: color to use for the box edging and value box. 
#    label_color: color for the labels 
#    val_color: color to to use for the values 
#    title_color: color to use for the title. 
#    bg_color: color for the background. 
#    bg_trans: make the background transparant. 
#    img_format: can be "png", "gif", or "jpg". 
 
  $defaults = array("show_x_val" => 1, 
            "show_y_val" => 1, 
            "show_y_lines" => 1, 
            "font" => 1, 
            "x_val" => NULL, 
            "y_val" => NULL, 
            "title" => NULL, 
            "x_label" => NULL, 
            "y_label" => NULL, 
            "x_title" => NULL, 
            "y_title" => NULL, 
            "x_slant" => NULL, 
            "font_file" => NULL, 
            "x_size" => NULL, 
            "y_size" => NULL, 
            "box_x_size" => 300, 
            "box_y_size" => 200, 
            "right_margin" => 2, 
            "fg_color" => array(1,1,1), 
            "bg_color" => array(232, 226, 202), 
            "bg_trans" => NULL, 
            "bar_color" => array(128, 128, 128), 
            "box_color" => NULL, 
            "val_color" => NULL, 
            "title_color" => NULL, 
            "return" => NULL, 
            "img_format" => "png"); 
  foreach($defaults as $opt => $val) 
  { 
    if(!array_Key_exists($opt, $opts)) 
      { 
    $opts["$opt"] = $val; 
      } 
  } 
  if($opts["font_file"]) 
    { 
      $opts["font"] =imageloadfont($opts["font_file"]); 
    } 
  $font_y = imagefontheight($opts["font"]); 
  $font_x = imagefontwidth($opts["font"]); 
   
#the boxed area with be 2 from the top and right, 30 from the left, and 12 from the bottom. 
# the border will be 1px wide. 
  $max_x = 0; 
  $max_y = 0; 
  $longest_x = 0; 
  $longest_y = 0; 
  $x_mod = 1.3; 
  $y_mod = 1.3; 
   
# find the longest x and y value str lengths for the label margin size. 
  foreach($rows as $idx => $row) 
  { 
    $y_val = $row; 
    $x_val = $idx; 
    if(is_array($row)) 
      { 
    foreach($row as $idx => $val) 
    { 
      $y_val = $val; 
      break; 
    } 
    if($opts["y_val"]) 
      { 
        if(array_key_exists($opts["y_val"], $row)) 
          { 
        $y_val = $row[$opts["y_val"]]; 
          } 
      } 
 
    if($opts["x_val"]) 
      { 
        if(array_key_exists($opts["x_val"], $row)) 
          { 
        $x_val = $row[$opts["x_val"]]; 
          } 
      } 
      } 
    if($y_val > $max_y) 
      { 
    $max_y = $y_val; 
      } 
    if($x_val > $max_x) 
      { 
    $max_x = $x_val; 
      } 
    $y_len = strlen($y_val); 
    $x_len = strlen($x_val); 
    if($y_len > $longest_y) 
      { 
    $longest_y = $y_len; 
      } 
    if($x_len > $longest_x) 
      { 
    $longest_x = $x_len; 
      } 
  } 
  $left_margin = 0; 
  $bottom_margin = 0; 
  $top_margin = $font_y * ($y_mod/2); 
  if($opts["title"] != NULL) 
    { 
      $top_margin = $font_y * $y_mod + $font_y * ($y_mod/2); 
    } 
  if($opts["show_x_val"]) 
    { 
      $bottom_margin += $font_y * $y_mod; 
      if($opts["x_slant"]) 
    { 
      $bottom_margin += $font_x * $longest_x - $font_y * $y_mod; 
    } 
    } 
  if($opts["show_y_in_x"]) 
    { 
      $bottom_margin += $font_y * $y_mod; 
    } 
  if($opts["x_title"]) 
    { 
      $bottom_margin += $font_y * $y_mod; 
    } 
  if($opts["show_y_val"]) 
    { 
      $left_margin += $font_x * $x_mod * $longest_y; 
    } 
  if($opts["y_title"]) 
    { 
      $t_margin = $font_y * $y_mod + $font_y * ($y_mod/2); 
      $l_margin = $font_x * $x_mod * strlen($opts["y_title"]); 
      if($t_margin > $top_margin) 
    { 
      $top_margin = $t_margin; 
    } 
      if($l_margin > $left_margin) 
    { 
      $left_margin = $l_margin; 
    } 
    } 
# we have to calculate the x and y image and box sizes depending on which is present. 
  # img sizing overrides the box size; 
  if($opts["x_size"]) 
    { 
      $opts["box_x_size"] = $img_x - $left_margin - 2 - $opts["right_margin"] ; 
   } 
  else 
    { 
      $opts["x_size"] = $left_margin + $opts["box_x_size"] + 2 + $opts["right_margin"]; 
    } 
  if($opts["y_size"]) 
    { 
      $opts["box_y_size"] = $img_y - $top_margin - 2 - $bottom_margin; 
    } 
  else 
    { 
     $opts["y_size"] = $top_margin + 2 + $opts["box_y_size"] + $bottom_margin; 
    } 
 
  $box_top = $top_margin+1; 
  $box_bottom = $box_top + 2 + $opts["box_y_size"]; 
  $box_left = $left_margin+1; 
  $box_right = $box_left + $opts["box_x_size"]; 
  $img =  imagecreate($opts["x_size"]+1, $opts["y_size"]+1); 
  list($r, $g, $b) = $opts["bg_color"]; 
  $bg_color = imagecolorallocate($img, $r, $g, $b); 
  if($opts["bg_trans"]) 
    { 
      imagecolortransparent($img, $bg_color); 
    } 
  list($r, $g, $b) = $opts["fg_color"]; 
  $fg_color = imagecolorallocate($img, $r, $g, $b); 
  if(is_array($opts["val_color"])) 
    { 
      list($r, $g, $b) = $opts["val_color"]; 
    } 
  $box_color = $fg_color; 
  if(is_array($opts["box_color"])) 
    { 
      list($r, $g, $b) = $opts["box_color"]; 
      $box_color = imagecolorallocate($img, $r, $g, $b); 
    } 
  $bar_color = $fg_color; 
  if(is_array($opts["bar_color"])) 
    { 
      list($r, $g, $b) = $opts["bar_color"]; 
      $bar_color = imagecolorallocate($img, $r, $g, $b); 
    } 
  $title_color = $fg_color; 
  if(is_array($opts["title_color"])) 
    { 
      list($r, $g, $b) = $opts["title_color"]; 
      $title_color = imagecolorallocate($img, $r, $g, $b); 
    } 
  $val_color = $fg_color; 
  if(is_array($opts["val_color"])) 
    { 
      list($r, $g, $b) = $opts["val_color"]; 
      $val_color = imagecolorallocate($img, $r, $g, $b); 
    } 
  imagerectangle($img, 0, 0, $opts["x_size"], $opts["y_size"], $box_color); 
  imagerectangle($img, $box_left, $box_top, $box_right, $box_bottom, $box_color); 
  $num_records = count($rows); 
# lets find the next item up. 
# find the maximal marker. 
 
  $finder = $max_y;   
  $multiple = 1; 
  while($finder > 10) 
    { 
      $finder = $finder/10; 
      $multiple *= 10; 
    } 
  $oldfinder =$finder; 
  $finder = round($finder); 
  if($finder < $oldfinder) 
    { 
      $finder++; 
    } 
# ok, so we have UP to 10 marks. 
  $num_marks = $finder; 
  $max_y = $finder * $multiple; 
 
  $xspan = ($opts["box_x_size"] - $num_records -1)/$num_records; 
  $yspan = $opts["box_y_size"]/$num_marks; 
 
  for($x=$num_marks;$x>=0;$x--) 
    { 
      if($opts["show_y_lines"]) 
    { 
      imageline($img, 
            $box_left, ($x*$yspan)+$top_margin+1, 
            $box_right, ($x*$yspan)+$top_margin+1, 
            $box_color); 
    } 
      if($opts["show_y_val"]) 
    { 
      $text = ($num_marks - $x)*$multiple; 
      imagestring($img, $opts["font"], 
              $left_margin - strlen($text)*$x_mod*$font_x, 
              ($x*$yspan)+$top_margin-($font_y/2)+2, 
              $text, $box_color); 
    } 
    } 
  if($opts["title"]) 
    { 
      $txtlen = strlen($opts["title"]) * $font_x; 
      $left = $opts["box_x_size"]/2 - $txtlen/2 + $left_margin +1; 
      $top = $font_y * $y_mod / 3; 
      imagestring($img, $opts["font"], $left, $top, $opts["title"], $title_color); 
    } 
  if($opts["y_title"]) 
    { 
      $txtlen = strlen($opts["y_title"]) * $font_x; 
      $left = $left_margin / 2 - $txtlen / 2; 
      $top = $font_y * $y_mod / 3; 
      imagestring($img, $opts["font"], $left, $top, $opts["y_title"], $title_color); 
    } 
  if($opts["x_title"]) 
    { 
      $left = $left_margin; 
      $top = $opts["box_y_size"] + $top_margin + $font_y * $y_mod / 3; 
      if($opts["show_x_val"]) 
    { 
      $top += $font_y * $y_mod; 
    } 
      if($opts["show_y_in_x"]) 
    { 
      $top += $font_y * $y_mod; 
    } 
      imagestring($img, $opts["font"], $left, $top, $opts["x_title"], $title_color); 
    } 
 
  $x_pos = 0; 
  foreach($rows as $idx => $row) 
  { 
    $y_value = $row; 
    $x_value = $idx; 
    if(is_array($row)) 
      { 
    if($opts["y_val"] && array_key_exists($opts["y_val"], $row)) 
      { 
        $y_value = $row[$opts["y_val"]]; 
      } 
    else 
      { 
        foreach($row as $var => $val) 
        { 
          $y_value = $val; 
          break; 
        } 
      } 
      } 
    if($opts["x_val"]) 
      { 
    $x_value = $row[$opts["x_val"]]; 
      } 
    if(!is_numeric($x_value)) 
      { 
    $x_value = $x_pos; 
      } 
    $top = $box_bottom - $y_value * $yspan / $multiple; 
    $left = $box_left + $xspan *  $x_value + 1 + $x_value; 
    $right = $left + $xspan - 1; 
    imagefilledrectangle($img, $left, $top, $right, $box_bottom, $bar_color); 
 
    $y_txt = $x_pos + 1; 
    if($opts["x_val"]) 
      { 
    if(array_key_exists($opts["x_val"], $row)) 
      { 
        $y_txt = $row[$opts["x_val"]]; 
      } 
      } 
    $top = $box_bottom + $font_y * $y_mod / 5; 
    $txt_left = $left + $xspan / 2 - strlen($y_txt) * $font_x  / 2 + 2; 
    imagestring($img, $opts["font"], $txt_left, $top, $y_txt, $val_color); 
    if($opts["show_y_in_x"]) 
      { 
    $top += $font_y * $y_mod; 
    $txt_left = $left + $xspan / 2 - strlen($y_value) * $font_x  / 2 + 2; 
    imagestring($img, $opts["font"], $txt_left, $top, $y_value, $val_color); 
      } 
    $x_pos++; 
  } 
  if($opts["return"]) 
    { 
      return($img); 
    } 
  switch(strtolower($opts["img_format"])) 
    { 
    case "png": 
      Header("Content-Type: image/png"); 
      ImagePNG($img); 
      break; 
    case "jpg": 
    case "jpeg": 
      Header("Content-Type: image/jpeg"); 
      ImageJPEG($img); 
      break; 
    case "gif": 
      Header("Content-Type: image/gif"); 
      ImageGIF($img); 
      break; 
    } 
  ImageDestroy($img); 
  return; 
}