Вход Регистрация
Файл: includes/adm/finance/reklama.php
Строк: 244
<?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>'.
    
'От:&nbsp;'.
    
'<input type=text name=month_ size=2 maxsize=2 value="'.date('m').'">месяц&nbsp;'.
    
'<input type=text name=day_   size=2 maxsize=2 value="'.date('d').'">день&nbsp;'.
    
'<input type=text name=hour_  size=2 maxsize=2 value="0">час&nbsp;'.
    
'<br/>'.
    
'До:&nbsp;'.
    
'<input type=text name=_month size=2 maxsize=2 value="'.date('m').'">месяц&nbsp;'.
    
'<input type=text name=_day   size=2 maxsize=2 value="'.date('d').'">день&nbsp;'.
    
'<input type=text name=_hour  size=2 maxsize=2 value="'.date('H').'">час&nbsp;'.
    
'<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($im0,0,0);          # Черный, онже фоновый
$white=ImageColorAllocate($im255,255,255);    # Белый
$gridd=ImageColorAllocate($im191,191,191);    # Серый (0 часов)
$gridh6=ImageColorAllocate($im127,127,127);   # Серый (0,6,12,18 часов)
$gridh=ImageColorAllocate($im63,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($im41010+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)==0imageline($im,251,510-round($stepY*$i),969,510-round($stepY*$i),$gridh);
    if ((
$i%50)==0imageline($im,251,510-round($stepY*$i),969,510-round($stepY*$i),$gridh6);    # Каждая пятая выделена цветом
    
if (($i%50)==0imageString($im3224503-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)==0imageline($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($im3251+round($step*$i), 512$h$gridh);
                if (
$h==0)     imageString($im3251+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)==0imageline($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)==0imageString($im3251+round($step*$i), 512$h$gridh);
                if (
$h==0)     imageString($im3251+round($step*$i), 523$d.'.'.substr('0'.$m,-2), $gridd);
                }
            elseif (
$step>=7.5)
                {
                if ((
$h%2)==0imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh);
                if ((
$h%8)==0imageline($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)==0imageString($im3251+round($step*$i), 512$h$gridh);
                if (
$h==0)     imageString($im3251+round($step*$i), 523$d.'.'.substr('0'.$m,-2), $gridd);
                }
            elseif (
$step>=5)
                {
                if ((
$h%3)==0imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh);
                if ((
$h%6)==0imageline($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)==0imageString($im3251+round($step*$i), 512$h$gridh6);
                if (
$h==0)     imageString($im3251+round($step*$i), 523$d.'.'.substr('0'.$m,-2), $gridd);
                }
            elseif (
$step>=3.75)
                {
                if ((
$h%4)==0imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh);
                if ((
$h%8)==0imageline($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)==0imageString($im3251+round($step*$i), 512$h$gridh6);
                if (
$h==0)     imageString($im3251+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)==0imageline($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($im3251+round($step*$i), 512$d.'.'.substr('0'.$m,-2), $gridd);
                }
            elseif (
$step>=1.25)
                {
                if ((
$h%12)==0imageline($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($im3251+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($im3251+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($im310512date('j.m H:i'), $gridd);

# ВСЕ! Пиздец!
header("Content-type: image/png");
imagepng($im);
exit;
?>
Онлайн: 0
Реклама