function plot($file)
 {
     $min = $this->m_minValue;
     $max = $this->m_maxValue + ($this->m_maxValue - $this->m_minValue) * 0.1 / 5 * 5;
     // margins
     $margin = $this->m_margin;
     $marginy = $margin;
     if ($this->m_title) {
         $marginy += $this->m_fontHeight * 1.5;
     }
     $marginbottom = $margin + 5;
     if ($this->m_labelsDirection == HORIZONTAL) {
         $marginbottom += $this->m_labelsFontWidth;
     } else {
         $marginbottom += $this->m_labelsMaxLength * $this->m_labelsFontWidth;
     }
     if (@$this->m_axisXTitle) {
         $marginbottom += $this->m_axisXFontHeight * 1.5;
     }
     $height = $this->m_height - $marginy - $marginbottom;
     if ($this->m_withLegend) {
         //
     }
     $maxvalues = floor($height / $this->m_labelsFontHeight / 1.5);
     // max displayable values
     $marginx = $margin + 5;
     $marginx += strlen(number_format($this->m_maxValue, $this->m_numberOfDecimals, ',', '.')) * $this->m_labelsFontWidth;
     if (@$this->m_axisYTitle) {
         $marginx += $this->m_axisYFontHeight * 1.5;
     }
     $width = $this->m_width - $marginx - $margin;
     $w = $width / ($this->m_maxCount + 0.2);
     $dx = $w * 0.8;
     $sx = $w - $dx;
     $width = $w * $this->m_maxCount + $sx;
     if ($max - $min == 0) {
         $maxMin = MAX_MIN;
     } else {
         $maxMin = $max - $min;
     }
     $h = $height / $maxvalues;
     $dy = $height / $maxMin;
     $vdy = ($max - $min) / $maxvalues;
     //plot border & background
     imagefilledrectangle($this->m_image, $marginx, $marginy, $marginx + $width, $marginy + $height, $this->m_fillColor);
     // plot title
     if ($this->m_title) {
         imagestring($this->m_image, $this->m_font, ($this->m_width - strlen($this->m_title) * $this->m_fontWidth) / 2, $margin, $this->m_title, $this->m_textColor);
     }
     // plot values (Y)
     _set_style($this->m_image, $this->m_axisYStyle, $this->m_axisYColor, $this->m_fillColor);
     for ($i = 0; $i <= $maxvalues; $i++) {
         $yvalue = number_format($min + $vdy * $i, $this->m_numberOfDecimals, $this->m_decimalSeparator, $this->m_thousandsSeparator);
         imageline($this->m_image, $marginx - 3, $marginy + $height - $i * $h, $marginx, $marginy + $height - $i * $h, IMG_COLOR_STYLED);
         imagestring($this->m_image, $this->m_labelsFont, $marginx - strlen($yvalue) * $this->m_labelsFontWidth - 4, $marginy + $height - $i * $h - $this->m_labelsFontHeight / 2, $yvalue, $this->m_labelsTextColor);
     }
     // plot grid
     if ($this->m_showHGrid) {
         for ($i = 0; $i <= $maxvalues; $i++) {
             _set_style($this->m_image, $this->m_gridHStyle, $this->m_gridHColor, $this->m_fillColor);
             imageline($this->m_image, $marginx, $marginy + $height - $i * $h, $marginx + $width, $marginy + $height - $i * $h, IMG_COLOR_STYLED);
         }
     }
     if ($this->m_showVGrid) {
         for ($i = 0; $i < count($this->m_labels); $i++) {
             $len = strlen($this->m_labels[$i]);
             if ($len > 0) {
                 _set_style($this->m_image, $this->m_gridVStyle, $this->m_gridVColor, $this->m_fillColor);
                 imageline($this->m_image, $marginx + $i * $w + $dx / 2 + $sx, $height + $marginy, $i * $w + $marginx + $dx / 2 + $sx, $marginy, IMG_COLOR_STYLED);
             }
         }
     }
     _set_style($this->m_image, $this->m_style, $this->m_strokeColor, $this->m_fillColor);
     imagerectangle($this->m_image, $marginx, $marginy, $marginx + $width, $marginy + $height, IMG_COLOR_STYLED);
     // plot graph
     foreach ($this->m_series as $series) {
         $cnt = count($series->m_values);
         // LINE PLOT
         if ($series->m_type == 'line') {
             _set_style($this->m_image, $series->m_style, $series->m_strokeColor, $this->m_fillColor);
             $startx = $marginx + $dx / 2 + $sx;
             $starty = $marginy + $height - $dy * ($series->m_values[0] - $min);
             for ($i = 1; $i < $cnt; $i++) {
                 $x = $marginx + $i * $w + $dx / 2 + $sx;
                 $y = $marginy + $height - $dy * ($series->m_values[$i] - $min);
                 imageline($this->m_image, $startx, $starty, $x, $y, IMG_COLOR_STYLED);
                 $startx = $x;
                 $starty = $y;
             }
             // AREA PLOT
         } else {
             if ($series->m_type == 'area') {
                 _set_style($this->m_image, $series->m_style, $series->m_strokeColor, $this->m_fillColor);
                 $vpoints = '';
                 $startx = $marginx + $dx / 2 + $sx;
                 $starty = $marginy + $height - $dy * ($series->m_values[0] - $min);
                 $vpoints[] = $startx;
                 $vpoints[] = $marginy + $height;
                 for ($i = 0; $i < $cnt; $i++) {
                     $x = $marginx + $i * $w + $dx / 2 + $sx;
                     $y = $marginy + $height - $dy * ($series->m_values[$i] - $min);
                     $vpoints[] = $x;
                     $vpoints[] = $y;
                     $startx = $x;
                     $starty = $y;
                 }
                 $vpoints[] = $x;
                 $vpoints[] = $marginy + $height;
                 imagefilledpolygon($this->m_image, $vpoints, $cnt + 2, $series->m_fillColor);
                 imagepolygon($this->m_image, $vpoints, $cnt + 2, IMG_COLOR_STYLED);
                 // BAR PLOT
             } else {
                 if ($series->m_type == 'bar') {
                     _set_style($this->m_image, $series->m_style, $series->m_strokeColor, $this->m_fillColor);
                     $vpoints = '';
                     for ($i = 0; $i < $cnt; $i++) {
                         imagefilledrectangle($this->m_image, $sx + $marginx + $i * $w, $marginy + $height - $dy * ($series->m_values[$i] - $min), $sx + $marginx + $i * $w + $dx, $marginy + $height, $series->m_fillColor);
                         imagerectangle($this->m_image, $sx + $marginx + $i * $w, $marginy + $height - $dy * ($series->m_values[$i] - $min), $sx + $marginx + $i * $w + $dx, $marginy + $height, IMG_COLOR_STYLED);
                     }
                     // IMPULS PLOT
                 } else {
                     if ($series->m_type == 'impuls') {
                         _set_style($this->m_image, $series->m_style, $series->m_fillColor, $this->m_fillColor);
                         for ($i = 0; $i < $cnt; $i++) {
                             $x = $marginx + $i * $w + $dx / 2 + $sx;
                             $y = $marginy + $height - $dy * ($series->m_values[$i] - $min);
                             imageline($this->m_image, $x, $y, $x, $marginy + $height, IMG_COLOR_STYLED);
                         }
                         // STEP PLOT
                     } else {
                         if ($series->m_type == 'step') {
                             _set_style($this->m_image, $series->m_style, $series->m_strokeColor, $this->m_fillColor);
                             $cnt = $cnt;
                             $vpoints = '';
                             $startx = $marginx + $sx / 2;
                             $starty = $marginy + $height - $dy * ($series->m_values[0] - $min);
                             $vpoints[] = $startx;
                             $vpoints[] = $marginy + $height;
                             $vpoints[] = $startx;
                             $vpoints[] = $starty;
                             for ($i = 1; $i < $cnt; $i++) {
                                 $x = $marginx + $i * $w + $sx / 2;
                                 $y = $marginy + $height - $dy * ($series->m_values[$i] - $min);
                                 $vpoints[] = $x;
                                 $vpoints[] = $starty;
                                 $vpoints[] = $x;
                                 $vpoints[] = $y;
                                 $startx = $x;
                                 $starty = $y;
                             }
                             $vpoints[] = $x + $w;
                             $vpoints[] = $y;
                             $vpoints[] = $x + $w;
                             $vpoints[] = $marginy + $height;
                             imagefilledpolygon($this->m_image, $vpoints, $cnt * 2 + 2, $series->m_fillColor);
                             imagepolygon($this->m_image, $vpoints, $cnt * 2 + 2, IMG_COLOR_STYLED);
                             // DOT PLOT
                         } else {
                             if ($series->m_type == 'dot') {
                                 _set_style($this->m_image, $series->m_style, $series->m_strokeColor, $this->m_fillColor);
                                 for ($i = 0; $i < $cnt; $i++) {
                                     $x = $marginx + $i * $w + $dx / 2 + $sx;
                                     $y = $marginy + $height - $dy * ($series->m_values[$i] - $min);
                                     imagerectangle($this->m_image, $x - 2, $y - 2, $x + 2, $y + 2, IMG_COLOR_STYLED);
                                     imagefilledrectangle($this->m_image, $x - 1, $y - 1, $x + 1, $y + 1, $series->m_fillColor);
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     // plot X labels
     for ($i = 0; $i < count($this->m_labels); $i++) {
         $len = strlen($this->m_labels[$i]);
         if ($len > 0) {
             _set_style($this->m_image, $this->m_axisXStyle, $this->m_axisXColor, $this->m_fillColor);
             imageline($this->m_image, $dx / 2 + $sx + $marginx + $i * $w, $height + $marginy, $dx / 2 + $sx + $i * $w + $marginx, $height + $marginy + 3, IMG_COLOR_STYLED);
             if ($this->m_labelsDirection == HORIZONTAL) {
                 imagestring($this->m_image, $this->m_labelsFont, $dx / 2 + $sx + $marginx + $i * $w - $len * $this->m_labelsFontWidth / 2, $marginy + 4 + $height, $this->m_labels[$i], $this->m_labelsTextColor);
             } else {
                 imagestringup($this->m_image, $this->m_labelsFont, $dx / 2 + $sx + $marginx + $i * $w - $this->m_labelsFontHeight / 2, $marginy + $height + $len * $this->m_labelsFontWidth + 4, $this->m_labels[$i], $this->m_labelsTextColor);
             }
         }
     }
     // plot X axis
     if ($this->m_showXAxis) {
         _set_style($this->m_image, $this->m_axisXStyle, $this->m_axisXColor, $this->m_fillColor);
         imageline($this->m_image, $marginx, $marginy + $height, $marginx + $width, $marginy + $height, IMG_COLOR_STYLED);
         if ($this->m_axisXTitle) {
             imagestring($this->m_image, $this->m_axisXFont, $marginx + ($width - strlen($this->m_axisXTitle) * $this->m_axisXFontWidth) / 2, $this->m_height - $margin - $this->m_axisXFontHeight, $this->m_axisXTitle, $this->m_axisXColor);
         }
     }
     // plot Y axis
     if ($this->m_showYAxis) {
         _set_style($this->m_image, $this->m_axisYStyle, $this->m_axisYColor, $this->m_fillColor);
         imageline($this->m_image, $marginx, $marginy, $marginx, $marginy + $height, IMG_COLOR_STYLED);
         if ($this->m_axisYTitle) {
             $titlewidth = strlen($this->m_axisYTitle) * $this->m_axisYFontWidth;
             imagestringup($this->m_image, $this->m_axisYFont, $margin, $marginy + $titlewidth + ($height - $titlewidth) / 2, $this->m_axisYTitle, $this->m_axisYColor);
         }
     }
     $image_function = 'image' . osc_dynamic_image_extension();
     if (strlen($file) > 0) {
         $image_function($this->m_image, $file);
     } else {
         $image_function($this->m_image);
     }
 }
 function delete($id, $delete_image = false)
 {
     global $osC_Database;
     $error = false;
     $osC_Database->startTransaction();
     if ($delete_image === true) {
         $Qimage = $osC_Database->query('select banners_image from :table_banners where banners_id = :banners_id');
         $Qimage->bindTable(':table_banners', TABLE_BANNERS);
         $Qimage->bindInt(':banners_id', $id);
         $Qimage->execute();
         $image = $Qimage->value('banners_image');
     }
     $Qdelete = $osC_Database->query('delete from :table_banners where banners_id = :banners_id');
     $Qdelete->bindTable(':table_banners', TABLE_BANNERS);
     $Qdelete->bindInt(':banners_id', $id);
     $Qdelete->setLogging($_SESSION['module'], $id);
     $Qdelete->execute();
     if ($osC_Database->isError()) {
         $error = true;
     }
     if ($error === false) {
         $Qdelete = $osC_Database->query('delete from :table_banners_history where banners_id = :banners_id');
         $Qdelete->bindTable(':table_banners_history', TABLE_BANNERS_HISTORY);
         $Qdelete->bindInt(':banners_id', $id);
         $Qdelete->execute();
         if ($osC_Database->isError()) {
             $error = true;
         }
     }
     if ($error === false) {
         if ($delete_image === true && isset($image) && !empty($image)) {
             if (is_file('../images/' . $image) && is_writeable('../images/' . $image)) {
                 @unlink('../images/' . $image);
             }
         }
         $image_extension = osc_dynamic_image_extension();
         if (!empty($image_extension)) {
             if (is_file('images/graphs/banner_yearly-' . $id . '.' . $image_extension) && is_writeable('images/graphs/banner_yearly-' . $id . '.' . $image_extension)) {
                 @unlink('images/graphs/banner_yearly-' . $id . '.' . $image_extension);
             }
             if (is_file('images/graphs/banner_monthly-' . $id . '.' . $image_extension) && is_writeable('images/graphs/banner_monthly-' . $id . '.' . $image_extension)) {
                 @unlink('images/graphs/banner_monthly-' . $id . '.' . $image_extension);
             }
             if (is_file('images/graphs/banner_daily-' . $id . '.' . $image_extension) && is_writeable('images/graphs/banner_daily-' . $id . '.' . $image_extension)) {
                 unlink('images/graphs/banner_daily-' . $id . '.' . $image_extension);
             }
         }
         $osC_Database->commitTransaction();
         return true;
     }
     $osC_Database->rollbackTransaction();
     return false;
 }
 function __construct()
 {
     global $osC_Language, $osC_MessageStack;
     $this->_page_title = $osC_Language->get('heading_title');
     if (!isset($_GET['action'])) {
         $_GET['action'] = '';
     }
     if (!isset($_GET['page']) || isset($_GET['page']) && !is_numeric($_GET['page'])) {
         $_GET['page'] = 1;
     }
     $this->image_extension = osc_dynamic_image_extension();
     // check if the graphs directory exists
     if (!empty($this->image_extension)) {
         if (is_dir('images/graphs')) {
             if (!is_writeable('images/graphs')) {
                 $osC_MessageStack->add('header', sprintf($osC_Language->get('ms_error_graphs_directory_not_writable'), realpath('images/graphs')), 'error');
             }
         } else {
             $osC_MessageStack->add('header', sprintf($osC_Language->get('ms_error_graphs_directory_non_existant'), realpath('images/graphs')), 'error');
         }
     }
     if (!empty($_GET['action'])) {
         switch ($_GET['action']) {
             case 'preview':
                 $this->_page_contents = 'preview.php';
                 break;
             case 'statistics':
                 $this->_page_contents = 'statistics.php';
                 break;
             case 'save':
                 if (isset($_GET['bID']) && is_numeric($_GET['bID'])) {
                     $this->_page_contents = 'edit.php';
                 } else {
                     $this->_page_contents = 'new.php';
                 }
                 if (isset($_POST['subaction']) && $_POST['subaction'] == 'confirm') {
                     $data = array('title' => $_POST['title'], 'url' => $_POST['url'], 'group' => isset($_POST['group']) ? $_POST['group'] : null, 'group_new' => $_POST['group_new'], 'image' => isset($_FILES['image']) ? $_FILES['image'] : null, 'image_local' => $_POST['image_local'], 'image_target' => $_POST['image_target'], 'html_text' => $_POST['html_text'], 'date_scheduled' => $_POST['date_scheduled'], 'date_expires' => $_POST['date_expires'], 'expires_impressions' => $_POST['expires_impressions'], 'status' => isset($_POST['status']) && $_POST['status'] == 'on' ? true : false);
                     if (osC_BannerManager_Admin::save(isset($_GET['bID']) && is_numeric($_GET['bID']) ? $_GET['bID'] : null, $data)) {
                         $osC_MessageStack->add($this->_module, $osC_Language->get('ms_success_action_performed'), 'success');
                     } else {
                         $osC_MessageStack->add($this->_module, $osC_Language->get('ms_error_action_not_performed'), 'error');
                     }
                     osc_redirect_admin(osc_href_link_admin(FILENAME_DEFAULT, $this->_module . '&page=' . $_GET['page']));
                 }
                 break;
             case 'delete':
                 $this->_page_contents = 'delete.php';
                 if (isset($_POST['subaction']) && $_POST['subaction'] == 'confirm') {
                     if (osC_BannerManager_Admin::delete($_GET['bID'], isset($_POST['delete_image']) && $_POST['delete_image'] == 'on' ? true : false)) {
                         $osC_MessageStack->add($this->_module, $osC_Language->get('ms_success_action_performed'), 'success');
                     } else {
                         $osC_MessageStack->add($this->_module, $osC_Language->get('ms_error_action_not_performed'), 'error');
                     }
                     osc_redirect_admin(osc_href_link_admin(FILENAME_DEFAULT, $this->_module . '&page=' . $_GET['page']));
                 }
                 break;
             case 'batchDelete':
                 if (isset($_POST['batch']) && is_array($_POST['batch']) && !empty($_POST['batch'])) {
                     $this->_page_contents = 'batch_delete.php';
                     if (isset($_POST['subaction']) && $_POST['subaction'] == 'confirm') {
                         $error = false;
                         foreach ($_POST['batch'] as $id) {
                             if (!osC_BannerManager_Admin::delete($id, isset($_POST['delete_image']) && $_POST['delete_image'] == 'on' ? true : false)) {
                                 $error = true;
                                 break;
                             }
                         }
                         if ($error === false) {
                             $osC_MessageStack->add($this->_module, $osC_Language->get('ms_success_action_performed'), 'success');
                         } else {
                             $osC_MessageStack->add($this->_module, $osC_Language->get('ms_error_action_not_performed'), 'error');
                         }
                         osc_redirect_admin(osc_href_link_admin(FILENAME_DEFAULT, $this->_module . '&page=' . $_GET['page']));
                     }
                 }
                 break;
         }
     }
 }