View file includes/adm/finance/reklama.php

File size: 10.05Kb
<?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($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;
?>