CINXE.COM
Sign In
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US"> <script> var jsPageName = "Sign In"; // pass strPageName to JavaScript, used in function setPageName() [accessibility.js] var jsAjaxRequest = ('0' === '1') ? true : false; </script> <!-- AX != 1 --> <script> var url = new URL(location.href); history.replaceState({type: "login"} , '', url.pathname + url.search); </script> <head> <!-- META TAGS --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1,requiresActiveX=true"> <meta name="apple-itunes-app" content="app-id=566688504, affiliate-data=myAffiliateData, app-argument=myURL"> <title>Sign In</title> <meta name="description" content="The campus engagement platform for UC San Francisco - Powered by CampusGroups."> <meta name="title" content="UC San Francisco"> <!-- Google Tag Manager --> <script> dataLayer = [{ 'signedIn': false }]; </script> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-548G27F');</script> <!-- End Google Tag Manager --> <!-- CSS IMPORT --> <!-- FONT FOR DEV --> <link href="css/fonts/open-sans.css" rel="stylesheet" type="text/css" > <!-- FAVICON --> <link rel="icon" type="images/x-icon" href="/upload/ucsf/2019/s1_image_upload_34747_ucsffavicon_123105452.png"> <link rel="shortcut icon" type="images/x-icon" href="/upload/ucsf/2019/s1_image_upload_34747_ucsffavicon_123105452.png"> <!-- JQUERY UI --> <link rel="stylesheet" type="text/css" href="/bower_components/jquery-ui/themes/base/jquery-ui.min.css"> <!-- AUTOCOMPLETE --> <link rel="stylesheet" type="text/css" href="/js/jquery/jquery.autocomplete.css"> <!-- BOOTSTRAP & GLYPHICONS --> <link rel="stylesheet" type="text/css" href="/bower_components/bootstrap/dist/css/bootstrap.min.css"> <link rel="stylesheet" type="text/css" href="/static/plugins/bootstrap-multiselect/dist/css/bootstrap-multiselect.css"> <link rel="stylesheet" type="text/css" href="/glyphicons-pro/css/glyphicons-filetypes.css"> <!-- THICKBOX --> <link rel="stylesheet" type="text/css" href="/js/thickbox/thickbox.css"> <!-- JQUERY & FONT --> <script src="/bower_components/jquery/dist/jquery.min.js"></script> <script src="/bower_components/jquery-ui/jquery-ui.min.js"></script> <!-- BOOTSTRAP --> <script src="/bower_components/bootstrap/dist/js/bootstrap.min.js"></script> <script src="/static/plugins/bootstrap-multiselect/dist/js/bootstrap-multiselect.js"></script> <script type="text/javascript" src="/js/accessibility.js?v=20240514.1"></script> <script type="text/javascript" src="/js/scripts.js?v=20230316.1"></script> <link rel="stylesheet" type="text/css" href="/bower_components/mdi/css/materialdesignicons.min.css"> <link rel="stylesheet" type="text/css" href="/static/css/materialdesigniconscustom.css"> <link rel="stylesheet" type="text/css" href="/static/css/header.css?v=20220425.1"> <link rel="stylesheet" type="text/css" href="/css/bootstrap-customV.css?v=20241007.1"> </head> <body class="body-background " data-menu=""> <!-- SKIP links - skip to top of main content --> <div id="div-skip-links" class="skip-link-container-mobile"> <span style="padding: 5px"><a id="a-skip-to-main-content" href="javascript:" class="skip-link" onclick="setFocusToContent(true);" aria-label="Skip to Main Content">Skip to Main Content</a></span> <span id="span-skip-to-left-navigation" style="padding: 5px; display: none;"><a id="a-skip-to-left-navigation" href="javascript:" class="skip-link" onclick="setFocusToSidebar();" aria-label="Skip to Navigation">Skip to Navigation</a></span> <!-- ACCESSIBILITY --> <script> // if we're on mobile we will not enable the skip links const isMobileDevice = /Mobi/i.test(window.navigator.userAgent); // console.log('> isMobileDevice=' + isMobileDevice); $(window).on('load', function () { if (!isMobileDevice) { var elem = document.getElementById('div-skip-links'); if (typeof elem !== undefined) { elem.classList.remove('skip-link-container-mobile'); elem.classList.add('skip-link-container'); } } }); </script> </div> <!-- School custom code --> <!-- End school custom code --> <!-- Google Tag Manager (noscript) --> <!-- <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-548G27F" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> --> <!-- End Google Tag Manager (noscript) --> <!-- Modal --> <div id="primary-modal" class="modal fade" role="dialog"> <div class="modal-dialog" role="document"> <div class="modal-content"> <p class="loader"> <img alt="Loading" src="/images/loader-big.gif"> <br> Loading... </p> </div> </div> </div> <div id="secondary-modal" class="modal fade" role="dialog"> <div class="modal-dialog" role="document"> <div class="modal-content"> <p class="loader"> <img alt="Loading" src="/images/loader-big.gif"> <br> Loading... </p> </div> </div> </div> <script> $("#primary-modal").on("hide.bs.modal", function (e) { $("#primary-modal .modal-content").html(writeLoading("Loading")); }); $("#secondary-modal").on("hide.bs.modal", function (e) { $("#secondary-modal .modal-content").html(writeLoading("Loading")); }); </script> <!-- End Modal --> <script src="/static/js/modernizr.min.js"></script> <script src="/js/jquery-validate/jquery.validate.js"></script> <script src="/static/js/polyfill.js"></script> <!-- HEADER --> <style> .btn--school { background-color: #052049; color: #fff; } .btn--school:hover { background-color: #052049; color: #fff; } .btn--school:focus { background-color: #052049; color: #fff; } .topbar { background: #052049; border-color: #052049; } .topbar ul.nav > li > a:hover, .topbar ul.nav > li > button:hover { background-color: #ffffff !important; } .topbar ul.nav > li > a:focus, .topbar ul.nav > li > button:focus { background-color: #ffffff !important; outline: none; } .topbar .topbar__sidebar-toggle:hover { background-color: #ffffff !important; } .topbar .topbar__sidebar-toggle:focus { background-color: #ffffff !important; outline: none; } .topbar .open:not(.topbar__left) > a, .topbar .open:not(.topbar__left) > a:focus, .topbar > .open:not(.topbar__left) > a:hover, .topbar .open:not(.topbar__left) > button, .topbar .open:not(.topbar__left) > button:focus, .topbar > .open:not(.topbar__left) > button:hover { background-color: #ffffff !important; } .topbar li:focus-within > button.mdi-menu { background-color: #ffffff !important; } .topbar li.active > a, .topbar li.active > button { background-color: #ffffff !important; } </style> <div id="generic">Loading</div> <div id="outer-shell" class="outer-shell "> <!-- Impersonate --> <!-- /.Impersonate --> <!-- Message / Maintenance --> <!-- /.Message --> <div id="topbar" class="topbar topbar-login topbar--reverse" role="navigation" aria-label="Topbar"> <div class="topbar__left"> <div role="banner"> <a id="a-top-bar-logo" aria-label="UC San Francisco Logo. Opens the members homepage." role="button" class="logo" href="/groups"> <img class="topbar__icon-large" src="/upload/ucsf/2021/image_upload_34747_UCSF_Logo_21_White_RGB_5_122151121.png" alt="UC San Francisco Logo Image." aria-label="UC San Francisco Logo Image. Clicking opens the members home page." style="max-height: 50px; max-width: 165px;"> <img class="topbar__icon-small" src="/upload/ucsf/2019/image_upload_34747_ucsflogo_123105857.png" alt="UC San Francisco Logo Image." aria-label="UC San Francisco Logo Image. Clicking opens the members home page." style="max-height: 35px; max-width: 35px; margin: 0 5px;"> </a> </div> </div> <div class="topbar__center"> <nav aria-label="Topbar"> <ul class="nav"> <!-- Not Logged Buttons --> <!-- Home Website Buttons --> <li class="hidden-xs "> <a class="topbar__menu topbar__menu--large" href="/home_login" aria-label="Home" role="button">Home</a> </li> <li class="hidden-xs dropdown hasNoSubMenu"> <a class="topbar__menu topbar__menu--large" href="/home/groups/" style="max-width: inherit"> Groups </a> <ul class="dropdown-menu dropdown-menu-left arrow-dropdown-menu arrow-menu-right user-list notify-list" style="overflow-y: auto;max-height: 80vh;"> </ul> </li> <li class="hidden-xs dropdown hasNoSubMenu"> <a class="topbar__menu topbar__menu--large" href="/home/news/" style="max-width: inherit"> News </a> <ul class="dropdown-menu dropdown-menu-left arrow-dropdown-menu arrow-menu-right user-list notify-list" style="overflow-y: auto;max-height: 80vh;"> </ul> </li> <li class="hidden-xs dropdown hasNoSubMenu"> <a class="topbar__menu topbar__menu--large" href="/home/events/" style="max-width: inherit"> Events </a> <ul class="dropdown-menu dropdown-menu-left arrow-dropdown-menu arrow-menu-right user-list notify-list" style="overflow-y: auto;max-height: 80vh;"> </ul> </li> <li class="hidden-lg hidden-md hidden-sm dropdown hasSubMenu"> <button class="topbar__menu mdi mdi-menu" aria-label="Top Menu. Expanded. Press tab to enter the menu dropdown." tabindex="0"></button> <ul class="dropdown-menu dropdown-menu-left" style="overflow-y: auto;max-height: 80vh;min-width:220px;"> <li style="display: block;"><a href="/home_login" aria-label="Home" role="button">Home</a></li> <li style="display: block;"><a href="/home/groups/" aria-label="Groups Section" role="button" tabindex="0">Groups</a></li> <li style="display: block;"><a href="/home/news/" aria-label="News Section" role="button" tabindex="0">News</a></li> <li style="display: block;"><a href="/home/events/" aria-label="Events Section" role="button" tabindex="0">Events</a></li> </ul> </li> <style> .hasSubMenu:hover > ul, .hasSubMenu:focus-within > ul { display:block; } </style> <!-- /.Home Website Buttons --> <!-- Group & Event Buttons --> <!-- /.Group & Event Buttons --> <!-- /.Not Logged Buttons --> <!-- Home Button --> <!-- /.Home Button --> <!-- Group Button --> <!-- /.Group Button --> <!-- Manage Button --> <!-- Event Button --> <!-- /.Event Button --> <!-- Chat Button --> <!-- /.Chat Button --> <!-- Admin / Setup Button --> <!-- /.Admin Button --> <li class="spacer" role="presentation"></li> <!-- Login Button --> <li class="active"> <a class="topbar__menu topbar__menu--row" href="/login_only" aria-label="Sign In Section" role="button"> <span class="mdi mdi-login-variant mdi-24px"></span> <span class="hidden-xs hidden-sm topbar__menu-text" style="overflow: initial;"> Sign In </span> </a> </li> <!-- /.Login Button --> <style> #a-top-bar-logo:focus > i { outline: 2px solid #ffffff; } </style> </ul> </nav> </div><!-- /.navbar-collapse --> </div><!-- /.topbar --> <div id="inner-shell" class="inner-shell"> <!-- END HEADER --> <div id="content-cont" class="content-cont container"> <div id="page-cont" class="content" role="main" aria-label="Main Content."> <div style="position: relative;"><span id="span-top-of-main-content--0" class="content__top-element" tabindex="0" aria-label="Top of Main Content." style="display: none;">Top of Main Content</span></div> <!-- Used in email_form --> <!-- END AX != 1 --> <div class="login__cont"> <div class="login__box"> <div class="login__card card"> <div class="card-block" style="padding: 20px 40px;"> <h1 class="header-cg--h2">Sign in</h1> <p style="margin-bottom: 15px;"> <strong>Welcome to the UCSF Group Portal.</strong> <br> <small>The Group Portal is your way to connect to organizations, plan an event, request approval to use campus space, apply for funding, build a website, publicize an event, and more.</small> </p> <p class="text-center"> <a class="btn btn--school btn--full-width" href="https://www.campusgroups.com/shibboleth/ucsf">MyAccess Login</a> </p> <p> <br>Please sign in with your MyAccess credentials. </p> <div class="card-separator card-separator--20"></div> <p style="margin-bottom: 15px;"><strong>For users who do not have MyAccess credentials, please:</strong> <a href="javascript:toggle_ecg('ucsf_login', 'a-all-others-sign-in-below')" id="a-all-others-sign-in-below" aria-expanded="false" aria-label="All others sign in below. Click here to expand an alternate login form.">Sign in below</a></p> <p> If you do not have a user account already set up, please <a href="mailto:groups@ucsf.edu">contact groups@ucsf.edu</a>. </p> <form id="ucsf_login" style="display:none;" onLoad="document.form1.email.focus();" name="login" method="post" action="https://ucsf.campusgroups.com/student_login"> <div role="region" aria-label="Alternate login. If you do not have a user account already set up, please contact groups@ucsf.edu ."> <div class="form-group"> <input id="login_email" class="form-control" name="email" type="text" placeholder="Email" title="Enter your Email" value="" aria-label="Login. Enter your Email." /> </div> <div class="form-group"> <input class="form-control" name="password" type="password" placeholder="Password" title="Enter your password" value="" aria-label="Password." /> </div> <button id="loginButton" aria-label="Sign In" onclick="if(!$('#login_email').val()){alert('Please enter a valid email.');}else{loadButton($(this));$('form#ucsf_login').submit();}" class="btn btn--school btn--full-width" style="letter-spacing: 1px; padding: 8px; text-transform: uppercase;" type="button" value=" Sign In "> Sign In </button> <input type="hidden" name="update" value="1"> <input type="hidden" name="ssl" value="1"> <input type="hidden" name="redirect" value="student_index"> <input type="hidden" name="page" value="login"> <input type="hidden" name="user" value=""> <input type="hidden" name="_csrf" value="RsRTHzaRkJLSjGbvDxDK7rGJ9mBnS6E+1VGSaZhTZNvH"> <div class="checkbox"> <input id="remember_me" type="checkbox" name="remember_me" value="1"> <label id="label_for_remember_me" for="remember_me">Keep me signed on</label> </div> <div class="small" style="margin-top: 15px;"> <a class="thickbox" href="/password_boot?email=&embed=1&modal=true&TB_iframe=true&height=250&width=500" title="Forgot Password">Forgot Password?</a> </div> </div> </form> </div> </div> </div> </div> <div class="login__background-img" style="background-image: url(/upload/ucsf/2019/image_upload_758468_crosssectionthroughinjuredmouseskeletalmuscledanielkopinkejpeg_72623231.png);"></div> <!-- LL - 10/03/2017: Moved up here so ckeditor can work in popups --> <script> //YT Viewer if (typeof arrYoutubePlayerObjects != "undefined") { $("#youtubeScript").remove(); $("#www-widgetapi-script").remove(); if (window['YT'] != undefined) { window.YT.loading = 0; window.YT.loaded = 0; } var youtubeTag = document.createElement('script'); youtubeTag.id = "youtubeScript"; youtubeTag.src = "https://www.youtube.com/iframe_api"; youtubeTag.async = false; // Get First Script Tag & Insert Vimeo Script before that. var firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(youtubeTag, firstScriptTag); // Array of Players var arrYoutubePlayers = []; // Functions to work on Youtube Players function onYoutubePlayerReady(event) { var player = event.target; $(window).blur(function() { player.pauseVideo(); }); $(window).scroll(function() { if ( !isInViewport(document.getElementById("player--" + player.youtubeObject.cgID))) { player.pauseVideo(); } }); var startTime = new Date(player.youtubeObject.startTime * 1000).toISOString(); var totalTime = new Date(player.getDuration() * 1000).toISOString(); if (player.getDuration() >= 3600) { startTime = startTime.substr(11, 8); totalTime = totalTime.substr(11, 8); } else { startTime = startTime.substr(14, 5); totalTime = totalTime.substr(14, 5); } $("#player-btn--" + player.youtubeObject.cgID + " div.timer").html("<span id='player-time--" + player.youtubeObject.cgID + "'>" + startTime + "</span> / " + totalTime); } function onYoutubePlayerStateChange(event) { var player = event.target; if (event.data == YT.PlayerState.PLAYING) { // Change Buttons $("#player-btn--" + player.youtubeObject.cgID + " button.playpause").attr("data-status", "pause").attr("aria-label", "Pause"); $("#player-btn--" + player.youtubeObject.cgID + " button.playpause span.mdi").removeClass("mdi-play").addClass("mdi-pause"); } if (event.data == YT.PlayerState.PLAYING && player.intervalFunction == null) { // HACK For Window BLUR window.focus(); // AJAX Recurring Call player.intervalFunction = setInterval(function() { postVideoViews(player.youtubeObject.cgUID, player.youtubeObject.cgUID_s, player.getCurrentTime()); }, 10000); // Timer player.intervalTimerFunction = setInterval(function() { var currentTime = new Date(player.getCurrentTime() * 1000).toISOString(); if (player.getDuration() >= 3600) { currentTime = currentTime.substr(11, 8); } else { currentTime = currentTime.substr(14, 5); } $("#player-time--" + player.youtubeObject.cgID).html(currentTime); }, 1000) } else if (event.data == YT.PlayerState.PAUSED || event.data == YT.PlayerState.ENDED) { // Change Buttons $("#player-btn--" + player.youtubeObject.cgID + " button.playpause").attr("data-status", "play").attr("aria-label", "Play"); $("#player-btn--" + player.youtubeObject.cgID + " button.playpause span.mdi").removeClass("mdi-pause").addClass("mdi-play"); clearInterval(player.intervalFunction); clearInterval(player.intervalTimerFunction); player.intervalFunction = null; player.intervalTimerFunction = null; postVideoViews(player.youtubeObject.cgUID, player.youtubeObject.cgUID_s, player.getCurrentTime(), (event.data == YT.PlayerState.ENDED ? 'true' : '')); //if (event.data == YT.PlayerState.ENDED) { //if (typeof refreshTrackChecklist !== "undefined") { refreshTrackChecklist(); } //else if (typeof parent.refreshTrackChecklist !== "undefined") { parent.refreshTrackChecklist(); } //} } } function youtubePlayerPlayPause(player) { var currentStatus = $("#player-btn--" + player.youtubeObject.cgID + " button.playpause").attr("data-status"); if (currentStatus == "play") { player.playVideo(); } else if (currentStatus == "pause") { player.pauseVideo(); } } /* Function that checks localStorage for the Vimeo/YouTube closed captions load policy. Returns number values: * 0 - closed captions should be be disabled (do not load closed captions) * 1 - closed captions should be loaded when video loads * If the local storage key is not defined we return 0 (as a number). */ function getVideoPlayerCCLoadPolicy() { try { const lsKey = 'cg-video-player-cc-load-policy'; const ccLoadPolicy = localStorage.getItem(lsKey); return (ccLoadPolicy === '1') ? 1 : 0; } catch(e) { return 0; } } /* Function that toggles the video player CC load policy stored in local storage. Toggled values are (strings values): * '0' - closed captions should be be disabled (do not load closed captions) * '1' - closed captions should be loaded when video loads * If the local storage key is not defined it is treated as though the value were '0' and toggles to '1'. * */ function toggleVideoPlayerCCLoadPolicy() { try { const lsKey = 'cg-video-player-cc-load-policy'; const ccLoadPolicy = localStorage.getItem(lsKey); if (ccLoadPolicy === '1') { localStorage.setItem(lsKey, '0'); } else { localStorage.setItem(lsKey, '1'); } } catch(e) { return; } } /* Function that prompts the user for confirmation before toggling the video player closed caption load policy. * - If closed captions are currently turned off, the user will be prompted to confirm before turning them on (and vice versa) * - Video player CC load policy setting is stored in local storage (see above functions) * - Vimeo and YouTube video players require reload of the associated IFrames to change the setting, * if user confirms yes to reload, the page will be reloaded. */ function toggleClosedCaptionsAndReloadVideoIframes() { const turnClosedCaptionsOnOff = (typeof getVideoPlayerCCLoadPolicy !== 'undefined' && getVideoPlayerCCLoadPolicy() === 1) ? 'off' : 'on'; const message = 'Turning ' + turnClosedCaptionsOnOff + ' closed captions will reload this page, please save any outstanding changes before you choose to turn closed captions ' + turnClosedCaptionsOnOff + '. Are you sure you want to turn closed captions ' + turnClosedCaptionsOnOff + '?'; if (confirm(message)) { toggleVideoPlayerCCLoadPolicy(); location.reload(); } else { return false; } } // Called when the script is fully loaded. function onYouTubeIframeAPIReady() { // Loop through players arrYoutubePlayerObjects.forEach(function (youtubeObject, index) { arrYoutubePlayers[index] = new YT.Player("player--" + youtubeObject.cgID, { height: youtubeObject.height, width: youtubeObject.width, videoId: youtubeObject.videoID, playerVars: { modestbranding: 1, rel: 0, disablekb: 1, playsinline: 1, controls: 0, start: youtubeObject.startTime, cc_load_policy: (typeof getVideoPlayerCCLoadPolicy !== 'undefined') ? getVideoPlayerCCLoadPolicy() : 0 }, events: { 'onStateChange': onYoutubePlayerStateChange, 'onReady': onYoutubePlayerReady } }); arrYoutubePlayers[index].youtubeObject = youtubeObject; arrYoutubePlayers[index].intervalFunction = null; $("#player-btn--" + youtubeObject.cgID + " button.playpause").on('click', function() { youtubePlayerPlayPause(arrYoutubePlayers[index]); }); $("#player-btn--" + youtubeObject.cgID + " button.replay").on('click', function() { arrYoutubePlayers[index].seekTo(0); }); $("#player-btn--" + youtubeObject.cgID + " button.rewind").on('click', function() { arrYoutubePlayers[index].seekTo(arrYoutubePlayers[index].getCurrentTime() - 10); }); const turnClosedCaptionsOnOff = (typeof getVideoPlayerCCLoadPolicy !== 'undefined' && getVideoPlayerCCLoadPolicy() === 1) ? 'off' : 'on'; $("#player-btn--" + youtubeObject.cgID + " button.closedcaption").attr('aria-label', 'Turn ' + turnClosedCaptionsOnOff + ' closed captions. Note, this requires a reload of the current page.'); $("#player-btn--" + youtubeObject.cgID + " button.closedcaption").on('click', function() { toggleClosedCaptionsAndReloadVideoIframes(); }); $("#player-btn--" + youtubeObject.cgID + " button.fullscreen").on('click', function() { arrYoutubePlayers[index].pauseVideo(); tb_show("", "/video_player?embed=1&uid=" + youtubeObject.cgUID + "&width=995&height=680&modal=true&TB_iframe=1", ""); }); }); arrYoutubePlayerObjects = undefined; } } //Vimeo Viewer if (typeof arrVimeoPlayerObjects != "undefined") { $("#vimeoScript").remove(); var vimeoTag = document.createElement('script'); vimeoTag.id = "vimeoScript"; vimeoTag.src = "https://player.vimeo.com/api/player.js"; vimeoTag.async = false; // Get First Script Tag & Insert Vimeo Script before that. var firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(vimeoTag, firstScriptTag); // Array of Players var arrVimeoPlayers = []; // Functions to work on Vimeo Players function vimeoPlayerPlay(player) { // Change Buttons $("#player-btn--" + player.vimeoObject.cgID + " button.playpause").attr("data-status", "pause").attr("aria-label", "Pause"); $("#player-btn--" + player.vimeoObject.cgID + " button.playpause span.mdi").removeClass("mdi-play").addClass("mdi-pause"); // AJAX Recurring Call player.intervalFunction = setInterval( function() { player.getCurrentTime().then( function(seconds) { postVideoViews(player.vimeoObject.cgUID, player.vimeoObject.cgUID_s, seconds); }) }, 10000) // Timer player.intervalTimerFunction = setInterval(function() { player.getCurrentTime().then( function(seconds) { var currentTime = new Date(seconds * 1000).toISOString(); if (player.totalDuration >= 3600) { currentTime = currentTime.substr(11, 8); } else { currentTime = currentTime.substr(14, 5); } $("#player-time--" + player.vimeoObject.cgID).html(currentTime); }) }, 1000) } function vimeoPlayerPause(player) { // Change Buttons $("#player-btn--" + player.vimeoObject.cgID + " button.playpause").attr("data-status", "play").attr("aria-label", "Play"); $("#player-btn--" + player.vimeoObject.cgID + " button.playpause span.mdi").removeClass("mdi-pause").addClass("mdi-play"); // Clear AJAX Recurring Call clearInterval(player.intervalFunction); clearInterval(player.intervalTimerFunction); player.intervalFunction = null; player.intervalTimerFunction = null; player.getCurrentTime().then( function(seconds) { postVideoViews(player.vimeoObject.cgUID, player.vimeoObject.cgUID_s, seconds); }); } function vimeoPlayerEnded(player) { // Change Buttons $("#player-btn--" + player.vimeoObject.cgID + " button.playpause").attr("data-status", "play").attr("aria-label", "Play"); $("#player-btn--" + player.vimeoObject.cgID + " button.playpause span.mdi").removeClass("mdi-pause").addClass("mdi-play"); // Clear AJAX Recurring Call clearInterval(player.intervalFunction); clearInterval(player.intervalTimerFunction); player.intervalFunction = null; player.intervalTimerFunction = null; player.getCurrentTime().then( function(seconds) { postVideoViews(player.vimeoObject.cgUID, player.vimeoObject.cgUID_s, seconds, 'true'); }); //if (typeof refreshTrackChecklist !== "undefined") { refreshTrackChecklist(); } //else if (typeof parent.refreshTrackChecklist !== "undefined") { parent.refreshTrackChecklist(); } } function vimeoPlayerPlayPause(player) { var currentStatus = $("#player-btn--" + player.vimeoObject.cgID + " button.playpause").attr("data-status"); if (currentStatus == "play") { player.play(); } else if (currentStatus == "pause") { player.pause(); } } // We wait until the script is fully loaded. $("#vimeoScript").on('load', function() { // Loop through players arrVimeoPlayerObjects.forEach(function (vimeoObject, index) { if (typeof getVideoPlayerCCLoadPolicy !== 'undefined' && getVideoPlayerCCLoadPolicy() === 1) { // load with closed captions enabled (set texttrack to 'en') arrVimeoPlayers[index] = new Vimeo.Player("player--" + vimeoObject.cgID, { url: vimeoObject.URL , height: vimeoObject.height, width: vimeoObject.width, controls: false, texttrack: 'en' }); } else { arrVimeoPlayers[index] = new Vimeo.Player("player--" + vimeoObject.cgID, { url: vimeoObject.URL , height: vimeoObject.height, width: vimeoObject.width, controls: false }); } arrVimeoPlayers[index].vimeoObject = vimeoObject; arrVimeoPlayers[index].intervalFunction = null; if (vimeoObject.startTime != 0) { arrVimeoPlayers[index].setCurrentTime(vimeoObject.startTime); } arrVimeoPlayers[index].on('play', function() { vimeoPlayerPlay(this) } ); arrVimeoPlayers[index].on('pause', function() { vimeoPlayerPause(this) } ); arrVimeoPlayers[index].on('ended', function() { vimeoPlayerEnded(this) } ); $("#player-btn--" + vimeoObject.cgID + " button.playpause").on('click', function() { vimeoPlayerPlayPause(arrVimeoPlayers[index]); }); $("#player-btn--" + vimeoObject.cgID + " button.replay").on('click', function() { arrVimeoPlayers[index].setCurrentTime(0) }); $("#player-btn--" + vimeoObject.cgID + " button.rewind").on('click', function() { arrVimeoPlayers[index].getCurrentTime().then(function(seconds) { arrVimeoPlayers[index].setCurrentTime(Math.max(0, seconds - 10)); }) }); const turnClosedCaptionsOnOff = (typeof getVideoPlayerCCLoadPolicy !== 'undefined' && getVideoPlayerCCLoadPolicy() === 1) ? 'off' : 'on'; $("#player-btn--" + vimeoObject.cgID + " button.closedcaption").attr('aria-label', 'Turn ' + turnClosedCaptionsOnOff + ' closed captions. Note, this requires a reload of the current page.'); $("#player-btn--" + vimeoObject.cgID + " button.closedcaption").on('click', function() { toggleClosedCaptionsAndReloadVideoIframes(); }); $("#player-btn--" + vimeoObject.cgID + " button.fullscreen").on('click', function() { arrVimeoPlayers[index].pause(); tb_show("", "/video_player?embed=1&uid=" + vimeoObject.cgUID + "&width=995&height=680&modal=true&TB_iframe=1", ""); }); $(window).blur(function() { arrVimeoPlayers[index].pause(); }); $(window).scroll(function() { if ( !isInViewport(document.getElementById("player--" + vimeoObject.cgID))) { arrVimeoPlayers[index].pause(); } }); var startTime = new Date(vimeoObject.startTime * 1000).toISOString(); var totalTime = 0; arrVimeoPlayers[index].getDuration().then(function(seconds) { arrVimeoPlayers[index].totalDuration = seconds; totalTime = new Date(seconds * 1000).toISOString(); if (seconds >= 3600) { startTime = startTime.substr(11, 8); totalTime = totalTime.substr(11, 8); } else { startTime = startTime.substr(14, 5); totalTime = totalTime.substr(14, 5); } $("#player-btn--" + vimeoObject.cgID + " div.timer").html("<span id='player-time--" + vimeoObject.cgID + "'>" + startTime + "</span> / " + totalTime); }); }); arrVimeoPlayerObjects = undefined; }); } </script> <script> $(document).ready(function(){ $("[data-toggle='tooltip']").tooltip(); $(".btn--loader").click(function() { loadButton($(this)); }); tb_init('a.thickbox, area.thickbox, input.thickbox'); // fix for the non editable input in ckeditor (ex: URL...) $(".modal").removeAttr("tabindex"); setupAjaxAccessibility(); }); </script> <!-- AX != 1 --> </div><!--/.content --> </div><!--/.content-page --> </div><!--/.inner-shell --> <style> .outer-shell { display:flex; flex-direction:column; min-height: 100vh; } @-moz-document url-prefix() { .inner-shell {flex:1; } } @media screen and (-webkit-min-device-pixel-ratio:0) { .inner-shell { flex:1; } } body.enlarged { min-height:initial; position:relative; } body.enlarged > .outer-shell { display:flex; flex-direction:column; min-height: 100vh; } </style> <footer class="footer__home"> <div> <div id="footer-links" class="row footer__cont" style="background: transparent;"> <div class="col-md-offset-1_5 col-md-3 col-sm-12 col-xs-12 text-center" style="padding-top:10px;"> <img alt="UC San Francisco Website Logo" src="/upload/ucsf/2021/image_upload_34747_UCSF_Logo_21_White_RGB_5_122151121.png" style="max-width:150px;max-height:50px;border-radius:6px;"> </div> <div class="text-xs-center text-sm-left text-md-left col-md-3 col-sm-6 col-xs-12" style="display:flex;padding: 10px 10px;"> <div style="margin:auto" role="group" aria-label="Contact information."> <h2 class="footer__home--title" style="margin-top: 0; margin-bottom: 10px;">Contact</h2><br> <span style="margin-bottom:5px">UC San Francisco</span><br> <span style="margin-bottom:5px;line-height:1.7">500 Parnassus Avenue<br>San Francisco, California 94143<br>United States</span><br> <a class="a-footer-contact-links" href="mailto:groups@ucsf.edu" aria-label="Send an email to groups@ucsf.edu">groups@ucsf.edu</a><br> </div> </div> <div class="text-xs-center text-sm-left text-md-left col-md-3 col-sm-6 col-xs-12" style="display:flex;vertical-align:top;padding: 10px 10px;"> <div style="margin:auto" role="group" aria-label="Links"> <h2 class="footer__home--title" style="margin-top: 0; margin-bottom: 10px;">Links</h2><br> <a class="a-footer-contact-links" href="/home/groups/">Groups</a><br> <a class="a-footer-contact-links" href="/home/news/">News</a><br> <a class="a-footer-contact-links" href="/home/events/">Events</a><br> <a class="a-footer-contact-links" href="https://www.ucsf.edu/">Terms of Service</a><br> <a class="a-footer-contact-links" href="https://hipaa.ucsf.edu/">Privacy Policy</a><br> <a class="a-footer-contact-links" href="https://readyedu.atlassian.net/wiki/spaces/CGSD/overview?homepageId=302186786">Support Center</a> </div> </div> </div> <div class="row" style="padding:15px 20px 0 20px;border-top:1px solid #5a5a5a;margin-top: 10px;" role="group" aria-label="Footer Bar Links"> <div class="col-sm-6 col-xs-12 text-xs-center text-sm-left"></div> <div class="col-sm-6 col-xs-12 text-xs-center text-sm-right"> <a class="a-footer-contact-links" href="http://www.novalsys.com">©2024 CampusGroups</a> </div> </div> </div> </footer> <script type="text/javascript" src="/js/jquery-migrate-1.2.1.js"></script> <!-- THICKBOX --> <script src="/js/thickbox/thickbox.js"></script> <script type="text/javascript" src="/static/js/metisMenuCustom.js?v=1"></script> <script type="text/javascript" src="/static/js/jquery.slimscroll.js"></script> <!--<link href="/static/css/scrollbar.css" rel="stylesheet"> <script type="text/javascript" src="/static/js/scrollbar.js"></script>--> <script type="text/javascript">function $$(strId) { return document.getElementById(strId); }</script> <script type="text/javascript" src="/static/plugins/clamp/clamp.min.js"></script> <script type="text/javascript" src="/static/js/core.js"></script> <script type="text/javascript" src="/static/js/menu.js"></script> <script type="text/javascript" src="/static/js/routing.js"></script> <script type="text/javascript">$.ajaxSetup({cache:true})</script> <!-- @TODO: This is for jPrompt. We might to see if an update is available or give it a better style --> <link href="/js/jquery-alerts/jquery.alerts.css" rel="stylesheet" type="text/css"> <script src="/js/jquery-alerts/jquery.alerts.js" type="text/javascript"></script> <!-- @TODO: Check if used : put directly on /r and student_password--> <script> </script> <!-- Google Analytics --> <script> var _customTask = function() { return function(model){ var piiRegex = [ { name: 'Email', regex: /.{4}@.{4}/g}, { name: 'Phone_Number', regex: /^(\+|\d)[0-9]{7,16}$/g}, { name: 'SSN', regex: /^\d{3}-\d{2}-\d{4}$}/g}, { name: 'Address', regex: /^\d+\s[A-z]+\s[A-z]+/g}]; var globalSendTaskName = '_' + model.get('trackingId') + '_sendHitTask'; // Fetch reference to the original sendHitTask var originalSendTask = window[globalSendTaskName] = window[globalSendTaskName] || model.get('sendHitTask'); var i, hitPayload, parts, val; // Overwrite sendHitTask with PII purger model.set('sendHitTask', function(sendModel) { hitPayload = sendModel.get('hitPayload').split('&'); for (i = 0; i < hitPayload.length; i++) { parts = hitPayload[i].split('='); // Double-decode, to account for web server encode + analytics.js encode try { val = decodeURIComponent(decodeURIComponent(parts[1])); } catch(e) { val = decodeURIComponent(parts[1]); } piiRegex.forEach(function(pii) { val = val.replace(pii.regex, '[REDACTED ' + pii.name + ']'); }); parts[1] = encodeURIComponent(val); hitPayload[i] = parts.join('='); } sendModel.set('hitPayload', hitPayload.join('&'), true); originalSendTask(sendModel); }); }; } </script> <!-- End Google Analytics --> <!-- Help --> <!-- End Help --> </body> <!-- END AX != 1 --> <style> /* Accessibility Mode OFF - Default outline on :focus (none) */ :focus { outline: none; } a:focus { outline: none; } button.close:focus { outline: none; } .button:focus { outline: none; } .button.focus { outline: none; } .btn.active.focus, .btn.active:focus, .btn.focus, .btn:active.focus, .btn:active:focus, .btn:focus { outline: none; } .dropdown-toggle:focus { outline: none; } #header__btn-cont--manage:focus, #header__btn-cont--manage:focus-within { outline: none; } /* no outline/focus on the following (various reasons including hover style on focus, other focus styles applied, etc.) */ h2:focus { outline: none; outline-offset: 0px; border: none; } /* .page__header--btns .btn:focus { outline: none !important; outline-offset: 0px !important; } */ /* a.btn--rounded:focus { outline: none !important; outline-offset: 0px !important; } */ </style> <!-- should always be last stylesheet loaded, version=yyyymmddx --> <link href="/static/css/accessibility.css?v=20220717.1" rel="stylesheet" /> </html>