removed $SESSION->encoding now replaced by current_charset() and $CFG->unicodedb...
[moodle.git] / install.php
1 <?php /// $Id$
2       /// install.php - helps admin user to create a config.php file
4 /// If config.php exists already then we are not needed.
6 if (file_exists('./config.php')) { 
7     header('Location: index.php');
8     die;
9 } else {
10     $configfile = './config.php';
11 }
13 ///==========================================================================//
14 /// We are doing this in stages
15 define ('WELCOME',            0); /// 0. Welcome and language settings
16 define ('COMPATIBILITY',      1); /// 1. Compatibility
17 define ('DIRECTORY',          2); /// 2. Directory settings
18 define ('DATABASE',           3); /// 2. Database settings
19 define ('ADMIN',              4); /// 4. Administration directory name
20 define ('ENVIRONMENT',        5); /// 5. Administration directory name
21 define ('DOWNLOADLANG',       6); /// 6. Load complete lang from download.moodle.org
22 define ('SAVE',               7); /// 7. Save or display the settings
23 define ('REDIRECT',           8); /// 8. Redirect to index.php
24 ///==========================================================================//
28 /// Begin the session as we are holding all information in a session
29 /// variable until the end.
31 session_name('MoodleSession');
32 @session_start();
34 if (! isset($_SESSION['INSTALL'])) {
35     $_SESSION['INSTALL'] = array();
36 }
38 $INSTALL = &$_SESSION['INSTALL'];   // Makes it easier to reference
41 /// If it's our first time through this script then we need to set some default values
43 if ( empty($INSTALL['language']) and empty($_POST['language']) ) {
45     /// set defaults
46     $INSTALL['language']        = 'en_utf8';
48     $INSTALL['dbhost']          = 'localhost';
49     $INSTALL['dbuser']          = '';
50     $INSTALL['dbpass']          = '';
51     $INSTALL['dbtype']          = 'mysql';
52     $INSTALL['dbname']          = 'moodle';
53     $INSTALL['prefix']          = 'mdl_';
55     $INSTALL['dbencodingtestresults']  = false;
56     $INSTALL['showskipdbencodingtest'] = false;
57     $INSTALL['skipdbencodingtest']     = false;
59     $INSTALL['downloadlangpack']       = false;
60     $INSTALL['showdownloadlangpack']   = true;
61     $INSTALL['downloadlangpackerror']  = '';
63 /// To be used by the Installer
64     $INSTALL['wwwroot']         = '';
65     $INSTALL['dirroot']         = dirname(__FILE__);
66     $INSTALL['dataroot']        = dirname(dirname(__FILE__)) . '/moodledata';
68 /// To be configured in the Installer
69     $INSTALL['wwwrootform']         = '';
70     $INSTALL['dirrootform']         = dirname(__FILE__);
72     $INSTALL['admindirname']    = 'admin';
74     $INSTALL['stage'] = WELCOME;
75 }
77 //==========================================================================//
79 /// Was data submitted?
81 if (isset($_POST['stage'])) {
83     /// Get the stage for which the form was set and the next stage we are going to
86     if ( $goforward = (! empty( $_POST['next'] )) ) {
87         $nextstage = $_POST['stage'] + 1;
88     } else if (! empty( $_POST['prev'])) {
89         $nextstage = $_POST['stage'] - 1;
90     } else if (! empty( $_POST['same'] )) {
91         $nextstage = $_POST['stage'];
92     }
95     if ($nextstage < 0) $nextstage = WELCOME;
96     
98     /// Store any posted data
99     foreach ($_POST as $setting=>$value) {
100         $INSTALL[$setting] = $value;
101     }
102     
103 } else {
105     $goforward = true;
106     $nextstage = WELCOME;
107     
110 //==========================================================================//
112 /// Fake some settings so that we can use selected functions from moodlelib.php and weblib.php
114 $SESSION->lang = (!empty($_POST['language'])) ? $_POST['language'] : $INSTALL['language'];
115 $CFG->dirroot = $INSTALL['dirroot'];
116 $CFG->libdir = $INSTALL['dirroot'].'/lib';
117 $CFG->dataroot = $INSTALL['dataroot'];
118 $CFG->admin = $INSTALL['admindirname'];
119 $CFG->directorypermissions = 00777;
120 $CFG->running_installer = true;
122 /// Include some moodle libraries
124 require_once('./lib/setuplib.php');
125 require_once('./lib/moodlelib.php');
126 require_once('./lib/weblib.php');
127 require_once('./lib/adodb/adodb.inc.php');
128 require_once('./lib/environmentlib.php');
129 require_once('./lib/xmlize.php');
130 require_once('./lib/componentlib.class.php');
131 require_once('./version.php');
133 /// Set version and release
134 $INSTALL['version'] = $version;
135 $INSTALL['release'] = $release;
137 /// Have the $db object ready because we are going to use it often
138 $db = &ADONewConnection($INSTALL['dbtype']);
140 /// guess the www root
141 if ($INSTALL['wwwroot'] == '') {
142     list($INSTALL['wwwroot'], $xtra) = explode('/install.php', qualified_me());
143     $INSTALL['wwwrootform'] = $INSTALL['wwwroot'];
146 $headstagetext = array(WELCOME       => get_string('chooselanguagehead', 'install'),
147                        COMPATIBILITY => get_string('compatibilitysettingshead', 'install'),
148                        DIRECTORY     => get_string('directorysettingshead', 'install'),
149                        DATABASE      => get_string('databasesettingshead', 'install'),
150                        ADMIN         => get_string('admindirsettinghead', 'install'),
151                        ENVIRONMENT   => get_string('environmenthead', 'install'),
152                        DOWNLOADLANG  => get_string('downloadlanguagehead', 'install'),
153                        SAVE          => get_string('configurationcompletehead', 'install')
154                         );
156 $substagetext = array(WELCOME       => get_string('chooselanguagesub', 'install'),
157                       COMPATIBILITY => get_string('compatibilitysettingssub', 'install'),
158                       DIRECTORY     => get_string('directorysettingssub', 'install'),
159                       DATABASE      => get_string('databasesettingssub', 'install'),
160                       ADMIN         => get_string('admindirsettingsub', 'install'),
161                       ENVIRONMENT   => get_string('environmentsub', 'install'),
162                       DOWNLOADLANG  => get_string('downloadlanguagesub', 'install'),
163                       SAVE          => get_string('configurationcompletesub', 'install')
164                        );
168 //==========================================================================//
170 /// Are we in help mode?
172 if (isset($_GET['help'])) {
173     $nextstage = -1;
178 //==========================================================================//
180 /// Are we in config download mode?
182 if (isset($_GET['download'])) {
183     header("Content-Type: application/download\n"); 
184     header("Content-Disposition: attachment; filename=\"config.php\"");
185     echo $INSTALL['config'];
186     exit;
193 //==========================================================================//
195 /// Check the directory settings
197 if ($INSTALL['stage'] == DIRECTORY) {
199     error_reporting(0);
200     
201     /// check wwwroot
202     if (ini_get('allow_url_fopen')) {
203         if (($fh = @fopen($INSTALL['wwwrootform'].'/install.php', 'r')) === false) {
204             $errormsg .= get_string('wwwrooterror', 'install').'<br />';
205             $INSTALL['wwwrootform'] = $INSTALL['wwwroot'];
206         }
207     }
208     if ($fh) fclose($fh);
209             
210     /// check dirroot
211     if (($fh = @fopen($INSTALL['dirrootform'].'/install.php', 'r')) === false ) {
212         $errormsg .= get_string('dirrooterror', 'install').'<br />';
213         $INSTALL['dirrootform'] = $INSTALL['dirroot'];
214     } 
215     if ($fh) fclose($fh);
217     /// check dataroot
218     $CFG->dataroot = $INSTALL['dataroot'];
219     if (make_upload_directory('sessions', false) === false ) {
220         $errormsg .= get_string('datarooterror', 'install').'<br />';
221     }
222     if ($fh) fclose($fh); 
224     if (!empty($errormsg)) $nextstage = DIRECTORY;
226     error_reporting(7);
231 //==========================================================================//
233 /// Check database settings if stage 3 data submitted
234 /// Try to connect to the database. If that fails then try to create the database
236 if ($INSTALL['stage'] == DATABASE) {
238     /// First of all, analyze skipdbencodingtest status
239      if (isset($_POST['skipdbencodingtest'])) {
240          $INSTALL['skipdbencodingtest'] = true;
241      } else {
242          $INSTALL['skipdbencodingtest'] = false;
243      }
244     
245     /// different format for postgres7 by socket
246     if ($INSTALL['dbtype'] == 'postgres7' and ($INSTALL['dbhost'] == 'localhost' || $INSTALL['dbhost'] == '127.0.0.1')) {
247         $INSTALL['dbhost'] = "user='{$INSTALL['dbuser']}' password='{$INSTALL['dbpass']}' dbname='{$INSTALL['dbname']}'";
248         $INSTALL['dbuser'] = '';
249         $INSTALL['dbpass'] = '';
250         $INSTALL['dbname'] = '';
252         if ($INSTALL['prefix'] == '') { /// must have a prefix
253             $INSTALL['prefix'] = 'mdl_';
254         }
255     }
257     if ($INSTALL['dbtype'] == 'mysql') {  /// Check MySQL extension is present
258         if (!extension_loaded('mysql')) {
259             $errormsg = get_string('mysqlextensionisnotpresentinphp', 'install');
260             $nextstage = DATABASE;
261         }
262     }
264     if (empty($errormsg)) {
266         error_reporting(0);  // Hide errors 
268         if (! $dbconnected = $db->Connect($INSTALL['dbhost'],$INSTALL['dbuser'],$INSTALL['dbpass'],$INSTALL['dbname'])) {
269             /// The following doesn't seem to work but we're working on it
270             /// If you come up with a solution for creating a database in MySQL 
271             /// feel free to put it in and let us know
272             if ($dbconnected = $db->Connect($INSTALL['dbhost'],$INSTALL['dbuser'],$INSTALL['dbpass'])) {
273                 switch ($INSTALL['dbtype']) {   /// Try to create a database
274                     case 'mysql':
275                         if ($db->Execute("CREATE DATABASE {$INSTALL['dbname']};")) {
276                             $dbconnected = $db->Connect($INSTALL['dbhost'],$INSTALL['dbuser'],$INSTALL['dbpass'],$INSTALL['dbname']);
277                         } else {
278                             $errormsg = get_string('dbcreationerror', 'install');
279                             $nextstage = DATABASE;
280                         }
281                         break;
282                 }
283             }
284         } else {
285         /// We have been able to connect properly, just test the database encoding now. It should be Unicode for 1.6
286         /// installations (although not mandatory for now). Just show one message about it and allow to skip this test.
287             if (empty($INSTALL['skipdbencodingtest'])) {
288             /// We haven't checked the skip test checkbox, so perform the test
289                 $encoding = '';
290                 switch ($INSTALL['dbtype']) {
291                     case 'mysql':
292                     ///Get MySQL character_set_database value
293                         $rs = $db->Execute("SHOW VARIABLES LIKE 'character_set_database'");
294                         if ($rs && $rs->RecordCount() > 0) {
295                             $records = $rs->GetAssoc(true);
296                             $encoding = $records['character_set_database']['Value'];
297                             if (strtoupper($encoding) != 'UTF8') {
298                                 $errormsg = get_string('dbwrongencoding', 'install', $encoding);
299                                 $nextstage = DATABASE;
300                                 $INSTALL['showskipdbencodingtest'] = true;
301                                 $INSTALL['dbencodingtestresults'] = false;
302                             } else {
303                                 $INSTALL['dbencodingtestresults'] = true;
304                             }
305                         }
306                         break;
307                     case 'postgres7':
308                     ///Get PostgreSQL server_encoding value
309                         $rs = $db->Execute("SHOW server_encoding");
310                         if ($rs && $rs->RecordCount() > 0) {
311                             $encoding = $rs->fields['server_encoding'];
312                             if (strtoupper($encoding) != 'UNICODE') {
313                                 $errormsg = get_string('dbwrongencoding', 'install', $encoding);
314                                 $nextstage = DATABASE;
315                                 $INSTALL['showskipdbencodingtest'] = true;
316                                 $INSTALL['dbencodingtestresults'] = false;
317                             } else {
318                                 $INSTALL['dbencodingtestresults'] = true;
319                             }
320                         }
321                         break;
322                 }
323             }
324         }
325     }
327     error_reporting(7);
329     if (($dbconnected === false) and (empty($errormsg)) ) {
330         $errormsg = get_string('dbconnectionerror', 'install');
331         $nextstage = DATABASE;
332     }
337 //==========================================================================//
339 /// If the next stage is admin directory settings OR we have just come from there then
340 /// check the admin directory.
341 /// If we can open a file then we know that the admin name is correct.
343 if ($nextstage == ADMIN or $INSTALL['stage'] == ADMIN) {
344     if (!ini_get('allow_url_fopen')) {
345         $nextstage = ($goforward) ? ENVIRONMENT : DATABASE;
346     } else if (($fh = @fopen($INSTALL['wwwroot'].'/'.$INSTALL['admindirname'].'/site.html', 'r')) !== false) {
347         $nextstage = ($goforward) ? ENVIRONMENT : DATABASE;
348         fclose($fh);
349     } else {
350         if ($nextstage != ADMIN) {
351             $errormsg = get_string('admindirerror', 'install');
352             $nextstage = ADMIN;
353         }
354     }
357 //==========================================================================//
359 // Check if we can navigate from the environemt page (because it's ok)
361 if ($INSTALL['stage'] == ENVIRONMENT) {
362     error_reporting(0);  // Hide errors
363     $dbconnected = $db->Connect($INSTALL['dbhost'],$INSTALL['dbuser'],$INSTALL['dbpass'],$INSTALL['dbname']);
364     error_reporting(7);  // Show errors
365     if ($dbconnected) {
366     /// Execute environment check, printing results
367         if (!check_moodle_environment($INSTALL['release'], $environment_results, false)) {
368              $nextstage = ENVIRONMENT;
369         }
370     } else {
371     /// We never should reach this because DB has been tested before arriving here
372         $errormsg = get_string('dbconnectionerror', 'install');
373         $nextstage = DATABASE;
374     }
379 //==========================================================================//
381 // Try to download the lang pack if it has been selected
383 if ($INSTALL['stage'] == DOWNLOADLANG && $INSTALL['downloadlangpack']) {
385     $downloadsuccess = false;
386     $downloaderror = '';
388     error_reporting(0);  // Hide errors
390 /// Create necessary lang dir
391     if (!make_upload_directory('lang', false)) {
392         $downloaderror = get_string('cannotcreatelangdir', 'error');
393     }
395 /// Download and install component
396     if (($cd = new component_installer('http://download.moodle.org', 'lang16',
397         $INSTALL['language'].'.zip', 'languages.md5', 'lang')) && empty($errormsg)) {
398         $status = $cd->install(); //returns ERROR | UPTODATE | INSTALLED
399         switch ($status) {
400             case ERROR:
401                 if ($cd->get_error() == 'remotedownloadnotallowed') {
402                     $a = new stdClass();
403                     $a->url = 'http://download.moodle.org/lang16/'.$pack.'zip';
404                     $a->dest= $CFG->dataroot.'/lang';
405                     $downloaderror = get_string($cd->get_error(), 'error', $a);
406                 } else {
407                     $downloaderror = get_string($cd->get_error(), 'error');
408                 }
409             break;
410             case UPTODATE:
411             case INSTALLED:
412                 $downloadsuccess = true;
413             break;
414             default:
415                 //We shouldn't reach this point
416         }
417     } else {
418         //We shouldn't reach this point
419     }
421     error_reporting(7);  // Show errors
423     if ($downloadsuccess) {
424         $INSTALL['downloadlangpack']       = false;
425         $INSTALL['showdownloadlangpack']   = false;
426         $INSTALL['downloadlangpackerror']  = $downloaderror;
427     } else {
428         $INSTALL['downloadlangpack']       = false;
429         $INSTALL['showdownloadlangpack']   = false;
430         $INSTALL['downloadlangpackerror']  = $downloaderror;
431     }
432 }    
436 //==========================================================================//
438 /// Display or print the data
439 /// Put the data into a string
440 /// Try to open config file for writing.
442 if ($nextstage == SAVE) {
444     $str  = '<?php  /// Moodle Configuration File '."\r\n";
445     $str .= "\r\n";
447     $str .= 'unset($CFG);'."\r\n";
448     $str .= "\r\n";
450     $str .= '$CFG->dbtype    = \''.$INSTALL['dbtype']."';\r\n";
451     $str .= '$CFG->dbhost    = \''.addslashes($INSTALL['dbhost'])."';\r\n";
452     if (!empty($INSTALL['dbname'])) {
453         $str .= '$CFG->dbname    = \''.$INSTALL['dbname']."';\r\n";
454         $str .= '$CFG->dbuser    = \''.$INSTALL['dbuser']."';\r\n";
455         $str .= '$CFG->dbpass    = \''.$INSTALL['dbpass']."';\r\n";
456     }
457     $str .= '$CFG->dbpersist =  false;'."\r\n";
458     $str .= '$CFG->prefix    = \''.$INSTALL['prefix']."';\r\n";
459     $str .= "\r\n";
461     $str .= '$CFG->wwwroot   = \''.$INSTALL['wwwrootform']."';\r\n";
462     $str .= '$CFG->dirroot   = \''.$INSTALL['dirrootform']."';\r\n";
463     $str .= '$CFG->dataroot  = \''.$INSTALL['dataroot']."';\r\n";
464     $str .= '$CFG->admin     = \''.$INSTALL['admindirname']."';\r\n";
465     $str .= "\r\n";
467     $str .= '$CFG->directorypermissions = 00777;  // try 02777 on a server in Safe Mode'."\r\n";
468     $str .= "\r\n";
470     if (!$INSTALL['skipdbencodingtest'] && $INSTALL['dbencodingtestresults']) {
471         $str .= '$CFG->unicodedb = true;  // Database is utf8'."\r\n";
472         $str .= "\r\n";
473     }
475     $str .= 'require_once("$CFG->dirroot/lib/setup.php");'."\r\n";
476     $str .= '// MAKE SURE WHEN YOU EDIT THIS FILE THAT THERE ARE NO SPACES, BLANK LINES,'."\r\n";
477     $str .= '// RETURNS, OR ANYTHING ELSE AFTER THE TWO CHARACTERS ON THE NEXT LINE.'."\r\n";
478     $str .= '?>';
480     umask(0137);
482     if (( $configsuccess = ($fh = @fopen($configfile, 'w')) ) !== false) {
483         fwrite($fh, $str);
484         fclose($fh);
485     }
486         
488     $INSTALL['config'] = $str;
493 //==========================================================================//
495 ?>
499 <html dir="<?php echo (get_string('this_direction') == 'rtl') ? 'rtl' : 'ltr' ?>">
500 <head>
501 <link rel="shortcut icon" href="theme/standard/favicon.ico" />
502 <title>Moodle Install</title>
503 <meta http-equiv="content-type" content="text/html; charset=<?php p(current_charset()) ?>" />
504 <?php css_styles() ?>
506 </head>
508 <body>
511 <?php
512 if (isset($_GET['help'])) {
513     print_install_help($_GET['help']);
514     close_window_button();
515 } else {
516 ?>
519 <table class="main" align="center" cellpadding="3" cellspacing="0">
520     <tr>
521         <td class="td_mainlogo">
522             <p class="p_mainlogo"><img src="pix/moodlelogo-med.gif" width="240" height="60" alt=\"\"></p>
523         </td>
524         <td class="td_mainlogo" valign="bottom">
525             <p class="p_mainheader"><?php print_string('installation', 'install') ?></p>
526         </td>
527     </tr>
529     <tr>
530         <td class="td_mainheading" colspan="2">
531             <p class="p_mainheading"><?php echo $headstagetext[$nextstage] ?></p>
532             <?php if (!empty($substagetext[$nextstage])) { ?>
533             <p class="p_subheading"><?php echo $substagetext[$nextstage] ?></p>
534             <?php } ?>
535         </td>
536     </tr>
538     <tr>
539         <td class="td_main" colspan="2">
540     
541 <?php
543 if (!empty($errormsg)) echo "<p class=\"errormsg\" align=\"center\">$errormsg</p>\n";
546 if ($nextstage == SAVE) {
547     $INSTALL['stage'] = WELCOME;
548     $options = array();
549     $options['lang'] = $INSTALL['language'];
550     if ($configsuccess) {
551         echo "<p>".get_string('configfilewritten', 'install')."</p>\n";
553         echo "<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\">\n";
554         echo "<tr>\n";
555         echo "<td width=\"33.3%\">&nbsp;</td>\n";
556         echo "<td width=\"33.3%\">&nbsp;</td>\n";
557         echo "<td width=\"33.3%\" align=\"right\">\n";        
558         print_single_button("index.php", $options, get_string('continue')."  &raquo;");
559         echo "</td>\n";
560         echo "</tr>\n";
561         echo "</table>\n";
563     } else {
564         echo "<p class=\"errormsg\">".get_string('configfilenotwritten', 'install')."</p>";
565         
566         echo "<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\">\n";
567         echo "<tr>\n";
568         echo "<td width=\"33.3%\">&nbsp;</td>\n";
569         echo "<td width=\"33.3%\" align=\"center\">\n";        
570         $installoptions = array();
571         $installoptions['download'] = 1; 
572         print_single_button("install.php", $installoptions, get_string('download', 'install'));
573         echo "</td>\n";
574         echo "<td width=\"33.3%\" align=\"right\">\n";        
575         print_single_button("index.php", $options, get_string('continue')."  &raquo;");
576         echo "</td>\n";
577         echo "</tr>\n";
578         echo "</table>\n";
580         echo "<hr />\n";
581         echo "<div style=\"text-align: left\">\n";
582         print_object(htmlentities($str));
583         echo "</div>\n";
584     }
585 } else {
586     $formaction = (isset($_GET['configfile'])) ? "install.php?configfile=".$_GET['configfile'] : "install.php";
587     form_table($nextstage, $formaction);
590 ?>
592         </td>
593     </tr>
594 </table>
596 <?php
598 ?>
600 </body>
601 </html>
612 <?php 
614 //==========================================================================//
617 function print_object($object) {
618     echo "<pre>\n";
619     print_r($object);
620     echo "</pre>\n";
625 //==========================================================================//
627 function form_table($nextstage = WELCOME, $formaction = "install.php") {
628     global $INSTALL, $db;
630     /// Print the standard form if we aren't in the DOWNLOADLANG page
631     /// because it has its own form.
632     if ($nextstage != DOWNLOADLANG) {
633         $needtoopenform = false;
634 ?>
635         <form name="installform" method="post" action="<?php echo $formaction ?>">
636         <input type="hidden" name="stage" value="<?php echo $nextstage ?>" />
638 <?php
639     } else {
640         $needtoopenform = true;
641     }
642 ?>
643     <table class="install_table" cellspacing="3" cellpadding="3" align="center">
645 <?php
646     /// what we do depends on the stage we're at
647     switch ($nextstage) {
648         case WELCOME: /// Welcome and language settings
649 ?>
650             <tr>
651                 <td class="td_left"><p><?php print_string('language') ?></p></td>
652                 <td class="td_right">
653                 <?php choose_from_menu (get_installer_list_of_languages(), 'language', $INSTALL['language'], '') ?>
654                 </td>
655             </tr>
657 <?php
658             break;
659         case COMPATIBILITY: /// Compatibilty check
660             $compatsuccess = true;
661             
662             /// Check that PHP is of a sufficient version
663             print_compatibility_row(check_php_version("4.1.0"), get_string('phpversion', 'install'), get_string('phpversionerror', 'install'), 'phpversionhelp');
664             /// Check session auto start
665             print_compatibility_row(!ini_get_bool('session.auto_start'), get_string('sessionautostart', 'install'), get_string('sessionautostarterror', 'install'), 'sessionautostarthelp');
666             /// Check magic quotes
667             print_compatibility_row(!ini_get_bool('magic_quotes_runtime'), get_string('magicquotesruntime', 'install'), get_string('magicquotesruntimeerror', 'install'), 'magicquotesruntimehelp');
668             /// Check unsupported PHP configuration
669             print_compatibility_row(ini_get_bool('magic_quotes_gpc') || (!ini_get_bool('register_globals')), get_string('globalsquotes', 'install'), get_string('globalsquoteserror', 'install'), 'globalsquoteshelp');
670             /// Check safe mode 
671             print_compatibility_row(!ini_get_bool('safe_mode'), get_string('safemode', 'install'), get_string('safemodeerror', 'install'), 'safemodehelp', true);
672             /// Check file uploads
673             print_compatibility_row(ini_get_bool('file_uploads'), get_string('fileuploads', 'install'), get_string('fileuploadserror', 'install'), 'fileuploadshelp', true);
674             /// Check GD version
675             print_compatibility_row(check_gd_version(), get_string('gdversion', 'install'), get_string('gdversionerror', 'install'), 'gdversionhelp', true);
676             /// Check memory limit
677             print_compatibility_row(check_memory_limit(), get_string('memorylimit', 'install'), get_string('memorylimiterror', 'install'), 'memorylimithelp', true);
680             break;
681         case DIRECTORY: /// Directory settings
682 ?>
684             <tr>
685                 <td class="td_left"><p><?php print_string('wwwroot', 'install') ?></p></td>
686                 <td class="td_right">
687                     <input type="text" size="40"name="wwwrootform" value="<?php echo $INSTALL['wwwrootform'] ?>" />
688                 </td>
689             </tr>
690             <tr>
691                 <td class="td_left"><p><?php print_string('dirroot', 'install') ?></p></td>
692                 <td class="td_right">
693                     <input type="text" size="40" name="dirrootform" value="<?php echo $INSTALL['dirrootform'] ?>" />
694                 </td>
695             </tr>
696             <tr>
697                 <td class="td_left"><p><?php print_string('dataroot', 'install') ?></p></td>
698                 <td class="td_right">
699                     <input type="text" size="40" name="dataroot" value="<?php echo $INSTALL['dataroot'] ?>" />
700                 </td>
701             </tr>
703 <?php
704             break;
705         case DATABASE: /// Database settings
706 ?>
708             <tr>
709                 <td class="td_left"><p><?php print_string('dbtype', 'install') ?></p></td>
710                 <td class="td_right">
711                 <?php choose_from_menu (array("mysql" => "mysql", "postgres7" => "postgres7"), 'dbtype', $INSTALL['dbtype'], '') ?>
712                 </td>
713             </tr>
714             <tr>
715                 <td class="td_left"><p><?php print_string('dbhost', 'install') ?></p></td>
716                 <td class="td_right">
717                     <input type="text" size="40" name="dbhost" value="<?php echo $INSTALL['dbhost'] ?>" />
718                 </td>
719             </tr>
720             <tr>
721                 <td class="td_left"><p><?php print_string('database', 'install') ?></p></td>
722                 <td class="td_right">
723                     <input type="text" size="40" name="dbname" value="<?php echo $INSTALL['dbname'] ?>" />
724                 </td>
725             </tr>
726             <tr>
727                 <td class="td_left"><p><?php print_string('user') ?></p></td>
728                 <td class="td_right">
729                     <input type="text" size="40" name="dbuser" value="<?php echo $INSTALL['dbuser'] ?>" />
730                 </td>
731             </tr>
732             <tr>
733                 <td class="td_left"><p><?php print_string('password') ?></p></td>
734                 <td class="td_right">
735                     <input type="password" size="40" name="dbpass" value="<?php echo $INSTALL['dbpass'] ?>" />
736                 </td>
737             </tr>
738             <tr>
739                 <td class="td_left"><p><?php print_string('dbprefix', 'install') ?></p></td>
740                 <td class="td_right">
741                     <input type="text" size="40" name="prefix" value="<?php echo $INSTALL['prefix'] ?>" />
742                 </td>
743             </tr>
744             <?php if ($INSTALL['showskipdbencodingtest']) { ?>
745             <tr>
746                 <td class="td_left" colspan="2">
747                     <?php print_checkbox ('skipdbencodingtest', '1', $INSTALL['skipdbencodingtest'], get_string('skipdbencodingtest', 'install')) ?>
748                 </td>
749             </tr>
750             <?php } ?>
752 <?php
753             break;
754         case ADMIN: /// Administration directory setting
755 ?>
757             <tr>
758                 <td class="td_left"><p><?php print_string('admindirname', 'install') ?></p></td>
759                 <td class="td_right">
760                     <input type="text" size="40" name="admindirname" value="<?php echo $INSTALL['admindirname'] ?>" />
761                 </td>
762             </tr>
765 <?php
766             break;
767         case ENVIRONMENT: /// Environment checks
768 ?>
770             <tr>
771                 <td colspan="2">
772                 <?php
773                     error_reporting(0);  // Hide errors
774                     $dbconnected = $db->Connect($INSTALL['dbhost'],$INSTALL['dbuser'],$INSTALL['dbpass'],$INSTALL['dbname']);
775                     error_reporting(7);  // Show errors
776                     if ($dbconnected) {
777                     /// Execute environment check, printing results
778                         check_moodle_environment($INSTALL['release'], $environment_results, true);
779                     } else {
780                     /// We never should reach this because DB has been tested before arriving here
781                         $errormsg = get_string('dbconnectionerror', 'install');
782                         $nextstage = DATABASE;
783                         echo '<p class="errormsg" align="center">'.get_string('dbconnectionerror', 'install').'</p>';
784                     }
785                 ?>
786                 </td>
787             </tr>
789 <?php
790             break;
791         case DOWNLOADLANG: /// Download language from download.moodle.org
792 ?>
794             <tr>
795                 <td colspan="2">
796                 <?php
797                 /// Get array of languages, we are going to use it
798                     $languages=get_installer_list_of_languages();
799                 /// Print the download form (button) if necessary
800                     if ($INSTALL['showdownloadlangpack'] == true && substr($INSTALL['language'],0,2) != 'en') {
801                         $options = array();
802                         $options['downloadlangpack'] = true;
803                         $options['stage'] = DOWNLOADLANG;
804                         $options['same'] = true;
805                         print_simple_box_start('center');
806                         print_single_button('install.php', $options, get_string('downloadlanguagebutton','install', $languages[$INSTALL['language']]), 'POST');
807                         print_simple_box_end();
808                     } else {
809                 /// Show result info 
810                     /// English lang packs aren't downloaded
811                         if (substr($INSTALL['language'],0,2) == 'en') {
812                             print_simple_box(get_string('downloadlanguagenotneeded', 'install', $languages[$INSTALL['language']]), 'center', '80%');
813                         } else {
814                             if ($INSTALL['downloadlangpackerror']) {
815                                 echo "<p class=\"errormsg\" align=\"center\">".$INSTALL['downloadlangpackerror']."</p>\n";
816                                 print_simple_box(get_string('langdownloaderror', 'install', $languages[$INSTALL['language']]), 'center', '80%');
817                             } else {
818                                 print_simple_box(get_string('langdownloadok', 'install', $languages[$INSTALL['language']]), 'center', '80%');
819                             }
820                         }
821                     }
822                 ?>
823                 </td>
824             </tr>
826 <?php
827             break;
828         default:
829     }
830 ?>
832     <tr>
833         <td colspan="<?php echo ($nextstage == COMPATIBILITY) ? 3 : 2; ?>">
835 <?php
836     if ($needtoopenform) {
837 ?>
838             <form name="installform" method="post" action="<?php echo $formaction ?>">
839             <input type="hidden" name="stage" value="<?php echo $nextstage ?>" />
840 <?php
841     }
842 ?>
844             <?php echo ($nextstage < SAVE) ? "<input type=\"submit\" name=\"next\" value=\"".get_string('next')."  &raquo;\" style=\"float: right\"/>\n" : "&nbsp;\n" ?>
845             <?php echo ($nextstage > WELCOME) ? "<input type=\"submit\" name=\"prev\" value=\"&laquo;  ".get_string('previous')."\" style=\"float: left\"/>\n" : "&nbsp;\n" ?>
847 <?php
848     if ($needtoopenform) {
849 ?>
850             </form>
851 <?php
852     }
853 ?>
856         </td>
858     </tr>
859     
860     </table>
861 <?php
862     if (!$needtoopenform) {
863 ?>
864     </form>
865 <?php
866     }
867 ?>
869 <?php
874 //==========================================================================//
876 function print_compatibility_row($success, $testtext, $errormessage, $helpfield='', $caution=false) {
877     echo "<tr>\n";
878     echo "<td class=\"td_left\" valign=\"top\" nowrap width=\"160\"><p>$testtext</p></td>\n";
879     if ($success) {
880         echo "<td valign=\"top\"><p class=\"p_pass\">".get_string('pass', 'install')."</p></td>\n";
881         echo "<td valign=\"top\">&nbsp;</td>\n";
882     } else {
883         echo "<td valign=\"top\"";
884         echo ($caution) ? "<p class=\"p_caution\">".get_string('caution', 'install') : "<p class=\"p_fail\">".get_string('fail', 'install');
885         echo "</p></td>\n";
886         echo "<td valign=\"top\">";
887         echo "<p>$errormessage ";
888         install_helpbutton("install.php?help=$helpfield");
889         echo "</p></td>\n";
890     }
891     echo "</tr>\n";
892     return $success;
896 //==========================================================================//
898 function install_helpbutton($url, $title='') {
899     if ($title == '') {
900         $title = get_string('help');
901     }
902     echo "<a href=\"javascript: void(0)\">";
903     echo "<img src=\"./pix/help.gif\" height=\"17\" width=\"17\" alt=\"$title\"";
904     echo "border=\"0\" align=\"middle\" title=\"$title\" ";
905     echo "onClick=\"return window.open('$url', 'Help', 'menubar=0,location=0,scrollbars,resizable,width=500,height=400')\">";
906     echo "</a>\n";
908     
911 //==========================================================================//
913 function print_install_help($help) {
914     switch ($help) {
915         case 'phpversionhelp':
916             print_string($help, 'install', phpversion());
917             break;
918         case 'memorylimithelp':
919             print_string($help, 'install', get_memory_limit());
920             break;
921         default:
922             print_string($help, 'install');
923     }
927 //==========================================================================//
929 function get_memory_limit() {
930     if ($limit = ini_get('memory_limit')) {
931         return $limit;
932     } else {
933         return get_cfg_var('memory_limit');
934     }
937 //==========================================================================//
939 function check_memory_limit() {
941     /// if limit is already 16M or more then we don't care if we can change it or not
942     if ((int)str_replace('M', '', get_memory_limit()) >= 16) {
943         return true;
944     }
946     /// Otherwise, see if we can change it ourselves
947     @ini_set('memory_limit', '16M');
948     return ((int)str_replace('M', '', get_memory_limit()) >= 16);
951 //==========================================================================//
953 /* This function returns a list of languages and their full names. The
954  * list of available languages is fetched from install/lang/xx/installer.php
955  * and it's used exclusively by the installation process
956  * @return array An associative array with contents in the form of LanguageCode => LanguageName
957  */
958 function get_installer_list_of_languages() {
960     global $CFG;
962     $languages = array();
964 /// Get raw list of lang directories
965     $langdirs = get_list_of_plugins('install/lang');
966     asort($langdirs);
967 /// Get some info from each lang
968     foreach ($langdirs as $lang) {
969         if (file_exists($CFG->dirroot .'/install/lang/'. $lang .'/installer.php')) {
970             include($CFG->dirroot .'/install/lang/'. $lang .'/installer.php');
971             if (!empty($string['thislanguage'])) {
972                 $languages[$lang] = $string['thislanguage'] .' ('. $lang .')';
973             }
974             unset($string);
975         }
976     }
977 /// Return array
978     return $languages;
981 //==========================================================================//
983 function css_styles() {
984 ?>
986 <style type="text/css">
988     body { background-color: #ffeece; }
989     p, li, td { 
990         font-family: helvetica, arial, sans-serif;
991         font-size: 10pt;
992     }
993     a { text-decoration: none; color: blue; }
994     .errormsg {
995         color: red;
996         font-weight: bold;
997     }
998     blockquote {
999         font-family: courier, monospace;
1000         font-size: 10pt;
1001     }
1002     .install_table {
1003         width: 500px;
1004     }
1005     .td_left {
1006         text-align: right;
1007         font-weight: bold;
1008     }
1009     .td_right {
1010         text-align: left;
1011     }
1012     .main {
1013         width: 500px;
1014         border-width: 1px;
1015         border-style: solid;
1016         border-color: #ffc85f;
1017         -moz-border-radius-bottomleft: 15px;
1018         -moz-border-radius-bottomright: 15px;
1019     }
1020     .td_mainheading {
1021         background-color: #fee6b9;
1022         padding: 10px;
1023     }
1024     .td_main {
1025         text-align: center;
1026     }
1027     .td_mainlogo {
1028     }
1029     .p_mainlogo {
1030     }
1031     .p_mainheading {
1032         font-size: 11pt;
1033     }
1034     .p_subheading {
1035         font-size: 10pt;
1036         padding: 10px;
1037     }
1038     .p_mainheader{
1039         text-align: right;
1040         font-size: 20pt;
1041         font-weight: bold;
1042     }
1043     .p_pass {
1044         color: green;
1045         font-weight: bold;
1046     }
1047     .p_fail {
1048         color: red;
1049         font-weight: bold;
1050     }
1051     .p_caution {
1052         color: #ff6600;
1053         font-weight: bold;
1054     }
1055     .p_help {
1056         text-align: center;
1057         font-family: helvetica, arial, sans-serif;
1058         font-size: 14pt;
1059         font-weight: bold;
1060         color: #333333;
1061     }
1062     .environmenttable {
1063         font-size: 10pt;
1064         border-color: #ffc85f;
1065     }
1066     .header {
1067         background-color: #fee6b9;
1068         font-size: 10pt;
1069     }
1070     .cell {
1071         background-color: #ffeece;
1072         font-size: 10pt;
1073     }
1074     .error {
1075         color: #ff0000;
1076     }
1077     .errorboxcontent {
1078         text-align: center;
1079         font-weight: bold;
1080         padding: 20px;
1081         color: #ff0000;
1082     }
1084 </style>
1086 <?php
1088 ?>