<?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;
?>