function getHashCode(str) { let hash = 0; if (str.length === 0) return hash; for (let i = 0; i < str.length; i++) { const char = str.charCodeAt(i); hash = (hash << 5) - hash + char; hash = hash & hash; // Convert to 32bit integer } return hash; } function randomString(n) { const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; let result = ''; for (let i = 0; i < n; i++) { result += chars.charAt(Math.floor(Math.random() * chars.length)); } return result; } function logincallback() { } function setCookie(c_name, value, exdays) { var exdate = new Date(); exdate.setDate(exdate.getDate() + exdays); var c_value = escape(value) + ((exdays == null) ? "" : "; expires=" + exdate.toUTCString()); document.cookie = c_name + "=" + c_value; user_cookie = getCookie("user"); } function getCookie(c_name) { var i, x, y, ARRcookies = document.cookie.split(";"); for (i = 0; i < ARRcookies.length; i++) { x = ARRcookies[i].substr(0, ARRcookies[i].indexOf("=")); y = ARRcookies[i].substr(ARRcookies[i].indexOf("=") + 1); x = x.replace(/^\s+|\s+$/g, ""); if (x == c_name) { return unescape(y); } } } function setUserIdCookie(userId) { const days = 7; // expiration (1 year) const expires = new Date(Date.now() + days * 864e5).toUTCString(); document.cookie = `user_id=${encodeURIComponent(userId)}; path=/; expires=${expires}; SameSite=Lax`; } function getUserIdCookie() { const match = document.cookie.match(/(?:^|;\s*)user_id=([^;]*)/); var cj = match ? decodeURIComponent(match[1]) : null; return cj; } var user_cookie = '???'; var currentUser = null; var currentUserProfile = null; function loaduser(callback) { user_cookie = getUserIdCookie(); console.log('+++ cookie:', user_cookie); $.post( "/getuser", {'cookie' : user_cookie, 'login' : 'true' }, function( data ) { console.log('getuser:' + data); var userData = JSON.parse(data); currentUser = userData; console.log('userData:', userData); user_cookie = userData['cookie']; console.log('*cookie:', user_cookie); setUserIdCookie(userData['cookie']); setUser(userData['cookie']); try { console.log('sending data to android:', userData.cookie); let data = { type : 'UserCookie', cookie: userData.cookie }; AndroidInterface.saveString(JSON.stringify(data)); } catch (error) { console.log('AndroidInterface.saveString error:', error); // Expected output: ReferenceError: nonExistentFunction is not defined // (Note: the exact output may be browser-dependent) } callback(userData); }); } function loadUserAndProfile(game_id = '', online_status='online', init_tokens=0, callback=null) { loaduser(ud => { console.log('+++ ud:', ud); $.post( "/api/user/profile/get", { 'user_id' : ud.cookie, 'init_tokens' : init_tokens, 'online_status' : online_status, }, function( up ) { console.log('+++ profile:', up); currentUserProfile = up; if (callback != null) { callback(ud, up); } }); }); } function setCurrentUser(userData, user_cookie, callback) { currentUser = userData; console.log('userData:', userData); console.log('*cookie:', user_cookie); setUserIdCookie(userData['cookie']); setUser(userData['cookie']); try { console.log('sending data to android:', userData.cookie); let data = { type : 'UserCookie', cookie: userData.cookie }; AndroidInterface.saveString(JSON.stringify(data)); } catch (error) { console.log('AndroidInterface.saveString error:', error); // Expected output: ReferenceError: nonExistentFunction is not defined // (Note: the exact output may be browser-dependent) } callback(userData); } function getuser(user_id, callback) { $.post( "/getuser", {'cookie' : user_id }, function( data ) { console.log('getuser:' + data); var userData = JSON.parse(data); callback(userData); }); } function formatNumber(val, decimals=1) { console.log('val=' + val); if (val === 0) return '0'; const k = 1000; const dm = decimals < 0 ? 0 : decimals; const sizes = ['', 'k', 'M', 'G']; const i = Math.floor(Math.log(val) / Math.log(k)); return parseFloat((val / Math.pow(k, i)).toFixed(dm)) + '' + sizes[i]; } function setUser(userid) { console.log('userid:', userid); $('#breed_post_user').val(userid); $('#new_post_user').val(userid); $('.usercomment').val(userid); } function calculate_ago($currentElement) { var val = parseFloat($currentElement.html()) * 1000; var diffstr = timeDifference(new Date().getTime(), val); $currentElement.html(diffstr); } function calculate_latency($currentElement) { var val = parseFloat($currentElement.html()) * 1000; var strval = val.toFixed(0) + ' milliseconds'; $currentElement.html(strval); } function calculate_size($currentElement) { var val = parseInt($currentElement.html()); var strval = formatBytes(val); $currentElement.html(strval); } function formatBytes(bytes, decimals = 2) { if (bytes === 0) return '0 Bytes'; const k = 1024; const dm = decimals < 0 ? 0 : decimals; const sizes = ['bytes', 'kb', 'mb', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; } function timeDifferenceNow(previous) { return timeDifference(new Date().getTime(), previous); } function timeDifference(current, previous) { var msPerMinute = 60 * 1000; var msPerHour = msPerMinute * 60; var msPerDay = msPerHour * 24; var msPerMonth = msPerDay * 30; var msPerYear = msPerDay * 365; var elapsed = current - previous; if (elapsed < msPerMinute) { return Math.round(elapsed/1000) + ' seconds ago'; } else if (elapsed < msPerHour) { return Math.round(elapsed/msPerMinute) + ' minutes ago'; } else if (elapsed < msPerDay ) { return Math.round(elapsed/msPerHour ) + ' hours ago'; } else if (elapsed < msPerMonth) { return ' ' + Math.round(elapsed/msPerDay) + ' days ago'; } else if (elapsed < msPerYear) { return ' ' + Math.round(elapsed/msPerMonth) + ' months ago'; } else { return ' ' + Math.round(elapsed/msPerYear ) + ' years ago'; } } function onclick_checktime() { var timestate = event.srcElement.getAttribute('timestate'); var timevalue = event.srcElement.getAttribute('timevalue'); timevalue = parseFloat(timevalue) * 1000; if (timestate == 'relative') { timestate = 'utc'; timevalue = new Date(timevalue).toISOString().slice(0, 19).replace('T', ' ') + ' UTC'; } else if (timestate == 'utc') { timestate = 'local'; var dt = new Date(timevalue); timevalue = dt.toLocaleString() + ' ' + dt.toLocaleTimeString('en-us',{timeZoneName:'short'}).split(' ')[2]; } else if (timestate == 'local') { timestate = 'relative'; timevalue = timeDifference(new Date().getTime(), timevalue); } event.srcElement.setAttribute('timestate', timestate); event.srcElement.innerHTML = timevalue; } function eraseCookie(name) { document.cookie = name + '=; Max-Age=0' } function deleteCookie(cookieName) { console.log('delete cookie:' + cookieName); document.cookie = cookieName + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; } function logout() { deleteCookie('user'); eraseCookie('user'); window.location.reload(); } let handleCredentialResponseCB = null; function handleCredentialResponse(response) { console.log('resp:' + response); $.post( "/signin", {'jwt' : response.credential }, function( data ) { // $( ".result" ).html( data ); console.log('jwt:' + data); var userData = JSON.parse(data); setCookie('user', userData['cookie'], 7); /*if (userData['strata'] == 'Z') { post_sign_in(userData, user_cookie); } else { $('#sign_in_button').show(); }*/ if (handleCredentialResponseCB == null) { location.reload(); } else { handleCredentialResponseCB(ud); } }); } function is_defined(obj, prop) { var value = obj[prop]; if (typeof value === "undefined" || value === null) { return false; } return true; } function init() { var dpad = document.getElementById("flagModal"); if (!dpad) { let htmlBlob = `

Flag Content

`; document.body.insertAdjacentHTML('beforeend', htmlBlob); } } var modal0CreateCallback = null; function showModal0( title='New Project', contentHtml='', createCallback=null) { $('#modal0-title').html(title); $('#modal0-content').html(contentHtml); modal0CreateCallback = createCallback; document.getElementById('modal0').style.display = 'flex'; } function hideModal0() { document.getElementById('modal0').style.display = 'none'; } function createModal0() { hideModal0(); if (modal0CreateCallback != null) { modal0CreateCallback(); } } let flagID = ''; function flagpopup(id) { $('#flagModal').show(); flagID = id; $('#' + flagID).css('background-color', 'red'); // $('#' + id).remove(); } function sendFlag() { $('#flagModal').hide(); $('#' + flagID).remove(); } function closeFlagPopup() { $('#flagModal').hide(); } function copyToClipboard(divID) { const content = document.getElementById(divID).innerText; navigator.clipboard.writeText(content).then(() => { const message = document.getElementById(`copiedMessage-${divID}`); message.classList.add('show'); setTimeout(() => { message.classList.remove('show'); }, 2000); }).catch(err => { console.error('Failed to copy: ', err); }); } function shuffleArray(array) { for (let i = array.length - 1; i > 0; i--) { // Generate a random index j between 0 and i (inclusive) const j = Math.floor(Math.random() * (i + 1)); // Swap elements at indices i and j [array[i], array[j]] = [array[j], array[i]]; } return array; } console.log('common.js loaded'); const faceGroupMap = { 'main' : { sources: ['newsface'], actions: ['gender', 'race', 'ethnicity'], feeds: ['news'], indexes: ['faceid', 'celeb', 'kpop'], title: 'FaceHist - Free Face Analyzer' }, '' : { sources: ['newsface'], indexes: ['india_celeb', 'faceid', 'celeb', 'kpop'], actions: ['gender', 'race', 'ethnicity'], feeds: ['india_celeb'], title: 'FaceHist - Free Face Analyzer' }, 'face0' : { sources: ['brface'], indexes: ['faceid', 'celeb', 'kpop'], actions: ['search'], feeds: ['kpop'], title: 'Find my Face' }, 'faceid' : { sources: ['faceid'], actions: ['search'], indexes: ['faceid', 'celeb', 'kpop'], feeds: ['kpop'], title: 'Find my Face' }, 'kpop' : { sources: ['kpop'], indexes: ['kpop', 'celeb', 'faceid'], actions: ['search'], feeds: ['kpop'], title: 'Find KPop Star' }, } function sendEvent(stream_id, user, event, metadata={}) { $.post( "/api/stream/event", { 'stream_id' : stream_id, 'user' : user, 'event' : event, 'metadata' : JSON.stringify(metadata), }, function( data ) { console.log('api/stream/event:', data); }); }