git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1237740 13f79535-47bb-0310-9956-ffa450edef68
525 lines
15 KiB
HTML
525 lines
15 KiB
HTML
<!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 manifest="/cache-manifest.cmf">
|
|
<head>
|
|
<title></title>
|
|
<meta name="viewport" content="width=device-width, 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" href="/public/touchicon.png"/>
|
|
<base href="/"/>
|
|
<script type="text/javascript">
|
|
|
|
window.appcache = {};
|
|
|
|
/**
|
|
* Get and cache a resource.
|
|
*/
|
|
appcache.get = function(uri) {
|
|
var h = uri.indexOf('#');
|
|
var u = h == -1? uri : uri.substring(0, h);
|
|
|
|
// Get resource from local storage first
|
|
var item = localStorage.getItem(u);
|
|
if (item != null && item != '')
|
|
return item;
|
|
|
|
// Get resource from network
|
|
var http = new XMLHttpRequest();
|
|
http.open("GET", u, false);
|
|
http.send(null);
|
|
if (http.status == 200) {
|
|
if (http.getResponseHeader("X-Login") != null) {
|
|
if (log) log('http error', u, 'X-Login');
|
|
// Redirect to login page if not signed in
|
|
document.location = '/login/';
|
|
return null;
|
|
} else if (http.responseText == '' || http.getResponseHeader("Content-Type") == null) {
|
|
if (log) log('http error', u, 'No-Content');
|
|
return null;
|
|
}
|
|
localStorage.setItem(u, http.responseText);
|
|
return http.responseText;
|
|
}
|
|
if (log) log('http error', u, http.status, http.statusText);
|
|
// Redirect to login page if not signed in
|
|
if (http.status == 403)
|
|
document.location = '/login/';
|
|
return null;
|
|
};
|
|
|
|
// Load Javascript and CSS
|
|
(function() {
|
|
var bootjs = document.createElement('script');
|
|
bootjs.type = 'text/javascript';
|
|
bootjs.text = appcache.get('/all-min.js');
|
|
document.head.appendChild(bootjs);
|
|
document.head.appendChild(ui.declareCSS(appcache.get('/ui-min.css')));
|
|
})();
|
|
|
|
// Redirect to login page if not signed in
|
|
if (document.location.protocol == 'https:' && !ui.signedin())
|
|
document.location = '/login/';
|
|
|
|
</script>
|
|
</head>
|
|
<body class="delayed" onload="onload();">
|
|
<div id="mainbodydiv" class="mainbodydiv" style="overflow: visible;">
|
|
|
|
<div id="headdiv" class="hsection">
|
|
<script type="text/javascript">
|
|
(function() {
|
|
$('headdiv').appendChild(ui.declareScript(appcache.get('/config-min.js')));
|
|
})();
|
|
</script>
|
|
</div>
|
|
|
|
<div id="menubackground" style="position: absolute; top: 0px; left: 0px; z-index: -1; width: 100%; visibility: hidden;">
|
|
<table cellpadding="0" cellspacing="0" width="100%" class="tbar"><tr><td class="dtbar">
|
|
<table border="0" cellspacing="0" cellpadding="0"><tr><td class="ltbar"><span class="tbarsmenu">> </span></td></tr></table>
|
|
</td></tr></table>
|
|
</div>
|
|
|
|
<div id="menu"></div>
|
|
|
|
<div id="content" class="bodydiv" style="overflow: visible;">
|
|
<div id="viewcontainer"></div>
|
|
</div>
|
|
|
|
<script type="text/javascript">
|
|
|
|
// Set page titles
|
|
document.title = ui.windowtitle(location.hostname);
|
|
|
|
// Init div variables
|
|
var bdiv = $('mainbodydiv');
|
|
var mdiv = $('menu');
|
|
var cdiv = $('content');
|
|
var mbgdiv = $('menubackground');
|
|
mbgdiv.style.top = ui.pixpos(mdiv.offsetTop);
|
|
var vcontainer = $('viewcontainer');
|
|
vcontainer.className = ui.isMobile()? 'viewcontainer3dm' : 'viewcontainer3d';
|
|
|
|
/**
|
|
* Pre-fetch app resources.
|
|
*/
|
|
var appresources = [
|
|
['/all-min.js'],
|
|
['/ui-min.css'],
|
|
['/account/', 'flip'],
|
|
['/clone/', 'flip'],
|
|
['/create/', 'flip'],
|
|
['/graph/', 'flip'],
|
|
['/config-min.js'],
|
|
['/home/', 'right'],
|
|
['/home/home.b64'],
|
|
['/page/', 'flip'],
|
|
['/public/app.b64'],
|
|
['/public/config-min.js'],
|
|
['/public/grid72.b64'],
|
|
['/public/iframe-min.html'],
|
|
['/public/img.b64'],
|
|
['/public/user.b64'],
|
|
['/stats/', 'flip'],
|
|
['/store/', 'left']
|
|
];
|
|
|
|
/**
|
|
* Handle application cache events.
|
|
*/
|
|
applicationCache.addEventListener('checking', function(e) {
|
|
//log('appcache checking', e);
|
|
showStatus('Checking');
|
|
}, false);
|
|
applicationCache.addEventListener('error', function(e) {
|
|
//log('appcache error', e);
|
|
showStatus(defaultStatus());
|
|
}, false);
|
|
applicationCache.addEventListener('noupdate', function(e) {
|
|
//log('appcache noupdate', e);
|
|
showStatus(defaultStatus());
|
|
}, false);
|
|
applicationCache.addEventListener('downloading', function(e) {
|
|
//log('appcache downloading', e);
|
|
showStatus('Updating');
|
|
}, false);
|
|
applicationCache.addEventListener('progress', function(e) {
|
|
//log('appcache progress', e);
|
|
showStatus('Updating');
|
|
}, false);
|
|
applicationCache.addEventListener('updateready', function(e) {
|
|
//log('appcache updateready', e);
|
|
applicationCache.swapCache();
|
|
showStatus(defaultStatus());
|
|
//log('appcache swapped', e);
|
|
}, false);
|
|
applicationCache.addEventListener('cached', function(e) {
|
|
//log('appcache cached', e);
|
|
map(function(res) {
|
|
showStatus('Updating');
|
|
appcache.get(res[0]);
|
|
}, appresources);
|
|
showStatus(defaultStatus());
|
|
}, false);
|
|
|
|
/**
|
|
* Handle network offline/online events.
|
|
*/
|
|
window.addEventListener('offline', function(e) {
|
|
//log('going offline');
|
|
showStatus('Offline');
|
|
}, false);
|
|
window.addEventListener('online', function(e) {
|
|
//log('going online');
|
|
showStatus('Online');
|
|
}, false);
|
|
|
|
//log(navigator.onLine? 'online' : 'offline');
|
|
|
|
/**
|
|
* Handle view transitions.
|
|
*/
|
|
|
|
// Keep track of the current view url and uri
|
|
var viewurl = '';
|
|
var viewuri = '';
|
|
var viewidx = '';
|
|
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];
|
|
}, appresources);
|
|
|
|
/**
|
|
* Return the transition that should be applied to a resource.
|
|
*/
|
|
function viewtransition(uri) {
|
|
var t = apptransitions[uri];
|
|
return isNil(t)? 'left' : t;
|
|
}
|
|
|
|
/**
|
|
* 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.className == 'flipviewunloaded3dm')
|
|
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() {
|
|
return localStorage.getItem('ui.lastvisited')
|
|
}
|
|
|
|
/**
|
|
* Build and show the menu bar.
|
|
*/
|
|
function showmenu(mdiv, view, appname) {
|
|
mdiv.innerHTML = ui.menubar(
|
|
append(mklist(ui.menu('Home', '/', '_view', view == 'home'), ui.menu('Store', '/#view=store', '_view', view === 'store')),
|
|
(isNil(appname) || appname == 'undefined')?
|
|
mklist() :
|
|
mklist(
|
|
ui.menu('Stats', '/#view=stats&app=' + appname, '_view', view == 'stats'),
|
|
ui.menu('Page', '/#view=page&app=' + appname, '_view', view == 'page'),
|
|
ui.menu(isNil(config.compose)? 'Composition' : config.compose, '/#view=graph&app=' + appname, '_view', view == 'graph'))),
|
|
mklist(
|
|
ui.menu('Account', '/#view=account', '_view', view == 'account'),
|
|
ui.signedin()? ui.menufunc('Sign out', 'logout();', false) : ui.menu('Sign in', '/login/', '_self', false)));
|
|
}
|
|
|
|
/**
|
|
* Show a status message.
|
|
*/
|
|
function showStatus(s) {
|
|
var sdiv = $('status');
|
|
if (isNil(sdiv))
|
|
return s;
|
|
sdiv.innerHTML = s;
|
|
return s;
|
|
}
|
|
|
|
/**
|
|
* Return the default status message.
|
|
*/
|
|
function defaultStatus() {
|
|
return navigator.onLine? 'Online' : 'Offline';
|
|
}
|
|
|
|
/**
|
|
* Show a view.
|
|
*/
|
|
function showview(url) {
|
|
//log('showview', url);
|
|
|
|
// Save last visited location
|
|
localStorage.setItem('ui.lastvisited', url);
|
|
|
|
// Determine the view to show
|
|
var params = ui.fragmentParams(url);
|
|
var view = isNil(params['view'])? 'home' : params['view'];;
|
|
var uri = '/' + view + '/';
|
|
var idx = isNil(params['idx'])? '1' : params['idx'];
|
|
|
|
// Determine the transition to use
|
|
var vt = viewtransition(uri);
|
|
var ovt = viewtransition(viewuri);
|
|
var vtransition;
|
|
if (ovt == 'flip')
|
|
vtransition = 'flip';
|
|
else if (uri == viewuri && (vt == 'left' || vt == 'right'))
|
|
vtransition = idx >= viewidx? 'left' : 'right';
|
|
else
|
|
vtransition = vt;
|
|
|
|
// Track current view url and uri
|
|
viewurl = url;
|
|
viewuri = uri;
|
|
viewidx = idx;
|
|
|
|
// Show the menu bar
|
|
var appname = params['app'];
|
|
showmenu(mdiv, view, appname);
|
|
cdiv.style.top = ui.pixpos(mdiv.offsetTop + mdiv.offsetHeight);
|
|
|
|
// Scroll to the top and hide the address bar
|
|
window.scrollTo(0, 0);
|
|
|
|
// Compute the viewport size
|
|
var iswide = view == 'graph' || view == 'page';
|
|
var vwidth = iswide? '2500px' : '100%';
|
|
mbgdiv.style.visibility = iswide? 'visible' : 'hidden';
|
|
mbgdiv.style.width = vwidth;
|
|
|
|
// Start to unload the front view and create a new view
|
|
if (ui.isMobile()) {
|
|
// Prepare current view for transition out
|
|
var ovdiv = viewdiv;
|
|
if (!isNil(ovdiv)) {
|
|
ovdiv.skipNode = true;
|
|
ovdiv.className = 'viewunloading3dm';
|
|
}
|
|
|
|
// Load the requested doc into a new view
|
|
var vdiv = mkviewdiv(vtransition + 'viewloading3dm');
|
|
vcontainer.appendChild(vdiv);
|
|
var vdoc = appcache.get(uri);
|
|
vdiv.innerHTML = vdoc;
|
|
map(ui.evalScript, ui.innerScripts(vdiv));
|
|
|
|
// Show the document
|
|
if (document.body.style.visibility != 'visible')
|
|
document.body.style.visibility = 'visible';
|
|
|
|
setTimeout(function() {
|
|
// Transition the old view out
|
|
if (!isNil(ovdiv))
|
|
ovdiv.className = vtransition + 'viewunloaded3dm';
|
|
|
|
// Transition the new view in
|
|
vdiv.className = 'viewloaded3dm';
|
|
}, 0);
|
|
} else {
|
|
// Prepare current view for transition out
|
|
var ovdiv = viewdiv;
|
|
if (!isNil(ovdiv))
|
|
ovdiv.skipNode = true;
|
|
|
|
// Load the requested doc into the view
|
|
var vdiv = mkviewdiv('viewloading3d');
|
|
vcontainer.appendChild(vdiv);
|
|
var vdoc = appcache.get(uri);
|
|
vdiv.innerHTML = vdoc;
|
|
map(ui.evalScript, ui.innerScripts(vdiv));
|
|
|
|
// Show the document
|
|
if (document.body.style.visibility != 'visible')
|
|
document.body.style.visibility = 'visible';
|
|
|
|
setTimeout(function() {
|
|
// Transition the new view in
|
|
vdiv.className = 'viewloaded3d';
|
|
|
|
// Transition the old view out
|
|
if (!isNil(ovdiv))
|
|
ovdiv.parentNode.removeChild(ovdiv);
|
|
}, 0);
|
|
}
|
|
|
|
// Track the current visible view
|
|
viewdiv = vdiv;
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Update the browser window location.
|
|
*/
|
|
function updatelocation(url) {
|
|
//log('updatelocation', url);
|
|
|
|
// Add url to the history if necessary
|
|
if (url != ui.pathandparams(location)) {
|
|
history.pushState(null, null, url);
|
|
//log('pushstate', history.length);
|
|
|
|
// Update the location hash if necessary
|
|
var f = ui.fragment(url);
|
|
if (f != '' && f != location.hash) {
|
|
location.hash = f;
|
|
//log('hash', f);
|
|
}
|
|
}
|
|
return url;
|
|
}
|
|
|
|
/**
|
|
* Handle navigations.
|
|
*/
|
|
window.onnavigate = function(url) {
|
|
//log('onnavigate', url);
|
|
|
|
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.
|
|
*/
|
|
function logout() {
|
|
// Clear session cookie and user-specific local storage entries
|
|
var reset = 'TuscanyOpenAuth=; expires=' + new Date(1970,01,01).toGMTString() + '; domain=.' + domainname(window.location.hostname) + '; path=/';
|
|
document.cookie = reset;
|
|
localStorage.removeItem('/r/EditWidget/accounts');
|
|
localStorage.removeItem('/r/EditWidget/dashboards');
|
|
//localStorage.clear();
|
|
document.location = '/login/';
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Handle history.
|
|
*/
|
|
window.addEventListener('popstate', function(e) {
|
|
//log('onpopstate', history.length);
|
|
var furl = ui.fragment(location);
|
|
var url = location.pathname + (furl == ''? '' : '#' + furl);
|
|
|
|
// Show the current view
|
|
if (url == viewurl)
|
|
return true;
|
|
return showview(url);
|
|
|
|
}, false);
|
|
|
|
window.addEventListener('hashchange', function(e) {
|
|
//log('onhashchange');
|
|
var furl = ui.fragment(location);
|
|
var url = location.pathname + (furl == ''? '' : '#' + furl);
|
|
|
|
// Show the current view
|
|
if (url == viewurl)
|
|
return true;
|
|
return showview(url);
|
|
|
|
}, false);
|
|
|
|
/**
|
|
* Handle orientation change.
|
|
*/
|
|
document.body.onorientationchange = function(e) {
|
|
//log('onorientationchange');
|
|
|
|
// Scroll to the top and hide the address bar
|
|
window.scrollTo(0, 0);
|
|
|
|
return true;
|
|
};
|
|
|
|
/**
|
|
* Document load post processing.
|
|
*/
|
|
function onload() {
|
|
//log('onload', history.length);
|
|
var furl = ui.fragment(location);
|
|
|
|
// Show the view specified in the given url fragment
|
|
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 == '')) {
|
|
//log('show lastvisited');
|
|
var lv = lastvisited();
|
|
var url = isNil(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);
|
|
}
|
|
|
|
</script>
|
|
|
|
<div id="footdiv" class="fsection">
|
|
</div>
|
|
|
|
</div>
|
|
</body>
|
|
</html>
|