<?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_verifier');
include_spip('cibloc_fonctions');
include_spip('inc/texte');

define('_CIBLOC_CHEMIN_DEFINITION_CACHE', _DIR_CACHE . 'cibloc_definition-cache.php');
define('_CIBLOC_CHEMIN_POPIN_CACHE', _DIR_CACHE . 'cibloc_popin-cache.php');

function cibloc_ecrire_cache_definition() {
	$cherche = 'array(';
	$remplace = 'array(';
	$definition_bloc = 'var cibloc_definition_bloc = Array(); ';
	$definition_texte = 'var cibloc_definition_texte = Array(); ';
	$definition_multi = 'var cibloc_definition_multi = Array(); ';
	$definition_ensemble = 'var cibloc_definition_ensemble = Array(); ';
	$cibloc_tableau_php_bloc = [];
	$cibloc_tableau_php_texte = [];
	$cibloc_tableau_php_multi = [];
	$cibloc_tableau_php_ensemble = [];
	$cibloc_liste_bloc = 'array(';
	$cibloc_liste_bloc_popin = 'array(';
	$cibloc_liste_bouton = 'array(';
	$i = 0;
	$j_bloc = 0;
	$j_texte = 0;
	$j_multi = 0;
	$j_ensemble = 0;

	$contenu = '';
	$ressources_en_liste = 'array(';
	$aide_en_ligne = 'array(';

	$cibloc_table_exist = false;
	$res = sql_showbase('spip_cibloc_objets');
	if ($res) {
		if (sql_fetch($res)) {
			$cibloc_table_exist = true;
		}
	}
	if (!$cibloc_table_exist) {
		include_spip('base/cibloc_tables');
		include_spip('base/create');
		include_spip('base/abstract_sql');
		creer_base();
	}

	include_spip('inc/cibloc_objets');

	$definition_brute_des_blocs = array_merge(
		cibloc_configuration_des_blocs(),
		cibloc_configuration_des_multis(),
		cibloc_configuration_des_ensembles(),
		cibloc_colonnes_par_defaut(),
		cibloc_textes_par_defaut(),
		cibloc_configuration_des_boutons()
	);

	if (isset($definition_brute_des_blocs) and is_array($definition_brute_des_blocs)) {
		foreach ($definition_brute_des_blocs as $cle => $bloc) {
			$id = '';
			$type = '';
			$nom = '';
			$constante = '';
			$paragrapher = '';
			$code_html_ouvrant = '';
			$code_html_fermant = '';
			$preremplir = '';
			$preremplir_propre = '';
			$preremplir_popin = '';
			$type_et_id = '';
			$type_et_id_unsafe = '';
			$openwith = '';
			$closewith = '';

			if (isset($bloc['id']) and isset($bloc['type'])) {
				$type_et_id_unsafe = strip_tags($bloc['type'] . '_' . $bloc['id']);
			}

			if (isset($bloc['id']) and cibloc_verifier_id($bloc['id'], $type_et_id_unsafe)) {
				$id = $bloc['id'];
			}
			if (isset($bloc['type']) and cibloc_verifier_type($bloc['type'], $type_et_id_unsafe)) {
				$type = $bloc['type'];
			}
			if (isset($bloc['nom']) and cibloc_verifier_nom($bloc['nom'], $type_et_id_unsafe)) {
				$nom = texte_script($bloc['nom']);
			}
			if (isset($bloc['constante']) and cibloc_verifier_constante($bloc['constante'], $type_et_id_unsafe)) {
				$constante = texte_script($bloc['constante']);
			}
			if (isset($bloc['paragrapher']) and cibloc_verifier_paragrapher($bloc['paragrapher'], $type_et_id_unsafe)) {
				$paragrapher = $bloc['paragrapher'];
			}
			if (isset($bloc['code_html_ouvrant']) and cibloc_verifier_code_html_ouvrant(
				$bloc['code_html_ouvrant'],
				$type_et_id_unsafe
			)) {
				$code_html_ouvrant = $bloc['code_html_ouvrant'];
			}
			if (isset($bloc['code_html_fermant']) and cibloc_verifier_code_html_fermant(
				$bloc['code_html_fermant'],
				$type_et_id_unsafe
			)) {
				$code_html_fermant = $bloc['code_html_fermant'];
			}
			if (isset($bloc['preremplir']) and cibloc_verifier_preremplir($bloc['preremplir'], $type_et_id_unsafe)) {
				$preremplir = '\n' . str_replace([CHR(10), CHR(13)], '\n', $bloc['preremplir']) . '\n';
				if (in_array($type, ['bloc', 'texte', 'multi', 'ensemble'])) {
					$preremplir_propre = $bloc['preremplir'];
				}
			}

			$cibloc_ressources_en_liste = '';
			$tableau_des_divers = cibloc_tableau_des_divers();
			if (isset($tableau_des_divers['bloc_ressource_automatique'])
					and $tableau_des_divers['bloc_ressource_automatique'] == 'oui') {

				$cibloc_ressources_en_liste = "if (!defined('_CIBLOC_BLOC_RESSOURCES_AUTOMATIQUE')) { define('_CIBLOC_BLOC_RESSOURCES_AUTOMATIQUE', 'oui'); }" . PHP_EOL;
			}

			if ($id and $type) {
				$type_et_id = $type . '_' . $id;

				// Exception pour l'id interne 'defaut'
				if ($id == 'defaut') {
					$type_et_id = $type;
				} elseif ($id == 'defautvide') {
					$type_et_id = $type . '_vide';
				}

				// Pour les types 'bloc' et 'colonne', mettre imperativement <p> et </p> sinon les sauts de lignes ne sont pas pris en compte par SPIP
				$p_debut = '';
				$p_fin = '';
				if (in_array($type, ['bloc', 'colonne', 'texte'])) {
					if (!$paragrapher or $paragrapher == 'oui') {
						$p_debut = '<p>';
						$p_fin = '</p>';
					}
				}

				// Ne pas prendre en compte les id tels que : colonnes|50|50
				if (strpos($id, '|') === false and $type != 'ensemble'
						and (!isset($bloc['statut'])
						or (isset($bloc['statut']) and $bloc['statut'] != 'desactive'))) {
					$cherche .= "'[" . $type_et_id . "]',";
					$cherche .= "'[/" . $type_et_id . "]',";

					if ($code_html_ouvrant) {
						$remplace .= "'" . cibloc_ajout_classes($id, $type, $bloc['code_html_ouvrant']) . $p_debut . "',";
					} else {
						$remplace .= "'" . '<div class="cibloc ci' . $type . '_' . $id . '">' . $p_debut . "',";
					}
					if ($code_html_fermant) {
						$remplace .= "'" . $p_fin . $bloc['code_html_fermant'] . "',";
					} else {
						$remplace .= "'" . '</div>' . "',";
					}
				}

				// condition par une constante
				if ($constante == '_CIBLOC_BLOC_RESSOURCES_AUTOMATIQUE') {
					if (!$cibloc_ressources_en_liste) {
						$bloc['statut'] = 'desactive';
					}
				} elseif ($constante and !(defined($constante) and constant($constante) == 'oui')) {
					$bloc['statut'] = 'desactive';
				}

				// A afficher dans la popin
				if (in_array($type, ['bloc', 'texte', 'multi', 'ensemble'])
						and (!isset($bloc['statut'])
						or (isset($bloc['statut']) and $bloc['statut'] == 'active'))) {
					$openwith = cibloc_openWith($type, $id, $preremplir);
					$closewith = cibloc_closeWith($type, $id, $preremplir);
					if (in_array($type, ['bloc', 'texte', 'multi'])) {
						$preremplir_popin = cibloc_openWith($type, $id, $preremplir_propre) . cibloc_closeWith(
							$type,
							$id,
							$preremplir_propre
						);
					}

					if ($type == 'bloc') {
						$definition_bloc .= 'cibloc_definition_bloc[' . $j_bloc . '] = Array("' . $id . '","' . $openwith . '","' . $closewith . '"); ';
						$aide_en_ligne .= 'array("' . $nom . '","[' . $type_et_id . '] [/' . $type_et_id . ']",""),';
						$cibloc_tableau_php_bloc[$j_bloc] = [$id, $nom, '', $preremplir_popin, $paragrapher];

						$cibloc_liste_bloc_popin .= "'" . $type . '_' . $id . "',";

						$j_bloc++;
					} elseif ($type == 'texte') {
						$definition_texte .= 'cibloc_definition_texte[' . $j_texte . '] = Array("' . $id . '","' . $openwith . '","' . $closewith . '"); ';
						$aide_en_ligne .= 'array("' . $nom . '","[' . $type_et_id . '] [/' . $type_et_id . ']",""),';
						$cibloc_tableau_php_texte[$j_texte] = [$id, $nom, '', $preremplir_popin, $paragrapher];
						$j_texte++;
					} elseif ($type == 'multi') {
						$definition_multi .= 'cibloc_definition_multi[' . $j_multi . '] = Array("' . $id . '","' . $openwith . '","' . $closewith . '"); ';
						$aide_en_ligne .= 'array("' . $nom . '","' . str_replace(
							"\n",
							'',
							cibloc_openWith($type, $id) . cibloc_closeWith($type, $id)
						) . '",""),';
						$cibloc_tableau_php_multi[$j_multi] = [$id, $nom, '', $preremplir_popin, $paragrapher];
						$j_multi++;
					} elseif ($type == 'ensemble') {
						$definition_ensemble .= 'cibloc_definition_ensemble[' . $j_ensemble . '] = Array("' . $id . '","' . $openwith . '","' . $closewith . '"); ';
						$cibloc_tableau_php_ensemble[$j_ensemble] = [$id, $nom, '', $preremplir_propre, $paragrapher];
						$j_ensemble++;
					}
				}

				if ($type == 'bloc') {
					$cibloc_liste_bloc .= "'" . $type . '_' . $id . "',";
				} elseif ($type == 'bouton') {
					$cibloc_liste_bouton .= "'" . $type . '_' . $id . "',";
				}

			}
		}
	}

	$cherche .= ');';
	$remplace .= ');';
	$cibloc_liste_bloc .= ');';
	$cibloc_liste_bloc_popin .= ');';
	$cibloc_liste_bouton .= ');';

	$aide_en_ligne .= ');';
	$commentaire_definition = "// Plugin cibloc - cache des definitions \n";

	$contenu_definition = "\n" . $commentaire_definition . "\n"
	. "if (defined('_ECRIRE_INC_VERSION'))"
	. "{\n"
	. $cibloc_ressources_en_liste
	. "function cibloc_definition_cherche(){\n"
	. 'return ' . $cherche . "\n}\n"
	. "function cibloc_definition_remplace(){\n"
	. 'return ' . $remplace . "\n}\n"
	. "function cibloc_definition_bloc(){\n"
	. "return '" . base64_encode($definition_bloc) . "';\n}\n"
	. "function cibloc_definition_texte(){\n"
	. "return '" . base64_encode($definition_texte) . "';\n}\n"
	. "function cibloc_definition_multi(){\n"
	. "return '" . base64_encode($definition_multi) . "';\n}\n"
	. "function cibloc_definition_ensemble(){\n"
	. "return '" . base64_encode($definition_ensemble) . "';\n}\n"
	. "function cibloc_liste_bloc(){\n"
	. 'return ' . $cibloc_liste_bloc . "\n}\n"
	. "function cibloc_liste_bloc_popin(){\n"
	. 'return ' . $cibloc_liste_bloc_popin . "\n}\n"
	. "function cibloc_liste_bouton(){\n"
	. 'return ' . $cibloc_liste_bouton . "\n}\n"
	. "function cibloc_aide_en_ligne(){\n"
	. 'return ' . $aide_en_ligne . ";\n}\n"
	. "}\n";

	$ok = ecrire_fichier(_CIBLOC_CHEMIN_DEFINITION_CACHE, '<' . '?php' . $contenu_definition . '?' . '>');

	if ($ok) {
		cibloc_ecrire_cache_popin(
			$cibloc_tableau_php_bloc,
			$cibloc_tableau_php_texte,
			$cibloc_tableau_php_multi,
			$cibloc_tableau_php_ensemble
		);
	}
}

function cibloc_ecrire_cache_popin(
	$cibloc_tableau_php_bloc,
	$cibloc_tableau_php_texte,
	$cibloc_tableau_php_multi,
	$cibloc_tableau_php_ensemble
) {

	$commentaire_popin = "// Plugin cibloc - cache des popin \n";

	$contenu_popin = "\n" . $commentaire_popin . "\n"
	. "if (defined('_ECRIRE_INC_VERSION'))"
	. "{\n"
	. "function cibloc_popin_bloc(){\n"
	. "return '" . base64_encode(
		cibloc_affichage_php_bloc($cibloc_tableau_php_bloc)
	) . "';\n}\n"
	. "function cibloc_popin_texte(){\n"
	. "return '" . base64_encode(
		cibloc_affichage_php_texte($cibloc_tableau_php_texte)
	) . "';\n}\n"
	. "function cibloc_popin_multi(){\n"
	. "return '" . base64_encode(
		cibloc_affichage_php_multi($cibloc_tableau_php_multi)
	) . "';\n}\n"
	. "function cibloc_popin_ensemble(){\n"
	. "return '" . base64_encode(
		cibloc_affichage_php_ensemble($cibloc_tableau_php_ensemble)
	) . "';\n}\n"
	. "}\n";

	ecrire_fichier(_CIBLOC_CHEMIN_POPIN_CACHE, '<' . '?php' . $contenu_popin . '?' . '>');

}

function cibloc_openWith($type, $id, $preremplir = '') {
	$return = '';

	if (in_array($type, ['bloc', 'colonne', 'multi', 'bouton', 'texte'])) {
		if ($type == 'multi' and $id and strpos($id, '|') !== false) {
			/*
			L'id est "colonnes" suivi des id de colonnes separes par le carcatere pipe.
			Par exemple, si 'colonnes|50|50' est selectionne par le redacteur,
			c'est la combinaison suivante qui sera inseree automatiquement
			dans le texte de l'article (avec en plus le contenu de <preremplir></preremplir>) :
			[multi_colonnes]
			[colonne_50]
			[/colonne_50]
			[colonne_50]
			[/colonne_50]
			[/multi_colonnes]
			Dans cet exemple, cibloc_openWith se charge des 2 premieres lignes.
			*/
			$tableau = explode(
				'|',
				$id
			);
			$return = '[' . $type . '_' . $tableau[0] . ']\n[colonne_' . $tableau[1] . ']' . $preremplir;
		} else {
			$return = '[' . $type . '_' . $id . ']';

			// Exception pour l'id interne 'defaut'
			if ($id == 'defaut') {
				$return = '[' . $type . ']';
			}
		}
	} else {
		$return = ''; // important
	}

	return $return;
}

function cibloc_closeWith($type, $id, $preremplir = '') {
	$return = '';

	if (in_array($type, ['bloc', 'colonne', 'multi', 'bouton', 'texte'])) {
		if ($id and strpos($id, '|') !== false) {
			/*
			L'id est "colonnes" suivi des id de colonnes separes par le carcatere pipe.
			Par exemple, si 'colonnes|50|50' est selectionne par le redacteur,
			c'est la combinaison suivante qui sera inseree automatiquement
			dans le texte de l'article (avec en plus le contenu de <preremplir></preremplir>) :
			[multi_colonnes]
			[colonne_50]
			[/colonne_50]
			[colonne_50]
			[/colonne_50]
			[/multi_colonnes]
			Dans cet exemple, cibloc_closeWith se charge de toutes les lignes (sauf les 2 premieres)
			*/
			$tableau = explode(
				'|',
				$id
			);
			$return .= '[/colonne_' . $tableau[1] . ']\n';
			for ($i = 2; $i < count($tableau); $i++) {
				$return .= '[colonne_' . $tableau[$i] . ']' . $preremplir;
				$return .= '[/colonne_' . $tableau[$i] . ']\n';
			}
			$return .= '[/' . $type . '_' . $tableau[0] . ']';

		} else {
			$return = $preremplir . '[/' . $type . '_' . $id . ']';

			// Exception pour l'id interne 'defaut'
			if ($id == 'defaut') {
				$return = $preremplir . '[/' . $type . ']';
			}
		}
	} else {
		$return = $preremplir; // important
	}

	return $return;
}

// Ajout au premier div (ou span) la classe cibloc et une classe avec son id avec le prefixe 'ci' + $type + '_'
// Exemple : passer de '<div class="test">' a '<div class="cibloc cibloc_bordure test">'
function cibloc_ajout_classes(
	$id,
	$type,
	$texte
) {
	$first_div = '';

	// Pour les types 'bloc' et 'multi' uniquement
	if ($texte and $type and in_array($type, ['bloc', 'multi'])) {
		// presence du '>' deja verifie en amont
		$fin_first_div = strpos($texte, '>');
		$first_div = substr($texte, 0, $fin_first_div + 1);
		$class_existe = false;
		$espace = '';
		if (strpos($first_div, 'class="') !== false) {
			$class_existe = true;
		}

		if ($class_existe and strpos($first_div, 'class=""') === false) {
			$espace = ' ';
		}

		$cibloc = 'cibloc ';

		// avec classe
		if ($class_existe) {
			$first_div = str_replace('class="', 'class="' . $cibloc . 'ci' . $type . '_' . $id . $espace, $first_div);
			// sans classe
		} else {
			$first_div = str_replace('>', ' class="' . $cibloc . 'ci' . $type . '_' . $id . '">', $first_div);
		}

		$return = $first_div . substr($texte, $fin_first_div + 1);
	} else {
		$return = $texte;
	}

	return $return;
}

function cibloc_affichage_php_bloc($tableau_de_tableaux = [], $public = false) {
	$liste = '';
	$libelle_titre = '';
	$libelle_inserer = _T('cibloc:inserer');
	$i = 0;

	foreach ($tableau_de_tableaux as $tableau) {
		$libelle_titre = str_replace("\'", "'", $tableau[1]);
		$liste .= '<li><a href="#" onclick="cibloc_js_choix_bloc(' . $i . ');" class="cibloc_titre_bloc" title="' . $libelle_inserer . ' ' . $libelle_titre . '">' . $libelle_titre . '</a>';
		$liste .= '<a href="#" onclick="cibloc_js_choix_bloc(' . $i . ');" class="cibloc_sans_vignette_lien" title="' . $libelle_inserer . ' ' . $libelle_titre . '"><div class="cibloc_sans_vignette cibloc_sans_vignette_' . $tableau[0] . '">';
		$liste .= cibloc_preremplir_propre($tableau[3], $tableau[4]);
		$liste .= '</div></a></li>';
		$i++;
	}

	return '<ul>' . $liste . '</ul>';
}

function cibloc_affichage_php_texte($tableau_de_tableaux = []) {
	$liste = '';
	$libelle_titre = '';
	$libelle_inserer = _T('cibloc:inserer');
	$i = 0;

	foreach ($tableau_de_tableaux as $tableau) {
		$libelle_titre = str_replace("\'", "'", $tableau[1]);
		$liste .= '<li><a href="#" onclick="cibloc_js_choix_texte(' . $i . ');" class="cibloc_titre_bloc" title="' . $libelle_inserer . ' ' . $libelle_titre . '">' . $libelle_titre . '</a>';
		$liste .= '<a href="#" onclick="cibloc_js_choix_texte(' . $i . ');" class="cibloc_sans_vignette_lien" title="' . $libelle_inserer . ' ' . $libelle_titre . '"><div class="cibloc_sans_vignette cibloc_sans_vignette_texte_' . $tableau[0] . '">';
		$liste .= cibloc_preremplir_propre($tableau[3]);
		$liste .= '</div></a></li>';
		$i++;
	}

	return '<ul>' . $liste . '</ul>';
}

function cibloc_affichage_php_multi($tableau_de_tableaux = []) {
	$liste = '';
	$libelle_titre = '';
	$libelle_inserer = _T('cibloc:inserer');
	$i = 0;

	foreach ($tableau_de_tableaux as $tableau) {
		$libelle_titre = str_replace("\'", "'", $tableau[1]);
		$liste .= '<li><a href="#" onclick="cibloc_js_choix_multi(' . $i . ');" class="cibloc_titre_bloc" title="' . $libelle_inserer . ' ' . $libelle_titre . '">' . $libelle_titre . '</a>';
		$liste .= '<a href="#" onclick="cibloc_js_choix_multi(' . $i . ');" class="cibloc_sans_vignette_lien" title="' . $libelle_inserer . ' ' . $libelle_titre . '"><div class="cibloc_sans_vignette">';
		$liste .= cibloc_preremplir_propre($tableau[3], $tableau[4]);
		$liste .= '</div></a></li>';
		$i++;
	}

	return '<ul>' . $liste . '</ul>';
}

function cibloc_affichage_php_ensemble($tableau_de_tableaux = []) {
	$liste = '';
	$libelle_titre = '';
	$libelle_inserer = _T('cibloc:inserer');
	$i = 0;

	foreach ($tableau_de_tableaux as $tableau) {
		$libelle_titre = str_replace("\'", "'", $tableau[1]);
		$liste .= '<li><a href="#" onclick="cibloc_js_choix_ensemble(' . $i . ');" class="cibloc_titre_bloc" title="' . $libelle_inserer . ' ' . $libelle_titre . '">' . $libelle_titre . '</a>';
		$liste .= '<a href="#" onclick="cibloc_js_choix_ensemble(' . $i . ');" class="cibloc_sans_vignette_lien" title="' . $libelle_inserer . ' ' . $libelle_titre . '"><div class="cibloc_sans_vignette cibloc_sans_vignette_' . $tableau[0] . '">';
		$liste .= cibloc_preremplir_propre($tableau[3], $tableau[4]);
		$liste .= '</div></a></li>';
		$i++;
	}

	return '<ul>' . $liste . '</ul>';
}

function cibloc_preremplir_propre($preremplir_propre, $paragrapher = '') {
	include_spip('inc/texte');

	// traitement de spip (ne pas mettre post_autobr)
	//    $preremplir_propre = propre(post_autobr($preremplir_propre),'');
	$preremplir_propre = propre(
		$preremplir_propre,
		''
	);

	// le cas echeant, retirer les <p> </p>
	if ($paragrapher and $paragrapher == 'non') {
		$preremplir_propre = str_replace('<p>', '', $preremplir_propre);
		$preremplir_propre = str_replace('</p>', '', $preremplir_propre);
	}
	// remplacer les liens
	$preremplir_propre = str_replace('<a ', '<span ', $preremplir_propre);
	$preremplir_propre = str_replace('</a>', '</span>', $preremplir_propre);

	// remplacer les \n
	$preremplir_propre = str_replace('\n', '', $preremplir_propre);
	// chemin des images, etc.
	//    if (cibloc_acces_depuis_site_public()=='oui'){
	//        $preremplir_propre = str_replace('../plugins','plugins',$preremplir_propre);
	//    }
	// important
	$preremplir_propre = str_replace('<p></p>', '', $preremplir_propre);

	return $preremplir_propre;
}

function cibloc_chemin_img($chemin) {
	$debut_src_img = '../';
	//    if (cibloc_acces_depuis_site_public()=='oui'){
	//        $debut_src_img = '';
	//    }

	return $debut_src_img . $chemin;
}
