1(function($){'use strict';$(document).ready(function(){if(typeof window.lmsShortcodeInstances==='undefined'||!window.lmsShortcodeInstances){if(window.__MEDX_DEBUG__&&window.__MEDX_DEBUG__.login){console.log('ð No LMS shortcode instances found on this page')} 2return} 3for(var instanceId in window.lmsShortcodeInstances){if(window.lmsShortcodeInstances.hasOwnProperty(instanceId)){initializeLMSInstance(instanceId,window.lmsShortcodeInstances[instanceId])}}});function initializeLMSInstance(instanceId,config){var loggedOutEl=$('#'+instanceId);var loggedInEl=$('#'+instanceId+'-menu');var container=loggedOutEl;var DEBUG=!!config.debug||(!!window.__MEDX_DEBUG__&&!!window.__MEDX_DEBUG__.login);var console=DEBUG?window.console:{log:function(){},warn:function(){},error:function(){}};if(DEBUG){console.log('ð LMS Elements found:',{loggedOut:loggedOutEl.length,loggedIn:loggedInEl.length,containerId:config.instanceId})} 4window.lmsLoggedInStateShown=!1;window.lmsRealNameLocked=!1;window.lmsAuthState=null;window.lmsRoleDetected=!1;window.lmsCallSequence=0;window.enableLMSLoginButton=enableLoginButton;window.lmsSessionCheckFailed=!1;function fetchFullUserMetadata(apikey,orgId){console.log('â¸ï¸ Skipping full user metadata fetch to avoid rate limits');return} 5function updateUserNameInUI(realName){var userNameElement=loggedInEl.find('.user-name');if(userNameElement.length>0){var firstName=extractFirstName(realName);console.log('ð REAL NAME UPDATE: Setting UI to first name:',firstName,'from real name:',realName);userNameElement.text(firstName);window.lmsRealNameLocked=!0;console.log('ð REAL NAME LOCKED: Preventing future username overrides');if(window.lmsAuthState){window.lmsAuthState.realName=realName;window.lmsAuthState.name=realName;window.lmsAuthState.extractedName=firstName;var authData=getAuthFromStorage();if(authData){authData.realName=realName;authData.name=realName;authData.extractedName=firstName;saveAuthToStorage(authData);console.log('ð¾ Updated localStorage with real name:',firstName)}}}}
6function checkAuthStatus(){window.lmsCallSequence=(window.lmsCallSequence||0)+1;if(DEBUG){console.log('ð ['+window.lmsCallSequence+'] ===== STARTING AUTH CHECK =====');console.log('ð Called from:',new Error().stack.split('\n')[2].trim());console.log('ð Current lmsLoggedInStateShown flag:',window.lmsLoggedInStateShown);console.log('ð Current DOM visibility - loggedOut:',loggedOutEl.is(':visible'),'loggedIn:',loggedInEl.is(':visible'))} 7var cachedAuth=getAuthFromStorage();if(cachedAuth){if(DEBUG)console.log('â CACHED AUTH FOUND - Showing logged in immediately');if(DEBUG)console.log('ð Using cached auth from localStorage');window.lmsRealNameLocked=!0;showLoggedInState(cachedAuth)}else{if(DEBUG)console.log('â NO CACHED AUTH - Showing login immediately');showLoggedOutState()} 8initSDKLoginHandling();setTimeout(function(){var loginButton=loggedOutEl.find('.loginButton.login');if(loginButton.prop('disabled')){console.log('â° SDK timeout - enabling button as fallback');enableLoginButton()}},5000)} 9$(window).on('focus',function(){console.log('ðï¸ ===== TAB FOCUSED - RE-CHECKING AUTH =====');console.log('ð Current lmsLoggedInStateShown flag:',window.lmsLoggedInStateShown);var cachedAuth=getAuthFromStorage();if(cachedAuth){console.log('â Found cached auth on focus, showing logged-in state');showLoggedInState(cachedAuth)}else{console.log('â No cached auth on focus, showing logged-out state');showLoggedOutState()}});window.lmsLoggedInStateShown=!1;window.lmsRealNameLocked=!1;window.lmsAuthState=null;window.lmsRoleDetected=!1;window.enableLMSLoginButton=enableLoginButton;window.lmsCallSequence=0;window.lmsSessionCheckFailed=!1;function enableLoginButton(){var allLoginButtons=$('.loginButton.login');allLoginButtons.each(function(){var button=$(this);var loginText=button.find('.login-text');button.prop('disabled',!1);button.css('opacity','1');button.css('cursor','pointer');button.removeClass('disabled');if(loginText.length>0){loginText.html('Login / Join')}else{var icon=button.find('i.icon-user');if(icon.length>0){button.html('<i class="icon-user" style="margin-right: 5px;"></i>Login / Join')}else{button.html('Login / Join')}}});console.log('â '+allLoginButtons.length+' login button(s) enabled - SDK is ready')} 10function initSDKLoginHandling(){if(DEBUG)console.log('ð§ Initializing SDK login handling...');window.addEventListener('message',function(event){if(DEBUG)console.log('ð¨ Received message from iframe:',event.data);var lmsBaseDomain=window.MedExamLMS?window.MedExamLMS.baseDomain:config.lmsBaseDomain;if(event.origin!==lmsBaseDomain){return} 11var isLoginSuccess=!1;var isUserData=!1;if(event.data&&event.data.message==='UserMeta Data'&&event.data.usermeta){if(DEBUG)console.log('ð¤ User metadata received:',event.data.usermeta);isUserData=!0;window.lmsAuthState=event.data.usermeta;var userData=event.data.usermeta;var nestedUser=userData.user||{};if(DEBUG){console.log('ð Checking user data structure:');console.log('ð Direct userData:',userData);console.log('ð Nested user:',nestedUser);console.log('ð userData keys:',Object.keys(userData));console.log('ð nestedUser keys:',Object.keys(nestedUser))} 12if(DEBUG)console.log('ð Individual nested user fields:');for(var key in nestedUser){if(nestedUser.hasOwnProperty(key)){if(DEBUG)console.log(' '+key+':',nestedUser[key]);}} 13var potentialNameFields=[];var keys=Object.keys(nestedUser);for(var i=0;i<keys.length;i++){var key=keys[i];if(key.toLowerCase().indexOf('name')!==-1||key.toLowerCase().indexOf('user')!==-1||key.toLowerCase().indexOf('display')!==-1||key.toLowerCase().indexOf('full')!==-1||key.toLowerCase().indexOf('first')!==-1||key.toLowerCase().indexOf('last')!==-1){potentialNameFields.push(key)}} 14if(DEBUG)console.log('ð¯ Potential name fields found:',potentialNameFields);var hasDirectLogin=userData.student_id||userData.name||userData.email||userData.first_name||userData.student_name||userData.id||userData.user_id||userData.username;var hasNestedLogin=nestedUser.student_id||nestedUser.name||nestedUser.email||nestedUser.first_name||nestedUser.student_name||nestedUser.id||nestedUser.user_id||nestedUser.username;var finalUserData=hasNestedLogin?nestedUser:userData;if(DEBUG)console.log('ð Login detection results:',{hasDirectLogin:hasDirectLogin,hasNestedLogin:hasNestedLogin,usingNestedData:hasNestedLogin,finalUserData:finalUserData,finalDataKeys:Object.keys(finalUserData)});var extractedName='User';if(finalUserData.first_name&&finalUserData.last_name){extractedName=finalUserData.first_name+' '+finalUserData.last_name;if(DEBUG)console.log('â SDK: Using first_name + last_name:',extractedName);}else if(finalUserData.first_name){extractedName=finalUserData.first_name;if(DEBUG)console.log('â SDK: Using first_name:',extractedName);}else if(finalUserData.name){extractedName=finalUserData.name;if(DEBUG)console.log('â SDK: Using name field:',extractedName);}else{if(DEBUG)console.log('â ï¸ SDK: No real name found, using User');} 15if(DEBUG)console.log('ð Final extracted name from SDK data:',extractedName,'from object:',finalUserData);if(DEBUG)console.log('ð Name field values:',{name:finalUserData.name,first_name:finalUserData.first_name,student_name:finalUserData.student_name,firstName:finalUserData.firstName,display_name:finalUserData.display_name,full_name:finalUserData.full_name,username:finalUserData.username,user_name:finalUserData.user_name,fname:finalUserData.fname,lname:finalUserData.lname,last_name:finalUserData.last_name,email:finalUserData.email,'all_keys':Object.keys(finalUserData)});if(!window.lmsAuthState){window.lmsAuthState={}} 16for(var key in finalUserData){if(finalUserData.hasOwnProperty(key)){window.lmsAuthState[key]=finalUserData[key]}} 17window.lmsAuthState.extractedName=extractedName;console.log('ð¾ Stored user metadata for later use:',window.lmsAuthState);if(hasDirectLogin||hasNestedLogin){if(DEBUG)console.log('â User is logged in according to iframe data');if(window.lmsSessionCheckFailed){if(DEBUG)console.log('ð Clearing session check failure flag - SDK confirms user is logged in');window.lmsSessionCheckFailed=!1} 18showLoggedInState(finalUserData);return}else{if(DEBUG)console.log('â ï¸ User data received but no clear login indicators found');}} 19if(event.data&&event.data.role&&!window.lmsRoleDetected){if(DEBUG)console.log('â User role detected:',event.data.role);window.lmsRoleDetected=!0;if(window.lmsRealNameLocked){if(DEBUG)console.log('ð REAL NAME LOCKED: Skipping role-based name extraction to preserve real name');loggedInEl.show();loggedOutEl.hide();return} 20var userName=event.data.role.charAt(0).toUpperCase()+event.data.role.slice(1);if(window.lmsAuthState){var storedName=null;if(window.lmsAuthState.first_name&&window.lmsAuthState.last_name){storedName=window.lmsAuthState.first_name+' '+window.lmsAuthState.last_name;if(DEBUG)console.log('â Role: Using first_name + last_name:',storedName);}else if(window.lmsAuthState.first_name){storedName=window.lmsAuthState.first_name;if(DEBUG)console.log('â Role: Using first_name:',storedName);}else if(window.lmsAuthState.name){storedName=window.lmsAuthState.name;if(DEBUG)console.log('â Role: Using name field:',storedName);}else if(window.lmsAuthState.realName){storedName=window.lmsAuthState.realName;if(DEBUG)console.log('â Role: Using realName:',storedName);} 21if(storedName&&storedName!=='User'){userName=extractFirstName(storedName);window.lmsRealNameLocked=!0;if(DEBUG)console.log('ð Using stored user name (first name only):',userName,'from:',storedName);}else{console.log('â ï¸ No valid user name found, using role default')}} 22var userData={name:userName,role:event.data.role,student_id:(window.lmsAuthState&&window.lmsAuthState.student_id)||('role_based_'+event.data.role)};for(var key in event.data){if(event.data.hasOwnProperty(key)){userData[key]=event.data[key]}} 23if(window.lmsAuthState){for(var key in window.lmsAuthState){if(window.lmsAuthState.hasOwnProperty(key)){userData[key]=window.lmsAuthState[key]}}} 24window.lmsAuthState=userData;if(DEBUG)console.log('ð Switching to logged in state based on role with user name:',userName,'(full data:',userData,')');if(window.lmsSessionCheckFailed){if(DEBUG)console.log('ð Clearing session check failure flag - role detection confirms login');window.lmsSessionCheckFailed=!1} 25showLoggedInState(userData);return} 26if(event.data&&(event.data.login_success||event.data.signup_success)){isLoginSuccess=!0} 27if(event.data&&event.data.iframeReady){console.log('â SDK iframe is ready');if(window.lmsSessionCheckFailed){console.log('â ï¸ Session check previously failed - checking with SDK for final decision');setTimeout(function(){if(window.lmsSessionCheckFailed&&!window.lmsRoleDetected){console.log('â SDK confirms n
27o login after session failure - forcing logout');showLoggedOutState(!0)}},2000)}} 28if(event.data&&event.data.processLogout){console.log('ðª LOGOUT detected from SDK iframe!');clearAuthFromStorage();showLoggedOutState(!0);return} 29if(isLoginSuccess){if(DEBUG)console.log('ð Login/Signup success detected!');var iframe=document.getElementById('iframe');if(iframe){iframe.style.display='none'} 30var loggedInUser={name:'User',student_id:'login_success_'+Date.now(),login_success:!0,login_time:Date.now()};saveAuthToStorage(loggedInUser);showLoggedInState(loggedInUser);setTimeout(function(){if(DEBUG)console.log('ð Reloading page after successful login...');window.location.reload()},1500);return} 31if(!isLoginSuccess&&!isUserData&&!event.data.iframeReady&&!event.data.processLogout&&!event.data.role){if(DEBUG)console.log('â¹ï¸ Message received but not a login success or user data:',event.data);}})} 32function showLoggedInState(user){console.log('ð ['+(++window.lmsCallSequence)+'] showLoggedInState() called with user:',user);console.log('ð Current lmsLoggedInStateShown flag:',window.lmsLoggedInStateShown);if(window.lmsLoggedInStateShown&&user.name===loggedInEl.find('.user-name').text()){console.log('ð« BLOCKED: Logged-in state already shown, ignoring duplicate call');return} 33if(window.lmsRealNameLocked){console.log('ð REAL NAME LOCKED: Preserving current UI name, not extracting new name from user data');var currentName=loggedInEl.find('.user-name').text();if(!currentName||currentName.trim()===''||currentName==='User'){var fullName=user.extractedName||user.realName||user.name||'My Account';loggedInEl.find('.user-name').text(extractFirstName(fullName))} 34console.log('ð DOM: Hiding logged-out element, showing logged-in element (locked name path)');loggedOutEl.hide();loggedInEl.show();window.lmsLoggedInStateShown=!0;window.lmsSessionCheckFailed=!1;console.log('ð LOGGED-IN STATE SHOWN (locked name), flag set to true');saveAuthToStorage(user);return} 35var userName='My Account';if(user.first_name&&user.last_name){userName=user.first_name+' '+user.last_name;console.log('â Using first_name + last_name:',userName)}else if(user.first_name){userName=user.first_name;console.log('â Using first_name:',userName)}else if(user.name){userName=user.name;console.log('â Using name field:',userName)}else if(user.realName){userName=user.realName;console.log('â Using realName:',userName)}else{console.log('â ï¸ No real name found, using default: User')} 36var firstName=extractFirstName(userName);window.lmsRealNameLocked=!0;console.log('ð¤ Setting user name to:',firstName,'from full name:',userName,'user data keys:',Object.keys(user));loggedInEl.find('.user-name').text(firstName);saveAuthToStorage(user);console.log('ð DOM: Hiding logged-out element, showing logged-in element (regular path)');loggedOutEl.hide();loggedInEl.show();window.lmsLoggedInStateShown=!0;window.lmsSessionCheckFailed=!1;console.log('ð LOGGED-IN STATE SHOWN (regular), flag set to true');console.log('â Showing logged in state for:',firstName)} 37function showLoggedOutState(forceLogout){console.log('ð ['+(++window.lmsCallSequence)+'] showLoggedOutState() called, forceLogout:',forceLogout);console.log('ð Current lmsLoggedInStateShown flag:',window.lmsLoggedInStateShown);console.log('ð Current DOM visibility - loggedOut:',loggedOutEl.is(':visible'),'loggedIn:',loggedInEl.is(':visible'));if(window.lmsLoggedInStateShown&&!forceLogout){console.log('ð« BLOCKED: Logged-in state is shown and not forcing logout, preventing login button display');return} 38console.log('ð§¹ PROCEEDING: Clearing all auth flags and showing logged-out state');window.lmsLoggedInStateShown=!1;window.lmsRealNameLocked=!1;window.lmsRoleDetected=!1;console.log('ð DOM: Hiding logged-in element, showing logged-out element');loggedInEl.hide();loggedOutEl.show();console.log('ð LOGGED-OUT STATE SHOWN, all flags cleared');console.log('â¹ï¸ Showing logged out state'+(forceLogout?' (forced)':''))} 39function saveAuthToStorage(userData){try{var cleanedUserData={};for(var key in userData){if(userData.hasOwnProperty(key)){cleanedUserData[key]=userData[key]}} 40cleanedUserData.displayName=extractFirstName(userData.name||userData.first_name||'User');var authData={user:cleanedUserData,timestamp:Date.now(),expiresAt:Date.now()+(24*60*60*1000)};localStorage.setItem('lms_auth_data',JSON.stringify(authData));console.log('ð¾ Auth data saved to localStorage with consistent naming:',{displayName:cleanedUserData.displayName,realName:cleanedUserData.realName,originalUsername:cleanedUserData.originalUsername})}catch(error){console.log('â Failed to save to localStorage:',error)}} 41function getAuthFromStorage(){try{var authData=localStorage.getItem('lms_auth_data');if(!authData)return null;var parsed=JSON.parse(authData);var now=Date.now();if(now>parsed.expiresAt){console.log('â° Auth data expired, clearing storage');clearAuthFromStorage();return null} 42console.log('ð Auth data loaded from localStorage:',parsed);return parsed.user}catch(error){console.log('â Failed to read from localStorage:',error);clearAuthFromStorage();return null}} 43function clearAuthFromStorage(){try{localStorage.removeItem('lms_auth_data');console.log('ðï¸ Auth data cleared from localStorage')}catch(error){console.log('â Failed to clear localStorage:',error)}} 44function extractFirstName(fullName){if(!fullName||typeof fullName!=='string')return fullName;var firstName=fullName.trim().split(' ')[0];console.log('âï¸ Extracted first name:',firstName,'from:',fullName);return firstName} 45container.on('click','.logout',function(e){console.log('ðª SDK LOGOUT CLICKED! SDK should handle this automatically...')});container.on('click','.loginButton.login',function(e){console.log('ð±ï¸ LOGIN BUTTON CLICKED! (loggedOut handler)');if($(this).prop('disabled')){console.log('â ï¸ Login button is disabled - SDK not ready yet');e.preventDefault();return!1} 46console.log('â Login button enabled - letting SDK handle the click')});$(document).keydown(function(e){if(e.key==='Escape'){var iframe=document.getElementById('iframe')||document.getElementById('lms-iframe');if(iframe&&iframe.style.display==='block'){console.log('ðª ESC pressed - closing iframe');
46iframe.style.display='none';console.log('ðª Iframe closed via ESC key')}}});$(document).on('click',function(e){var iframe=document.getElementById('iframe')||document.getElementById('lms-iframe');if(iframe&&iframe.style.display==='block'){if(e.target===iframe){console.log('ðª Clicked outside iframe content - closing');iframe.style.display='none';console.log('ðª Iframe closed via outside click')}}});checkAuthStatus()}})(jQuery)
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.