tpl->addValue('Blogroll',array('tplBlogroll','blogroll'));
$core->tpl->addValue('BlogrollXbelLink',array('tplBlogroll','blogrollXbelLink'));
$core->url->register('xbel','xbel','^xbel(?:/?)$',array('urlBlogroll','xbel'));
class tplBlogroll
{
	public static function blogroll($attr)
	{
		$category='
%s
';
		$block='';
		$item='%1$s';
		
		if (isset($attr['category'])) {
			$category = addslashes($attr['category']);
		}
		
		if (isset($attr['block'])) {
			$block = addslashes($attr['block']);
		}
		
		if (isset($attr['item'])) {
			$item = addslashes($attr['item']);
		}
		
		$only_cat = 'null';
		if (!empty($attr['only_category'])) {
			$only_cat = "'".addslashes($attr['only_category'])."'";
		}
		
		return
		'';
	}
	
	public static function blogrollXbelLink($attr)
	{
		$f = $GLOBALS['core']->tpl->getFilters($attr);
		return 'blog->url.$core->url->getBase("xbel")').'; ?>';
	}
	
	public static function getList($cat_title='%s
',$block='',$item='%s',$category=null)
	{
		$blogroll = new dcBlogroll($GLOBALS['core']->blog);
		
		try {
			$links = $blogroll->getLinks();
		} catch (Exception $e) {
			return false;
		}
		
		$res = '';
		
		$hierarchy = $blogroll->getLinksHierarchy($links);
		
		if ($category) {
			if (!isset($hierarchy[$category])) {
				return '';
			}
			$hierarchy = array($hierarchy[$category]);
		}
		
		foreach ($hierarchy as $k => $v)
		{
			if ($k != '') {
				$res .= sprintf($cat_title,html::escapeHTML($k))."\n";
			}
			
			$res .= self::getLinksList($v,$block,$item);
		}
		
		return $res;
	}
	
	private static function getLinksList($links,$block='',$item='%1$s')
	{
		$list = '';
		
		# Find current link item if any
		$current = -1;
		$current_size = 0;
		$self_uri = http::getSelfURI();
		
		foreach ($links as $k => $v)
		{
			if (!preg_match('$^([a-z][a-z0-9.+-]+://)$',$v['link_href'])) {
				$url = http::concatURL($self_uri,$v['link_href']);
				if (strlen($url) > $current_size && preg_match('/^'.preg_quote($url,'/').'/',$self_uri)) {
					$current = $k;
					$current_size = strlen($url);
				}
			}
		}
		
		foreach ($links as $k => $v)
		{
			$title = $v['link_title'];
			$href  = $v['link_href'];
			$desc = $v['link_desc'];
			$lang  = $v['link_lang'];
			$xfn = $v['link_xfn'];
			
			$link =
			''.
			html::escapeHTML($title).
			'';
			
			$current_class = $current == $k ? ' class="active"' : '';
			
			$list .= sprintf($item,$link,$current_class)."\n";
		}
		
		return sprintf($block,$list)."\n";
	}
	
	# Widget function
	public static function linksWidget($w)
	{
		global $core;
		
		if ($w->homeonly && $core->url->type != 'default') {
			return;
		}
		
		$links = self::getList('%s
','','%1$s',$w->category);
		
		if (empty($links)) {
			return;
		}
		
		return
		''.
		($w->title ? '
'.html::escapeHTML($w->title).'
' : '').
		$links.
		'';
	}
}
class urlBlogroll extends dcUrlHandlers
{
	public static function xbel($args)
	{
		$blogroll = new dcBlogroll($GLOBALS['core']->blog);
		
		try {
			$links = $blogroll->getLinks();
		} catch (Exception $e) {
			self::p404();
			return;
		}
		
		if ($args) {
			self::p404();
			return;
		}
		
		http::cache($GLOBALS['mod_files'],$GLOBALS['mod_ts']);
		
		header('Content-Type: text/xml; charset=UTF-8');
		
		echo
		''."\n".
		''."\n".
		''."\n".
		''.html::escapeHTML($GLOBALS['core']->blog->name)." blogroll\n";
		
		$i = 1;
		foreach ($blogroll->getLinksHierarchy($links) as $cat_title => $links)
		{
			if ($cat_title != '') {
				echo
				''."\n".
				"".html::escapeHTML($cat_title)."\n";
			}
			
			foreach ($links as $k => $v)
			{
				$lang = $v['link_lang'] ? ' xml:lang="'.$v['link_lang'].'"' : '';
				
				echo
				''."\n".
				''.html::escapeHTML($v['link_title'])."\n";
				
				if ($v['link_desc']) {
					echo ''.html::escapeHTML($v['link_desc'])."\n";
				}
				
				if ($v['link_xfn']) {
					echo
					"\n".
					''.$v['link_xfn']."\n".
					"\n";
				}
				
				echo
				"\n";
			}
			
			if ($cat_title != '') {
				echo "\n";
			}
			
			$i++;
		}
		
		echo
		'';
	}
}
?>