When config.php cannot be written to disk, click the button to download it and save...
[moodle.git] / install.php
CommitLineData
8b5b1028 1<?php /// $Id$
2 /// install.php - helps admin user to create a config.php file
3
4/// If config.php exists already then we are not needed.
5
cd0e958e 6if (file_exists('./config.php')) {
8b5b1028 7 header('Location: index.php');
cd0e958e 8 die();
8b5b1028 9} else {
10 $configfile = './config.php';
11}
12
13///==========================================================================//
14/// We are doing this in stages
8d783716 15/// 0. Welcome and language settings
16/// 1. Compatibility
8b5b1028 17/// 2. Database settings
18/// 3. Host settings
19/// 4. Administration directory name
20/// 5. Save or display the settings
21/// 6. Redirect to index.php
22///==========================================================================//
23
24
8d783716 25
8b5b1028 26/// Begin the session as we are holding all information in a session
27/// variable until the end.
28
29session_name('MoodleSession');
30@session_start();
31
32if (! isset($_SESSION['INSTALL'])) {
33 $_SESSION['INSTALL'] = array();
34}
35
36$INSTALL = &$_SESSION['INSTALL']; // Makes it easier to reference
37
8d783716 38
39/// If it's our first time through this script then we need to set some default values
40
41if ( empty($INSTALL['language']) and empty($_POST['language']) ) {
8b5b1028 42
43 /// set defaults
44 $INSTALL['language'] = 'en';
45
46 $INSTALL['dbhost'] = 'localhost';
47 $INSTALL['dbuser'] = '';
48 $INSTALL['dbpass'] = '';
49 $INSTALL['dbtype'] = 'mysql';
50 $INSTALL['dbname'] = 'moodle';
51 $INSTALL['prefix'] = 'mdl_';
52
53 $INSTALL['wwwroot'] = '';
54 $INSTALL['dirroot'] = dirname(__FILE__);
55 $INSTALL['dataroot'] = dirname(dirname(__FILE__)) . '/moodledata';
56
57 $INSTALL['admindirname'] = 'admin';
58
8d783716 59 $INSTALL['stage'] = 0;
8b5b1028 60}
61
62
63
64//==========================================================================//
65
66/// Fake some settings so that we can use selected functions from moodlelib.php and weblib.php
8d783716 67
8b5b1028 68$SESSION->lang = (!empty($_POST['language'])) ? $_POST['language'] : $INSTALL['language'];
69$CFG->dirroot = $INSTALL['dirroot'];
70$CFG->dataroot = $INSTALL['dataroot'];
71$CFG->directorypermissions = 0777;
72
73
8d783716 74/// Include some moodle libraries
75
8b5b1028 76require_once('./lib/moodlelib.php');
77require_once('./lib/weblib.php');
78require_once('./lib/adodb/adodb.inc.php');
79
80
81/// guess the www root
82if ($INSTALL['wwwroot'] == '') {
83 list($INSTALL['wwwroot'], $xtra) = explode('/install.php', qualified_me());
84}
85
8d783716 86$stagetext = array(0 => get_string('chooselanguage', 'install'),
87 get_string('compatibilitysettings', 'install'),
88 get_string('directorysettings', 'install'),
89 get_string('databasesettings', 'install'),
90 get_string('admindirsetting', 'install'),
91 get_string('configurationcomplete', 'install')
8b5b1028 92 );
93
94
8d783716 95
96
97//==========================================================================//
98
99/// Are we in help mode?
100
101if (isset($_GET['help'])) {
102 $nextstage = -1;
103}
104
105
edd3a5db 106//==========================================================================//
107
108/// Any special action we need to take?
109
110if(isset($_POST['specialaction'])) {
111 switch($_POST['specialaction']) {
112 case 'downloadconfig':
113 $str = generate_config_php();
114 header('Content-Type: text/plain');
115 header('Content-Disposition: attachment; filename="config.php"');
116 header('Content-Length: '.strlen($str));
117 header('Connection: Close');
118 echo $str;
119 die();
120 break;
121 }
122}
8d783716 123
8b5b1028 124//==========================================================================//
125
126/// Was data submitted?
8d783716 127
128if (isset($_POST['stage'])) {
8b5b1028 129
130 /// Get the stage for which the form was set and the next stage we are going to
131
132
133 if ( $goforward = (! empty( $_POST['next'] )) ) {
134 $nextstage = $_POST['stage'] + 1;
135 } else {
136 $nextstage = $_POST['stage'] - 1;
137 }
cd0e958e 138
8d783716 139 if ($nextstage < 0) $nextstage = 0;
cd0e958e 140
8b5b1028 141
142 /// Store any posted data
143 foreach ($_POST as $setting=>$value) {
144 $INSTALL[$setting] = $value;
145 }
cd0e958e 146
8b5b1028 147} else {
148
149 $goforward = true;
8d783716 150 $nextstage = 0;
cd0e958e 151
8b5b1028 152}
153
154
155
156//==========================================================================//
157
158/// Check the directory settings
8d783716 159
8b5b1028 160if ($INSTALL['stage'] == 2) {
161
162 error_reporting(0);
cd0e958e 163
8b5b1028 164 /// check wwwroot
165 if (($fh = @fopen($INSTALL['wwwroot'].'/install.php', 'r')) === false) {
166 $errormsg = get_string('wwwrooterror', 'install');
167 } else {
168 fclose($fh);
cd0e958e 169
8b5b1028 170 /// check dirroot
171 if (($fh = @fopen($INSTALL['dirroot'].'/install.php', 'r')) === false ) {
172 $CFG->dirroot = dirname(__FILE__);
173 $INSTALL['dirroot'] = dirname(__FILE__);
174 $errormsg = get_string('dirrooterror', 'install');
175 } else {
176 fclose($fh);
cd0e958e 177
8b5b1028 178 $CFG->dirroot = $INSTALL['dirroot'];
179
180 /// check dataroot
181 $CFG->dataroot = $INSTALL['dataroot'];
182 if (make_upload_directory('sessions', false) === false ) {
183 $errormsg = get_string('datarooterror', 'install');
cd0e958e 184 }
8b5b1028 185 }
186 }
cd0e958e 187
8b5b1028 188
189 if (!empty($errormsg)) $nextstage = 2;
190
191 error_reporting(7);
192}
193
194
195
196//==========================================================================//
197
198/// Check database settings if stage 3 data submitted
199/// Try to connect to the database. If that fails then try to create the database
8d783716 200
8b5b1028 201if ($INSTALL['stage'] == 3) {
202
203 if (empty($INSTALL['dbname'])) {
204 $INSTALL['dbname'] = 'moodle';
205 }
cd0e958e 206
8d783716 207 /// different format for postgres7 by socket
208 if ($INSTALL['dbtype'] == 'postgres7' and ($INSTALL['dbhost'] == 'localhost' || $INSTALL['dbhost'] == '127.0.0.1')) {
8b5b1028 209 $INSTALL['dbhost'] = "user='{$INSTALL['dbuser']}' password='{$INSTALL['dbpass']}' dbname='{$INSTALL['dbname']}'";
8d783716 210 $INSTALL['dbuser'] = '';
211 $INSTALL['dbpass'] = '';
212 $INSTALL['dbname'] = '';
213
8b5b1028 214 if ($INSTALL['prefix'] == '') { /// must have a prefix
215 $INSTALL['prefix'] = 'mdl_';
216 }
217 }
218
219 $db = &ADONewConnection($INSTALL['dbtype']);
220
cd0e958e 221 error_reporting(0); // Hide errors
222
94ba66ce 223 if (! $dbconnected = $db->Connect($INSTALL['dbhost'],$INSTALL['dbuser'],$INSTALL['dbpass'],$INSTALL['dbname'])) {
8b5b1028 224 /// The following doesn't seem to work but we're working on it
cd0e958e 225 /// If you come up with a solution for creating a database in MySQL
8b5b1028 226 /// feel free to put it in and let us know
227 if ($dbconnected = $db->Connect($INSTALL['dbhost'],$INSTALL['dbuser'],$INSTALL['dbpass'])) {
228 switch ($INSTALL['dbtype']) { /// Try to create a database
229 case 'mysql':
230 if ($db->Execute("CREATE DATABASE {$INSTALL['dbname']};")) {
231 $dbconnected = $db->Connect($INSTALL['dbhost'],$INSTALL['dbuser'],$INSTALL['dbpass'],$INSTALL['dbname']);
232 } else {
233 $errormsg = get_string('dbcreationerror', 'install');
234 $nextstage = 3;
235 }
236 break;
237 }
238 }
239 }
240
241 error_reporting(7);
242
243 if (($dbconnected === false) and (empty($errormsg)) ) {
244 $errormsg = get_string('dbconnectionerror', 'install');
245 $nextstage = 3;
246 }
247}
248
249
250
251//==========================================================================//
252
253/// If the next stage is admin directory settings OR we have just come from there then
254/// check the admin directory.
255/// If we can open a file then we know that the admin name is correct.
256
257if ($nextstage == 4 or $INSTALL['stage'] == 4) {
258 if (($fh = @fopen($INSTALL['wwwroot'].'/'.$INSTALL['admindirname'].'/site.html', 'r')) !== false) {
259 $nextstage = ($goforward) ? 5 : 3;
260 fclose($fh);
261 } else {
262 if ($nextstage != 4) {
263 $errormsg = get_string('admindirerror', 'install');
264 $nextstage = 4;
265 }
266 }
267}
268
269
270
271//==========================================================================//
272
273/// Display or print the data
274/// Put the data into a string
275/// Try to open config file for writing.
8d783716 276
8b5b1028 277if ($nextstage == 5) {
8b5b1028 278 if (( $configsuccess = ($fh = @fopen($configfile, 'w')) ) !== false) {
edd3a5db 279 $str = generate_config_php();
8b5b1028 280 fwrite($fh, $str);
281 fclose($fh);
282 }
283}
284
285
286
287//==========================================================================//
288
289?>
290
291
292
293<html dir="<?php echo (get_string('this_direction') == 'rtl') ? 'rtl' : 'ltr' ?>">
294<head>
295<link rel="shortcut icon" href="http://moodle.dougiamas.net/theme/standard/favicon.ico" />
296<title>Moodle Install</title>
297<meta http-equiv="content-type" content="text/html; charset=<?php print_string('thischarset') ?>" />
298<?php css_styles() ?>
299
300</head>
301
302<body>
303
8d783716 304<table align="center">
305</table>
306
307
308<?php
309if (isset($_GET['help'])) {
310 print_install_help($_GET['help']);
311} else {
312?>
313
8b5b1028 314
315<table class="main" align="center" cellpadding="3" cellspacing="0">
316 <tr>
8d783716 317 <td class="td_mainlogo">
318 <p class="p_mainlogo"><img src="pix/moodlelogo-med.gif" width="240" height="60"></p>
319 </td>
320 <td class="td_mainlogo" valign="bottom">
321 <p class="p_mainheader"><?php print_string('installation', 'install') ?></p>
322 </td>
323 </tr>
324
325 <tr>
326 <td class="td_mainheading" colspan="2">
327 <p class="p_mainheading"><?php echo $stagetext[$nextstage] ?></p>
328 </td>
8b5b1028 329 </tr>
330
331 <tr>
8d783716 332 <td class="td_main" colspan="2">
cd0e958e 333
8b5b1028 334<?php
335
336if (!empty($errormsg)) echo "<p class=\"errormsg\" align=\"center\">$errormsg</p>\n";
337
338
339if ($nextstage == 5) {
340 if ($configsuccess) {
341 echo "<p>".get_string('configfilewritten', 'install')."</p>\n";
342 } else {
343 echo "<p>".get_string('configfilenotwritten', 'install')."</p>";
edd3a5db 344 echo '<form name="installform" method="post" action="install.php"><p>';
345 echo '<input type="hidden" name="specialaction" value="downloadconfig" />';
346 echo '<input type="submit" name="download" value="'.get_string('downloadconfigphp').'" />';
347 echo '</p></form>';
8b5b1028 348 echo "<hr />\n";
349 }
8d783716 350 $options = array();
351 $options['lang'] = $INSTALL['language'];
352 print_single_button("index.php", $options, get_string('continue')." &raquo;");
8b5b1028 353} else {
354 $formaction = (isset($_GET['configfile'])) ? "install.php?configfile=".$_GET['configfile'] : "install.php";
355 form_table($nextstage, $formaction);
356}
357
358?>
359
360 </td>
361 </tr>
362</table>
363
8d783716 364<?php
365}
366?>
367
8b5b1028 368</body>
369</html>
370
371
372
373
374
375
376
377
378
379
cd0e958e 380<?php
8b5b1028 381
382//==========================================================================//
383
384
385function print_object($object) {
386 echo "<pre>\n";
387 print_r($object);
388 echo "</pre>\n";
389}
390
391
392
393//==========================================================================//
394
8d783716 395function form_table($nextstage = 0, $formaction = "install.php") {
8b5b1028 396 global $INSTALL;
397
398 /// standard lines for all forms
399?>
400
401 <form name="installform" method="post" action="<?php echo $formaction ?>">
402 <input type="hidden" name="stage" value="<?php echo $nextstage ?>" />
403 <table class="install_table" cellspacing="3" cellpadding="3" align="center">
404
405<?php
406 /// what we do depends on the stage we're at
407 switch ($nextstage) {
8d783716 408 case 0: /// Language settings
8b5b1028 409?>
410 <tr>
411 <td class="td_left"><p><?php print_string('language') ?></p></td>
412 <td class="td_right">
413 <?php choose_from_menu (get_list_of_languages(), 'language', $INSTALL['language'], '') ?>
414 </td>
415 </tr>
416
417<?php
8d783716 418 break;
419 case 1: /// Compatibilty check
420 $compatsuccess = true;
cd0e958e 421
8d783716 422 /// Check that PHP is of a sufficient version
423 print_compatibility_row(check_php_version("4.1.0"), get_string('PHPversion', 'install'), get_string('PHPversionerror', 'install'), 'phpversionhelp');
cd0e958e 424 /// Check safe mode
8d783716 425 print_compatibility_row(!ini_get_bool('safe_mode'), get_string('safemode', 'install'), get_string('safemodeerror', 'install'), 'safemodehelp');
426 /// Check session auto start
427 print_compatibility_row(!ini_get_bool('session.auto_start'), get_string('sessionautostart', 'install'), get_string('sessionautostarterror', 'install'), 'sessionautostarthelp');
428 /// Check session save path
429 print_compatibility_row(!ini_get_bool('session.save_path'), get_string('sessionsavepath', 'install'), get_string('sessionsavepatherror', 'install'), 'sessionsavepathhelp');
430 /// Check magic quotes
431 print_compatibility_row(!ini_get_bool('magic_quotes_runtime'), get_string('magicquotesruntime', 'install'), get_string('magicquotesruntimeerror', 'install'), 'magicquotesruntimehelp');
432 /// Check file uploads
433 print_compatibility_row(ini_get_bool('file_uploads'), get_string('fileuploads', 'install'), get_string('fileuploadserror', 'install'), 'fileuploadshelp');
434 /// Check GD version
435 print_compatibility_row(check_gd_version(), get_string('gdversion', 'install'), get_string('gdversionerror', 'install'), 'gdversionhelp');
436 /// Check memory limit
437 print_compatibility_row(check_memory_limit(), get_string('memorylimit', 'install'), get_string('memorylimiterror', 'install'), 'memorylimithelp');
438
439
8b5b1028 440 break;
441 case 2: /// Directory settings
442?>
443
444 <tr>
445 <td class="td_left"><p><?php print_string('wwwroot', 'install') ?></p></td>
446 <td class="td_right">
447 <input type="text" size="40"name="wwwroot" value="<?php echo $INSTALL['wwwroot'] ?>" />
448 </td>
449 </tr>
450 <tr>
451 <td class="td_left"><p><?php print_string('dirroot', 'install') ?></p></td>
452 <td class="td_right">
453 <input type="text" size="40" name="dirroot" value="<?php echo $INSTALL['dirroot'] ?>" />
454 </td>
455 </tr>
456 <tr>
457 <td class="td_left"><p><?php print_string('dataroot', 'install') ?></p></td>
458 <td class="td_right">
459 <input type="text" size="40" name="dataroot" value="<?php echo $INSTALL['dataroot'] ?>" />
460 </td>
461 </tr>
462
463<?php
464 break;
465 case 3: /// Database settings
466?>
467
468 <tr>
469 <td class="td_left"><p><?php print_string('dbtype', 'install') ?></p></td>
470 <td class="td_right">
471 <?php choose_from_menu (array("mysql" => "mysql", "postgres7" => "postgres7"), 'dbtype', $INSTALL['dbtype'], '') ?>
472 </td>
473 </tr>
474 <tr>
475 <td class="td_left"><p><?php print_string('dbhost', 'install') ?></p></td>
476 <td class="td_right">
477 <input type="text" size="40" name="dbhost" value="<?php echo $INSTALL['dbhost'] ?>" />
478 </td>
479 </tr>
480 <tr>
481 <td class="td_left"><p><?php print_string('database', 'install') ?></p></td>
482 <td class="td_right">
483 <input type="text" size="40" name="dbname" value="<?php echo $INSTALL['dbname'] ?>" />
484 </td>
485 </tr>
486 <tr>
487 <td class="td_left"><p><?php print_string('user') ?></p></td>
488 <td class="td_right">
489 <input type="text" size="40" name="dbuser" value="<?php echo $INSTALL['dbuser'] ?>" />
490 </td>
491 </tr>
492 <tr>
493 <td class="td_left"><p><?php print_string('password') ?></p></td>
494 <td class="td_right">
495 <input type="text" size="40" name="dbpass" value="<?php echo $INSTALL['dbpass'] ?>" />
496 </td>
497 </tr>
498 <tr>
499 <td class="td_left"><p><?php print_string('dbprefix', 'install') ?></p></td>
500 <td class="td_right">
501 <input type="text" size="40" name="prefix" value="<?php echo $INSTALL['prefix'] ?>" />
502 </td>
503 </tr>
504
505<?php
506 break;
507 case 4: /// Administration directory setting
508?>
509
510 <tr>
511 <td class="td_left"><p><?php print_string('admindirname', 'install') ?></p></td>
512 <td class="td_right">
513 <input type="text" size="40" name="admindirname" value="<?php echo $INSTALL['admindirname'] ?>" />
514 </td>
515 </tr>
516
517
518<?php
519 break;
520 default:
521 }
522?>
8b5b1028 523 </table>
cd0e958e 524
525 <div class="nav">
526 <div style="float: right;"><?php echo ($nextstage < 5) ? "<input type=\"submit\" name=\"next\" value=\"".get_string('next')." &raquo;\" />\n" : "&nbsp;\n" ?></div>
527 <div style="float: left;"><?php echo ($nextstage > 0) ? "<input type=\"submit\" name=\"prev\" value=\"&laquo; ".get_string('previous')."\" />\n" : "&nbsp;\n" ?></div>
528 <div style="clear: left; height: 2px;">&nbsp;</div>
529 </div>
530
531
8b5b1028 532 </form>
533
534<?php
535}
536
537
538
8d783716 539//==========================================================================//
540
541function print_compatibility_row($success, $testtext, $errormessage, $helpfield='') {
542 echo "<tr>\n";
543 echo "<td class=\"td_left\" valign=\"top\" nowrap><p>$testtext</p></td>\n";
544 if ($success) {
545 echo "<td valign=\"top\"><p class=\"p_pass\">".get_string('pass', 'install')."</p></td>\n";
546 echo "<td valign=\"top\">&nbsp;</td>\n";
547 } else {
548 echo "<td valign=\"top\"><p class=\"p_fail\">".get_string('fail', 'install')."</p></td>\n";
549 echo "<td valign=\"top\">";
550 echo "<p>$errormessage ";
551 install_helpbutton("install.php?help=$helpfield");
552 echo "</p></td>\n";
553 }
554 echo "</tr>\n";
555 return $success;
556}
557
558
559//==========================================================================//
560
561function install_helpbutton($url, $title='') {
562 if ($title == '') {
563 $title = get_string('help');
564 }
565 echo "<a href=\"javascript: void(0)\">";
566 echo "<img src=\"./pix/help.gif\" height=\"17\" width=\"22\" alt=\"$title\"";
567 echo "border=\"0\" align=\"absmiddle\" title=\"$title\" ";
568 echo "onClick=\"return window.open('$url', 'Help', 'menubar=0,location=0,scrollbars,resizable,width=500,height=400')\">";
569 echo "</a>\n";
570}
cd0e958e 571
8d783716 572
573
574//==========================================================================//
575
576function print_install_help($help) {
577 echo "<p class=\"p_help\">";
578 switch ($help) {
579 case 'phpversionhelp':
580 print_string($help, 'install', phpversion());
581 break;
582 case 'memorylimithelp':
94ba66ce 583 print_string($help, 'install', get_memory_limit());
8d783716 584 break;
585 default:
586 print_string($help, 'install');
587 }
588 echo "</p>\n";
589}
590
591
592//==========================================================================//
593
594function get_memory_limit() {
595 if ($limit = ini_get('memory_limit')) {
596 return $limit;
597 } else {
598 return get_cfg_var('memory_limit');
599 }
600}
601
602//==========================================================================//
603
604function check_memory_limit() {
605
606 /// if limit is already 16M or more then we don't care if we can change it or not
607 if ((int)str_replace('M', '', get_memory_limit()) >= 16) {
608 return true;
609 }
610
611 /// Otherwise, see if we can change it ourselves
612 @ini_set('memory_limit', '16M');
613 return ((int)str_replace('M', '', get_memory_limit()) >= 16);
614}
615
edd3a5db 616//==========================================================================//
617
618function generate_config_php() {
619 global $INSTALL;
620
621 $str = '<?php /// Moodle Configuration File '."\n";
622 $str .= "\n";
623
624 $str .= 'unset($CFG);'."\n";
625 $str .= "\n";
626
627 $str .= '$CFG->dbtype = \''.$INSTALL['dbtype']."';\n";
628 $str .= '$CFG->dbhost = \''.$INSTALL['dbhost']."';\n";
629 if ($INSTALL['dbtype'] == 'mysql') {
630 $str .= '$CFG->dbname = \''.$INSTALL['dbname']."';\n";
631 $str .= '$CFG->dbuser = \''.$INSTALL['dbuser']."';\n";
632 $str .= '$CFG->dbpass = \''.$INSTALL['dbpass']."';\n";
633 }
634 $str .= '$CFG->dbpersist = false;'."\n";
635 $str .= '$CFG->prefix = \''.$INSTALL['prefix']."';\n";
636 $str .= "\n";
637
638 $str .= '$CFG->wwwroot = \''.$INSTALL['wwwroot']."';\n";
639 $str .= '$CFG->dirroot = \''.$INSTALL['dirroot']."';\n";
640 $str .= '$CFG->dataroot = \''.$INSTALL['dataroot']."';\n";
641 $str .= "\n";
642
643 $str .= '$CFG->directorypermissions = 0777;'."\n";
644 $str .= "\n";
645
646 $str .= 'require_once("$CFG->dirroot/lib/setup.php");'."\n";
647 $str .= '// MAKE SURE WHEN YOU EDIT THIS FILE THAT THERE ARE NO SPACES, BLANK LINES,'."\n";
648 $str .= '// RETURNS, OR ANYTHING ELSE AFTER THE TWO CHARACTERS ON THE NEXT LINE.'."\n";
649 $str .= '?>';
650
651 return $str;
652}
653
654
8b5b1028 655//==========================================================================//
656
657function css_styles() {
658?>
659
660<style type="text/css">
661
662 body { background-color: #ffeece; }
cd0e958e 663 p {
8d783716 664 font-family: helvetica, arial, sans-serif;
665 font-size: 10pt;
666 }
8b5b1028 667 a { text-decoration: none; color: blue; }
668 .errormsg {
669 color: red;
670 font-weight: bold;
671 }
8d783716 672 blockquote {
673 font-family: helvetica, arial, sans-serif;
674 font-size: 10pt;
675 }
8b5b1028 676 .install_table {
677 width: 500px;
678 }
679 .td_left {
680 text-align: right;
681 font-weight: bold;
682 }
683 .td_right {
684 text-align: left;
685 }
686 .main {
687 width: 500px;
688 border-width: 1px;
689 border-style: solid;
690 border-color: #ffc85f;
691 -moz-border-radius-bottomleft: 15px;
692 -moz-border-radius-bottomright: 15px;
693 }
694 .td_mainheading {
695 background-color: #fee6b9;
8d783716 696 padding: 10px;
8b5b1028 697 }
698 .td_main {
699 text-align: center;
700 }
8d783716 701 .td_mainlogo {
702 }
703 .p_mainlogo {
704 }
8b5b1028 705 .p_mainheading {
8d783716 706 font-size: 11pt;
707 }
708 .p_mainheader{
709 text-align: right;
710 font-size: 20pt;
711 font-weight: bold;
712 }
713 .p_pass {
714 color: green;
715 font-weight: bold;
716 }
717 .p_fail {
718 color: red;
719 font-weight: bold;
720 }
721 .p_help {
722 text-align: center;
723 font-family: helvetica, arial, sans-serif;
724 font-size: 14pt;
725 font-weight: bold;
726 color: #333333;
8b5b1028 727 }
cd0e958e 728 div.nav {
729 margin: 6px;
730 }
731
8b5b1028 732</style>
733
734<?php
735}
736?>