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;
     }
 }
<?php

if (defined('ABSPATH')) {
    require_once ABSPATH . 'wp-load.php';
} else {
    require_once '../../../wp-load.php';
}
require_once ABSPATH . 'wp-admin/includes/admin.php';
require_once 'scormcloud.deprecatedFunctions.php';
require_once SCORMCLOUD_BASE . 'scormcloudplugin.php';
require_once SCORMCLOUD_BASE . 'scormcloudemailer.php';
require_once SCORMCLOUD_BASE . 'db/scormclouddatabase.php';
$ScormService = ScormCloudPlugin::get_cloud_service();
$action = $_POST['action'];
global $current_user;
get_currentuserinfo();
switch ($action) {
    case 'addregistration':
        $inviteId = uniqid();
        $appId = ScormCloudPlugin::get_wp_option('scormcloud_appid');
        $postId = "__direct_invite__";
        $courseId = $_POST['courseid'];
        $courseTitle = $_POST['coursetitle'];
        $sendEmail = isset($_POST['sendemail']) ? $_POST['sendemail'] : null;
        $strUserIds = isset($_POST['userids']) ? $_POST['userids'] : null;
        $allUsers = isset($_POST['allusers']) ? $_POST['allusers'] : null;
        $roles = isset($_POST['roles']) ? $_POST['roles'] : null;
        $header = "";
        $description = "";
        $require_login = 1;
        $show_course_info = 0;
 /**
  * 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;
 }
    } 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');
}
 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");
     }
 }