public static function remaining_registrations()
 {
     $ScormService = ScormCloudPlugin::get_cloud_service();
     $acctService = $ScormService->getAccountService();
     $response = $acctService->GetAccountInfo();
     $respXml = simplexml_load_string($response);
     if ($respXml->account->accounttype != 'trial' && $respXml->account->strictlimit == 'false') {
         return 1;
     } else {
         $regLimit = (int) $respXml->account->reglimit;
         $regUsage = (int) $respXml->account->usage->regcount;
         //error_log('limit: '.$regLimit.'   usage: '.$regUsage);
         return $regLimit - $regUsage;
     }
 }
        $inviteReg = $wpdb->get_row($query, OBJECT);
        if ($inviteReg != null) {
            $regid = (string) $inviteReg->reg_id;
            $inviteId = (string) $inviteReg->invite_id;
        } else {
            $inviteId = uniqid();
            $regid = $inviteId . "-" . uniqid();
            $require_login = 0;
            $show_course_info = 0;
            $wpdb->insert(ScormCloudDatabase::get_invitations_table(), array('invite_id' => $inviteId, 'blog_id' => $GLOBALS['blog_id'], 'app_id' => ScormCloudPlugin::get_wp_option('scormcloud_appid'), 'post_id' => $postId, 'course_id' => $courseId, 'course_title' => $courseTitle, 'header' => $header, 'description' => $description, 'require_login' => $require_login, 'show_course_info' => $show_course_info), array('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%d', '%d'));
            //create the cloud registration
            $regService->CreateRegistration($regid, $courseId, $user_email, $user_first_name, $user_last_name, $user_email);
            $wpdb->insert(ScormCloudDatabase::get_registrations_table(), array('invite_id' => $inviteId, 'reg_id' => $regid, 'user_email' => $user_email), array('%s', '%s', '%s'));
        }
        $courseTags = 'catalog_widget';
        $regTags = $GLOBALS['blog_id'] . ',' . $inviteId . ',' . $courseTags;
        $learnerTags = isset($current_user->roles[0]) ? $current_user->roles[0] : "anonymous";
        if (function_exists("bp_activity_add")) {
            global $bp;
            $actionStr = sprintf('%s launched course "%s" from the Catalog Widget', $user_first_name . ' ' . $user_last_name, $courseTitle);
            //error_log('logged in user: '******'action' => $actionStr, 'content' => '', 'component' => 'scormcloud', 'type' => 'training_launch', 'primary_link' => '', 'user_id' => false, 'item_id' => false, 'secondary_item_id' => false, 'recorded_time' => gmdate("Y-m-d H:i:s"), 'hide_sitewide' => false);
            $bpActivityId = bp_activity_add($activityArgs);
            error_log('Logging action: ' . $actionStr . ' Activity ID: ' . $bpActivityId);
        }
        $cssUrl = ScormCloudPlugin::get_wp_option('scormcloud_player_cssurl');
        echo $regService->GetLaunchUrl($regid, $returnUrl, $cssUrl, null, $courseTags, $learnerTags, $regTags);
        break;
    default:
        break;
}
<?php

require_once SCORMCLOUD_BASE . 'scormcloudplugin.php';
require_once SCORMCLOUD_BASE . 'db/scormclouddatabase.php';
$inviteId = $_GET['inviteid'];
$invTable = ScormCloudDatabase::get_invitations_table();
$regTable = ScormCloudDatabase::get_registrations_table();
$query = $wpdb->prepare('SELECT inv.*, count(reg.reg_id) as reg_count FROM ' . $invTable . ' inv
                         LEFT OUTER JOIN ' . $regTable . ' reg ON inv.invite_id = reg.invite_id
                         WHERE inv.invite_id = %s AND inv.app_id = %s GROUP BY inv.invite_id', array($inviteId, ScormCloudPlugin::get_wp_option('scormcloud_appid')));
$invite = $wpdb->get_row($query, OBJECT);
?>
<div class="scormcloud-admin-page trainingDetail"><a class='backLink'
	href='<?php 
echo get_option('siteurl') . "/wp-admin/admin.php?page=scormcloud/manage_training";
?>
'><?php 
_e("Go back to all trainings", "scormcloud");
?>
</a>

<h2><?php 
echo __("Training Details for", "scormcloud") . ' "' . $invite->course_title;
?>
"</h2>
<div class="invitationStatus"><?php 
echo __("This training is currently", "scormcloud") . " <span class='activeText' key='" . $inviteId . "'>" . ($invite->active == 1 ? __("Active", "scormcloud") : __("Inactive", "scormcloud")) . "</span>";
if ($invite->active != 2) {
    echo "(<a href='#' key='" . $inviteId . "' class='activateLink' active='" . $invite->active . "' >" . ($invite->active == 1 ? __("click to deactivate", "scormcloud") : __("click to activate", "scormcloud")) . "</a>)";
}
?>
<h1><?php 
    _e("Add training to your post", "scormcloud");
    ?>
</h1>


<span class="labelheader"><?php 
    _e("First select a course", "scormcloud");
    ?>
:
</span> 
<select class="courseSelector">

<?php 
    echo "<option value=''></option>";
    $coursesFilter = ScormCloudPlugin::is_network_managed() && get_site_option('scormcloud_sharecourses') !== '1' ? $GLOBALS['blog_id'] . "-.*" : null;
    $courseService = $ScormService->getCourseService();
    $allResults = $courseService->GetCourseList($coursesFilter);
    foreach ($allResults as $course) {
        echo "<option value='" . $course->getCourseId() . "'>" . $course->getTitle() . "</option>";
    }
    ?>
</select> <br />
<br />

<div class='selectOptionsDiv'><span class="labelheader"><?php 
    _e("Next select some options", "scormcloud");
    ?>
:
</span>
<table>
<?php

if (defined('ABSPATH')) {
    require_once ABSPATH . 'wp-load.php';
} else {
    require_once '../../../wp-load.php';
}
require_once ABSPATH . 'wp-admin/admin.php';
global $wpdb;
echo '<div class="scormcloud-admin-page startpage">';
require_once SCORMCLOUD_BASE . 'scormcloudplugin.php';
$ScormService = ScormCloudPlugin::get_cloud_service();
try {
    $isValidAccount = $ScormService->isValidAccount();
} catch (Exception $e) {
    $isValidAccount = false;
}
if ($isValidAccount) {
    //Reportage Includes
    echo '<script type="text/javascript" ';
    echo "src=\"http://cloud.scorm.com/Reportage/scripts/reportage.combined.js\"></script>\n";
    echo '<link rel="stylesheet" ';
    echo "href=\"http://cloud.scorm.com/Reportage/css/reportage.combined.css\" type=\"text/css\" media=\"screen\" />\n";
    echo '<div class="mod-scormcloud">';
    //Check for some defaults to set the form up
    $rptService = $ScormService->getReportingService();
    $rptAuth = $rptService->GetReportageAuth('FREENAV', true);
    $rServiceUrl = $rptService->GetReportageServiceUrl();
}
//Report banner SCORM Cloud branded?
echo '<div class="header">
 /**
  * Displays the Widget
  *
  */
 function widget($args, $instance)
 {
     extract($args);
     $title = apply_filters('widget_title', empty($instance['title']) ? '&nbsp;' : $instance['title']);
     $limitregs = isset($instance['limitregs']) ? (bool) $instance['limitregs'] : false;
     # Before the widget
     echo $before_widget;
     # The title
     if ($title) {
         echo $before_title . $title . $after_title;
     }
     # Make the widget
     echo '<link rel="stylesheet" type="text/css" href="' . get_option('siteurl') . '/wp-content/plugins/scormcloud/css/scormcloud.widget.css" />';
     //echo '<h2>SCORM Course Registrations</h2>';
     global $current_user;
     global $wpdb;
     get_currentuserinfo();
     if (!is_user_logged_in()) {
         echo '<a href="wp-login.php">' . __("Log in", "scormcloud") . '</a> ' . __("to see your training history", "scormcloud") . '.';
     } else {
         $ScormService = ScormCloudPlugin::get_cloud_service();
         $regService = $ScormService->getRegistrationService();
         $invTable = ScormCloudDatabase::get_invitations_table();
         $regTable = ScormCloudDatabase::get_registrations_table();
         $query = $wpdb->prepare('SELECT reg.reg_id, inv.course_title, inv.course_id, inv.active, reg.update_date FROM ' . $regTable . ' reg
                                      JOIN ' . $invTable . ' inv ON reg.invite_id = inv.invite_id
                                      WHERE user_id = %s AND inv.blog_id = %s ORDER BY reg.update_date DESC', array($current_user->ID, $GLOBALS['blog_id']));
         $regs = $wpdb->get_results($query, OBJECT);
         //echo count($regs);
         echo '<div class="courselistDiv">';
         if (count($regs) > 0) {
             echo "<div class='helpMsg'>" . __("Click course title to launch.", "scormcloud") . "</div>";
         } else {
             echo "<div class='helpMsg'>" . __("You have not taken any training.", "scormcloud") . "</div>";
         }
         $coursesDisplayed = array();
         foreach ($regs as $reg) {
             try {
                 $regId = $reg->reg_id;
                 if ($limitregs && in_array($reg->course_id, $coursesDisplayed) || !$regService->Exists($regId)) {
                     continue;
                 } else {
                     $coursesDisplayed[] = $reg->course_id;
                     $regResultsXmlStr = $regService->GetRegistrationResult($regId, 0, 0);
                     $resXml = simplexml_load_string($regResultsXmlStr);
                     $completion = $resXml->registrationreport->complete;
                     $success = $resXml->registrationreport->success;
                     $seconds = $resXml->registrationreport->totaltime;
                     $score = $resXml->registrationreport->score;
                     $courseTitle = $reg->course_title;
                     echo "<div class='usercourseblock'>";
                     if ($reg->active == 1) {
                         echo "<a class='courseTitle' href='javascript:void(0);' key='{$regId}' onclick='ScormCloud.Widget.getLaunchURL(\"{$regId}\",\"Training\");' url='" . get_option('siteurl') . "/wp-content/plugins/scormcloud/ajax.php' title='Click to launch course {$courseTitle}'>{$courseTitle}</a>";
                     } else {
                         echo "<span class='courseTitle' title='" . __("This course is currently inactive.", "scormcloud") . "'>{$courseTitle}</span>";
                     }
                     echo "<br/><a href='javascript:void(0);' class='toggleButton showDetails' toggleobject='.courselistDiv .regs.courseDetails.{$regId}' onText='hide details' offText='show details'>" . __("show details", "scormcloud") . "</a>";
                     echo "<div class='regs courseDetails {$regId}' >";
                     if ($seconds > 0) {
                         echo "<div class=''>" . __("Completion", "scormcloud") . ": <span class='{$completion}'>{$completion}</span></div>";
                         echo "<div class=''>" . __("Success", "scormcloud") . ": <span class='{$success}'>{$success}</span></div>";
                         echo "<div class=''>" . __("Score", "scormcloud") . ": " . ($score == "unknown" ? "-" : $score . "%") . "</div>";
                         echo '<div class="time">' . floor($seconds / 60) . "min " . $seconds % 60 . __('sec spent in course', "scormcloud") . '</div>';
                     } else {
                         echo '<div class="">' . __("Not Started", "scormcloud") . '</div>';
                     }
                     echo "</div>";
                     //$widgetscript .= 'jQuery("#title_'.$reg->package_id.'").click(function(){jQuery("#details_'.$reg->package_id.'").toggle();});';
                     //$widgetscript .= 'jQuery("#title_'.$reg->package_id.'").hover(function(){jQuery(this).addClass("widgetTitleHover");},function(){jQuery(this).removeClass("widgetTitleHover");});';
                     echo '</div>';
                 }
             } catch (Exception $e) {
                 echo '<span>' . $e->getMessage() . '</span>';
             }
         }
         echo '</div>';
         //echo '<script language="javascript">'.$widgetscript.'</script>';
         echo '<script language="javascript" src="' . get_option('siteurl') . '/wp-content/plugins/scormcloud/scripts/scormcloud.widget.js" >' . '</script>';
     }
     # After the widget
     echo $after_widget;
 }
 /**
  * Displays the Widget
  *
  */
 function widget($args, $instance)
 {
     extract($args);
     $title = apply_filters('widget_title', empty($instance['title']) ? '&nbsp;' : $instance['title']);
     $requireLogin = isset($instance['requirelogin']) ? (bool) $instance['requirelogin'] : true;
     $regsRemaining = ScormCloudPlugin::remaining_registrations();
     # Before the widget
     echo $before_widget;
     # The title
     if ($title) {
         echo $before_title . $title . $after_title;
     }
     # Make the widget
     echo '<link rel="stylesheet" type="text/css" href="' . get_option('siteurl') . '/wp-content/plugins/scormcloud/css/scormcloud.widget.css" />';
     //echo '<h2>SCORM Cloud Courses</h2>';
     global $current_user;
     global $wpdb;
     get_currentuserinfo();
     $coursesFilter = ScormCloudPlugin::is_network_managed() && get_site_option('scormcloud_sharecourses') !== '1' ? $GLOBALS['blog_id'] . "-.*" : null;
     $ScormService = ScormCloudPlugin::get_cloud_service();
     $courseService = $ScormService->getCourseService();
     $courseObjArray = $courseService->GetCourseList($coursesFilter);
     if ($requireLogin && !is_user_logged_in()) {
         echo '<a href="wp-login.php">Log in</a> to see the course catalog.';
     } else {
         $regService = $ScormService->getRegistrationService();
         //echo count($regs);
         echo '<div class="courselistDiv">';
         echo "<div class='helpMsg'>" . __("Click course title to launch.", "scormcloud") . " <br/><a class='catalogMoreInfo toggleButton' href='javascript:void(0);' toggleobject='.courselistDiv .catalog.moreInfo' onText='" . __("hide info", "scormcloud") . "' offText='" . __("more info", "scormcloud") . "'>" . __("more info", "scormcloud") . "</a></div>";
         echo "<div class='catalog moreInfo'>";
         if ($current_user->user_login != '') {
             echo "<p>" . __("If you have taken a course before, your most recent results will display by clicking 'show details' and your most recent training will launch by clicking the course title.", "scormcloud") . "</p>";
         } else {
             echo "<p>" . __("To launch a course, you must provide a name and email address.  This will allow your training results to be tracked.", "scormcloud") . "</p>";
             echo "<p>" . __("By registering or logging in, your results will be associated with your user identity and you will be able to see your training results in this widget.", "scormcloud") . "</p>";
         }
         echo "</div>";
         foreach ($courseObjArray as $course) {
             $courseId = $course->getCourseId();
             $courseTitle = $course->getTitle();
             if (isset($current_user->user_login) && $current_user->user_login != '') {
                 $invTable = ScormCloudDatabase::get_invitations_table();
                 $regTable = ScormCloudDatabase::get_registrations_table();
                 $query = $wpdb->prepare('SELECT reg.reg_id, inv.course_title, inv.course_id, inv.active, reg.update_date FROM ' . $regTable . ' reg
                                              JOIN ' . $invTable . ' inv ON reg.invite_id = inv.invite_id
                                              WHERE reg.user_id = %s AND inv.course_id = %s ORDER BY reg.update_date DESC', array($current_user->ID, $courseId));
                 $reg = $wpdb->get_row($query, OBJECT);
                 if ($reg != null) {
                     $regId = $reg->reg_id;
                     $regResultsXmlStr = $regService->GetRegistrationResult($regId, 0, 0);
                     $resXml = simplexml_load_string($regResultsXmlStr);
                     $completion = $resXml->registrationreport->complete;
                     $success = $resXml->registrationreport->success;
                     $seconds = $resXml->registrationreport->totaltime;
                     $score = $resXml->registrationreport->score;
                     echo "<div class='usercourseblock'>";
                     if ($reg->active == 1) {
                         echo "<a class='courseTitle' href='javascript:void(0);' key='{$regId}' onclick='ScormCloud.Widget.getLaunchURL(\"{$regId}\",\"Catalog\");' url='" . get_option('siteurl') . "/wp-content/plugins/scormcloud/ajax.php' title='" . __("Click to launch course ", "scormcloud") . "{$courseTitle}'>{$courseTitle}</a>";
                     } else {
                         echo "<span class='courseTitle' title='" . __("This course is currently inactive.", "scormcloud") . "'>{$courseTitle}</span>";
                     }
                     echo "<br/><a href='javascript:void(0);' class='toggleButton showDetails' toggleobject='.courselistDiv .catalog.courseDetails.{$regId}' onText='" . __("hide details", "scormcloud") . "' offText='" . __("show details", "scormcloud") . "'>" . __("show details", "scormcloud") . "</a>";
                     echo "<div class='catalog courseDetails {$regId}' >";
                     if ($seconds > 0) {
                         echo "<div class=''>" . __("Completion", "scormcloud") . ": <span class='{$completion}'>" . __($completion) . "</span></div>";
                         echo "<div class=''>" . __("Success", "scormcloud") . ": <span class='{$success}'>" . __($success) . "</span></div>";
                         echo "<div class=''>" . __("Score", "scormcloud") . ": " . ($score == "unknown" ? "-" : $score . "%") . "</div>";
                         echo '<div class="time">' . floor($seconds / 60) . "min " . $seconds % 60 . __("sec spent in course", "scormcloud") . '</div>';
                     } else {
                         echo '<div class="">' . __("Not Started", "scormcloud") . '</div>';
                     }
                     echo "</div>";
                 } else {
                     echo "<div class='usercourseblock'>";
                     if ($regsRemaining > 0) {
                         echo "<a class='courseTitle' href='javascript:void(0);' coursetitle='{$courseTitle}' key='{$courseId}' onclick='ScormCloud.Widget.getCatalogLaunchURL(\"{$courseId}\");' url='" . get_option('siteurl') . "/wp-content/plugins/scormcloud/ajax.php' title='" . __("Click to launch course ", "scormcloud") . "{$courseTitle}'>{$courseTitle}</a>";
                     } else {
                         echo "<span class='courseTitle' title='" . __("This course is currently inactive.", "scormcloud") . "'>{$courseTitle}</span>";
                     }
                 }
             } else {
                 echo "<div class='usercourseblock'>";
                 if ($regsRemaining > 0) {
                     echo "<a class='courseTitle anonLaunch' href='javascript:void(0);' key='{$courseId}' title='" . __("Click to launch course", "scormcloud") . " {$courseTitle}'>{$courseTitle}</a>";
                     echo "<div class='anonlaunchdiv' key='{$courseId}'>" . __("First Name", "scormcloud") . ":<br/><input name='scormcloudfname' type='text' key='{$courseId}'/><br/>";
                     echo __("Last Name", "scormcloud") . ":<br/><input name='scormcloudlname' type='text' key='{$courseId}'/><br/>";
                     echo __("Email", "scormcloud") . ":<br/><input name='scormcloudemail' type='text' key='{$courseId}'/>";
                     echo "<input name='launch' type='button' class='catalogLaunchBtn' key='{$courseId}' coursetitle='{$courseTitle}' onclick='ScormCloud.Widget.getAnonCatalogLaunchURL(\"{$courseId}\");' url='" . get_option('siteurl') . "/wp-content/plugins/scormcloud/ajax.php' value='" . __("Start Training", "scormcloud") . "'/>";
                     echo "<div class='launchMessage'>message</div></div>";
                 } else {
                     echo "<span class='courseTitle' title='" . __("This course is currently inactive.", "scormcloud") . "'>{$courseTitle}</span>";
                 }
             }
             echo "</div>";
         }
         echo '</div>';
         //echo '<script language="javascript">'.$widgetscript.'</script>';
         echo '<script language="javascript" src="' . get_option('siteurl') . '/wp-content/plugins/scormcloud/scripts/scormcloud.widget.js" >' . '</script>';
     }
     # After the widget
     echo $after_widget;
 }
    $ScormService = ScormCloudPlugin::get_cloud_service();
    try {
        if (!$ScormService->isValidUrl()) {
            echo "<div class='updated'><p class='failed'><strong>" . __("Invalid Service Url.  Check your URL click 'Update Options' or clear out the bad URL and the default URL will be used.", "scormcloud") . "</strong></p></div>";
        } elseif (!$ScormService->isValidAccount()) {
            echo "<div class='updated'><p><strong>" . __("Please fill in your SCORM Cloud credentials and click 'Update Options'.", "scormcloud") . "</strong></p></div>";
        }
    } catch (Exception $e) {
        echo '<div class="updated"><p class="failed"><strong>' . __('Your SCORM Cloud credentials could not be verified. Please check that the Service URL, App ID, and Secret Key options are correct.', 'scormcloud') . '</strong></p></div>';
    }
    $appid = get_option('scormcloud_appid');
    $secretkey = get_option('scormcloud_secretkey');
    $engine_url = strlen(get_option('scormcloud_engine_url')) > 0 ? get_option('scormcloud_engine_url') : "http://cloud.scorm.com/EngineWebServices";
    $player_cssurl = strlen(get_option('scormcloud_player_cssurl')) > 0 ? get_option('scormcloud_player_cssurl') : 'http://cloud.scorm.com/sc/css/cloudPlayer/cloudstyles.css';
    $proxy = get_option('proxy');
    $network_managed = ScormCloudPlugin::is_network_managed();
}
?>
<div
	class="scormcloud-admin-page settings">

<div class="wrap"><?php 
echo "<h2>" . __('Rustici Software SCORM Cloud Settings', 'scormcloud') . "</h2>";
?>
<p><em><?php 
_e('To configure the SCORM Cloud for WordPress plugin, you need the AppID and Secret Key credentials for your account. They can be found by going to your Apps page on the SCORM Cloud site.', 'scormcloud');
?>
 
<?php 
_e('If you need an account on SCORM Cloud,', 'scormcloud');
?>
    } else {
        try {
            $valid = $ScormService->isValidAccount();
        } catch (Exception $e) {
            $valid = false;
        }
        if ($valid === "107") {
            echo "<div class='updated'><p class='failed'><strong>" . __("It appears that your server UTC time is out of sync with that of the SCORM Cloud. Try updating the time on your server using ntpdate or something equivalent.  Authenticated calls to the server require a timestamp within 15 minutes of current UTC time.", "scormcloud") . "</strong></p></div>";
        } elseif ($valid !== true) {
            echo "<div class='updated'><p class='failed'><strong>" . __("Invalid Credentials.  Check your App Id and Secret Key and try again.", "scormcloud") . "</strong></p></div>";
        } else {
            echo "<div class='updated'><p><strong>" . __("Settings saved.", "scormcloud") . "</strong></p></div>";
        }
    }
} else {
    $ScormService = ScormCloudPlugin::get_cloud_service($force_network_settings);
    try {
        if (!$ScormService->isValidUrl()) {
            echo "<div class='updated'><p class='failed'><strong>" . __("Invalid Service Url.  Check your URL and click 'Update Settings' or clear out the bad URL and the default URL will be used.", "scormcloud") . "</strong></p></div>";
        } elseif (!$ScormService->isValidAccount()) {
            echo "<div class='updated'><p><strong>" . __("Please fill in your SCORM Cloud credentials and click 'Update Settings'.", "scormcloud") . "</strong></p></div>";
        }
    } catch (Exception $e) {
        echo '<div class="updated"><p class="failed"><strong>' . __('Your SCORM Cloud credentials could not be verified. Please check that the Service URL, App ID, and Secret Key options are correct.', 'scormcloud') . '</strong></p></div>';
    }
    $appid = get_site_option('scormcloud_appid');
    $secretkey = get_site_option('scormcloud_secretkey');
    $engine_url = strlen(get_site_option('scormcloud_engine_url')) > 0 ? get_site_option('scormcloud_engine_url') : "http://cloud.scorm.com/EngineWebServices";
    $sharecourses = get_site_option('scormcloud_sharecourses');
    $network_managed = get_site_option('scormcloud_networkmanaged');
}
    $packageid = $GLOBALS['blog_id'] . '-' . uniqid();
    ?>
<div id="UploadFrame"><iframe width="100%" height="50px"
	style="border: 0;"
	src="<?php 
    echo get_option('siteurl');
    ?>
/wp-content/plugins/scormcloud/uploadpif.php?id=<?php 
    echo $packageid;
    ?>
"
	id="ifmImport"></iframe></div>

    <?php 
    $coursesFilter = null;
    if (ScormCloudPlugin::is_network_managed() && get_site_option('scormcloud_sharecourses') !== '1') {
        $coursesFilter = $GLOBALS['blog_id'] . "-.*";
    }
    $courseService = $ScormService->getCourseService();
    $courseObjArray = $courseService->GetCourseList($coursesFilter);
    $courseCount = count($courseObjArray);
    $courseObjArray = array_reverse($courseObjArray);
    if ($courseCount > 0) {
        ?>
<div>
<h2><?php 
        _e("All Courses", "scormcloud");
        ?>
</h2>
</div>
<table class="widefat" cellspacing="0" id="CourseListTable">
 private static function get_db_prefix()
 {
     global $wpdb;
     if (ScormCloudPlugin::is_network_managed()) {
         return get_site_option('scormcloud_db_prefix');
     } else {
         return $wpdb->prefix;
     }
 }
				title="' . __("Click here to configure your SCORM Cloud plugin.", "scormcloud") . '">' . __("Click Here to go to the settings page.", "scormcloud") . '</a></div>';
    }
    ?>


<h3><?php 
    _e("SCORM Cloud Training History", "scormcloud");
    ?>
</h3>

    <?php 
    $invTable = ScormCloudDatabase::get_invitations_table();
    $regTable = ScormCloudDatabase::get_registrations_table();
    $query = $wpdb->prepare('SELECT inv.*, count(reg.reg_id) as reg_count FROM ' . $invTable . ' inv
						 LEFT OUTER JOIN ' . $regTable . ' reg ON inv.invite_id = reg.invite_id
						 WHERE inv.blog_id = %s AND inv.app_id = %s GROUP BY inv.invite_id ORDER BY inv.create_date DESC', array($GLOBALS['blog_id'], ScormCloudPlugin::get_wp_option('scormcloud_appid')));
    $invites = $wpdb->get_results($query, OBJECT);
    echo '<table class="widefat" cellspacing="0" id="InvitationListTable" >';
    echo '<thead>';
    echo '<tr class="thead"><th class="manage-column">' . __("Course Title", "scormcloud") . '</th>
        <th class="manage-column">' . __("Post Title", "scormcloud") . '</th>
        <th class="manage-column">' . __("Create/Publish Date", "scormcloud") . '</th>
        <th class="manage-column">' . __("Learners", "scormcloud") . '</th>
        <th class="manage-column">&nbsp;</th>
        <th class="manage-column">&nbsp;</th></tr>';
    echo '</thead>';
    foreach ($invites as $invite) {
        echo "<tr class='regRow' key='" . $invite->invite_id . "'>";
        echo "<td class='title'><a title='" . __("Click to view details of this invitation.", "scormcloud") . "' href='" . get_option('siteurl') . "/wp-admin/admin.php?page=scormcloud/manage_training&inviteid=" . $invite->invite_id . "'>" . __($invite->course_title) . "</a></td>";
        if ($invite->post_id == "__direct_invite__") {
            echo "<td>" . __("User Invitation", "scormcloud") . "</td>";
 public static function update_learner_info($userId)
 {
     global $wpdb;
     $ScormService = ScormCloudPlugin::get_cloud_service();
     $regService = $ScormService->getRegistrationService();
     $userData = get_userdata($userId);
     /* pushing blank data into SCORMCloud generates a stack trace */
     if (!empty($userData->user_firstname) && !empty($userData->user_lastname)) {
         $response = $regService->UpdateLearnerInfo($userData->user_email, $userData->user_firstname, $userData->user_lastname);
         write_log($response);
     } else {
         write_log("profile update skipped for {$userData->user_email} due to missing first or last name");
     }
 }