<!-- dtd de l'application annuaire -->
<!-- le ttl determine la frequence de raffraichissement des tables dynamiques 
       en secondes . Par defaut : 86400, donc 24h 
     link est un lien http vers un eventuel annuaire externe
-->
<!ELEMENT directories (tables?,directory+)>
<!ATTLIST directories
          ttl			CDATA			"86400"		
>

<!-- description d'un annuaire -->
<!ELEMENT directory (server,request,card)>
<!ATTLIST directory
          name			CDATA			#REQUIRED
          title			CDATA			#REQUIRED
          link			CDATA			#IMPLIED
          intro			CDATA			#IMPLIED
>

<!-- description du serveur LDAP accede -->
<!-- si binddn et bindpass ne sont pas saisis, connexion anonyme -->
<!ELEMENT server EMPTY>
<!ATTLIST server
          url			CDATA			#REQUIRED
          binddn		CDATA			#IMPLIED
          bindpass		CDATA			#IMPLIED
          secure (true|false)			'false'
>

<!-- description des tables liees a cet annuaire -->
<!-- l'element 'tables' permet de batir des tables memoires pour le canal annuaire
  chaque entree d'une table memoire est composee de 2 informations :
    - code : c'est un code associe a cette entree. facultatif
    - value : c'est la valeur de l'entree. C'est cette valeur qui sera affichee dans les listes
  les tables sont de 3 types :
    - static : le contenu est decrit dans le fichier xml
    - ldap : la table est issue d'une requete LDAP 
    - xml : la table est construite a l'aide d'un fichier xml externe
  les tables ldap et xml sont raffraichies en fonction du ttl du tag 'directories'
  - pour une table ldap : il faut preciser la requete LDAP qui permet de l'enrichir
     et les attributs qui serviront de code et de valeur
  - pour une table xml : il faut preciser le nom de ce fichier
     le fichier sera de la forme suivante :
       <list>
          <item code="xxx" value="machin" />
          <item ...
       </list>
       l'attribut code est facultatif. (en fait, pour une table, soit toujours present,
                 soit toujours absent)
  -->
<!ELEMENT tables (table+)>
<!ELEMENT table (item*)>
<!ATTLIST table
          name				ID				#REQUIRED
          type			(static|ldap|xml)   'static'
          attrCode			CDATA			#IMPLIED
          attrValue			CDATA			#IMPLIED
          base				CDATA			#IMPLIED
          scope				(sub|one|base)	'sub'
          filter			CDATA			#IMPLIED
          file				CDATA			#IMPLIED
          url				CDATA			#IMPLIED
          binddn			CDATA			#IMPLIED
          bindpass			CDATA			#IMPLIED
          secure			CDATA			#IMPLIED
          fieldOrder		CDATA			#IMPLIED
>

<!-- item est utilise pour les tables static. Ca correspond a un enregistrement 
     pour une table donnée, soit code est toujours present, soit il est toujours absent
-->
<!ELEMENT item EMPTY>
<!ATTLIST item
          code			CDATA			#IMPLIED
          value			CDATA			#REQUIRED
>

<!-- request : contient les elements qui vont permettre de construire la requete LDAP de recherche,
     et d'afficher les criteres  
     maxEntries determnie le nombre maximum d'entrees qu'on autorise suite a la requete
-->
<!ELEMENT request (elemOfRequest+)>
<!ATTLIST request
          base			CDATA			#REQUIRED
          scope			(sub|one|base)	'sub'
          maxEntries	CDATA			#IMPLIED
          identifiant	CDATA			#REQUIRED
>

<!-- elemOfRequest. C'est un des critere qui composera le filtre de recherche LDAP
     Il servira egalement de champs de saisie, sauf pour le type 'direct'
     peut etre de type 
         . direct : c'est un element de rquete non parametre
         . text : genere un champ de type text
                  c'est directement un element de la requete LDAP
                  le symbole %s sera remplace par le contenu du champ saisi
         . listTable : genere une lite déroulante
                  se refere a une des tables prealablement definies
                  le symbole %c sera remplace par le code selectionne, %v par la valeur
         . textTable : genere un champ de type text.
                  fait une recherche dans le champ 'valeur' d'une table a l'aide
                  du contenu de searchValue, et genere une requete ldap complexe
                  avec tous les codes de la table qui 'matchent' la recherche
     approx : valable pour un elem de type text. Permet une recherche approchee
              genere une case a cocher de demande de recherche approximative
-->

<!ELEMENT elemOfRequest EMPTY>
<!ATTLIST elemOfRequest
          type			(direct|text|listTable|textTable)		'text'
          filter		CDATA				#REQUIRED
          table			IDREF				#IMPLIED
          minChar		CDATA				#IMPLIED
          delStar		(false|true)        'true'
          approx		(false|true)		'false'
          label			CDATA				#IMPLIED
          searchValue	CDATA				#IMPLIED 
          maxEntries	CDATA				#IMPLIED       
>

<!-- card . permet de contruire la fiche finale de la personne, et eventuellement
     la liste intermediaire -->
<!ELEMENT card (line+) >
<!ATTLIST card
          maxCard		CDATA				#IMPLIED
          tri			CDATA				#IMPLIED
          link  		CDATA				#IMPLIED   
>          		

<!-- ligne : c'est une ligne de la fiche. 
     si liste=true, sert a produire la liste intermediaire 
     link permet de faire un lien vers un annuaire externe, pour cette fiche.
     l'expression %machin% est remplace par le contenu de l'attribut 'machin'
     attribute donne le nom d'attribut qui sert a l'affichage
     linkTable est utile pour le type table. Il indique si c'est le code pour la
     valeur qui doit etre affiche
-->       
<!ELEMENT line EMPTY>
<!ATTLIST line
          label			CDATA			#REQUIRED
          type			(direct|table)	'direct'
          attribute	    CDATA			#REQUIRED
          table			IDREF			#IMPLIED
          list			(false|true)	'false'
          link			CDATA			#IMPLIED
          linkTable		(code|value)	'code'
          tabToCard		(false|true)		'false'    
>
