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 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); } } } var user_cookie = '???'; var currentUser = null; function loaduser(callback) { user_cookie = getCookie("user"); console.log('cookie:' + user_cookie); $.post( "/getuser", {'cookie' : user_cookie }, function( data ) { console.log('getuser:' + data); var userData = JSON.parse(data); currentUser = userData; console.log('userData:' + userData); console.log('*cookie:' + user_cookie); setCookie('user', userData['cookie'], 7); setUser(userData['cookie']); 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 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(); } 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(); }*/ location.reload(); }); } function is_defined(obj, prop) { var value = obj[prop]; if (typeof value === "undefined" || value === null) { return false; } return true; } function showSignInModal() { let htmlBlob = `
×

Signin using your Google account, to access your profile from multiple devices

`; if (!document.getElementById('common-sign-modal')) { let style = document.createElement('style'); style.type = 'text/css'; style.innerHTML = ` .signin-modal { display: none; /* Hidden by default */ position: fixed; /* Stay in place */ z-index: 10000; /* Sit on top */ left: 0; top: 0; width: 100%; /* Full width */ height: 100%; /* Full height */ overflow: auto; /* Enable scroll if needed */ background-color: rgb(0,0,0); /* Fallback color */ background-color: rgba(0,0,0,0.4); /* Black w/ opacity */ } .signin-modal-content { background-color: #fefefe; margin: 15% auto; /* 15% from the top and centered */ padding: 20px; border: 1px solid #888; max-width: 300px; width: 80%; /* Could be more or less, depending on screen size */ position: relative; /* To position the close button inside */ } .signin-close { color: #aaa; position: absolute; top: 10px; right: 15px; font-size: 28px; font-weight: bold; cursor: pointer; } .signin-close:hover, .signin-close:focus { color: black; text-decoration: none; cursor: pointer; } `; // Append the style to the head document.head.appendChild(style); // document.body.insertAdjacentHTML('beforeend', htmlBlob); } console.log('showing signin modal'); var signModal = document.getElementById("common-sign-modal"); signModal.style.display = "block"; } function closeSignInModal() { var signModal = document.getElementById("common-sign-modal"); signModal.style.display = "none"; } var twink_busy_loading = false; let progressShift = 40; function beginProgress() { const element = document.getElementById('twink-progress-bar2'); if (element) { element.style.display = 'block'; } $("#twink-progress").css("width", progressShift); $('#twink-progress').html('started'); } function endProgress() { $("#twink-progress").css("width", 0); $('#twink-progress').html(''); const element = document.getElementById('twink-progress-bar2'); if (element) { element.style.display = 'none'; } } function executeJob(url, params, postProc) { if (twink_busy_loading) return; var header = ''; beginProgress(); // closeGenModal(); console.log('showing progress bar'); $.post(url, params, function(response) { console.log('resp:' + response); var parts = response.split('|'); var jobid = parts[0]; if (jobid == 'no_tokens') { $('#progress-text').html('No more tokens available. Buy more'); return; } var timeout = 100; var multiplier = (300.0 - progressShift) / timeout; var max_trial = timeout; var interval = setInterval(function() { console.log('async_get_resp:' + max_trial); if (max_trial > 0 ) { if ((max_trial % 4) == 0) { $.post('/api/async_get_resp', { 'jobid': jobid }, function(job_resp_text) { job_resp = JSON.parse(job_resp_text); console.log('text:' + job_resp_text); console.log('json:' + job_resp) var ts = job_resp['ts'] if (ts > 0) { resp = JSON.parse(job_resp['response']); console.log(resp); if (postProc) { postProc(resp); } clearInterval(interval); endProgress(); } else { } }); } $('#twink-progress').html(header + '' + max_trial.toString() + 's'); max_trial--; $("#twink-progress").css("width", (timeout - max_trial) * multiplier + progressShift); } else { $('#twink-progress').html('seems our servers are busy, sorry!'); clearInterval(interval); } }, 1000); }); } function waitJobResponse(jobID, callback) { }