<?php
///////////////////////////////////////////////////////////////////////////

class HD
{
    public static function is_map($a)
    {
        return is_array($a) &&
            array_diff_key($a, array_keys(array_keys($a)));
    }

    ///////////////////////////////////////////////////////////////////////

    public static function has_attribute($obj, $n)
    {
        $arr = (array) $obj;
        return isset($arr[$n]);
    }
    ///////////////////////////////////////////////////////////////////////

    public static function get_map_element($map, $key)
    {
        return isset($map[$key]) ? $map[$key] : null;
    }

    ///////////////////////////////////////////////////////////////////////

    public static function starts_with($str, $pattern)
    {
        return strpos($str, $pattern) === 0;
    }

    ///////////////////////////////////////////////////////////////////////

    public static function format_timestamp($ts, $fmt = null)
    {
        // NOTE: for some reason, explicit timezone is required for PHP
        // on Dune (no builtin timezone info?).

        if (is_null($fmt))
            $fmt = 'Y:m:d H:i:s';

        $dt = new DateTime('@' . $ts);
        return $dt->format($fmt);
    }

    ///////////////////////////////////////////////////////////////////////

    public static function format_duration($msecs)
    {
        $n = intval($msecs);

        if (strlen($msecs) <= 0 || $n <= 0)
            return "--:--";

        $n = $n / 1000;
        $hours = $n / 3600;
        $remainder = $n % 3600;
        $minutes = $remainder / 60;
        $seconds = $remainder % 60;

        if (intval($hours) > 0)
        {
            return sprintf("%d:%02d:%02d", $hours, $minutes, $seconds);
        }
        else
        {
            return sprintf("%02d:%02d", $minutes, $seconds);
        }
    }

    ///////////////////////////////////////////////////////////////////////

    public static function encode_user_data($a, $b = null)
    {
        $media_url = null;
        $user_data = null;

        if (is_array($a) && is_null($b))
        {
            $media_url = '';
            $user_data = $a;
        }
        else
        {
            $media_url = $a;
            $user_data = $b;
        }

        if (!is_null($user_data))
            $media_url .= '||' . json_encode($user_data);

        return $media_url;
    }

    ///////////////////////////////////////////////////////////////////////

    public static function decode_user_data($media_url_str, &$media_url, &$user_data)
    {
        $idx = strpos($media_url_str, '||');

        if ($idx === false)
        {
            $media_url = $media_url_str;
            $user_data = null;
            return;
        }

        $media_url = substr($media_url_str, 0, $idx);
        $user_data = json_decode(substr($media_url_str, $idx + 2));
    }

    ///////////////////////////////////////////////////////////////////////

    public static function create_regular_folder_range($items, $from_ndx = 0, $total = -1, $more_items_available = false)
    {
        if ($total === -1)
            $total = $from_ndx + count($items);

        if ($from_ndx >= $total)
        {
            $from_ndx = $total;
            $items = array();
        }
        else if ($from_ndx + count($items) > $total)
        {
            array_splice($items, $total - $from_ndx);
        }

        return array
        (
            PluginRegularFolderRange::total => intval($total),
            PluginRegularFolderRange::more_items_available => $more_items_available,
            PluginRegularFolderRange::from_ndx => intval($from_ndx),
            PluginRegularFolderRange::count => count($items),
            PluginRegularFolderRange::items => $items
        );
    }
    ///////////////////////////////////////////////////////////////////////
    public static function sort_tv_groups($json)
    {
        $sort = array();
        foreach ($json->results as $result){
            $sort[$result->number] = $result;
        }
        ksort($sort);
        $json->results = $sort;
        
        return $json;
    }

    ///////////////////////////////////////////////////////////////////////
	public static function get_token($login, $pw)
	{
	hd_print("--------$login-----------$pw");
	$url = MyPlugIN_Config::API_URL.'/stalker_portal/auth/token.php';
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_POSTFIELDS, 'grant_type=password&username='.$login.'&password='.$pw);
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_USERAGENT,         'DuneHD/1.0');
	curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,20);
	curl_setopt($ch,CURLOPT_TIMEOUT, 20);
	$response = curl_exec($ch);
	curl_close($ch);
	//hd_print("---------------->>>$response");
	return $response;
	}
	
	public static function get_daten($daten, $token)
	{
	$url = MyPlugIN_Config::API_URL.'/stalker_portal/api/api_v2.php?_resource='.$daten;
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_HEADER, 0);
	curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json', 'Accept-Language: ru-RU', 'Authorization: Bearer '.$token));
    	curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_USERAGENT,         'DuneHD/1.0');
	curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,30);
	curl_setopt($ch,CURLOPT_TIMEOUT, 30);
	
	hd_print("HTTP fetching '$url'...");
	
	$response = curl_exec($ch);
	
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        if($response === false)
        {
            $err_msg = "HTTP error: $http_code (" . curl_error($ch) . ')';
            echo($err_msg);
        }
        if ($http_code != 200)
        {
            $err_msg = "HTTP request failed ($http_code)";
            echo($err_msg);
        }
        hd_print("HTTP OK ($http_code)");	
	curl_close($ch);
	return $response;
	}
	
	
	
	public static function put_sett($id, $streamer, $value, $token)
	{
	hd_print("value in utils----->$value");
	hd_print("id in utils----->$id");
	$data = array($streamer => $value);
	$url = MyPlugIN_Config::API_URL . "/users/$id/settings/";
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json', 'Accept-Language: ru-RU', 'Authorization: Bearer '.$token));
    curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
	curl_setopt($ch, CURLOPT_USERAGENT,         'DuneHD/1.0');
	curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,30);
	curl_setopt($ch,CURLOPT_TIMEOUT, 30);
	$response = curl_exec($ch);
	hd_print("response_utils----->$response");
	curl_close($ch);
	return $response;
	}
	
	
    public static function http_get_document($url, $opts = null)
    {
    
$header[] = "Accept: application/json, text/javascript, */*; q=0.01";
$header[] = "Referer: http://smart.prostotv.com/smartup/";
$header[] = "Origin: http://smart.prostotv.com";
$header[] = "X-Requested-With: XMLHttpRequest";
$header[] = "Content-Type: application/x-www-form-urlencoded; charset=UTF-8";
$header[] = "Accept-Language: ru-RU,en,*";
$header[] = "Host: smart.prostotv.com";
    
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,    20);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,    true);
        curl_setopt($ch, CURLOPT_TIMEOUT,           20);
        curl_setopt($ch, CURLOPT_USERAGENT,         "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/538.1 (KHTML, like Gecko) SmartUP TV/2.0.1 Safari/538.1");
        
        curl_setopt($ch, CURLOPT_HTTPHEADER,$header);
        
        curl_setopt($ch, CURLOPT_ENCODING,          'gzip,deflate');
        curl_setopt($ch, CURLOPT_URL,               $url);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION,           true);

        if (isset($opts))
        {
            foreach ($opts as $k => $v)
                curl_setopt($ch, $k, $v);
        }

        hd_print("HTTP fetching '$url'...");

        $content = curl_exec($ch);
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        if($content === false)
        {
            $err_msg = "HTTP error: $http_code (" . curl_error($ch) . ')';
            hd_print($err_msg);
        }

        if ($http_code != 200)
        {
            $err_msg = "HTTP request failed ($http_code)";
            hd_print($err_msg);
        }

        hd_print("HTTP OK ($http_code)");

        curl_close($ch);

        return $content;
    }

    ///////////////////////////////////////////////////////////////////////

    public static function http_post_document($url, $post_data)
    {
        return self::http_get_document($url, array(CURLOPT_POST => true, CURLOPT_POSTFIELDS => $post_data));
    }

    ///////////////////////////////////////////////////////////////////////

    public static function parse_xml_document($doc)
    {
        $xml = simplexml_load_string($doc);

        if ($xml === false)
        {
            hd_print("Error: can not parse XML document.");
            hd_print("XML-text: $doc.");
            throw new Exception('Illegal XML document');
        }

        return $xml;
    }

    ///////////////////////////////////////////////////////////////////////

    public static function make_json_rpc_request($op_name, $params)
    {
        static $request_id = 0;

        $request = array
        (
            'jsonrpc' => '2.0',
            'id' => ++$request_id,
            'method' => $op_name,
            'params' => $params
        );

        return $request;
    }

    ///////////////////////////////////////////////////////////////////////////

    public static function get_mac_addr()
    {
        static $mac_addr = null;
        if (is_null($mac_addr))
        {
            $mac_addr = shell_exec(
                'ifconfig  eth0 | head -1 | sed "s/^.*HWaddr //"');
            $mac_addr = trim($mac_addr);
            hd_print("MAC Address: '$mac_addr'");
        }
        return $mac_addr;
    }
    
	public static function speedtest($server)
	{
		$ch = curl_init($server);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
		curl_setopt($ch, CURLOPT_TIMEOUT, 10);
		$execute = curl_exec($ch);
		$info = curl_getinfo($ch);
		$A = $info['speed_download'] * 8 / 1024 / 1024;
		$A = round ($A, 2) . " mbps";
		return $A;	
	}
    ///////////////////////////////////////////////////////////////////////////

    // TODO: localization
    private static $MONTHS = array(
        'January',
        'February',
        'March',
        'April',
        'May',
        'June',
        'July',
        'August',
        'September',
        'October',
        'November',
        'December',
    );

    public static function format_date_time_date($tm)
    {
        $lt = localtime($tm);
        $mon = self::$MONTHS[$lt[4]];
        return sprintf("%02d %s %04d", $lt[3], $mon, $lt[5] + 1900);
    }

    public static function format_date_time_time($tm, $with_sec = false)
    {
        $format = '%H:%M';
        if ($with_sec)
            $format .= ':%S';
        return strftime($format, $tm);
    }
    
//////////////////////////////////////////////////////
    public static function get_items($path) {
		$items = array();
			$link = DuneSystem::$properties['data_dir_path'] . '/'. $path;
		if (file_exists($link))
			$items = unserialize(file_get_contents($link));
		return $items;
    }

//////////////////////////////////////////////////////
    public static function save_items($path, $items) {
			$link = DuneSystem::$properties['data_dir_path'] . '/'. $path;
		file_put_contents ($link, serialize($items));
	}

//////////////////////////////////////////////////////   
    public static function get_item($path) {
		$item = '';
			$link = DuneSystem::$properties['data_dir_path'] . '/'. $path;
		if (file_exists($link))
			$item = file_get_contents($link);
		return $item;
    }

//////////////////////////////////////////////////////    
	public static function save_item($path, $item) {
			$link = DuneSystem::$properties['data_dir_path'] . '/'. $path;
		file_put_contents ($link, $item);
	}
    
    
}

if (date_default_timezone_get() <> 'UTC')
	date_default_timezone_set('UTC');

///////////////////////////////////////////////////////////////////////////
?>
