/** * auth.js - keeper of the grounds * Basic bits to verify user login and present * appropriate UI when necessary. */ var authNS = odkmaker.namespace.load('odkmaker.auth'); var controlId = ""; var rowIndex = -1; var currentTabName = ""; var formBuilderLoaded = false; var index = 0; var record_Index = 0; var record_Id = ''; var tmpRow = ""; var tmpHeader = ""; var curPagingNum = 20; var curPagingControl = 1; var emptyData = false; var editting = false; var entityKey = ''; var userPrivilege = 2; // default readOnly privilege var lastInfoColCount = 4; var noControlColCount = 2; var sortFlag = 1; // default descending value for sorting var sortField = ''; var topGroupTree = ''; var curGroupChild = ''; var curGroupTop = ''; var fbconstraints = {}; // form builder controls object var jsonGroupTree = {}; var jsonGroupInputedIndex = {}; var curUploadedMedia = ''; var popup; var dispatchImportKey = ''; var dispatchImportHeaders = []; var removeOptionsObj = []; var dropDownBackUpObj = []; var dropDownQueryObj = []; var availableMobileUnit = 1; var mobileUnitSupport = 1; var mobileUnitLeft = 1; var mobileUnitDataLoad = 0; var addRowNum = 20; var validateMsg = ''; var dispatchKinds = ['@Status','@MobileNumber','@Nickname']; var schedule = '@Schedule'; var dispatchStatus = [sts_pending, sts_sent, sts_schedule, sts_received, sts_viewed, sts_rejected, sts_completed]; var mediaKinds = [mdi_kind_image, mdi_kind_sketch, mdi_kind_signature, mdi_kind_audio, mdi_kind_video, mdi_kind_inputImage, mdi_kind_inputSketch, mdi_kind_inputSignature, mdi_kind_inputAudio, mdi_kind_inputVideo]; var pageNum = 1; var totalRecord = 0; var deleteSelectedRecordsFlg = 0; var timerInterval = 60000; var beginCheckingIndex = 4; var formRecordName = ''; var medias = ''; var lkCheckListIndex = 0; var selectedProjectKey = ''; var projectName = ''; var formId = ''; var formName = ''; var jsonSelect = {}; var jsonScore = {}; var jsonCateScore = {}; var jsonDispatchColor = {}; var dispatchColorKey = ''; var jsonHeadersFull = {}; var mapFieldsSumary = []; var arrHiddenFields = []; var jsonMediaStorage = {}; var jsonLookupDatasource = {}; var jsonLKDS = {}; // lookup datasource var jsonLKAll = {}; var lkGroup = {}; var jsonFTCount = {}; var edittingKey = ''; var recordMapKey = ''; var jsonImportMobiles = {}; var jsonMInfo = {}; var jsonCurrency = {}; var arrScoreTableQuestion = []; //------------- Dispatch Recurring ------------- var jsonDaysInWeek = []; var removeRecurringFlg = false; // ------------- Fixed table ------------- var jsonFTLKDS = {}; var jsonFixedTable = {}; var jsonCalFTable = {}; var jsonFTData = {}; var curFTable = ''; var ftAction = 'view'; //------------- Fixed table ------------- var facingsCurRow = {}; var facingsStoreIdFilter = ''; var jsonFacingsData = {}; // export config variables var unitConfigKey = ''; var unitConfigJson= {}; // display config variables var displaySettingUnitKey = ''; var displaySettingUnitConfig = {}; var totalImportRecord = 0; var posisionIndex = 0; var queryLKFtableFlg = false; var osm_canvas; var jsonRecordGroup = {}; var jsonFieldValue = []; var jsonFieldObj = {}; var curLoop = 1; var groupEltDeleteFlg = true; var timeZone = ' UTC'; var lookupTableObj = {}; var lookupRecordId = ""; var lookupAction = "submit"; var lookupBlobKey = ''; var lookupOldBlob = ''; var lookupTotalRow = ''; // The current progress position row var lookupCurrentPosition = '0'; var lookupUploaded = false; var emailReportFlg = false; var changeNewFormFlg = false; var dispatchViewFlg = false; var dataViewFlg = false; var dispatchAddFirstFlg = false; var filterFlag = false; var needToConfirm = false; var needToConfirmFV = false; var imageLabelFlg = false; var dispatchFlg = false; var closedSocket = true; var fvWatchDog = false; var approvalOptionPending = 'pending'; //var approvalOptionPending_us_date = 'pending un_date'; var approvalOptionApproved_us_date = 'approved un_date'; var approvalOptionRejected_us_date = 'rejected un_date'; var approvalOptionTextPending = 'pending '; //var approvalOptionTextPending_us_date = 'pending '; var approvalOptionTextApproved_us_date = 'approved '; var approvalOptionTextRejected_us_date = 'rejected '; var LOOKUP_DS_MAX_SIZE = (3 * 1024 * 1024) ;//3072000; // 3Mb // MIN/MAX values var LONG_MIN_VALUE = -9223372036854775807; var LONG_MAX_VALUE = 9223372036854775807; var DECIMAL_MIN_VALUE = -49000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000; var DECIMAL_MAX_VALUE = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000; //Mobile branding constant var FINAL_PARAM_TABLET_LOGO = "tabletLogo"; var FINAL_PARAM_MOBILE_BANNER_COLOR = "baner_mobile_background_color"; var FINAL_PARAM_SMARTPHONE_BRANDING_TEXT = "smartphone_branding_text"; var FINAL_PARAM_SMARTPHONE_BRANDING_TEXT_COLOR = "smartphone_branding_text_color"; function setDirtyFlag(isFV) { if(isFV){ needToConfirmFV = true; }else{ needToConfirm = true; } } function releaseDirtyFlag(isFV) { if(isFV){ needToConfirmFV = false; }else{ needToConfirm = false; } } window.onbeforeunload = confirmExit; function confirmExit() { if (needToConfirm){ return lbl_etfmcutlauc; } } var isIE = function(){ var ie = false; var ua = navigator.userAgent.toLowerCase(); if ( ua.indexOf( "opera" ) != -1 ) { browserName = "opera"; } else if ( ua.indexOf( "msie" ) != -1 ) { browserName = "msie"; ie = true; } else if ( ua.indexOf( "edge" ) != -1 ) { browserName = "edge"; ie = true; } else if ( ua.indexOf( "trident" ) != -1 ) { browserName = "trident"; ie = true; } else if ( ua.indexOf( "safari" ) != -1 ) { browserName = "safari"; } else if ( ua.indexOf( "mozilla" ) != -1 ) { if ( ua.indexOf( "firefox" ) != -1 ) { browserName = "firefox"; } else { browserName = "mozilla"; } } return ie; } var getControlUploadSize = function(control){ var uploadSize = 0; if(isIE()) { // IE //uploadSize = control._input.document.fileSize; } else { // Netscape/Firefox/Opera uploadSize = control._input.files[0].fileSize; } if(uploadSize == undefined) uploadSize = 0; return uploadSize; } var loadCounter = function(){ $.ajax({ url: '/homepage/savingsInfo', dataType: 'json', type: 'GET', data: '{}', cache: false, complete: function() { }, success: function(response, status) { $('.footer .parameter_more .savingscash').text(response.savingscash); $('.footer .parameter_more .savingsco2').text(response.savingsco2); $('.footer .parameter_more .savingstree').text(response.savingstree); }, error: function(request, status, error) { if(getStatus(request) == 401){ jAlert(msg_read_permission_required); } } }); } /************************************************************************************ * Get query string (from parameters of HTML) * Ripped from function getQuerystring(key) in auth.js ************************************************************************************/ function getQuerystring(key) { key = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); var regex = new RegExp("[\\?&]" + key + "=([^&#]*)"); var qs = regex.exec(window.location.href); if(qs == null) return ''; else return qs[1].replace(/%20/g," "); } /************************************************************************************ * Function for tab bar * start ************************************************************************************/ var tabChange = function(tabActive){ //Channel if(tabActive == currentTabName) { if(tabActive == '.homepage'){ $('.viewDataLink').removeClass('selected').end(); } // return false; } if(tabActive == '.inputDataLink'){ if(!$('.webapp_main_content').hasClass(CONST_CSS_CLASS_HIDE_SESSION)){ $('.webapp_main_content').addClass(CONST_CSS_CLASS_HIDE_SESSION).end(); } if(!$('.footer').hasClass('modal')){ //$('.footer').addClass('modal').end(); } $('.formView').removeClass(CONST_CSS_CLASS_HIDE_SESSION).end(); } if(tabActive != '.homepage'){ $(tabActive).addClass('selected').end(); } $('.webapp_main_content').empty(); currentTabName = tabActive; return true; }; /************************************************************************************ * Function for tab bar * end ************************************************************************************/ /************************************************************************************ * Function for form view * start ************************************************************************************/ var formView = function(event) { _.each($('.header .menu ul.submenu'), function(item){ $('.submenu').slideUp('fast'); }); }; /************************************************************************************ * Function for form view * End ************************************************************************************/ $('.inputDataLink').click(function(event) { if(tabChange('.inputDataLink')){ formView(event); } }); /** * Init all component on window loading */ function initOnWindowLoad4WA() { if(!validateUserSession()){ return; } // Initialize all data for Web Apps initAll4PrintDataWebApps(); // Init event for WebApps initEvent4HighlightLocation(); // Fix bug 0020771: Show icon "Save&Send" and "Save&Schedule" on menu after log on Web App by Mobile Unit try { // Process show/hide selected buttons var isDispatchRequest = getQuerystring('isDispatchRequest'); writeToLogInfoRequired('isDispatchRequest : ' + isDispatchRequest); var objQueryIcons = $('#fvmain_menu li.liFvSaveAndSend,#fvmain_menu li.liFvSaveAndSchedule'); if (isDispatchRequest === CONST_VALUE_TRUE_STR) { // Show the Show icon "Save&Send" and "Save&Schedule" objQueryIcons.css(CONST_CSS_KEY_DISPLAY, 'inline-block'); // CO-2377 if(webAppDispatch) { $('#fvmain_menu li.liFvSaveLink').addClass('dispatchFormView'); } // CO-2377 } else { objQueryIcons.hide(); $('#fvmain_menu li.liFvSaveLink').removeClass('dispatchFormView'); // CO-2377 } if(false == canSchedule) { $('#fvmain_menu li.liFvSaveAndSchedule').hide(); $('#fvmain_menu li.liFvSaveLink').removeClass('dispatchFormView'); // CO-2377 } } catch (e) {} } var signinSuccessful = function(response, status) { $('.accountStatus') .empty() .append(lbl_account + ': ' + authNS.currentUser.Account + ' | Mobile Number: ' + authNS.currentUser.MobileNumber + ' | ' + lbl_signout + '') .fadeIn('slow'); $('.accountStatus').find('.logoutLink').click(function(event){ /* fix bug auto login when use link /webapp parent.$.fancybox.close();*/ parent.window.location.replace("/formview/logout"); }) isLogoExist(); if(tabChange('.inputDataLink')){ formView(); } fvMainMenuGraphicsStyleUpdate(); initMainMenuIcon(); initMMBIcon(authNS.currentUser.mb_mbb_icon_order, '.fvWorkspaceScrollArea .mainMenuBarScroll'); initFVMMBIcon(); if(authNS.currentUser.assMainMenuGraphicsStyle == 'Banner'){ //$('.getStartedInfo .mainMenuBarScroll').addClass(CONST_CSS_CLASS_HIDE_SESSION); } if(authNS.currentUser && authNS.currentUser.assShowDisclaimer){ var html = '
' + authNS.currentUser.assDisclaimerMessage + '
'; html += '
Dismiss.
'; var isShowDisclaimer = false; if(getStoreData("Alert_Not_Show_Disclaimer") == null || getStoreData("Alert_Not_Show_Disclaimer") != authNS.currentUser.assDisclaimerMessageVer){ isShowDisclaimer = true; } if(isShowDisclaimer){ jConfirm(html,'Alert',function(result, data){ if(!result) return false; if(data['dontShow']){ storeData("Alert_Not_Show_Disclaimer", authNS.currentUser.assDisclaimerMessageVer, { expires: 365 }); } }, {hideButtonCancel: true}); } } /* hqkhanh fix Steps to reproduce: We need this fixed tonight. Customer can see into other projects / forms on the web client in their account. Function: a) If a user is assigned to multiple accounts, have the mobile select the account b) Upon sign-on to an account, a mobile should ONLY SEE forms that are assigned to them in the projects on that account. if(authNS && authNS.currentUser && authNS.currentUser.assBehaviorSkipAutoUpd){ getFVDBInfo(); }else{ updateFVDBInfo(); } */ //webclient alway update when start up setTimeout(function(){ fvOpenChannelRefresh(); updateFVDBInfo(); }, 1000); fvWatchDog = false; // reset value }; authNS.verify = function(callback) { // Get current user status from server $.ajax({ url: '/clientMobileSetup?fnId=GET_INF', dataType: 'json', type: 'GET', data: '{"fnId":"GET_INF"}', cache: false, complete: function() { setTimeout(function() { $('.loadingScreen') .fadeOut('normal', function() { $(this).remove(); }); $('.preloadImages').remove(); }, 200); // give a bit of extra time in case the load was instantaneous }, success: function(response, status) { authNS.currentUser = response; if(authNS.currentUser && authNS.currentUser.defaultProject){ storeData("wc_prj_key", authNS.currentUser.defaultProject); } if(authNS && authNS.currentUser && authNS.currentUser.dateFormat == 'dd/MM/yyyy'){ DEFAULT_DATE_FORMAT = "dd/mm/yyyy"; } if(authNS && authNS.currentUser && authNS.currentUser.timeFormat == 'hh:mm aa'){ DEFAULT_TIME_FORMAT_12H = "hh:MM TT"; DEFAULT_TIME_FORMAT_24H = "HH:MM"; } DEFAULT_DATE_TIME_FORMAT_12H = DEFAULT_DATE_FORMAT + ' ' + DEFAULT_TIME_FORMAT_12H; DEFAULT_DATE_TIME_FORMAT_24H = DEFAULT_DATE_FORMAT + ' ' + DEFAULT_TIME_FORMAT_24H; (callback || signinSuccessful)(response, status); }, error: function(request, status, error) { authNS.currentUser = null; if(getStatus(request) == ERROR_CODE_MOBILE_UNIT_LOCKED){ jAlert(err_mobile_locked,'',function(){ window.parent.location.replace("/indexfv.html"); }); }else{ window.location.replace("/indexfv.html"); } } }); }; $(function() { $.extend({ getUrlVars: function(){ var vars = [], hash; var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'); for(var i = 0; i < hashes.length; i++) { hash = hashes[i].split('='); vars.push(hash[0]); vars[hash[0]] = hash[1]; } return vars; }, getUrlVar: function(name){ return $.getUrlVars()[name]; } }); const urlParams = new URLSearchParams(window.location.search); const projectFormKey = urlParams.get('projectFormKey'); if(projectFormKey) { storeData('projectFormKey', projectFormKey); } if(previewFormKey == '' && !isWADispatchPlus()){ authNS.verify(); }else{ setTimeout(function() { $('.loadingScreen') .fadeOut('normal', function() { $(this).remove(); }); $('.preloadImages').remove(); }, 200); // give a bit of extra time in case the load was instantaneous } }); var tablet_logo = true; var isLogoExist = function(){ $.ajax({ url: '/account/AccountSelectServlet?isExistLogo=1&checkFirebase=' + authNS.currentUser.MobileKeyNew, dataType: 'json', type: 'POST', data: '{}', cache: false, complete: function() { }, success: function(response, status) { if(response['doformIconColor'] != undefined){ doformIconColor = response['doformIconColor']; } tablet_logo = response[FINAL_PARAM_TABLET_LOGO]; if(tablet_logo == undefined || tablet_logo == null || tablet_logo == false){ $('#main_menu .logo img').attr('src','../img/' + LOGO_FILE + '?x=' + (new Date())); } else { $('#main_menu .logo img').attr('src','/customer/customerlogo?type=TABLET&x=' + new Date()); $('#main_menu .logo').addClass('logocustomer'); } if(response.baner_mobile_background_color != undefined){ setBannerColor(response.baner_mobile_background_color); authNS.currentUser.bacgroundColor = response.baner_mobile_background_color; } else { setBannerColor('default'); authNS.currentUser.bacgroundColor = 'default'; } authNS.currentUser.mobileBacgroundColor = response[FINAL_PARAM_MOBILE_BANNER_COLOR]; authNS.currentUser.mobileBrandingText = response[FINAL_PARAM_SMARTPHONE_BRANDING_TEXT]; authNS.currentUser.mobileBrandingTextColor = response[FINAL_PARAM_SMARTPHONE_BRANDING_TEXT_COLOR]; // CO-2078 var fvCustomStyleForWebIconColor = '#fvmain_menu .svgIconContainer {display: inline-block;} '; switch(!undefined) {// CO-2050 case (response.website_icon_color != undefined) : // CO-2051 Add custom style for icon color fvCustomStyleForWebIconColor += '.svg-icon svg path {fill: ' + response.mmbHeaderIconColor + ';}'; fvCustomStyleForWebIconColor += '.svg-label {color: ' + response.mmbHeaderIconColor + ';}'; // CO-2051 Add custom style for icon color // CO-2050 // CO-2078 /* case (response.website_active_icon_color != undefined) : // CO-2051 Add custom style for icon color fvCustomStyleForWebIconColor += '.svgIconContainer:hover .svg-label {color: ' + response.website_active_icon_color + ';}'; fvCustomStyleForWebIconColor += '.svgIconContainer:hover .svg-icon svg path {fill: ' + response.website_active_icon_color + ';}'; fvCustomStyleForWebIconColor += '.svgIconContainer .svg-label.selected {color: ' + response.website_active_icon_color + ';}'; */ $('#fvCustomStyleForWebIconColor').html(fvCustomStyleForWebIconColor); // CO-2051 Add custom style for icon color } // CO-2078 // CO-877: Convert from Channels to FireBase try{ if(response.firebaseToken != undefined){ firebasePath = CONST_FIREBASE_DB_1_USERS + '/' + CONST_FIREBASE_DB_2_MOBILES + '/' + authNS.currentUser.MobileKeyNew; initFirebase(response.firebaseToken, ''); } } catch(e) {} }, error: function(request, status, error) { $('#main_menu .logo img').attr('src','../img/' + LOGO_FILE + '?x=' + (new Date())); if(getStatus(request) == 401){ jAlert(msg_read_permission_required); }else{ jAlert(msg_error_load_logo); } } }); return tablet_logo; } var setBannerColor = function(color){ if(color != 'default') { $('#header .whoslogged a').attr('style','background-color: none !important;'); $('#header .whoslogged a').attr('style','border-color:none !important;'); $('#header .whoslogged').attr('style','color:none !important;'); $('#header .whoslogged a').attr('style','color:none !important;'); /* Fix bug bottom scroll */ /*$('#header').attr('style','background-color: none !important;');*/ $('#header').css('background-color', 'none !important;'); $('#header .whoslogged a').off('mouseout').off('mouseover'); } else { $('#header .whoslogged a').css('background-color', BANNER_INFO_COLOR); $('#header .whoslogged a').css('border-color', BANNER_INFO_BORDER_COLOR); $('#header .whoslogged').css('color',BANNER_INFO_TEXT_COLOR); $('#header .whoslogged a').css('color',BANNER_INFO_TEXT_COLOR); $('#header').css('background-color', BANNER_COLOR); if(!BANNER_GRADIENT) { $('#body_contain #header .gradient_class').removeClass('gradient'); } $('#header .whoslogged a').mouseout(function() { $(this).css('background-color', BANNER_INFO_COLOR); $(this).css('border-color', BANNER_INFO_BORDER_COLOR); }); $('#header .whoslogged a').mouseover(function() { $(this).css('background-color', BANNER_INFO_MOUSEOVER_COLOR); $(this).css('border-color', BANNER_INFO_MOUSEOVER_COLOR); }); } if(color != 'default') { $('#header .whoslogged a').attr('style','background-color: none !important;'); $('#header .whoslogged a').attr('style','border-color:none !important;'); /* Fix bug bottom scroll */ /*$('#header').attr('style','background-color: none !important;');*/ $('#header').css('background-color', 'none !important;'); $('#header .whoslogged a').off('mouseout').off('mouseover'); } if(color == 'FFFFFF') { $('#body_contain #header').addClass('whiteBanner'); $('#body_contain #header .whoslogged').addClass('whiteBanner'); $('#body_contain #header .gradient_class').removeClass('gradient'); } else if(color == 'FFFFFF'){ $('#body_contain #header').addClass('whiteBanner'); $('#body_contain #header .whoslogged').addClass('whiteBanner'); $('#body_contain #header .gradient_class').addClass('gradient'); } else { $('#body_contain #header').removeClass('whiteBanner'); $('#body_contain #header .whoslogged').removeClass('whiteBanner'); $('#body_contain #header .gradient_class').addClass('gradient'); if(!BANNER_GRADIENT && color == 'default') { $('#body_contain #header .gradient_class').removeClass('gradient'); } } }