예제 #1
0
function spiplistes_afficher_pile_messages() {

	$sql_select = "id_liste,titre,date,maj,periode,patron,statut";
	$list = sql_select($sql_select, 'spip_listes', "message_auto='oui' AND date > 0");

	if (sql_count($list) == 0) {
		return (false); 
	}
	
	$pile_result = ""
		. debut_cadre_enfonce(_DIR_PLUGIN_SPIPLISTES_IMG_PACK.'stock_timer.gif', true, ''
			, _T('spiplistes:Messages_automatiques').spiplistes_plugin_aide(_SPIPLISTES_EXEC_AIDE, "casier_courriers"))
		. "\n"
		. "<table class='spiplistes-tab' width='100%'  border='0' cellspacing='1' cellpadding='0'>\n" 
		. "<tr>\n"
		. "<th>"._T('spiplistes:envoi_patron')."</th>\n"
		. "<th>"._T('spiplistes:sur_liste')."</th>\n"
		. "<th>"._T('spiplistes:prochain_envoi_prevu')."</th>\n"
		. "</tr>\n"
		;

	$couleur_ligne = 1;
	while($row = sql_fetch($list)) {
		foreach(explode(",", $sql_select) as $key) {
			$$key = $row[$key];
		}
	
		$date_dernier = date(_T('spiplistes:format_date'), strtotime($maj)) ;
		switch($statut) {
			case _SPIPLISTES_LIST_PRIV_HEBDO:
			case _SPIPLISTES_LIST_PRIV_WEEKLY:
			case _SPIPLISTES_LIST_PUB_HEBDO:
			case _SPIPLISTES_LIST_PUB_WEEKLY:
				$periodicite = _T('spiplistes:Liste_hebdo');
				break;
			case _SPIPLISTES_LIST_PRIV_MENSUEL:
			case _SPIPLISTES_LIST_PRIV_MONTHLY:
			case _SPIPLISTES_LIST_PUB_MENSUEL:
			case _SPIPLISTES_LIST_PUB_MONTHLY:
				$periodicite = _T('spiplistes:Liste_mensuelle');
				break;
			case _SPIPLISTES_LIST_PRIV_YEARLY:
			case _SPIPLISTES_LIST_PUB_YEARLY:
				$periodicite = _T('spiplistes:Liste_annuelle');
				break;
			case _SPIPLISTES_LIST_PRIV_DAILY:
			case _SPIPLISTES_LIST_PUB_DAILY:
				if($periode) {
					$periodicite = _T('spiplistes:Tous_les_s'
					, array('s' => spiplistes_singulier_pluriel_str_get($periode, _T('spiplistes:jour'), _T('spiplistes:jours')))
					);
				} else {
					$periodicite = _T('spiplistes:Listes_autre');
				}
				break;
			default:
				$periodicite = _T('spiplistes:envoi_manuel');
		}
	
		$ii = 0;
		$pile_result .= ''
			. '<tr ' . ((($couleur_ligne++) % 2) ? 'class="row-even"' : '') . '>' . PHP_EOL
			. '<td><a href="' . generer_url_public('patron_switch',"patron=$patron&date=$date_dernier").'">'.$patron.'</a>'
			. '<br />'.$periodicite.'</td>' . PHP_EOL
			. '<td><a href="' . generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_GERER, 'id_liste='.$id_liste) . '">'
				. $titre . '</a>'
			. '<br />'.spiplistes_nb_abonnes_liste_str_get($id_liste).'.'
			. '</td>'
			. '<td>'
			. spiplistes_affdate ($date)
			. '</td></tr>' . PHP_EOL
			;
	} // end while
	
	$pile_result .= ""
		. "</table>\n"
		. fin_cadre_enfonce(true)
		;
	return ($pile_result);
	
} // end spiplistes_afficher_pile_messages()
예제 #2
0
function exec_spiplistes_liste_gerer () {

	include_spip('inc/autoriser');
	include_spip('inc/mots');
	include_spip('inc/lang');
	include_spip('inc/editer_auteurs');
	include_spip('base/spiplistes_tables');
	include_spip('inc/spiplistes_api');
	include_spip('inc/spiplistes_api_presentation');
	include_spip('inc/spiplistes_dater_envoi');
	include_spip('inc/spiplistes_naviguer_paniers');
	include_spip('inc/spiplistes_listes_selectionner_auteur');
	
	global $meta
		, $connect_statut
		, $connect_toutes_rubriques
		, $connect_id_auteur
		, $spip_lang_left
		, $spip_lang_right
		, $couleur_claire
		;

	// initialise les variables postees par le formulaire
	foreach(array(
		'new'	// nouvelle liste si 'oui'
		, 'id_liste'// si modif dans l'editeur
		, 'btn_liste_edit', 'titre', 'texte', 'pied_page' // renvoyes par l'editeur
		, 'btn_modifier_diffusion', 'changer_lang', 'statut' // local
		, 'btn_modifier_replyto', 'email_envoi' // local
		, 'btn_modifier_courrier_auto', 'message_auto' // local
			, 'auto_chrono', 'auto_weekly', 'auto_mois'
			, 'titre_message', 'patron', 'periode', 'envoyer_maintenant'
			, 'jour', 'mois', 'annee', 'heure', 'minute'
		, 'btn_patron_pied', 'btn_grand_patron' // boites gauches
		, 'btn_valider_forcer_abos', 'forcer_abo', 'forcer_format_abo', 'forcer_format_reception'
		, 'btn_supprimer_liste' //local
		) as $key) {
		$$key = _request($key);
	}
	foreach(array('id_liste', 'periode') as $key) {
		$$key = intval($$key);
	}
	foreach(array('titre', 'texte', 'pied_page') as $key) {
		$$key = trim(corriger_caracteres($$key));
	}
	$lang = $changer_lang;

	$cherche_auteur = _request('cherche_auteur');
	$debut = _request('debut');

	$envoyer_maintenant = ($envoyer_maintenant == 'oui');
	
	$boite_pour_confirmer_envoi_maintenant = 
		$grosse_boite_moderateurs = 
		$message_erreur =
		$page_result = "";

	if(!$id_liste)
	{
	//////////////////////////////////////////////////////
	// Creer une liste
	////
		// admin lambda peut creer une liste
		$flag_editable = ($connect_statut == "0minirezo");
		
		if ($btn_liste_edit && ($new=='oui')) {
			
			if ($titre == '') {
				$titre = _T('spiplistes:liste_sans_titre');
			}
			
			$pied_page = _SPIPLISTES_PATRON_PIED_DEFAUT;
			
			if($id_liste = spiplistes_listes_liste_creer(_SPIPLISTES_LIST_PRIVATE, $GLOBALS['spip_lang']
				, $titre, $texte, $pied_page)) {
					spiplistes_log("id_liste #$id_liste added by id_auteur #$connect_id_auteur");
			}
		} 	
	}
	else if($id_liste > 0)
	{
	//////////////////////////////////////////////////////
	// Modifier une liste
	////
		// les admins toutes rubriques et le moderateur seuls peuvent modifier la liste
		$flag_editable = autoriser('moderer', 'liste', $id_liste);

		if($flag_editable)
		{
		
			// Recupere les donnees de la liste courante pour optimiser l'update
			$sql_select = "statut,titre,date,lang";
			$sql_result = sql_select($sql_select, "spip_listes", "id_liste=".sql_quote($id_liste), "", "", "1");
			if($row = sql_fetch($sql_result)) {
				foreach(explode(",", $sql_select) as $key) {
					$current_liste[$key] = $row[$key];
				}
			}
			
			///////////////////////////////////
			// Les modifications (sql_upadteq)
			// A noter, ne pas preparer les valeurs par sql_quote()
			//  sql_upadteq() s'en occupe
			
			$sql_champs = array();

			// Retour de l'editeur ?
			if($btn_liste_edit) {
				$titre = corriger_caracteres($titre);
				$texte = corriger_caracteres($texte);
				if(empty($titre)) {
					$titre = filtrer_entites(_T('spiplistes:Nouvelle_liste_de_diffusion'));
				}
				$sql_champs['titre'] = $titre;
				$sql_champs['texte'] = $texte;
			}
			
			// Modifier le grand patron ?
			// a partir de 2.0049, le patron de pied est construit par la meleuse
			// afin de permettre _texte et multilingue
			if($btn_grand_patron && $patron) {
				$sql_champs['patron'] = $patron;
			}
			
			// Modifier patron de pied ?
			if($btn_patron_pied && $patron) {
				$sql_champs['pied_page'] = $patron;
			}
			
			// Modifier diffusion ?
			if($btn_modifier_diffusion)
			{
				$current_statut = ($statut)
					? $statut
					: $current_liste['statut']
					;
					
				spiplistes_debug_log ('Modification diffusion statut: '.$current_statut);
				
				// Modifier le statut ?
				if(in_array($statut, explode(";", _SPIPLISTES_LISTES_STATUTS_TOUS)) 
					&& ($statut != $current_liste['statut'])
				) {
					spiplistes_debug_log ('Modification statut: '.$statut);
					$sql_champs['statut'] = $statut;
					// si la liste passe en privee, retire les invites
					if($statut == _SPIPLISTES_LIST_PRIVATE) {
						$auteur_statut = '6forum';
						spiplistes_abonnements_auteurs_supprimer($auteur_statut);
						spiplistes_log("AUTEURS ($auteur_statut) REMOVED FROM LISTE #$id_liste ($statut) BY ID_AUTEUR #$connect_id_auteur");
					}
				}
				// Modifier la langue ?
				if(!empty($lang) && ($lang!=$current_liste['lang'])) {
					$sql_champs['lang'] = $lang;
				}
			}
			
			// Modifier l'adresse email de reponse ?
			if($btn_modifier_replyto && email_valide($email_envoi) && ($email_envoi!=$current_liste['email_envoi'])) {
				$sql_champs['email_envoi'] = $email_envoi;
			}

			////////////////////////////////////
			// Modifier message_auto ?
			// bloc "courriers automatiques"
			if($btn_modifier_courrier_auto)
			{
				$current_statut = ($statut)
					? $statut
					: $current_liste['statut']
					;
					
				spiplistes_debug_log ('Modification periodicite statut: '.$current_statut);
				
				$envoyer_quand = spiplistes_formate_date_form($annee, $mois, $jour, $heure, $minute);
			
				if(time() > strtotime($envoyer_quand)) {
				// envoi dans le passe est considere comme envoyer maintenant
					$envoyer_maintenant = true;
					$date_depuis = $envoyer_quand;
					$envoyer_quand = false;
				}
				// spiplistes_debug_log("nb vrais abos : ".spiplistes_listes_vrais_abos_compter($id_liste));
				if($envoyer_maintenant && ($message_auto != 'non')) {
					if(!spiplistes_listes_vrais_abos_compter($id_liste)) {
						$boite_pour_confirmer_envoi_maintenant .= 
							spiplistes_boite_alerte(_T('spiplistes:boite_alerte_manque_vrais_abos'), true);
					}
					else {
						$boite_pour_confirmer_envoi_maintenant = ""
							. debut_cadre_couleur('', true)
							// formulaire de confirmation envoi
							. spiplistes_form_debut(generer_url_ecrire(_SPIPLISTES_EXEC_LISTES_LISTE), true)
							. "<p style='text-align:center;font-weight:bold;' class='verdana2'>"
							. _T('spiplistes:boite_confirmez_envoi_liste') . "</p>"
							. "<input type='hidden' name='id_liste' value='$id_liste' />\n"
							. spiplistes_form_bouton_valider('btn_confirmer_envoi_maintenant')
							. spiplistes_form_fin(true)
							. fin_cadre_couleur(true)
							;
					}
					$date_prevue = normaliser_date(time());
				}

				if($message_auto == 'oui') {
				
					$sql_champs['message_auto'] = 'oui';
					$sql_champs['titre_message'] = $titre_message;
					$sql_champs['date'] = (!$envoyer_maintenant) ? $envoyer_quand : '';
					
					switch($auto_chrono) {
						case 'auto_jour':
							$sql_champs['statut'] =
								($current_statut == _SPIPLISTES_LIST_PRIVATE)
								? _SPIPLISTES_LIST_PRIV_DAILY
								: _SPIPLISTES_LIST_PUB_DAILY
								;
							// force au minimum 1 jour
							$sql_champs['periode'] = (($periode > 0) ? $periode : 1);
							break;
						case 'auto_hebdo':
							if($auto_weekly == 'oui') {
								// debut de semaine ?
								$sql_champs['statut'] =
									($current_statut == _SPIPLISTES_LIST_PRIVATE)
									? _SPIPLISTES_LIST_PRIV_WEEKLY
									: _SPIPLISTES_LIST_PUB_WEEKLY
									;
								// corrige la date pour le lundi de la semaine
								$time = strtotime($envoyer_quand);
								$time = mktime(0,0,0,date("m", $time),date("d", $time)-date("w", $time)+1,date("Y", $time));
    							$envoyer_quand = date("Y-m-d H:i:s", $time);
	 							$sql_champs['date'] = $envoyer_quand;
							} else {
								$sql_champs['statut'] =
									($current_statut == _SPIPLISTES_LIST_PRIVATE)
									? _SPIPLISTES_LIST_PRIV_HEBDO
									: _SPIPLISTES_LIST_PUB_HEBDO
									;
							}
							$sql_champs['periode'] = 0;
							break;
						case 'auto_mensuel':
							if($auto_mois == 'oui') {
								// debut du mois ?
								$sql_champs['statut'] =
									($current_statut == _SPIPLISTES_LIST_PRIVATE)
									? _SPIPLISTES_LIST_PRIV_MONTHLY
									: _SPIPLISTES_LIST_PUB_MONTHLY
									;
								// corrige la date, 1' du mois
								$envoyer_quand = substr($envoyer_quand, 0, 8)."01 00:00:00";
								$sql_champs['date'] = $envoyer_quand;
							} else {
								$sql_champs['statut'] =
									($current_statut == _SPIPLISTES_LIST_PRIVATE)
									? _SPIPLISTES_LIST_PRIV_MENSUEL
									: _SPIPLISTES_LIST_PUB_MENSUEL
									;
							}
							$sql_champs['periode'] = 0;
							break;
						case 'auto_an':
							$sql_champs['statut'] =
								($current_statut == _SPIPLISTES_LIST_PRIVATE)
								? _SPIPLISTES_LIST_PRIV_YEARLY
								: _SPIPLISTES_LIST_PUB_YEARLY
								;
							$sql_champs['periode'] = 0;
							break;
					}
				}
				else if($message_auto == 'non') {
					$sql_champs['message_auto'] = 'non';
					$sql_champs['date'] = '';
					$sql_champs['periode'] = 0;
				}
			} // end if($btn_modifier_courrier_auto)
			
			// Enregistre les modifs pour cette liste
			if(count($sql_champs))
			{
				sql_updateq('spip_listes', $sql_champs, 'id_liste='.sql_quote($id_liste).' LIMIT 1');
			}
			
			// Forcer les abonnements
			if($btn_valider_forcer_abos && $forcer_abo && in_array($forcer_abo, array('tous', 'auteurs', '6forum', 'aucun'))) {
				
				$forcer_format_reception = 
					(($forcer_format_abo == 'oui') && in_array($forcer_format_reception, spiplistes_formats_autorises()))
					? $forcer_format_reception
					: false
					;
				include_spip('inc/spiplistes_listes_forcer_abonnement');
				
				if(spiplistes_listes_forcer_abonnement ($id_liste, $forcer_abo, $forcer_format_reception) ===  false) {
					$message_erreur .= spiplistes_boite_alerte(_T('spiplistes:Forcer_abonnement_erreur'), true);
				}
			}
			
		} // end if($flag_editable)
	}

	//////////////////////////////////////////////////////
	// Recharge les donnees la liste

	$sql_select_array = array('id_liste', 'titre', 'texte'
			, 'titre_message', 'pied_page', 'date', 'statut', 'maj'
			, 'email_envoi', 'message_auto', 'periode', 'patron', 'lang');

	if($row = spiplistes_listes_liste_fetsel($id_liste, $sql_select_array)) {
		foreach($sql_select_array as $key) {
			// initialise les variables du resultat SQL
			$$key = $row[$key];
		}
	}

	// les supers-admins et le moderateur seuls peuvent modifier la liste
	$flag_editable = autoriser('moderer', 'liste', $id_liste);

	if (empty($titre_message))
	{
		$titre_message = $titre;
		if (spiplistes_pref_lire_defaut('opt_completer_titre_nom_site', 'oui') == 'oui')
		{
			$titre_message .= _T('spiplistes:_de_')
				. spiplistes_nom_site_texte($lang);
		}
	}
	
	$nb_abonnes = spiplistes_listes_nb_abonnes_compter($id_liste);

	// preparation des boutons 
	if($flag_editable) {
		// Propose de modifier la liste 
		$gros_bouton_modifier = 
			icone (
				_T('spiplistes:Modifier_cette_liste') // legende bouton
				, generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_EDIT,'id_liste='.$id_liste) // lien
				, _DIR_PLUGIN_SPIPLISTES_IMG_PACK."reply-to-all-24.gif" // image du fond
				, "edit.gif" // image de la fonction. Ici, le crayon
				, '' // alignement
				, false // pas echo, demande retour
				)
			;
		// Propose de supprimer la liste 
		$gros_bouton_supprimer = 
			icone (
					_T('spiplistes:Supprimer_cette_liste')
					, generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_GERER, "btn_supprimer_liste=$id_liste&id_liste=$id_liste")
					, _DIR_PLUGIN_SPIPLISTES_IMG_PACK.'poubelle_msg.gif'
					, ""
					, "right"
					, false
					)
			;
			
		// la grosse boite des abonnes
		$tri = _request('tri') ? _request('tri') : 'nom';
		//
		// CP-20101017: Si trop d'elligibles, ca gele.
		// @todo: revoir la boite/liste des abonnes/elligibles
		// En attendant ...
		//if(spiplistes_auteurs_elligibles_compter() < 1000)
		//{
			$boite_liste_abonnes = spiplistes_listes_boite_abonnements(
				$id_liste, $statut, $tri, $debut, _SPIPLISTES_EXEC_LISTE_GERER
			);
		//}
		//else
		//{
		//	$boite_liste_abonnes = _T('spiplistes:code_en_travaux');
		//}
		
		
		// @see http://www.spip-contrib.net/SPIP-Listes#comment444314
		
		
		
		$titre_boite = _T('spiplistes:abos_cette_liste');
		$legend = '<small id="legend-abos1">'
			. spiplistes_nb_abonnes_liste_str_get($id_liste)
			. '</small>'.PHP_EOL
			;
		$grosse_boite_abonnements = ''
			. '<!-- boite abonnes/elligibles -->'.PHP_EOL
			. debut_cadre_enfonce('auteur-24.gif', true, '', $titre_boite)
			. spiplistes_bouton_block_depliable($legend
				, false, md5('abonnes_liste'))
			. (spiplistes_spip_est_inferieur_193() ? $legend : '')
			. spiplistes_debut_block_invisible(md5('abonnes_liste'))
			. debut_cadre_relief('', true)
			. $boite_liste_abonnes
			. fin_cadre_relief(true)
			. fin_block()
			. fin_cadre_enfonce(true)
			. '<!-- fin boite abonnes/elligibles -->'.PHP_EOL
			;

		// la grosse boite des moderateurs
		$boite_liste_moderateurs = spiplistes_listes_boite_moderateurs(
			$id_liste, _SPIPLISTES_EXEC_LISTE_GERER, 'mods-conteneur'
			);
		$titre_boite = _T('spiplistes:mods_cette_liste');
		$nb = spiplistes_mod_listes_compter($id_liste);
		$legend = '<small>'
			. spiplistes_nb_moderateurs_liste_str_get($nb)
			. '</small>'.PHP_EOL
			;
		$grosse_boite_moderateurs = ''
			. '<!-- boite moderateurs -->'.PHP_EOL
			. debut_cadre_enfonce('redacteurs-24.gif', true, '', $titre_boite)
			. spiplistes_bouton_block_depliable($legend
				, false, md5('mods_liste'))
			. (spiplistes_spip_est_inferieur_193() ? $legend : '')
			. spiplistes_debut_block_invisible(md5('mods_liste'))
			. debut_cadre_relief('', true)
			. '<div id="mods-conteneur">'.PHP_EOL
			. $boite_liste_moderateurs
			. '</div>'.PHP_EOL
			. fin_cadre_relief(true)
			. fin_block()
			. fin_cadre_enfonce(true)
			. '<!-- fin boite moderateurs -->'.PHP_EOL
			;

	}
	else {
		$gros_bouton_modifier = $gros_bouton_supprimer = $grosse_boite_abonnements = '';
	}

////////////////////////////////////
// PAGE CONTENU
////////////////////////////////////

	$titre_page = _T('spiplistes:gestion_dune_liste');
	// Permet entre autres d'ajouter les classes a la page : <body class='$rubrique $sous_rubrique'>
	$rubrique = _SPIPLISTES_PREFIX;
	$sous_rubrique = 'liste_gerer';

	$commencer_page = charger_fonction('commencer_page', 'inc');
	echo($commencer_page(_T('spiplistes:spiplistes') . ' - ' . $titre_page, $rubrique, $sous_rubrique));

	// la gestion des listes de courriers est reservee aux admins 
	if($connect_statut != '0minirezo') {
		die (spiplistes_terminer_page_non_autorisee() . fin_page());
	}

	$page_result .= ''
		. '<br /><br /><br />' . PHP_EOL
		. spiplistes_gros_titre($titre_page, '', true)
		. barre_onglets($rubrique, $sous_rubrique)
		. debut_gauche($rubrique, true)
		. spiplistes_boite_info_id(_T('spiplistes:liste_numero'), $id_liste, true)
		. spiplistes_naviguer_paniers_listes(_T('spiplistes:aller_aux_listes_'), true)
		. spiplistes_boite_patron($flag_editable, $id_liste, _SPIPLISTES_EXEC_LISTE_GERER, 'btn_grand_patron'
			, _SPIPLISTES_PATRONS_DIR, _T('spiplistes:Patron_grand_')
			, ($patron ? $patron : '')
			, $patron)
		. spiplistes_boite_patron($flag_editable, $id_liste, _SPIPLISTES_EXEC_LISTE_GERER, 'btn_patron_pied'
			, _SPIPLISTES_PATRONS_PIED_DIR, _T('spiplistes:Patron_de_pied_')
			, ((($ii = strlen($pied_page)) > _SPIPLISTES_PATRON_FILENAMEMAX) 
				? _T('taille_octets',array('taille'=>$ii)) . _T('spiplistes:conseil_regenerer_pied')
				: $pied_page)
			, $pied_page)
		. pipeline('affiche_gauche', array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
		//. creer_colonne_droite($rubrique, true)  // spiplistes_boite_raccourcis() s'en occupe
		. spiplistes_boite_raccourcis(true)
		. spiplistes_boite_autocron()
		. pipeline('affiche_droite', array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
		. debut_droite($rubrique, true)
		. $message_erreur
		;

	changer_typo('','liste'.$id_liste);

	// message alerte et demande de confirmation si supprimer liste
	if(($btn_supprimer_liste > 0) && ($btn_supprimer_liste == $id_liste)) {
		$page_result .= ''
			. spiplistes_boite_alerte (_T('spiplistes:Attention_suppression_liste').'<br />'._T('spiplistes:Confirmez_requete'), true)
			. '<form name="form_suppr_liste" id="form_suppr_liste" method="post"
				action="'.generer_url_ecrire(_SPIPLISTES_EXEC_LISTES_LISTE, '').'">' . PHP_EOL
			. "<div class='verdana2' style='text-align:right;'>\n"
			. "<input type='hidden' name='id_liste' value='$id_liste' />\n"
   		. "<label>"._T('spiplistes:Confirmer_la_suppression_de_la_liste')."# $id_liste : \n"
   		. "<input class='fondo' type='submit' name='btn_supprimer_liste_confirme' value='"._T('bouton_valider')."' /></label>\n"
			. "</div>\n"
			. "</form>\n"
			. "<br />\n"
		;
	}

	$page_result .= ""
		. debut_cadre_relief("", true)
		. "\n<table cellpadding='0' cellspacing='0' border='0' width='100%'>\n"
		. "<tr><td valign='top'>\n"
		. spiplistes_gros_titre(spiplistes_bullet_titre_liste('puce', $statut, '', true)." "
			. spiplistes_calculer_balise_titre(extraire_multi($titre))
			, '', true)
		. "</td>"
		. "<td rowspan='2'>"
		// le gros bouton modifier si besoin
		. $gros_bouton_modifier
		. "</td></tr>\n"
		. "<tr><td width='100%'>\n"
		. "<div align='$spip_lang_left' style='padding: 5px; border: 1px dashed #aaa; ' class='verdana1 spip_small'>\n"
		. propre($texte."~")
		. "</div>\n"
		. "</td>\n"
		. "</tr></table>\n"
		;

	
	//////////////////////////////////////////////////////
	// Modifier le statut de la liste
	//$email_defaut = entites_html($meta['email_webmaster']);
	$email_defaut = ($m = email_valide($GLOBALS['meta']['email_defaut']))
		? $m
		: $GLOBALS['meta']['email_webmaster']
		;
	$email_envoi = ($m = email_valide($email_envoi))
		? $email_envoi
		: $email_defaut
		;

	$page_result .= ""
		//. debut_cadre_relief("racine-site-24.gif", true)
		. debut_cadre_relief("racine-site-24.gif", true, '', _T('spiplistes:Diffusion').spiplistes_plugin_aide(_SPIPLISTES_EXEC_AIDE, "diffusion"))
		//
		////////////////////////////
		// Formulaire diffusion
		.	(
			($flag_editable)
			? ''
				. spiplistes_form_debut(generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_GERER,'id_liste='.$id_liste), true)
				. '<input type="hidden" name="exec" value="listes" />' . PHP_EOL
				. '<input type="hidden" name="id_liste" value="'.$id_liste.'" />' . PHP_EOL
			: ''
			)
		. '<span class="verdana2">'
			. _T('spiplistes:cette_liste_est_'
			 	, array('s' => spiplistes_bullet_titre_liste ('puce', $statut, 'img_statut', true)))
		. '</span>' . PHP_EOL
		;

		$sel_private = ' value="' . _SPIPLISTES_LIST_PRIVATE . '" ' 
			. 	(
					in_array ($statut, array(
									_SPIPLISTES_LIST_PRIVATE
									, _SPIPLISTES_LIST_PRIV_DAILY
									, _SPIPLISTES_LIST_PRIV_HEBDO
									, _SPIPLISTES_LIST_PRIV_WEEKLY
									, _SPIPLISTES_LIST_PRIV_MENSUEL
									, _SPIPLISTES_LIST_PRIV_MONTHLY
									, _SPIPLISTES_LIST_PRIV_YEARLY
									)
						 )
					? ' selected="selected"' 
					: ''
				)
				;
		$sel_publique = ' value="' . _SPIPLISTES_LIST_PUBLIC . '" ' 
			. 	(
					in_array ($statut, array(
									_SPIPLISTES_LIST_PUBLIC
									, _SPIPLISTES_LIST_PUB_DAILY
									, _SPIPLISTES_LIST_PUB_HEBDO
									, _SPIPLISTES_LIST_PUB_WEEKLY
									, _SPIPLISTES_LIST_PUB_MENSUEL
									, _SPIPLISTES_LIST_PUB_MONTHLY
									, _SPIPLISTES_LIST_PUB_YEARLY
									)
						 )
					? ' selected="selected"' 
					: ''
				)
				;
	$page_result .= PHP_EOL
		.	(
			($flag_editable)
			? ''
				. '<select class="verdana2 fondl" name="statut" size="1" id="change_statut">' . PHP_EOL
				. '<option' . $sel_private . ' style="background-color:#fff">'
					. _T('spiplistes:statut_interne')
					. '</option>' . PHP_EOL
				. '<option' . $sel_publique . ' style="background-color:#B4E8C5">'
					. _T('spiplistes:statut_publique')
					. '</option>' . PHP_EOL
				. '<option' . mySel(_SPIPLISTES_TRASH_LIST, $statut)
					. ' style="background:url(' . _DIR_IMG_PACK.'rayures-sup.gif)">'
					. _T('texte_statut_poubelle').'</option>' . PHP_EOL
				. '</select>' . PHP_EOL
			: '<span class="verdana2" style="font-weight:bold;">'
				. spiplistes_items_get_item('alt', $statut)
				. '</span>'. PHP_EOL
			)
		. '<div style="margin:10px 0px;">' . PHP_EOL
		.	(
			($flag_editable && strpos($GLOBALS['meta']['langues_multilingue'], ','))
			? ''
				. '<label class="verdana2" for="changer_lang">'
					. _T('info_multi_herit').' : </label>' . PHP_EOL
				. '<select name="changer_lang" class="fondl" id="changer_lang">' . PHP_EOL
				. liste_options_langues('changer_lang', $lang , _T('spiplistes:langue_'), '', '')
				. '</select>' . PHP_EOL
			: ''
				//. "<span class='verdana2'>". _T('info_multi_herit')." : "
				//. "<span class='verdana2' style='font-weight:bold;'>".traduire_nom_langue($lang)."</span>\n"
			)
		. '</div>' . PHP_EOL
		.	(
				($flag_editable)
				? spiplistes_form_bouton_valider('btn_modifier_diffusion')
					. spiplistes_form_fin(true)
				: ''
			)
		. fin_cadre_relief(true)
		;

		////////////////////////////
		// Formulaire adresse email pour le reply-to
	$page_result .= ''
		. debut_cadre_relief(_DIR_PLUGIN_SPIPLISTES_IMG_PACK."reply_to-24.png"
							, true
							, ''
							, _T('spiplistes:adresse_de_reponse').spiplistes_plugin_aide(_SPIPLISTES_EXEC_AIDE
								, "replyto")
							)
		. spiplistes_form_debut(generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_GERER,"id_liste=$id_liste"), true)
		. "<p class='verdana2'>\n"
		. _T('spiplistes:adresse_mail_retour').":<br />\n"
		.	(
			($flag_editable)
			? _T('spiplistes:adresse')."</p>\n"
				. "<div style='text-align:center'>\n"
				. "<input type='text' name='email_envoi' value=\"".$email_envoi."\" size='40' class='fondl' /></div>\n"
				. spiplistes_form_bouton_valider('btn_modifier_replyto')
			: "</p><p style='font-weight:bold;text-align:center;'>$email_envoi</p>\n"
			)
		. spiplistes_form_fin(true)
		. fin_cadre_relief(true)
		;
		
		////////////////////////////
		// Formulaire planifier un courrier automatique
	$page_result .= ""
		. "<a name='form-programmer' id='form-programmer'></a>\n"
		. debut_cadre_relief(_DIR_PLUGIN_SPIPLISTES_IMG_PACK."stock_timer.png", true, '', _T('spiplistes:messages_auto')
			. spiplistes_plugin_aide(_SPIPLISTES_EXEC_AIDE, "temporiser"))
		;
	$page_result .= ""
		. $boite_pour_confirmer_envoi_maintenant
		. spiplistes_form_debut(generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_GERER,"id_liste=$id_liste")."#form-programmer", true)
		. "<table border='0' cellspacing='1' cellpadding='3' width='100%'>\n"
		. "<tr><td align='$spip_lang_left' class='verdana2'>\n"
		;
	if(empty($patron)) {
		$page_result .= ""
			. (
				$flag_editable
				? spiplistes_boite_alerte(_T('spiplistes:patron_manquant_message'), true)
				: "<p class='verdana2'>" . _T('spiplistes:liste_sans_patron') . "</p>\n"
			  )
			. "</td>\n"
			. "</tr>\n"
			. "<tr><td align='$spip_lang_left' class='verdana2'>\n"
			;
	}
	if ($message_auto != "oui") {
		$page_result .= "<div class='verdana2'>"._T('spiplistes:pas_denvoi_auto_programme')."</div>\n";
	}
	else {
		$page_result .= ""
			// petite ligne d'info si envoi programme
			. "<p class='verdana2'>"._T('spiplistes:sujet_courrier_auto')."<br />\n"
			. "<span class='spip_large'> "
				. spiplistes_calculer_balise_titre(extraire_multi($titre_message))
				. "</span></p>\n"
			. "<p class='verdana2'>"
			. spiplistes_items_get_item('alt', $statut)."<br />\n"
			.	(	
					($statut == _SPIPLISTES_LIST_PUB_MONTHLY)
					?	"<strong>" . spiplistes_items_get_item("tab_t", $statut) . "</strong><br />"
					:	""
				)
			.	(
					($periode > 0)
					? _T('spiplistes:periodicite_tous_les_n_s'
						, array('n' => "  <strong>".$periode."</strong>  "
							, 's' => spiplistes_singulier_pluriel_str_get($periode, _T('spiplistes:jour'), _T('spiplistes:jours'), false)
							)
						)
					: ""
				)
			.	(
					(!in_array($statut, explode(";", _SPIPLISTES_LISTES_STATUTS_PERIODIQUES)))
					? " <strong>"._T('spiplistes:Pas_de_periodicite')."</strong><br />"
						._T('spiplistes:Ce_courrier_ne_sera_envoye_qu_une_fois')
					: ""
				)
			.	"<br />"
			.	(
				(intval($maj))
				? _T('spiplistes:Dernier_envoi_le_') . " <strong>" . affdate_heure($maj) . "</strong>"
					.	(
						($last =  round((time() - strtotime($maj)) / _SPIPLISTES_TIME_1_DAY))
							? " (".spiplistes_singulier_pluriel_str_get($last, _T('spiplistes:jour'), _T('spiplistes:jours')).")"
							: ""
					). "<br />"
				: ""
				)
			.	(
				($date_prevue || (intval($date) && (time() < strtotime($date))))
				? _T('spiplistes:prochain_envoi_prevu')." : <strong>" . affdate_heure($date_prevue ? $date_prevue : $date) . "</strong>"
					.	(
						(!$date_prevue && ($next = round((strtotime($date) - time()) / _SPIPLISTES_TIME_1_DAY)))
							? " (".spiplistes_singulier_pluriel_str_get($next, _T('spiplistes:jour'), _T('spiplistes:jours')).")"
							: ""
						)
				: ""
				)
			. "</p>\n"
			;
		if($btn_modifier_courrier_auto) {
			$page_result .= ""
				. "<p class='verdana2'>"._T('spiplistes:date_act')."<br />"
				. _T('spiplistes:env_esquel')." <em>".$patron."</em>"
				. "</p>\n"
				;
		}
	}
	$date_debut_envoi = (!empty($date_prevue) ? $date_prevue : (($date && intval($date)) ? $date : normaliser_date(time())));

	$page_result .= ""
		. "</td>\n"
		. "</tr>\n"
		;
	if($flag_editable) {
		$page_result .= ""
			. "<tr><td align='$spip_lang_left' class='verdana2'>"
			. "<input type='radio' name='message_auto' value='oui' id='auto_oui' "
				. (empty($patron) ? " disabled='disabled' " : "")
				. ($auto_checked = ($message_auto=='oui' ? "checked='checked'" : ""))
				. " />"
			. "<label for='auto_oui' ".($auto_checked ? "style='font-weight:bold;'" : "").">"
				. _T('spiplistes:prog_env')."</label>\n"
			. "<div id='auto_oui_detail' "
				.((empty($patron) || !$auto_checked) ? "style='display:none;'" : "")
				.">"
			. "<ul style='list-style-type:none;'>\n"
			. "<li>"._T('spiplistes:message_sujet')
			. ': <input type="text" name="titre_message" value="'.$titre_message.'" size="50" class="fondl" /> </li>'."\n"
			;
			// 
			// chrono jour
			$ii = ($periode > 0) ? $periode : 1;
		$page_result .= ""
			. "<li style='margin-top:0.5em'>"
				. spiplistes_form_input_radio ('auto_chrono', 'auto_jour'
					, ''
					, ($statut == _SPIPLISTES_LIST_PUB_DAILY)
					, true, false
					)
				. _T('spiplistes:Tous_les')
				. " <input type='text' name='periode' value='".$ii."' size='4' maxlength='4' class='fondl' /> "
				. _T('info_jours')
				. "</li>\n"
			// chrono hebdo
			. "<li>"
				. spiplistes_form_input_radio ('auto_chrono', 'auto_hebdo'
					, _T('spiplistes:Toutes_les_semaines')
					, (($statut == _SPIPLISTES_LIST_PUB_HEBDO) || ($statut == _SPIPLISTES_LIST_PUB_WEEKLY))
					, true, false)
				. spiplistes_form_input_checkbox('auto_weekly', 'oui'
					, _T('spiplistes:en_debut_de_semaine'), ($statut == _SPIPLISTES_LIST_PUB_WEEKLY), true, false)
				. "</li>\n"
			// chrono mois
			. "<li>"
				. spiplistes_form_input_radio ('auto_chrono', 'auto_mensuel'
					, _T('spiplistes:Tous_les_mois')
					, (($statut == _SPIPLISTES_LIST_PUB_MENSUEL) || ($statut == _SPIPLISTES_LIST_PUB_MONTHLY))
					, true, false)
				. spiplistes_form_input_checkbox('auto_mois', 'oui'
					, _T('spiplistes:en_debut_de_mois'), ($statut == _SPIPLISTES_LIST_PUB_MONTHLY), true, false)
				. "</li>\n"
			// chrono annee
			. "<li>"
				. spiplistes_form_input_radio ('auto_chrono', 'auto_an'
					, _T('spiplistes:Tous_les_ans')
					, ($statut == _SPIPLISTES_LIST_PUB_YEARLY)
					, true, false)
				. "</li>\n"
			. "<li style='margin-top:0.5em'>"._T('spiplistes:A_partir_de')." : <br />\n"
			//
			. spiplistes_dater_envoi(
				'liste', $id_liste, $statut
				, $flag_editable
				, _T('spiplistes:date_expedition_')
				, $date_debut_envoi, 'btn_changer_date'
				, false
				)
			. "</li>\n"
			.	(
				(!$envoyer_maintenant)
				? " <li>"
					. spiplistes_form_input_checkbox('envoyer_maintenant', 'oui'
						, _T('spiplistes:env_maint'), false, true)
					. "</li>\n"
				: ""
				)
			. "</ul></div>\n"
			;
		$checked = ($message_auto=='non') ? "checked='checked'" : "";
		$class = $checked ? "class='bold'" : "";
		$disabled = (empty($patron) ? " disabled='disabled' " : "");
		$page_result .= ""
			. "<br /><input type='radio' name='message_auto' value='non' id='auto_non' $disabled $checked />"
			. "<span $class >"
			. " <label for='auto_non'>"._T('spiplistes:prog_env_non')."</label> "
			. "</span>\n"
			. "</td></tr>\n"
			;

		$page_result .= ""
			. "<tr><td style='text-align:$spip_lang_right;'>"
			. 	(
				($id_liste)
				? "<input type='hidden' name='id_liste' value='$id_liste' />"
				: ""
				)
			.	(
				($new)
				? "<input type='hidden' name='new' value='$new' />"
				: ""
				)
			// bouton de validation
			. (!empty($patron) 
				? spiplistes_form_bouton_valider('btn_modifier_courrier_auto', _T('bouton_valider'), true)
				: "")
			. "</td></tr>"
			;
	}
	$page_result .= ""
		. "</table>\n"
		. spiplistes_form_fin(true)
		. fin_cadre_relief(true)
		;
		// fin formulaire planifier
		
	$page_result .= ""
		. fin_cadre_relief(true)
		. $grosse_boite_abonnements
		. $grosse_boite_moderateurs
		;
	
	// le super-admin peut abonner en masse
	if($connect_toutes_rubriques) {
		$page_result .= ""
			. "\n<!-- forcer abo -->\n"
			. debut_cadre_enfonce(_DIR_PLUGIN_SPIPLISTES_IMG_PACK."abonner-24.png", true, '', _T('spiplistes:forcer_les_abonnement_liste').spiplistes_plugin_aide("forcerliste"))."\n"
			. "<p class='verdana2'>\n"
			. _T('spiplistes:forcer_abonnement_desc')
			. "</p>\n"
			. "<p class='verdana2' style='margin-bottom:1em'><em>"
			. _T('spiplistes:forcer_abonnement_aide', array('lien_retour' => generer_url_ecrire(_SPIPLISTES_EXEC_ABONNES_LISTE)))
			. "</em></p>\n"
			. "<form action='".generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_GERER,"id_liste=$id_liste#auteurs")."' id='form_forcer_abo' name='form_forcer_abo' method='post'>\n"
			. debut_cadre_relief("", true)."\n"
			//
			//////////////////////////
			// propose de forcer les membres sauf invites si la liste est privee
			.	(
					($statut==_SPIPLISTES_LIST_PRIVATE)
					? "<div class='verdana2'><input type='radio' name='forcer_abo' value='auteurs' id='forcer_abo_tous' />\n"
						. "<label for='forcer_abo_tous'>"._T('spiplistes:Abonner_tous_les_inscrits_prives')."</label>"
						. "</div>\n"
						. spiplistes_boutons_forcer_format('forcer_format', _T('spiplistes:forcer_abonnements_nouveaux'))
					: ""
				)
			//
			// propose de forcer les invites si la liste est publique ou periodique
			.	(
					(($statut!=_SPIPLISTES_LIST_PRIVATE) && ($statut!=_SPIPLISTES_TRASH_LIST))
					? "<div class='verdana2'><input type='radio' name='forcer_abo' value='6forum' id='forcer_abo_6forum' />\n"
						. "<label for='forcer_abo_6forum'>"._T('spiplistes:Abonner_tous_les_invites_public')."</label></div>\n"
						. spiplistes_boutons_forcer_format('forcer_format', _T('spiplistes:forcer_abonnements_nouveaux'))
					: ""
				)
			. (
				($nb_abonnes)
				? "<hr />\n"
					. "<div class='verdana2'><input type='radio' name='forcer_abo' value='aucun' id='forcer_desabo' />\n"
					. "<label for='forcer_desabo'>"._T('spiplistes:Forcer_desabonner_tous_les_inscrits')."</label></div>\n"
				: ""
				)
			. fin_cadre_relief(true)."\n"
			. "<div style='text-align:right;'><input type='submit' name='btn_valider_forcer_abos' value='"._T('bouton_valider')."' class='fondo' /></div>\n"
			. "</form>\n"
			. fin_cadre_enfonce (true)."\n"
		;
	}
	//
	$page_result .= ""
		. $gros_bouton_supprimer
		;
	
	echo($page_result);

	echo pipeline('affiche_milieu',array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
		, spiplistes_html_signature(_SPIPLISTES_PREFIX)
		, fin_gauche(), fin_page();

} // end exec_spiplistes_liste_gerer()
function spiplistes_lister_courriers_listes (
	$titre_tableau
	, $image
	, $element='listes'
	, $statut=''
	, $apres_maintenant=false
	, $nom_position='position'
	, $exec
	, $id_auteur=0
	, $pas=10
	, $return=true) {

	include_spip('inc/spiplistes_api');
	include_spip('inc/spiplistes_api_courrier'); 

	$position = intval($_GET[$nom_position]);
	$pas = intval($pas);
	$id_auteur = intval($id_auteur);
	//$retour = _DIR_RESTREINT_ABS.self();
	$clause_where = '';
	
	//////////////////////////////////
	// requete
	// construction de la requete SQL
	// sera (en partie) utilisee plus bas pour compter et pagination
	switch($element) { 
		case 'abonnements':
			$sql_select = "listes.id_liste,listes.titre,listes.statut,listes.date,abos.id_auteur";
			$sql_from = "spip_auteurs_listes AS abos LEFT JOIN spip_listes AS listes ON abos.id_liste=listes.id_liste";
			$sql_where = "abos.id_auteur=".sql_quote($id_auteur);
			$sql_order = "listes.titre";
			break;
		case 'courriers':
			$sql_select = "id_courrier, titre, date, date_debut_envoi,date_fin_envoi, nb_emails_envoyes,total_abonnes,email_test";
			$sql_from = "spip_courriers";
			$sql_where = "statut=".sql_quote($statut);
			$sql_order = "date";
			break;
		case 'listes':
			if (
				// pour lister les listes programmees dans un futur 
				in_array($statut, explode(";", _SPIPLISTES_LISTES_STATUTS_OK)) 
				&& ($apres_maintenant == true)
			) {
				$clause_where.= " AND (maj NOT BETWEEN 0 AND NOW())";
			}
			$sql_select = "id_liste,titre,date,patron,maj,periode,statut";
			$sql_from = "spip_listes";
			$sql_where = "statut=".sql_quote($statut)." $clause_where";
			$sql_order = "date";
			break;
	}
	//
	$resultat_aff = sql_select($sql_select, $sql_from, $sql_where, '', array($sql_order." DESC "), $position.",".$pas);
	
	//////////////////////
	if (($nb_ = @sql_count($resultat_aff)) > 0) {
		
		// titre du tableau
		$en_liste = ""
			. "<div class='liste'>\n"
			. "<div style='position: relative;'>\n"
			. "<div style='position: absolute; top: -12px; left: 3px;'>\n"
			. "<img src='$image' alt='' width='24' height='24' />\n"
			. "</div>\n"
			. "<div style='background-color:white; color:black; padding:3px; padding-left:30px; border-bottom:1px solid #444;' class='verdana2'>\n"
			. "<strong>\n"
			. $titre_tableau
			. "</strong>\n"
			. "</div>\n"
			. "</div>\n"
			. "<table width='100%' cellpadding='2' cellspacing='0' border='0'>\n"
			;
		
		while ($row = sql_fetch($resultat_aff)) {
		
			$titre = $row['titre'];
			$date = $row['date'];
						
			switch ($element){
				case 'abonnements':
					$id_row = $row['id_liste'];
					$url_row	= generer_url_ecrire($exec, 'id_liste='.$id_row);
					$retour = self();
					$url_desabo = generer_action_auteur(_SPIPLISTES_ACTION_CHANGER_STATUT_ABONNE
											, $row['id_auteur'].'-listedesabo-'.$id_row
											, $retour);
					spiplistes_debug_log('desabo: '.$url_desabo);
					spiplistes_debug_log('retour: '.$retour);
					$statut = $row['statut'];
					break;
				case 'courriers':
					$id_row	= $row['id_courrier'];			
					$nb_emails_envoyes	= $row['nb_emails_envoyes'];
					$date_debut_envoi	= $row['date_debut_envoi'];
					$date_fin_envoi	= $row['date_fin_envoi'];
					$total_abonnes	= $row['total_abonnes'];
					$email_test	= $row['email_test'];
					$url_row	= generer_url_ecrire($exec, 'id_courrier='.$id_row);
					break;
				case 'listes':
					$id_row = $row['id_liste'];
					$url_row	= generer_url_ecrire($exec, 'id_liste='.$id_row);
					$patron = $row['patron'];
					$maj = $row['maj'];
					$periode = $row['periode'];
					break;
			}
			
			$en_liste.= ""
				. "<tr class='tr_liste'>\n"
				. "<td width='11' style='vertical-align:top;'>"
				. "<img src='".spiplistes_items_get_item("puce", $statut)."' alt=\""
					. spiplistes_items_get_item("alt", $statut)."\" border='0' style='margin: 3px 1px 1px;' />"
				. "</td>"
				. "<td class='arial2'>\n"
				. "<div>\n"
				. "<a href=\"".$url_row."\" dir='ltr' style='display:block;'>\n"
				. spiplistes_calculer_balise_titre(extraire_multi($titre))
				;
			
			switch($element) {
			// si courriers, donne le nombre de destinataires
				case 'courriers':
					$nb_abo = "";
					if(empty($email_test)) {
						$nb_abo = spiplistes_nb_destinataire_str_get($total_abonnes);
					}
					else {
						$nb_abo = _T('spiplistes:email_adresse');
					}
					if($nb_abo) {
						$en_liste .=
							" <span class='spiplistes-legend-stitre' dir='ltr'>($nb_abo)</span>\n"
							;
					}
					break;
			// si liste, donne le nombre d'abonnes
				case 'listes':
					//$nb_abo = spiplistes_nb_abonnes_liste($id_row);
					// affiche infos complementaires pour les listes
					$en_liste .= ""
						. " <span style='font-size:100%;color:#666666' dir='ltr'>\n"
						. "<span class='spiplistes-legend-stitre'>".spiplistes_nb_abonnes_liste_str_get($id_row)."</span>"
						. "<br />"
						. (
							empty($patron) 
							? "<span class='texte-alerte'>" . _T('spiplistes:liste_sans_patron') . "</span>"
							: _T('spiplistes:patron_') . " <strong>".$patron."</strong>" 
						  )
						 ;
					if (!empty($date) && intval($date)) {
						if($periode) {
							$en_liste .= "<br />"
								. _T('spiplistes:periodicite_tous_les_n_s'
								, array('n' => "  <strong>".$periode."</strong>  "
									, 's' => spiplistes_singulier_pluriel_str_get($periode, _T('spiplistes:jour'), _T('spiplistes:jours'), false)
									)
								)
								;
						}
						else {
							// inutile de preciser le statut, c'est dans le titre du bloc
						}
						$en_liste .= ""
							. ""
							. "<br />" . _T('spiplistes:Prochain_envoi_')
							. " : <strong>".affdate_heure($date)."</strong>"
							;
					}
					$en_liste .= ""
						. "</span>\n"
						;
						break;
			}
								
		//////////////////////
			$en_liste .= ""
				. "</a>\n"
				. "</div>\n"
				. "</td>\n"
				. "<td width='120' class='arial1'>"
				;
			switch($element) {
				case 'abonnements':
					$en_liste .= ""
						. "<a href=\"$url_desabo\" dir='ltr' style='display:block;'>"._T('spiplistes:desabonnement')."</a>\n"
						;
					break;
				case 'courriers':
					// - date debut envoi si encour, sinon date de publication
					if(!in_array($statut, array(_SPIPLISTES_COURRIER_STATUT_REDAC, _SPIPLISTES_COURRIER_STATUT_READY))) {
						$en_liste .= ""
							.	(
								($statut==_SPIPLISTES_COURRIER_STATUT_ENCOURS)
								? _T('spiplistes:envoi_en_cours')
								: affdate_heure($date_fin_envoi)
								)
							;
					}
					break;
			}
			$en_liste .= ""
				. "</td>\n"
				. "<td width='50' class='arial1'><strong>"._T('info_numero_abbreviation').$id_row."</strong></td>\n"
				. "</tr>\n"
				;
		}
		$en_liste.= "</table>\n";
		
		//////////////////////
		// Pagination si besoin
		switch ($element){
			case 'abonnements':
				$sql_select = "COUNT(listes.id_liste) AS n";
				$param = "&id_auteur=$id_auteur";
				break;
			case 'courriers':
				$sql_select = "COUNT(id_courrier) AS n";
				$param = "&statut=$statut";
				break;
			case 'listes':
				$sql_select = "COUNT(id_liste) AS n";
				$param = "";
				break;
		}
		
		$sql_result = sql_select($sql_select, $sql_from, $sql_where);
		
		if(
			$sql_result
			&& ($row = sql_fetch($sql_result)) && ($total = $row['n'])
		) {
			$retour = _request('exec');
			$en_liste .= spiplistes_afficher_pagination($retour, $param, $total, $position, $nom_position, $pas);
		}

		$en_liste .= ""
			. "</div>\n"
			. "<br />\n"
			;
	}

	if($return) return($en_liste);
	else echo($en_liste);
}
예제 #4
0
function exec_spiplistes_import_export(){

	include_spip('inc/presentation');
	include_spip('inc/acces');
	include_spip('inc/spiplistes_api');
	include_spip('inc/spiplistes_api_presentation');

	global $connect_statut
		, $connect_toutes_rubriques
		, $connect_id_auteur
		;
	static $eol = PHP_EOL;
	
	// initialise les variables postées par le formulaire
	foreach(array(
		'btn_valider_import', 'abos_liste', 'format_abo', 'forcer_abo'	// retour import
		, 'btn_valider_export', 'export_id' // retour export
		, 'separateur', 'exporter_statut_auteur'
		) as $key) {
		$$key = _request($key);
	}

	$separateur = (($separateur == 'tab') ? "\t" : ';');
	
	$flag_admin = ($connect_statut == "0minirezo") && $connect_toutes_rubriques;
	$flag_moderateur = false;
	
	$flag_autorise = 
		$flag_admin
		|| (
				$flag_moderateur = ($listes_moderees = spiplistes_mod_listes_id_auteur($connect_id_auteur))
			)
		;

	// exportation de liste. Retour formulaire local.
	// les admins tt rubriques peuvent tt exporter
	// le moderateur ne peut exporter que sa liste
	if(
		$flag_autorise
		&& 
			(	$flag_admin
				|| in_array($export_id, $listes_moderees)
			)
	) {
	
		// generation du fichier export ?
		if($btn_valider_export && $export_id) {
		
			$sql_select = array('a.email', 'a.nom', 'a.login', 'a.statut');
			$sql_from = array('spip_auteurs AS a');
			$sql_where = array("a.statut!=".sql_quote('5poubelle'));
			if(($id_liste = intval($export_id)) > 0) {
			// exportation d'une liste ID ? 
				$sql_from[] = "spip_auteurs_listes AS l";
				$sql_where[] = "l.id_liste=".sql_quote($id_liste);
				$sql_where[] = "a.id_auteur=l.id_auteur";
			}
			else {
			// autre type de liste
				if($export_id == "sans_abonnement") {
					if(spiplistes_spip_est_inferieur_193()) {
						$sql_where[] = "a.id_auteur NOT IN (SELECT id_auteur FROM spip_auteurs_listes GROUP BY id_auteur)";
					} else {
						$selection = sql_select("id_auteur", "spip_auteurs_listes", '','id_auteur','','','','',false);
						$sql_where[] = "a.id_auteur NOT IN ($selection)";
					}
				} 
				else if($export_id == "desabo") {
					$sql_from[] = "spip_auteurs_elargis AS f";
					$sql_where[] = "a.id_auteur=f.id_auteur";
					$sql_where[] = "f.`spip_listes_format`=".sql_quote('non');
				}
			}

			$sql_result = sql_select(
				$sql_select
				, $sql_from
				, $sql_where
				);

			$nb_inscrits = sql_count($sql_result);
			$exporter_statut_auteur = ($exporter_statut_auteur == 'oui');
			
			$str_export = ''
				. '# ' . spiplistes_html_signature(_SPIPLISTES_PREFIX, false).$eol
				. '# '._T('spiplistes:membres_liste').$eol
				. '# liste id: $export_id\n'
				. '# '.spiplistes_nom_site_texte().$eol
				. '# '.$GLOBALS['meta']['adresse_site'].$eol
				. '# date: '.date('Y-m-d').$eol
				. '# nb abos: '.$nb_inscrits.$eol.$eol
				. '#'.$eol
				. '# \'email\''.$separateur.'\'login\''.$separateur.'\'nom\''
				. ($exporter_statut_auteur ? $separateur.'\'statut\'' : '')
				. $eol.$eol
				;
			
			while($row = sql_fetch($sql_result)) {
				$str_export .= $row['email'].$separateur.$row['login'].$separateur.$row['nom']
					. ($exporter_statut_auteur ? $separateur.$row['statut'] : '')
					. "\n"
					;
			}
			// envoie le fichier
			header('Content-type: text/plain');
			header('Content-Disposition: attachment; filename="export_liste_$export_id-'.date("Y-m-d").'.txt"');
			echo ($str_export);
			exit;
		}
		// fin de generation du fichier export
	}

////////////////////////////////////
// PAGE CONTENU
////////////////////////////////////

	$titre_page = _T('spiplistes:listes_de_diffusion_');
	// Permet entre autres d'ajouter les classes a' la page : <body class='$rubrique $sous_rubrique'>
	$rubrique = _SPIPLISTES_PREFIX;
	$sous_rubrique = "import_export";

	$commencer_page = charger_fonction('commencer_page', 'inc');
	echo($commencer_page(_T('spiplistes:spiplistes') . " - " . _T('spiplistes:import_export'), $rubrique, $sous_rubrique));

	// la gestion du courrier est réservée aux admins 
	if (!$flag_autorise) {
		die (spiplistes_terminer_page_non_autorisee() . fin_page());
	}       

	$page_result = ""
		. "<br /><br /><br />\n"
		. spiplistes_gros_titre($titre_page, '', true)
		. barre_onglets($rubrique, $sous_rubrique)
		. debut_gauche($rubrique, true)
		. pipeline('affiche_gauche', array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
		//. creer_colonne_droite($rubrique, true)  // spiplistes_boite_raccourcis() s'en occupe
		. spiplistes_boite_raccourcis(true)
		. spiplistes_boite_autocron()
		. pipeline('affiche_droite', array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
		. debut_droite($rubrique, true)
		;
	
	// importation
	$flag_import_fichier_ok = 
		(count($_FILES) && is_array($fichier_import = $_FILES['fichier_import']) 
		&& !$fichier_import['error']);

	if($btn_valider_import && $flag_import_fichier_ok) {
		if(!($abos_liste && is_array($abos_liste) && count($abos_liste))) {
		// A oublie' de selectionner une liste de destination
			$page_result .= spiplistes_boite_alerte(_T('spiplistes:Selectionnez_une_liste_pour_import'), true);
		}
	}
		
	// import form
	$page_result .= ""
		. debut_cadre_trait_couleur(_DIR_PLUGIN_SPIPLISTES_IMG_PACK.'listes_in-24.png', true
									, '', _T('spiplistes:Importer'))
		. "<p class='verdana2'>"._T('spiplistes:_aide_import')."</p>\n"
		;
	
	if($flag_import_fichier_ok)
	{
		//syslog(LOG_NOTICE, 'memory_limit: ' . get_cfg_var('memory_limit'));
		//syslog(LOG_NOTICE, 'memory_get_usage[1]: ' . memory_get_usage());
		//syslog(LOG_NOTICE, 'memory_get_peak_usage[1]: ' . memory_get_peak_usage());
		//syslog(LOG_NOTICE, 'filesize: ' . filesize($fichier_import['tmp_name']));
		   
		if($abos_liste && is_array($abos_liste) && count($abos_liste))
		{
			include_spip('inc/spiplistes_import');
			$page_result .= ''
				. debut_boite_info(true)
				. spiplistes_titre_boite_info(_T('spiplistes:Resultat_import'))
				. spiplistes_import(
					$fichier_import['tmp_name']
					, $fichier_import['name']
					, $abos_liste
					, $format_abo
					, $separateur
					, $flag_admin
					, $listes_moderees
					, $forcer_abo
					)
				. fin_boite_info(true)
				. '<br />'
				;
		}
	}

	$list = sql_select(
		array('id_liste','titre','texte')
		, 'spip_listes'
		, spiplistes_listes_sql_where_or(_SPIPLISTES_LISTES_STATUTS_OK));

	$nb_listes = sql_count($list);
	
	if($nb_listes) {
		$listes_array = array();
		while($row = sql_fetch($list)) {
			$listes_array[] = $row;
		}
	}
	
	if(!$nb_listes) {
		$page_result .= spiplistes_boite_alerte(_T('spiplistes:Pas_de_liste_pour_import'), true);
	} 
	else {
		$page_result .= ""
			. "<form action='" . generer_url_ecrire(_SPIPLISTES_EXEC_IMPORT_EXPORT) . "' method='post' enctype='multipart/form-data'name='importform'>\n"
			. debut_cadre_relief("", true, "", _T('spiplistes:Liste_de_destination'))
			. "<p class='verdana2'>"._T('spiplistes:Selectionnez_une_liste_de_destination')."</p>\n"
			. "<ul class='liste-listes verdana2'>\n"
			;

		$listes_sans_patron = array();

		if(count($listes_array) > 0) {
			// une liste sans patron ne peut pas contenir d'abonnés.
			// récupère la liste des listes qui n'ont pas de patron.
			$sql_result = sql_select('id_liste', 'spip_listes'
				, array("patron=''"
					, "(statut=".implode(" OR statut=", array_map("sql_quote", explode(";", _SPIPLISTES_LISTES_STATUTS_OK))).")"
				)
			);
			while($row = sql_fetch($sql_result)) {
				$listes_sans_patron[] = $row['id_liste'];
			}
		}
		
		// liste des listes (destination)
		$couleur_ligne = 0;
		foreach($listes_array as $row) {
			$id_liste = $row['id_liste'] ;
			if(
				!in_array($id_liste, $listes_sans_patron)
				&&
				($flag_admin || in_array($id_liste, $listes_moderees))
			) {
				$titre = couper($row['titre'], 30, '...');
				$texte = couper($row['texte'], 30, '...');
				$label = _T('spiplistes:Liste_de_destination').": $titre";
				$checked = ($nb_listes == 1) ? "checked='checked'" : "";
				$class = ($couleur_ligne++ % 2) ? "class='row-even'" : "";
				$page_result .= ""
					. "<li style='padding:4px' $class >"
					. "<input name='abos_liste[]' type='checkbox' id='abos_$id_liste' value='$id_liste' title=\"$label\" $checked />\n"
					. "<label for='abos_$id_liste'><strong>".$titre."</strong> <em>".$texte."</em></label>\n"
					. "</li>\n"
					;
			}
		}
		$page_result .= ""
			. "</ul>"
			. fin_cadre_relief(true)
			//
			// Sélection du format de réception
			. debut_cadre_relief("", true, "", _T('spiplistes:format_de_reception_'))
			. "<ul class='liste-listes verdana2'>\n"
			. "<li>"
				. spiplistes_form_input_radio('format_abo', 'html', _T('spiplistes:html'), true, true, false)
				. "</li>\n"
			. "<li>"
				. spiplistes_form_input_radio('format_abo', 'texte', _T('spiplistes:texte'), false, true, false)
				. "</li>\n"
			. "<li>"
				. spiplistes_form_input_radio('format_abo', 'non', _T('spiplistes:desabonnement'), false, true, false)
				. "</li>\n"
			. "</ul>"
			. fin_cadre_relief(true)
			//
			// cadre insertion nom de fichier
			. debut_cadre_relief("", true, "", _T('spiplistes:importer_fichier'))
			. "<input type='file' size='40' name='fichier_import' />"
			//
			. spiplistes_fieldset_separateur($separateur)
			//
			// forcer les abonnements
			. spiplistes_fieldset_option(
				_T('spiplistes:option_import_')
				, 'forcer_abo'
				, 'oui'
				, _T('spiplistes:forcer_abos_'), ($forcer_abo == 'oui')
				
				)
			//
			. fin_cadre_relief(true)
			. spiplistes_form_bouton_valider('btn_valider_import')
			. spiplistes_form_fin(true)
			;
	} // end else
	$page_result .= fin_cadre_trait_couleur(true);
	// fin formulaire import

	// export //(original from erational.org)
	// formulaire d'export

	if ($nb_listes > 0) {
		$page_result .= ""
			. debut_cadre_trait_couleur(_DIR_PLUGIN_SPIPLISTES_IMG_PACK.'listes_out-24.png', true, "", _T('spiplistes:Exporter'))
			// exportation par listes
			. spiplistes_form_debut(generer_url_ecrire(_SPIPLISTES_EXEC_IMPORT_EXPORT), true)
			. debut_cadre_relief("", true, "", _T('spiplistes:Exporter_une_liste_d_abonnes'))
			. "<ul class='liste-listes verdana2'>\n"
			;
		$couleur_ligne = 0;
		foreach($listes_array as $row) {
			$id_liste = intval($row['id_liste']);
			if($flag_admin || in_array($id_liste, $listes_moderees)) {
				$titre = couper($row['titre'], 30, '...');
				$class = ($couleur_ligne++ % 2) ? "class='row-even'" : "";
				list($nb_abos, $html, $texte) = spiplistes_listes_nb_abonnes_compter($id_liste, true);
				if($nb_abos > 0) {
					$page_result .= ""
						. "<li style='padding:4px'  $class >"
						. spiplistes_form_input_radio('export_id', $id_liste
							, "<strong>".$titre."</strong> <em>"
								. spiplistes_nb_abonnes_liste_str_get($id_liste, $nb_abos, $html, $texte)
								. "</em>"
							, ($nb_listes==1), true, false)
						. "</li>\n"
						;
				}
			}
		}
		$page_result .= ""
			. "</ul>"
			. fin_cadre_relief(true)
			. "<!-- fin de liste export -->\n"
			//
			// exportation autres
			. debut_cadre_relief("", true, "", _T('spiplistes:Exporter_une_liste_de_non_abonnes'))
			. "<div class='verdana2'>\n"
			. spiplistes_form_input_radio('export_id', 'sans_abonnement', _T('spiplistes:abonne_aucune_liste'), false, true, false)
			. spiplistes_form_input_radio('export_id', 'desabo', _T('spiplistes:desabonnes'), false, true, false)
			. "</div>"
			. fin_cadre_relief(true)
			. "<fieldset class='verdana2'><legend>"._T('spiplistes:export_etendu_').":</legend>"
			. spiplistes_form_input_checkbox('exporter_statut_auteur', 'oui'
				, _T('spiplistes:exporter_statut'), false, true, false)
			. "</fieldset>\n"
			//
			. spiplistes_fieldset_separateur($separateur)
			//
			. spiplistes_form_bouton_valider('btn_valider_export')
			. spiplistes_form_fin(true)
			. fin_cadre_trait_couleur(true)
			;
	}

	echo($page_result);
	
	echo pipeline('affiche_milieu',array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
		, spiplistes_html_signature(_SPIPLISTES_PREFIX)
		, fin_gauche(), fin_page();
}
예제 #5
0
function exec_spiplistes_courrier_gerer () {

	include_spip('inc/barre');
	include_spip('inc/documents');
	include_spip('base/spiplistes_tables');
	include_spip('inc/spiplistes_api');
	include_spip('inc/spiplistes_api_courrier');
	include_spip('inc/spiplistes_api_presentation');
	include_spip('inc/spiplistes_destiner_envoi');
	include_spip('inc/spiplistes_naviguer_paniers');

	global $connect_statut
		, $connect_toutes_rubriques
		, $connect_id_auteur
		, $spip_ecran
		;
	
	$eol = "\n";

	// initialise les variables postees par le formulaire
	foreach(array(
		'type'
		, 'id_courrier'
		, 'btn_courrier_valider', 'titre', 'message', 'message_texte' // (formulaire edition) _SPIPLISTES_EXEC_COURRIER_EDIT
		, 'new' // idem
		, 'btn_changer_destination', 'radio_destination', 'email_test', 'id_liste' // (formulaire local) destinataire
		, 'change_statut' // (formulaire spiplistes_boite_autocron) 'publie' pour annuler envoi par boite autocron
		, 'btn_dupliquer_courrier' // (formulaire local) dupliquer le courrier
		, 'supp_dest'
		, 'id_temp' // pour recuperer les documents joints
		) as $key) {
		$$key = _request($key);
	}
	foreach(array('id_courrier', 'id_liste', 'btn_dupliquer_courrier') as $key) {
		$$key = intval($$key);
	}
	foreach(array('email_test','titre','message','message_texte') as $key) {
		$$key = trim($$key);
	}
	$texte = $message;

	$page_result = $message_erreur = $str_destinataire =
		$boite_confirme_envoi = '';

	$flag_admin = ($connect_statut == "0minirezo") && $connect_toutes_rubriques;
	$flag_moderateur = count($listes_moderees = spiplistes_mod_listes_id_auteur($connect_id_auteur));
	$flag_createur = ($id_courrier && ($connect_id_auteur == spiplistes_courrier_id_auteur_get($id_courrier)));

	// l'edition du courrier est reservee...
	$flag_autorise = (
		// aux super-admins 
		$flag_admin
		// ou a un moderateur
		|| $flag_moderateur
		// ou au createur du courrier
		|| $flag_createur
	);

	if($flag_autorise) {
		// Modification de courrier
	
		if($btn_dupliquer_courrier > 0) {
			$id_courrier = $btn_dupliquer_courrier;
		}

		// effectue les modifications demandees si retour local ou retour editeur
		if($id_courrier > 0) {

			if($btn_dupliquer_courrier > 0)
			{
				if($row = sql_fetsel('titre,texte', 'spip_courriers', 'id_courrier='.sql_quote($id_courrier),'','',1))
				{
					$titre = typo($row['titre']);
					
					$texte = typo($row['texte']);
					//
					// @see: http://www.spip-contrib.net/SPIP-Listes#comment441566
					//$texte = typo($row['message_texte']);
					
					$str_log = "id_courrier #$id_courrier";
					$statut = _SPIPLISTES_COURRIER_STATUT_REDAC;
					$type = _SPIPLISTES_COURRIER_TYPE_NEWSLETTER;
					$id_courrier = sql_insert(
						'spip_courriers'
						, "(titre,texte,message_texte,date,statut,type,id_auteur)"
						, "(".sql_quote($titre).",".sql_quote($texte).",".sql_quote($message_texte)
							.",NOW(),".sql_quote($statut).",".sql_quote($type).",".sql_quote($connect_id_auteur).")"
					);
					spiplistes_log("$str_log DUPLICATED TO #$id_courrier BY ID_AUTEUR #$connect_id_auteur");
				}
				else {
					spiplistes_log("ERR: DUPLICATION FROM id_courrier #$id_courrier (missing ?)");
				}
			}
			
			if($btn_changer_destination) {
				if($radio_destination == 'email_test') {
					
					// demande d'envoi au mail de test (retour formulaire local)
					if(email_valide($email_test)) {
						if(!($id_auteur_test = spiplistes_idauteur_depuis_email($email_test))) {
							// verifie si l'adresse est dans la table des auteurs
							// si inconnue, refuse d'envoyer
							$message_erreur .= spiplistes_boite_alerte (_T('spiplistes:Erreur_Adresse_email_inconnue'), true);
						}
						else {
							
							$format_abo = spiplistes_format_abo_demande($id_auteur_test);

							/*
							 * meme le compte qui veut recevoir un test doit avoir
							 * un format de reception
							 */
							if(
								in_array($format_abo, spiplistes_formats_autorises())
								&& ($format_abo != 'non')
							) {
								// Ok. Enregistre l'adresse test
								spiplistes_courrier_modifier(
									$id_courrier
									, array(
										  'email_test' => $email_test
										, 'total_abonnes' => 1
										, 'id_liste' => ($id_liste = 0)
										, 'statut' => ($change_statut = _SPIPLISTES_COURRIER_STATUT_READY)
										)
								);
							}
							else {
								$message_erreur .= spiplistes_boite_alerte (_T('spiplistes:destinataire_sans_format_alert'), true);
							}
							
							$str_destinataire = _T('spiplistes:email_adresse') . " : $email_test";
						}
					}
					else {
						$message_erreur .= spiplistes_boite_alerte (_T('spiplistes:Erreur_Adresse_email_invalide'), true);
					}
				} // end if($radio_destination == 'email_test')
				
				else if($radio_destination == 'id_liste') {
					// demande d'envoi a une liste (retour formulaire local)
					if($id_liste > 0) {
						if(
							($nb_abos = spiplistes_listes_nb_abonnes_compter($id_liste)) > 0
						) {
							$str_destinataire = ""
								. _T('spiplistes:sur_liste') 
								. " : <a href='".generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_GERER, "id_liste=$id_liste")."'>"
								. spiplistes_listes_liste_fetsel($id_liste, 'titre')
								. "</a>"
								. " " . spiplistes_nb_abonnes_liste_str_get($id_liste, $nb_abos)
								;
							spiplistes_courrier_modifier(
								$id_courrier
								, array(
									  'email_test' => ""
									, 'total_abonnes' => $nb_abos
									, 'id_liste' => $id_liste
									, 'statut' => ($change_statut = _SPIPLISTES_COURRIER_STATUT_READY)
								)
							);
						}
						else {
							$message_erreur .= spiplistes_boite_alerte (_T('spiplistes:Erreur_liste_vide'), true);
						}
					}
				} // end if($radio_destination
			} // if($btn_changer_destination
	
			else if($btn_courrier_valider) {
				// retour editeur local
				if(!empty($titre)) {
					$sql_set = array(
							  'titre' => $titre
							, 'texte' => $texte
							, 'message_texte' => $message_texte
						);
					spiplistes_courrier_modifier($id_courrier, $sql_set);
					spiplistes_courrier_attacher_documents($id_courrier, $id_temp);
				}
				else {
					$message_erreur .= spiplistes_boite_alerte (_T('spiplistes:Erreur_courrier_titre_vide'), true);
				}
			}
			// FIN DES MODIFICATIONS
		}
					
		// Ok. recharge les donnees pour completer le formulaire
		$sql_select_array = array('titre', 'texte', 'email_test', 'statut');
		if($row = spiplistes_courriers_premier($id_courrier, $sql_select_array)) {
			foreach($sql_select_array as $key) {
				$$key = $row[$key];
			}
		} // end if($id_courrier > 0)
	}  // end if($flag_autorise)


	//////////////////////////////////////////////////////
	// Nouveau courrier
	////
	if(($connect_statut == "0minirezo") && ($new == 'oui')) {
		// retour editeur. Creation du courrier
		if(!empty($titre)) {
			$statut = _SPIPLISTES_COURRIER_STATUT_REDAC;
			$type = _SPIPLISTES_COURRIER_TYPE_NEWSLETTER;
			$id_courrier = sql_insert(
				'spip_courriers'
				, "(titre,texte,message_texte,date,statut,type,id_auteur)"
				, "(".sql_quote($titre).",".sql_quote($texte).",".sql_quote($message_texte)
					.",NOW(),".sql_quote($statut).",".sql_quote($type).",".sql_quote($connect_id_auteur).")"
			);
			spiplistes_courrier_attacher_documents($id_courrier, $id_temp);
		}
		else {
			$message_erreur .= spiplistes_boite_alerte (_T('spiplistes:Erreur_courrier_titre_vide'), true);
		}
	}

	//////////////////////////////////////////////////////
	// recharge le courrier pour edition
	if($id_courrier > 0) {
		
		$sql_select_tmp = "email_test,date,titre,texte,message_texte,type,statut,date_debut_envoi,date_fin_envoi";
		$sql_select_int = "id_liste,id_auteur,total_abonnes,nb_emails_envoyes,nb_emails_echec,nb_emails_non_envoyes,nb_emails_texte,nb_emails_html";
		$sql_select_str = "titre";
		$sql_select = $sql_select_int.",".$sql_select_str.",".$sql_select_tmp;
		
		if($row = sql_fetsel($sql_select, "spip_courriers", "id_courrier=".sql_quote($id_courrier), '', '', 1)) {
			foreach(explode(",", $sql_select) as $key) {
				$$key = $row[$key];
			}
			foreach(explode(",",$sql_select_int) as $key) {
				$$key = intval($$key);
			}
			foreach(explode(",",$sql_select_str) as $key) {
				$$key = typo($$key);
			}

			if($change_statut == _SPIPLISTES_COURRIER_STATUT_READY) {
				//$titre = propre($titre); // pas de propre ici, ca fait un <p> </p>
				// Le statut n'est modifie ici, mais 
				// par courrier_casier en retour de ce formulaire
				
				// $texte = spiplistes_courrier_propre($texte);
				$texte = spiplistes_texte_propre ($texte);
				
				spiplistes_courrier_modifier(
					$id_courrier
					, array(
						'titre' => $titre
						, 'texte' => $texte
					)
				);
				spiplistes_log("ID_COURRIER #$id_courrier titre,texte MODIFIED BY ID_AUTEUR #$connect_id_auteur");
				$statut = $change_statut;
			}
			else if($change_statut == _SPIPLISTES_COURRIER_STATUT_STOPE){
				spiplistes_courrier_supprimer_queue_envois('id_courrier', $id_courrier);
				spiplistes_log("ID_COURRIER #$id_courrier CANCELLED BY ID_AUTEUR #$connect_id_auteur");
			}
			
			// prepare le texte texte seul
			if(!in_array($statut, array(
					  _SPIPLISTES_COURRIER_STATUT_REDAC
					, _SPIPLISTES_COURRIER_STATUT_READY
					, _SPIPLISTES_COURRIER_STATUT_PUBLIE
					, _SPIPLISTES_COURRIER_STATUT_STOPE
					))
			) {
				
				//$texte = spiplistes_courrier_propre($texte);
				$texte = spiplistes_texte_propre ($texte);
			}
			if(!empty($message_texte)){
				$alt_message_texte = _T('spiplistes:calcul_patron');
			}
			else{
				$alt_message_texte = _T('spiplistes:calcul_html');
				$message_texte = spiplistes_courrier_version_texte($texte);
			}
			// construit la boite de selection destinataire
			$boite_selection_destinataire = 
				(($statut==_SPIPLISTES_COURRIER_STATUT_REDAC) || ($statut==_SPIPLISTES_COURRIER_STATUT_READY))
				? spiplistes_destiner_envoi($id_courrier, $id_liste
						, $flag_admin
						, $flag_moderateur
						, $listes_moderees
						, $statut, $type, 'btn_changer_destination', $email_test)
				: ""
				;
		}
	} // end if()

	//////////////////////////////////////////////////////
	// preparation des boutons si droits
	$gros_bouton_modifier = 
		$gros_bouton_dupliquer = 
		$gros_bouton_supprimer = 
		$gros_bouton_arreter_envoi = '';
	

	if($flag_autorise) {
		
		if(($statut == _SPIPLISTES_COURRIER_STATUT_REDAC) || ($statut == _SPIPLISTES_COURRIER_STATUT_READY)) {
		// Le courrier peut-etre modifie si en preparation 
			$gros_bouton_modifier = "<!-- bouton modifier -->\n" .
				icone (
					_T('spiplistes:Modifier_ce_courrier') // legende bouton
					, generer_url_ecrire(_SPIPLISTES_EXEC_COURRIER_EDIT,'id_courrier='.$id_courrier) // lien
					, spiplistes_items_get_item('icon', $statut) // image du fond
					, "edit.gif" // image de la fonction. Ici, le crayon
					, '' // alignement
					, false // pas echo, demande retour
					) 
					. $eol
				;
			
		}
		
		// Le courrier peut-etre supprime si obsolete
		if(in_array($statut, array(_SPIPLISTES_COURRIER_STATUT_REDAC
								   , _SPIPLISTES_COURRIER_STATUT_PUBLIE
								   , _SPIPLISTES_COURRIER_STATUT_AUTO
								   , _SPIPLISTES_COURRIER_STATUT_VIDE
								   , _SPIPLISTES_COURRIER_STATUT_IGNORE
								   , _SPIPLISTES_COURRIER_STATUT_STOPE
								   , _SPIPLISTES_COURRIER_STATUT_ERREUR))
					) {
			$gros_bouton_supprimer = 
				'<div style="margin-top:1ex">'
				. icone (
					_T('spiplistes:Supprimer_ce_courrier')
					, generer_url_ecrire(_SPIPLISTES_EXEC_COURRIERS_LISTE, 'btn_supprimer_courrier='.$id_courrier)
					, _DIR_PLUGIN_SPIPLISTES_IMG_PACK.'poubelle_msg.gif'
					, ''
					, 'right'
					, false
					)
				. '</div>'.$eol
				;
		}
		// Un courrier publie ou stoppe peut-etre duplique pour edition
		// on revient sur cette page avec le contenu recupere
		if(in_array($statut, array(_SPIPLISTES_COURRIER_STATUT_PUBLIE
								   , _SPIPLISTES_COURRIER_STATUT_AUTO
								   , _SPIPLISTES_COURRIER_STATUT_STOPE))
					) {
			$gros_bouton_dupliquer = 
				"<div style='margin-top:1ex;'>"
				. icone (
					_T('spiplistes:dupliquer_ce_courrier')
					, generer_url_ecrire(_SPIPLISTES_EXEC_COURRIER_GERER, "btn_dupliquer_courrier=$id_courrier")
					, _DIR_PLUGIN_SPIPLISTES_IMG_PACK.'stock_mail.gif'
					, _DIR_IMG_PACK."creer.gif"
					, "right"
					, false
					)
				. "</div>\n"
				;
		}
		
		if($statut == _SPIPLISTES_COURRIER_STATUT_ENCOURS) {
		// L'envoi d'un courrier en cours peut etre stoppe
			$gros_bouton_arreter_envoi = 
				icone (
					_T('spiplistes:Arreter_envoi')
					// si arreter envoi, passe la main a exec/spiplistes_courriers_casier
					, generer_url_ecrire(_SPIPLISTES_EXEC_COURRIERS_LISTE, "btn_arreter_envoi=$id_courrier")
					, _DIR_PLUGIN_SPIPLISTES_IMG_PACK."courriers_redac-24.png"
					, _DIR_PLUGIN_SPIPLISTES_IMG_PACK."stop-top-right-24.png"
					, "right"
					, false
					)
				. fin_cadre_relief(true)
				;
		}
		if($statut == _SPIPLISTES_COURRIER_STATUT_READY) {
			if(!$id_liste && !$id_auteur_test) {
				// normalement, la validation est locale, mais si l'utilisateur
				// part sur un casier, le retour ici est incomplet...
				// cas particulier d'un appel d'un courrier ready a partir des casiers
				// il faut recreer $id_auteur_test si id_liste == 0
				if(!($id_auteur_test = spiplistes_idauteur_depuis_email($email_test))) {
					spiplistes_log("ERR: id_auteur_test #$id_auteur_test (id_auteur missing ?)");
				}
			}
			if(($id_liste > 0) || ($id_auteur_test > 0)) {
				$boite_confirme_envoi = 
					  debut_cadre_couleur('', true)
					// formulaire de confirmation envoi
					// renvoie sur la page des casiers
					. '<form action="'
						. generer_url_ecrire(_SPIPLISTES_EXEC_COURRIERS_LISTE,'id_courrier='.$id_courrier)
						. '" method="post">'.$eol
					. '<p style="text-align:center;font-weight:bold;" class="verdana2">'
						. _T('spiplistes:confirme_envoi')
						. '</p>'.$eol
					. '<input type="hidden" name="id_liste" value="'.$id_liste.'" />'.$eol
					. '<input type="hidden" name="id_courrier" value="'.$id_courrier.'" />'.$eol
					. '<input type="hidden" name="id_auteur_test" value="'.$id_auteur_test.'" />'.$eol
					. '<div style="text-align:left;">'.$eol
					. '<input type="submit" name="btn_annuler_envoi" value="'
						. _T('spiplistes:annuler_envoi').'" class="fondo" style="float:left" />'.$eol
					. '<div style="text-align:right;width:100%">'.$eol
					. '<input type="submit" name="btn_confirmer_envoi" value="'
						. _T('spiplistes:Envoyer_ce_courrier').'" class="fondo" />'.$eol
					. '</div>'.$eol
					. '</div>'.$eol
					. '</form>'
					. fin_cadre_couleur(true)
					;
			}
		}
	}

	/////////////////////
	// prepare le message statut du courrier
	if($id_courrier > 0) {
		$le_type = _T('spiplistes:message_type');
		
		if($statut != _SPIPLISTES_COURRIER_STATUT_REDAC) {
			if(!empty($email_test)) {
				$str_destinataire = _T('spiplistes:email_adresse') . " : <span style='font-weight:bold;color:gray;'>$email_test</span>";
			}
			else {
				if($row = sql_fetsel('titre', 'spip_listes', "id_liste=".sql_quote($id_liste), '', '', 1)) {
					$str_destinataire = ""
						. _T('spiplistes:Liste_de_destination') 
						. " : <a href='".generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_GERER, "id_liste=$id_liste")."'>"
							. typo($row['titre']) . "</a>"
						. " " . spiplistes_nb_abonnes_liste_str_get($id_liste)
						;
				}
				else {
					$str_destinataire = _T('spiplistes:Courriers_sans_liste');
				}
			}
		} //
		
		$str_statut_courrier = "";
		
		switch($statut) {
			case _SPIPLISTES_COURRIER_STATUT_REDAC:
				$str_statut_courrier = _T('spiplistes:message_en_cours')."<br />"
				.	(
					($flag_autorise)
					? _T('spiplistes:modif_envoi')
					: ""
					)
				;
				break;
			case _SPIPLISTES_COURRIER_STATUT_READY:
				$str_statut_courrier = ""
					. _T('spiplistes:message_presque_envoye') . "<br />"
					. $str_destinataire . "<br />\n"
					;
				break;
			case _SPIPLISTES_COURRIER_STATUT_ENCOURS:
				$str_statut_courrier = ""
					. _T('spiplistes:message_en_cours')."<br />$str_destinataire<br /><br />"
					//. "<a href='?exec=spip_listes'>["._T('spiplistes:voir_historique')."]</a>"
					;
				break;
			case _SPIPLISTES_COURRIER_STATUT_PUBLIE:
			case _SPIPLISTES_COURRIER_STATUT_AUTO:
				$str_statut_courrier = ""
					. "<span>"
					. "<strong>"._T('spiplistes:message_arch')."</strong></span>"
					. "<ul>"
					. " <li>$str_destinataire</li>"
					. " <li>"._T('spiplistes:envoi_date').affdate_heure($date)."</li>"
					. " <ul>"
					. "  <li>"._T('spiplistes:envoi_debut').affdate_heure($date_debut_envoi)."</li>"
					. "  <li>"._T('spiplistes:envoi_fin').affdate_heure($date_fin_envoi)."</li>"
					. " </ul>"
					. " <li>"._T('spiplistes:nbre_abonnes').$total_abonnes."</li>"
					. " <ul>"
					. "  <li>"._T('spiplistes:format_html__n', array('n' => $nb_emails_html))."</li>"
					. "  <li>"._T('spiplistes:format_texte__n', array('n' => $nb_emails_texte))."</li>"
					. "  <li>"._T('spiplistes:desabonnes')." : ".$nb_emails_non_envoyes."</li>"
					. " </ul>"
					. " <li>"._T('spiplistes:erreur_envoi').$nb_emails_echec."</li>"
					. "</ul>"
					;
		} // end switch()
		if(!empty($str_statut_courrier)) {
			$str_statut_courrier = "<span class='verdana2'>".$str_statut_courrier."</span>";
		}
	} // end if()
	
////////////////////////////////////
// PAGE CONTENU
////////////////////////////////////

	$titre_page = _T('spiplistes:edition_du_courrier');
	// Permet entre autres d'ajouter les classes a la page : <body class='$rubrique $sous_rubrique'>
	$rubrique = _SPIPLISTES_PREFIX;
	$sous_rubrique = "courrier_gerer";

	$commencer_page = charger_fonction('commencer_page', 'inc');
	echo($commencer_page(_T('spiplistes:spiplistes') . " - " . trim($titre_page), $rubrique, $sous_rubrique));

	// la gestion des listes de courriers est reservee aux admins 
	if($connect_statut != "0minirezo") {
		die (spiplistes_terminer_page_non_autorisee() . fin_page());
	}
	
	$page_result = ""
		. "<br /><br /><br />\n"
		. spiplistes_gros_titre($titre_page, '', true)
		. barre_onglets($rubrique, $sous_rubrique)
		. debut_gauche($rubrique, true)
		. spiplistes_boite_info_id(_T('spiplistes:Courrier_numero_'), $id_courrier, true)
		. spiplistes_naviguer_paniers_courriers(_T('spiplistes:aller_au_panier_'), true)
		//. $boite_documents
		. pipeline('affiche_gauche', array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
			//. creer_colonne_droite($rubrique, true)  // spiplistes_boite_raccourcis() s'en occupe
		. spiplistes_boite_raccourcis(true)
		. spiplistes_boite_autocron()
		. pipeline('affiche_droite', array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
		. debut_droite($rubrique, true)
		;
		
	if($id_courrier > 0) {
	/////////////////////
	// construction du ventre
		$page_result .= "\n<!-- construction du ventre -->\n"
			. $message_erreur
			. debut_cadre_relief(spiplistes_items_get_item('icon', $statut), true)
			. "<table width='100%'  border='0' cellspacing='0' cellpadding='0'>"
			. "<tr>"
			. "<td>".spiplistes_gros_titre($titre, spiplistes_items_get_item('puce', $statut), true)."</td>"
			. "<td rowspan='2' style='vertical-align:top;width:90px;'>"
				// si besoin, l'un de ces trois boutons apparait
				. $gros_bouton_modifier
				. $gros_bouton_arreter_envoi
				. $gros_bouton_dupliquer
				."</td>"
			. "</tr>\n"
			. "<tr> "
			. "<td>"
			. "<p class='verdana2' style='font-size:120%;color:red;font-weight:bold;'>$le_type</p>\n"
			. "<p class='verdana2'>$str_statut_courrier</p>\n"
			. "</td>"
			. "</tr>\n"
			. "</table>"
			. $boite_confirme_envoi
			. $boite_selection_destinataire
			. "<br />\n"
			;

		function spiplistes_generer_oeil ($params) {
			return(
				"&nbsp;<a href='"
				. generer_url_ecrire(_SPIPLISTES_EXEC_COURRIER_PREVUE, $params)
				. "' title='"._T('spiplistes:Apercu_plein_ecran')."' target='_blank'>\n"
				. spiplistes_icone_oeil() . "</a>"
			);
		}

		// previsu
		$params = "id_courrier=$id_courrier&id_liste=$id_liste";
		$oeil_html = spiplistes_generer_oeil($params. "&lire_base=oui&plein_ecran=oui");
		$oeil_texte = spiplistes_generer_oeil($params . "&lire_base=oui&plein_ecran=oui&format=texte");
			
		$page_result .= ""
			. debut_cadre_couleur('', true)
			. "<form id='choppe_patron-1' action='$form_action' method='post' name='choppe_patron-1'>\n"
			. "<div id='previsu-html' class='switch-previsu'>\n"
			. _T('spiplistes:version_html') . $oeil_html
				. " / " . "<a href='javascript:jQuery(this).switch_previsu()'>" 
				. _T('spiplistes:version_texte') . $oeil_texte
			. "<div>\n"
			. "<iframe class='previsu-edit'"
				. " src='".generer_url_ecrire(_SPIPLISTES_EXEC_COURRIER_PREVUE, $params . "&lire_base=oui")
				. "' width='100%' height='500'></iframe>\n"
			. "</div>\n"
			. "</div>\n" // fin id='previsu-html
			. "<div id='previsu-texte' class='switch-previsu' style='display:none;'>\n"
			. "<a href='javascript:jQuery(this).switch_previsu()'>" . _T('spiplistes:version_html') . "</a>\n"
				. $oeil_html
				. " / " 
				. _T('spiplistes:version_texte') . "</a> $oeil_texte\n"
			. "<div>\n"
			//. "<pre>"
			. "<iframe class='previsu-edit'"
				. " src='".generer_url_ecrire(_SPIPLISTES_EXEC_COURRIER_PREVUE, $params . "&format=texte&lire_base=oui")
				."' width='100%' height='500'></iframe>\n"
			//. "</pre>"
			. "</div>\n"
			. "</div>\n" // fin id='previsu-texte
			. "</form>\n"
			. fin_cadre_couleur(true)
			
			//
			// fin de la boite
			. fin_cadre_relief(true)
			//
			. $gros_bouton_supprimer
			;
	} // end if
	else {
		$page_result .= 
			(empty($message_erreur))
			? spiplistes_boite_alerte (_T('spiplistes:Erreur_courrier_introuvable'), true)
			: $message_erreur
			;
	}

	echo($page_result);
	
	// GERER COURRIER: FIN DE PAGE
	
	echo pipeline('affiche_milieu',array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
		, spiplistes_html_signature(_SPIPLISTES_PREFIX)
		, fin_gauche(), fin_page();

} // end function exec_spiplistes_courrier_gerer ()
/**
 * @versin CP-20080603
 * @return la boite en liste des abonnes a une liste
 * 	si $id_liste == 0, liste tous les abonnements
 * @param $id_liste entier
 * @param $statut_liste staut ou false
 * @param $tri string: 'statut', 'nom', ou 'nombre' (qte)
 * @param $debut id_auteur du premier affiche
 * @param $script_retour string
 */
function spiplistes_listes_boite_abonnes ($id_liste, $statut_liste, $tri, $debut, $script_retour) {

	global $spip_lang_left, $spip_lang_right;
	
	$id_liste = intval($id_liste);
	$legende_tableau = '';

	// construction de la req SQL
	$sql_select = "
		aut.id_auteur AS id_auteur,
		aut.statut AS statut,
		aut.login AS login,
		aut.nom AS nom,
		aut.email AS email,
		aut.url_site AS url_site,
		fmt.`spip_listes_format` AS format,
		UPPER(aut.nom) AS unom,
		COUNT(lien.id_liste) as compteur";
	$sql_from = "
		spip_auteurs AS aut
		LEFT JOIN spip_auteurs_listes AS lien ON aut.id_auteur=lien.id_auteur
		LEFT JOIN spip_listes AS liste ON (lien.id_liste = liste.id_liste)
		LEFT JOIN spip_auteurs_elargis AS fmt ON aut.id_auteur=fmt.id_auteur";
	$sql_where = array("aut.statut <> ".sql_quote('5poubelle'));
	if($id_liste > 0) {
		$sql_where[] = "lien.id_liste=".sql_quote($id_liste);
	}
	$sql_group = 'aut.id_auteur';
	switch ($tri) {
		case 'statut':
			$sql_order = array('statut','login','unom');
			break;
		case 'nombre':
			$sql_order = array('compteur DESC','unom');
			break;
		default:
			$tri = 'nom';
			$sql_order = array('unom');
	}

	$nb_auteurs = sql_countsel('spip_auteurs');
	
	if($sql_result = sql_select(array('id_auteur', 'format'), 'spip_auteurs_listes'))
	{
		$abonnes = array();
		while($row = sql_fetch($sql_result))
		{
			if(!isset($abonnes[$row['id_auteur']])) { 
				$abonnes[$row['id_auteur']] = array();
				$nb_abonnes++; 
			}
			$abonnes[$row['id_auteur']][$row['format']]++;
			$abonnes[$row['format']]++;
		}
	}
	
	if(!$id_liste)
	{
		$legende_tableau = trim(spiplistes_str_auteurs($nb_auteurs)) 
		. ', '
		. _T('spiplistes:_dont_')
		. spiplistes_str_abonnes ($nb_abonnes) 
		;
		if(isset($abonnes['non']) && $abonnes['non'])
		{
			$legende_tableau .= _T('spiplistes:_dont_n_sans_format_reception', array('n' => $abonnes['non']));
		}
		else if($nb_abonnes)
		{
			$legende_tableau .= _T('spiplistes:_avec_');
		}
		$legende_tableau .= 
			($ii = intval($abonnes['html']))
			? spiplistes_str_abonnements(intval($abonnes['html'])) . _T('spiplistes:_au_format_s', array('s' => _T('spiplistes:html')))
			: ''
			;
		$legende_tableau .= 
			($jj = intval($abonnes['texte']))
			? ($ii?', ':''). spiplistes_str_abonnements(intval($abonnes['texte'])) . _T('spiplistes:_au_format_s', array('s' => _T('spiplistes:texte')))
			: ''
			;
		$legende_tableau .= ''
			. '.'
			;
	}
	
	$nombre_abonnes = 
		($id_liste > 0)
		? spiplistes_abonnements_compter($id_liste ? "id_liste=".sql_quote($id_liste) : "")
		// demande inventaire complet des auteurs (liste abonnes_tous)
		: sql_countsel("spip_auteurs")
		;

	// reglage du debut
	if(!$debut) {
		// si js pas active, recupere dans l'url
		$debut = intval(_request('debut'));
	}
	if ($debut > ($ii = $nombre_abonnes - _SPIPLISTES_LIGNES_PAR_PAGE)) {
		$debut = max(0, $ii);
	}
	
	$sql_result = sql_select($sql_select, $sql_from, $sql_where, $sql_group, $sql_order, $debut . ',' . _SPIPLISTES_LIGNES_PAR_PAGE);
	if ($sql_result === false) {
		spiplistes_sqlerror_log("listes_boite_abonnes");
	}

	$auteurs = array();
	$les_auteurs = array();
	while ($row = sql_fetch($sql_result)) {
		if ($row['statut'] == '0minirezo') {
			$row['restreint'] = sql_count(sql_select(
				"*"
				, "spip_auteurs_rubriques"
				, "id_auteur=".sql_quote($row['id_auteur'])
				));
		}
		$auteurs[] = $row;
		$les_auteurs[] = $row['id_auteur'];
	}
		
	$lettres_onglet = array();
	
	if($nombre_abonnes > 10) { 
		// SELECT DISTINCT UPPER(LEFT(nom,1)) AS l, COUNT(*) AS n FROM spip_auteurs GROUP BY l ORDER BY l
		$sql_result = sql_select(
			array("DISTINCT UPPER(LEFT(aut.nom,1)) AS l"
				, "COUNT(*) AS n")
			, (($id_liste > 0) ? $sql_from : 'spip_auteurs AS aut')
			, $sql_where 
			, "l"
			, array("l")
			);
		if($result === false) {
				spiplistes_sqlerror_log("listes_boite_abonnes");
		} 
		else {
			$count = 0;
			while ($row = sql_fetch($sql_result)) {
				$lettres_onglet[$row['l']] = $count;
				$count += intval($row['n']);
			}
		}
	}
	
	$legende_tableau =
		($id_liste)
		? spiplistes_nb_abonnes_liste_str_get($id_liste)
		: $legende_tableau
		;
	$result = ""
		. "<div id='"._SPIPLISTES_ID_PETITE_BOITE."'>\n"
		. "<div class='verdana2' id='legend-abos1-propre'>"
		. '<small>' . $legende_tableau . '</small>'
		. "</div>\n"
		;
		
	function spiplistes_lien_ajaxsqueeze ($r_script, $r_param, $a_script, $a_param, $id_dest, $title, $html) {
		$exec_url = generer_url_ecrire($r_script, $r_param);
		$action_url = generer_action_auteur($a_script, $a_param);
		$result = "<a href='" . $exec_url . "'"
				. " onclick=\"javascript:return AjaxSqueeze('$action_url', '$id_dest', '$exec_url', event)\""
				. " title='".$title."'>".$html."</a>";
		return($result);
	}

	
	//////////////////////////////////
	// tableau des resultats
	$result .= ""
		. "<table border='0' cellpadding='3' cellspacing='0' width='100%' class='verdana1 spiplistes-abos'>\n"
		;
	$colspan = 0;
	
	// titres du tableau (a-la-SPIP, en haut)
	$icon_auteur = spiplistes_corrige_img_pack("<img src='"._DIR_IMG_PACK."/admin-12.gif' alt='' border='0' />");
	$id_liste_url = ($id_liste ? "&id_liste=$id_liste" : "");
	$result .= ""
		. "<tr bgcolor='#DBE1C5'>"
		//
		// #1: statut auteur (icone)
		. "<th width='20'>"
		.	(
			($tri=='statut')
			? $icon_auteur
			: spiplistes_lien_ajaxsqueeze ($script_retour, "id_liste=$id_liste&tri=statut&debut=0"
					, _SPIPLISTES_ACTION_LISTE_ABONNES
					, $id_liste." 0 statut", _SPIPLISTES_ID_PETITE_BOITE
					, _T('lien_trier_statut'), $icon_auteur)
			)
		. "</th>\n"
		;
		$colspan++;
		
		// #2: nom
	$result .= ""
		. "<th>"
		.	(
			($tri == '' || $tri=='nom')
			? _T('info_nom')
			: spiplistes_lien_ajaxsqueeze ($script_retour, "id_liste=$id_liste&tri=nom&debut=0"
					, _SPIPLISTES_ACTION_LISTE_ABONNES
					, $id_liste." 0 nom", _SPIPLISTES_ID_PETITE_BOITE
					, _T('lien_trier_nom'), _T('info_nom'))
			)
		. "</th>\n";
		$colspan++;
		
		// #3: contact mail
	$result .= ""
		. "<th>" . _T('email')
		. "</th>\n"
		;
		$colspan++;
		
	$result .= ""
		// #4: site
		.	"<th>"._T('info_site')
		. "</th>\n";
		$colspan++;
		
	$result .= ""
		// #5: Format si abonne	
		.	"<th>"._T('spiplistes:format')
		. "</th>\n"
		;
		$colspan++;
		
	// si dans la page abonnes_tous, inventaire nb abonnements
	if($id_liste == 0) {	
			// #6: Nombre d'abonnements	
			// si js inactif, $exec_url prend le relais
		$result .= ""
			.	"<th>"
			.	(
				($tri=='nombre')
				? _T('spiplistes:nb_abos')
				: spiplistes_lien_ajaxsqueeze ($script_retour, "id_liste=$id_liste&tri=nombre&debut=0"
						, _SPIPLISTES_ACTION_LISTE_ABONNES
						, $id_liste." 0 nombre", _SPIPLISTES_ID_PETITE_BOITE
						, _T('spiplistes:lien_trier_nombre'), _T('spiplistes:nb_abos'))
				)
			. "</th>\n"
			;
		$colspan++;
	}
		
		// #7: Modifier l'abonnement
	$result .= ""
		.	"<th>"
		. _T('spiplistes:modifier')
		. "</th>\n"
		;
		$colspan++;
		
		// #8: supprimer l'abonne'
	$result .= ""
		.	"<th title='"._T('spiplistes:supprimer_un_abo')."'>"
		. _T('spiplistes:sup_')
		. "</th>\n"
		;
		$colspan++;
		
		// fin de la ligne de titre
	$result .= "</tr>\n";
	
	// onglets de pagination (si pagination)
	if ($nombre_abonnes > _SPIPLISTES_LIGNES_PAR_PAGE) {
		$result .= ""
			. "<tr class='onglets'><td colspan='$colspan'>"
			;
		// onglets : affiche les chiffres 
		$result .= "<!-- onglets chiffres -->\n";
		for ($j=0; $j < $nombre_abonnes; $j+=_SPIPLISTES_LIGNES_PAR_PAGE) {
			if ($j > 0) $result .= " | ";
			
			if ($j == $debut) {
				$result .= "<strong>$j</strong>";
			} else {
				// si js inactif, $exec_url prend le relais
				$exec_url = generer_url_ecrire($script_retour, "id_liste=$id_liste&tri=$tri&debut=$j");
				// sinon, ajax animera la boite des abos
				$action_url = generer_action_auteur(_SPIPLISTES_ACTION_LISTE_ABONNES
					, $id_liste." ".$j." ".$tri);
//				$action_url = parametre_url($action_url, "redirect=$script_retour");

				$result .= 
					"<a href='"
						. parametre_url($exec_url, 'redirect', $script_retour)
						. "' onclick=\"return AjaxSqueeze('$action_url', '"._SPIPLISTES_ID_PETITE_BOITE."', '$exec_url', event)\">"
						. $j
						. "</a>\n"
						;
			}
			
			if (($debut > $j)  && ($debut < $j+_SPIPLISTES_LIGNES_PAR_PAGE)) {
				$result .= " | <strong>$debut</strong>";
			}
		}
		$result .= ""
			. "</td></tr>\n"
			;
			
		// onglets : affichage des lettres
		$result .= ""
			. "<tr class='onglets'><td colspan='$colspan'>\n"
			. "<!-- onglets des lettres -->\n"
			;
		foreach ($lettres_onglet as $key => $val) {
			// si js inactif, $exec_url prend le relais
			$exec_url = generer_url_ecrire($script_retour, "id_liste=$id_liste&tri=$tri&debut=$val");
			// sinon, ajax animera la boite des abos
			$action_url = generer_action_auteur(_SPIPLISTES_ACTION_LISTE_ABONNES
				, $id_liste." ".$val." ".$tri);
			$result .= 
				($val == $debut)
				? "<strong>$key</strong> "
				: "<a href='"
					. parametre_url($exec_url, 'redirect', $exec_url)
					. "' onclick=\"return AjaxSqueeze('$action_url', '"._SPIPLISTES_ID_PETITE_BOITE."', '$exec_url',event)\">"
					. $key
					. "</a>\n"
				;
		}
		$result .= ""
			. "</td></tr>\n"
			;
		$result .= ""
			//. "<tr height='5'></tr>"
			;
	}
	
	//translate extra field data
	list(,,,$trad,$val) = explode("|",_T("spiplistes:options")); 
	$trad = explode(",",$trad);
	$val = explode(",",$val);
	$trad_map = array();
	for($index_map=0;$index_map<count($val);$index_map++) {
		$trad_map[$val[$index_map]] = $trad[$index_map];
	}

	$a_title_abo = array(
		'html' =>  " title=\""._T('spiplistes:Abonner_format_html')."\""
		, 'texte' =>  " title=\""._T('spiplistes:Abonner_format_texte')."\""
		, 'desabo' =>  " title=\""._T('spiplistes:Desabonner')."\""
	);

	$ii = 1;
	
	//////////////////////////////////
	// ici commence la vraie boucle

	// les auteurs (la liste)
	foreach ($auteurs as $row) {
		// couleur de ligne
		$couleur_ligne = (($ii++) % 2) ? '#eee' : '#fff';

		$result .= ""
			. "<tr style='background-color: $couleur_ligne'>"
			//
			// #1: statut auteur (icone)
			. "<td>"
			. spiplistes_bonhomme_statut($row)
			. "</td>\n"
			//
			// #2: nom
			. "<td>"
			. "<a href='".generer_url_ecrire(_SPIPLISTES_EXEC_ABONNE_EDIT, "id_auteur=".$row['id_auteur'])."'>".typo($row['nom']).'</a>'
			.	(
				($connect_statut == '0minirezo' && $row['restreint'])
				? " &nbsp;<small>"._T('statut_admin_restreint')."</small>"
				: ""
				)
			. "</td>\n"
			//
			// #3: contact mail
			. "<td>"
			.	(
				(strlen($row['email'])>3)
				? "<a href='mailto:".$row['email']."'>"
					. spiplistes_corrige_img_pack("<img src='"._DIR_IMG_PACK."m_envoi_rtl.gif' alt='' /></a>")
				: "<span title='"._T('spiplistes:Pas_adresse_email')."'>&bull;</span>"
				)
			. "</td>\n"
			//
			// #4: site
			. "<td>"
			.	(
					(strlen($row['url_site'])>3)
					? "<a href='".$row['url_site']."' class='spip_out'>"._T('lien_site')."</a>"
					: "&nbsp;"
				)
			. "</td>\n"
			//
			// #5: Format si abonne	
			. "<td>"
			.	(
				(($abo = $row['format']) && (!empty($abo)) && ($abo != 'non'))
				? $trad_map[$abo]
				: "<span title='"._T('spiplistes:Sans_abonnement')."'> - </span>"
				)
			. "</td>\n";

		// si dans la page abonnes_tous, inventaire nb abonnements
		if($id_liste == 0) {
			$result .= ""
				// #6: nombre d'abonnement
				. "<td>"
				.	(
					($row['compteur'])
					? "<span class='spiplistes-legend-stitre'>".$row['compteur']."</span>"
					: ""
					)
				. "</td>\n";
		}
		$result .= ""	
			//
			// #7: Modifier l'abonnement
			. "<td>"
			. "<a name='abo".$row['id_auteur']."'></a>"
			;

		$exec_url = generer_url_ecrire($script_retour,"id_liste=$id_liste&debut=$debut&tri=$tri");
		$action_url = generer_action_auteur('spiplistes_changer_statut_abonne', $row['id_auteur']."-format", $exec_url);
		$action_url_ajax = generer_action_auteur(_SPIPLISTES_ACTION_CHANGER_STATUT_ABONNE, $row['id_auteur']."-format");
		$action_url_ajax = parametre_url($action_url_ajax, 'id_liste', $id_liste);
		$action_url_ajax = parametre_url($action_url_ajax, 'debut', $debut);
		$action_url_ajax = parametre_url($action_url_ajax, 'tri', $tri);
		
		$a_format = array('html' => "", 'texte' => "", 'non' => "");
		foreach(array_keys($a_format) as $key) {
			$legend = ($key == 'non') ? 'format_aucun' : $key;
			$a_format[$key] = ""
				. "<a ".$a_title_abo[$key]." href='"
					. parametre_url($action_url, 'statut', $key)
					. "' onclick=\"return AjaxSqueeze('"
					. parametre_url($action_url_ajax, 'statut', $key)
						."', '"._SPIPLISTES_ID_GROSSE_BOITE."', '',event)\">"
					. _T('spiplistes:'.$legend)
					. "</a>\n"
				;		
		}
		$result .= ""
			. "&nbsp;"
				. $a_format[(in_array($abo, array('html','texte')) ? 'non' : 'texte')]
				. " | "
				. $a_format[(($abo == 'html') ? 'texte' : 'html')]
			. "</td>\n"
			;
		
		// #8: supprimer l'abonne' de la liste (ne supprime pas dans la table auteurs)
		$exec_url = generer_url_ecrire($script_retour,"id_liste=$id_liste&debut=$debut&tri=$tri");
		$action_url = generer_action_auteur('spiplistes_changer_statut_abonne', $row['id_auteur']."-supprimer", $exec_url);
		$action_url_ajax = generer_action_auteur(_SPIPLISTES_ACTION_CHANGER_STATUT_ABONNE, $row['id_auteur']."-supprimer");
		$action_url_ajax = parametre_url($action_url_ajax, 'id_liste', $id_liste);
		$action_url_ajax = parametre_url($action_url_ajax, 'debut', $debut);
		$action_url_ajax = parametre_url($action_url_ajax, 'tri', $tri);
		$action_url_ajax = parametre_url($action_url_ajax, 'script_retour', $script_retour);
		$result .= ""
			. "<td class='supprimer_cet_abo'>"
			. "<a ".$a_title_abo[$key]." href='$action_url'"
			. " onclick=\"return AjaxSqueeze('"
				. $action_url_ajax
					."', '"._SPIPLISTES_ID_GROSSE_BOITE."', '',event)\""
					. " title='"._T('spiplistes:supprimer_cet_abo')."'"
					. ">"
				. "&nbsp;<span>"._T('spiplistes:supprimer_cet_abo')."</span>"
				. "</a>\n"
			. "</td>\n"
			;
		// fin de la ligne du tableau
		$result .= "</tr>\n";
	} //
	
	$result .= ""
		. "</table>\n"
		;
		
	// fleche de pagination si besoin
	$debut_suivant = $debut + _SPIPLISTES_LIGNES_PAR_PAGE;
	
	if (($debut_suivant < $nombre_abonnes) || ($debut > 0)) {
		
		$exec_url = generer_url_ecrire($script_retour, "id_liste=$id_liste&tri=$tri&debut=$debut");
		
		$result .= ""
			. "<table id='bas' width='100%' border='0'>"
			. "<tr bgcolor='white'><td style='text-align: $spip_lang_left'>"
			;
		if ($debut > 0) {
			$debut_prec = strval(max($debut - _SPIPLISTES_LIGNES_PAR_PAGE, 0));
			$action_url = generer_action_auteur(_SPIPLISTES_ACTION_LISTE_ABONNES
				, $id_liste." ".$debut_prec." ".$tri);
			$result .= ""
				. "<a href='"
				. parametre_url($action_url, 'redirect', $exec_url)
				. "' onclick=\"return AjaxSqueeze('$action_url', '"._SPIPLISTES_ID_PETITE_BOITE."', '$exec_url',event)\">"
						. "&lt;&lt;&lt;"
						. "</a>\n"
				;
		}
		if($debut_suivant < $nombre_abonnes) {
			$action_url = generer_action_auteur(_SPIPLISTES_ACTION_LISTE_ABONNES
				, $id_liste." ".$debut_suivant." ".$tri);
			$result .= ""
				. "</td><td style='text-align: $spip_lang_right'>\n"
				. "<!-- fleche suivante -->\n"
				. "<a href='"
				. parametre_url($action_url, 'redirect', $exec_url)
				. "' onclick=\"return AjaxSqueeze('$action_url', '"._SPIPLISTES_ID_PETITE_BOITE."', '$exec_url',event)\">"
						. "&gt;&gt;&gt;"
						. "</a>\n"
				;
		}
		$result .= ""
			. "</td></tr>\n"
			. "</table>\n"
			;
	}
	
	$result .= ""
		. "</div>\n" // end _SPIPLISTES_ID_PETITE_BOITE
		;
		
	return($result);
}