- <?php
- error_reporting(7);
- $month_ = trim($HTTP_POST_VARS['month_'])+0;
- $day_ = trim($HTTP_POST_VARS['day_'])+0;
- $hour_ = trim($HTTP_POST_VARS['hour_'])+0;
- $_month = trim($HTTP_POST_VARS['_month'])+0;
- $_day = trim($HTTP_POST_VARS['_day'])+0;
- $_hour = trim($HTTP_POST_VARS['_hour'])+0;
-
- if (($month_==0)||($_month==0))
- {
- header("Content-type: text/html");
- die('<form action="/?'.$id.'/finance/reklama" method=post>'.
- '<b>'.
- 'От: '.
- '<input type=text name=month_ size=2 maxsize=2 value="'.date('m').'">месяц '.
- '<input type=text name=day_ size=2 maxsize=2 value="'.date('d').'">день '.
- '<input type=text name=hour_ size=2 maxsize=2 value="0">час '.
- '<br/>'.
- 'До: '.
- '<input type=text name=_month size=2 maxsize=2 value="'.date('m').'">месяц '.
- '<input type=text name=_day size=2 maxsize=2 value="'.date('d').'">день '.
- '<input type=text name=_hour size=2 maxsize=2 value="'.date('H').'">час '.
- '<br/>'.
- '<input type=submit value="Показать">'.
- '</b>'.
- '</form>');
- }
-
- # Проверка валидности введенных значений
- if (($month_>$_month)||($month_<1)||($month_>12)||($_month<1)||($_month>12)) die('Неверно указан месяц!<br/><a href="/?'.$id.'/finance/reklama">Назад</a>');
- if ((($month_==$_month)&&($day_>$_day))||($day_<1)||($day_>31)||($_day<1)||($_day>31)) die('Неверно указан день!<br/><a href="/?'.$id.'/finance/reklama">Назад</a>');
- if ((($month_==$_month)&&($day_==$_day)&&($hour_>=$_hour))||($hour_<0)||($hour_>24)||($_hour<0)||($_hour>24)) die('Неверно указан час!<br/><a href="/?'.$id.'/finance/reklama">Назад</a>');
-
- # Приведенные начало и конец интервала для выборки
- $time_=$month_*10000+$day_*100+$hour_;
- $_time=$_month*10000+$_day*100+$_hour;
-
- # Это хитрый изъеб, для корректной выборки с учетом того, что начало и конец могут быть не с нуля часов
- $where_="WHERE (((`month`*10000+`day`*100+`hour`)>='$time_') AND ((`month`*10000+`day`*100+`hour`)<='$_time'))";
- $order_="ORDER BY (`month`*10000+`day`*100+`hour`) ASC";
-
- # Создаем полотно и задаем начальные цвета
- $im=ImageCreate(980,550);
- $black=ImageColorAllocate($im, 0,0,0); # Черный, онже фоновый
- $white=ImageColorAllocate($im, 255,255,255); # Белый
- $gridd=ImageColorAllocate($im, 191,191,191); # Серый (0 часов)
- $gridh6=ImageColorAllocate($im, 127,127,127); # Серый (0,6,12,18 часов)
- $gridh=ImageColorAllocate($im, 63,63,63); # Серый (0,1,2,..,23 часов)
-
- # Вытягиваем по одному экземпляру рефералов присутствющих в интервале времени
- $q=@mysql(DBName,"SELECT DISTINCT(`referal`) FROM `referal` $where_ LIMIT 0, 50");
- $s=mysql_num_rows($q);
- for ($i=0;$i<$s;$i++)
- {
- $data=@mysql_fetch_array($q);
- $bin=substr('000'.decbin($i+1),-3); # Номер реферала в двоичном виде (001,010,011,...)
- $names[$i]=str_replace('-','',$data['referal']); # Заполняем массив имен рефералов
- # Заполняем массив цветов рефералов (индекс = имя)
- $color[$names[$i]]=ImageColorAllocate($im,substr($bin,0,1)*255,substr($bin,1,1)*255,substr($bin,2,1)*255);
- # Выводим имя реферала своим цветом
- imageString($im, 4, 10, 10+16*$i, $data['referal'], $color[str_replace('-','',$data['referal'])]);
- }
-
- # Вытягиваем число переходов для каждого часа указанного промежутка времени
- $q=@mysql(DBName,"SELECT * FROM `referal` $where_ $order_");
- $s=mysql_num_rows($q);
- for ($i=0;$i<$s;$i++)
- {
- $data=@mysql_fetch_array($q);
- # Заносим значение в четырехмерный(!) массив :)))
- $referal[str_replace('-','',$data['referal'])][$data['month']][$data['day']][$data['hour']]=$data['counter'];
- $maxcounter=max($data['counter'],$maxcounter);
- }
-
- # Определяю горизонтальный масштаб (точек на посещение)
- $stepY=500/$maxcounter;
-
- # Горизонтальные деления
- for ($i=0;$i<=$maxcounter;$i++)
- {
- if (($i%10)==0) imageline($im,251,510-round($stepY*$i),969,510-round($stepY*$i),$gridh);
- if (($i%50)==0) imageline($im,251,510-round($stepY*$i),969,510-round($stepY*$i),$gridh6); # Каждая пятая выделена цветом
- if (($i%50)==0) imageString($im, 3, 224, 503-round($stepY*$i), $i, $gridh6); # Каждая пятая подписана
- }
-
- # Здесь считаю сколько всего часов в интервале (отсчетов по горизонтали)
- # По другому никак, так как на каждый час может быть от 0 до N записей...
- $all=0;
- for ($m=$month_;$m<=$month_;$m++)
- {
- if ($m==$month_) $d_=$day_; else $d_=1;
- if ($m==$_month) $_d=$_day; else $_d=31;
- for ($d=$d_;$d<=$_d;$d++)
- {
- if ($d==$d_) $h_=$hour_; else $h_=0;
- if ($d==$_d) $_h=$_hour; else $_h=23;
- for ($h=$h_;$h<=$_h;$h++)
- {
- $all++;
- }
- }
- }
-
- # Определяю горизонтальный масштаб (точек на час)
- $step=720/$all;
- $i=0;
-
- # Пробегаем по месяцам интервала
- for ($m=$month_;$m<=$_month;$m++)
- {
- if ($m==$month_) $d_=$day_; else $d_=1;
- if ($m==$_month) $_d=$_day; else $_d=31;
- # По дням месяца
- for ($d=$d_;$d<=$_d;$d++)
- {
- if (($m==$month_)&&($d==$d_)) $h_=$hour_; else $h_=0;
- if (($m==$_month)&&($d==$_d)) $_h=$_hour; else $_h=23;
- # По часам дня
- for ($h=$h_;$h<=$_h;$h++)
- {
- # Рисуем линии и подписи в соответствии с масштабом
- # Это, блять, самое уебищное место для моего хилого мозга :)))
- if ($step>=30)
- {
- imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh);
- if (($h%6)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh6);
- if ($h==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridd);
- imageString($im, 3, 251+round($step*$i), 512, $h, $gridh);
- if ($h==0) imageString($im, 3, 251+round($step*$i), 523, $d.'.'.substr('0'.$m,-2), $gridd);
- }
- elseif ($step>=15)
- {
- imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh);
- if (($h%6)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh6);
- if ($h==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridd);
- if (($h%2)==0) imageString($im, 3, 251+round($step*$i), 512, $h, $gridh);
- if ($h==0) imageString($im, 3, 251+round($step*$i), 523, $d.'.'.substr('0'.$m,-2), $gridd);
- }
- elseif ($step>=7.5)
- {
- if (($h%2)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh);
- if (($h%8)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh6);
- if ($h==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridd);
- if (($h%4)==0) imageString($im, 3, 251+round($step*$i), 512, $h, $gridh);
- if ($h==0) imageString($im, 3, 251+round($step*$i), 523, $d.'.'.substr('0'.$m,-2), $gridd);
- }
- elseif ($step>=5)
- {
- if (($h%3)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh);
- if (($h%6)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh6);
- if ($h==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridd);
- if (($h%6)==0) imageString($im, 3, 251+round($step*$i), 512, $h, $gridh6);
- if ($h==0) imageString($im, 3, 251+round($step*$i), 523, $d.'.'.substr('0'.$m,-2), $gridd);
- }
- elseif ($step>=3.75)
- {
- if (($h%4)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh);
- if (($h%8)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh6);
- if ($h==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridd);
- if (($h%8)==0) imageString($im, 3, 251+round($step*$i), 512, $h, $gridh6);
- if ($h==0) imageString($im, 3, 251+round($step*$i), 523, $d.'.'.substr('0'.$m,-2), $gridd);
- }
- elseif ($step>=2.5)
- {
- if (($h%6)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh);
- if (($h%12)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh6);
- if ($h==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridd);
- if ($h==0) imageString($im, 3, 251+round($step*$i), 512, $d.'.'.substr('0'.$m,-2), $gridd);
- }
- elseif ($step>=1.25)
- {
- if (($h%12)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh);
- if ($h==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh6);
- if ((($d%2)==0)&&($h==0)) imageString($im, 3, 251+round($step*$i), 512, $d.'.'.substr('0'.$m,-2), $gridd);
- }
- else
- {
- if ($h==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh6);
- if ((($d%4)==0)&&($h==0)) imageString($im, 3, 251+round($step*$i), 512, $d.'.'.substr('0'.$m,-2), $gridd);
- }
-
- # Вычисляем X-координату для текущего отсчета
- $nX=250+round($step*($i+0.5));
- # Если нулевой отсчет, то несуществующей X-координате предыдущего отсчета присваеваем значения текущей.
- if ($i==0) $pX=$nX;
-
- # Пробегаем по рефералам
- for ($r=0;$r<sizeof($names);$r++)
- {
- $name=$names[$r];
- # Вычисляем Y-координату для данного реферала для текущего отсчета
- $nY[$name]=510-round($stepY*$referal[$name][$m][$d][$h]);
- # Если нулевой отсчет, то несуществующей Y-координате предыдущего отсчета присваеваем значения текущей.
- if ($i==0) $pY[$name]=$nY[$name];
-
- # Соединяем текущую точку с предыдущей
- imageline($im,$pX,$pY[$name],$nX,$nY[$name],$color[$name]);
- # Укрупняем точку, если позволяет масштаб
- if ($step>=15)
- {
- imageline($im,$nX-1,$nY[$name]-1,$nX-1,$nY[$name]+1,$color[$name]);
- imageline($im,$nX-1,$nY[$name]+1,$nX+1,$nY[$name]+1,$color[$name]);
- imageline($im,$nX+1,$nY[$name]+1,$nX+1,$nY[$name]-1,$color[$name]);
- imageline($im,$nX+1,$nY[$name]-1,$nX-1,$nY[$name]-1,$color[$name]);
- }
- # Делаем текущую Y-координату "предыдущей" для следующего отсчета
- $pY[$name]=$nY[$name];
- }
- # Делаем текущую X-координату "предыдущей" для следующего отсчета
- $pX=$nX;
- # Увеличиваем счетчик отсчетов
- $i++;
- }
- }
- }
-
- # Рисуем бордюр
- imagerectangle($im,248,8,972,512,$white);
- imagerectangle($im,249,9,971,511,$black);
- imagerectangle($im,250,10,970,510,$white);
-
- imageString($im, 3, 10, 512, date('j.m H:i'), $gridd);
-
- # ВСЕ! Пиздец!
- header("Content-type: image/png");
- imagepng($im);
- exit;
- ?>