<?php if (!defined('PmWiki')) exit();
/*
	MultiLanguage 1.1
	multilanguage for PmWiki
	copyright (c) 2006-2007 Yuri Giuntoli (www.giuntoli.com)

	This PHP script is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation.

	This PHP script is not part of the standard PmWiki distribution.

	0.0 - 07.11.2004
		First multilanguage concept by KAL.
	0.1 - 22.01.2006
		First implementation.
	0.2 - 23.01.2006
		Added parsing of the page to automatically find available languages.
		Added (:selectlang:) directive to display selection links with current available languages.
	0.3 - 25.01.2006
		Added possibility to configure (:selectlang:) output.
		Available languages are now parsed on edit and saved as attributes, so page load is faster (uses PCache).
		Added parameter to (:selectlang:) directive to display links to a specific page.
	1.0 - 10.02.2006
		Added cascade of default languages in order of importance.
		Added parameter to (:selectlang:) to display links to a default page when a language is not available.
		Added support to multilanguage titles for [[Page|+]] titled links (saved as page attributes).
		Public release.
	1.0b - 03.04.2006
		Fixed a problem when $pagename is not set.
	1.1 - 05.07.2007
		Added new langinpage conditional.
		Added {$userlang} page variable (suggested by noskule).
		Fixed a problem with setting userlang cookie (fixed by SteP).
		Added version information (see Cookbook.RecipeCheck).
	1.2 - 14.10.2015
		changed Markup creation so it works with PHP >5.5
		(see also: http://www.pmwiki.org/wiki/PmWiki/CustomMarkup)

*/

	define(MULTILANGUAGE, '1.1');
	$RecipeInfo['MultiLanguage']['Version'] = '2015-10-14';

	SDV($DefaultLanguages,array('en'));
	SDV($LanguageSelectionFmt,'[[{$FullName}?userlang=$1|$1]] ');

	//------------------------------------------------------------------------------------

	if (isset($_GET['userlang'])) {
		$userlang = $_GET['userlang'];
		setcookie('userlang',$userlang,0,'/');
	} else if (isset($_COOKIE['userlang'])) {
		$userlang = $_COOKIE['userlang'];
	} else if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
        $userlang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);
		setcookie('userlang',$userlang,0,'/');
	} else {
		$userlang = $DefaultLanguages[0];
		setcookie('userlang',$userlang,0,'/');
	}
	$_COOKIE['userlang']=$userlang;

	if ($pagename=='') {
		if (function_exists('ResolvePageName')) {
			$pagename = ResolvePageName($pagename);
		} else {
			$pagename="$DefaultGroup.$DefaultName";
		}
	}

	if (!isset($PCache[$pagename])) {
		PCache($pagename, ReadPage($pagename, READPAGE_CURRENT));
	}

	//------------------------------------------------------------------------------------

	$PageLanguages = explode(',',$PCache[$pagename]['languages']);
	if (!in_array($userlang,$PageLanguages)) {
		foreach ($DefaultLanguages as $lang) {
			if (in_array($lang,$PageLanguages)) {
				$userlang = $lang;
				break;
			}
		}
		if (!$PageLanguages[0]=='') {
			$userlang = $PageLanguages[0];
		} else {
			$userlang = $DefaultLanguages[0];
		}
	}
	$Conditions['userlang'] = '$GLOBALS[\'userlang\']==$condparm';

	//------------------------------------------------------------------------------------

	function LangInPage($args) {
		global $PCache, $DefaultLanguages;

		$args = ParseArgs($args);
		$args = $args[''];

		if (count($args)<2) return false;

		if (in_array($args[0],$DefaultLanguages)) {
			$lang = $args[0];
			$pn = $args[1];
		} else {
			$lang = $args[1];
			$pn = $args[0];
		}

		if (!isset($PCache[$pn])) {
			PCache($pn, ReadPage($pn, READPAGE_CURRENT));
		}
		$PageLanguages = explode(',',$PCache[$pn]['languages']);

		return in_array($lang,$PageLanguages);
	}

	$Conditions['langinpage'] = 'LangInPage($condparm)';

	//------------------------------------------------------------------------------------

	$FmtPV['$Title'] = 'MultiLanguageTitle($pagename,$name)';
	$FmtPV['$Titlespaced'] = '$AsSpacedFunction(MultiLanguageTitle($pagename,$name))';
	$FmtPV['$userlang'] = "'$userlang'";

	function MultiLanguageTitle($pn,$name) {
		global $PCache, $userlang, $DefaultLanguages, $pagename, $AsSpacedFunction;

		$pn = MakePageName($pagename,$pn);
		if (!PageExists($pn)) return '';
		if (!isset($PCache[$pn])) {
			PCache($pn, ReadPage($pn, READPAGE_CURRENT));
		}
		if (isset($PCache[$pn]["mltitle-$userlang"])) return $PCache[$pn]["mltitle-$userlang"];
		foreach ($DefaultLanguages as $lang) {
			if (isset($PCache[$pn]["mltitle-$lang"])) return $PCache[$pn]["mltitle-$lang"];
		}
		if (isset($PCache[$pn]['title'])) return $PCache[$pn]['title'];
		if ($GLOBALS['SpaceWikiWords']) {
			return $AsSpacedFunction($name);
		} else {
			return $name;
		}
	}


	//------------------------------------------------------------------------------------

	Markup_e('selectlang', 'directives', "/\\(:selectlang\s*(.*?):\\)/i", "LanguageSelection(ParseArgs(\$m[1]))");

	function LanguageSelection($args) {
		global $LanguageSelectionFmt, $pagename, $PCache, $DefaultLanguages;

		$pn = $args['page'];
		if ($pn=='') $pn = $pagename;

		$pn = MakePageName($pagename,$pn);
		if (!PageExists($pn)) return '';
		if (!isset($PCache[$pn])) {
			PCache($pn, ReadPage($pn, READPAGE_CURRENT));
		}

		if (!$PCache[$pn]['languages']) {
			$PageLanguages = array();
		} else {
			$PageLanguages = explode(',',@$PCache[$pn]['languages']);
		}

		$mid = '';
		foreach ($DefaultLanguages as $lang) {
			if (in_array($lang,$PageLanguages)) {
				$mid .= str_replace('$1',$lang,$LanguageSelectionFmt);
			} else if (isset($args['default'])) {
				$mid .= FmtPageName(str_replace('$1',$lang,$LanguageSelectionFmt),$args['default']);
			}
		}
		foreach ($PageLanguages as $lang) {
			if (!in_array($lang,$DefaultLanguages)) {
				$mid .= str_replace('$1',$lang,$LanguageSelectionFmt);
			}
		}
		return FmtPageName($mid,$pn);
	}

	//------------------------------------------------------------------------------------

	array_unshift($EditFunctions,'SaveLanguages');

	function SaveLanguages($pagename, &$page, &$new) {
		$text = $new['text'];
		$text = preg_replace('/(\[=.+=\])/msiU', '', $text);
		$text = preg_replace('/(\[@.+@\])/msiU', '', $text);
		preg_match_all('/\(:if\s*userlang\s*(.+?)\s*:\)/msi', $text, $matches);

		$PageLanguages = array();
		foreach ($matches[1] as $lang) {
			if (!in_array($lang,$PageLanguages)) $PageLanguages[] = $lang;
		}

		if (count($PageLanguages)>0) {
			$new['languages'] = implode(',', $PageLanguages);
		} else {
			unset($new['languages']);
		}

		preg_match_all('/\(:if\s*userlang\s*(.+?)\s*:\).*?\(:title\s*(.+?)\s*:\)/msi', $text, $matches);
		if (count($matches[1])==count($matches[2])) {
			for ($i=0; $i<count($matches[2]); ++$i) { 
				$new['mltitle-'.$matches[1][$i]] = $matches[2][$i];
			}
		}
	}

?>