hosting/server/htdocs/index.html (609 lines of code) (raw):

<!DOCTYPE html> <!-- * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. --> <html> <head> <!-- Firebug inspector --> <!-- <script type="text/javascript" src="https://getfirebug.com/releases/lite/1.3/firebug-lite.js"></script> --> <!-- Weinre inspector --> <!-- <script src="http://www.example.com:9998/target/target-script-min.js#anonymous"></script> --> <title></title> <meta name="viewport" content="user-scalable=no, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0"/> <meta name="apple-mobile-web-app-capable" content="yes"/> <meta name="apple-mobile-web-app-status-bar-style" content="black"/> <link rel="apple-touch-icon-precomposed" href="/public/touchicon.png"/> <base href="/"/> <script type="text/javascript"> try { (function roothead() { window.appcache = {}; /** * Get and cache a resource. */ appcache.get = function(uri, mode) { var h = uri.indexOf('#'); var u = h == -1? uri : uri.substring(0, h); // Get resource from local storage first var ls = window.lstorage || localStorage; if (mode != 'remote') { var item = null; try { item = ls.getItem('ui.r.' + u); } catch(e) {} if (item != null && item != '') return item; if (mode == 'local') return null; } // Get resource from network //if (window.debug) debug('appcache.get', u); var http = new XMLHttpRequest(); http.open("GET", mode == 'remote'? (u + '?t=' + new Date().getTime() + '&r=' + Math.random()) : u, false); http.setRequestHeader("Accept", "*/*"); http.send(null); if (http.status == 200) { var xl = http.getResponseHeader("X-Login"); if (xl != null && xl != '') { if (window.debug) debug('http error', u, 'X-Login'); // Redirect to login page if not signed in document.location = '/login/'; return null; } var ct = http.getResponseHeader("Content-Type"); if (http.responseText == '' || ct == null || ct == '') { if (window.debug) debug('http error', u, 'No-Content'); return null; } try { ls.setItem('ui.r.' + u, http.responseText); } catch(e) {} return http.responseText; } if (window.debug) debug('http error', u, http.status, http.statusText); // Redirect to login page if not signed in if (http.status == 403) document.location = '/login/'; return null; }; appcache.remove = function(uri) { var h = uri.indexOf('#'); var u = h == -1? uri : uri.substring(0, h); var ls = window.lstorage || localStorage; try { ls.removeItem(u); } catch(e) {} return true; }; })(); /** * Load Javascript and CSS. */ (function rootboot() { window.eval.call(window, 'try {\n' + appcache.get('/all-min.js') + '\n' + appcache.get('/config-min.js') + '\n} catch(e) { console.log(e.stack); throw e; }\n'); ui.includeCSS(appcache.get('/ui-min.css')); // Disable cache for testing //lstorage.enabled = false; })(); } catch(e) { if (window.debug) debug(e.stack); throw e; } </script> </head> <body class="delayed"> <div id="menucontainer" class="tbarmenu"> <div id="menu"></div> </div> <div id="viewheadcontainer" class="viewhead"> <div id="viewhead"></div> </div> <div id="working" class="working" style="display: none;"></div> <div id="viewcontainer"></div> <div id="viewfootcontainer" class="viewfoot"> <div id="viewfoot"></div> <div id="status"></div> </div> <div id="installer" class="installer"></div> <script type="text/javascript"> try { (function rootbody() { /** * Setup page layout. */ (function layout() { document.title = config.windowtitle(); $('viewcontainer').className = ui.isMobile()? 'viewcontainer3dm' : 'viewcontainer3d'; $('status').className = ui.isMobile()? 'status3dm' : 'status3d'; })(); /** * Initialize service references. */ var editorComp = sca.component("Editor"); var user = sca.defun(sca.reference(editorComp, "user")); var accounts = sca.reference(editorComp, "accounts"); /** * The current user name. */ window.username = 'anonymous'; /** * The current store category. */ var storecat = 'top'; var storeidx = 0; /** * The current search query. */ var searchquery = ''; /** * Populate cache with app resources. */ var appresources = [ ['/all-min.js'], ['/ui-min.css'], ['/account/', 9], ['/clone/', 4], ['/create/', 3], ['/delete/', 4], ['/graph/', 5], ['/config-min.js'], ['/home/', 0], ['/page/', 4], ['/public/app.b64'], ['/public/config-min.js'], ['/public/img.b64'], ['/public/rate.b64'], ['/public/ratings.b64'], ['/public/user.b64'], ['/rate/', 4], ['/search/', 2], ['/info/', 3], ['/store/', 1] ]; /** * Init status message area. */ (function initstatus() { if (isNull($('status'))) return; $('status').style.display = 'none'; function divtransitionend(e) { e.target.style.display = 'none'; e.target.className = ui.isMobile()? 'status3dm' : 'status3d'; e.target.error = false; } $('status').addEventListener('webkitTransitionEnd', divtransitionend, false); $('status').addEventListener('transitionend', divtransitionend, false); })(); /** * Show a status message. */ window.showstatus = function(s, c) { //debug('show status', s); if (isNull($('status')) || $('status').error) return s; $('status').innerHTML = '<span class="' + (c? c : 'okstatus') + '">' + s + '</span>'; $('status').className = ui.isMobile()? 'status3dm' : 'status3d'; $('status').style.display = 'block'; $('status').error = c == 'errorstatus'; if ($('status').delay) ui.cancelDelay($('status').delay); $('status').delay = ui.delay(function hidestatus() { $('status').className = ui.isMobile()? 'statusout3dm' : 'statusout3d'; $('status').error = false; }, 3000); return s; }; /** * Show an error message. */ window.errorstatus = function(s) { //debug('error', s); return showstatus(s, 'errorstatus'); }; /** * Show working status. */ window.workingstatus = function(w, c) { //debug('show working', w); if (isNull($('working'))) return w; if (!ui.isMobile()) $('working').style.top = ui.pixpos(Math.round(window.clientHeight / 2)); $('working').style.display = w? 'block' : 'none'; return w; }; /** * Show the online/offline status. */ window.onlinestatus = function() { return navigator.onLine? (ui.isMobile()? showstatus('Online') : showstatus('Online')) : errorstatus('Offline'); }; /** * Handle view transitions. */ var viewurl = ''; var viewuri = ''; var viewidx = 0; var viewdiv; /** * Record which transitions should be applied to each resource. */ var apptransitions = {}; map(function(res) { if (res.length > 1) apptransitions[res[0]] = res[1]; }, append(appresources, config.appresources())); /** * Return the transition that should be applied to a resource. */ function viewtransition(ouri, uri) { var ot = apptransitions[ouri]; if (isNull(ot)) return 'left'; var t = apptransitions[uri]; if (isNull(t)) return 'left'; return t < ot? 'right' : 'left'; } /** * Create a new view div. */ function mkviewdiv(cname) { var vdiv = document.createElement('div'); vdiv.className = cname; if (!ui.isMobile()) return vdiv; // Handle view transition end function viewdivtransitionend(e) { if (e.target.className == 'leftviewunloaded3dm' || e.target.className == 'rightviewunloaded3dm') e.target.parentNode.removeChild(e.target); } vdiv.addEventListener('webkitTransitionEnd', viewdivtransitionend, false); vdiv.addEventListener('transitionend', viewdivtransitionend, false); return vdiv; } /** * Return the last visited location. */ function lastvisited() { if (username != lstorage.getItem('ui.v.user')) return null; return lstorage.getItem('ui.v.url'); } /** * Build and show the menu bar. */ function showmenu(view, appname) { $('menu').innerHTML = ui.menubar( append(mklist(ui.menu('menuhome', 'Home', '/', '_view', view == 'home'), ui.menu('menustore', 'Store', '/#view=store&category=' + storecat + '&idx=' + storeidx, '_view', view == 'store'), ui.menu('menusearch', 'Search', '/#view=search&q=' + searchquery, '_view', view == 'search')), (isNull(appname) || appname == 'undefined')? mklist() : mklist( /* TODO disabled for now ui.menu('menuinfo', 'Info', '/#view=info&app=' + appname, '_view', view == 'info'), ui.menu('menupage', 'Edit', '/#view=page&app=' + appname, '_view', view == 'page'), ui.menu('menulogic', config.logic(), '/#view=graph&app=' + appname, '_view', view == 'graph'), ui.menu('menurun', '<span class="greentext" style="font-weight: bold">Run!</span>', '/' + appname + '/', '_blank', false) */ )), (true || isNull(appname) || appname == 'undefined')? mklist( ui.menufunc('menusignout', 'Sign out', 'return logout();', false), ui.menu('menuaccount', 'Account', '/#view=account', '_view', view == 'account')) : mklist()); $('viewfoot').innerHTML = config.viewfoot(); } /** * Get the current user's account. */ function getaccount() { var doc = accounts.get(); // Stop now if we didn't get an account if (doc == null) return false; var accountentry = car(elementsToValues(atom.readATOMEntry(mklist(doc)))); username = cadr(assoc("'id", accountentry)); return true; } /** * Show a view. */ function showview(url) { //debug('showview', url); // Save last visited location lstorage.setItem('ui.v.user', username); lstorage.setItem('ui.v.url', url); // Determine the view to show var params = ui.fragmentParams(url); var view = isNull(params['view'])? 'home' : params['view'];; var uri = '/' + view + '/'; var idx = isNull(params['idx'])? 0 : parseInt(params['idx']); // Track store category if (view == 'store') { storecat = isNull(params['category'])? 'top' : params['category']; storeidx = idx; } // Track search query if (view == 'search') searchquery = isNull(params['q'])? '' : params['q']; // Determine the transition to use var vtransition = uri == viewuri? (idx >= viewidx? 'left' : 'right') : viewtransition(viewuri, uri); // Track current view url and uri viewurl = url; viewuri = uri; viewidx = idx; // Show the menu bar var appname = params['app']; showmenu(view, appname); // Make sure that the document is visible if (document.body.style.display != 'block') document.body.style.display = 'block'; // Start to unload the front view and create a new view if (ui.isMobile()) { // Prepare current view for transition out var ovdiv = viewdiv; if (!isNull(ovdiv)) { ui.removeElementIDs(ovdiv); ovdiv.className = 'viewunloading3dm'; } // Load the requested doc into a new view var vdiv = mkviewdiv(vtransition + 'viewloading3dm'); var vdoc = appcache.get(uri); vdiv.innerHTML = vdoc; $('viewcontainer').appendChild(vdiv); ui.async(function mtransitionview() { // Transition the old view out if (!isNull(ovdiv)) ovdiv.className = vtransition + 'viewunloaded3dm'; // Transition the new view in vdiv.className = 'viewloaded3dm'; ui.async(function mtransitioneval() { map(ui.evalScript, ui.innerScripts(vdiv)); }); }); } else { // Prepare current view for transition out var ovdiv = viewdiv; if (!isNull(ovdiv)) ui.removeElementIDs(ovdiv); // Load the requested doc into the view var vdiv = mkviewdiv('viewloading3d'); var vdoc = appcache.get(uri); vdiv.innerHTML = vdoc; $('viewcontainer').appendChild(vdiv); ui.async(function transitionview() { // Transition the new view in vdiv.className = 'viewloaded3d'; // Transition the old view out if (!isNull(ovdiv)) ovdiv.parentNode.removeChild(ovdiv); ui.async(function mtransitioneval() { map(ui.evalScript, ui.innerScripts(vdiv)); }); }); } // Track the current visible view viewdiv = vdiv; return true; } /** * Update the browser window location. */ function updatelocation(url) { //debug('updatelocation', url); // Add url to the history if necessary if (url != ui.pathandparams(location)) { if (history.pushState) { history.pushState(null, null, url); //debug('pushstate', history.length); } // Update the location hash if necessary var f = ui.fragment(url); if (f != location.hash) { location.hash = f; //debug('hash', f); } } return url; } /** * Handle navigations. */ window.onnavigate = function(url) { //debug('onnavigate', url); // Cleanup installer if ($('installer').innerHTML != '') $('installer').innerHTML = ''; // Update the browser window location updatelocation(url); // Show the specified view if (url == viewurl) return true; return showview(url); }; /** * Handle login redirect. */ window.onloginredirect = function(e) { document.location = '/login/'; }; /** * Log the current user out. */ window.logout = function() { // Clear session cookie and user-specific local storage entries lstorage.removeItem('/r/Editor/accounts'); lstorage.removeItem('/r/Editor/dashboards'); document.location = '/logout/dologout/'; return false; }; /** * Handle history. */ window.addEventListener('popstate', function(e) { //debug('onpopstate', history.length); var furl = ui.fragment(location); var url = location.pathname + (furl == ''? '' : '#' + furl); if (url == viewurl) return true; // Cleanup element lookups memoized in current document ui.unmemo$(); // Show the current view return showview(url); }, false); window.addEventListener('hashchange', function(e) { //debug('onhashchange'); var furl = ui.fragment(location); var url = location.pathname + (furl == ''? '' : '#' + furl); if (url == viewurl) return true; // Cleanup element lookups memoized in current document ui.unmemo$(); // Show the current view return showview(url); }, false); /** * Handle orientation change. */ document.body.onorientationchange = function(e) { //debug('onorientationchange'); return ui.onorientationchange(e); }; /** * Install the application cache. */ (function installappcache() { if (ui.isMobile()) { // On mobile devices, trigger usage of an application cache manifest window.onappcachechecking = function(e) { //debug('appcache checking', e); workingstatus(true); showstatus('Checking'); }; window.onappcacheerror = function(e) { //debug('appcache error', e); onlinestatus(); workingstatus(false); }; window.onappcachenoupdate = function(e) { //debug('appcache noupdate', e); onlinestatus(); workingstatus(false); }; window.onappcachedownloading = function(e) { //debug('appcache downloading', e); workingstatus(true); showstatus('Updating'); }; window.onappcacheprogress = function(e) { //debug('appcache progress', e); workingstatus(true); showstatus('Updating'); }; window.onappcacheupdateready = function(e) { //debug('appcache updateready', e); try { applicationCache.swapCache(); } catch(e) {} onlinestatus(); workingstatus(false); //debug('appcache swapped', e); // Update offline resources in local storage and reload the page map(function(res) { showstatus('Updating'); appcache.remove(res[0]); appcache.get(res[0], 'remote'); }, append(appresources, config.appresources())); window.location.reload(); }; window.onappcachecached = function(e) { //debug('appcache cached', e); onlinestatus(); workingstatus(false); // Install offline resources in local storage map(function(res) { showstatus('Installing'); appcache.remove(res[0]); appcache.get(res[0], 'remote'); }, append(appresources, config.appresources())); }; window.onloadappcache = function() { //debug('appcache iframe loaded'); }; ui.async(function() { $('installer').innerHTML = '<iframe src="/cache/" class="installer"></iframe>'; }); } else { // On non-mobile devices, check for cache-manifest changes ourselves. workingstatus(true); showstatus('Checking'); var lcmf = appcache.get('/cache/cache-manifest.cmf', 'local'); var rcmf = appcache.get('/cache/cache-manifest.cmf', 'remote'); if (lcmf == rcmf) { onlinestatus(); workingstatus(false); return true; } //debug('cache-manifest changed, reloading'); ui.async(function() { workingstatus(true); showstatus('Updating'); ui.async(function() { workingstatus(true); showstatus('Updating'); map(function(res) { appcache.remove(res[0]); appcache.get(res[0], 'remote'); }, append(appresources, config.appresources())); if (!isNull(lcmf)) { //debug('reloading'); window.location.reload(); } onlinestatus(); workingstatus(false); }); }); } })(); /** * Handle network offline/online events. */ window.addEventListener('offline', function(e) { //debug('going offline'); showstatus('Offline'); }, false); window.addEventListener('online', function(e) { //debug('going online'); showstatus('Online'); }, false); /** * Initialize the document. */ window.onload = function() { //debug('onload', history.length); ui.onload(); // Get the current user account getaccount(); // Show the view specified in the given url fragment var furl = ui.fragment(location); if (furl != '') { var url = location.pathname + '#' + furl; if (url == viewurl) return true; return showview(url); } // Show the last visited view if (ui.isMobile() && (document.referrer == null || document.referrer == '' || document.referrer.indexOf('//' + location.hostname + '/login/') != -1 || document.referrer.indexOf('//accounts.google.com/ServiceLogin') != -1 || document.referrer.indexOf('//www.facebook.com/login.php') != -1)) { var lv = lastvisited(); var url = isNull(lv)? location.pathname : lv; updatelocation(url); if (url == viewurl) return true; return showview(url); } // Show the main home view var url = location.pathname; if (url == viewurl) return true; return showview(url); }; })(); } catch(e) { debug(e.stack); throw e; } </script> </body> </html>