<?php //error_reporting(7);

##		Специально для извращенцев! :)
##		Версия с перекодировкой строки в cp1251.
##		А вообще, переходите на UTF-8 уже.

# Набор функций для рекламной системы Daos.
# BrokenBrake.biz, сентябрь 2009 года. 

# 21 сентября: спасибо Роме Чебурашке. 
# Благодаря ему здесь больше нет страшных инклюдов.

# 15 октября: спасибо Стальному и Виталию
# Теперь данные хранятся в JSON
# http://brokenbrake.biz/2009/10/15/php-problems

# 16 октября. В топку JSON! Спасибо Жилинскому за тест.
# С JSON тоже проблемы, теперь данные вообще не сериализуются. 
# И это хорошо и очень удобно :)



# Запись переменных данных
function vw($data) // Это не VolksWagen :) vw = Variables Write. Вот.
{
$type = $data['type']; 
$path = 'var'; 
if (isset($data['path']))
	{
		$path = $data['path'];
		unset($data['path']);
	}

$path = str_replace('index.php', 'var', $path);
$file = "$path/$type.php";

$data = var_export($data, true); 
$data = "<?php \$$type = $data;";

file_put_contents($file, $data);
} 



# file_get_contents + timeout (вроде работает, PHP > 5.2)
function fetchData($url, $timeout = 3)
{
	$ctx = stream_context_create(array
			('http' => array('timeout' => $timeout)));
if ($result = @file_get_contents($url, 0, $ctx))
	return $result;
else return false;
} //echo fetch('http://google.com', 0.01);



# Склонение числительных (http://mcaizer.habrahabr.ru/blog/11555/)
function plural($n, $form1, $form2, $form5)
{
$n = abs($n) % 100;
$n1 = $n % 10;
if ($n > 10 && $n < 20) return $form5;
else if ($n1 > 1 && $n1 < 5) return $form2;
else if ($n1 == 1) return $form1;
return $form5;
} // echo $n." ".plural($n, "письмо", "письма", "писем")." у Вас в ящике";



# Время жизни в часах и минутах
function age($sec)
{
$hours = floor(($sec / 3600));
$min = floor(($sec / 60) - $hours * 60); if (!$min) $min = '';
if ($min) $min = $min.' '.plural($min, 'минута', 'минуты', 'минут');
if (!$hours) $hours = '';
if ($hours) $hours = $hours.' '.plural($hours, 'час', 'часа', 'часов').' ';
return $hours.$min;
} //echo age(time() - 3000);



# Отправка email (Must Have - http://habrahabr.ru/blogs/webdev/17531/)
function emailSend($address, $subject, $body)
{
	global $write, $set;
$address = strtolower($address);
$from = $set['email'];
$from_name = $set['txt']['name']; 

$body = "$body\n\n--\n{$set['txt']['sign']}";

# =?кодировка?способ кодирования?закодированный текст?=

$from_name = base64_encode($from_name);
$subj = base64_encode($subj); $subj = "=?UTF-8?B?$subj?=";
$body = base64_encode($body);

$headers = "From: =?UTF-8?B?$from_name?= <$from>\r\n".
"Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64
X-Mailer: Daos (PHP)";

mail($address, $subject, $body, $headers);
} 
/* 	emailSend(
		'brokenbrake1.send@blogger.com', 
		'Daos', 
		'Кто-то изучает код Тормоза и ленится исправить текст :)'
		);
	^ вот тут я отвлёкся на 20 минут. Да, за 20 минут можно сделать полезный сервис.
	Пользуйтесь - http://online-test-email.blogspot.com/
*/



# Вычесление медианы массива (http://brokenbrake.biz/2009/09/14/mediana)
function mediana($arr)
{
sort($arr);
$count = count($arr);
$n1 = floor($count / 2);
$n2 = $n1 + 1;
return ($arr[$n1] + $arr[$n2]) / 2;
} # echo mediana(array(5,5,5,5,5,5,10000)); # 5




# Создание файла рекламного блока
function generate($wr = 1)
{
	global $write, $set, $stat; 

$stat['styles'] = $set['styles'];
$stat['styles']['daos'] = explode("\n", $set['styles']['daos']);
$stat['styles']['count'] = count($stat['styles']['daos']) - 1;

$path = str_replace('/index.php', '', $_SERVER['SCRIPT_FILENAME']);
$daosURL = 'http://'.str_replace('index.php', '', 
					$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);
$offer = "<a id='daosinvite' href='$daosURL' style='{$stat['styles']['invite']}' title='Разместите свою рекламу прямо сейчас! Это очень просто и удобно. Вам понравится.'>{$set['txt']['invite']}</a>";

$choice = '$id = array_rand($stat[\'items\']);';
$textStyle = $stat['styles']['text'];
if (!empty($textStyle)) $textStyle = " style='$textStyle'";

$ads = "<?php
require_once('$path/daos.php');
include('$path/var/stat.php');
$choice
\$style = array_rand(\$stat['styles']['daos']);
\$style = trim(\$stat['styles']['daos'][\$style]);

\$line = \"<span$textStyle>{\$stat['items'][\$id]['text']}</span>\";
if (isset(\$stat['items'][\$id]['URL'])) 
	{
		\$URL = \$stat['items'][\$id]['URL'];
		\$go = \"$daosURL?click=\$id\";
		\$line = \"<a href='\$go' title='\$URL'$textStyle>{\$stat['items'][\$id]['text']}</a>\";
	}

echo iconv(\"UTF-8\", \"windows-1251\", \"<div id='daos' style='\$style'>
\$line
$offer
</div>\");

\$stat['items'][\$id]['views'] = \$stat['items'][\$id]['views'] + 1;
\$stat['all']['views'] = \$stat['all']['views'] + 1;
\$stat['path'] = '$path/var';
vw(\$stat);
";

if ($wr) 
	{	$write['stat'] = 1; static $write;
		file_put_contents('var/ads.php', $ads);	}
	else return $ads; 
}



# Добавление нового объявления (без проверки)
function consent($qid)
{
	global $write, $set, $queue, $stat;

$stat['items'][$qid] = $queue['items'][$qid];
$stat['items'][$qid]['time'] = time();
$stat['items'][$qid]['views'] = $stat['items'][$qid]['clicks'] = '0';
$exit = array_slice($stat['items'], 0, -$set['limit']);
// print_r($exit); 
$stat['items'] = array_slice($stat['items'], -$set['limit']); 


$queue['items'][$qid]['time'] = 0;
foreach ($queue['items'] as $key => $val) // чистим очередь от проср(о|а)чки
	{if ($val['time'] + 3600  > time()) $clean[$key] = $val;}
	unset($queue['items']);
	$queue['items'] = $clean;

foreach ($exit as $val) // Статистика для уходящих строк и мыло куда надо...
	{
		$stat['all']['count'] = $stat['all']['count'] + 1;
				
		$CTR = 0; if ($val['views']) 
			$CTR = round(($val['clicks'] / $val['views'] * 100), 2);
			
		if ($CTR) $stat['average']['CTRs'][] = $CTR;
		$stat['average']['CTRs'] = array_slice($stat['average']['CTRs'], -100);
		$stat['average']['CTR'] = mediana($stat['average']['CTRs']);
		
		$stat['average']['ages'][] = time() - $val['time'];
		$stat['average']['ages'] = array_slice($stat['average']['ages'], -100);
		$stat['average']['age'] = floor(mediana($stat['average']['ages']));
					
		if (time() - $val['time'] > $stat['records']['age']) 
				$stat['records']['age'] = time() - $val['time'];
				
		if ($val['clicks'] > $stat['records']['clicks']) 
				$stat['records']['clicks'] = $val['clicks'];
				
		if ($val['views'] > $stat['records']['views']) 
				$stat['records']['views'] = $val['views'];
				$recCTR = 0;

$result = ($CTR - $stat['average']['CTR']);	
	if ($result > 0)
		$results = $set['txt']['bigCTR'];
	elseif ($result < 0)
		$results = $set['txt']['smallCTR'];
	else $results = 'Ваша ссылка вышла из ротации.';

	if ($CTR > $stat['records']['CTR']) 
			{
				$stat['records']['CTR'] = $CTR;
				$results = $set['txt']['superCTR']; 
				$recCTR = 1;
			}
					
	$CTR = str_replace('.', ',', $CTR).' %'; // Неразрывный пробел
		
if (isset($val['email'])) // Отмылиться куда надо
		{
		$comeback = 'http://'.$_SERVER['HTTP_HOST']
			.str_replace('index.php', '?come#back', $_SERVER['PHP_SELF']);
		$views = $val['views'].' '.plural($val['views'], "просмотр", "просмотра", "просмотров");
		$clicks = $val['clicks'].' '.plural($val['clicks'], "клик", "клика", "кликов");
		$text = $val['text']; $URL = $val['URL'];
		$age = age(time() - $val['time']);
		
		$subj = str_replace('CTR', 'CTR '.$CTR, $set['txt']['subj']); 
			if ($recCTR) $subj = str_replace('CTR', 'Рекорд! CTR', $subj); 

$message = "Здравствуйте!
$results 

Исходные данные: 
текст — $text
URL — $URL

Статистика:
время жизни — $age,
$views, $clicks,
в итоге CTR $CTR.

Хотите попробовать ещё раз?
Daos помнит вас — 
$comeback";

if ($_SERVER['REMOTE_ADDR'] !== '127.0.0.1') // В локалке тестирую
emailSend($val['email'], $subj, $message);
		 }
	} 

	$write['stat'] = $write['queue'] = 1;  static $write;
//generate(1);
} /*	Какая-то громоздкая и неуклюжая функция получилась 8-/ 
		Переписать (хотя и так уже не первая версия).
		Короче, надо будет переписать с нуля. */



# Таблица статистики
function fullstat()
{
	global $write, $stat;
foreach ($stat['items'] as $key => $val)
	{	
		$CTR = 0; if ($val['views']) 
		$CTR = round(($val['clicks'] / $val['views'] * 100), 2);
		if ($CTR) $CTR .= '&nbsp;%'; if (!$CTR) $CTR = '-';
		$string = $val['text'];
		
	if (isset($val['URL'])) 
		{
			$string = '<a href="./?click='.$key.'" title="'.
			$val['URL'].' (Клик будет посчитан!)">'.
			$val['text'].'</a>';			
		}
			
		$tbody .= "<tr class='one'>
		<td class='string' colspan='4'>$string</td></tr><tr>".
		'<td>'.age(time() - $val['time']).'</td>
		 <td>'.$val['views'].'</td>
		 <td>'.$val['clicks'].'</td>
		<td>'.str_replace('.', ',', $CTR).'</td></tr>';
	}
if ($stat['all']['count']) 
	{	$averv = floor($stat['all']['views'] / $stat['all']['count']);
		$averc = floor($stat['all']['clicks'] / $stat['all']['count']);	}
$tbody .= '<tr>
	<th colspan="4" title="Вычисляется на основе не более 100 последних строк">
	Средние значения последних строк</th></tr><tr>
	<td>'.age($stat['average']['age']).'</td>
	<td>'.$averv.'</td>
	<td>'.$averc.'</td>
	<td>'.str_replace('.', ',', round($stat['average']['CTR'], 2)).'&nbsp;%</td></tr>';
	
$tbody .= '<tr>
	<th colspan="4">Рекорды за всё время</th></tr><tr>
	<td>'.age($stat['records']['age']).'</td>
	<td>'.$stat['records']['views'].'</td>
	<td>'.$stat['records']['clicks'].'</td>
	<td>'.str_replace('.', ',', round($stat['records']['CTR'], 2)).'&nbsp;%</td></tr>';
	
$table = "<table class='own'>
	<tr>
	<th>Время жизни</th><th>Показы</th><th>Клики</th><th>CTR</th>
	</tr>
$tbody</table>";

return $table;
} // fullstat();



# Сонная генерация случайной строки символов
function strando($num)
{
$Aa = array(65,97); 
for ($x=0; $x<$num; $x++) 
{
$min = $Aa[rand(0,1)];
$max = $min + 25;
$str .= chr(rand($min, $max));
}
return $str;
} // echo strando(8); // Нафиг я это делал?



# Проверка авторизации
function whois()
{
	global $write, $set;
if (md5($_COOKIE['login'].$_SERVER['remote_addr']) == $set['login'])
	{return true;} else {return false;}
}



# Вход
function in($pass)
{
	global $write, $set;
if (md5($pass) == $set['pass'])
	{	$hash = strando(6);
		$set['login'] = md5($hash.$_SERVER['remote_addr']); // Параноя?
		$write['set'] = 1; static $write;
		setcookie('login', $hash, time()+5184000); // Примерно 2 месяца
		return true;
	} else return false;
}



# Выход
function out()
{
	global $write, $set;
$set['login'] = strando(6);
$write['set'] = 1;  static $write;
setcookie('login', 'del', time()-50000000);
}



# Регистрация и смена пароля
function reg($pass)
{
	global $write, $set;
$set['pass'] = md5($pass);
$write['set'] = 1;  static $write;
in($pass); # И сразу входим?
}



# Генерация меню
function menu($current)
{
 global $write, $set;
$menu = array(
'Основные настройки,loc,',
'Биллинги-мерчанты,loc,providers',
'Оформление строки,loc,looks',
'Почтовые уведомления,loc,notifications',
'Email и пароль,loc,access',
'Оставить отзыв,ext,http://brokenbrake.biz/2009/09/16/daos-FAQ-opinions-suggestions',
'Предложить улучшение,ext,http://brokenbrake.biz/2009/09/16/daos-FAQ-opinions-suggestions',
'Задать вопрос,ext,http://brokenbrake.biz/2009/09/16/daos-FAQ-opinions-suggestions',
'Выйти из Daos,loc,exit');
if ($set['update']['status']) 
	array_unshift($menu, 'Обновление Daos,loc,update');

$cur = 0;
foreach ($menu as $li)
{
	$one = explode(',', $li);
	$title = $one[0]; $type = $one[1]; $link = $one[2];
	
	if ($link == $current) 
		{$class = ' class="current"'; $cur =  1;} else $class = '';
	if ($type == 'loc') $link = "./?adm=$link";
	if (strpos($link, 'update')) 
		{$link .= "&amp;check={$set['update']['checktime']}' class='ahtung";}
	if (empty($one[2])) {$link = './?adm'; $class = ' class="main"';}
	$list .= "<li$class><a href='$link'>$title</a></li>\n";
}
if (!$cur || empty($current)) $list = str_replace('main', 'current', $list);
return 
"<ul class='page menu'>
$list</ul>";
}



# Генерация выпадающих списков с выбором
function select($options, $name, $current = '')
{
foreach ($options as $val)
	{	$raw = explode(',', $val);
		$opt = array_pop($raw); $text = join(',', $raw);
		$y = '';	if ($opt == $current) $y = ' selected';
		$select .= "\n<option value='$opt'$y>$text</option>";
	} 
return "\n<select name='$name'>$select\n</select>";
}



# Чтобы форма помнила рекламодателя
function advcookie($qid)
{	global $queue, $stat;
		$temp = $queue;
		if (isset($stat['items'][$qid]))  
		$temp = $stat;
if (isset($temp['items'][$qid]['URL'])) // куки чуть больше года
	setcookie('URL', $temp['items'][$qid]['URL'], time()+32000000); 
if (isset($temp['items'][$qid]['email']))
	setcookie('email', $temp['items'][$qid]['email'], time()+32000000); 
setcookie('text', $temp['items'][$qid]['text'], time()+32000000);
}



# Проверка доступности оператора
function checkaty($provider)
{	global $write, $set;
	

if ($provider == 'daopay')
	{	$URL = 'http://daopay.com/pay/?appcode='.
			$set['providers']['daopayID'].'&price='.
			$set['priceEUR'].'&currency=EUR&method='.
			$set['providers']['daopayMethod'].'&country='.
			$set['providers']['daopayCountry'];
		$check = fetchData($URL, 7);
		if (strpos($check, 'error')) $check = false;
	}

if ($provider == 'smszamok')
	{	$URL = 'http://iface.smszamok.ru/client/izamok.php?'.
			$set['providers']['smszamokID'].'&csj&enc=utf8';
		$check = fetchData($URL, 7);
		if (!strpos($check, $set['providers']['smszamokID']))
			$check = false;
	}
	
if ($check) 
	{	$set['providers']['current'] = $provider;
		$write['set'] = 1; static $write;
	}
return $check;
} //checkaty('daopay');



# Конвертация рублевой цены в Euro
function rubeuroid()
{	global $write, $set;
if ($set['currency'] == 'RUB')
{	$yfin = 'http://download.finance.yahoo.com/d/quotes.csv?s=RUBEUR=X&f=l1&e=.csv';
	if (($rate = fetchData($yfin)) AND !preg_match("/[^0-9\.]/u", trim($rate)))
		{	$EUR = round(($set['price'] * $rate), 2);
			$set['priceEUR'] = $EUR; 
			$write['set'] = 1; static $write, $set;	} 
	else $EUR = $set['priceEUR'];
}
return $EUR;
}
