PageSourceSearch

https://www.medexamexpert.com/wp-content/cache/breeze-minification…js-lms-login-b3788d02974d.js?ver=1791102119

js medexamexpert.com collected 2026-10-04 15:14:36 UTC 17,505 bytes, 46 lines download raw bytes

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.