<?php //$Id: restore_form.html,v 1.43.2.7 2007/09/18 06:59:46 toyomoyo Exp $
    //This page prints the restore form to select everything yo want
    //to restore. Form is dinamically buid, depending of "info" object
    //that contains the backup contents and depending of every mod
    //capabilities.

    //Get objects from session
    if (!($info = $SESSION->info)) {
      error( 'info object missing from session' );
    }
    if (!($course_header = $SESSION->course_header)) {
      error( 'course_header object missing from session' );
    }

    //Check that we have all we need
    //backup_unique_code
    $backup_unique_code = required_param( 'backup_unique_code' );
    //file
    $file = required_param( 'file' );

    //Check login
    require_login();

    //Check admin
    if (!empty($id)) {
        if (!has_capability('moodle/site:restore', get_context_instance(CONTEXT_COURSE, $id))) {
            error("You need to be a teacher or admin user to use this page.", "$CFG->wwwroot/login/index.php");
        }
    } else {
        if (!has_capability('moodle/site:restore', get_context_instance(CONTEXT_SYSTEM, SITEID))) {
            error("You need to be an admin user to use this page.", "$CFG->wwwroot/login/index.php");   
        }
    }

    //Check site
    if (!$site = get_site()) {
        error("Site not found!");
    } 

    //Checks for the required files/functions to restore every mod
    $count = 0;
    if ($allmods = get_records("modules") ) { 
        foreach ($allmods as $mod) {
            $modname = $mod->name;
            $modfile = "$CFG->dirroot/mod/$modname/restorelib.php";
            $modrestore = $modname."_restore_mods";
            if (file_exists($modfile)) {
               include_once($modfile);
               if (function_exists($modrestore)) {
                   $var = "exists_".$modname;
                   $$var = true;
                   $count++;
               }
            }
            //Check data
            //Check module info
            $var = "restore_".$modname;
            if (!isset($$var)) {
                $$var = 1;
            }
            //Check include user info
            $var = "restore_user_info_".$modname;
            if (!isset($$var)) {
                $$var = 1;
            }
        }
    }

    //Check other parameters
    if (!isset($restore_metacourse)) {
        $restore_metacourse = 1;
    }
   
    if (!isset($restore_users)) {
        $restore_users = 1;
    }
   
    if (!isset($restore_logs)) {
        $restore_logs = 1;
    }

    if (!isset($restore_user_files)) {
        $restore_user_files = 1;
    }

    if (!isset($restore_course_files)) {
        $restore_course_files = 1;
    }

    if (!isset($restore_messages)) {
        $restore_messages = 1;
        }

    if (!isset($restore_restoreto)) {
        if (!user_can_create_courses()) {
            $restore_restoreto = 1;
        } else {
            $restore_restoreto = 2;
        }
    }

    if (!isset($course_header->category->id)) {
        $course_header->category->id = 0;
    }

    if(!isset($form1->startdate)) {
        $form1->startdate = $course_header->course_startdate; //$course_header->course_startdate;    
    }

    if (empty($form1->shortname)) {
       $form1->shortname = $course_header->course_shortname; //'_shortname'; //$course_header->course_shortname; 
    }

    if (empty($form1->fullname)) {
      $form1->fullname = $course_header->course_fullname; // '_fullname';   //$course_header->course_fullname; 
    }

    if ($count == 0) {
        notice("No restorable modules are installed!");
    }

?>

<script type="text/javascript">
<!--
function selectItemInMenuByName(formId, menuName, selectIndex ) {
    myForm = document.getElementById(formId)
    for (i=0,n=myForm.elements.length;i<n;i++) {
        myLen = menuName.length;
        myName = myForm.elements[i].name;
        myType = myForm.elements[i].type;
        if (myName.substring(0,myLen) == menuName && myType == "select-one") {
            myForm.elements[i].options[selectIndex].selected = true;
        }
    }
}

function selectItemInRadioByName(formId, radioName, selectIndex ) {
    myForm = document.getElementById(formId)
    for (i=0,n=myForm.elements.length;i<n;i++) {
        myLen = radioName.length;
        myName = myForm.elements[i].name;
        myType = myForm.elements[i].type;
        if (myName.substring(0,myLen) == radioName && myType == "radio") {
            myRadioGroup = myForm.elements[myName];
            myRadioGroup[selectIndex].checked = true;
        }
    }
}

function selectItemInCheckboxByName(formId, checkName, checked ) {
    myForm = document.getElementById(formId)
    for (i=0,n=myForm.elements.length;i<n;i++) {
        myLen = checkName.length;
        myName = myForm.elements[i].name;
        myType = myForm.elements[i].type;
        if (myName.substring(0,myLen) == checkName && myType == "checkbox") {
            myForm.elements[i].checked = checked;
        }
    }
}
-->
</script>

<form id="form1" method="post" action="restore.php">
<div>
<table cellpadding="5" class="boxaligncenter">
<?php

    //First, course destination
    //Print the full tr
    echo "<tr>";
    echo "<td align=\"right\"><b>";
    echo get_string("restoreto").":</b>";
    echo "</td><td colspan=\"3\">";
    
    // permission should have been checked already
    
    /**
     * if user has manageactivities in any course, we show 
     *      existingcoursedeleting 
     *      existingcourseadding
     * else we show
     *      currentcoursedeleting
     *      currentcourse
     * if user has course:create in any category, we show
     *      newcourse
     */
    
    $mycourses = get_capability_courses('moodle/site:restore');
    // if the user can manage 2 or more courses,
    // or if the only course the user can manage is not the current course
    // we show options for existing courses
    if (count($mycourses) > 1 || !in_array($id, $mycourses)) {
        // if user can manage more than 1 course, or if user can restore to a single different course
        $restore_restoreto_options[0] = get_string("existingcoursedeleting");
        $restore_restoreto_options[1] = get_string("existingcourseadding");
    // else if the user can write to current course
    } else if (has_capability('moodle/site:restore', get_context_instance(CONTEXT_COURSE, $id))){
        $restore_restoreto_options[0] = get_string("currentcoursedeleting");
        $restore_restoreto_options[1] = get_string("currentcourseadding");   
    }
    
    // if user can create any course at all, give the option
    if (user_can_create_courses()) {
        $restore_restoreto_options[2] = get_string("newcourse"); 
    }
   
    choose_from_menu($restore_restoreto_options, "restore_restoreto", $restore_restoreto, "");
    echo "</td></tr>";
    if (user_can_create_courses()) {  //display these fields conditionally
        
        // find the list of cates user can edit
        echo "<tr valign=\"top\" >";
        echo "<td align=\"right\">";
        print_string('category');
        echo " :</td>";
        echo "<td>";
        choose_from_menu(get_creatable_categories(), "restore_restorecatto", $course_header->category->id, "");        
        echo "</td>";
        echo "</tr>";
        
        echo "<tr valign=\"top\" >";
        echo "<td align=\"right\">";
        print_string("shortname");
        echo " :</td>";
        echo "<td><input type=\"text\" name=\"shortname\" maxlength=\"15\"  size=\"10\" value=\"$form1->shortname\" alt=\"".get_string("shortname")."\"  />" ;
        helpbutton("courseshortname", get_string("shortname")) ;
        if (isset($err["shortname"])) formerr($err["shortname"]);
        echo "</td>";
        echo "</tr>";
        echo "<tr valign=\"top\" >";
        echo "<td align=\"right\">";
        print_string("fullname");
        echo " :</td>";
        echo "<td><input type=\"text\" name=\"fullname\" maxlength=\"254\" size=\"50\" value=\"$form1->fullname\" alt=\" ".get_string("fullname")."\"  />" ;
        helpbutton("coursefullname", get_string("fullname")) ;
        if (isset($err["fullname"])) formerr($err["fullname"]); 
        echo"</td></tr>";
        echo "<tr valign=\"top\"> ";
        echo "<td align=\"right\"> ";
        print_string("startdate");
        echo ":</td><td>";
    /// Show the roll dates option only if the backup course has a start date
    /// (some formats like main page, social..., haven't it and rolling dates
    /// from 0 produces crazy dates. MDL-10125
        if ($form1->startdate) {
            print_date_selector("startday", "startmonth", "startyear", $form1->startdate);
        } else {
            print_string('notavailable');
            echo '<input type="hidden" name="startyear" value="0" />';
            echo '<input type="hidden" name="startmonth" value="0" />';
            echo '<input type="hidden" name="startday" value="0" />';
        }
        helpbutton("coursestartdate", get_string("startdate"));
        echo "</td></tr>";
    }
    //Line
    echo "<tr><td colspan=\"4\"><hr /></td></tr>";
    //Now, check modules and info and show posibilities
    if ($allmods = get_records("modules") ) {
        //Print option to select/deselect everything with 1 click.
        echo "<tr>";
        echo "<td align=\"right\">";
        echo '<b>'.get_string("include").":</b>";
        echo "</td><td>";
        echo "<a href=\"javascript:void(0);\" onclick=\"selectItemInCheckboxByName('form1', 'restore_', true);\">".
             get_string("all")."</a>/";
        echo "<a href=\"javascript:void(0);\" onclick=\"selectItemInCheckboxByName('form1', 'restore_', false);\">".
             get_string("none")."</a>";
        echo "</td>";
        echo "<td align=\"right\">";
        echo '<b>&nbsp;</b>';
        echo "</td><td>";
        echo "<a href=\"javascript:void(0);\" onclick=\"selectItemInCheckboxByName('form1', 'restore_user_info_', true);\">".
             get_string("all")."</a>/";
        echo "<a href=\"javascript:void(0);\" onclick=\"selectItemInCheckboxByName('form1', 'restore_user_info_', false);\">".
             get_string("none")."</a>";
        echo "</td>";
        echo "</tr>";
        echo "<tr><td colspan=\"4\"><hr /></td></tr>";
        $currentrow = 0;
        $nonrestmod = '';
        foreach ($allmods as $mod) {
            $modname = $mod->name;
            $modrestore = $modname."_restore_mods";
            //If exists the lib & function
            $exist = "exists_".$modname;
            $restore_var = "restore_".$modname;
            $user_info_var = "restore_user_info_".$modname;
            if (isset($$exist)) {
                if ($$exist) {
                    //Now check that we have that module info in the backup file
                    if (isset($info->mods[$modname]) && $info->mods[$modname]->backup == "true") {
                        //Print the full tr
                        echo "<tr class=\"r".$currentrow."\">";
                        echo "<td align=\"right\">&nbsp;";
                        echo "</td><td>";
                        $restore_options[1] = get_string("yes");
                        $restore_options[0] = get_string("no"); 
                        //choose_from_menu($restore_options, $restore_var, $$restore_var, "");
                        //choose_from_radio($restore_options, $restore_var, $$restore_var);
                        //Print the checkbox
                        print_checkbox($restore_var, $$restore_var, $$restore_var, get_string("modulenameplural",$modname),'','selectItemInCheckboxByName(\'form1\',\'restore_'.$modname.'\',this.checked)');
                        //If backup contains user data, then show menu, else fix it to
                        //without user data
                        echo "</td><td align=\"right\">&nbsp;";
                        echo "</td><td>";
                        if ($info->mods[$modname]->userinfo == "true") {
                            $restore_user_options[1] = get_string("yes");
                            $restore_user_options[0] = get_string("no"); 
                            //choose_from_menu($restore_user_options, $user_info_var, $$user_info_var, "");
                            //choose_from_radio($restore_user_options, $user_info_var, $$user_info_var);
                            print_checkbox($user_info_var, $$user_info_var, $$user_info_var, get_string("userdata"),'','selectItemInCheckboxByName(\'form1\',\'restore_user_info_'.$modname.'\',this.checked)');
                        } else {
                            //Module haven't userdata
                            echo get_string("withoutuserdata");
                            echo "<input type=\"hidden\" name=\"$user_info_var\" value=\"0\" />";
                        }
                        echo "</td></tr>";
                        if (isset($info->mods[$modname]->instances)) {
                            $instances = $info->mods[$modname]->instances;
                        }
                        if (!empty($instances) && is_array($instances)) {
                            echo '<tr><td></td><td colspan="3"><table class="restore-form-instances">';
                            foreach ($instances as $instance) {
                                echo '<tr><td>';
                                $var = 'restore_'.$modname.'_instance_'.$instance->id;
                                $$var = optional_param($var,1);
                                print_checkbox($var,$$var,$$var,$instance->name,$instance->name,'this.form.elements[\'restore_'.$modname.'\'].checked=1;');
                                echo '</td><td align="right">&nbsp;';
                                $var = 'restore_user_info_'.$modname.'_instance_'.$instance->id;
                                $$var = optional_param($var,1);
                                if ($info->mods[$modname]->instances[$instance->id]->userinfo == 'true') {
                                    print_checkbox($var,$$var,$$var,get_string('userdata'),'','this.form.elements[\'restore_user_info_'.$modname.'\'].checked=1;');
                                } else {
                                    echo '<input type="hidden" name="'.$var.'" value="0" />';
                                }
                                echo '</td></tr>';
                            }
                            echo '</table></td></tr>';
                        }
                    } else {
                        //Module isn't restorable
                        $nonrestmod .= "<input type=\"hidden\" name=\"$restore_var\" value=\"0\" />";
                        $nonrestmod .= "<input type=\"hidden\" name=\"$user_info_var\" value=\"0\" />";
                    }
                } else {
                    //Module isn't restorable
                    $nonrestmod .= "<input type=\"hidden\" name=\"$restore_var\" value=\"0\" />";
                    $nonrestmod .= "<input type=\"hidden\" name=\"$user_info_var\" value=\"0\" />";
                }
            } else {
                //Module isn't restorable
                $nonrestmod .= "<input type=\"hidden\" name=\"$restore_var\" value=\"0\" />";
                $nonrestmod .= "<input type=\"hidden\" name=\"$user_info_var\" value=\"0\" />";
            }
            $currentrow = ($currentrow + 1) % 2;
        }
        //Line
        echo "<tr><td colspan=\"4\">$nonrestmod<hr /></td></tr>";

        //Now print the Metacourse tr
        echo "<tr>";
        echo "<td align=\"right\" colspan=\"2\"><b>";
        echo get_string("metacourse").":";                                               
        echo "</b></td><td colspan=\"2\">";
        //If metacourse are in the backup file, show menu, else fixed to no
        if ($info->backup_metacourse == "true") {
            $metacourse_options[0] = get_string("no");
            $metacourse_options[1] = get_string("yes"); 
            choose_from_menu($metacourse_options, "restore_metacourse", $restore_metacourse, ""); 
        } else {
            echo get_string("no");
            echo "<input type=\"hidden\" name=\"restore_metacourse\" value=\"0\" />";
        }
        echo "</td></tr>";
        //Now print the Users tr
        echo "<tr>";
        echo "<td align=\"right\" colspan=\"2\"><b>";
        echo get_string("users").":";
        echo "</b></td><td colspan=\"2\">";
        //If some user is present in the backup file
        if ($info->backup_users == "all" or $info->backup_users == "course") {
            //If all users are in the backup file
            if ($info->backup_users == "all") {
                $user_options[0] = get_string("all");
            }
            $user_options[1] = get_string("course");
            $user_options[2] = get_string("none");
            choose_from_menu($user_options, "restore_users", $restore_users, "");
        } else {
            echo get_string("none");
            echo "<input type=\"hidden\" name=\"restore_users\" value=\"2\" />";

        }
        echo "</td></tr>";

        //Now print the Logs tr
        echo "<tr>";
        echo "<td align=\"right\" colspan=\"2\"><b>";
        echo get_string("logs").":";                                               
        echo "</b></td><td colspan=\"2\">";
        //If logs are in the backup file, show menu, else fixed to no
        if ($info->backup_logs == "true") {
            $log_options[0] = get_string("no");
            $log_options[1] = get_string("yes"); 
            choose_from_menu($log_options, "restore_logs", $restore_logs, ""); 
        } else {
            echo get_string("no");
            echo "<input type=\"hidden\" name=\"restore_logs\" value=\"0\" />";
        }
        echo "</td></tr>";

        //Now print the User Files tr
        echo "<tr>";
        echo "<td align=\"right\" colspan=\"2\"><b>";
        echo get_string ("userfiles").":";
        echo "</b></td><td colspan=\"2\">";
        //If user files are in the backup file, show menu, else fixed to no
        if ($info->backup_user_files == "true") {
            $user_file_options[0] = get_string("no"); 
            $user_file_options[1] = get_string("yes"); 
            choose_from_menu($user_file_options, "restore_user_files", $restore_user_files, "");
        } else {
            echo get_string("no");
            echo "<input type=\"hidden\" name=\"restore_user_files\" value=\"0\" />";
        }
        echo "</td></tr>";

        //Now print the Course Files tr
        echo "<tr>";
        echo "<td align=\"right\" colspan=\"2\"><b>";
        echo get_string ("coursefiles").":";
        echo "</b></td><td colspan=\"2\">";
        echo "<input type=\"hidden\" name=\"backup_unique_code\" value=\"$backup_unique_code\" />";
        echo "<input type=\"hidden\" name=\"file\" value=\"$file\" />";
        //If course files are in the backup file, show menu, else fixed to no
        if ($info->backup_course_files == "true") {
            $course_file_options[0] = get_string("no");
            $course_file_options[1] = get_string("yes");
            choose_from_menu($course_file_options, "restore_course_files", $restore_course_files, "");
        } else {
            echo get_string("no");
            echo "<input type=\"hidden\" name=\"restore_course_files\" value=\"0\" />";
        }
        echo "</td></tr>";

        //Now print the Messages tr
        echo "<tr>";
        echo "<td align=\"right\" colspan=\"2\"><b>";
        
        //This tr is slighty different. Everything becomes hidden if
        //we haven't messages is the backup, to avoid confusions to users.
        //If messages are in the backup file, show menu, else fixed to no and show nothing
        if ($info->backup_messages == "true") {
            echo get_string ('messages','message').":";
            echo "</b></td><td colspan=\"2\">";
            $message_options[0] = get_string("no");
            $message_options[1] = get_string("yes");
            choose_from_menu($message_options, "restore_messages", $restore_messages, "");
        } else {
            echo "&nbsp;</b></td><td colspan=\"2\">";
            echo "<input type=\"hidden\" name=\"restore_messages\" value=\"0\" />";
        }
        echo "</td></tr>";
    }
?>
</table>

<hr/>
<?php

print_heading(get_string('rolemappings'));
$xml_file  = $CFG->dataroot."/temp/backup/".$backup_unique_code."/moodle.xml";

$info = restore_read_xml_info($xml_file);

// fix for MDL-9068, front page course is just a normal course
$siterolesarray = get_assignable_roles (get_context_instance(CONTEXT_COURSE, $course->id), "shortname");
$siterolesnamearray = get_assignable_roles (get_context_instance(CONTEXT_COURSE, $course->id), "name");
$allroles = get_records('role');

echo ('<table width="100%" class="restore-form-instances">');
echo ('<tr><td align="right" style="width:50%"><b>'.get_string('sourcerole').'</b></td><td align="left" style="width:50%"><b>'.get_string('targetrole').'</b></td></tr>');

if ($info->backup_moodle_version < 2006092801) {
    // 1.6 and below backup
    
    /// Editting teacher
    echo ('<tr><td align="right">');
    print_string('defaultcourseteacher');
    echo ('</td><td algin="left">');
    
    // get the first teacheredit legacy
    $roles = get_roles_with_capability('moodle/legacy:editingteacher', CAP_ALLOW, get_context_instance(CONTEXT_SYSTEM, SITEID));

    $editteacher = array_shift($roles);
    choose_from_menu ($siterolesarray, "defaultteacheredit", $editteacher->id, 'new role', '', '0');
    echo ('</td></tr>');
    
    /// Non-editting teacher
    echo ('<tr><td align="right">');
    print_string('noneditingteacher');
    echo ('</td><td algin="left">');
    
    // get the first teacheredit legacy
    $roles = get_roles_with_capability('moodle/legacy:teacher', CAP_ALLOW, get_context_instance(CONTEXT_SYSTEM, SITEID));
    $teacher = array_shift($roles);
    
    choose_from_menu ($siterolesarray, "defaultteacher", $teacher->id, 'new role', '', '0');
    echo ('</td></tr>');
     
    
    /// Student
    echo ('<tr><td align="right">');
    print_string('defaultcoursestudent');
    echo ('</td><td algin="left">');
    
    // get the first teacheredit legacy
    $roles = get_roles_with_capability('moodle/legacy:student', CAP_ALLOW, get_context_instance(CONTEXT_SYSTEM, SITEID));
    $studentrole = array_shift($roles);
    
    choose_from_menu ($siterolesarray, "defaultstudent", $studentrole->id, 'new role', '', '0');
    echo ('</td></tr>');
  
} else {
    // 1.7 and above backup
    $roles = restore_read_xml_roles($xml_file);
    
    if (!empty($roles->roles)) { // possible to have course with no roles
        foreach ($siterolesarray as $siteroleid=>$siteroleshortname) {
            $siteroleschoicearray[$siteroleid] = $siterolesnamearray[$siteroleid]." (". $siterolesarray[$siteroleid].")";
        }

        foreach ($roles->roles as $roleid=>$role) {
         
            $mappableroles = $siteroleschoicearray;
         
            echo ('<tr><td align="right">');
            echo $role->name." (".($role->shortname).")";
            echo ('</td><td align="left">');

            /// first, we see if any exact role definition is found
            /// if found, that is the only option of restoring to
            
            if ($samerole = restore_samerole($roleid, $role)) {
                $matchrole = $samerole->id;
                // if an exact role is found, it does not matter whether this user can assign this role or not,
                // this will be presented as a valid option regardless
                $mappableroles[$samerole->id] = $allroles[$samerole->id]->name." (". $allroles[$samerole->id]->shortname.")";
            } else {
                // no exact role found, let's try to match shortname
                // this is useful in situations where basic roles differ slightly in definition
                $matchrole = 0;
                foreach ($siterolesarray as $siteroleid=>$siteroleshortname) {
                    if ($siteroleshortname == $role->shortname) {
                        $matchrole = $siteroleid;
                        break;
                    }
                }
            }
            choose_from_menu ($mappableroles, "roles_".$roleid, $matchrole, 'new role', '', '0');
            echo ('</td></tr>');
        }
    }
    
} // end else

echo ('</table>'); // end of role mappings table

?>
<br />
<div style="text-align:center">
<input type="hidden" name="id"     value="<?php  p($id) ?>" />
<input type="hidden" name="launch" value="check" />
<input type="hidden" name="fromform" value="1" />
<input type="submit" value="<?php  print_string("continue") ?>" />
<input type="submit" name="cancel" value="<?php  print_string("cancel") ?>" />
</div>
</div>
</form>

<?php

/* 
 * If there is a role with exactly the same definition, we pull it out from db
 */
function restore_samerole($roleid, $role) {
    global $CFG;
    
    $systemcontext = get_context_instance(CONTEXT_SYSTEM);
    // first let's use the id

    if ($trole = get_records_sql("SELECT roleid,capability,permission
                                   FROM {$CFG->prefix}role_capabilities
                                   WHERE roleid = $roleid")) {
        
        if (restore_is_samerole($trole, $role)) {
            $firstcap = array_shift($trole);
            return get_record('role', 'id', $firstcap->roleid); 
        } 
    }   
    
    // unfortunately then we have to loop all roles with the same number of capabiltiies
    if ($proles = get_records_sql("SELECT roleid, roleid
                                   FROM {$CFG->prefix}role_capabilities
                                   GROUP BY roleid
                                   HAVING COUNT(capability) = ".count($role->capabilities))) {                    
        foreach ($proles as $proleid=>$proleobj) {
            if ($prole = get_records('role_capabilities', 'roleid', $proleid)) {
                if (restore_is_samerole($prole, $role)) {
                    return get_record('role', 'id', $proleid); 
                }
            }       
        }                               
    }
 
    return false;
}

/* 
 * rolea from db, roleb from xml
 */
function restore_is_samerole($rolea, $roleb) {
  
    if (count($rolea) != count($roleb->capabilities)) {
        return false; 
    }
    
    foreach ($rolea as $cap) {
        if ($cap->permission != $roleb->capabilities[$cap->capability]->permission) {
            return false; 
        }     
    }
    return true;
}
?>