<?php

/**
 * Plugin CIBLOC
 * @copyright 2018 MTECT
 * @author Christophe IMBERTI (cf. CPI art L121-1)
 * @license GNU/GPLv3
 */

if (!defined('_ECRIRE_INC_VERSION')) {
	return;
}

include_spip('inc/filtres');

function cibloc_commun_verifier_nom_couleur($nom_couleur) {
	$return = false;
	$tableau_nom_couleurs = cibloc_tableau_nom_des_couleurs();

	if (in_array($nom_couleur, $tableau_nom_couleurs)
			or $nom_couleur == 'transparent') {
		$return = true;
	}

	return $return;
}

function cibloc_tableau_couleurs() {
	$return = [];

	if (defined('_DIR_PLUGIN_CISTYLE')) {
		include_spip('inc/cistyle_commun');
		$return = cistyle_tableau_couleurs();
	}

	return $return;
}

function cibloc_tableau_nom_des_couleurs() {
	return array_keys(cibloc_tableau_couleurs());
}

function cibloc_purger_cache_css() {
	if (isset($GLOBALS['meta']['auto_compress_css']) and $GLOBALS['meta']['auto_compress_css'] == 'oui') {
		// purge UNIQUEMENT du cache des css -> mais effet de bord, aussi ne rien faire
		//                    include_spip('inc/invalideur');
		//                    purger_repertoire(_DIR_VAR . 'cache-css');
	} else {
		// purge UNIQUEMENT des fichiers de cibloc du cache des css
		$dir = _DIR_VAR . 'cache-css';
		if (!is_dir($dir) or !is_readable($dir)) {
			return;
		}
		$handle = opendir($dir);
		if (!$handle) {
			return;
		}

		while (($fichier = @readdir($handle)) !== false) {
			// Eviter ".", "..", ".htaccess", ".svn" etc.
			if ($fichier[0] == '.') {
				continue;
			}
			$chemin = "$dir/$fichier";
			$debut = 'cssdyn-_css_cibloc';
			if (substr($fichier, 0, strlen($debut)) == $debut) {
				if (is_file($chemin)) {
					supprimer_fichier($chemin);
				}
			}
		}
		closedir($handle);
	}

	return true;
}

function cibloc_purger_cache_js() {

	// subtilite de SPIP
	if (isset($GLOBALS['meta']['auto_compress_js']) and $GLOBALS['meta']['auto_compress_js'] == 'oui') {
		// purge du cache des js
		include_spip('inc/invalideur');
		purger_repertoire(_DIR_VAR . 'cache-js');

	} else {
		// purge UNIQUEMENT des fichiers de cibloc du cache des css
		$dir = _DIR_VAR . 'cache-js';
		if (!is_dir($dir) or !is_readable($dir)) {
			return;
		}
		$handle = opendir($dir);
		if (!$handle) {
			return;
		}

		while (($fichier = @readdir($handle)) !== false) {
			// Eviter ".", "..", ".htaccess", ".svn" etc.
			if ($fichier[0] == '.') {
				continue;
			}
			$chemin = "$dir/$fichier";
			$debut = 'jsdyn-_js_cibloc_start2_js';
			$debut_pp = 'jsdyn-javascript_porte_plume_start_js';
			if (substr($fichier, 0, strlen($debut)) == $debut
					or substr($fichier, 0, strlen($debut_pp)) == $debut_pp) {
				if (is_file($chemin)) {
					supprimer_fichier($chemin);
				}
			}
		}
		closedir($handle);
	}

	return true;
}

function cibloc_purger_definition_cache() {
	$chemins = [_DIR_CACHE . 'cibloc_definition-cache.php', _DIR_CACHE . 'cibloc_popin-cache.php'];
	foreach ($chemins as $chemin) {
		if (is_file($chemin)) {
			supprimer_fichier($chemin);
		}
	}

	return true;
}

function cibloc_configuration_des_boutons() {
	$return = [];
	$safe = [];

	// valeurs par defaut
	include_spip('inc/cibloc_objets');
	$return = cibloc_boutons_par_defaut();

	$tableau_par_constante = cibloc_contenu_du_parametrage_par_constante('bouton');
	if ($tableau_par_constante) {
		// le parametrage par constante est prioritaire
		foreach ($tableau_par_constante as $row) {
			$safe = [];
			$type_et_id = $row['type'] . '_' . $row['id'];
			foreach ($row as $cle => $valeur) {
				if ($row[$cle]) {
					$safe[$cle] = $valeur;
				}
			}
			if (isset($return[$type_et_id])) {
				$return[$type_et_id] = array_merge($return[$type_et_id], $safe);
			} else {
				$return[$type_et_id] = $safe;
			}
		}

	} elseif (!cibloc_imposer_parametrage('bouton')) {
		// configuration objet personnalisee
		$personnalisee = cibloc_config_objet_personnalisee('bouton');
                foreach ($personnalisee as $type_et_id => $tableau) {
                        foreach ($tableau as $key => $value) {
                            $return[$type_et_id][$key] = $value;
                        }
                }
                
		/*
				$result = sql_select('*', "spip_cibloc_objets","type='bouton'");
				while ($row = sql_fetch($result)){
					$safe = array();
					$type_et_id = $row['type'].'_'.$row['id'];
					foreach ($row AS $cle=>$valeur){
						if ($row[$cle]){
							$safe[$cle] = $valeur;
						}
					}
					if (isset($return[$type_et_id])){
						$return[$type_et_id] = array_merge($return[$type_et_id],$safe);
					} else {
						$return[$type_et_id] = $safe;
					}
				}
		 *
		 */
	}

	return $return;
}

function cibloc_configuration_des_blocs() {
	$return = [];
	$safe = [];

	// valeurs par defaut
	include_spip('inc/cibloc_objets');
	$return = cibloc_blocs_par_defaut();

	$tableau_par_constante = cibloc_contenu_du_parametrage_par_constante('bloc');
	if ($tableau_par_constante) {
		// le parametrage par constante est prioritaire
		foreach ($tableau_par_constante as $row) {
			$safe = [];
			$type_et_id = $row['type'] . '_' . $row['id'];
			foreach ($row as $cle => $valeur) {
				if ($row[$cle]) {
					$safe[$cle] = $valeur;
				}
			}
			if (isset($return[$type_et_id])) {
				$return[$type_et_id] = array_merge($return[$type_et_id], $safe);
			} else {
				$return[$type_et_id] = $safe;
			}
		}
		uasort($return, 'cibloc_tri_rang');

	} elseif (!cibloc_imposer_parametrage('bloc')) {
		// configuration objet personnalisee
		$personnalisee = cibloc_config_objet_personnalisee('bloc');
                foreach ($personnalisee as $type_et_id => $tableau) {
                        foreach ($tableau as $key => $value) {
                            $return[$type_et_id][$key] = $value;
                        }
                }
		/*
				$result = sql_select('*', "spip_cibloc_objets","type='bloc'");
				while ($row = sql_fetch($result)){
					$safe = array();
					$type_et_id = $row['type'].'_'.$row['id'];
					foreach ($row AS $cle=>$valeur){
						if ($row[$cle]){
							$safe[$cle] = $valeur;
						}
					}

					// Harmonise les retours chariots
					if (isset($safe['preremplir'])){
						$safe['preremplir'] = cibloc_harmonise_retours_chariots($safe['preremplir']);
					}

					if (isset($return[$type_et_id])){
						$return[$type_et_id] = array_merge($return[$type_et_id],$safe);
					} else {
						$return[$type_et_id] = $safe;
					}
				}
		 */
		uasort($return, 'cibloc_tri_rang');
	}

	return $return;
}

function cibloc_configuration_des_multis() {
	$return = [];
	$safe = [];

	// valeurs par defaut
	include_spip('inc/cibloc_objets');
	$return = cibloc_multis_par_defaut();

	$tableau_par_constante = cibloc_contenu_du_parametrage_par_constante('multi');
	if ($tableau_par_constante) {
		// le parametrage par constante est prioritaire
		foreach ($tableau_par_constante as $row) {
			$safe = [];
			$type_et_id = $row['type'] . '_' . $row['id'];
			foreach ($row as $cle => $valeur) {
				if ($row[$cle]) {
					$safe[$cle] = $valeur;
				}
			}
			if (isset($return[$type_et_id])) {
				$return[$type_et_id] = array_merge($return[$type_et_id], $safe);
			} else {
				$return[$type_et_id] = $safe;
			}
		}
		uasort($return, 'cibloc_tri_rang');

	} elseif (!cibloc_imposer_parametrage('multi')) {
		// configuration objet personnalisee
		$personnalisee = cibloc_config_objet_personnalisee('multi');
                foreach ($personnalisee as $type_et_id => $tableau) {
                        foreach ($tableau as $key => $value) {
                            $return[$type_et_id][$key] = $value;
                        }
                }
                
		/*
				$result = sql_select('*', "spip_cibloc_objets","type='multi'");
				while ($row = sql_fetch($result)){
					$safe = array();
					$type_et_id = $row['type'].'_'.$row['id'];
					foreach ($row AS $cle=>$valeur){
						if ($row[$cle]){
							$safe[$cle] = $valeur;
						}
					}

					// Harmonise les retours chariots
					if (isset($safe['preremplir'])){
						$safe['preremplir'] = cibloc_harmonise_retours_chariots($safe['preremplir']);
					}

					if (isset($return[$type_et_id])){
						$return[$type_et_id] = array_merge($return[$type_et_id],$safe);
					} else {
						$return[$type_et_id] = $safe;
					}
				}
		 */
		uasort($return, 'cibloc_tri_rang');
	}

	return $return;
}

function cibloc_harmonise_retours_chariots($texte) {

	if ($texte and strpos($texte, "\r") !== false) {
		// Harmonise les retours chariots
		$texte = preg_replace(",\r\n?,S", "\n", $texte);
	}

	return $texte;
}

function cibloc_tri_rang($a, $b) {
	$ordre_a = 0;
	$ordre_b = 0;
	if (isset($a['rang'])) {
		$ordre_a = intval($a['rang']);
	}
	if (isset($b['rang'])) {
		$ordre_b = intval($b['rang']);
	}

	return $ordre_a - $ordre_b;
}

function cibloc_imposer_parametrage($valeur = '') {
	$return = false;

	// parametrage par fichier
	$f = _DIR_ETC . '_config_cibloc.php';
	if (@file_exists($f)) {
		include_once($f);
	}

	$valeurs_possibles = [
		'bloc',
		'multi',
		'ensemble',
		'bouton',
		'icones_liste',
		'icones_couleur',
		'divers',
		'couleur',
		'palette',
		'style',
	];

	if (in_array($valeur, $valeurs_possibles)) {
		if (defined('_CIBLOC_' . strtoupper($valeur))) {
			$return = true;
		}
	}

	return $return;
}

function cibloc_contenu_du_parametrage_par_constante($valeur = '') {
	$return = [];

	$valeurs_possibles = [
		'bloc',
		'multi',
		'ensemble',
		'bouton',
		'icones_liste',
		'icones_couleur',
		'divers',
		'couleur',
		'palette',
		'style',
	];

	// parametrage par fichier
	$f = _DIR_ETC . '_config_cibloc.php';
	if (@file_exists($f)) {
		include_once($f);
	}

	if (in_array($valeur, $valeurs_possibles)) {
		$constante = '_CIBLOC_' . strtoupper($valeur);
		$constante_cistyle = '_CISTYLE_' . strtoupper($valeur);
		if (defined($constante)) {
			$return = unserialize(base64_decode(constant($constante)));
		} elseif (in_array($valeur, ['couleur', 'palette', 'style'])) {
			if (defined($constante_cistyle)) {
				$return = unserialize(base64_decode(constant($constante_cistyle)));
			}
		}
	}

	return $return;
}

function cibloc_configuration_des_ensembles() {
	$return = [];
	$safe = [];

	// valeurs par defaut
	include_spip('inc/cibloc_objets');
	$return = cibloc_ensembles_par_defaut();

	$tableau_par_constante = cibloc_contenu_du_parametrage_par_constante('ensemble');
	if ($tableau_par_constante) {
		// le parametrage par constante est prioritaire
		foreach ($tableau_par_constante as $row) {
			$safe = [];
			$type_et_id = $row['type'] . '_' . $row['id'];
			foreach ($row as $cle => $valeur) {
				if ($row[$cle]) {
					$safe[$cle] = $valeur;
				}
			}
			if (isset($return[$type_et_id])) {
				$return[$type_et_id] = array_merge($return[$type_et_id], $safe);
			} else {
				$return[$type_et_id] = $safe;
			}
		}

	} elseif (!cibloc_imposer_parametrage('ensemble')) {
		// configuration objet personnalisee
		$personnalisee = cibloc_config_objet_personnalisee('ensemble');
                foreach ($personnalisee as $type_et_id => $tableau) {
                        foreach ($tableau as $key => $value) {
                            $return[$type_et_id][$key] = $value;
                        }
                }
		/*
				$result = sql_select('*', "spip_cibloc_objets","type='ensemble'");
				while ($row = sql_fetch($result)){
					$safe = array();
					$type_et_id = $row['type'].'_'.$row['id'];
					foreach ($row AS $cle=>$valeur){
						if ($row[$cle]){
							$safe[$cle] = $valeur;
						}
					}

					// Harmonise les retours chariots
					if (isset($safe['preremplir'])){
						$safe['preremplir'] = cibloc_harmonise_retours_chariots($safe['preremplir']);
					}

					if (isset($return[$type_et_id])){
						$return[$type_et_id] = array_merge($return[$type_et_id],$safe);
					} else {
						$return[$type_et_id] = $safe;
					}
				}
		*/
	}

	// ensembles crees localement
	$result = sql_select('*', 'spip_cibloc_objets', "type='ensemble' AND source='creation'");
	while ($row = sql_fetch($result)) {
		$safe = [];
		$type_et_id = $row['type'] . '_' . $row['id'];
		foreach ($row as $cle => $valeur) {
			if ($row[$cle]) {
				$safe[$cle] = $valeur;
			}
		}

		// Harmonise les retours chariots
		if (isset($safe['preremplir'])) {
			$safe['preremplir'] = cibloc_harmonise_retours_chariots($safe['preremplir']);
		}

		if (isset($return[$type_et_id])) {
			$return[$type_et_id] = array_merge($return[$type_et_id], $safe);
		} else {
			$return[$type_et_id] = $safe;
		}
	}
	uasort($return, 'cibloc_tri_rang');

	return $return;
}

function cibloc_tableau_des_icones() {
	$return = [];

	// valeurs par defaut
	include_spip('inc/cibloc_objets');
	$return = cibloc_icones_tableau_par_defaut();

	$tableau_par_constante = cibloc_contenu_du_parametrage_par_constante('icones_liste');
	if ($tableau_par_constante) {
		// la liste par constante est prioritaire
		$return = unserialize($tableau_par_constante[0]['valeur']);

	} elseif (!cibloc_imposer_parametrage('icones_liste')) {
		// liste personnalisee (sans quote)
		$row = sql_fetsel('valeur', 'spip_cibloc_config', "nom='icones_liste'");
		if ($row) {
			if ($row['valeur']) {
				$return = unserialize($row['valeur']);
			}
		}
	}

	return $return;
}

function cibloc_liste_des_icones_sur_une_colonne() {
	return implode(',' . PHP_EOL, cibloc_tableau_des_icones()) . ',';
}

function cibloc_liste_des_icones_en_base64() {
	return base64_encode("'" . implode("','", cibloc_tableau_des_icones()) . "'");
}

function cibloc_tableau_des_couleurs_des_icones() {
	$return = [];

	// valeurs par defaut
	include_spip('inc/cibloc_objets');
	$icones_couleur_par_defaut = cibloc_icones_couleur_par_defaut();

	foreach ($icones_couleur_par_defaut as $cle => $valeurs) {
		$return[$cle] = $valeurs['couleur_icone'];
	}

	$tableau_par_constante = cibloc_contenu_du_parametrage_par_constante('icones_couleur');
	if ($tableau_par_constante) {
		// la liste par constante est prioritaire
		$return = unserialize($tableau_par_constante[0]['valeur']);

	} elseif (!cibloc_imposer_parametrage('icones_couleur')) {
		// config personnalisee
		$config_perso = cibloc_lire_config('icones_couleur');
		if ($config_perso) {
			$return = $config_perso;
		}
		/*
				$row = sql_fetsel('valeur', "spip_cibloc_config","nom='icones_couleur'");
				if ($row){
					if ($row['valeur']){
						$return = unserialize($row['valeur']);
					}
				}
		 */
	}

	return $return;
}

function cibloc_tableau_des_divers() {
	$return = [];

	// valeurs par defaut
	include_spip('inc/cibloc_objets');
	$return = cibloc_divers_par_defaut();

	$tableau_par_constante = cibloc_contenu_du_parametrage_par_constante('divers');
	if ($tableau_par_constante) {
		// la liste par constante est prioritaire
		$return = unserialize($tableau_par_constante[0]['valeur']);

	} elseif (!cibloc_imposer_parametrage('divers')) {
		// config personnalisee
		$config_perso = cibloc_lire_config('divers');
		if ($config_perso) {
			$return = $config_perso;
		}
		/*
				$row = sql_fetsel('valeur', "spip_cibloc_config","nom='divers'");
				if ($row){
					if ($row['valeur']){
						$return = unserialize($row['valeur']);
					}
				}
		 */
	}

	return $return;
}

function cibloc_tableau_couleur_des_divers() {
	$return = [];

	$elements = ['bord_multisansmarge', 'texte_trait', 'bord_ressource', 'icone_ressource'];

	$tableau_des_divers = cibloc_tableau_des_divers();

	foreach ($tableau_des_divers as $key => $value) {
		if (in_array($key, $elements)) {
			$return[$key] = $value;
		}
	}

	return $return;
}

function cibloc_choisir_statut($nom_element = '', $valeur_element = '', $disabled = '') {
	$return = '';
	$selected = '';
	$disabled_texte = '';
	if ($disabled) {
		$disabled_texte = 'disabled="disabled"';
	}
	if (!$valeur_element) {
		$valeur_element = 'active';
	}

	// tableau des valeurs
	$tableau_valeurs = ['active', 'masque', 'desactive'];
	// Parcours du tableau
	$return .= '<select name="' . $nom_element . '" ' . $disabled_texte . '>';
	foreach ($tableau_valeurs as $valeur) {

		if ($valeur == $valeur_element) {
			$selected = ' selected="selected"';
		} else {
			$selected = '';
		}

		// Affichage de la ligne
		$return .= "\t" . '<option value="' . $valeur . '"' . $selected . '>' . _T('cibloc:statut_' . $valeur) . '</option>' . "\n";
	}
	$return .= '</select>' . "\n";

	return $return;
}

function cibloc_choisir_statut_ensemble($nom_element = '', $valeur_element = '', $disabled = '') {
	$return = '';
	$selected = '';
	$disabled_texte = '';
	if ($disabled) {
		$disabled_texte = 'disabled="disabled"';
	}
	if (!$valeur_element) {
		$valeur_element = 'active';
	}

	// tableau des valeurs
	$tableau_valeurs = ['active', 'masque'];
	// Parcours du tableau
	$return .= '<select name="' . $nom_element . '" ' . $disabled_texte . '>';
	foreach ($tableau_valeurs as $valeur) {

		if ($valeur == $valeur_element) {
			$selected = ' selected="selected"';
		} else {
			$selected = '';
		}

		// Affichage de la ligne
		$return .= "\t" . '<option value="' . $valeur . '"' . $selected . '>' . _T('cibloc:statut_ensemble_' . $valeur) . '</option>' . "\n";
	}
	$return .= '</select>' . "\n";

	return $return;
}

function cibloc_bloc_attributs_valeur_par_defaut() {
	// valeurs par defaut
	return [
		'statut' => 'active',
		'couleur' => '',
		'bordure' => 'non',
		'couleur_bordure' => '',
		'alignement' => 'left',
		'padding_top' => '1.0',
		'padding_bottom' => '0.1',
		'padding_right' => '1.0',
		'padding_left' => '1.0',
		'rang' => '0',
		'preremplir' => '',
	];
}

function cibloc_multi_attributs_valeur_par_defaut() {
	// valeurs par defaut
	return [
		'colonne1' => '50',
		'colonne2' => '50',
		'colonne3' => '',
		'colonne4' => '',
		'statut' => 'active',
		'rang' => '0',
	];
}

function cibloc_couleur_fond_pour_constraster($couleur_texte_hexa = '') {
	$return = '';

	if ($couleur_texte_hexa and preg_match(',^#[a-f0-9]{6}$,i', $couleur_texte_hexa)) {
		list($r, $g, $b) = sscanf($couleur_texte_hexa, '#%02x%02x%02x');
		$valeur = (($r * 299) + ($g * 587) + ($b * 114)) / 1000;
		if ($valeur > 180) {
			$return = '#767676';
		}
	}

	return $return;
}

function cibloc_config_objet_personnalisee($type = '') {
	static $done = false;
	static $tableau_configs = [];
	$return = [];

	if ($type) {
		if (!$done) {
			$done = true;
			$rows = sql_allfetsel('*', 'spip_cibloc_objets');
			if ($rows) {
				foreach ($rows as $row) {
					// plusieurs lignes pour un type
					$tableau_configs[$row['type']][] = $row;
				}
			}
		}

		if (isset($tableau_configs[$type])) {
			foreach ($tableau_configs[$type] as $row) {
				$safe = [];
				$type_et_id = $row['type'] . '_' . $row['id'];
				foreach ($row as $cle => $valeur) {
					if ($row[$cle]) {
						$safe[$cle] = $valeur;
					}
				}

				// Harmonise les retours chariots
				if (isset($safe['preremplir'])) {
					$safe['preremplir'] = cibloc_harmonise_retours_chariots($safe['preremplir']);
				}

				if (isset($return[$type_et_id])) {
					$return[$type_et_id] = array_merge($return[$type_et_id], $safe);
				} else {
					$return[$type_et_id] = $safe;
				}
			}
		}
	}

	return $return;
}

function cibloc_lire_config($nom = '') {
	static $done = false;
	static $tableau_configs = [];
	$return = [];

	if ($nom) {
		if (!$done) {
			$done = true;
			$rows = sql_allfetsel('*', 'spip_cibloc_config');
			if ($rows) {
				foreach ($rows as $row) {
					$tableau_configs[$row['nom']] = $row['valeur'];
				}
			}
		}

		if (isset($tableau_configs[$nom])) {
			$return = unserialize($tableau_configs[$nom]);
		}
	}

	return $return;
}
