/[openfoncier]/trunk/obj/instruction.class.php
ViewVC logotype

Diff of /trunk/obj/instruction.class.php

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 19 by fraynaud, Thu Feb 10 20:46:18 2011 UTC revision 20 by fraynaud, Mon Jul 18 15:27:17 2011 UTC
# Line 1  Line 1 
1  <?php  <?php
2  //$Id$  //$Id$
3  //gen openMairie le 10/02/2011 20:34  //gen openMairie le 10/02/2011 20:34
4    /*
5    $Id: instruction.class.php,v 1.29 2010-10-27 10:52:20 fraynaud Exp $
6    specific :
7    - cle secondaire
8      destruction autorisée que pour le dernier evenement
9      [delete the last event ]
10    - variable globale [global variables]
11        var $archive_date_depot;
12        var $retourformulaire;
13        var $idxformulaire;
14    - modification des données dans dossier trigger avant
15      [modify dossier data with trigger function]
16    - function moisdate : pour ajouter des mois a une date
17      [add months (delay) and calculation final date]
18    - voir script_lang.js : bible ...
19    */
20  require_once ("../gen/obj/instruction.class.php");  require_once ("../gen/obj/instruction.class.php");
21    
22  class instruction extends instruction_gen {  class instruction extends instruction_gen {
23    
24  function instruction($id,&$db,$debug) {      var $archive_date_depot; // specific
25          $this->constructeur($id,$db,$debug);      var $retourformulaire;   // specific
26  }// fin constructeur      var $idxformulaire;      // specific
27    
28        function instruction($id,&$db,$debug) {
29            $this->constructeur($id,$db,$debug);
30        }// fin constructeur
31    
32        function setvalF($val){
33            $this->valF['instruction'] = $val['instruction'];
34            $this->valF['destinataire'] = $val['destinataire'];
35            $this->valF['lettretype'] = $val['lettretype'];
36            $this->valF['dossier'] = $val['dossier'];
37            if($val['datecourrier']!="")
38                $this->valF['datecourrier'] = $this->dateDB($val['datecourrier']);
39            $this->valF['complement'] = $val['complement'];
40            $this->valF['complement2'] = $val['complement2'];
41            $this->valF['evenement'] = $val['evenement'];
42        }
43    
44    
45        function cleSecondaire($id,&$db,$val,$DEBUG) {
46        // controle suppression cle secondaire [secondary key delete control]
47        // ------------------------------------------------------------------------------------
48        // specifique detruire que le dernier   [specific instruction : delete the last event ]
49        // ------------------------------------------------------------------------------------
50            $dernierevenement='';
51            $sql="select max(instruction) from instruction where dossier ='".
52            $this->idxformulaire."'";
53            $dernierevenement = $db->getOne($sql);
54             if($dernierevenement==$id){
55                 $this->correct=true;
56                 $this->msg="<br>"._('destruction_chronologique')." ok <br>";
57              }else{
58                 $this->msg="<br>"._('destruction_evenement')." : ".$dernierevenement.
59                 "<br>"._('destruction_chronologique');
60                 $this->correct=false;
61              }
62        }
63    
64        function verifier($val,&$db,$DEBUG){
65            $this->correct=True;
66            $imgv="";
67            $f="&nbsp!&nbsp;&nbsp;&nbsp;&nbsp;";
68            $imgv="<img src='../img/punaise.png' style='vertical-align:middle' hspace='2' border='0'>";
69            // obligatoire
70            if ($this->valF['destinataire']==""){
71               $this->correct=false;
72               $this->msg= $this->msg.$imgv." "._('instruction')." ".
73               _('obligatoire').$f;
74            }
75            if ($val['datecourrier']==""){
76               $this->correct=false;
77               $this->msg= $this->msg.$imgv." "._('datecourrier')." ".
78               _('obligatoire').$f;
79            }
80            if ($val['evenement']==""){
81               $this->correct=false;
82               $this->msg= $this->msg.$imgv." "._('evenement')." ".
83               _('obligatoire').$f;
84            }
85        }//verifier
86    
87        function setValsousformulaire(&$form,$maj,$validation,$idxformulaire,$retourformulaire,$typeformulaire){
88            if ($validation==0) {
89                if ($maj == 0){
90                    $form->setVal("destinataire", $idxformulaire);
91                    $form->setVal("dossier", $idxformulaire);
92                    $form->setVal("datecourrier", date('Y-m-d'));
93                }
94                $form->setVal("bible_auto","bible_auto()");
95                $form->setVal("bible","bible()");
96                $form->setVal("bible2","bible2()");
97            }
98            $this->retourformulaire=$retourformulaire;
99            $this->idxformulaire=$idxformulaire;
100        }
101    
102        function setType(&$form,$maj) {
103        if ($maj < 2) { //ajouter et modifier
104            $form->setType('destinataire', 'hidden');
105            $form->setType('lettretype', 'hiddenstatic');
106            $form->setType('complement', 'textarea');
107            $form->setType('complement2', 'textarea');
108            $form->setType('complement3', 'hidden');
109            $form->setType('bible3', 'hidden');
110            $form->setType('complement4', 'hidden');
111            $form->setType('bible4', 'hidden');
112            $form->setType('complement5', 'hidden');
113            $form->setType('bible5', 'hidden');
114            $form->setType('complement6', 'hidden');
115            $form->setType('bible6', 'hidden');
116            $form->setType('complement7', 'hidden');
117            $form->setType('bible7', 'hidden');
118            $form->setType('complement8', 'hidden');
119            $form->setType('bible8', 'hidden');
120            $form->setType('complement9', 'hidden');
121            $form->setType('bible9', 'hidden');
122            $form->setType('complement10', 'hidden');
123            $form->setType('bible10', 'hidden');
124            $form->setType('complement11', 'hidden');
125            $form->setType('bible11', 'hidden');
126            $form->setType('complement12', 'hidden');
127            $form->setType('bible12', 'hidden');
128            $form->setType('complement13', 'hidden');
129            $form->setType('bible13', 'hidden');
130            $form->setType('complement14', 'hidden');
131            $form->setType('bible14', 'hidden');
132            $form->setType('complement15', 'hidden');
133            $form->setType('bible15', 'hidden');
134            $form->setType('bible_auto', 'httpclick');
135            $form->setType('bible', 'httpclick');
136            $form->setType('bible2', 'httpclick');
137            $form->setType('dossier', 'hiddenstatic');
138            $form->setType('delai', 'hidden');
139            $form->setType('etat', 'hidden');
140            $form->setType('accord_tacite', 'hidden');
141            $form->setType('action', 'hidden');
142            $form->setType('delai_notification', 'hidden');
143            $form->setType('avis', 'hidden');
144            $form->setType('archive_delai', 'hidden');
145            $form->setType('archive_etat', 'hidden');
146            $form->setType('archive_accord_tacite', 'hidden');
147            $form->setType('archive_avis', 'hidden');
148            $form->setType('archive_date_complet', 'hidden');
149            $form->setType('archive_date_rejet', 'hidden');
150            $form->setType('archive_date_limite', 'hidden');
151            $form->setType('archive_date_notification_delai', 'hidden');
152            $form->setType('archive_date_decision', 'hidden');
153            $form->setType('archive_date_validite', 'hidden');
154            $form->setType('archive_date_achevement', 'hidden');
155            $form->setType('archive_date_conformite', 'hidden');
156            $form->setType('archive_date_chantier', 'hidden');    
157            $form->setType('libelle', 'hiddenstatic');
158            if($maj==0){ // add
159                $form->setType('instruction', 'hiddenstatic');
160                $form->setType('evenement', 'select');
161                $form->setType('datecourrier', 'date2');
162            }else{ // modify
163                $form->setType('instruction', 'hiddenstatic');
164                $form->setType('evenement', 'hiddenstatic');
165                $form->setType('datecourrier', 'hiddenstaticdate');
166            }
167        }else{ // supprimer  [delete]
168            $form->setType('instruction', 'hiddenstatic');
169            $form->setType('dossier', 'hiddenstatic');
170            $form->setType('archive_delai', 'hiddenstatic');
171            $form->setType('archive_etat', 'hiddenstatic');
172            $form->setType('archive_accord_tacite', 'hiddenstatic');
173            $form->setType('archive_avis', 'hiddenstatic');
174            $form->setType('archive_date_complet', 'hiddenstatic');
175            $form->setType('archive_date_rejet', 'hiddenstatic');
176            $form->setType('archive_date_limite', 'hiddenstatic');
177            $form->setType('archive_date_notification_delai', 'hiddenstatic');
178            $form->setType('archive_date_decision', 'hiddenstatic');
179            $form->setType('archive_date_validite', 'hiddenstatic');
180            $form->setType('archive_date_achevement', 'hiddenstatic');
181        }
182        }
183    
184        function setTaille(&$form,$maj){
185            $form->setTaille('complement', 120);
186            $form->setTaille('complement2', 120);
187            $form->setTaille('datecourrier', 12);
188        }
189    
190        function setMax(&$form,$maj){
191            $form->setMax('complement',12 );
192            $form->setMax('complement2',12 );
193        }
194    
195        //function setSelect(&$form, $maj,&$db,$DEBUG,$idxformulaire) {
196        function setSelect(&$form, $maj,&$db,$DEBUG) {
197            if(file_exists ("../sql/".$db->phptype."/".$this->table.".form.inc"))
198                include ("../sql/".$db->phptype."/".$this->table.".form.inc");
199            if($maj<2){
200                // *** evenement ***
201                $contenu=array();
202                // etat du dossier
203                $sql="select etat from dossier where dossier ='".
204                      $this->idxformulaire."'";
205                $etat_dossier = $db->getOne($sql);
206                $nature_dossier= substr($this->idxformulaire,0,2);
207                // recherche des evenement de transition
208                $sql= $sql_transition." where transition.etat ='".$etat_dossier."' and (evenement.nature ='".
209                      $nature_dossier."' or (nature ='T' and nature !='CU')) order by evenement.action";
210                $res = $db->query($sql);
211                if (database::isError($res))
212                    die($res->getMessage());
213                $contenu[0][0]="";
214                $contenu[1][0]=_('choisir')." "._('evenement');
215                $k=1;
216                while ($row=& $res->fetchRow()){
217                    if($maj==0){ // ajouter
218                        $contenu[0][$k]=$row[0];
219                        $contenu[1][$k]=$row[1];
220                        $k++;
221                    }else{
222                        // select hiddenstatic
223                        $contenu[0][$k]=$row[0];
224                        $contenu[1][$k]=$row[1];
225                        $k++;
226                    }
227                }
228                $form->setSelect("evenement",$contenu);
229                // lien bible_auto  [link]
230                $contenu=array();
231                $contenu[0]=" automatique ";
232                $form->setSelect("bible_auto",$contenu);
233                // lien bible1
234                $contenu=array();
235                $contenu[0]=" Bible ";
236                $form->setSelect("bible",$contenu);
237                // lien bible2
238                $contenu=array();
239                $contenu[0]=" Bible ";
240                $form->setSelect("bible2",$contenu);
241            }
242        } // function select
243    
244        function setGroupe(&$form,$maj){
245            $form->setGroupe('evenement','D');
246            $form->setGroupe('libelle','G');
247            $form->setGroupe('datecourrier','G');
248            $form->setGroupe('lettretype','F');
249        }
250    
251        function setRegroupe(&$form,$maj){      
252            $form->setRegroupe('evenement','D',_('evenement'), "collapsible");
253            $form->setRegroupe('libelle','G','');
254            $form->setRegroupe('datecourrier','G','');
255            $form->setRegroupe('lettretype','F','');
256            $form->setRegroupe('complement','D',_('complement'), "startClosed");
257            $form->setRegroupe('bible_auto','G','');
258            $form->setRegroupe('bible','F','');
259            $form->setRegroupe('complement2','D',_('complement2'), "startClosed");
260            $form->setRegroupe('bible2','F','');
261        }
262        
263        function setLib(&$form,$maj) {
264            parent :: setLib($form,$maj);
265            $form->setLib('libelle',' ');
266            $form->setLib('bible_auto',"");
267            $form->setLib('bible',"");
268            $form->setLib('bible2',"");
269            $form->setLib('lettretype',"->"._(" courrier "));
270            $form->setLib('datecourrier',_(" du "));
271        }
272    
273        function setOnchange(&$form,$maj){
274            $form->setOnchange("datecourrier","fdate(this)");
275        }
276    
277        // ==================================================================
278        // trigger avant modification données    [trigger before modify data]
279        // ==================================================================
280        function triggerajouter($id,&$db,$val,$DEBUG) {
281            // mise a jour instruction avec evenement
282            // [modify instruction with evenement]
283            $sql= "select * from evenement where evenement =".$this->valF['evenement'];
284            $res = $db->query($sql);
285            if (database::isError($res))
286                die($res->getMessage());
287            if ($DEBUG == 1)
288                echo " la requete ".$sql." est exécutée<br>";
289            while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
290                $this->valF['action']=$row['action'];
291                $this->valF['delai']=$row['delai'];
292                $this->valF['etat']=$row['etat'];
293                $this->valF['accord_tacite']=$row['accord_tacite'];
294                $this->valF['delai_notification']=$row['delai_notification'];
295                $this->valF['avis']=$row['avis'];
296                if($row['lettretype']!="")
297                    $this->valF['lettretype']=$row['lettretype'];
298                else
299                    $this->valF['lettretype']="standard";
300            }
301            $sql= "select * from dossier where dossier = '".$this->valF['dossier']."'";
302            $res = $db->query($sql);
303            if (database::isError($res))
304                die($res->getMessage());
305            if ($DEBUG == 1)
306                echo " la requete ".$sql." est exécutée<br>";
307            while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
308                //
309                $this->archive_date_depot = $row['date_depot'];
310                // archive en instruction (si suppression)
311                $this->valF['archive_delai']=$row['delai'];
312                $this->valF['archive_accord_tacite']=$row['accord_tacite'];
313                $this->valF['archive_etat']=$row['etat'];
314                $this->valF['archive_avis']=$row['avis'];
315                // compatibilite pgsql
316                if($row['date_complet']!='')
317                   $this->valF['archive_date_complet']=$row['date_complet'];
318                if($row['date_rejet']!='')
319                   $this->valF['archive_date_rejet']= $row['date_rejet'];
320                if($row['date_limite']!='')
321                   $this->valF['archive_date_limite']= $row['date_limite'];
322                if($row['date_notification_delai']!='')
323                   $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
324                if($row['date_decision']!='')
325                   $this->valF['archive_date_decision']= $row['date_decision'];
326                if($row['date_validite']!='')
327                   $this->valF['archive_date_validite']= $row['date_validite'];
328                if($row['date_achevement']!='')
329                   $this->valF['archive_date_achevement']= $row['date_achevement'];
330                if($row['date_chantier']!='')
331                   $this->valF['archive_date_chantier']= $row['date_chantier'];
332                if($row['date_conformite']!='')
333                   $this->valF['archive_date_conformite']= $row['date_conformite'];  
334            }
335        }
336        
337        // ==================================================================
338        // valeur dossier  apres modification   [values dossier after action]
339        // ==================================================================
340        function triggerajouterapres($id,&$db,$val,$DEBUG) {
341            switch ($this->valF['action']) {
342            case "initialisation" :
343                $valF['delai']= $this->valF['delai'];
344                $valF['etat']= $this->valF['etat'];
345                $valF['accord_tacite']= $this->valF['accord_tacite'];
346                // la date_complet est la date de depot
347                $valF['date_complet']= $this->archive_date_depot;
348                $valF['date_limite'] =  $this->moisdate($valF['date_complet'],$valF['delai']);
349                $valF['date_notification_delai'] =  $this->moisdate($valF['date_complet'],1);
350                break;
351            case "notification" :
352                $valF['delai']= $this->valF['delai'];
353                $valF['etat']= $this->valF['etat'];
354                $valF['accord_tacite']= $this->valF['accord_tacite'];
355                // la date_complet est celle precedemment saisie
356                $valF['date_complet']=$this->valF['archive_date_complet'];
357                $valF['date_limite'] =  $this->moisdate($valF['date_complet'],$valF['delai']);
358                $valF['date_notification_delai'] =  $this->moisdate($valF['date_complet'],1);
359                // la date du courrier ne doit pas etre depasse par rapport au delai de
360                // notification    [verify notification date]
361                if($this->valF['archive_date_notification_delai']<$this->valF['datecourrier'])
362                    $this->msg=$this->msg."<br><img src='../img/erreur.gif'> "._("date_notification_delai")." ".
363                    $this->valF['archive_date_notification_delai']." < "._('datecourrier');
364                //
365                break;
366            case "retour" :
367                $valF['delai']= $this->valF['delai'];
368                $valF['etat']= $this->valF['etat'];
369                $valF['accord_tacite']= $this->valF['accord_tacite'];
370                // la date_complet est celle de l evenement
371                $valF['date_complet']= $this->valF['datecourrier'];
372                $valF['date_limite'] =  $this->moisdate($valF['date_complet'],$valF['delai']);
373                $valF['date_notification_delai'] =  $this->moisdate($valF['date_complet'],1);
374                break;
375            case "rejet" :
376                //$valF['delai']=0;   // *** delai a garder pour etat dpc
377                $valF['etat']= $this->valF['etat'];
378                $valF['accord_tacite']= $this->valF['accord_tacite'];
379                // la date rejet est initialisee
380                $valF['date_rejet']= $this->valF['datecourrier'];
381                // les dates de depart et fin d instruction sont annulées
382                $valF['date_limite'] ="";
383                $valF['date_notification_delai'] ="";
384                $valF['date_complet']="";
385                break;
386            case "majoration" :
387                $valF['delai']= $this->valF['archive_delai']+$this->valF['delai'];
388                $valF['etat']= $this->valF['etat'];
389                $valF['accord_tacite']= $this->valF['accord_tacite'];
390                $valF['date_complet']=$this->valF['archive_date_complet'];
391                // majoration de la date limite
392                $valF['date_limite'] =  $this->moisdate($valF['date_complet'],$valF['delai']);
393                $valF['date_notification_delai'] =  $this->moisdate($valF['date_complet'],1);
394                // la date du courrier ne doit pas etre depasse par rapport au delai de
395                // notification
396                if($this->valF['archive_date_notification_delai']<$this->valF['datecourrier'])
397                    $this->msg=$this->msg."<br><img src='../img/erreur.gif'>"._("date_notification_delai").
398                $this->valF['archive_date_notification_delai']." < "._('datecourrier');
399                break;
400            case "acceptation" :
401                $valF['etat']= $this->valF['etat'];
402                $valF['date_decision']= $this->valF['datecourrier'];
403                $valF['avis']= $this->valF['avis'];
404                // date de validite = date de l evenement + delai
405                $valF['date_validite'] =  $this->moisdate($this->valF['datecourrier'],$this->valF['delai']);
406                   break;
407            case "refus" :
408                $valF['etat']= $this->valF['etat'];
409                $valF['date_decision']= $this->valF['datecourrier'];
410                $valF['avis']= $this->valF['avis'];
411                break;
412            case "prolongation" :
413                $valF['date_validite'] =  $this->moisdate($this->valF['archive_date_validite'],$this->valF['delai']);
414                break;
415            case "sursis" :
416                $valF['date_limite'] =  $this->moisdate($this->valF['datecourrier'],$this->valF['delai']);
417                $valF['etat']= $this->valF['etat'];
418                $valF['accord_tacite']= $this->valF['accord_tacite'];
419                $valF['avis']= $this->valF['avis'];
420                $valF['date_decision']= $this->valF['datecourrier'];
421                $temp = $valF['date_limite'];
422                $valF['date_validite']= $this->moisdate($temp,2);
423                echo  $valF['date_limite']."vvv" ;
424                break;
425            case "execution" :
426                $valF['etat']= $this->valF['etat'];
427                $valF['date_chantier'] =  $this->valF['datecourrier'];
428                echo $this->msg=$this->msg.$valF['date_chantier']."***";
429                break;
430            case "achevement" :
431                $valF['etat']= $this->valF['etat'];
432                $valF['date_achevement'] = $this->valF['datecourrier'];
433                break;
434            case "archivage" :
435                $valF['etat']= $this->valF['etat'];
436                $valF['date_conformite'] = $this->valF['datecourrier'];
437                break;
438            /*
439              case "abandon" :
440                $valF['etat']= $this->valF['etat'];
441                   break;
442            */
443           default:
444            if ($this->valF['etat']!="")
445               $valF['etat']= $this->valF['etat'];
446            }// end switch
447        
448            // mise à jour dossier [modify dossier]
449            if($valF!=""){
450                $cle= " dossier = '".$this->valF['dossier']."'";
451                $res1= $db->autoExecute('dossier',$valF,DB_AUTOQUERY_UPDATE,$cle);
452                if (database::isError($res1))
453                    die($res->getMessage());
454                if ($DEBUG == 1)
455                  echo "La requête de mise à jour est effectuée.<br>";
456                $this->msg=$this->msg."<br>"._('enregistrement')." ".
457                $this->valF['dossier']." "._('table')." dossier [".
458                $db->affectedRows()." "._('enregistrement').
459                " "._('mis_a_jour')."]" ;
460            }
461        }
462        
463        // trigger before delete
464        function triggersupprimer($id,&$db,$val,$DEBUG) {
465            // archive en instruction (si suppression) [archive if delete instruction]
466            $valF['delai']=$val['archive_delai'];
467            $valF['accord_tacite']=$val['archive_accord_tacite'];
468            $valF['etat']=$val['archive_etat'];
469            $valF['avis']=$val['archive_avis'];
470            // if= compatibilite pgsql
471            if($val['archive_date_complet']!='')
472                $valF['date_complet']=$val['archive_date_complet'];
473            if($val['archive_date_rejet']!='')
474                $valF['date_rejet']= $val['archive_date_rejet'];
475            if($val['archive_date_limite']!='')
476                $valF['date_limite']= $val['archive_date_limite'];
477            if($val['archive_date_notification_delai']!='')
478                $valF['date_notification_delai']= $val['archive_date_notification_delai'];
479            if($val['archive_date_decision']!='')
480                $valF['date_decision']= $val['archive_date_decision'];
481            if($val['archive_date_validite']!='')
482                $valF['date_validite']= $val['archive_date_validite'];
483            if($val['archive_date_achevement']!='')
484                $valF['date_achevement']= $val['archive_date_achevement'];
485            if($val['archive_date_chantier']!='')
486                $valF['date_chantier']= $val['archive_date_chantier'];
487            if($val['archive_date_conformite']!='')
488                $valF['date_conformite']= $val['archive_date_conformite'];
489            $cle= " dossier = '".$val['dossier']."'";
490            $res= $db->autoExecute('dossier',$valF,DB_AUTOQUERY_UPDATE,$cle);
491            if (database::isError($res))
492                die($res->getMessage());
493            else{
494                if ($DEBUG == 1)
495                    echo "La requête de mise à jour est effectuée.<br>";
496            }
497        }
498        // =============================================
499        // calcul de date avec ajout de mois (delais)
500        // [add months (delay) and calculation final date]
501        // LIMITE DE LA FONCTION si delai >24 MOIS
502        // [limit : delay < 24 month]
503        // =============================================
504        function moisdate($date,$delaimois) {
505           $temp = explode("-" , $date);
506           $jour = (int) $temp[2];
507           $mois = (int) $temp[1];
508           $annee = (int) $temp[0];
509           // calcul si delai superieur à 12 (limite 24) [delay > 24 month]
510           if($delaimois>=12){
511               $delaimois=$delaimois-12;
512               $annee=$annee+1;
513           }
514           if($delaimois>=12){
515               $delaimois=$delaimois-12;
516               $annee=$annee+1;
517           }
518           // mois
519           $mois=$mois+$delaimois;
520           // calcul mois annee  [calculation number of years if > 12 month]
521           // nb de mois > à 12
522           if ($mois>12){
523               $mois=$mois-12;
524               $annee=$annee+1;
525           }
526           // Calcul du nombre de jours dans le mois sélectionné [calculation number of days]
527            switch($mois) {
528                case "2":
529                  if ($annee % 4 == 0 && $annee % 100 != 0 || $annee % 400 == 0)
530                      $jourmax = 29;
531                  else
532                      $jourmax = 28;
533                break;
534                case "4":
535                case "6":
536                case "9":
537                case "11":
538                 $jourmax = 30;
539                 break;
540                default:
541                 $jourmax = 31;
542            }
543            if ($jour > $jourmax)
544               $jour = $jourmax;
545        //$dateretour=$annee."-".$mois."-".$jour;
546        return $annee."-".$mois."-".$jour ;
547        }
548    
549  }// fin classe  }// fin classe
550  ?>  ?>

Legend:
Removed from v.19  
changed lines
  Added in v.20

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26