[ Index ] |
|
Code source de SPIP Agora 1.4 |
1 <?php 2 /***************************************************** 3 * This file is part of Agora, web based content management system. 4 * 5 * Agora is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; version 2 of the License. 8 * 9 * Agora is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details (file "COPYING"). 13 * 14 * Copyright © Arnaud Martin, Antoine Pitrou et Philippe Rivière. 15 * List of authors detailed in "copyright_fr.html" file. 16 * E-mail : agora@sig.premier-ministre.gouv.fr 17 * Web site : http://www.agora.gouv.fr 18 *****************************************************/ 19 include ("ecrire/inc_version.php"); 20 21 // Ajout Clever Age 22 require_once(dirname(__FILE__). "/ecrire/include/bd/inc_type_document_factory.php"); 23 require_once(dirname(__FILE__). "/ecrire/include/bd/inc_document_factory.php"); 24 // Fin ajout 25 26 include_ecrire ("inc_filtres.php"); 27 include_ecrire("inc_charsets.php"); 28 include_ecrire ("inc_meta.php"); 29 include_ecrire ("inc_admin.php"); 30 31 //include_local("inc-cache.php"); 32 33 // recuperée depuis inc-cache.php 34 function creer_repertoire ($base, $subdir) { 35 if (file_exists("$base/.plat")) 36 return false; 37 38 $path = $base . '/' . $subdir; 39 40 if (file_exists($path)) 41 return true; 42 43 @mkdir($path, 0777); 44 @chmod($path, 0777); 45 $ok = false; 46 47 if ($f = @fopen("$path/.test", "w")) { 48 @fputs($f, '<' . '?php $ok = true; ?' . '>'); 49 @fclose($f); 50 include("$path/.test"); 51 } 52 53 if (!$ok) { 54 $f = @fopen("$base/.plat", "w"); 55 if ($f) 56 fclose($f); 57 else { 58 @header("Location: spip_test_dirs.php"); 59 exit; 60 } 61 } 62 63 return $ok; 64 } 65 66 // verifier les formats acceptes par GD 67 if ($test_formats == "oui") { 68 $gd_formats = array(); 69 70 if (function_exists('ImageCreateFromJPEG')) { 71 $srcImage = @ImageCreateFromJPEG("IMG/jpg/test.jpg"); 72 if ($srcImage) { 73 $gd_formats[] = "jpg"; 74 ImageDestroy($srcImage); 75 } 76 } 77 78 if (function_exists('ImageCreateFromGIF')) { 79 $srcImage = @ImageCreateFromGIF("IMG/gif/test.gif"); 80 if ($srcImage) { 81 $gd_formats[] = "gif"; 82 ImageDestroy($srcImage); 83 } 84 } 85 86 if (function_exists('ImageCreateFromPNG')) { 87 $srcImage = @ImageCreateFromPNG("IMG/png/test.png"); 88 if ($srcImage) { 89 $gd_formats[] = "png"; 90 ImageDestroy($srcImage); 91 } 92 } 93 94 if ($gd_formats) 95 $gd_formats = implode(",", $gd_formats); 96 97 ecrire_meta("gd_formats", $gd_formats); 98 ecrire_metas(); 99 } 100 101 // 102 // Creation automatique d'une vignette 103 // 104 105 function creer_vignette ($image, $newWidth, $newHeight, $format) { 106 // Recuperer l'image d'origine 107 if ($format == "jpg") { 108 $srcImage = @ImageCreateFromJPEG($image); 109 } 110 else if ($format == "gif") { 111 $srcImage = @ImageCreateFromGIF($image); 112 } 113 else if ($format == "png") { 114 $srcImage = @ImageCreateFromPNG($image); 115 } 116 117 if (!$srcImage) 118 return; 119 120 // Calculer le ratio 121 $srcWidth = ImageSX($srcImage); 122 $srcHeight = ImageSY($srcImage); 123 124 $ratioWidth = $srcWidth / $newWidth; 125 $ratioHeight = $srcHeight / $newHeight; 126 127 if ($ratioWidth < $ratioHeight) { 128 $destWidth = $srcWidth / $ratioHeight; 129 $destHeight = $newHeight; 130 } 131 else { 132 $destWidth = $newWidth; 133 $destHeight = $srcHeight / $ratioWidth; 134 } 135 136 // Choisir le format destination 137 // - on sauve de preference en JPEG (meilleure compression) 138 // - pour le GIF : les GD recentes peuvent le lire mais pas l'ecrire 139 $gd_formats = lire_meta("gd_formats"); 140 141 if (ereg("jpg", $gd_formats)) 142 $destFormat = "jpg"; 143 else if ($format == "gif" AND ereg("gif", $gd_formats)AND $GLOBALS['flag_ImageGif']) 144 $destFormat = "gif"; 145 else if (ereg("png", $gd_formats)) 146 $destFormat = "png"; 147 148 if (!$destFormat) 149 return; 150 151 // Initialisation de l'image destination 152 if ($GLOBALS['flag_ImageCreateTrueColor']AND $destFormat != "gif") 153 $destImage = ImageCreateTrueColor($destWidth, $destHeight); 154 155 if (!$destImage) 156 $destImage = ImageCreate($destWidth, $destHeight); 157 158 // Recopie de l'image d'origine avec adaptation de la taille 159 $ok = false; 160 161 if ($GLOBALS['flag_ImageCopyResampled']) 162 $ok = @ImageCopyResampled($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight); 163 164 if (!$ok) 165 $ok = ImageCopyResized($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight); 166 167 // Sauvegarde de l'image destination 168 /******* Modification MAE guillaume.grason@diplomatie.gouv.fr *******/ 169 // Modification visant a ne compter que le *dernier* point d'un fichier. Sans quoi dans test.test.jpg, l'extension serait test.jpg 170 $destination = ereg_replace('\.([^\.]*)$','-s',$image).'.'.$destFormat; 171 //$destination = ereg_replace('\.(.*)$','-s',$image).'.'.$destFormat; 172 /******* Fin Modification MAE guillaume.grason@diplomatie.gouv.fr *******/ 173 174 if ($destFormat == "jpg") { 175 ImageJPEG($destImage, $destination, 70); 176 } 177 else if ($destFormat == "gif") { 178 ImageGIF($destImage, $destination); 179 } 180 else if ($destFormat == "png") { 181 ImagePNG($destImage, $destination); 182 } 183 184 ImageDestroy($srcImage); 185 ImageDestroy($destImage); 186 187 $retour['width'] = $destWidth; 188 $retour['height'] = $destHeight; 189 $retour['fichier'] = $destination; 190 $retour['format'] = $format; 191 return $retour; 192 } 193 194 // 195 // Deplacer un fichier uploade 196 // 197 198 function deplacer_fichier_upload ($source, $dest) { 199 // Securite 200 if (strstr($dest, "..")) { 201 exit; 202 } 203 204 $ok = @copy($source, $dest); 205 206 if (!$ok) 207 $ok = @move_uploaded_file($source, $dest); 208 209 if ($ok) 210 @chmod($dest, 0666); 211 else { 212 $f = @fopen($dest, 'w'); 213 if ($f) 214 fclose($f); 215 else { 216 @header("Location: spip_test_dirs.php?test_dir=" . dirname($dest)); 217 exit; 218 } 219 } 220 221 return $ok; 222 } 223 224 // 225 // Convertit le type numerique retourne par getimagesize() en extension fichier 226 // 227 228 function decoder_type_image ($type, $strict = false) { 229 switch ($type) { 230 case 1: 231 return "gif"; 232 233 case 2: 234 return "jpg"; 235 236 case 3: 237 return "png"; 238 239 case 4: 240 return $strict ? "" : "swf"; 241 242 case 5: 243 return "psd"; 244 245 case 6: 246 return "bmp"; 247 248 case 7: 249 case 8: 250 return "tif"; 251 252 default: 253 return ""; 254 } 255 } 256 257 // 258 // Corrige l'extension du fichier dans quelques cas particuliers 259 // 260 261 function corriger_extension ($ext) { 262 switch ($ext) { 263 case 'htm': 264 return 'html'; 265 266 case 'jpeg': 267 return 'jpg'; 268 269 case 'tiff': 270 return 'tif'; 271 272 default: 273 return $ext; 274 } 275 } 276 277 // 278 // Ajouter une image (logo) 279 // 280 281 function ajout_image ($source, $dest) { 282 global $redirect_url, $hash_id_auteur, $hash, $num_img; 283 284 // Securite 285 if (!verifier_action_auteur("ajout_image $dest", $hash, $hash_id_auteur)) { 286 exit; 287 } 288 289 $loc = "IMG/$dest"; 290 291 if (!deplacer_fichier_upload($source, $loc)) 292 return; 293 294 // analyse le type de l'image (on ne fait pas confiance au nom de 295 // fichier envoye par le browser : pour les Macs c'est plus sur) 296 $size = @getimagesize($loc); 297 $type = decoder_type_image($size[2], true); 298 299 if ($type) { 300 rename($loc, "$loc.$type"); 301 $dest = "$dest.$type"; 302 $loc = "$loc.$type"; 303 } 304 else { 305 unlink($loc); 306 } 307 } 308 309 // 310 // Ajouter un document 311 // 312 313 function ajout_doc ($orig, $source, $dest, $mode, $id_document, $doc_vignette = '', $titre_vignette = '', 314 $descriptif_vignette = '', $titre_automatique = true) { 315 global $hash_id_auteur, $hash, $id_article, $type; 316 317 //echo "$orig, $source, $dest, $mode, $id_document, $doc_vignette, $titre_vignette, $descriptif_vignette, $titre_automatique"; 318 319 // 320 // Securite 321 // 322 if (!verifier_action_auteur("ajout_doc", $hash, $hash_id_auteur)) { 323 exit; 324 } 325 326 if (ereg("\.([^.]+)$", $orig, $match)) { 327 $ext = addslashes(strtolower($match[1])); 328 $ext = corriger_extension($ext); 329 } 330 331 //-----------Zone de modification Clever Age --------------- 332 $typeDocumentMetier = &recuperer_instance_type_document(); 333 $allTypesDocuments = $typeDocumentMetier->getAllForExtensionAndUploadAndInclus($ext, 'oui', 'vignette', 'image'); 334 335 if (PEAR::isError($allTypesDocuments)) { 336 die($allTypesDocuments->getMessage()); 337 } 338 339 //var_dump(allTypesDocuments); 340 341 if (list(, $typeDocumentMetier) = each($allTypesDocuments)) { 342 $id_type = $typeDocumentMetier->getTypeId(); 343 $type_inclus = $typeDocumentMetier->getInclus(); 344 } 345 else 346 return false; 347 348 // 349 // Recopier le fichier 350 // 351 $dest = 'IMG/'; 352 353 if (creer_repertoire('IMG', $ext)) 354 $dest .= $ext . '/'; 355 356 $dest .= ereg_replace("[^.a-zA-Z0-9_=-]+", "_", 357 translitteration(ereg_replace("\.([^.]+)$", "", supprimer_tags(basename($orig))))); 358 $n = 0; 359 360 while (file_exists($newFile = $dest . ($n++ ? '-' . $n : ''). '.' . $ext)) 361 ; 362 363 $dest_path = $newFile; 364 365 if (!deplacer_fichier_upload($source, $dest_path)) 366 return false; 367 368 // 369 // Preparation 370 // 371 if ($mode == 'vignette') { 372 $id_document_lie = $id_document; 373 //-------------Zone de modifications Clever Age aangenieux---- 374 375 $documentMetier = &recuperer_instance_document(); 376 $queryOK = $documentMetier->load($id_document_lie); 377 378 //Si le document n'existe pas dans la base, pas la peine de faire l'update... 379 if (!PEAR::isError($queryOK)) { 380 $documentMetier->setMode('document'); 381 $updateOK = $documentMetier->update(); 382 if (PEAR::isError($updateOK)) { 383 die($updateOK->getMessage()); 384 } 385 } 386 387 $id_document = 0; 388 } 389 390 if (!$id_document) { 391 392 //------------Zone de modifications Clever Age aangenieux---- 393 $documentMetier = &recuperer_instance_document(); 394 $documentMetier->setTypeId($id_type); 395 $documentMetier->setTitre(''); 396 //$documentMetier->setDate('NOW()'); 397 398 $createOK = $documentMetier->create(); 399 400 if (PEAR::isError($createOK)) { 401 die($createOK->getMessage()); 402 } 403 else { 404 $id_document = $documentMetier->getDocumentId(); 405 } 406 407 $nouveau = true; 408 if ($id_article) { 409 global $type; 410 411 // vieux hack !!!! (je suis pas fier) 412 if (!isset($type)) 413 $type = 'article'; 414 415 // fin du vieux hack 416 $linkOK = $documentMetier->linkToObject($id_article, $type); 417 if (PEAR::isError($linkOK)) { 418 die($linkOK->getMessage()); 419 } 420 } 421 } 422 423 // 424 // Creer une vignette automatiquement 425 // 426 $creer_preview = lire_meta("creer_preview"); 427 $taille_preview = lire_meta("taille_preview"); 428 $gd_formats = lire_meta("gd_formats"); 429 430 $format_img = strtolower(substr($dest_path, strrpos($dest_path, ".") + 1, strlen($dest_path))); 431 432 if ($format_img == "jpeg") 433 $format_img == "jpg"; 434 435 if ($taille_preview < 10) 436 $taille_preview = 120; 437 438 if ($mode == 'document' AND $format_img AND ereg($format_img, $gd_formats)AND $creer_preview == 'oui') { 439 $preview = creer_vignette($dest_path, $taille_preview, $taille_preview, $format_img); 440 $hauteur_prev = $preview['height']; 441 $largeur_prev = $preview['width']; 442 $fichier_prev = $preview['fichier']; 443 $format_prev = $preview['format']; 444 445 if ($format_prev == "jpg") 446 $format_prev = 1; 447 else if ($format_prev == "png") 448 $format_prev = 2; 449 else if ($format_prev == "gif") 450 $format_prev = 3; 451 452 //-----------Zone de modifications Clever Age aangenieux------------- 453 $documentMetier = &recuperer_instance_document(); 454 $documentMetier->setTypeId($format_prev); 455 $documentMetier->setTitre(''); 456 $documentMetier->setLargeur($largeur_prev); 457 $documentMetier->setHauteur($hauteur_prev); 458 $documentMetier->setFichier($fichier_prev); 459 //$documentMetier->setDate('NOW()'); 460 461 $createOK = $documentMetier->create(); 462 463 if (PEAR::isError($createOK)) { 464 die($createOK->getMessage()); 465 } 466 else { 467 $id_preview = $documentMetier->getDocumentId(); 468 } 469 470 $loadOK = $documentMetier->load($id_document); 471 if (PEAR::isError($loadOK)) { 472 die($loadOK->getMessage()); 473 } 474 else { 475 $documentMetier->setVignetteId($id_preview); 476 $updateOK = $documentMetier->update(); 477 if (PEAR::isError($updateOK)) { 478 die($updateOK->getMessage()); 479 } 480 } 481 } 482 483 // 484 // Mettre a jour les infos du document uploade 485 // 486 $size_image = @getimagesize($dest_path); 487 $type_image = decoder_type_image($size_image[2]); 488 489 if ($type_image) { 490 $largeur = $size_image[0]; 491 $hauteur = $size_image[1]; 492 } 493 494 $taille = filesize($dest_path); 495 496 if ($nouveau) { 497 if (!$mode) 498 $mode = ($type_image AND $type_inclus == 'image') ? 'vignette' : 'document'; 499 500 $titre = ereg_replace("\..*$", "", $orig); 501 $titre = ereg_replace("ecrire/|upload/", "", $titre); 502 $titre = strtr($titre, "_", " "); 503 504 if (!$titre_automatique) 505 $titre = ""; 506 //$update = "mode='$mode', titre='".addslashes($titre)."', "; 507 $update = "mode='$mode', "; 508 } 509 510 //------------Zone de modifications Clever Age aangenieux-------------- 511 $documentMetier = &recuperer_instance_document(); 512 $loadOK = $documentMetier->load($id_document); 513 514 if (PEAR::isError($loadOK)) { 515 die($loadOK->getMessage()); 516 } 517 else { 518 $documentMetier->setTaille($taille); 519 $documentMetier->setLargeur($largeur); 520 $documentMetier->setHauteur($hauteur); 521 $documentMetier->setFichier($dest_path); 522 $documentMetier->setMode($mode); 523 524 if ($documentMetier->getMode() == 'document') { 525 if ($titre != '') { 526 $documentMetier->setTitre($titre); 527 } 528 else { 529 if ($titre == '' && $descriptif_document != '' && $documentMetier->getTitre() == '') { 530 $titre_array = explode('/', $documentMetier->getFichier()); 531 $titre = $titre_array[2]; 532 $titre_array = explode('.', $titre); 533 534 $titre = strtr($titre_array[0], "_", " "); 535 $documentMetier->setTitre($titre); 536 } 537 } 538 } 539 else { 540 if (($titre == '' && $descriptif_document == '') || ($titre != '')) { 541 $documentMetier->setTitre($titre); 542 } 543 else { 544 if ($titre == '' && $descriptif_document != '' && $documentMetier->getTitre() == '') { 545 $titre_array = explode('/', $documentMetier->getFichier()); 546 $titre = $titre_array[2]; 547 $titre_array = explode('.', $titre); 548 549 $titre = strtr($titre_array[0], "_", " "); 550 $documentMetier->setTitre($titre); 551 } 552 } 553 } 554 555 if ($documentMetier->getDescriptif() == "NULL") { 556 $documentMetier->setDescriptif(""); 557 } 558 559 $updateOK = $documentMetier->update(); 560 if (PEAR::isError($updateOK)) { 561 die($updateOK->getMessage()); 562 } 563 } 564 565 if ($id_document_lie) { 566 $loadOK = $documentMetier->load($id_document_lie); 567 568 if (PEAR::isError($loadOK)) { 569 die($loadOK->getMessage()); 570 } 571 else { 572 $documentMetier->setVignetteId($id_document); 573 $updateOK = $documentMetier->update(); 574 if (PEAR::isError($updateOK)) { 575 die($updateOK->getMessage()); 576 } 577 } 578 $id_document = $id_document_lie; // pour que le 'return' active le bon doc. 579 } 580 581 if ($doc_vignette) { 582 $loadOK = $documentMetier->load($id_document); 583 if (PEAR::isError($loadOK)) { 584 die($loadOK->getMessage()); 585 } 586 else { 587 $documentMetier->setVignetteId($doc_vignette); 588 $documentMetier->setTitre(''); 589 $documentMetier->setDescriptif(''); 590 $updateOK = $documentMetier->update(); 591 if (PEAR::isError($updateOK)) { 592 die($updateOK->getMessage()); 593 } 594 } 595 } 596 return $id_document; 597 } 598 599 // image_name n'est valide que par POST http, mais pas par la methode ftp/upload 600 // par ailleurs, pour un fichier ftp/upload, il faut effacer l'original nous-memes 601 if (!$image_name AND $image2) { 602 $image = "ecrire/upload/" . $image2; 603 $image_name = $image; 604 $supprimer_ecrire_upload = $image; 605 } 606 else { 607 $supprimer_ecrire_upload = ''; 608 } 609 610 // 611 // ajouter un document 612 // 613 if ($ajout_doc == 'oui') { 614 if ($dossier_complet) { 615 $myDir = opendir('ecrire/upload'); 616 include_ecrire('inc_documents.php'); 617 $fichiers = fichiers_upload('ecrire/upload'); 618 619 while (list(, $f) = each($fichiers)) { 620 if (ereg("\.([^.]+)$", $f, $match)) { 621 $ext = strtolower($match[1]); 622 623 if ($ext == 'jpeg') 624 $ext = 'jpg'; 625 /* Modification Clever Age, elebescond, utilisation couche m�tier */ 626 $typeDocumentMetier = &recuperer_instance_type_document(); 627 $hasExtensionOK = $typeDocumentMetier->hasExtension($ext); 628 629 if (PEAR::isError($hasExtensionOK)) { 630 die($hasExtensionOK->getMessage()); 631 } 632 if ($hasExtensionOK) { 633 $id_document = ajout_doc($f, $f, '', 'document', '', '', '', '', false); 634 } 635 } 636 } 637 closedir($myDir); 638 } 639 else { 640 if ($forcer_document == 'oui') { 641 $id_document = ajout_doc($image_name, $image, $fichier, "document", $id_document); 642 } 643 else { 644 $id_document = ajout_doc($image_name, $image, $fichier, $mode, $id_document); 645 } 646 } 647 } 648 649 // joindre un document 650 if ($joindre_doc == 'oui') { 651 $id_document = ajout_doc($image_name, $image, $fichier, "document", $id_document, $doc_vignette, $titre_vignette, $descriptif_vignette); 652 } 653 654 // 655 // ajouter un logo 656 // 657 if ($ajout_logo == "oui") { 658 ajout_image($image, $logo); 659 } 660 661 // 662 // supprimer un logo 663 // 664 if ($image_supp) { 665 // Securite 666 if (strstr($image_supp, "..")) { 667 exit; 668 } 669 670 if (!verifier_action_auteur("supp_image $image_supp", $hash, $hash_id_auteur)) { 671 exit; 672 } 673 @unlink("IMG/$image_supp"); 674 } 675 676 // 677 // Supprimer un document 678 // 679 if ($doc_supp) { 680 // Securite 681 if (!verifier_action_auteur("supp_doc $doc_supp", $hash, $hash_id_auteur)) { 682 exit; 683 } 684 685 //----------Zone de modifications Clever Age aangenieux-------------- 686 $documentMetier = &recuperer_instance_document(); 687 $loadOK = $documentMetier->load($doc_supp); 688 689 //Correction bug � la suprression de doc 690 if (!PEAR::isError($loadOK)) { 691 $fichier = $documentMetier->getFichier(); 692 $id_vignette = $documentMetier->getVignetteId(); 693 694 $deleteOK = $documentMetier->delete($doc_supp); 695 696 if (PEAR::isError($deleteOK)) { 697 die($deleteOK->getMessage()); 698 } 699 700 $unLinkOK = $documentMetier->unlinkVignette($doc_supp); 701 702 if (PEAR::isError($unLinkOK)) { 703 die($unLinkOK->getMessage()); 704 } 705 706 $unLinkAllOK = $documentMetier->unlinkAll(); 707 708 if (PEAR::isError($unLinkAllOK)) { 709 die($unLinkAllOK->getMessage()); 710 } 711 @unlink($fichier); 712 } 713 714 if ($id_vignette > 0) { 715 $loadOK = $documentMetier->load($id_vignette); 716 717 if (!PEAR::isError($loadOK)) { 718 @unlink($documentMetier->getFichier()); 719 } 720 721 $deleteOK = $documentMetier->delete($id_vignette); 722 723 if (PEAR::isError($deleteOK)) { 724 die($deleteOK->getMessage()); 725 } 726 727 $documentMetier->setDocumentId($id_vignette); 728 $unlinkAllOK = $documentMetier->unlinkAll(); 729 if (PEAR::isError($unlinkAllOK)) { 730 die($unlinkAllOK->getMessage()); 731 } 732 } 733 734 } 735 736 // supprimer le fichier original si pris dans ecrire/upload 737 /* en debat.... peser securite vs conformite upload http 738 if ($supprimer_ecrire_upload) 739 @unlink ($supprimer_ecrire_upload); 740 */ 741 742 // 743 // redirection 744 // 745 if ($HTTP_POST_VARS) 746 $vars = $HTTP_POST_VARS; 747 else 748 $vars = $HTTP_GET_VARS; 749 750 $redirect_url = "ecrire/" . $vars["redirect"]; 751 $link = new Link($redirect_url); 752 reset($vars); 753 754 while (list($key, $val) = each($vars)) { 755 if (!ereg("^(redirect|image.*|hash.*|ajout.*|doc.*|transformer.*|modifier_.*|ok|type|forcer_.*)$", $key)) { 756 $link->addVar($key, $val); 757 } 758 } 759 760 if ($id_document) 761 $link->addVar('id_document', $id_document); 762 if ($type == 'rubrique') 763 $link->delVar('id_article'); 764 if ($type == 'breve') 765 $link->delVar('id_article'); 766 @header("Location: " . $link->getUrl()); 767 768 exit; 769 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sat Feb 24 14:40:03 2007 | par Balluche grâce à PHPXref 0.7 |