<?php
// +-------------------------------------------------+
// © 2002-2004 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
// +-------------------------------------------------+
// $Id: interpreter.inc.php,v 1.15 2013-01-09 11:03:32 touraine37 Exp $
require_once ($include_path . "/misc.inc.php");

$func_format['romain']= aff_romain;
$func_format['roman']= aff_romain;
$func_format['date']= aff_date;
$func_format['day']= aff_day;
$func_format['dayofweek']= aff_dayofweek;
$func_format['month']= aff_month;
$func_format['week']= aff_week;
$func_format['year']= aff_year;
$func_format['str_day']= aff_str_day;
$func_format['str_month']= aff_str_month;
$func_format['str_short_day']= aff_str_short_day;
$func_format['str_short_month']= aff_str_short_month;
$func_format['season']= aff_season;
$func_format['str_season']= aff_str_season;
$func_format['seasonS']= aff_seasonS;
$func_format['str_seasonS']= aff_str_seasonS;
$func_format['sql']= aff_sql;
$func_format['+']= aff_add;
$func_format['-']= aff_sub;
$func_format['*']= aff_mux;
$func_format['%']= aff_mod;
$func_format['/']= aff_div;
$func_format['+day']= aff_add_day;
$func_format['+month']= aff_add_month;
$func_format['+year']= aff_add_year;
$func_format['-day']= aff_sub_day;
$func_format['-month']= aff_sub_month;
$func_format['-year']= aff_sub_year;
$func_format['quarter']= aff_quarter;
$func_format['dayofyear']= aff_dayofyear;
$func_format['curdate']= aff_curdate;
$func_format['0day']= aff_0day;
$func_format['0month']= aff_0month;
//     passer en majuscule la première lettre, 
$func_format['1ucase']=aff_ucase_firstletter;
//    passer le tout en majuscules,
$func_format['ucase']=aff_ucase;
//    passer les premières lettres de chaque mot en majuscule.
$func_format['1ucasew']=aff_ucase_firstletter_word;
// Convertie un nombre en lettre (1=>a, 26=>z) param 1: le chiffre, param2 optionnel: >0:en Majuscule
$func_format['i2char']= aff_i2char;
//$func_format['']= ;

$func_format['semester']= aff_semester;
$func_format['ordinal']= aff_ordinal;
$func_format['str_ordinal']= aff_str_ordinal;

$var_format = array();

function func_test($f_name){
	global $func_format;
	if($func_format[$f_name]) return 1;
return 0;
}

function aff_romain($param) {
	$nombre_arab=$param[0];
	
	$nb_b10 = array (
		'I',
		'X',
		'C',
		'M'
	);
	$nb_b5 = array (
		'V',
		'L',
		'D'
	);
	$nbrom = '';
	$nombre = $nombre_arab;
	if ($nombre >= 0 && $nombre < 4000) {
		for ($i = 3; $i >= 0; $i--) {
			$chiffre = floor($nombre / pow(10, $i));
			if ($chiffre >= 1) {
				$nombre = $nombre - $chiffre * pow(10, $i);
				if ($chiffre <= 3) {
					for ($j = $chiffre; $j >= 1; $j--) {
						$nbrom = $nbrom . $nb_b10[$i];
					}
				}
				elseif ($chiffre == 9) {
					$nbrom = $nbrom . $nb_b10[$i] . $nb_b10[$i +1];
				}
				elseif ($chiffre == 4) {
					$nbrom = $nbrom . $nb_b10[$i] . $nb_b5[$i];
				} else {
					$nbrom = $nbrom . $nb_b5[$i];
					for ($j = $chiffre -5; $j >= 1; $j--) {
						$nbrom = $nbrom . $nb_b10[$i];
					}
				}
			}
		}
	} else {
		//Valeur Hors Limite;
		return $nombre_arab;
	}
	return $nbrom;
}

function aff_date($param) {
	$date=$param[0];
	return format_date($date);
}
function aff_day($param) {
	$date=$param[0];
	return pmb_sql_value("SELECT DAYOFMONTH('$date')");	// 1 à 31
}
function aff_0day($param) {
	$date=$param[0];
	return pmb_sql_value("SELECT right(concat('0',DAYOFMONTH('$date')),2)");	//01 à 31 
}
function aff_dayofweek($param) {
	$date=$param[0];	
	$sunday_mode=$param[1];	
	if($sunday_mode)
		return pmb_sql_value("SELECT DAYOFWEEK('$date')");
	else
		return ((pmb_sql_value("SELECT DAYOFWEEK('$date')")+5)%7)+1;
}
function aff_month($param) {
	$date=$param[0];
	return pmb_sql_value("SELECT MONTH('$date')");	//1 à 12 
}
function aff_0month($param) {
	$date=$param[0];
	return pmb_sql_value("SELECT right(concat('0',MONTH('$date')),2)");	//01 à 12 
}
function aff_week($param) {
	$date=$param[0];
	return pmb_sql_value("SELECT WEEK('$date',5)") + 1;//0 ... 53
}
function aff_year($param) {
	$date=$param[0];
	return pmb_sql_value("SELECT YEAR('$date')");
}

function aff_str_month($param) {
	global $msg;
	$date=$param[0];	
	// param optionnel pour afficher le message dans une autre langue
	$langue=$param[1];
	$local_msg=$msg;
	if($langue)$local_msg=load_lang($langue);

	$month=pmb_sql_value("SELECT MONTH('$date')")+1005;//1 à 12 
	return $local_msg{$month};
}
function aff_str_day($param) {
	global $msg;
	$date=$param[0];	
	$langue=$param[1];
	$local_msg=$msg;
	if($langue)$local_msg=load_lang($langue);
	
	$day=((pmb_sql_value("SELECT DAYOFWEEK('$date')")+5)%7)+1;
	return $local_msg{"week_days_".$day};
}
function aff_str_short_month($param) {
	global $msg;
	$date=$param[0];	
	// param optionnel pour afficher le message dans une autre langue
	$langue=$param[1];
	$local_msg=$msg;
	if($langue)$local_msg=load_lang($langue);

	$month=pmb_sql_value("SELECT MONTH('$date')")+1005;//1 à 12 
	return $local_msg{$month};
}

function aff_str_short_day($param) {
	global $msg;
	$date=$param[0];	
	// param optionnel pour afficher le message dans une autre langue
	$langue=$param[1];
	$local_msg=$msg;
	if($langue)$local_msg=load_lang($langue);
	
	$day=((pmb_sql_value("SELECT DAYOFWEEK('$date')")+5)%7)+1;
	return $local_msg{"week_days_short_".$day};
}

function load_lang($lang){
	// localisation (fichier XML)
	global $include_path;
	global $msg_lang;
	//Permet de charger le fichier de lange 1 seule fois
	if(!$msg_lang[$lang]){
		$messages = new XMLlist("$include_path/messages/$lang.xml", 0);
		$messages->analyser();
		$msg_lang[$lang] = $messages->table;
	}
	return 	$msg_lang[$lang];
}

function aff_add($param) {
	return $param[0]+$param[1];
}
function aff_sub($param) {
	return $param[0]-$param[1];
}
function aff_mux($param) {
	return $param[0]*$param[1];
}
function aff_mod($param) {
	return $param[0]%$param[1];
}
function aff_div($param) {
	if($param[1]==0)return 0;
	return abs($param[0]/$param[1]);
}
function aff_sql($param) {
	$rqt=$param[0];
	return pmb_sql_value($rqt);
}
function aff_season($param) {
	$date=$param[0];
	$month=pmb_sql_value("SELECT MONTH('$date')");
	$days=pmb_sql_value("SELECT DAYOFMONTH('$date')");
	$date=sprintf("%d%02d",$month,$days);
	if( ($date >= 321) && ($date < 621) ) return 1;//Printemps
	if( ($date >= 621) && ($date < 923) ) return 2;//Eté
	if( ($date >= 923) && ($date < 1222) ) return 3;//Automne
	return 4;//Hivers
}
function aff_str_season($param) {
	global $msg;
	$langue=$param[1];
	$local_msg=$msg;
	if($langue)$local_msg=load_lang($langue);
	$season=aff_season($param);
	return $local_msg{"season_".$season};	
		
}
function aff_seasonS($param) {
	$season=aff_season($param);	
	if( $season == 1) return 3;//Automne
	if( $season == 2) return 4;//Hivers
	if( $season == 3) return 1;//Printemps
	return 2;//Eté
}
function aff_str_seasonS($param) {
	global $msg;
	$langue=$param[1];
	$local_msg=$msg;
	if($langue)$local_msg=load_lang($langue);
	$season = aff_seasonS($param);
	return $local_msg{"season_".$season};	
}
function aff_add_day($param) {
	global $msg;
	$date=$param[0];
	$nb=$param[1];
	return pmb_sql_value("SELECT DATE_ADD('" .$date. "', INTERVAL " .$nb. " DAY)");
}
function aff_add_month($param) {
	global $msg;
	$date=$param[0];
	$nb=$param[1];
	return pmb_sql_value("SELECT DATE_ADD('" .$date. "', INTERVAL " .$nb. " MONTH)");
}
function aff_add_year($param) {
	global $msg;
	$date=$param[0];
	$nb=$param[1];
	return pmb_sql_value("SELECT DATE_ADD('" .$date. "', INTERVAL " .$nb. " YEAR)");
}
function aff_sub_day($param) {
	global $msg;
	$date=$param[0];
	$nb=$param[1];
	return pmb_sql_value("SELECT DATE_SUB('" .$date. "', INTERVAL " .$nb. " DAY)");
}
function aff_sub_month($param) {
	global $msg;
	$date=$param[0];
	$nb=$param[1];
	return pmb_sql_value("SELECT DATE_SUB('" .$date. "', INTERVAL " .$nb. " MONTH)");
}
function aff_sub_year($param) {
	global $msg;
	$date=$param[0];
	$nb=$param[1];
	return pmb_sql_value("SELECT DATE_SUB('" .$date. "', INTERVAL " .$nb. " YEAR)");
}
function aff_quarter($param) {
	global $msg;
	$date=$param[0];
	return pmb_sql_value("SELECT QUARTER('" .$date. "')");
}
function aff_dayofyear($param) {
	global $msg;
	$date=$param[0];
	return pmb_sql_value("SELECT DAYOFYEAR('" .$date. "')");
}
function aff_curdate($param) {
	global $msg;
	return pmb_sql_value("SELECT CURDATE()");
}
function aff_ucase_firstletter($param) {
	return ucfirst($param[0]);
}
function aff_ucase($param) {
	return strtoupper($param[0]);
}
function aff_ucase_firstletter_word($param) {
	return ucwords($param[0]);
}

function aff_i2char($param) {
	if($param[0]<1 || $param[0]>26)return '';
	if($param[1]) return chr($param[0]+64);
	return chr($param[0]+96);
}

function aff_semester($param) {
	$semester = array(1=>1,1,2,2);
	return $semester[aff_quarter($param)];
}

function aff_ordinal($param) {
	global $msg;
	$index=$param[0];

	if(count($param) > 2) {
		// #ordinal(#semester($DATE;);,premier,deuxieme,troisieme,quatrieme);
		return $param[$index];
	} else {
		// #ordinal(#semester($DATE;););
		// #ordinal(#semester($DATE;);,en_US);
		$langue=$param[1];
		$local_msg=$msg;
		if($langue)$local_msg=load_lang($langue);
		return $local_msg{"ordinal_".$index};
	}
}

function aff_str_ordinal($param) {
	global $msg;
	$index=$param[0];
	$langue=$param[1];
	$local_msg=$msg;
	if($langue)$local_msg=load_lang($langue);
	return $local_msg{"ordinal_s_".$index};
}

