<?php

class HTML {
	public static function escape($str) {
		return htmlspecialchars($str);
	}
	public static function stripTags($str) {
		return strip_tags($str);
	}
	public static function avatar_addr($user, $size) {
		return '//cn.gravatar.com/avatar/' . md5(strtolower(trim($user['email']))) . "?d=mm&amp;s=$size";
	}
		
	public static function tablist($tabs_info, $cur, $type = 'nav-tabs') {
		$html = '<ul class="nav '.$type.'" role="tablist">';
		foreach ($tabs_info as $id => $tab) {
			$html .= '<li class="nav-item"><a class="nav-link'.($cur == $id ? ' active' : '').'" href="'.$tab['url'].'" role="tab">'.$tab['name'].'</a></li>';
		}
		$html .= '</ul>';
		return $html;
	}
	
	public static function hiddenToken() {
		return '<input type="hidden" name="_token" value="'.crsf_token().'" />';
	}
	public static function div_vinput($name, $type, $label_text, $default_value) {
		return '<div id="'."div-$name".'">'
			. '<label for="'."input-$name".'" class="control-label">'.$label_text.'</label>'
			. '<input type="'.$type.'" class="form-control" name="'.$name.'" id="'."input-$name".'" value="'.HTML::escape($default_value).'" />'
			. '<span class="help-block" id="'."help-$name".'"></span>'
			. '</div>';
	}
	public static function div_vtextarea($name, $label_text, $default_value) {
		return '<div id="'."div-$name".'">'
			. '<label for="'."input-$name".'" class="control-label">'.$label_text.'</label>'
			. '<textarea class="form-control" name="'.$name.'" id="'."input-$name".'">'.HTML::escape($default_value).'</textarea>'
			. '<span class="help-block" id="'."help-$name".'"></span>'
			. '</div>';
	}
	public static function checkbox($name, $default_value) {
		$status = $default_value ? 'checked="checked" ' : '';
		return '<input type="checkbox" id="'."input-$name".'" name="'.$name.'" '.$status.'/>';
	}
	
	public static function blog_url($username, $uri) {
		switch (UOJConfig::$data['switch']['blog-domain-mode']) {
			case 1:
				$port = ((UOJConfig::$data['web']['blog']['protocol'] === "http" && UOJConfig::$data['web']['blog']['port'] == 80) || (UOJConfig::$data['web']['blog']['protocol'] === "https" && UOJConfig::$data['web']['blog']['port'] == 443)) ? '' : (':'.UOJConfig::$data['web']['blog']['port']);
				$url = UOJConfig::$data['web']['blog']['protocol'].'://'.blog_name_encode($username).'.'.UOJConfig::$data['web']['blog']['host'].$port;
				break;
			case 2:
				$port = ((UOJConfig::$data['web']['blog']['protocol'] === "http" && UOJConfig::$data['web']['blog']['port'] == 80) || (UOJConfig::$data['web']['blog']['protocol'] === "https" && UOJConfig::$data['web']['blog']['port'] == 443)) ? '' : (':'.UOJConfig::$data['web']['blog']['port']);
				$url = UOJConfig::$data['web']['blog']['protocol'].'://'.UOJConfig::$data['web']['blog']['host'].$port.'/'.blog_name_encode($username);
				break;
			case 3:
				$port = ((UOJConfig::$data['web']['main']['protocol'] === "http" && UOJConfig::$data['web']['main']['port'] == 80) || (UOJConfig::$data['web']['main']['protocol'] === "https" && UOJConfig::$data['web']['main']['port'] == 443)) ? '' : (':'.UOJConfig::$data['web']['main']['port']);
				$url = UOJConfig::$data['web']['main']['protocol'].'://'.UOJConfig::$data['web']['main']['host'].$port.'/blog/'.blog_name_encode($username);
				break;
		}
		$url .= $uri;
		$url = rtrim($url, '/');
		return HTML::escape($url);
	}
	public static function blog_list_url() {
		switch (UOJConfig::$data['switch']['blog-domain-mode']) {
			case 1:
			case 2:
				$port = ((UOJConfig::$data['web']['blog']['protocol'] === "http" && UOJConfig::$data['web']['blog']['port'] == 80) || (UOJConfig::$data['web']['blog']['protocol'] === "https" && UOJConfig::$data['web']['blog']['port'] == 443)) ? '' : (':'.UOJConfig::$data['web']['blog']['port']);
				$url = UOJConfig::$data['web']['blog']['protocol'].'://'.UOJConfig::$data['web']['blog']['host'].$port;
				break;
			case 3:
				$port = ((UOJConfig::$data['web']['main']['protocol'] === "http" && UOJConfig::$data['web']['main']['port'] == 80) || (UOJConfig::$data['web']['main']['protocol'] === "https" && UOJConfig::$data['web']['main']['port'] == 443)) ? '' : (':'.UOJConfig::$data['web']['main']['port']);
				$url = UOJConfig::$data['web']['main']['protocol'].'://'.UOJConfig::$data['web']['main']['host'].$port.'/blogs';
				break;
		}
		return HTML::escape(rtrim($url, '/'));
	}
	
	public static function url($uri, $config = array()) {
		$config = array_merge(array(
			'location' => 'main',
			'params' => null
		), $config);
		
		$path = strtok($uri, '?');
		$qs = strtok('?');
		parse_str($qs, $param);
		
		if ($config['params'] != null) {
			$param = array_merge($param, $config['params']);
		}
		
		$url = UOJConfig::$data['web'][$config['location']]['protocol'].'://'.UOJConfig::$data['web'][$config['location']]['host'];
		if ((UOJConfig::$data['web'][$config['location']]['protocol'] === "http" && UOJConfig::$data['web'][$config['location']]['port'] == 80) || (UOJConfig::$data['web'][$config['location']]['protocol'] === "https" && UOJConfig::$data['web'][$config['location']]['port'] == 443)) {
		} else {
			$url .= ':'.UOJConfig::$data['web'][$config['location']]['port'];
		}
		if ($param) {
			$url .= $path.'?'.HTML::query_string_encode($param);
		} else {
			$url .= rtrim($path, '/');
		}
		return HTML::escape($url);
	}
	public static function timeanddate_url($time, $config = array()) {
		$url = UOJConfig::$data['web']['blog']['protocol'].'://';
		$url .= 'www.timeanddate.com/worldclock/fixedtime.html';
		$url .= '?'.'iso='.$time->format('Ymd\THi');
		$url .= '&'.'p1=33';
		if (isset($config['duration']) && $config['duration'] < 3600) {
			$url .= '&'.'ah='.floor($config['duration'] / 60);
			if ($config['duration'] % 60 != 0) {
				$url .= '&'.'am='.($config['duration'] % 60);
			}
		}
		$url = HTML::escape($url);
		return $url;
	}
	
	public static function js_src($uri, $config = array('location' => 'main')) {
		return '<script src="'.HTML::url($uri, $config).'"></script>';
	}
	public static function css_link($uri, $config = array('location' => 'main')) {
		return '<link type="text/css" rel="stylesheet" href="'.HTML::url($uri, $config).'" />';
	}
	
	public static function query_string_encode($q, $array_name = null) {
		if (!is_array($q)) {
			return false;
		}
		$r = array();
		foreach ((array)$q as $k => $v) {
			if ($array_name !== null) {
				if (is_numeric($k)) {
					$k = $array_name."[]";
				} else {
					$k = $array_name."[$k]";
				}
			}
			if (is_array($v) || is_object($v)) {
				$r[] = self::query_string_encode($v, $k);
			} else {
				$r[] = urlencode($k)."=".urlencode($v);
			}
		}
		return implode("&", $r);
	}
	
	public static function pruifier() {
		include_once $_SERVER['DOCUMENT_ROOT'] . '/app/vendor/htmlpurifier/HTMLPurifier.auto.php';
		$config = HTMLPurifier_Config::createDefault();
		//$config->set('HTML.Doctype', 'HTML 4.01 Transitional');
		$config->set('Cache.DefinitionImpl', null);
		$def = $config->getHTMLDefinition(true);
		
		$def->addElement('section', 'Block', 'Flow', 'Common');
		$def->addElement('nav',     'Block', 'Flow', 'Common');
		$def->addElement('article', 'Block', 'Flow', 'Common');
		$def->addElement('aside',   'Block', 'Flow', 'Common');
		$def->addElement('header',  'Block', 'Flow', 'Common');
		$def->addElement('footer',  'Block', 'Flow', 'Common');
		
		return new HTMLPurifier($config);
	}
}