<?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/cibloc_commun');
include_spip('inc/cibloc_choix_couleur');

// Appel generique
function cibloc_verifier($champ, $texte, $type_et_id = '', $log = false) {

	if (ctype_alnum(str_replace('_', '', $champ)) and function_exists($f = 'cibloc_verifier_' . $champ)) {
		return $f($texte, $type_et_id, $log);
	}
	return false;

}

// Appel generique
function cibloc_verifier_tableau($champ, $tableau, $type_et_id = '', $log = false) {

	if (ctype_alnum(str_replace('_', '', $champ)) and function_exists($f = 'cibloc_verifier_tableau_' . $champ)) {
		return $f($tableau, $type_et_id, $log);
	}
	return false;

}

function cibloc_verifier_id($id = '', $type_et_id = '', $log = false) {
	$return = false;
	if ($id) {
		if (ctype_alnum(str_replace(['_', '|'], '', $id))) {
			$return = true;
		}
	}

	// id interdit si constante
	if ($return) {
		if ($id == 'texteauto' and defined('_CIBLOC_BLOC_TEXTE_AUTOMATIQUE') and _CIBLOC_BLOC_TEXTE_AUTOMATIQUE == 'oui') {
			$return = false;
			spip_log('cibloc definition ' . $type_et_id . ' - id interdit (reserve usage interne)', _LOG_ERREUR);
		}
	}

	if (!$return) {
		spip_log('cibloc definition ' . $type_et_id . ' : id incorrect', _LOG_ERREUR);
	}

	return $return;
}

function cibloc_verifier_type($type = '', $type_et_id = '', $log = false) {
	$return = false;
	if ($type) {
		if (in_array($type, ['bloc', 'colonne', 'multi', 'bouton', 'ensemble', 'texte'])) {
			$return = true;
		}
	}
	if (!$return) {
		spip_log('cibloc definition ' . $type_et_id . ' : type incorrect', _LOG_ERREUR);
	}

	return $return;
}

function cibloc_verifier_nom($nom = '', $type_et_id = '', $log = false) {
	$return = false;
	if ($nom) {
		// supprimer les accents
		include_spip('inc/charsets');
		$tsa = translitteration($nom);

		// interdire les caracteres dangereux sauf ...
		$tableau = ['_', '-', ' ', '%', '(', ')', '.', ',', "'", '/'];
		$tscs = str_replace($tableau, '', $tsa);
		if (ctype_alnum($tscs)) {
			$return = true;
		}
	}

	if (!$return) {
		spip_log('cibloc definition ' . $type_et_id . ' : nom incorrect', _LOG_ERREUR);
	}

	return $return;
}

function cibloc_verifier_constante($constante = '', $type_et_id = '', $log = false) {
	$return = false;
	if ($constante) {
		if (ctype_alnum(str_replace(['_', '-'], '', $constante))) {
			$return = true;
		}
	}

	if (!$return) {
		spip_log('cibloc definition ' . $type_et_id . ' : constante incorrect', _LOG_ERREUR);
	}

	return $return;
}

function cibloc_verifier_paragrapher($paragrapher = '', $type_et_id = '', $log = false) {
	$return = false;

	if ($paragrapher) {
		if (in_array($paragrapher, ['oui', 'non'])) {
			$return = true;
		}
	}

	if (!$return) {
		spip_log('cibloc definition ' . $type_et_id . ' : paragrapher incorrect', _LOG_ERREUR);
	}

	return $return;
}

function cibloc_verifier_code_html_ouvrant($texte = '', $type_et_id = '', $log = false) {
	$return = false;
	if ($texte) {
		if (ctype_alnum(str_replace(['_', ' ', '-', '<', '>', '"', '/', '=', CHR(10), CHR(13)], '', $texte))) {
			if (substr($texte, 0, 4) == '<div' or substr($texte, 0, 5) == '<span') {
				if (strpos($texte, '>') !== false) {
					$return = true;
				}
			}
		}
	} else {
		$return = true;
	}
	if (!$return) {
		spip_log('cibloc definition ' . $type_et_id . ' : code_html_ouvrant incorrect', _LOG_ERREUR);
	}

	return $return;
}

function cibloc_verifier_code_html_fermant($texte = '', $type_et_id = '', $log = false) {
	$return = false;
	if ($texte) {
		if (ctype_alnum(str_replace(['_', ' ', '-', '<', '>', '"', '/', '=', CHR(10), CHR(13)], '', $texte))) {
			if (substr($texte, -6) == '</div>' or substr($texte, -7) == '</span>') {
				$return = true;
			}
		}
	} else {
		$return = true;
	}
	if (!$return) {
		spip_log('cibloc definition ' . $type_et_id . ' : code_html_fermant incorrect', _LOG_ERREUR);
	}

	return $return;
}

function cibloc_verifier_preremplir($texte = '', $type_et_id = '', $log = false) {
	$return = false;
	if ($texte) {
		// supprimer les accents
		include_spip('inc/charsets');
		$tsa = translitteration($texte);
		$tsa = str_replace(['&lt;', '&gt;'], '', spip_htmlspecialchars($tsa));
		if (ctype_alnum(
			str_replace(["'", '/', ':', '\\', '|', ',', '.', '[', ']', '{', '}', '(', ')', '_', ' ', '-', '=', CHR(10), CHR(13)], '', $tsa)
		)) {
			$return = true;
		}
	} else {
		$return = true;
	}
	if (!$return) {
		spip_log('cibloc definition ' . $type_et_id . ' : preremplir incorrect', _LOG_ERREUR);
	}

	return $return;
}

// statut
function cibloc_verifier_statut($texte = '', $type_et_id = '', $log = false) {
	$return = false;
	if (in_array($texte, ['active', 'masque', 'desactive'])) {
		$return = true;
	}
	if (!$return and $log) {
		spip_log('cibloc definition ' . $type_et_id . ' : statut incorrect', _LOG_ERREUR);
	}

	return $return;
}

// couleur
function cibloc_verifier_couleur($texte = '', $type_et_id = '', $log = false) {
	$return = false;

	// tableau des couleurs
	$tableau_nom_des_couleurs = cibloc_tableau_nom_des_couleurs();

	if ($texte == 'transparent' or in_array($texte, $tableau_nom_des_couleurs)) {
		$return = true;
	}
	if (!$return and $log) {
		spip_log('cibloc definition ' . $type_et_id . ' : couleur incorrecte', _LOG_ERREUR);
	}

	return $return;
}

// bordure
function cibloc_verifier_bordure($texte = '', $type_et_id = '', $log = false) {
	$return = false;
	if (in_array($texte, ['non', 'oui', 'ombre'])) {
		$return = true;
	}
	if (!$return and $log) {
		spip_log('cibloc definition ' . $type_et_id . ' : bordure incorrect', _LOG_ERREUR);
	}

	return $return;
}

// couleur_bordure
function cibloc_verifier_couleur_bordure($texte = '', $type_et_id = '', $log = false) {
	$return = false;

	// tableau des couleurs
	$tableau_nom_des_couleurs = cibloc_tableau_nom_des_couleurs();

	if ($texte == 'transparent' or in_array($texte, $tableau_nom_des_couleurs)) {
		$return = true;
	}
	if (!$return and $log) {
		spip_log('cibloc definition ' . $type_et_id . ' : couleur_bordure incorrecte', _LOG_ERREUR);
	}

	return $return;
}

// couleur_bouton
function cibloc_verifier_couleur_bouton($texte = '', $type_et_id = '', $log = false) {
	$return = false;

	// tableau des couleurs
	$tableau_nom_des_couleurs = cibloc_tableau_nom_des_couleurs();

	if ($texte == 'transparent' or in_array($texte, $tableau_nom_des_couleurs)) {
		$return = true;
	}
	if (!$return and $log) {
		spip_log('cibloc definition ' . $type_et_id . ' : couleur_bouton incorrecte', _LOG_ERREUR);
	}

	return $return;
}

// alignement
function cibloc_verifier_alignement($texte = '', $type_et_id = '', $log = false) {
	$return = false;
	if (in_array($texte, ['left', 'center', 'right'])) {
		$return = true;
	}
	if (!$return and $log) {
		spip_log('cibloc definition ' . $type_et_id . ' : alignement incorrect', _LOG_ERREUR);
	}

	return $return;
}

// padding
function cibloc_verifier_padding($texte = '', $type_et_id = '', $log = false) {
	$return = false;
	if (!$texte or is_numeric($texte)) {
		$return = true;
	}
	if (!$return and $log) {
		spip_log('cibloc definition ' . $type_et_id . ' : padding incorrect', _LOG_ERREUR);
	}

	return $return;
}

// rang
function cibloc_verifier_rang($texte, $type_et_id = '', $log = false) {
	$return = false;
	if (ctype_digit($texte)) {
		$return = true;
	}
	if (!$return and $log) {
		spip_log('cibloc definition ' . $type_et_id . ' : rang incorrect', _LOG_ERREUR);
	}

	return $return;
}

// statut
function cibloc_verifier_source($texte = '', $type_et_id = '', $log = false) {
	$return = false;
	if (!$texte or in_array($texte, ['maj', 'creation'])) {
		$return = true;
	}
	if (!$return and $log) {
		spip_log('cibloc definition ' . $type_et_id . ' : source incorrecte', _LOG_ERREUR);
	}

	return $return;
}

// taille_texte
function cibloc_verifier_taille_texte($texte = '', $type_et_id = '', $log = false) {
	$return = false;
	if (!$texte or is_numeric($texte)) {
		$return = true;
	}
	if (!$return and $log) {
		spip_log('cibloc definition ' . $type_et_id . ' : taille_texte incorrect', _LOG_ERREUR);
	}

	return $return;
}

// icones_liste
function cibloc_verifier_tableau_icones_liste($tableau = [], $type_et_id = '', $log = false) {
	$return = false;
	$texte = implode(',', $tableau);
	$safe = str_replace(["'", '"', CHR(10), CHR(13), ' '], '', $texte);
	$safe = trim($safe);
	if (substr($safe, -1) == ',') {
		$safe = substr($safe, 0, -1);
	}
	if (ctype_alnum(str_replace(['-', ','], '', $safe))) {
		$return = true;
	}
	if (!$return and $log) {
		spip_log('cibloc definition ' . $type_et_id . ' : icones_liste incorrect', _LOG_ERREUR);
	}

	return $return;
}

// icones_couleur
function cibloc_verifier_tableau_icones_couleur($tableau = [], $type_et_id = '', $log = false) {
	$return = true;

	// tableau des couleurs
	$tableau_nom_des_couleurs = cibloc_tableau_nom_des_couleurs();

	$valeurs_actuelles = cibloc_tableau_des_couleurs_des_icones();

	foreach ($tableau as $cle => $valeur) {
		if (!in_array($cle, $valeurs_actuelles)
			or ($valeur != 'transparent' and !in_array($valeur, $tableau_nom_des_couleurs))) {
			$return = false;
			break;
		}
	}

	if (!$return and $log) {
		spip_log('cibloc definition ' . $type_et_id . ' : icones_couleur incorrecte', _LOG_ERREUR);
	}

	return $return;
}

// divers
function cibloc_verifier_tableau_divers($tableau = [], $type_et_id = '', $log = false) {
	$return = true;

	// tableau des couleurs
	$tableau_nom_des_couleurs = cibloc_tableau_nom_des_couleurs();

	$valeurs_actuelles = cibloc_tableau_couleur_des_divers();

	foreach ($tableau as $cle => $valeur) {
		if ($cle == 'bloc_ressource_automatique') {
			if (!in_array($valeur, ['non', 'oui'])) {
				$return = false;
				break;
			}
		} elseif (!in_array($cle, $valeurs_actuelles)
			or ($valeur != 'transparent' and !in_array($valeur, $tableau_nom_des_couleurs))) {
			$return = false;
			break;
		}
	}
	if (!$return and $log) {
		spip_log('cibloc definition ' . $type_et_id . ' : divers incorrect', _LOG_ERREUR);
	}

	return $return;
}

// cistyle couleur
function cibloc_verifier_tableau_couleur($tableau = [], $type_et_id = '', $log = false) {
	include_spip('inc/cistyle_commun');
	$return = true;

	// tableau des couleurs
	$tableau_nom_des_couleurs = cistyle_tableau_nom_des_couleurs();

	foreach ($tableau as $cle => $valeur) {
		if (!in_array($cle, $tableau_nom_des_couleurs)
			or (!cistyle_verifier_couleur_hexa($valeur))) {
			$return = false;
			break;
		}
	}

	if (!$return and $log) {
		spip_log('cibloc definition ' . $type_et_id . ' : couleurs de la palette incorrectes', _LOG_ERREUR);
	}

	return $return;
}

// cistyle palette (exception : ce n'est pas un tableau)
function cibloc_verifier_tableau_palette(
	$tableau = '',
	$type_et_id = '',
	$log = false
) {
	include_spip('inc/cistyle_commun');
	$return = false;

	$palette = intval($tableau);
	if ($palette > 0 and $palette <= count(cistyle_tableau_couleurs_palettes()) + 1) {
		$return = true;
	}

	if (!$return and $log) {
		spip_log('cibloc definition ' . $type_et_id . ' : numero de palette incorrect', _LOG_ERREUR);
	}

	return $return;
}

// style
function cibloc_verifier_tableau_style($tableau = [], $type_et_id = '', $log = false) {
	include_spip('inc/cistyle_commun');
	$return = true;

	$cistyle_tableau_nom_des_styles = cistyle_tableau_nom_des_styles();

	foreach ($tableau as $cle => $valeur) {
		if (!in_array($cle, $cistyle_tableau_nom_des_styles)) {
			$return = false;
			break;
		}
		list($balise, $attribut) = explode('_', trim($cle));
		if ($valeur and !cistyle_verifier($attribut, $valeur)) {
			$return = false;
			break;
		}

	}
	if (!$return and $log) {
		spip_log('cibloc definition ' . $type_et_id . ' : style incorrect', _LOG_ERREUR);
	}

	return $return;
}
