Source for file view_user.php

Documentation is available at view_user.php

  1. <?php
  2.     
  3.     /**
  4.     * Sloodle user profile page.
  5.     *
  6.     * Shows all Sloodle avatar entries associated with a particular user's Moodle account.
  7.     *
  8.     * @package sloodle
  9.     * @copyright Copyright (c) 2008 Sloodle (various contributors)
  10.     * @license http://www.gnu.org/licenses/gpl-3.0.html GNU GPL v3
  11.     *
  12.     * @contributor Peter R. Bloomfield
  13.     *
  14.     */
  15.     
  16.     //
  17.     // This script will display Sloodle-related user information about a particular Moodle user.
  18.     // Notably, this will include avatar data (i.e. name and UUID).
  19.     // In the case of a user viewing their own profile, or an admin viewing anybody's profile,
  20.     //  there will be the ability to unregister an avatar from the Moodle account, and to
  21.     //  delete allocated LoginZone positions.
  22.     //
  23.     
  24.     //
  25.     // This script requires the following paramter:
  26.     //  id = the ID number of a Moodle user, 'all' for all Sloodle entries, 'search' to search avatars by name/uuid, or 'pending' to list pending (unlinked) avatars
  27.     //
  28.     // The following parameter should be specified when a Sloodle entry is to be deleted:
  29.     //  delete = ID number the Sloodle entry to be deleted
  30.     // The following parameter should be used when the user confirms or rejects deletion
  31.     //  confirm = "Yes" (according to a localization table) if confirmed, unspecified if not yet confirmed, or anything else if cancelled.
  32.     //
  33.     // Optionally, the following parameter can also be specified. It defaults to the site if unspecified:
  34.     //  course = ID of a Moodle course
  35.     //
  36.     // In order to search for avatars, the following parameter is required:
  37.     //  search = a term to search for (avatar name/uuid)
  38.  
  39.  
  40.     /** Sloodle/Moodle configuration. */
  41.     require_once('../sl_config.php');
  42.     /** Sloodle Session code. */
  43.     require_once(SLOODLE_LIBROOT.'/sloodle_session.php');
  44.     /** General Sloodle functionality. */
  45.     require_once(SLOODLE_LIBROOT.'/general.php');
  46.     
  47.     // Enforce login
  48.     require_login();
  49.     // Refuse guest access
  50.     if (isguestuser()) {
  51.         error(get_string('noguestaccess''sloodle'));
  52.         exit;
  53.     }
  54.     
  55.     // Fetch the parameters
  56.     $moodleuserid required_param('id'PARAM_RAW);
  57.     $deletesloodleentry optional_param('delete'nullPARAM_INT);
  58.     $userconfirmed optional_param('confirm'nullPARAM_RAW);
  59.     $courseid optional_param('course'1PARAM_INT);
  60.     $searchstr addslashes(optional_param('search'''PARAM_TEXT));
  61.     $deleteuserobjects optional_param('deleteuserobjects'nullPARAM_TEXT);
  62.     
  63.     // Were any of the delete parameters specified in HTTP (e.g. from a form)?
  64.     if (!empty($deleteuserobjects|| !empty($deletesloodleentry|| !empty($userconfirmed)) {
  65.         // Convert them to session parameters
  66.         if (!empty($deleteuserobjects)) $_SESSION['deleteuserobjects'$deleteuserobjects;
  67.         if (!empty($deletesloodleentry)) $_SESSION['deletesloodleentry'$deletesloodleentry;
  68.         if (!empty($userconfirmed)) $_SESSION['userconfirmed'$userconfirmed;
  69.         
  70.         // Construct our full URL, with GET parameters
  71.         $url sloodle_get_web_path();
  72.         $url .= "?id=$moodleuserid";
  73.         if (!empty($courseid)) $url .= "&course=$courseid";
  74.         if (!empty($searchstr)) $url .= "&search=$searchstr";
  75.         // Reload this page without those parameters
  76.         redirect($url);
  77.         exit();
  78.     }
  79.     
  80.     // Extract data from our session parameters
  81.     if (isset($_SESSION['deleteuserobjects'])) {
  82.         $deleteuserobjects $_SESSION['deleteuserobjects'];
  83.         unset($_SESSION['deleteuserobjects']);
  84.     }
  85.     if (isset($_SESSION['deletesloodleentry'])) {
  86.         $deletesloodleentry $_SESSION['deletesloodleentry'];
  87.         unset($_SESSION['deletesloodleentry']);
  88.     }
  89.     if (isset($_SESSION['userconfirmed'])) {
  90.         $userconfirmed $_SESSION['userconfirmed'];
  91.         unset($_SESSION['userconfirmed']);
  92.     }
  93.     
  94.     // Check the mode: all, search, pending, or single
  95.     $allentries false;
  96.     $searchentries false;
  97.     if (strcasecmp($moodleuserid'all'== 0{
  98.         $allentries true;
  99.         $moodleuserid = -1;
  100.     else if (strcasecmp($moodleuserid'search'== 0{
  101.         $searchentries true;
  102.         $moodleuserid = -1;
  103.     else {
  104.         // Make sure the Moodle user ID is an integer
  105.         $moodleuserid = (integer)$moodleuserid;
  106.         if ($moodleuserid <= 0error(ucwords(get_string('unknownuser''sloodle')));
  107.     }
  108.     
  109.     
  110.     // Get the name of the course
  111.     $courserecord get_record('course''id'$courseid);
  112.     if (!$courserecorderror(get_string('invalidcourseid','sloodle'));
  113.     $courseurl $CFG->wwwroot.'/course/view.php?id='.$courseid;
  114.     $courseshortname $courserecord->shortname;
  115.     $coursefullname $courserecord->fullname;
  116.     
  117.     // We need to establish some permissions here
  118.     $course_context get_context_instance(CONTEXT_COURSE$courseid);
  119.     $system_context get_context_instance(CONTEXT_SYSTEM);
  120.     $viewingself false;
  121.     $canedit false;
  122.     // Is the user trying to view their own profile?
  123.     if ($moodleuserid == $USER->id{
  124.         $viewingself true;
  125.         $canedit true;
  126.     else {
  127.         // Does the user have permission to edit other peoples' profiles in the system and/or course?
  128.         // If not, can they at least view others' profiles?
  129.         if (has_capability('moodle/user:editprofile'$system_context|| has_capability('moodle/user:editprofile'$course_context)) {
  130.             // User can edit profiles
  131.             $canedit true;
  132.         else if (!(has_capability('moodle/user:viewdetails'$system_context|| has_capability('moodle/user:viewdetails'$course_context))) {
  133.             // Cannot view profiles
  134.             error(get_string('insufficientpermissiontoviewpage','sloodle'));
  135.             exit();
  136.         }
  137.     }
  138.     
  139.     // This value will indicate if we are currently confirming a deletion
  140.     $confirmingdeletion false;
  141.     
  142.     // These are localization strings used by the deletion confirmation form
  143.     $form_yes get_string('Yes''sloodle');
  144.     $form_no get_string('No''sloodle');
  145.     
  146.     
  147.     // Are we deleting a Sloodle entry?
  148.     $deletemsg '';    
  149.     if ($deletesloodleentry != NULL{
  150.         // Determine if the user is allowed to delete this entry
  151.         $allowdelete $canedit// Just go with the editing ability for now... will maybe change this later. -PRB
  152.         
  153.         // Has the deletion been confirmed?
  154.         if ($userconfirmed == $form_yes{
  155.             if (record_exists('sloodle_users''id'$deletesloodleentry)) {
  156.                 // Is the user allowed to delete this?
  157.                 if ($allowdelete{
  158.                     // Make sure it's a valid ID
  159.                     if (is_int($deletesloodleentry&& $deletesloodleentry 0{
  160.                         // Attempt to delete the entry
  161.                         $deleteresult delete_records('sloodle_users''id'$deletesloodleentry);
  162.                         if ($deleteresult === FALSE{
  163.                             $deletemsg get_string('deletionfailed''sloodle').': '.get_string('databasequeryfailed''sloodle');
  164.                         else {
  165.                             $deletemsg get_string('deletionsuccessful''sloodle');
  166.                         }
  167.                     else {
  168.                         $deletemsg get_string('deletionfailed''sloodle').': '.get_string('invalidid''sloodle');
  169.                     }
  170.                 else {
  171.                     $deletemsg get_string('deletionfailed''sloodle').': '.get_string('insufficientpermission''sloodle');
  172.                 }
  173.             }
  174.         else if (is_null($userconfirmed)) {
  175.             // User needs to confirm deletion
  176.             $confirmingdeletion true;
  177.             
  178.             $form_url SLOODLE_WWWROOT."/view/view_user.php";
  179.             
  180.             $deletemsg .= '<h3>'.get_string('delete','sloodle').' '.get_string('ID','sloodle').': '.$deletesloodleentry.'<br/>'.get_string('confirmdelete','sloodle').'</h3>';
  181.             $deletemsg .= '<form action="'.$form_url.'" method="get">';
  182.             
  183.             if ($allentries$deletemsg .= '<input type="hidden" name="id" value="all" />';
  184.             else if ($searchentries$deletemsg .= '<input type="hidden" name="id" value="search" /><input type="hidden" name="search" value="'.$searchstr.'" />';
  185.             else $deletemsg .= '<input type="hidden" name="id" value="'.$moodleuserid.'" />';
  186.             
  187.             if (!is_null($courseid)) $deletemsg .= '<input type="hidden" name="course" value="'.$courseid.'" />';
  188.             $deletemsg .= '<input type="hidden" name="delete" value="'.$deletesloodleentry.'" />';
  189.             $deletemsg .= '<input style="color:green;" type="submit" value="'.$form_yes.'" name="confirm" />&nbsp;&nbsp;';
  190.             $deletemsg .= '<input style="color:red;" type="submit" value="'.$form_no.'" name="confirm" />';
  191.             $deletemsg .= '</form><br/>';
  192.             
  193.         else {
  194.             $deletemsg get_string('deletecancelled','sloodle');
  195.         }
  196.     }
  197.     
  198.     // Are we getting all entries, searching, or just viewing one?
  199.     if ($allentries{
  200.         // All entries
  201.         $moodleuserdata null;
  202.         // Fetch a list of all Sloodle user entries
  203.         $sloodleentries get_records('sloodle_users');
  204.     else if ($searchentries && !empty($searchstr)) {
  205.         // Search entries
  206.         $moodleuserdata null;
  207.         $LIKE sql_ilike();
  208.         $sloodleentries get_records_select('sloodle_users'"avname $LIKE '%$searchstr%' OR uuid $LIKE '%$searchstr%'"'avname');
  209.     else {
  210.         // Attempt to fetch the Moodle user data
  211.         $moodleuserdata get_record('user''id'$moodleuserid);
  212.         // Fetch a list of all Sloodle user entries associated with this Moodle account
  213.         $sloodleentries get_records('sloodle_users''userid'$moodleuserid);
  214.     }
  215.     // Post-process the query results
  216.     if ($sloodleentries === FALSE$sloodleentries array();
  217.     $numsloodleentries count($sloodleentries);
  218.     
  219.     
  220.     // Get the localization strings
  221.     $strsloodle get_string('modulename''sloodle');
  222.     $strsloodles get_string('modulenameplural''sloodle');
  223.     $strunknown get_string('unknown''sloodle');
  224.     
  225.     // Construct the breadcrumb links
  226.     $navigation "";
  227.     if ($courseid != 1$navigation .= "<a href=\"$courseurl\">$courseshortname</a> -> ";
  228.     $navigation .= "<a href=\"".SLOODLE_WWWROOT."/view/view_users.php?course=$courseid\">".get_string('sloodleuserprofiles''sloodle''</a> -> ';
  229.     if ($moodleuserid 0{
  230.         if ($moodleuserdata$navigation .= $moodleuserdata->firstname.' '.$moodleuserdata->lastname;
  231.         else $navigation .= get_string('unknownuser','sloodle');
  232.     else {
  233.         $navigation.= get_string('allentries''sloodle');
  234.     }
  235.     
  236.     // Display the header
  237.     print_header(get_string('sloodleuserprofile''sloodle')get_string('sloodleuserprofile','sloodle')$navigation""""true);
  238.     
  239.     echo '<div style="text-align:center;padding-left:8px;padding-right:8px;">';
  240.     // Display the deletion message if we have one
  241.     if (!empty($deletemsg)) {
  242.         echo '<div style="text-align:center; padding:3px; border:solid 1px #aaaaaa; background-color:#dfdfdf; font-weight:bold; color:#dd0000;">';
  243.         echo $deletemsg;
  244.         echo '</div>';
  245.     }
  246.     echo '<br/>';
  247.     
  248.     // Are we dealing with an actual Moodle account
  249.     if ($moodleuserid 0{
  250.         echo '<p>';
  251.         // Yes - do we have an account?
  252.         if ($moodleuserdata{
  253.             // Yes - display the name and other general info
  254.             echo '<span style="font-size:18pt; font-weight:bold;">'$moodleuserdata->firstname .' '$moodleuserdata->lastname.'</span>';
  255.             echo " <span style=\"font-size:10pt; color:#444444; font-style:italic;\">(<a href=\"{$CFG->wwwroot}/user/view.php?id=$moodleuserid&amp;course=$courseid\">".get_string('moodleuserprofile','sloodle')."</a>)</span><br/>";
  256.         else {
  257.             echo get_string('moodleusernotfound''sloodle').'<br/>';
  258.         }        
  259.         echo "<br/><br/>\n";
  260.         
  261.         // Check for issues such as no entries, or multiple entries
  262.         if ($numsloodleentries == 0{
  263.             echo '<span style="color:red; font-weight:bold;">';
  264.             print_string('noentries''sloodle');
  265.             echo '</span>';
  266.             // If it is the profile owner who is viewing this, then offer a link to the loginzone entry page
  267.             if ($moodleuserid == $USER->id{
  268.                 echo "<br/><br/><p style=\"padding:8px; border:solid 1px #555555;\"><a href=\"{$CFG->wwwroot}/mod/sloodle/classroom/loginzone.php?id=$courseid\">";
  269.                 print_string('getnewloginzoneallocation''sloodle');
  270.                 echo '</a></p>';
  271.             }            
  272.             
  273.         else if ($numsloodleentries 1{
  274.             echo '<span style="color:red; font-weight:bold; border:solid 2px #990000; padding:4px; background-color:white;">';
  275.             print_string('multipleentries''sloodle');
  276.             helpbutton('multiple_entries'get_string('help:multipleentries''sloodle')'sloodle'truefalse);
  277.             echo '</span>';
  278.         }
  279.         echo '</p>';
  280.         
  281.     else if ($searchentries{
  282.         // Searching for users
  283.         echo '<span style="font-size:18pt; font-weight:bold; ">'.get_string('avatarsearch','sloodle').": \"$searchstr\"</span><br/><br/>";
  284.         // Check to see if there are no entries
  285.         if ($numsloodleentries == 0{
  286.             echo '<span style="color:red; font-weight:bold;">';
  287.             print_string('noentries''sloodle');
  288.             echo '</span>';
  289.         }
  290.         
  291.     else {
  292.         // Assume we're listing all entries - explain what this means
  293.         echo '<span style="font-size:18pt; font-weight:bold; ">'.get_string('allentries','sloodle').'</span><br/>';
  294.         echo '<center><p style="width:550px; text-align:left;">'.get_string('allentries:info''sloodle').'</p></center>';
  295.         
  296.         // Check to see if there are no entries
  297.         if ($numsloodleentries == 0{
  298.             echo '<span style="color:red; font-weight:bold;">';
  299.             print_string('noentries''sloodle');
  300.             echo '</span>';
  301.         }
  302.     }
  303.     
  304.     // Construct and display a table of Sloodle entries
  305.     if ($numsloodleentries 0{
  306.         $sloodletable new stdClass();
  307.         $sloodletable->head array(    get_string('ID''sloodle'),
  308.                                         get_string('linkedtomoodleusernum''sloodle'),
  309.                                         get_string('avatarname''sloodle'),
  310.                                         get_string('avataruuid''sloodle'),
  311.                                         get_string('lastactive''sloodle'),
  312.                                         ''
  313.                                     );
  314.         $sloodletable->align array('center''center''left''left''left''left');
  315.         $sloodletable->size array('5%''5%''27%''35%''20%''8%');
  316.         
  317.         $deletestr get_string('delete''sloodle');
  318.         
  319.         // We want to build a list of Sloodle user objects too
  320.         $userobjects array();
  321.         // Create a dummy Sloodle Session
  322.         $sloodle new SloodleSession(false);
  323.                 
  324.         // Go through each Sloodle entry for this user
  325.         foreach ($sloodleentries as $su{
  326.             
  327.             // Add this user's Sloodle objects (if we're not in 'all' or search modes)
  328.             if (!$allentries && !$searchentries{
  329.                 if ($sloodle->user->load_avatar($su->uuid'')) {
  330.                     $userobjects += $sloodle->user->get_user_objects();
  331.                 }
  332.             }
  333.             
  334.         
  335.             // Is this entry being deleted (i.e. is the user being asked to confirm its deletion)?
  336.             $deletingcurrent ($confirmingdeletion == true && $su->id == $deletesloodleentry);
  337.             
  338.             // Reset the line's content
  339.             $line array();
  340.             
  341.             // Add the ID to the line
  342.             if ($deletingcurrent$line['<span style="color:red; font-weight:bold;">'.$su->id.'</span>';
  343.             else $line[$su->id;
  344.             
  345.             // Add the Moodle user ID and link
  346.             $line["<a href=\"{$CFG->wwwroot}/user/view.php?id={$su->userid}&amp;course=$courseid\">{$su->userid}</a>";            
  347.         
  348.             // Fetch the avatar name and UUID
  349.             $curavname '-';
  350.             $curuuid '-';
  351.             if (!empty($su->avname)) $curavname $su->avname;
  352.             if (!empty($su->uuid)) $curuuid $su->uuid;
  353.             
  354.             // If we are in all or searching mode, add a link to the Sloodle user profile
  355.             if ($allentries || $searchentries{
  356.                 $curavname .= " <span style=\"font-size:10pt; color:#444444; font-style:italic;\">(<a href=\"{$CFG->wwwroot}/mod/sloodle/view/view_user.php?id={$su->userid}&amp;course=$courseid\">".get_string('sloodleuserprofile','sloodle')."</a>)</span>";
  357.             }
  358.             
  359.             // Add them to the table
  360.             $line[$curavname;
  361.             $line[$curuuid
  362.             
  363.             // Do we know when the avatar was last active
  364.             if (!empty($su->lastactive)) {
  365.                 // Calculate the time difference
  366.                 $difference time(- (int)$su->lastactive;
  367.                 if ($difference 0$difference 0;
  368.                 // Add it to the table
  369.                 $line[sloodle_describe_approx_time($differencetrue);
  370.             else {
  371.                 $line['('.$strunknown.')';
  372.             }
  373.             
  374.             // Display the "delete" action
  375.             if ($canedit{
  376.                 if ($allentries$deleteurl $CFG->wwwroot."/mod/sloodle/view/view_user.php?id=all&amp;course=$courseid&amp;delete={$su->id}";
  377.                 else if ($searchentries$deleteurl $CFG->wwwroot."/mod/sloodle/view/view_user.php?id=search&amp;course=$courseid&amp;search=$searchstr&amp;delete={$su->id}";
  378.                 else $deleteurl $CFG->wwwroot."/mod/sloodle/view/view_user.php?id=$moodleuserid&amp;course=$courseid&amp;delete={$su->id}";
  379.                 $deletecaption get_string('clicktodeleteentry','sloodle');
  380.                 $line["<a href=\"$deleteurl\" title=\"$deletecaption\">$deletestr</a>";
  381.                 
  382.             else {
  383.                 $line['<span style="color:#777777;" title="'.get_string('nodeletepermission','sloodle').'">'.get_string('delete','sloodle').'</span>';
  384.             }
  385.             
  386.             // Add the line to the table
  387.             $sloodletable->data[$line;
  388.         }
  389.         
  390.         // Display the table
  391.         print_table($sloodletable);
  392.         
  393.         
  394.         // Now display the section of user-authorized objects
  395.         if (!$allentries && !$searchentries{
  396.             echo '<br><h3>'.get_string('userobjects','sloodle');
  397.             helpbutton('user_objects'get_string('userobjects','sloodle')'sloodle'truefalse''false);
  398.             echo "</h3>\n";
  399.             
  400.             
  401.             // Have we been asked to delete the user objects?
  402.             if ($deleteuserobjects == 'true'{
  403.                 // Yes - display a confirmation form
  404.                 echo '<h4 style="color:red; font-weight:bold;">'.get_string('confirmdeleteuserobjects','sloodle').'</h4>';
  405.                 
  406.                 echo '<table style="border-style:none; margin-left:auto; margin-right:auto;"><tr><td>';
  407.                 
  408.                 echo '<form action="view_user.php" method="GET">';
  409.                 echo '<input type="hidden" name="id" value="'.$moodleuserid.'" >';
  410.                 if (!empty($courseid)) echo '<input type="hidden" name="course" value="'.$courseid.'" >';
  411.                 echo '<input type="hidden" name="deleteuserobjects" value="confirm" >';
  412.                 echo '<input type="submit" value="'.get_string('yes').'" title="'.get_string('deleteuserobjects:help','sloodle').'" >';
  413.                 echo '</form>';
  414.                 
  415.                 echo '</td><td>';
  416.                 
  417.                 echo '<form action="view_user.php" method="GET">';
  418.                 echo '<input type="hidden" name="id" value="'.$moodleuserid.'" >';
  419.                 if (!empty($courseid)) echo '<input type="hidden" name="course" value="'.$courseid.'" >';
  420.                 echo '<input type="submit" value="'.get_string('no').'" >';
  421.                 echo '</form>';
  422.                 
  423.                 echo '</td></tr></table><br>';
  424.                 
  425.             else if ($deleteuserobjects == 'confirm'{
  426.                 // Delete each one
  427.                 $numdeleted 0;
  428.                 foreach ($userobjects as $obj{
  429.                     delete_records('sloodle_user_object''id'$obj->id);
  430.                     $numdeleted++;
  431.                 }
  432.                 $userobjects array();
  433.                 echo get_string('numdeleted','sloodle').': '.$numdeleted.'<br><br>';
  434.             }
  435.             
  436.             
  437.             // Do we have any objects to display?
  438.             if (count($userobjects0{
  439.                 
  440.                 // Yes - prepare the table
  441.                 $sloodletable new stdClass();
  442.                 $sloodletable->head array(    get_string('ID''sloodle'),
  443.                                                 get_string('avataruuid''sloodle'),
  444.                                                 get_string('uuid''sloodle'),
  445.                                                 get_string('name''sloodle'),
  446.                                                 get_string('isauthorized''sloodle'),
  447.                                                 get_string('lastused''sloodle')
  448.                                             );
  449.                 $sloodletable->align array('center''left''left''left''center''left');
  450.                 //$sloodletable->size = array('5%', '5%', '27%', '35%', '20%', '8%');
  451.                 
  452.                 // Store the current timestamp for consistency
  453.                 $curtime time();
  454.                 
  455.                 // Go through each object
  456.                 foreach ($userobjects as $obj{
  457.                     $line array();
  458.                     $line[$obj->id;
  459.                     $line[$obj->avuuid;
  460.                     $line[$obj->objuuid;
  461.                     $line[$obj->objname;
  462.                     if ($obj->authorized$line[ucwords(get_string('yes'));
  463.                     else $line[ucwords(get_string('no'));
  464.                     
  465.                     $lastused = (int)$obj->timeupdated;
  466.                     if ($lastused 0$line[sloodle_describe_approx_time($curtime $lastusedtrue);
  467.                     else $line['('.get_string('unknown','sloodle').')';
  468.                     
  469.                     $sloodletable->data[$line;
  470.                 }
  471.                 
  472.                 // Display the table
  473.                 print_table($sloodletable);
  474.                 
  475.                 // Display a button to delete all the Sloodle objects
  476.                 if (empty($deleteuserobjects)) {
  477.                     echo '<br><form action="view_user.php" method="GET">';
  478.                     echo '<input type="hidden" name="id" value="'.$moodleuserid.'" >';
  479.                     if (!empty($courseid)) echo '<input type="hidden" name="course" value="'.$courseid.'" >';
  480.                     echo '<input type="hidden" name="deleteuserobjects" value="true" >';
  481.                     echo '<input type="submit" value="'.get_string('deleteuserobjects','sloodle').'" title="'.get_string('deleteuserobjects:help','sloodle').'" >';
  482.                     echo '</form><br>';
  483.                 }
  484.                 
  485.                 
  486.             else {
  487.                 // No user objects
  488.                 echo '<span style="color:red; font-weight:bold;">';
  489.                 print_string('noentries''sloodle');
  490.                 echo '</span>';
  491.             }
  492.         }
  493.         
  494.     }
  495.     echo '</div>';
  496.     
  497.     // Display the footer
  498.     print_footer();
  499. ?>

Documentation generated on Mon, 07 Jul 2008 12:33:30 +0100 by phpDocumentor 1.4.0