Refactor and simplify edit app, and optimize app resource loading and caching.

git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1188045 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
jsdelfino 2011-10-24 08:45:54 +00:00
parent 1f29c4ef13
commit 0f3b340da7
54 changed files with 4293 additions and 3748 deletions

View file

@ -59,6 +59,7 @@ config.status
*config.js
all.js
intro*.png
intro*.b64
depcomp
install-sh
ltmain.sh

View file

@ -20,7 +20,7 @@ if WANT_PYTHON
moddir = $(prefix)/modules/edit
dist_mod_SCRIPTS = start stop ssl-start mkapplinks
nobase_dist_mod_DATA = edit.composite *.py htdocs/*.html htdocs/*.js htdocs/*.cmf htdocs/*.ico htdocs/*.png htdocs/*.txt htdocs/account/*.html htdocs/create/*.html htdocs/clone/*.html htdocs/data/*.html htdocs/app/*.html htdocs/store/*.html htdocs/stats/*.html htdocs/graph/*.html htdocs/graph/*.js htdocs/page/*.html htdocs/page/*.js htdocs/login/*.html htdocs/logout/*.html htdocs/public/*.html htdocs/public/*.png palettes/*/palette.composite apps/*/app.composite apps/*/app.stats apps/*/htdocs/app.html dashboards/*/user.apps store/*/store.apps
EXTRA_DIST = edit.composite *.py htdocs/*.html htdocs/*.js htdocs/*.cmf htdocs/*.ico htdocs/*.png htdocs/*.txt htdocs/account/*.html htdocs/create/*.html htdocs/clone/*.html htdocs/data/*.html htdocs/app/*.html htdocs/store/*.html htdocs/stats/*.html htdocs/graph/*.html htdocs/graph/*.js htdocs/page/*.html htdocs/page/*.js htdocs/login/*.html htdocs/logout/*.html htdocs/public/*.html htdocs/public/*.png palettes/*/palette.composite apps/*/app.composite apps/*/app.stats apps/*/htdocs/app.html dashboards/*/user.apps store/*/store.apps
nobase_dist_mod_DATA = edit.composite *.py htdocs/*.html htdocs/*.js htdocs/*.cmf htdocs/*.ico htdocs/home/*.png htdocs/home/*.b64 htdocs/*.txt htdocs/account/*.html htdocs/create/*.html htdocs/clone/*.html htdocs/app/*.html htdocs/store/*.html htdocs/stats/*.html htdocs/graph/*.html htdocs/home/*.html htdocs/page/*.html htdocs/login/*.html htdocs/logout/*.html htdocs/notauth/*.html htdocs/notfound/*.html htdocs/oops/*.html htdocs/public/*.html htdocs/public/*.png htdocs/public/*.b64 palettes/*/palette.composite apps/*/app.composite apps/*/app.stats apps/*/htdocs/app.html dashboards/*/user.apps store/*/store.apps
EXTRA_DIST = edit.composite *.py htdocs/*.html htdocs/*.js htdocs/*.cmf htdocs/*.ico htdocs/home/*.png htdocs/home/*.b64 htdocs/*.txt htdocs/account/*.html htdocs/create/*.html htdocs/clone/*.html htdocs/app/*.html htdocs/store/*.html htdocs/stats/*.html htdocs/graph/*.html htdocs/home/*.html htdocs/page/*.html htdocs/login/*.html htdocs/logout/*.html htdocs/notauth/*.html htdocs/notfound/*.html htdocs/oops/*.html htdocs/public/*.html htdocs/public/*.png htdocs/public/*.b64 palettes/*/palette.composite apps/*/app.composite apps/*/app.stats apps/*/htdocs/app.html dashboards/*/user.apps store/*/store.apps
endif

View file

@ -22,7 +22,7 @@ from util import *
def accountid(user):
return ("'" + user.id(), "'user.account")
# Get the user's account
# Get the current user's account
def get(id, user, cache):
account = cache.get(accountid(user))
if isNil(account):

View file

@ -17,26 +17,8 @@
* specific language governing permissions and limitations
* under the License.
-->
<html manifest="/cache-manifest.cmf">
<head>
<title>Account</title>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-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"/>
<link rel="stylesheet" type="text/css" href="/ui-min.css"/>
<script type="text/javascript" src="/all-min.js"></script>
<script type="text/javascript" src="/menu.js"></script>
</head>
<body class="delayed" onload="ui.onload();" onbeforeunload="ui.onbeforeunload();">
<div id="bodydiv" class="bodydiv">
<div id="headdiv" class="hsection">
<script type="text/javascript" src="/headconfig.js"></script>
</div>
<div id="menu"></div>
<table style="width: 100%;">
<tr>
<td><h2><span id="h1"></span><span id="userNameHeader"></span></h2></td>
@ -53,7 +35,7 @@
<form id="userForm">
<table style="width: 100%;">
<tr><tr><td><b>Photo:</b></td></tr>
<tr><td><img src="/public/app.png" style="width: 50px; height: 50px; vertical-align: top;"></td></tr>
<tr><td><img id="userimg" style="width: 50px; height: 50px; vertical-align: top;"></td></tr>
<tr><tr><td style="padding-top: 6px;"><b>Name:</b></td></tr>
<tr><td><input type="text" id="userTitle" size="30" placeholder="Enter your name" style="width: 300px;"/></td></tr>
<tr><tr><td style="padding-top: 6px;"><b>Description:</b></td></tr>
@ -97,29 +79,22 @@
</form>
<script type="text/javascript">
ui.initbody();
// Init service references
var editWidget = sca.component("EditWidget");
var user= sca.defun(sca.reference(editWidget, "user"), "id");
var accounts = sca.reference(editWidget, "accounts");
// Get the user name
var username = '';
try {
username = user.id()
} catch(e) {}
// Set page titles
document.title = windowtitle(window.location.hostname) + ' - Account - ' + username;
$('userNameHeader').innerHTML = username;
document.title = ui.windowtitle(location.hostname) + ' - Account';
// Load the menu bar
displaymenu();
// Set images
$('userimg').src = ui.b64img(appcache.get('/public/user.b64'));
/**
* The current account entry and corresponding saved XML content.
*/
var username;
var accountentry;
var savedaccountentryxml = '';
@ -134,7 +109,9 @@ function getaccount(name) {
return false;
accountentry = doc != null? car(elementsToValues(atom.readATOMEntry(mklist(doc)))) : mklist("'entry", mklist("'title", ''), mklist("'id", name));
username = cadr(assoc("'id", cdr(accountentry)));
var title = cadr(assoc("'title", cdr(accountentry)));
$('userNameHeader').innerHTML = username;
$('userTitle').value = title;
var content = cadr(assoc("'content", cdr(accountentry)));
@ -170,6 +147,8 @@ function getaccount(name) {
* Save the user's account.
*/
function save(entryxml) {
if (isNil(username))
return false;
$('saveStatus').innerHTML = 'Saving';
savedaccountentryxml = entryxml;
accounts.put(username, savedaccountentryxml, function(e) {
@ -228,14 +207,8 @@ $('userForm').onsubmit = function() {
};
// Get the user's account
getaccount(username);
getaccount();
</script>
<div id="footdiv" class="fsection">
<script type="text/javascript" src="/footconfig.js"></script>
</div>
</div>
</body>
</html>

View file

@ -1,25 +1,17 @@
CACHE MANIFEST
# Common resources
/all-min.js
/ui-min.css
# Version 5
# App resources
/
/data/index.html
/favicon.ico
/footconfig.js
/frame.html
/headconfig.js
/public/app.png
/notauth/
/notfound/
/notyet/
/oops/
/public/iframe.html
/public/img.png
/public/notauth.html
/public/notfound.html
/public/notyet.html
/public/oops.html
/public/touchicon.png
/robots.txt
NETWORK:
*

View file

@ -1,31 +0,0 @@
<!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"/>
<meta name="apple-mobile-web-app-capable" content="yes"/>
<meta name="apple-mobile-web-app-status-bar-style" content="black"/>
<link rel="stylesheet" type="text/css" href="/ui-min.css"/>
</head>
<body>
</body>
</html>

View file

@ -23,36 +23,77 @@
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0"/>
<meta name="apple-mobile-web-app-capable" content="yes"/>
<meta name="apple-mobile-web-app-status-bar-style" content="black"/>
<script type="text/javascript">
document.title = window.location.hostname.split('.')[0];
</script>
<link rel="apple-touch-icon" href="/public/touchicon.png"/>
<link rel="stylesheet" type="text/css" href="/ui-min.css"/>
<script type="text/javascript" src="/all-min.js"></script>
</head>
<body class="delayed" onload="ui.onload();" onbeforeunload="ui.onbeforeunload();">
<div id="bodydiv" class="bodydiv">
<div id="headdiv" class="hsection">
<script type="text/javascript" src="/headconfig.js"></script>
</div>
<div id="app">
<iframe id="appframe" style="position: relative; height: 5000px; width: 100%;" scrolling="no" frameborder="0" src="/frame.html"></iframe>
</div>
<div id="appbuffer" style="visibility: hidden">
</div>
<base href="/"/>
<script type="text/javascript">
ui.initbody();
window.appcache = {};
/**
* The main app div.
* Get and cache a resource.
*/
var appdiv = $('app');
var appframe = $('appframe');
var appbody;
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 err', u, 'X-Login');
return null;
} else if (http.responseText == '' || http.getResponseHeader("Content-Type") == null) {
if (log) log('http err', u, 'No-Content');
return null;
}
localStorage.setItem(u, http.responseText);
return http.responseText;
}
if (log) log('http err', u, http.status, http.statusText);
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')));
})();
</script>
</head>
<body class="delayed" onload="onload();">
<div id="mainbodydiv" class="mainbodydiv">
<div id="headdiv" class="hsection">
<script type="text/javascript">
(function() {
$('headdiv').appendChild(ui.declareScript(appcache.get('/headconfig.js')));
})();
</script>
</div>
<div id="content">
</div>
<script type="text/javascript">
// Set the document title
document.title = location.hostname.split('.')[0];
/**
* The main page div.
*/
var contentdiv = $('content');
/**
* Start, stop, timer, animation and location components.
@ -63,6 +104,59 @@ var timercomp = sca.httpclient('timer', '/timer');
var animationcomp = sca.httpclient('animation', '/animation');
var locationcomp = sca.httpclient('location', '/location');
/**
* Pre-fetch app resources.
*/
var appresources = [
['/all-min.js'],
['/app.html'],
['/ui-min.css'],
['/footconfig.js'],
['/headconfig.js'],
];
/**
* Handle application cache events.
*/
applicationCache.addEventListener('checking', function(e) {
//log('appcache checking', e);
}, false);
applicationCache.addEventListener('error', function(e) {
//log('appcache error', e);
}, false);
applicationCache.addEventListener('noupdate', function(e) {
//log('appcache noupdate', e);
}, false);
applicationCache.addEventListener('downloading', function(e) {
//log('appcache downloading', e);
}, false);
applicationCache.addEventListener('progress', function(e) {
//log('appcache progress', e);
}, false);
applicationCache.addEventListener('updateready', function(e) {
//log('appcache updateready', e);
applicationCache.swapCache();
//log('appcache swapped', e);
}, false);
applicationCache.addEventListener('cached', function(e) {
//log('appcache cached', e);
map(function(res) {
appcache.get(res[0]);
}, appresources);
}, false);
/**
* Handle network offline/online events.
*/
window.addEventListener('offline', function(e) {
//log('going offline');
}, false);
window.addEventListener('online', function(e) {
//log('going online');
}, false);
//log(navigator.onLine? 'online' : 'offline');
/**
* Find a named value in a tree of elements. The value name is given
* as a list of ids.
@ -172,12 +266,12 @@ function setwidgetvalue(e, dv) {
// Define the stylesheet
if (s != '') {
var esheet = appframe.contentDocument.getElementById('style_' + e.id);
var esheet = contentdiv.getElementById('style_' + e.id);
if (isNil(esheet)) {
var nesheet = document.createElement('style');
nesheet.id = 'style_' + e.id;
nesheet.type = 'text/css';
appframe.contentDocument.getElementsByTagName('head')[0].appendChild(nesheet);
contentdiv.getElementsByTagName('head')[0].appendChild(nesheet);
nesheet.innerHTML = s;
} else {
esheet.innerHTML = s;
@ -294,7 +388,7 @@ function updatepage(l) {
return e;
}
map(updatewidget, filter(function(e) { return !isNil(e.id) && e.id.substring(0, 5) != 'page:'; }, nodeList(ui.elementByID(appbody, 'page').childNodes)));
map(updatewidget, filter(function(e) { return !isNil(e.id) && e.id.substring(0, 5) != 'page:'; }, nodeList(ui.elementByID(contentdiv, 'page').childNodes)));
return true;
}
@ -474,16 +568,10 @@ function getpagedata() {
}
// Get the component app data
var doc = getdoc(startcomp, 'start', window.location.search);
// Prepare app HTML page
appbody = appframe.contentDocument.body;
var appbufferbody = $('appbufferframe').contentDocument.body;
appbody.innerHTML = appbufferbody.innerHTML;
appbufferbody.innerHTML = '';
var doc = getdoc(startcomp, 'start', location.search);
// Setup the widgets
map(setupwidget, filter(function(e) { return !isNil(e.id); }, nodeList(ui.elementByID(appbody, 'page').childNodes)));
map(setupwidget, filter(function(e) { return !isNil(e.id); }, nodeList(ui.elementByID(contentdiv, 'page').childNodes)));
// Display data on the page
displaypage(doc);
@ -513,7 +601,7 @@ function compquery() {
return append(nodeList(n.childNodes), reduce(append, mklist(), map(childrenList, nodeList(n.childNodes))));
}
var args = map(queryarg, filter(function(e) { return !isNil(e.id) && !isNil(inputvalue(e)); }, childrenList(ui.elementByID(appbody, 'page'))));
var args = map(queryarg, filter(function(e) { return !isNil(e.id) && !isNil(inputvalue(e)); }, childrenList(ui.elementByID(contentdiv, 'page'))));
// Append current location properties if known
if (!isNil(geoposition)) {
@ -677,12 +765,35 @@ function setupLocationHandler() {
return true;
}
// Load the app frame
$('appbuffer').innerHTML = '<iframe id="appbufferframe" style="position: relative; height: 5000px; width: 100%;" scrolling="no" frameborder="0" src="app.html" onload="getpagedata()"></iframe>';
// Load the app page
var appcontent = appcache.get('/app.html');
contentdiv.innerHTML = appcontent;
// Merge in the app data
getpagedata();
/**
* Document load post processing.
*/
function onload() {
//log('onload');
// Show the page
document.body.style.visibility = 'visible';
// Scroll to the top and hide the address bar
window.scrollTo(0, 0);
return true;
}
</script>
<div id="footdiv" class="fsection">
<script type="text/javascript" src="/footconfig.js"></script>
<script type="text/javascript">
(function() {
$('footdiv').appendChild(ui.declareScript(appcache.get('/footconfig.js')));
})();
</script>
</div>
</div>

View file

@ -1,39 +1,17 @@
CACHE MANIFEST
# Version 2
# Common resources
/all-min.js
/ui-min.css
# Version 5
# App resources
/
/account/
/app/
/clone/
/data/
/create/
/favicon.ico
/footconfig.js
/graph/graph.js
/graph/
/headconfig.js
/home.png
/menu.js
/page/
/page/page.js
/public/app.png
/public/grid72.png
/notauth/
/notfound/
/notyet/
/oops/
/public/iframe.html
/public/img.png
/public/notauth.html
/public/notfound.html
/public/notyet.html
/public/oops.html
/public/touchicon.png
/robots.txt
/stats/
/store/
NETWORK:
*

View file

@ -17,26 +17,8 @@
* 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"/>
<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"/>
<link rel="stylesheet" type="text/css" href="/ui-min.css"/>
<script type="text/javascript" src="/all-min.js"></script>
<script type="text/javascript" src="/menu.js"></script>
</head>
<body class="delayed" onload="ui.onload();" onbeforeunload="ui.onbeforeunload();">
<div id="bodydiv" class="bodydiv">
<div id="headdiv" class="hsection">
<script type="text/javascript" src="/headconfig.js"></script>
</div>
<div id="menu"></div>
<table style="width: 100%;">
<tr>
<td><h2><span id="h1"></span><span id="appNameHeader"></span></h2></td>
@ -54,7 +36,7 @@
<tr><td><b>New App Name:</b></td></tr>
<tr><td><input type="text" id="appName" size="15" autocapitalize="off" placeholder="Your app name"/>&nbsp;<span id="appDomain"></span></td></tr>
<tr><tr><td style="padding-top: 6px;"><b>App Icon:</b></td></tr>
<tr><td><img src="/public/app.png" style="width: 50px; height: 50px; vertical-align: top;"></td></tr>
<tr><td><img id="appimg" style="width: 50px; height: 50px; vertical-align: top;"></td></tr>
<tr><tr><td style="padding-top: 6px;"><b>Sharing:</b></td></tr>
<tr><td><input type="checkbox" value="shared"/><span>Shared</span></td></tr>
<tr><tr><td style="padding-top: 6px;"><b>App Title:</b></td></tr>
@ -69,20 +51,17 @@
</form>
<script type="text/javascript">
ui.initbody();
// Get the app name
var appname = ui.fragmentParams()['app'];
if (isNil(appname))
window.open('/', '_self');
var appname = ui.fragmentParams(location)['app'];
/**
* Return the link to an app.
*/
function applink(appname) {
var protocol = window.location.protocol;
var host = window.location.hostname;
var port = ':' + window.location.port;
var protocol = location.protocol;
var host = location.hostname;
var port = ':' + location.port;
if (port == ':80' || port == ':443' || port == ':')
port = '';
var link = protocol + '//' + appname + '.' + host + port + '/';
@ -91,17 +70,17 @@ function applink(appname) {
// Set page titles
var tclone = isNil(config.clone)? 'Clone' : config.clone;
document.title = windowtitle(window.location.hostname) + ' - ' + tclone + ' - ' + appname;
document.title = ui.windowtitle(location.hostname) + ' - ' + tclone + ' - ' + appname;
$('appNameHeader').innerHTML = '<a href=\"' + applink(appname) + '\" target=\"' + '_blank' + '\">' + appname + '</a>';
$('th').innerHTML = tclone + ' this App';
$('cloneAppOKButton').value = tclone;
$('cloneAppOKButton').title = tclone + ' this app';
// Load the menu bar
displaymenu();
// Set images
$('appimg').src = ui.b64img(appcache.get('/public/app.b64'));
// Init form
$('appDomain').innerHTML = '.' + window.location.hostname;
$('appDomain').innerHTML = '.' + location.hostname;
// Init service references
var editWidget = sca.component("EditWidget");
@ -152,7 +131,7 @@ $('cloneAppForm').onsubmit = function() {
return false;
// Open it in the page editor
ui.navigate('/page/#app=' + name, '_self');
ui.navigate('/#view=page&app=' + name, '_view');
return false;
});
return false;
@ -162,18 +141,12 @@ $('cloneAppForm').onsubmit = function() {
* Cancel cloning an app.
*/
$('cloneAppCancelButton').onclick = function() {
ui.navigate('/stats/#app=' + appname, '_self');
history.back();
};
// Get the current app
getapp(appname);
</script>
<div id="footdiv" class="fsection">
<script type="text/javascript" src="/footconfig.js"></script>
</div>
</div>
</body>
</html>

View file

@ -17,26 +17,8 @@
* specific language governing permissions and limitations
* under the License.
-->
<html manifest="/cache-manifest.cmf">
<head>
<title>Create App</title>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-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"/>
<link rel="stylesheet" type="text/css" href="/ui-min.css"/>
<script type="text/javascript" src="/all-min.js"></script>
<script type="text/javascript" src="/menu.js"></script>
</head>
<body class="delayed" onload="ui.onload();" onbeforeunload="ui.onbeforeunload();">
<div id="bodydiv" class="bodydiv">
<div id="headdiv" class="hsection">
<script type="text/javascript" src="/headconfig.js"></script>
</div>
<div id="menu"></div>
<table style="width: 100%;">
<tr><td><h2><span id="h1"></span></h2></td></tr>
</table>
@ -52,7 +34,7 @@
<tr><td><b>App Name:</b></td></tr>
<tr><td><input type="text" id="appName" size="15" autocapitalize="off" placeholder="Your app name"/>&nbsp;<span id="appDomain"></span></td></tr>
<tr><tr><td style="padding-top: 6px;"><b>App Icon:</b></td></tr>
<tr><td><img src="/public/app.png" style="width: 50px; height: 50px; vertical-align: top;"></td></tr>
<tr><td><img id="appimg" style="width: 50px; height: 50px; vertical-align: top;"></td></tr>
<tr><tr><td style="padding-top: 6px;"><b>Sharing:</b></td></tr>
<tr><td><input type="checkbox" value="shared"/><span>Shared</span></td></tr>
<tr><tr><td style="padding-top: 6px;"><b>App Title:</b></td></tr>
@ -67,17 +49,16 @@
</form>
<script type="text/javascript">
ui.initbody();
// Set page titles
document.title = windowtitle(window.location.hostname) + ' - Create App';
$('h1').innerHTML = hometitle(window.location.hostname);
document.title = ui.windowtitle(location.hostname) + ' - Create App';
$('h1').innerHTML = ui.hometitle(location.hostname);
// Load the menu bar
displaymenu();
// Set images
$('appimg').src = ui.b64img(appcache.get('/public/app.b64'));
// Init form
$('appDomain').innerHTML = '.' + window.location.hostname;
$('appDomain').innerHTML = '.' + location.hostname;
// Init service references
var editWidget = sca.component("EditWidget");
@ -101,7 +82,7 @@ $('createAppForm').onsubmit = function() {
return false;
// Open it in the page editor
ui.navigate('/page/#app=' + name, '_self');
ui.navigate('/#view=page&app=' + name, '_view');
return false;
});
return false;
@ -111,15 +92,9 @@ $('createAppForm').onsubmit = function() {
* Cancel creating an app.
*/
$('createAppCancelButton').onclick = function() {
return ui.navigate('/store/', '_self');
history.back();
};
</script>
<div id="footdiv" class="fsection">
<script type="text/javascript" src="/footconfig.js"></script>
</div>
</div>
</body>
</html>

View file

@ -1,105 +0,0 @@
<!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>View</title>
<script type="text/javascript">
var cn = window.location.search.substring(1).split('=')[1];
document.title = 'View - ' + window.location.hostname.split('.')[0] + '/' + cn;
</script>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-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"/>
<link rel="stylesheet" type="text/css" href="/ui-min.css">
<script type="text/javascript" src="/all-min.js"></script>
</head>
<body class="delayed" onload="ui.onload();" onbeforeunload="ui.onbeforeunload();">
<div id="bodydiv" style="position: absolute; top: 0px; left: 0px; right: 0px;">
<div id="compLinkHeader" style="margin-top: 4px; margin-bottom: 4px;"></div>
<div id="datadiv" style="position: relative; left: 0px; right: 0px;">
</div>
<script type="text/javascript">
ui.initbody();
// Get the component name
var cname = ui.fragmentParams()['component'];
/**
* The current component.
*/
var comp = sca.component(cname);
/**
* Display an HTML element.
*/
function display(e) {
$('datadiv').innerHTML = e;
return true;
}
/**
* Convert data to an HTML table.
*/
function datatable(e) {
return ui.datatable(e);
}
/**
* Wrap a document in an HTML table.
*/
function mkdoctable(doc) {
var tr = '<tr><td class="datatdl">' + 'value' + '</td>' + '<td class="datatdr">' + doc + '</td></tr>';
return '<table class="datatable ' + (window.name == 'previewFrame'? ' databg' : '') + '" style="width: 100%;">' + tr + '</table>';
}
/**
* Get and display the contents of the current component.
*/
function getdata() {
return comp.getnocache('', function(doc) {
// Stop now if we didn't the doc
if (doc == null)
return false;
if (json.isJSON(mklist(doc)))
return display(datatable(json.readJSON(mklist(doc))));
if (atom.isATOMEntry(mklist(doc)))
return display(datatable(atom.readATOMEntry(mklist(doc))));
if (atom.isATOMFeed(mklist(doc)))
return display(datatable(atom.readATOMFeed(mklist(doc))));
return display(mkdoctable('<iframe style="width: 100%; height: 5000px;" scrolling="no" frameborder="0" src="' + comp.uri + '"/>'));
});
}
getdata();
</script>
<div id="footdiv" class="fsection">
<script type="text/javascript" src="/footconfig.js"></script>
</div>
</body>
</html>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

View file

@ -17,48 +17,47 @@
* specific language governing permissions and limitations
* under the License.
-->
<html manifest="/cache-manifest.cmf">
<head>
<title>Oops</title>
<meta name="viewport" content="width=device-width user-scalable=no initial-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="stylesheet" type="text/css" href="/ui-min.css"/>
<script type="text/javascript" src="/all-min.js"></script>
<script type="text/javascript" src="/menu.js"></script>
</head>
<body class="delayed" onload="ui.onload();" onbeforeunload="ui.onbeforeunload();">
<div id="bodydiv" class="bodydiv">
<div id="headdiv" class="hsection">
<script type="text/javascript" src="/headconfig.js"></script>
</div>
<div id="menu"></div>
<table style="width: 100%;">
<tr><td><h2><span id="h1"></span></h2></td></tr>
</table>
<div style="margin-left: auto; margin-right: auto; text-align: center;">
<div class="hd2">Oops, something went wrong...</div>
<div id="maintitle" style="font-size: 150%;"></div>
<div id="maindiagram"><div id="diagram" style="width: 320px; height: 280px; padding: 0px; margin: 0px auto;"></div></div>
<input type="button" class="greenbutton" style="font-size: 150%; font-weight: bold; font-style: italic; padding: 10px;" id="getstarted" title="Get Started" value="Get Started"/>
<br/><br/>
<div>Requires Safari 5+, Chrome 11+, Firefox 4+, IE 9+</div>
</div>
<script type="text/javascript">
ui.initbody();
// Set page title
$('h1').innerHTML = hometitle(window.location.hostname);
// Set page titles
document.title = ui.windowtitle(location.hostname);
$('h1').innerHTML = ui.hometitle(location.hostname);
$('maintitle').innerHTML = isNil(config.maintitle)? 'Simple App Builder' : config.maintitle;
$('getstarted').onclick = function() {
return ui.navigate('/#view=store', '_view');
};
// Display the main diagram
var diagram = $('diagram');
diagram.style.background = 'url(\'' + ui.b64img(appcache.get('/home/home.b64')) + '\')';
var bgpos = 0;
setInterval(function() {
bgpos = bgpos -280;
if (bgpos == -2800)
bgpos = 0;
diagram.style.backgroundPosition = '0px ' + ui.pixpos(bgpos);
}, 2000);
// Load the menu bar
if (!issubdomain(window.location.hostname))
displaymenu();
</script>
<div id="footdiv" class="fsection">
<script type="text/javascript" src="/footconfig.js"></script>
</div>
</div>
</body>
</html>

View file

@ -19,78 +19,417 @@
-->
<html manifest="/cache-manifest.cmf">
<head>
<title>Home</title>
<title></title>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-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"/>
<link rel="stylesheet" type="text/css" href="/ui-min.css"/>
<script type="text/javascript" src="/all-min.js"></script>
<script type="text/javascript" src="/menu.js"></script>
<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 err', u, 'X-Login');
return null;
} else if (http.responseText == '' || http.getResponseHeader("Content-Type") == null) {
if (log) log('http err', u, 'No-Content');
return null;
}
localStorage.setItem(u, http.responseText);
return http.responseText;
}
if (log) log('http err', u, http.status, http.statusText);
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')));
})();
</script>
</head>
<body class="delayed" onload="ui.onload();" onbeforeunload="ui.onbeforeunload();">
<div id="bodydiv" class="bodydiv">
<body class="delayed" onload="onload();">
<div id="mainbodydiv" class="mainbodydiv" style="overflow: visible;">
<div id="headdiv" class="hsection">
<script type="text/javascript" src="/headconfig.js"></script>
<script type="text/javascript">
(function() {
$('headdiv').appendChild(ui.declareScript(appcache.get('/headconfig.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">>&nbsp</span></td></tr></table>
</td></tr></table>
</div>
<div id="menu"></div>
<table style="width: 100%;">
<tr><td><h2><span id="h1"></span></h2></td></tr>
</table>
<div style="margin-left: auto; margin-right: auto; text-align: center;">
<div id="maintitle" style="font-size: 150%;"></div>
<div id="maindiagram"><div id="diagram" style="width: 320px; height: 280px; background: url(home.png); padding: 0px; margin: 0px auto;"></div></div>
<input type="button" class="greenbutton" style="font-size: 150%; font-weight: bold; font-style: italic; padding: 10px;" id="getstarted" title="Get Started" value="Get Started"/>
<br/><br/>
<div>Requires Safari 5+, Chrome 11+, Firefox 4+, IE 9+</div>
<div id="content" class="bodydiv" style="overflow: visible;">
<div id="viewcontainer"></div>
</div>
<script type="text/javascript">
// On mobile devices, redirect to the last visited page
if (ui.isMobile() && (document.referrer == null || document.referrer == '')) {
var last = ui.lastvisited();
if (!isNil(last) && last != document.location)
window.open(last, '_self');
// 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'],
['/footconfig.js'],
['/graph/', 'flip'],
['/headconfig.js'],
['/home/', 'right'],
['/home/home.b64'],
['/page/', 'flip'],
['/public/app.b64'],
['/public/grid72.b64'],
['/public/iframe.html'],
['/public/img.b64'],
['/public/user.b64'],
['/stats/', 'flip'],
['/store/', 'left']
];
/**
* Handle application cache events.
*/
applicationCache.addEventListener('checking', function(e) {
//log('appcache checking', e);
}, false);
applicationCache.addEventListener('error', function(e) {
//log('appcache error', e);
}, false);
applicationCache.addEventListener('noupdate', function(e) {
//log('appcache noupdate', e);
}, false);
applicationCache.addEventListener('downloading', function(e) {
//log('appcache downloading', e);
}, false);
applicationCache.addEventListener('progress', function(e) {
//log('appcache progress', e);
}, false);
applicationCache.addEventListener('updateready', function(e) {
//log('appcache updateready', e);
applicationCache.swapCache();
//log('appcache swapped', e);
}, false);
applicationCache.addEventListener('cached', function(e) {
//log('appcache cached', e);
map(function(res) {
appcache.get(res[0]);
}, appresources);
}, false);
/**
* Handle network offline/online events.
*/
window.addEventListener('offline', function(e) {
//log('going offline');
}, false);
window.addEventListener('online', function(e) {
//log('going 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;
}
// Init and display this page
ui.initbody();
/**
* Create a new view div.
*/
function mkviewdiv(cname) {
var vdiv = document.createElement('div');
vdiv.className = cname;
if (!ui.isMobile())
return vdiv;
// Set page titles
document.title = windowtitle(window.location.hostname);
$('h1').innerHTML = hometitle(window.location.hostname);
// 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;
}
// Display the menu bar
displaymenu();
/**
* Return the last visited location.
*/
function lastvisited() {
var loc = localStorage.getItem('ui.lastvisited')
if (!isNil(loc))
return loc;
return '' + location;
}
$('maintitle').innerHTML = isNil(config.maintitle)? 'Simple App Builder' : config.maintitle;
$('getstarted').onclick = function() {
return ui.navigate('/store/', '_self');
/**
* 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.menu('Sign out', '/logout/', '_self', false)));
}
/**
* 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;
}
/**
* Handle navigations.
*/
window.onnavigate = function(url) {
//log('onnavigate', url);
// Add url to the history
if (url != ui.pathandparams(location)) {
history.pushState(null, null, url);
var f = ui.fragment(url);
if (f != '' && f != location.hash) {
location.hash = f;
//log('hash', f);
}
//log('pushstate', history.length);
}
// Show the specified view
if (url == viewurl)
return true;
return showview(url);
};
// Display the main diagram
var diagram = $('diagram');
var bgpos = 0;
setInterval(function() {
bgpos = bgpos -280;
if (bgpos == -2800)
bgpos = 0;
diagram.style.backgroundPosition = '0px ' + ui.pixpos(bgpos);
}, 2000);
/**
* Handle history.
*/
window.addEventListener('popstate', function(e) {
//log('popstate', 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);
/**
* Document load post processing.
*/
function onload() {
//log('onload', history.length);
var furl = ui.fragment(location);
url = location.pathname + (furl == ''? '' : '#' + furl);
// Show the current view
if (url == viewurl)
return true;
return showview(url);
}
// Show the last visited view
//if (ui.isMobile() && (document.referrer == null || document.referrer == '')) {
//log('show lastvisited');
//showview(lastvisited());
//} else
//showview('/');
</script>
<div id="footdiv" class="fsection">
<script type="text/javascript" src="/footconfig.js"></script>
<script type="text/javascript">
(function() {
$('footdiv').appendChild(ui.declareScript(appcache.get('/footconfig.js')));
})();
</script>
</div>
</div>

View file

@ -17,17 +17,17 @@
* specific language governing permissions and limitations
* under the License.
-->
<html manifest="/cache-manifest.cmf">
<html>
<head>
<title>Sign in</title>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-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="/login/"/>
<link rel="stylesheet" type="text/css" href="/ui-min.css"/>
<script type="text/javascript" src="/all-min.js"></script>
</head>
<body class="delayed" onload="ui.onload();" onbeforeunload="ui.onbeforeunload();">
<body class="delayed" onload="onload();">
<div id="bodydiv" class="bodydiv">
<h1>Sign in</h1>
@ -44,8 +44,6 @@
</form>
<script type="text/javascript">
ui.initbody();
function queryParams() {
qp = new Array();
qs = window.location.search.substring(1).split('&');
@ -71,11 +69,22 @@ function oauthReferrer() {
}
function submitSignin() {
var reset = 'TuscanyOpenAuth=;expires=' + new Date(1970,01,01).toGMTString() + ';domain=.' + domainname(window.location.hostname) + ';path=/;secure=TRUE';
var reset = 'TuscanyOpenAuth=;expires=' + new Date(1970,01,01).toGMTString() + ';domain=.' + domainname(window.location.hostname) + ';path=/';
document.cookie = reset;
document.formSignin.httpd_location.value = oauthReferrer();
document.formSignin.submit();
}
function onload() {
// Show the page
document.body.style.visibility = 'visible';
// Scroll to the top and hide the address bar
window.scrollTo(0, 1);
window.scrollTo(0, 0);
return true;
}
</script>
</div>

View file

@ -17,17 +17,17 @@
* specific language governing permissions and limitations
* under the License.
-->
<html manifest="/cache-manifest.cmf">
<html>
<head>
<title>Sign out</title>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-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="/logout/"/>
<link rel="stylesheet" type="text/css" href="/ui-min.css"/>
<script type="text/javascript" src="/all-min.js"></script>
</head>
<body class="delayed" onload="ui.onload();" onbeforeunload="ui.onbeforeunload();">
<body class="delayed" onload="onload();">
<div id="bodydiv" class="bodydiv">
<h1>Sign out</h1>
@ -37,16 +37,25 @@
</form>
<script type="text/javascript">
ui.initbody();
function submitSignout() {
// Clear session cookie and local storage
var reset = 'TuscanyOpenAuth=; expires=' + new Date(1970,01,01).toGMTString() + '; domain=.' + domainname(window.location.hostname) + '; path=/; secure; version=1';
var reset = 'TuscanyOpenAuth=; expires=' + new Date(1970,01,01).toGMTString() + '; domain=.' + domainname(window.location.hostname) + '; path=/';
document.cookie = reset;
localStorage.clear();
document.signout.submit();
return true;
}
function onload() {
// Show the page
document.body.style.visibility = 'visible';
// Scroll to the top and hide the address bar
window.scrollTo(0, 1);
window.scrollTo(0, 0);
return true;
}
</script>
</div>

View file

@ -1,53 +0,0 @@
/*
* 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.
*/
var editWidget = sca.component("EditWidget");
var user= sca.defun(sca.reference(editWidget, "user"), "id");
/**
* Display the current signed in user.
*/
function userMenu() {
function UserMenu() {
this.content = function() {
var u = user.id()
return '<span>' + u + '</span>';
};
}
return new UserMenu();
}
/**
* Display the menu bar.
*/
function displaymenu() {
var mdiv = $('menu');
var name = ui.fragmentParams()['app'];
mdiv.innerHTML = ui.menubar(
append(mklist(ui.menu('Home', '/'), ui.menu('Store', '/store/')),
(isNil(name) || name == 'undefined')?
mklist() :
mklist(
ui.menu('Stats', '/stats/#app=' + name),
ui.menu('Page', '/page/#app=' + name),
ui.menu(isNil(config.compose)? 'Composition' : config.compose, '/graph/#app=' + name))),
mklist(ui.menu('Account', '/account/'), ui.menu('Sign out', '/logout/')));
}

View file

@ -0,0 +1,143 @@
<!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>
<title>Sorry</title>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, target-densitydpi=devicedpi"/>
<meta name="apple-mobile-web-app-capable" content="yes"/>
<meta name="apple-mobile-web-app-status-bar-style" content="black"/>
<base href="/notauth/"/>
<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 err', u, 'X-Login');
return null;
} else if (http.responseText == '' || http.getResponseHeader("Content-Type") == null) {
if (log) log('http err', u, 'No-Content');
return null;
}
localStorage.setItem(u, http.responseText);
return http.responseText;
}
if (log) log('http err', u, http.status, http.statusText);
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')));
})();
</script>
</head>
<body class="delayed" onload="onload();">
<div id="bodydiv" class="mainbodydiv">
<div id="headdiv" class="hsection">
<script type="text/javascript">
(function() {
$('headdiv').appendChild(ui.declareScript(appcache.get('/headconfig.js')));
})();
</script>
</div>
<div id="menu"></div>
<div id="content" class="viewloaded3d">
<table style="width: 100%;">
<tr><td><h2><span id="h1"></span></h2></td></tr>
</table>
<div style="margin-left: auto; margin-right: auto; text-align: center;">
<div class="hd2">Sorry, you're not authorized to view this page.</div>
</div>
</div>
<script type="text/javascript">
// Set page title
$('h1').innerHTML = ui.hometitle(location.hostname);
// Init div variables
var mdiv = $('menu');
var cdiv = $('content');
/**
* Build and show the menu bar.
*/
function showmenu(mdiv) {
mdiv.innerHTML = ui.menubar(
mklist(ui.menu('Home', '/', '_view', false), ui.menu('Store', '/#view=store', '_view', false)),
mklist(ui.menu('Account', '/#view=account', '_view', false), ui.menu('Sign out', '/logout/', '_self', false)));
}
showmenu($('menu'));
cdiv.style.top = ui.pixpos(mdiv.offsetTop + mdiv.offsetHeight);
/**
* Load post processing.
*/
function onload() {
// Show the page
document.body.style.visibility = 'visible';
// Scroll to the top and hide the address bar
window.scrollTo(0, 0);
return true;
}
</script>
<div id="footdiv" class="fsection">
<script type="text/javascript">
(function() {
$('footdiv').appendChild(ui.declareScript(appcache.get('/footconfig.js')));
})();
</script>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,144 @@
<!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>
<title>Page not found</title>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, target-densitydpi=devicedpi"/>
<meta name="apple-mobile-web-app-capable" content="yes"/>
<meta name="apple-mobile-web-app-status-bar-style" content="black"/>
<base href="/notfound/"/>
<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 err', u, 'X-Login');
return null;
} else if (http.responseText == '' || http.getResponseHeader("Content-Type") == null) {
if (log) log('http err', u, 'No-Content');
return null;
}
localStorage.setItem(u, http.responseText);
return http.responseText;
}
if (log) log('http err', u, http.status, http.statusText);
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')));
})();
</script>
</head>
<body class="delayed" onload="onload();">
<div id="bodydiv" class="mainbodydiv">
<div id="headdiv" class="hsection">
<script type="text/javascript">
(function() {
$('headdiv').appendChild(ui.declareScript(appcache.get('/headconfig.js')));
})();
</script>
</div>
<div id="menu"></div>
<div id="content" class="viewloaded3d">
<table style="width: 100%;">
<tr><td><h2><span id="h1"></span></h2></td></tr>
</table>
<div style="margin-left: auto; margin-right: auto; text-align: center;">
<div class="hd2">Sorry, that page was not found.</div>
<div>You may have clicked an expired link or mistyped the address.</div>
</div>
</div>
<script type="text/javascript">
// Set page title
$('h1').innerHTML = ui.hometitle(location.hostname);
// Init div variables
var mdiv = $('menu');
var cdiv = $('content');
/**
* Build and show the menu bar.
*/
function showmenu(mdiv) {
mdiv.innerHTML = ui.menubar(
mklist(ui.menu('Home', '/', '_view', false), ui.menu('Store', '/#view=store', '_view', false)),
mklist(ui.menu('Account', '/#view=account', '_view', false), ui.menu('Sign out', '/logout/', '_self', false)));
}
showmenu(mdiv);
div.style.top = ui.pixpos(mdiv.offsetTop + mdiv.offsetHeight);
/**
* Load post processing.
*/
function onload() {
// Show the page
document.body.style.visibility = 'visible';
// Scroll to the top and hide the address bar
window.scrollTo(0, 0);
return true;
}
</script>
<div id="footdiv" class="fsection">
<script type="text/javascript">
(function() {
$('footdiv').appendChild(ui.declareScript(appcache.get('/footconfig.js')));
})();
</script>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,144 @@
<!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>
<title>Page not found</title>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, target-densitydpi=devicedpi"/>
<meta name="apple-mobile-web-app-capable" content="yes"/>
<meta name="apple-mobile-web-app-status-bar-style" content="black"/>
<base href="/notyet/"/>
<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 err', u, 'X-Login');
return null;
} else if (http.responseText == '' || http.getResponseHeader("Content-Type") == null) {
if (log) log('http err', u, 'No-Content');
return null;
}
localStorage.setItem(u, http.responseText);
return http.responseText;
}
if (log) log('http err', u, http.status, http.statusText);
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')));
})();
</script>
</head>
<body class="delayed" onload="onload();">
<div id="bodydiv" class="mainbodydiv">
<div id="headdiv" class="hsection">
<script type="text/javascript">
(function() {
$('headdiv').appendChild(ui.declareScript(appcache.get('/headconfig.js')));
})();
</script>
</div>
<div id="menu"></div>
<div id="content" class="viewloaded3d">
<table style="width: 100%;">
<tr><td><h2><span id="h1"></span></h2></td></tr>
</table>
<div style="margin-left: auto; margin-right: auto; text-align: center;">
<div class="hd2">Sorry, that page is still under construction.</div>
<div>Please check back later.</div>
</div>
</div>
<script type="text/javascript">
// Set page title
$('h1').innerHTML = ui.hometitle(location.hostname);
// Init div variables
var mdiv = $('menu');
var cdiv = $('content');
/**
* Build and show the menu bar.
*/
function showmenu(mdiv) {
mdiv.innerHTML = ui.menubar(
mklist(ui.menu('Home', '/', '_view', false), ui.menu('Store', '/#view=store', '_view', false)),
mklist(ui.menu('Account', '/#view=account', '_view', false), ui.menu('Sign out', '/logout/', '_self', false)));
}
showmenu($('menu'));
cdiv.style.top = ui.pixpos(mdiv.offsetTop + mdiv.offsetHeight);
/**
* Load post processing.
*/
function onload() {
// Show the page
document.body.style.visibility = 'visible';
// Scroll to the top and hide the address bar
window.scrollTo(0, 0);
return true;
}
</script>
<div id="footdiv" class="fsection">
<script type="text/javascript">
(function() {
$('footdiv').appendChild(ui.declareScript(appcache.get('/footconfig.js')));
})();
</script>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,143 @@
<!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>
<title>Oops</title>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, target-densitydpi=devicedpi"/>
<meta name="apple-mobile-web-app-capable" content="yes"/>
<meta name="apple-mobile-web-app-status-bar-style" content="black"/>
<base href="/oops/"/>
<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 err', u, 'X-Login');
return null;
} else if (http.responseText == '' || http.getResponseHeader("Content-Type") == null) {
if (log) log('http err', u, 'No-Content');
return null;
}
localStorage.setItem(u, http.responseText);
return http.responseText;
}
if (log) log('http err', u, http.status, http.statusText);
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')));
})();
</script>
</head>
<body class="delayed" onload="onload();">
<div id="bodydiv" class="mainbodydiv">
<div id="headdiv" class="hsection">
<script type="text/javascript">
(function() {
$('headdiv').appendChild(ui.declareScript(appcache.get('/headconfig.js')));
})();
</script>
</div>
<div id="menu"></div>
<div id="content" class="viewloaded3d">
<table style="width: 100%;">
<tr><td><h2><span id="h1"></span></h2></td></tr>
</table>
<div style="margin-left: auto; margin-right: auto; text-align: center;">
<div class="hd2">Oops, something went wrong...</div>
</div>
</div>
<script type="text/javascript">
// Set page title
$('h1').innerHTML = ui.hometitle(location.hostname);
// Init div variables
var mdiv = $('menu');
var cdiv = $('content');
/**
* Build and show the menu bar.
*/
function showmenu(mdiv) {
mdiv.innerHTML = ui.menubar(
mklist(ui.menu('Home', '/', '_view', false), ui.menu('Store', '/#view=store', '_view', false)),
mklist(ui.menu('Account', '/#view=account', '_view', false), ui.menu('Sign out', '/logout/', '_self', false)));
}
showmenu($('menu'));
cdiv.style.top = ui.pixpos(mdiv.offsetTop + mdiv.offsetHeight);
/**
* Load post processing.
*/
function onload() {
// Show the page
document.body.style.visibility = 'visible';
// Scroll to the top and hide the address bar
window.scrollTo(0, 0);
return true;
}
</script>
<div id="footdiv" class="fsection">
<script type="text/javascript">
(function() {
$('footdiv').appendChild(ui.declareScript(appcache.get('/footconfig.js')));
})();
</script>
</div>
</div>
</body>
</html>

View file

@ -17,33 +17,8 @@
* specific language governing permissions and limitations
* under the License.
-->
<html manifest="/cache-manifest.cmf">
<head>
<title>Page</title>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-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"/>
<link rel="stylesheet" type="text/css" href="/ui-min.css"/>
<script type="text/javascript" src="/all-min.js"></script>
<script type="text/javascript" src="/menu.js"></script>
<script type="text/javascript" src="page.js"></script>
</head>
<body class="delayed" onload="ui.onload();" onbeforeunload="ui.onbeforeunload();">
<div id="bodydiv" class="bodydiv" style="overflow: visible;">
<div id="headdiv" class="hsection">
<script type="text/javascript" src="/headconfig.js"></script>
</div>
<div id="menubackground" style="position: absolute; top: 0px; left: 0px; z-index: -1; width: 2500px;">
<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">&nbsp</span></td></tr></table>
</td></tr></table>
</div>
<div id="menu"></div>
<table style="width: 100%;">
<tr>
<td><h2><span id="appNameHeader"></span></h2></td>
@ -59,10 +34,6 @@
<table id="widgetValueTable" style="width: 100%;">
<tr>
<td class="thr thl" style="padding-left: 2px; padding-right: 2px; vertical-align: top; width: 100%;">
<input id="widgetValue" type="text" value="" title="Widget value" autocapitalize="off" placeholder="Value" style="position: relative; width: 100%;"/>
</td>
<td class="thl thr" style="text-align: right; padding-right: 2px; vertical-align: top;">
<span id="deleteWidgetButton" title="Delete a Widget" class="graybutton" style="font-weight: bold; font-size: 16px; color: #808080; display: inline-block; width: 24px; height: 20px; padding-top: 0px; padding-bottom: 0px; text-align: center; margin-left: 0px; margin-right: 0px;">-</span>
@ -72,13 +43,17 @@
<span id="playPageButton" title="View page" class="graybutton" style="font-weight: bold; font-size: 16px; display: inline-block; width: 24px; height: 20px; padding-top: 0px; padding-bottom: 0px; middle; text-align: center; margin-left: 0px; margin-right: 0px;">&gt;</span>
</td>
<td class="thl thr" style="padding-left: 2px; padding-right: 2px; vertical-align: top; width: 100%;">
<input id="widgetValue" type="text" value="" title="Widget value" autocapitalize="off" placeholder="Value" style="position: relative; visibility: hidden; width: 100%;"/>
</td>
</tr>
</table>
<div id="contentdiv" style="margin-top: 4px; width: 2500px">
<div id="contentdiv" style="margin-top: 4px; width: 2500px;">
<div id="editdiv" style="visibility: visible; position: relative; top: 0px; left: -2500px; width: 2500px; height: 5000px;">
<div style="position: relative; left: 2500px; top: 0px; right: 0px; height: 5000px; border:1px; border-style: solid; border-color: #a2bae7; background: url(/public/grid72.png);"></div>
<div style="position: relative; left: 2500px; top: 0px; right: 0px; height: 5000px; border:1px; border-style: solid; border-color: #a2bae7;"><span id="editgrid"></span></div>
<div class="guide" style="position: absolute; left: 2500px; top: 0px; width: 320px; height: 460px;"></div>
<div class="guide" style="position: absolute; left: 2500px; top: 0px; width: 480px; height: 300px;"></div>
<div class="guide" style="position: absolute; left: 2500px; top: 0px; width: 768px; height: 911px;"></div>
@ -101,7 +76,7 @@
<span class="link" id="palette:link" style="position: absolute; left: 0px; top: 340px;"><a href="/"><span>link</span></a></span>
<span class="text" id="palette:text" style="position: absolute; left: 0px; top: 370px;"><span>text</span></span>
<span class="iframe fakeframe" id="palette:iframe" style="position: absolute; left: 0px; top: 400px; width: 200px;"><a href="/public/iframe.html"><span class="fakeframe"><span>frame ...</span></span></a></span>
<span class="img" id="palette:img" style="position: absolute; left: 0px; top: 430px;"><img src="/public/img.png"/></span>
<span class="img" id="palette:img" style="position: absolute; left: 0px; top: 430px;"><img id="imgimg"/></span>
</div>
<div id="playdiv" style="visibility: hidden; position: absolute; top: 0px; left: 0px; width: 2500px; height: 5000px;">
@ -112,20 +87,17 @@
<div id="buffer" style="visibility: hidden; width: 0px; height: 0px"></div>
<script type="text/javascript">
ui.initbody();
// Get the app name
var appname = ui.fragmentParams()['app'];
if (isNil(appname))
window.open('/', '_self');
var appname = ui.fragmentParams(location)['app'];
/**
* Return the link to an app.
*/
function applink(appname) {
var protocol = window.location.protocol;
var host = window.location.hostname;
var port = ':' + window.location.port;
var protocol = location.protocol;
var host = location.hostname;
var port = ':' + location.port;
if (port == ':80' || port == ':443' || port == ':')
port = '';
var link = protocol + '//' + appname + '.' + host + port + '/';
@ -133,12 +105,9 @@ function applink(appname) {
}
// Set page titles
document.title = windowtitle(window.location.hostname) + ' - Page - ' + appname;
document.title = ui.windowtitle(location.hostname) + ' - Page - ' + appname;
$('appNameHeader').innerHTML = '<a href=\"' + applink(appname) + '\" target=\"' + '_blank' + '\">' + appname + '</a>';
// Load the menu bar
displaymenu();
/**
* Page editor area, widget value field, add, delete and play page buttons.
*/
@ -152,6 +121,10 @@ var wdelete = $('deleteWidgetButton');
var wcopy = $('copyWidgetButton');
var pplay = $('playPageButton');
// Set images
$('editgrid').parentNode.style.background = 'url(\'' + ui.b64img(appcache.get('/public/grid72.b64')) + '\')';
$('imgimg').src = ui.b64img(appcache.get('/public/img.b64'));
// Position edit and play divs inside the content div
ediv.style.position = 'absolute';
ediv.style.top = cdiv.offsetTop + 'px';
@ -159,10 +132,6 @@ pdiv.style.position = 'absolute';
pdiv.style.top = cdiv.offsetTop + 'px';
// Position background divs
var mbackground = $('menubackground');
var menudiv = $('menu');
mbackground.style.top = ui.pixpos(menudiv.offsetTop);
var wvbackground = $('widgetValueBackground');
var wvtable = $('widgetValueTable');
wvbackground.style.top = ui.pixpos(wvtable.offsetTop);
@ -183,6 +152,569 @@ window.onresize = resizeFields;
var editWidget = sca.component("EditWidget");
var pages = sca.reference(editWidget, "pages");
/**
* Page editing functions.
*/
var page = {};
/**
* Default positions and sizes.
*/
page.palcx = 2500;
/**
* Init a page editor. Works with all browsers except IE.
*/
page.edit = function(elem, wvalue, wadd, wcopy, wdelete, onchange, onselect) {
// Track element dragging and selection
page.dragging = null;
page.selected = null;
wvalue.disabled = true;
wvalue.style.visibility = 'hidden';
wcopy.disabled = true;
wdelete.disabled = true;
// Trigger widget select and page change events
page.onpagechange = onchange;
page.onwidgetselect = onselect;
/**
* Handle a mouse down event.
*/
elem.onmousedown = function(e) {
// On mouse controlled devices, engage the click component selection
// logic right away
if (typeof e.touches == 'undefined')
elem.onclick(e);
// Find a draggable element
var dragging = page.draggable(e.target, elem);
if (dragging == null || dragging != page.selected)
return true;
page.dragging = dragging;
// Remember mouse position
var pos = typeof e.touches != "undefined"? e.touches[0] : e;
page.dragX = pos.screenX;
page.dragY = pos.screenY;
if (e.preventDefault)
e.preventDefault();
else
e.returnValue = false;
return true;
};
// Support touch devices
elem.ontouchstart = elem.onmousedown;
/**
* Handle a mouse up event.
*/
elem.onmouseup = function(e) {
if (page.dragging == null)
return true;
// Snap to grid
var newX = page.gridsnap(ui.numpos(page.dragging.style.left));
var newY = page.gridsnap(ui.numpos(page.dragging.style.top));
page.dragging.style.left = ui.pixpos(newX);
page.dragging.style.top = ui.pixpos(newY);
page.dragging.cover.style.left = ui.pixpos(newX);
page.dragging.cover.style.top = ui.pixpos(newY);
// Fixup widget style
page.fixupwidget(page.dragging);
// Forget dragged element
page.dragging = null;
// Trigger page change event
page.onpagechange(false);
return true;
};
// Support touch devices
elem.ontouchend = elem.onmouseup;
/**
* Handle a mouse move event.
*/
window.onmousemove = function(e) {
if (page.dragging == null)
return true;
// Get the mouse position
var pos = typeof e.touches != "undefined"? e.touches[0] : e;
if (pos.screenX == page.dragX && pos.screenY == page.dragY)
return true;
// Compute position of dragged element
var curX = ui.numpos(page.dragging.style.left);
var curY = ui.numpos(page.dragging.style.top);
var newX = curX + (pos.screenX - page.dragX);
var newY = curY + (pos.screenY - page.dragY);
if (newX >= page.palcx)
page.dragX = pos.screenX;
else
newX = page.palcx;
if (newY >= 0)
page.dragY = pos.screenY;
else
newY = 0;
// Move the dragged element
page.dragging.style.left = ui.pixpos(newX);
page.dragging.style.top = ui.pixpos(newY);
page.dragging.cover.style.left = ui.pixpos(newX);
page.dragging.cover.style.top = ui.pixpos(newY);
return true;
};
// Support touch devices
elem.ontouchmove = window.onmousemove;
/**
* Handle a mouse click event.
*/
elem.onclick = function(e) {
// Find selected element
var selected = page.draggable(e.target, elem);
if (selected == null) {
if (page.selected != null) {
// Reset current selection
page.widgetselect(page.selected, false, wvalue, wcopy, wdelete);
page.selected = null;
// Trigger widget select event
page.onwidgetselect(null);
}
// Dismiss the palette
if (ui.numpos(elem.style.left) != (page.palcx * -1))
elem.style.left = ui.pixpos(page.palcx * -1);
return true;
}
// Deselect the previously selected element
page.widgetselect(page.selected, false, wvalue, wcopy, wdelete);
// Clone element dragged from palette
if (selected.id.substring(0, 8) == 'palette:') {
page.selected = page.clone(selected);
// Move into the editing area and hide the palette
page.selected.style.left = ui.pixpos(ui.numpos(page.selected.style.left) + page.palcx);
page.selected.cover.style.left = ui.pixpos(ui.numpos(page.selected.cover.style.left) + page.palcx);
elem.style.left = ui.pixpos(page.palcx * -1);
// Bring it to the top
page.bringtotop(page.selected);
// Trigger page change event
page.onpagechange(true);
} else {
// Bring selected element to the top
page.selected = selected;
page.bringtotop(page.selected);
}
// Select the element
page.widgetselect(page.selected, true, wvalue, wcopy, wdelete);
// Trigger widget select event
page.onwidgetselect(page.selected);
return true;
};
/**
* Handle field on change events.
*/
wvalue.onchange = wvalue.onblur = function() {
if (page.selected == null)
return false;
page.settext(page.selected, wvalue.value);
page.selected.cover.style.width = ui.pixpos(page.selected.clientWidth + 4);
page.selected.cover.style.height = ui.pixpos(page.selected.clientHeight + 4);
// Trigger page change event
page.onpagechange(true);
return false;
};
// Handle add widget event.
wadd.onclick = function() {
// Show the palette
elem.style.left = ui.pixpos(0);
return false;
};
// Handle delete event.
wdelete.onclick = function() {
if (page.selected == null)
return false;
// Reset current selection
page.widgetselect(page.selected, false, wvalue, wcopy, wdelete);
// Remove selected widget
page.selected.parentNode.removeChild(page.selected);
page.selected.cover.parentNode.removeChild(page.selected.cover);
page.selected = null;
// Trigger widget select event
page.onwidgetselect(null);
// Trigger page change event
page.onpagechange(true);
return false;
};
// Handle copy event.
wcopy.onclick = function() {
if (page.selected == null)
return false;
if (page.selected.id.substring(0, 8) == 'palette:')
return false;
// Reset current selection
page.widgetselect(page.selected, false, wvalue, wcopy, wdelete);
// Clone selected widget
page.selected = page.clone(page.selected);
// Move 10 pixels down right
page.selected.style.left = ui.pixpos(ui.numpos(page.selected.style.left) + 10);
page.selected.style.top = ui.pixpos(ui.numpos(page.selected.style.top) + 10);
page.selected.cover.style.left = ui.pixpos(ui.numpos(page.selected.cover.style.left) + 10);
page.selected.cover.style.top = ui.pixpos(ui.numpos(page.selected.cover.style.top) + 10);
// Bring it to the top
page.bringtotop(page.selected);
// Select the element
page.widgetselect(page.selected, true, wvalue, wcopy, wdelete);
// Trigger widget select event
page.onwidgetselect(page.selected);
// Trigger page change event
page.onpagechange(true);
return false;
};
// Cover child elements with span elements to prevent
// any input events to reach them
map(page.cover, nodeList(elem.childNodes));
return elem;
};
/**
* Return the text of a widget.
*/
page.text = function(e) {
function formula(e) {
var f = e.id;
if (f.substring(0, 5) != 'page:')
return '=' + f;
return '';
}
function constant(e, f) {
if (e.className == 'h1' || e.className == 'h2' || e.className == 'text' || e.className == 'section') {
var t = car(childElements(e)).innerHTML;
return t == f? '' : t;
}
if (e.className == 'button' || e.className == 'checkbox') {
var t = car(childElements(e)).value;
return t == f? '' : t;
}
if (e.className == 'entry' || e.className == 'password') {
var t = car(childElements(e)).defaultValue;
return t == f? '' : t;
}
if (e.className == 'select') {
var t = car(childElements(car(childElements(e)))).value;
return t == f? '' : t;
}
if (e.className == 'link') {
var lhr = car(childElements(e)).href;
var hr = lhr.substring(0, 5) == 'link:'? lhr.substring(5) : '';
var t = car(childElements(car(childElements(e)))).innerHTML;
return t == f? hr : (t == hr? hr : (t == ''? hr : hr + ',' + t));
}
if (e.className == 'img') {
var src = car(childElements(e)).src;
return src == location.href? '' : src;
}
if (e.className == 'iframe') {
var hr = car(childElements(e)).href;
return hr == location.href? '' : hr;
}
if (e.className == 'list')
return '';
if (e.className == 'table')
return '';
return '';
}
var f = formula(e);
var c = constant(e, f);
return f == ''? c : (c == ''? f : f + ',' + c);
};
/**
* Return true if a widget has editable text.
*/
page.hastext = function(e) {
if (e.className == 'h1' || e.className == 'h2' || e.className == 'text' || e.className == 'section')
return true;
if (e.className == 'button' || e.className == 'checkbox')
return true;
if (e.className == 'entry' || e.className == 'password')
return true;
if (e.className == 'select')
return false;
if (e.className == 'link')
return true;
if (e.className == 'img')
return true;
if (e.className == 'iframe')
return true;
if (e.className == 'list')
return false;
if (e.className == 'table')
return false;
return false;
};
/**
* Set the text of a widget.
*/
page.settext = function(e, t) {
function formula(t) {
if (t.length > 1 && t.substring(0, 1) == '=')
return car(t.split(','));
return '';
}
function constant(t) {
return t.length > 1 && t.substring(0, 1) == '='? cdr(t.split(',')) : t.split(',');
}
var f = formula(t);
var c = constant(t);
e.id = f != ''? f.substring(1) : ('page:' + e.className);
if (e.className == 'h1' || e.className == 'h2' || e.className == 'text' || e.className == 'section') {
car(childElements(e)).innerHTML = isNil(c)? f : car(c);
return t;
}
if (e.className == 'button' || e.className == 'entry' || e.className == 'password') {
car(childElements(e)).defaultValue = isNil(c)? f : car(c);
return t;
}
if (e.className == 'checkbox') {
car(childElements(e)).value = isNil(c)? f : car(c);
map(function(n) { if (n.nodeName == "SPAN") n.innerHTML = isNil(c)? f : car(c); return n; }, nodeList(e.childNodes));
return t;
}
if (e.className == 'select') {
var ce = car(childElements(car(childElements(e))));
ce.value = isNil(c)? f : car(c);
ce.innerHTML = isNil(c)? f : car(c);
return t;
}
if (e.className == 'list') {
e.innerHTML = '<table class="datatable" style="width: 100%;;"><tr><td class="datatd">' + (isNil(c)? f : car(c)) + '</td></tr><tr><td class="datatd">...</td></tr></table>';
return t;
}
if (e.className == 'table') {
e.innerHTML = '<table class="datatable" style="width: 100%;"><tr><td class="datatdl">' + (isNil(c)? f : car(c)) + '</td><td class="datatdr">...</td></tr><tr><td class="datatdl">...</td><td class="datatdr">...</td></tr></table>';
return t;
}
if (e.className == 'link') {
var ce = car(childElements(e));
ce.href = isNil(c)? 'link:/index.html' : ('link:' + car(c));
car(childElements(ce)).innerHTML = isNil(c)? (f != ''? f : '/index.html') : isNil(cdr(c))? (f != ''? f : car(c)) : cadr(c);
return t;
}
if (e.className == 'img') {
car(childElements(e)).src = isNil(c)? '/public/img.png' : car(c);
return t;
}
if (e.className == 'iframe') {
car(childElements(e)).href = isNil(c)? '/public/iframe.html' : car(c);
return t;
}
return '';
};
/**
* Initial fixup of a widget.
*/
page.fixupwidget = function(e) {
if (e.className == 'iframe') {
var f = car(childElements(e));
//e.innerHTML = '<iframe src="' + f.href + '" frameborder="no" scrolling="no"></iframe>';
return e;
}
if (e.className == 'section') {
e.style.width = '100%';
return e;
}
if (e.className == 'list') {
e.style.width = '100%';
car(childElements(e)).style.width = '100%';
return e;
}
if (e.className == 'table') {
e.style.width = '100%';
car(childElements(e)).style.width = '100%';
return e;
}
if (e.className == 'img') {
var i = car(childElements(e));
if (i.src != '' && i.src.substring(0, 5) == 'data:')
i.src = '/public/img.png';
return e;
}
return e;
}
/**
* Find a draggable element in a hierarchy of elements.
*/
page.draggable = function(n, e) {
if (n == e)
return null;
if (n.id != '')
return n;
if (n.covered)
return n.covered;
return page.draggable(n.parentNode, e);
}
/**
* Align a pos along a 9pixel grid.
*/
page.gridsnap = function(x) {
return Math.round(x / 9) * 9;
}
/**
* Bring an element and its parent to the top.
*/
page.bringtotop = function(n) {
n.parentNode.appendChild(n);
n.cover.parentNode.appendChild(n.cover);
}
/**
* Draw widget selection.
*/
page.widgetselect = function(n, s, wvalue, wcopy, wdelete) {
if (isNil(n) || !s) {
// Clear the widget value field
wvalue.value = '';
wvalue.disabled = true;
wvalue.style.visibility = 'hidden';
wcopy.disabled = true;
wdelete.disabled = true;
// Clear the widget outline
if (!isNil(n))
n.cover.style.borderWidth = '0px';
return true;
}
// Update the widget value field
wvalue.value = page.text(n);
wvalue.disabled = false;
wvalue.style.visibility = 'visible';
wcopy.disabled = false;
wdelete.disabled = false;
// Outline the widget
n.cover.style.borderWidth = '2px';
return true;
};
/**
* Cover a page element with a <span> element to prevent
* any input events to reach it.
*/
page.cover = function(e) {
if (e.id == '' || isNil(e.style))
return e;
var cover = document.createElement('div');
cover.style.position = 'absolute';
cover.style.left = ui.pixpos(ui.numpos(e.style.left) - 2);
cover.style.top = ui.pixpos(ui.numpos(e.style.top) - 2);
cover.style.width = ui.pixpos(e.clientWidth + 4);
cover.style.height = ui.pixpos(e.clientHeight + 4);
cover.style.visibility = 'inherit';
cover.style.borderStyle = 'solid';
cover.style.borderWidth = '0px';
cover.style.borderColor = '#598edd';
cover.style.padding = '0px';
cover.style.margin = '0px';
cover.covered = e;
e.cover = cover;
e.parentNode.appendChild(cover);
return e;
}
/**
* Clone a palette element.
*/
page.clone = function(e) {
/**
* Clone an element's HTML.
*/
function mkclone(e) {
var ne = document.createElement('span');
// Skip the palette: prefix
ne.id = 'page:' + e.id.substr(8);
// Copy the class and HTML content
ne.className = e.className;
ne.innerHTML = e.innerHTML;
// Fixup the widget style
page.fixupwidget(ne);
return ne;
}
/**
* Clone an element's position.
*/
function posclone(ne, e) {
ne.style.position = 'absolute';
ne.style.left = ui.pixpos(ui.numpos(e.style.left));
ne.style.top = ui.pixpos(ui.numpos(e.style.top));
e.parentNode.appendChild(ne);
page.cover(ne);
return ne;
}
return posclone(mkclone(e), e);
};
/**
* Return the page in an ATOM entry.
*/
@ -372,21 +904,6 @@ function onpagechange(prop) {
return true;
}
/**
* Return the link to a component value.
*/
function compvaluelink(appname, cname) {
if (cname == '' || isNil(cname))
return '';
var protocol = window.location.protocol;
var host = window.location.hostname;
var port = ':' + window.location.port;
if (port == ':80' || port == ':443' || port == ':')
port = '';
var link = protocol + '//' + appname + '.' + host + port + '/data/#component=' + cname;
return link;
}
/**
* Handle a widget select event.
*/
@ -394,14 +911,13 @@ function onwidgetselect(w) {
if (w == widget)
return true;
widget = w;
var link = compvaluelink(appname, isNil(w)? '' : w.id);
function updateButton(b, v) {
b.style.color = v? '#000000' : '#808080';
}
updateButton(wdelete, link != '');
updateButton(wcopy, link != '');
updateButton(wdelete, !isNil(w));
updateButton(wcopy, !isNil(w));
return true;
}
@ -415,12 +931,14 @@ function playpage() {
page.selected = null;
wvalue.value = applink(appname);
pplay.innerHTML = '&lt;';
ediv.style.visibility = 'hidden'
evisible = false;
pdiv.style.visibility = 'visible';
pdiv.innerHTML = '';
pdiv.innerHTML = '<iframe id="playappframe" style="position: relative; height: 5000px; width: 2500px; border: 0px;" scrolling="no" frameborder="0" src="' +
applink(appname) + '"></iframe>';
setTimeout(function() {
ediv.style.visibility = 'hidden'
}, 0);
return true;
}
@ -431,12 +949,14 @@ function showedit() {
if (evisible)
return true;
pplay.innerHTML = '&gt;';
pdiv.style.visibility = 'hidden';
pdiv.innerHTML = '';
ediv.style.visibility = 'visible'
evisible = true;
page.widgetselect(widget, true, wvalue, wcopy, wdelete);
page.selected = widget;
setTimeout(function() {
pdiv.style.visibility = 'hidden';
pdiv.innerHTML = '';
}, 0);
return true;
}
@ -454,13 +974,7 @@ page.edit(ediv, wvalue, wadd, wcopy, wdelete, onpagechange, onwidgetselect);
// Get and display the current app page
getpage(appname, ediv);
</script>
<div id="footdiv" class="fsection">
<script type="text/javascript" src="/footconfig.js"></script>
</div>
</div>
</body>
</html>

View file

@ -1,573 +0,0 @@
/*
* 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.
*/
/**
* Page editing functions.
*/
var page = {};
/**
* Default positions and sizes.
*/
var palcx = 2500;
/**
* Init a page editor. Works with all browsers except IE.
*/
page.edit = function(elem, wvalue, wadd, wcopy, wdelete, onchange, onselect) {
// Track element dragging and selection
page.dragging = null;
page.selected = null;
wvalue.disabled = true;
wcopy.disabled = true;
wdelete.disabled = true;
// Trigger widget select and page change events
page.onpagechange = onchange;
page.onwidgetselect = onselect;
/**
* Handle a mouse down event.
*/
elem.onmousedown = function(e) {
// On mouse controlled devices, engage the click component selection
// logic right away
if (typeof e.touches == 'undefined')
elem.onclick(e);
// Find a draggable element
var dragging = page.draggable(e.target, elem);
if (dragging == null || dragging != page.selected)
return true;
page.dragging = dragging;
// Remember mouse position
var pos = typeof e.touches != "undefined"? e.touches[0] : e;
page.dragX = pos.screenX;
page.dragY = pos.screenY;
if (e.preventDefault)
e.preventDefault();
else
e.returnValue = false;
return true;
};
// Support touch devices
elem.ontouchstart = elem.onmousedown;
/**
* Handle a mouse up event.
*/
elem.onmouseup = function(e) {
if (page.dragging == null)
return true;
// Snap to grid
var newX = page.gridsnap(ui.numpos(page.dragging.style.left));
var newY = page.gridsnap(ui.numpos(page.dragging.style.top));
page.dragging.style.left = ui.pixpos(newX);
page.dragging.style.top = ui.pixpos(newY);
page.dragging.cover.style.left = ui.pixpos(newX);
page.dragging.cover.style.top = ui.pixpos(newY);
// Fixup widget style
page.fixupwidget(page.dragging);
// Forget dragged element
page.dragging = null;
// Trigger page change event
page.onpagechange(false);
return true;
};
// Support touch devices
elem.ontouchend = elem.onmouseup;
/**
* Handle a mouse move event.
*/
window.onmousemove = function(e) {
if (page.dragging == null)
return true;
// Get the mouse position
var pos = typeof e.touches != "undefined"? e.touches[0] : e;
if (pos.screenX == page.dragX && pos.screenY == page.dragY)
return true;
// Compute position of dragged element
var curX = ui.numpos(page.dragging.style.left);
var curY = ui.numpos(page.dragging.style.top);
var newX = curX + (pos.screenX - page.dragX);
var newY = curY + (pos.screenY - page.dragY);
if (newX >= palcx)
page.dragX = pos.screenX;
else
newX = palcx;
if (newY >= 0)
page.dragY = pos.screenY;
else
newY = 0;
// Move the dragged element
page.dragging.style.left = ui.pixpos(newX);
page.dragging.style.top = ui.pixpos(newY);
page.dragging.cover.style.left = ui.pixpos(newX);
page.dragging.cover.style.top = ui.pixpos(newY);
return true;
};
// Support touch devices
elem.ontouchmove = window.onmousemove;
/**
* Handle a mouse click event.
*/
elem.onclick = function(e) {
// Find selected element
var selected = page.draggable(e.target, elem);
if (selected == null) {
if (page.selected != null) {
// Reset current selection
page.widgetselect(page.selected, false, wvalue, wcopy, wdelete);
page.selected = null;
// Trigger widget select event
page.onwidgetselect(null);
}
// Dismiss the palette
if (ui.numpos(elem.style.left) != (palcx * -1))
elem.style.left = ui.pixpos(palcx * -1);
return true;
}
// Deselect the previously selected element
page.widgetselect(page.selected, false, wvalue, wcopy, wdelete);
// Clone element dragged from palette
if (selected.id.substring(0, 8) == 'palette:') {
page.selected = page.clone(selected);
// Move into the editing area and hide the palette
page.selected.style.left = ui.pixpos(ui.numpos(page.selected.style.left) + palcx);
page.selected.cover.style.left = ui.pixpos(ui.numpos(page.selected.cover.style.left) + palcx);
elem.style.left = ui.pixpos(palcx * -1);
// Bring it to the top
page.bringtotop(page.selected);
// Trigger page change event
page.onpagechange(true);
} else {
// Bring selected element to the top
page.selected = selected;
page.bringtotop(page.selected);
}
// Select the element
page.widgetselect(page.selected, true, wvalue, wcopy, wdelete);
// Trigger widget select event
page.onwidgetselect(page.selected);
return true;
};
/**
* Handle field on change events.
*/
wvalue.onchange = wvalue.onblur = function() {
if (page.selected == null)
return false;
page.settext(page.selected, wvalue.value);
page.selected.cover.style.width = ui.pixpos(page.selected.clientWidth + 4);
page.selected.cover.style.height = ui.pixpos(page.selected.clientHeight + 4);
// Trigger page change event
page.onpagechange(true);
return false;
};
// Handle add widget event.
wadd.onclick = function() {
// Show the palette
elem.style.left = ui.pixpos(0);
return false;
};
// Handle delete event.
wdelete.onclick = function() {
if (page.selected == null)
return false;
// Reset current selection
page.widgetselect(page.selected, false, wvalue, wcopy, wdelete);
// Remove selected widget
page.selected.parentNode.removeChild(page.selected);
page.selected.cover.parentNode.removeChild(page.selected.cover);
page.selected = null;
// Trigger widget select event
page.onwidgetselect(null);
// Trigger page change event
page.onpagechange(true);
return false;
};
// Handle copy event.
wcopy.onclick = function() {
if (page.selected == null)
return false;
if (page.selected.id.substring(0, 8) == 'palette:')
return false;
// Reset current selection
page.widgetselect(page.selected, false, wvalue, wcopy, wdelete);
// Clone selected widget
page.selected = page.clone(page.selected);
// Move 10 pixels down right
page.selected.style.left = ui.pixpos(ui.numpos(page.selected.style.left) + 10);
page.selected.style.top = ui.pixpos(ui.numpos(page.selected.style.top) + 10);
page.selected.cover.style.left = ui.pixpos(ui.numpos(page.selected.cover.style.left) + 10);
page.selected.cover.style.top = ui.pixpos(ui.numpos(page.selected.cover.style.top) + 10);
// Bring it to the top
page.bringtotop(page.selected);
// Select the element
page.widgetselect(page.selected, true, wvalue, wcopy, wdelete);
// Trigger widget select event
page.onwidgetselect(page.selected);
// Trigger page change event
page.onpagechange(true);
return false;
};
// Cover child elements with span elements to prevent
// any input events to reach them
map(page.cover, nodeList(elem.childNodes));
return elem;
};
/**
* Return the text of a widget.
*/
page.text = function(e) {
function formula(e) {
var f = e.id;
if (f.substring(0, 5) != 'page:')
return '=' + f;
return '';
}
function constant(e, f) {
if (e.className == 'h1' || e.className == 'h2' || e.className == 'text' || e.className == 'section') {
var t = car(childElements(e)).innerHTML;
return t == f? '' : t;
}
if (e.className == 'button' || e.className == 'checkbox') {
var t = car(childElements(e)).value;
return t == f? '' : t;
}
if (e.className == 'entry' || e.className == 'password') {
var t = car(childElements(e)).defaultValue;
return t == f? '' : t;
}
if (e.className == 'select') {
var t = car(childElements(car(childElements(e)))).value;
return t == f? '' : t;
}
if (e.className == 'link') {
var lhr = car(childElements(e)).href;
var hr = lhr.substring(0, 5) == 'link:'? lhr.substring(5) : '';
var t = car(childElements(car(childElements(e)))).innerHTML;
return t == f? hr : (t == hr? hr : (t == ''? hr : hr + ',' + t));
}
if (e.className == 'img') {
var src = car(childElements(e)).src;
return src == window.location.href? '' : src;
}
if (e.className == 'iframe') {
var hr = car(childElements(e)).href;
return hr == window.location.href? '' : hr;
}
if (e.className == 'list')
return '';
if (e.className == 'table')
return '';
return '';
}
var f = formula(e);
var c = constant(e, f);
return f == ''? c : (c == ''? f : f + ',' + c);
};
/**
* Return true if a widget has editable text.
*/
page.hastext = function(e) {
if (e.className == 'h1' || e.className == 'h2' || e.className == 'text' || e.className == 'section')
return true;
if (e.className == 'button' || e.className == 'checkbox')
return true;
if (e.className == 'entry' || e.className == 'password')
return true;
if (e.className == 'select')
return false;
if (e.className == 'link')
return true;
if (e.className == 'img')
return true;
if (e.className == 'iframe')
return true;
if (e.className == 'list')
return false;
if (e.className == 'table')
return false;
return false;
};
/**
* Set the text of a widget.
*/
page.settext = function(e, t) {
function formula(t) {
if (t.length > 1 && t.substring(0, 1) == '=')
return car(t.split(','));
return '';
}
function constant(t) {
return t.length > 1 && t.substring(0, 1) == '='? cdr(t.split(',')) : t.split(',');
}
var f = formula(t);
var c = constant(t);
e.id = f != ''? f.substring(1) : ('page:' + e.className);
if (e.className == 'h1' || e.className == 'h2' || e.className == 'text' || e.className == 'section') {
car(childElements(e)).innerHTML = isNil(c)? f : car(c);
return t;
}
if (e.className == 'button' || e.className == 'entry' || e.className == 'password') {
car(childElements(e)).defaultValue = isNil(c)? f : car(c);
return t;
}
if (e.className == 'checkbox') {
car(childElements(e)).value = isNil(c)? f : car(c);
map(function(n) { if (n.nodeName == "SPAN") n.innerHTML = isNil(c)? f : car(c); return n; }, nodeList(e.childNodes));
return t;
}
if (e.className == 'select') {
var ce = car(childElements(car(childElements(e))));
ce.value = isNil(c)? f : car(c);
ce.innerHTML = isNil(c)? f : car(c);
return t;
}
if (e.className == 'list') {
e.innerHTML = '<table class="datatable" style="width: 100%;;"><tr><td class="datatd">' + (isNil(c)? f : car(c)) + '</td></tr><tr><td class="datatd">...</td></tr></table>';
return t;
}
if (e.className == 'table') {
e.innerHTML = '<table class="datatable" style="width: 100%;"><tr><td class="datatdl">' + (isNil(c)? f : car(c)) + '</td><td class="datatdr">...</td></tr><tr><td class="datatdl">...</td><td class="datatdr">...</td></tr></table>';
return t;
}
if (e.className == 'link') {
var ce = car(childElements(e));
ce.href = isNil(c)? 'link:/index.html' : ('link:' + car(c));
car(childElements(ce)).innerHTML = isNil(c)? (f != ''? f : '/index.html') : isNil(cdr(c))? (f != ''? f : car(c)) : cadr(c);
return t;
}
if (e.className == 'img') {
car(childElements(e)).src = isNil(c)? '/public/img.png' : car(c);
return t;
}
if (e.className == 'iframe') {
car(childElements(e)).href = isNil(c)? '/public/iframe.html' : car(c);
return t;
}
return '';
};
/**
* Initial fixup of a widget.
*/
page.fixupwidget = function(e) {
if (e.className == 'iframe') {
var f = car(childElements(e));
//e.innerHTML = '<iframe src="' + f.href + '" frameborder="no" scrolling="no"></iframe>';
return e;
}
if (e.className == 'section') {
e.style.width = '100%';
return e;
}
if (e.className == 'list') {
e.style.width = '100%';
car(childElements(e)).style.width = '100%';
return e;
}
if (e.className == 'table') {
e.style.width = '100%';
car(childElements(e)).style.width = '100%';
return e;
}
return e;
}
/**
* Find a draggable element in a hierarchy of elements.
*/
page.draggable = function(n, e) {
if (n == e)
return null;
if (n.id != '')
return n;
if (n.covered)
return n.covered;
return page.draggable(n.parentNode, e);
}
/**
* Align a pos along a 9pixel grid.
*/
page.gridsnap = function(x) {
return Math.round(x / 9) * 9;
}
/**
* Bring an element and its parent to the top.
*/
page.bringtotop = function(n) {
n.parentNode.appendChild(n);
n.cover.parentNode.appendChild(n.cover);
}
/**
* Draw widget selection.
*/
page.widgetselect = function(n, s, wvalue, wcopy, wdelete) {
if (isNil(n) || !s) {
// Clear the widget value field
wvalue.value = '';
wvalue.disabled = true;
wcopy.disabled = true;
wdelete.disabled = true;
// Clear the widget outline
if (!isNil(n))
n.cover.style.borderWidth = '0px';
return true;
}
// Update the widget value field
wvalue.value = page.text(n);
wvalue.disabled = false;
wcopy.disabled = false;
wdelete.disabled = false;
// Outline the widget
n.cover.style.borderWidth = '2px';
return true;
};
/**
* Cover a page element with a <span> element to prevent
* any input events to reach it.
*/
page.cover = function(e) {
if (e.id == '' || isNil(e.style))
return e;
var cover = document.createElement('div');
cover.style.position = 'absolute';
cover.style.left = ui.pixpos(ui.numpos(e.style.left) - 2);
cover.style.top = ui.pixpos(ui.numpos(e.style.top) - 2);
cover.style.width = ui.pixpos(e.clientWidth + 4);
cover.style.height = ui.pixpos(e.clientHeight + 4);
cover.style.visibility = 'inherit';
cover.style.borderStyle = 'solid';
cover.style.borderWidth = '0px';
cover.style.borderColor = '#598edd';
cover.style.padding = '0px';
cover.style.margin = '0px';
cover.covered = e;
e.cover = cover;
e.parentNode.appendChild(cover);
return e;
}
/**
* Clone a palette element.
*/
page.clone = function(e) {
/**
* Clone an element's HTML.
*/
function mkclone(e) {
var ne = document.createElement('span');
// Skip the palette: prefix
ne.id = 'page:' + e.id.substr(8);
// Copy the class and HTML content
ne.className = e.className;
ne.innerHTML = e.innerHTML;
// Fixup the widget style
page.fixupwidget(ne);
return ne;
}
/**
* Clone an element's position.
*/
function posclone(ne, e) {
ne.style.position = 'absolute';
ne.style.left = ui.pixpos(ui.numpos(e.style.left));
ne.style.top = ui.pixpos(ui.numpos(e.style.top));
e.parentNode.appendChild(ne);
page.cover(ne);
return ne;
}
return posclone(mkclone(e), e);
};

View file

@ -0,0 +1 @@
iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAABGdBTUEAALGPC/xhBQAAAAxQTFRFyN+N+dR1/PCI////6HjE5gAAADJJREFUKM9j+I8EPjBQifeBAQSY6coLBYN6inhaq0Bg6SDn/f//akB466ExTS6P2ukMAKumzarJO/66AAAAAElFTkSuQmCC

View file

@ -0,0 +1 @@
iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAAXNSR0IArs4c6QAAAAZiS0dEANAAPwBBXloXjQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sEFhQaKzNh4PgAAAMKSURBVEjHxZZPTBNBFMa/maVbWjcUi0YiIHIoNBADTUgsqCWgUUFjwkk5CXLUBKIc9KIXjx64oMSDoiggGC8koImCGDWYkADRIiQQgikWCq0WoXW33R0PpYjSLeWP8btN3sv85s17894QrKNeIBng8gFmJSDZgGIAqJeBjQCkH5AHioGZaHsQNUMP+ByKYB0ByVjvIAxsUkHcrRJI9pggXYBWB1pLQUqxQSlg3X4o9WWAqArpAhL04JoIYMQmxQCPD3JlGbCwBtIFaPXgWrcC+AtUEY6Ihg060NrtACyf3KgDrQ2v6e8kbzwH0URBSnvA56xAKIJ1kRzNbS2ZNhYssjodVj41VbPaxqemaqxOh9XGgkXmtpbMyKDQvqQXSKbg2iKGzfPE0v8uV7BYDIuDg95B66FhJkmM8DyxfHifK+TlGRaHhryDBwuHmSSxyBUnn6Ohh6aSQElin86U26XZWVGwWAxZD5tMAGBufmAS8vIMkssl2s+Uj6gBQuLySS/oTQpyONr9GmxHhAMvnltovJZ+73vjTiyyJSmipHw8WTrkfd33Y52385arAr1EAF00R3HqixRwu38mnT61O35/uh4AJq7Ujc0/affEUGsCDfWi9TXX3uEOeDwBABCnp/3OO42uGPuAgQLUG4urueVRlsZo1ACANiVFZ7rTkBFjMXtpqJtGV9q1q3uNJ47vlpd88kTt5VEWCLLk6gtpeyrP74qheY5wlaB6AhSqOSUUFOzIun8vh8RxZKKmZvRrw20X0WjkxCKbceexo0Z3Z+d8wDUXVIeQdgrIA6rFl5DAmVsfZ1MtT+faO5zOxrtzADB1/Ybj28tX85wgxOU8e5pN9XqqHos8QIuBGQY2GTEPD5tM8en79P7x8aWxqurx1bbPZytGRYfDrzOZBHPzA5PanCkGZki4d3GQG7DNksFdLIFkpwBQAsmugHVvJ0AB6w5PypW79EOpZ4BnOwAM8Pih1P/R6gGgDBB9kCu3Clo1GcU1kGXQgg9yxWavTgHrXp6IC///t/Iv/l2/AGa0Qa2X0eC0AAAAAElFTkSuQmCC

View file

@ -0,0 +1 @@
iVBORw0KGgoAAAANSUhEUgAAAEgAAABIAgMAAAAog1vUAAAABGdBTUEAALGPC/xhBQAAAAlQTFRFwuD84/T+////fj9v9QAAACxJREFUOMtjWLUqa9WsVctWrYQxVjAMCqFQdBDCMOrUUaeOOnXUqYPPqZgAABmg/C7pJC7lAAAAAElFTkSuQmCC

View file

@ -17,13 +17,8 @@
* specific language governing permissions and limitations
* under the License.
-->
<html manifest="/cache-manifest.cmf">
<html>
<head>
<title>frame</title>
<meta name="viewport" content="width=device-width user-scalable=no initial-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="stylesheet" type="text/css" href="/ui-min.css"/>
</head>
<body style="margin:3px; padding: 0px; background-color: #dcdcdc;">

View file

@ -0,0 +1 @@
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAAIRQTFRFwdt/w9yEw9+MxN2GxN6NxN+Oxd2Mxd6Nxt6Lx96Lx96Nx9+NyN6MyN+MyN+N8u2I8+2I+NBq+NFr+NFt+NFu+NJz+NN0+dR1+dR3+dZw+dh4+9Fy+9Nz++5++++B+++F/NNz/PCH/PCI/PGW/PKc/fKd/vzp/vzq/v7+/v/z/9Jx////nQZfHwAAAIxJREFUOMtj0CYAGKiiQANdUAPdBAZmFMCIYQUzHwrgpKECblYwYEJ2LYoCHi0FMBCEAmF0E3hkxFGABJICXnYWFhY2aVE4EENTwCWgCARKCCCFoUAJFQw9BYycnBz8eBSA04cqPhNAQIX+CiSFhIRE8CiQ10ROMNgUqKNnHGU5FCCrhqZAg7Z5Ey8AALiBh6brcmloAAAAAElFTkSuQmCC

View file

@ -1,79 +0,0 @@
<!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>Sorry</title>
<meta name="viewport" content="width=device-width user-scalable=no initial-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="stylesheet" type="text/css" href="/ui-min.css"/>
<script type="text/javascript" src="/all-min.js"></script>
<script type="text/javascript" src="/menu.js"></script>
</head>
<body class="delayed" onload="ui.onload();" onbeforeunload="ui.onbeforeunload();">
<div id="bodydiv" class="bodydiv">
<div id="headdiv" class="hsection">
<script type="text/javascript" src="/headconfig.js"></script>
</div>
<div id="menu"></div>
<table style="width: 100%;">
<tr><td><h2><span id="h1"></span></h2></td></tr>
</table>
<div style="margin-left: auto; margin-right: auto; text-align: center;">
<div class="hd2">Sorry, you're not authorized to view this page.</div>
</div>
<form name="signout" action="/public/notauth.html" method="GET">
</form>
<script type="text/javascript">
ui.initbody();
// Set page title
$('h1').innerHTML = hometitle(window.location.hostname);
// Load the menu bar
if (!issubdomain(window.location.hostname))
displaymenu();
// Sign out
if (window.top.location.pathname != '/public/notauth.html') {
function submitSignout() {
var reset = 'TuscanyOpenAuth=;expires=' + new Date(1970,01,01).toGMTString() + ';domain=.' + domainname(window.location.hostname) + ';path=/;secure=TRUE';
document.cookie = reset;
document.signout.submit();
return true;
}
submitSignout();
}
</script>
<div id="footdiv" class="fsection">
<script type="text/javascript" src="/footconfig.js"></script>
</div>
</div>
</body>
</html>

View file

@ -1,65 +0,0 @@
<!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>Page not found</title>
<meta name="viewport" content="width=device-width user-scalable=no initial-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="stylesheet" type="text/css" href="/ui-min.css"/>
<script type="text/javascript" src="/all-min.js"></script>
<script type="text/javascript" src="/menu.js"></script>
</head>
<body class="delayed">
<div id="bodydiv" class="bodydiv" onload="ui.onload();" onbeforeunload="ui.onbeforeunload();">
<div id="headdiv" class="hsection">
<script type="text/javascript" src="/headconfig.js"></script>
</div>
<div id="menu"></div>
<table style="width: 100%;">
<tr><td><h2><span id="h1"></span></h2></td></tr>
</table>
<div style="margin-left: auto; margin-right: auto; text-align: center;">
<div class="hd2">Sorry, that page was not found.</div>
<div>You may have clicked an expired link or mistyped the address.</div>
</div>
<script type="text/javascript">
ui.initbody();
// Set page title
$('h1').innerHTML = hometitle(window.location.hostname);
// Load the menu bar
if (!issubdomain(window.location.hostname))
displaymenu();
</script>
<div id="footdiv" class="fsection">
<script type="text/javascript" src="/footconfig.js"></script>
</div>
</div>
</body>
</html>

View file

@ -1,64 +0,0 @@
<!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>Page not found</title>
<meta name="viewport" content="width=device-width user-scalable=no initial-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="stylesheet" type="text/css" href="/ui-min.css"/>
<script type="text/javascript" src="/all-min.js"></script>
<script type="text/javascript" src="/menu.js"></script>
</head>
<body class="delayed" onload="ui.onload();" onbeforeunload="ui.onbeforeunload();">
<div id="bodydiv" class="bodydiv">
<div id="headdiv" class="hsection">
<script type="text/javascript" src="/headconfig.js"></script>
</div>
<div id="menu"></div>
<table style="width: 100%;">
<tr><td><h2><span id="h1"></span></h2></td></tr>
</table>
<div style="margin-left: auto; margin-right: auto; text-align: center;">
<div class="hd2">Sorry, that page is still under construction.</div>
<div>Please check back later.</div>
</div>
<script type="text/javascript">
ui.initbody();
// Set page title
$('h1').innerHTML = hometitle(window.location.hostname);
// Load the menu bar
if (!issubdomain(window.location.hostname))
displaymenu();
</script>
<div id="footdiv" class="fsection">
<script type="text/javascript" src="/footconfig.js"></script>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1 @@
iVBORw0KGgoAAAANSUhEUgAAADkAAAA5CAIAAAADehTSAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sDGxMkCJXGmL8AAAHwSURBVGje7ZpNbhNBEIXf625sCzA/QUhkg8SGiGxZcpDcgRux5hLkEjkE7BAS9gIyk+muxyZIsSeOG09bsXHX0p4pfVNdP8/loSTsiTnsj1XWyrrMutVSG+ic/ftNqe1mIMtSjsPUu9EQJ6H/UdvNLr59cgwFWaM1p8dnLx6dFGYF6RhIXzLVGIChB3VX8Fg0DWrPqqyHxTq4MUnKKEEBoNvIN4uxiqTkofUXpgZKsqtMx3Djpb45lNWAxxbfXf6wtdH9+vkKBLLGrFLz4M1HTk+K5gAIgBCVcaTI1gOK/acazqqbw2PdYzE7tdyh9AFJTL0zNDIJMInAZpKPzBzmIZuUnjoa9QQkOBHAyWbigYDaTslybg/59f7Q4+003pqwhqcbqjLH9H2OXw0Ksl6XsWB/a39lhf1rz8vOnKoHKmtlrayVtbLuuc6SFK1Z2hEZkBwAv1us4zA9PT7rDX3v9dPiOeBxT/uY0A+qd6Pbl2Sax/kXDN9LlcrXO3Rk9k/QWluVtbIe2O5toBGwFum3bLH/pEso7RarrPNHH/D8JbBIpsjJqx2Lq3Xu2Xv61yvXJzf6/b3nK2Htyu8WB9P/XltF/wfVllgFxet9azGL+bjMD5IUYbPSMktwT8hRSdalkizcufKcs77vUlkr61bsD5lbwtgOKPT2AAAAAElFTkSuQmCC

View file

@ -0,0 +1 @@
iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAABGdBTUEAALGPC/xhBQAAAAxQTFRFyN+N+dR1/PCI////6HjE5gAAADJJREFUKM9j+I8EPjBQifeBAQSY6coLBYN6inhaq0Bg6SDn/f//akB466ExTS6P2ukMAKumzarJO/66AAAAAElFTkSuQmCC

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 B

View file

@ -17,26 +17,8 @@
* specific language governing permissions and limitations
* under the License.
-->
<html manifest="/cache-manifest.cmf">
<head>
<title>Stats</title>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-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"/>
<link rel="stylesheet" type="text/css" href="/ui-min.css"/>
<script type="text/javascript" src="/all-min.js"></script>
<script type="text/javascript" src="/menu.js"></script>
</head>
<body class="delayed" onload="ui.onload();" onbeforeunload="ui.onbeforeunload();">
<div id="bodydiv" class="bodydiv">
<div id="headdiv" class="hsection">
<script type="text/javascript" src="/headconfig.js"></script>
</div>
<div id="menu"></div>
<table style="width: 100%;">
<tr>
<td><h2><span id="h1"></span><span id="appNameHeader"></span></h2></td>
@ -57,7 +39,7 @@
<form id="appForm">
<table style="width: 100%;">
<tr><tr><td><b>App Icon:</b></td></tr>
<tr><td><img src="/public/app.png" style="width: 50px; height: 50px; vertical-align: top;"></td></tr>
<tr><td><img id="appimg" style="width: 50px; height: 50px; vertical-align: top;"></td></tr>
<tr><tr><td style="padding-top: 6px;"><b>Sharing:</b></td></tr>
<tr><td><input type="checkbox" value="shared"/><span>Shared</span></td></tr>
<tr><tr><td style="padding-top: 6px;"><b>App Title:</b></td></tr>
@ -70,20 +52,17 @@
</form>
<script type="text/javascript">
ui.initbody();
// Get the app name
var appname = ui.fragmentParams()['app'];
if (isNil(appname))
window.open('/', '_self');
var appname = ui.fragmentParams(location)['app'];
/**
* Return the link to an app.
*/
function applink(appname) {
var protocol = window.location.protocol;
var host = window.location.hostname;
var port = ':' + window.location.port;
var protocol = location.protocol;
var host = location.hostname;
var port = ':' + location.port;
if (port == ':80' || port == ':443' || port == ':')
port = '';
var link = protocol + '//' + appname + '.' + host + port + '/';
@ -91,14 +70,14 @@ function applink(appname) {
}
// Set page titles
document.title = windowtitle(window.location.hostname) + ' - Stats - ' + appname;
document.title = ui.windowtitle(location.hostname) + ' - Stats - ' + appname;
$('appNameHeader').innerHTML = '<a href=\"' + applink(appname) + '\" target=\"' + '_blank' + '\">' + appname + '</a>';
var tclone = isNil(config.clone)? 'Clone' : config.clone;
$('cloneApp').value = tclone;
$('cloneApp').title = tclone + ' this app';
// Load the menu bar
displaymenu();
// Set images
$('appimg').src = ui.b64img(appcache.get('/public/app.b64'));
// Init service references
var editWidget = sca.component("EditWidget");
@ -176,18 +155,12 @@ $('appForm').onsubmit = function() {
* Handle Clone button event.
*/
$('cloneApp').onclick = function() {
return ui.navigate('/clone/#app=' + appname, '_self');
return ui.navigate('/#view=clone&app=' + appname, '_view');
}
// Get the current app
getapp(appname);
</script>
<div id="footdiv" class="fsection">
<script type="text/javascript" src="/footconfig.js"></script>
</div>
</div>
</body>
</html>

View file

@ -17,26 +17,8 @@
* specific language governing permissions and limitations
* under the License.
-->
<html manifest="/cache-manifest.cmf">
<head>
<title>Store</title>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-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"/>
<link rel="stylesheet" type="text/css" href="/ui-min.css"/>
<script type="text/javascript" src="/all-min.js"></script>
<script type="text/javascript" src="/menu.js"></script>
</head>
<body class="delayed" onload="ui.onload();" onbeforeunload="ui.onbeforeunload();">
<div id="bodydiv" class="bodydiv">
<div id="headdiv" class="hsection">
<script type="text/javascript" src="/headconfig.js"></script>
</div>
<div id="menu"></div>
<table style="width: 100%;">
<tr><td><h2><span id="h1"></span></h2></td></tr>
</table>
@ -46,17 +28,13 @@
<div id="apps"></div>
<script type="text/javascript">
ui.initbody();
// Set page titles
document.title = windowtitle(window.location.hostname) + ' - Store';
$('h1').innerHTML = hometitle(window.location.hostname);
// Display the menu bar
displaymenu();
document.title = ui.windowtitle(location.hostname) + ' - Store';
$('h1').innerHTML = ui.hometitle(location.hostname);
// Get the store category
var category = ui.fragmentParams()['category'];
var category = ui.fragmentParams(location)['category'];
if (isNil(category))
category = 'myapps';
@ -64,18 +42,18 @@ if (isNil(category))
* Build store menu bar
*/
function catmenu() {
function catmenuitem(name, cat) {
function catmenuitem(name, cat, idx) {
var c = cat == category? 'smenu' : 'amenu';
return '<th class="thl thr" style="width: 10px; padding-top: 4px; padding-bottom: 4px; padding-right: 6px;">'
+ ui.ahref('/store/#category=' + cat, '_reload', '<span class="' + c + '">' + name + '</span>') + '</th>';
+ ui.ahref('/#view=store&category=' + cat + '&idx=' + idx, '_view', '<span class="' + c + '">' + name + '</span>') + '</th>';
}
var m = '<table style="width: 100%; margin-bottom: 2px;"><tr>';
m += catmenuitem('My Apps', 'myapps');
m += catmenuitem('New', 'new');
m += catmenuitem('Top', 'top');
m += catmenuitem('Featured', 'featured');
m += catmenuitem('All', 'all');
m += catmenuitem('My Apps', 'myapps', '1');
m += catmenuitem('New', 'new', '2');
m += catmenuitem('Top', 'top', '3');
m += catmenuitem('Featured', 'featured', '4');
m += catmenuitem('All', 'all', '5');
if (category == 'myapps') {
m += '<th class="thl thr" style="width: 100%; padding-top: 0px; padding-bottom: 0px; padding-right: 0px; text-align: right;">';
m += '<input type="button" class="graybutton" id="createApp" title="Create a new app" style="font-weight: bold; margin-top: 0px; margin-bottom: 0px; height: 24px;" Value="New App"/>';
@ -100,9 +78,9 @@ var dashboards = sca.reference(editWidget, "dashboards");
* Return the link to an app.
*/
function applink(appname) {
var protocol = window.location.protocol;
var host = window.location.hostname;
var port = ':' + window.location.port;
var protocol = location.protocol;
var host = location.hostname;
var port = ':' + location.port;
if (port == ':80' || port == ':443' || port == ':')
port = '';
var link = protocol + '//' + appname + '.' + host + port + '/';
@ -113,14 +91,14 @@ function applink(appname) {
* Edit an app.
*/
function editApp(appname) {
return ui.navigate('/page/#app=' + appname, '_self');
return ui.navigate('/#view=page&app=' + appname, '_view');
}
/**
* View an app.
*/
function viewApp(appname) {
return ui.navigate('/stats/#app=' + appname, '_self');
return ui.navigate('/#view=stats&app=' + appname, '_view');
}
/**
@ -128,7 +106,7 @@ function viewApp(appname) {
*/
if (category == 'myapps') {
$('createApp').onclick = function() {
return ui.navigate('/create/', '_self');
return ui.navigate('/#view=create', '_view');
}
}
@ -136,6 +114,7 @@ if (category == 'myapps') {
* Get and display list of apps.
*/
function getapps(category) {
//log('category', category);
function display(doc) {
// Stop now if we didn't get the apps
@ -147,6 +126,8 @@ function getapps(category) {
var aentries = assoc("'entry", cdr(feed));
var entries = isNil(aentries)? mklist() : isList(car(cadr(aentries)))? cadr(aentries) : mklist(cdr(aentries));
var appimg = ui.b64img(appcache.get('/public/app.b64'));
function displayentries(entries) {
if (isNil(entries))
return apps;
@ -159,7 +140,7 @@ function getapps(category) {
apps += '<div class="box" style="width: 150px; display: inline-block; border: 1px; border-style: solid; border-color: #dcdcdc; border-collapse: collapse; margin: 2px; padding: 2px; vertical-align: top;">'
apps += '<table><tr>';
apps += '<td>';
apps += '<div>' + ui.ahref('/stats/#app=' + name, '_self', '<img src="/public/app.png" width="50" height="50" style="height: 50px; width: 50px; vertical-align: top; margin: 0px; padding: 0px;"></img>') + '</div>';
apps += '<div>' + ui.ahref('/#view=stats&app=' + name, '_view', '<img src="' + appimg + '" width="50" height="50" style="height: 50px; width: 50px; vertical-align: top; margin: 0px; padding: 0px;"></img>') + '</div>';
apps += '</td>';
apps += '<td class="tdw">';
apps += '<div style="font-weight: bold">' + ui.ahref(applink(name), '_blank', name) + '</div>';
@ -186,13 +167,7 @@ function getapps(category) {
// Get and display the list of apps
getapps(category);
</script>
<div id="footdiv" class="fsection">
<script type="text/javascript" src="/footconfig.js"></script>
</div>
</div>
</body>
</html>

View file

@ -51,18 +51,18 @@ jsprefix=`echo "import os; print os.path.realpath('$here/../js')" | python`
# Configure error pages
cat >>tmp/conf/svhost-ssl.conf <<EOF
# Error pages
ErrorDocument 404 /public/notfound.html
ErrorDocument 401 /public/notauth.html
ErrorDocument 500 /public/oops.html
ErrorDocument 404 /notfound/
ErrorDocument 401 /notauth/
ErrorDocument 500 /oops/
EOF
# Configure app home pages
cat >>tmp/conf/dvhost-ssl.conf <<EOF
# App error pages
ErrorDocument 404 /public/notfound.html
ErrorDocument 401 /public/notauth.html
ErrorDocument 500 /public/oops.html
ErrorDocument 404 /notfound/
ErrorDocument 401 /notauth/
ErrorDocument 500 /oops/
# Redirect www to main home page
RewriteEngine on
@ -101,7 +101,8 @@ EOF
# Configure main aliases
cat >>tmp/conf/httpd.conf <<EOF
Alias /home.png $here/htdocs/home.png
Alias /home/home.png $here/htdocs/home/home.png
Alias /home/home.b64 $here/htdocs/home/home.b64
EOF
@ -120,7 +121,10 @@ Alias /headconfig.js $here/htdocs/headconfig.js
Alias /index.html $here/htdocs/app/index.html
Alias /login $here/htdocs/login
Alias /logout $here/htdocs/logout
Alias /menu.js $here/htdocs/menu.js
Alias /notauth $here/htdocs/notauth
Alias /notfound $here/htdocs/notfound
Alias /notyet $here/htdocs/notyet
Alias /oops $here/htdocs/oops
Alias /public $here/htdocs/public
Alias /robots.txt $here/htdocs/robots.txt

View file

@ -35,18 +35,18 @@ jsprefix=`echo "import os; print os.path.realpath('$here/../js')" | python`
# Configure error pages
cat >>tmp/conf/svhost.conf <<EOF
# Error pages
ErrorDocument 404 /public/notfound.html
ErrorDocument 401 /public/notauth.html
ErrorDocument 500 /public/oops.html
ErrorDocument 404 /notfound/
ErrorDocument 401 /notauth/
ErrorDocument 500 /oops/
EOF
# Configure app home pages
cat >>tmp/conf/dvhost.conf <<EOF
# App error pages
ErrorDocument 404 /public/notfound.html
ErrorDocument 401 /public/notauth.html
ErrorDocument 500 /public/oops.html
ErrorDocument 404 /notfound/
ErrorDocument 401 /notauth/
ErrorDocument 500 /oops/
# Redirect www to main home page
RewriteEngine on
@ -70,6 +70,14 @@ SCAVirtualComposite app.composite
EOF
# Configure main aliases
cat >>tmp/conf/httpd.conf <<EOF
Alias /home/home.png $here/htdocs/home/home.png
Alias /home/home.b64 $here/htdocs/home/home.b64
EOF
# Create app links and sub-directories if needed
./mkapplinks
@ -85,7 +93,10 @@ Alias /headconfig.js $here/htdocs/headconfig.js
Alias /index.html $here/htdocs/app/index.html
Alias /login $here/htdocs/login
Alias /logout $here/htdocs/logout
Alias /menu.js $here/htdocs/menu.js
Alias /notauth $here/htdocs/notauth
Alias /notfound $here/htdocs/notfound
Alias /notyet $here/htdocs/notyet
Alias /oops $here/htdocs/oops
Alias /public $here/htdocs/public
Alias /robots.txt $here/htdocs/robots.txt

View file

@ -546,7 +546,7 @@ text/directory
text/enriched
text/html html htm
text/parityfec
text/plain asc txt
text/plain asc txt b64
text/prs.lines.tag
text/rfc822-headers
text/richtext rtx

View file

@ -284,6 +284,11 @@ cat >$root/conf/vhost.conf <<EOF
# Virtual host configuration
UseCanonicalName Off
# Enable HTTP reverse proxy
ProxyRequests Off
ProxyPreserveHost Off
ProxyStatus On
EOF
cat >$root/conf/svhost.conf <<EOF

View file

@ -129,6 +129,18 @@ SSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 128
LogFormat "[%{%a %b %d %H:%M:%S %Y}t] [sslaccess] %h %l %u %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" \"%{SSL_CLIENT_I_DN}x\" \"%{SSL_CLIENT_S_DN}x\" \"%{cookie}n\" %A %V %D %I %O" sslcombined
CustomLog $root/logs/ssl_access_log sslcombined
# Enable HTTPS reverse proxy
ProxyRequests Off
ProxyPreserveHost Off
ProxyStatus On
SSLProxyEngine on
SSLProxyCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
# Verify server certificates
SSLProxyVerify require
SSLProxyVerifyDepth 1
SSLProxyCheckPeerCN Off
EOF
proxycert="server"
@ -144,8 +156,12 @@ Include conf/vhost-ssl.conf
# Declare SSL certificates used in this virtual host
SSLCACertificateFile "$root/cert/ca.crt"
SSLCertificateChainFile "$root/cert/ca.crt"
SSLCertificateFile "$root/cert/server.crt"
SSLCertificateKeyFile "$root/cert/server.key"
SSLCertificateFile "$root/cert/vhost.crt"
SSLCertificateKeyFile "$root/cert/vhost.key"
# Declare proxy SSL client certificates
SSLProxyCACertificateFile "$root/cert/ca.crt"
SSLProxyMachineCertificateFile "$root/cert/$proxycert.pem"
EOF

View file

@ -199,6 +199,7 @@ static int checkAuthn(request_rec *r) {
if (!dc.enabled)
return DECLINED;
const char* atype = ap_auth_type(r);
debug(atype, "modopenauth::checkAuthn::auth_type");
if (atype == NULL || strcasecmp(atype, "Open"))
return DECLINED;

View file

@ -24,11 +24,6 @@ root=`echo "import os; print os.path.realpath('$1')" | python`
cat >>$root/conf/vhost.conf <<EOF
# Generated by: proxy-conf $*
# Enable HTTP reverse proxy
ProxyRequests Off
ProxyPreserveHost On
ProxyStatus On
# Enable load balancing
ProxyPass / balancer://cluster/

View file

@ -24,17 +24,6 @@ root=`echo "import os; print os.path.realpath('$1')" | python`
cat >>$root/conf/vhost-ssl.conf <<EOF
# Generated by: proxy-ssl-conf $*
# Enable HTTPS reverse proxy
ProxyRequests Off
ProxyPreserveHost On
ProxyStatus On
SSLProxyEngine on
SSLProxyCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
# Verify server certificates
SSLProxyVerify require
SSLProxyVerifyDepth 1
# Enable load balancing
ProxyPass /balancer-manager !
ProxyPass / balancer://sslcluster/
@ -63,7 +52,6 @@ EOF
cat >>$root/conf/dvhost-ssl.conf <<EOF
# Generated by: proxy-ssl-conf $*
# Declare proxy SSL client certificates
SSLProxyCACertificateFile "$root/cert/ca.crt"
SSLProxyMachineCertificateFile "$root/cert/proxy.pem"

View file

@ -1,3 +1,21 @@
/*
* 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.
*/
function cons(car,cdr){var a=new Array();a.push(car);return a.concat(cdr);}
function car(l){return l[0];}
function first(l){return l[0];}
@ -66,10 +84,6 @@ function properties(o){var a=new Array();for(p in o)
a.push(p);return a;}
function domainname(host){var h=reverse(host.split('.'));return reverse(mklist(car(h),cadr(h))).join('.');}
function issubdomain(host){return host.split('.').length>2;}
function hometitle(host){if(!isNil(config.hometitle))
return config.hometitle;var h=reverse(host.split('.'));var d=isNil(cdr(h))?car(h):cadr(h);return d.substr(0,1).toUpperCase()+d.substr(1);}
function windowtitle(host){if(!isNil(config.windowtitle))
return config.windowtitle;var h=reverse(host.split('.'));var d=isNil(cdr(h))?car(h):cadr(h);return d.substr(0,1).toUpperCase()+d.substr(1);}
function format(){var i=0;var s='';for(a in arguments){s=i==0?arguments[a]:s.replace('{'+a+'}',arguments[a]);i++;}
return s;}
function setcar(l,v){l[0]=v;return l;}
@ -231,56 +245,34 @@ return t;return bindingsTarget(scdl.bindings(l));}
var turi=targetURI();if(isNil(turi))
return turi;return car(tokens(turi));};scdl.properties=function(l){return namedElementChildren("'property",l);};scdl.propertyValue=function(l){if(!elementHasValue(l))
return'';return elementValue(l);};scdl.nameToElementAssoc=function(l){if(isNil(l))
return l;return cons(mklist(scdl.name(car(l)),car(l)),scdl.nameToElementAssoc(cdr(l)));};var ui={};ui.ahref=function(loc,target,html){if(target=='_blank')
return'<a href="'+loc+'" target="_blank">'+html+'</a>';return'<a href="javascript:void(0)" onclick="ui.navigate(\''+loc+'\', \''+target+'\');">'+html+'</a>';};ui.menu=function(name,href,target){function Menu(n,h,t){this.name=n;this.href=h;this.target=isNil(t)?'_parent':t;this.content=function(){function complete(uri){var h=uri.indexOf('#');if(h!=-1)
return complete(uri.substr(0,h));var q=uri.indexOf('?');if(q!=-1)
return complete(uri.substr(0,q));if(uri.match('.*\.html$'))
return uri;if(uri.match('.*/$'))
return uri+'index.html';return uri+'/index.html';}
if(complete(this.href)!=complete(window.top.location.pathname))
return ui.ahref(this.href,this.target,'<span class="tbaramenu">'+this.name+'</span>');return ui.ahref(this.href,this.target,'<span class="tbarsmenu">'+this.name+'</span>');};}
return new Menu(name,href,target);};ui.menubar=function(left,right){var bar='<table cellpadding="0" cellspacing="0" width="100%" class="tbar"><tr>'+'<td class="dtbar"><table border="0" cellspacing="0" cellpadding="0"><tr>';for(i in left)
return l;return cons(mklist(scdl.name(car(l)),car(l)),scdl.nameToElementAssoc(cdr(l)));};var ui={};ui.elementByID=function(node,id){if(node.skipNode==true)
return null;for(var i in node.childNodes){var child=node.childNodes[i];if(child.id==id)
return child;var gchild=ui.elementByID(child,id);if(gchild!=null)
return gchild;}
return null;};function $(id){if(id==document)
return document;return ui.elementByID($(document),id);};ui.query=function(url){var u=''+url;var q=u.indexOf('?');return q>=0?u.substring(q+1):'';};ui.fragment=function(url){var u=''+url;var h=u.indexOf('#');return h>=0?u.substring(h+1):'';};ui.pathandparams=function(url){var u=''+url;var ds=u.indexOf('//');var u2=ds>0?u.substring(ds+2):u;var s=u2.indexOf('/');return s>0?u2.substring(s):'';};ui.queryParams=function(url){var qp=new Array();var qs=ui.query(url).split('&');for(var i=0;i<qs.length;i++){var e=qs[i].indexOf('=');if(e>0)
qp[qs[i].substring(0,e)]=unescape(qs[i].substring(e+1));}
return qp;};ui.fragmentParams=function(url){var qp=new Array();var qs=ui.fragment(url).split('&');for(var i=0;i<qs.length;i++){var e=qs[i].indexOf('=');if(e>0)
qp[qs[i].substring(0,e)]=unescape(qs[i].substring(e+1));}
return qp;};ui.b64img=function(b64){return'data:image/png;base64,'+b64;};ui.declareCSS=function(s){var e=document.createElement('style');e.type='text/css';e.textContent=s;return e;};ui.declareScript=function(s){var e=document.createElement('script');e.type='text/javascript';e.text=s;return e;};ui.innerScripts=function(e){return map(function(s){return s.text;},nodeList(e.getElementsByTagName('script')));};ui.evalScript=function(s){return eval('(function() {\n'+s+'\n})();');};ui.includeScript=function(s){log('include',s);return eval(s);};ui.mobiledetected=false;ui.mobile=false;ui.isMobile=function(){if(ui.mobiledetected)
return ui.mobile;var ua=navigator.userAgent;if(ua.match(/iPhone/i)||ua.match(/iPad/i)||ua.match(/Android/i)||ua.match(/Blackberry/i)||ua.match(/WebOs/i))
ui.mobile=true;ui.mobiledetected=true;return ui.mobile;};ui.hometitle=function(host){if(!isNil(window.top.config.hometitle))
return window.top.config.hometitle;var h=reverse(host.split('.'));var d=isNil(cdr(h))?car(h):cadr(h);return d.substr(0,1).toUpperCase()+d.substr(1);};ui.windowtitle=function(host){if(!isNil(window.top.config.windowtitle))
return window.top.config.windowtitle;var h=reverse(host.split('.'));var d=isNil(cdr(h))?car(h):cadr(h);return d.substr(0,1).toUpperCase()+d.substr(1);};ui.numpos=function(p){return p==''?0:Number(p.substr(0,p.length-2));};ui.pixpos=function(p){return p+'px';};ui.onorientationchange=function(){window.location.reload();return true;}
ui.navigate=function(url,win){log('navigate',url,win);if(win=='_blank')
return window.top.open(url,win);if(win=='_self')
return window.top.open(url,win);if(win=='_reload'){window.top.location=url;return window.top.location.reload();}
if(win=='_view'){if(!window.top.onnavigate)
return window.top.open(url,'_self');return window.top.onnavigate(url);}
return window.top.open(url,win);}
ui.ahref=function(loc,target,html){if(target=='_blank')
return'<a href="'+loc+'" target="_blank">'+html+'</a>';return'<a href="javascript:void(0)" onclick="ui.navigate(\''+loc+'\', \''+target+'\');">'+html+'</a>';};ui.menu=function(name,href,target,hilight){function Menu(){this.content=function(){if(hilight)
return ui.ahref(href,target,'<span class="tbarsmenu">'+name+'</span>');return ui.ahref(href,target,'<span class="tbaramenu">'+name+'</span>');};}
return new Menu();};ui.menubar=function(left,right){var bar='<table cellpadding="0" cellspacing="0" width="100%" class="tbar"><tr>'+'<td class="dtbar"><table border="0" cellspacing="0" cellpadding="0"><tr>';for(i in left)
bar=bar+'<td class="ltbar">'+left[i].content()+'</td>'
bar=bar+'</tr></table></td>'+'<td class="dtbar"><table border="0" cellpadding="0" cellspacing="0" align="right"><tr>';for(i in right)
bar=bar+'<td class="'+(i==0?'dtbar':'rtbar')+'">'+right[i].content()+'</td>'
bar=bar+'</tr></table></td></tr></table>';return bar;};ui.selectSuggestion=function(node,value){for(;;){node=node.parentNode;if(node.tagName.toLowerCase()=='div')
break;}
node.selectSuggestion(value);};ui.hilightSuggestion=function(node,over){if(over)
node.className='suggestHilighted';node.className='suggestItem';};ui.suggest=function(input,suggestFunction){input.suggest=suggestFunction;input.selectSuggestion=function(value){this.hideSuggestDiv();this.value=value;}
input.hideSuggestDiv=function(){if(this.suggestDiv!=null){this.suggestDiv.style.visibility='hidden';}}
input.showSuggestDiv=function(){if(this.suggestDiv==null){this.suggestDiv=document.createElement('div');this.suggestDiv.input=this;this.suggestDiv.className='suggest';input.parentNode.insertBefore(this.suggestDiv,input);this.suggestDiv.style.visibility='hidden';this.suggestDiv.style.zIndex='99';this.suggestDiv.selectSuggestion=function(value){this.input.selectSuggestion(value);}}
var values=this.suggest();var items='';for(var i=0;i<values.length;i++){if(values[i].indexOf(this.value)==-1)
continue;if(items.length==0)
items+='<table class="suggestTable">';items+='<tr><td class="suggestItem" '+'onmouseover="ui.hilightSuggestion(this, true)" onmouseout="ui.hilightSuggestion(this, false)" '+'onmousedown="ui.selectSuggestion(this, \''+values[i]+'\')">'+values[i]+'</td></tr>';}
if(items.length!=0)
items+='</table>';this.suggestDiv.innerHTML=items;if(items.length!=0){var node=input;var left=0;var top=0;for(;;){left+=node.offsetLeft;top+=node.offsetTop;node=node.offsetParent;if(node.tagName.toLowerCase()=='body')
break;}
this.suggestDiv.style.left=left;this.suggestDiv.style.top=top+input.offsetHeight;this.suggestDiv.style.visibility='visible';}else
this.suggestDiv.style.visibility='hidden';}
input.onkeydown=function(event){this.showSuggestDiv();};input.onkeyup=function(event){this.showSuggestDiv();};input.onmousedown=function(event){this.showSuggestDiv();};input.onblur=function(event){setTimeout(function(){input.hideSuggestDiv();},50);};};ui.elementByID=function(node,id){for(var i in node.childNodes){var child=node.childNodes[i];if(child.id==id)
return child;var gchild=ui.elementByID(child,id);if(gchild!=null)
return gchild;}
return null;};function $(id){if(id==document){if(!isNil(document.widget))
return document.widget;return document;}
return ui.elementByID($(document),id);};ui.queryParams=function(){var qp=new Array();var qs=window.location.search.substring(1).split('&');for(var i=0;i<qs.length;i++){var e=qs[i].indexOf('=');if(e>0)
qp[qs[i].substring(0,e)]=unescape(qs[i].substring(e+1));}
return qp;};ui.fragmentParams=function(){var qp=new Array();var qs=window.location.hash.substring(1).split('&');for(var i=0;i<qs.length;i++){var e=qs[i].indexOf('=');if(e>0)
qp[qs[i].substring(0,e)]=unescape(qs[i].substring(e+1));}
return qp;};ui.mobiledetected=false;ui.mobile=false;ui.isMobile=function(){if(ui.mobiledetected)
return ui.mobile;var ua=navigator.userAgent;if(ua.match(/iPhone/i)||ua.match(/iPad/i)||ua.match(/Android/i)||ua.match(/Blackberry/i)||ua.match(/WebOs/i))
ui.mobile=true;ui.mobiledetected=true;return ui.mobile;};ui.pagetransitions=false;ui.initbody=function(){if(ui.isMobile()){if(ui.pagetransitions){var bdiv=$('bodydiv');if(!isNil(bdiv)){bdiv.className='bodydivloading';}}
document.body.onorientationchange=ui.onorientationchange;}
return true;}
ui.onorientationchange=function(){window.open(window.location,'_self');return true;}
ui.onload=function(){var path=document.location.pathname;if(path.indexOf('/login/')!=0&&path.indexOf('/logout/')!=0)
localStorage.setItem('ui.lastvisited',''+document.location);document.body.style.visibility='visible';if(ui.pagetransitions&&ui.isMobile()){setTimeout(function(){var bdiv=$('bodydiv');if(!isNil(bdiv)){function transitionend(e){bdiv.removeEventListener('webkitTransitionEnd',transitionend,false);bdiv.removeEventListener('transitionend',transitionend,false);bdiv.className='bodydiv';};bdiv.addEventListener('webkitTransitionEnd',transitionend,false);bdiv.addEventListener('transitionend',transitionend,false);bdiv.className='bodydivloaded';}},0);}
return true;};ui.navigate=function(url,win){function opendoc(url,win){if(win=='_reload'){window.location=url;return window.location.reload();}
return window.open(url,win);}
if(ui.pagetransitions&&ui.isMobile()&&win!='_blank'){var bdiv=$('bodydiv');if(!isNil(bdiv)){function transitionend(e){bdiv.removeEventListener('webkitTransitionEnd',transitionend,false);bdiv.removeEventListener('transitionend',transitionend,false);return opendoc(url,win);};bdiv.addEventListener('webkitTransitionEnd',transitionend,false);bdiv.addEventListener('transitionend',transitionend,false);bdiv.className='bodydivunloaded';return true;}}
return opendoc(url,win);}
ui.onbeforeunload=function(){if(ui.pagetransitions&&ui.isMobile()){var bdiv=$('bodydiv');if(!isNil(bdiv))
bdiv.className='bodydivunloaded';}};ui.lastvisited=function(){return localStorage.getItem('ui.lastvisited');}
ui.numpos=function(p){return p==''?0:Number(p.substr(0,p.length-2));};ui.pixpos=function(p){return p+'px';};ui.datatable=function(l){function indent(i){if(i==0)
bar=bar+'</tr></table></td></tr></table>';return bar;};ui.datatable=function(l){function indent(i){if(i==0)
return'';return'&nbsp;&nbsp;'+indent(i-1);}
function rows(l,i){if(isNil(l))
return'';var e=car(l);if(!isList(e))
@ -296,7 +288,21 @@ return rows(expandElementValues("'value",l),i);if(elementHasValue(e)){var v=elem
return rows(expandElementValues(elementName(e),v),i)+rows(cdr(l),i);}
return rows(elementChildren(e),i+1)+rows(cdr(l),i);}
return'<table class="datatable '+(window.name=='dataFrame'?' databg':'')+'" style="width: 100%;">'+rows(l,0)+'</table>';}
var JSONClient={};JSONClient.escapeJSONChar=function(c){if(c=="\""||c=="\\")return"\\"+c;if(c=="\b")return"\\b";if(c=="\f")return"\\f";if(c=="\n")return"\\n";if(c=="\r")return"\\r";if(c=="\t")return"\\t";var hex=c.charCodeAt(0).toString(16);if(hex.length==1)return"\\u000"+hex;if(hex.length==2)return"\\u00"+hex;if(hex.length==3)return"\\u0"+hex;return"\\u"+hex;};JSONClient.escapeJSONString=function(s){var parts=s.split("");for(var i=0;i<parts.length;i++){var c=parts[i];if(c=='"'||c=='\\'||c.charCodeAt(0)<32||c.charCodeAt(0)>=128)
ui.selectSuggestion=function(node,value){for(;;){node=node.parentNode;if(node.tagName.toLowerCase()=='div')
break;}
node.selectSuggestion(value);};ui.hilightSuggestion=function(node,over){if(over)
node.className='suggestHilighted';node.className='suggestItem';};ui.suggest=function(input,suggestFunction){input.suggest=suggestFunction;input.selectSuggestion=function(value){this.hideSuggestDiv();this.value=value;}
input.hideSuggestDiv=function(){if(this.suggestDiv!=null){this.suggestDiv.style.visibility='hidden';}}
input.showSuggestDiv=function(){if(this.suggestDiv==null){this.suggestDiv=document.createElement('div');this.suggestDiv.input=this;this.suggestDiv.className='suggest';input.parentNode.insertBefore(this.suggestDiv,input);this.suggestDiv.style.visibility='hidden';this.suggestDiv.style.zIndex='99';this.suggestDiv.selectSuggestion=function(value){this.input.selectSuggestion(value);}}
var values=this.suggest();var items='';for(var i=0;i<values.length;i++){if(values[i].indexOf(this.value)==-1)
continue;if(items.length==0)
items+='<table class="suggestTable">';items+='<tr><td class="suggestItem" '+'onmouseover="ui.hilightSuggestion(this, true)" onmouseout="ui.hilightSuggestion(this, false)" '+'onmousedown="ui.selectSuggestion(this, \''+values[i]+'\')">'+values[i]+'</td></tr>';}
if(items.length!=0)
items+='</table>';this.suggestDiv.innerHTML=items;if(items.length!=0){var node=input;var left=0;var top=0;for(;;){left+=node.offsetLeft;top+=node.offsetTop;node=node.offsetParent;if(node.tagName.toLowerCase()=='body')
break;}
this.suggestDiv.style.left=left;this.suggestDiv.style.top=top+input.offsetHeight;this.suggestDiv.style.visibility='visible';}else
this.suggestDiv.style.visibility='hidden';}
input.onkeydown=function(event){this.showSuggestDiv();};input.onkeyup=function(event){this.showSuggestDiv();};input.onmousedown=function(event){this.showSuggestDiv();};input.onblur=function(event){setTimeout(function(){input.hideSuggestDiv();},50);};};var JSONClient={};JSONClient.escapeJSONChar=function(c){if(c=="\""||c=="\\")return"\\"+c;if(c=="\b")return"\\b";if(c=="\f")return"\\f";if(c=="\n")return"\\n";if(c=="\r")return"\\r";if(c=="\t")return"\\t";var hex=c.charCodeAt(0).toString(16);if(hex.length==1)return"\\u000"+hex;if(hex.length==2)return"\\u00"+hex;if(hex.length==3)return"\\u0"+hex;return"\\u"+hex;};JSONClient.escapeJSONString=function(s){var parts=s.split("");for(var i=0;i<parts.length;i++){var c=parts[i];if(c=='"'||c=='\\'||c.charCodeAt(0)<32||c.charCodeAt(0)>=128)
parts[i]=JSONClient.escapeJSONChar(parts[i]);}
return"\""+parts.join("")+"\"";};JSONClient.toJSON=function(o){if(o==null)
return"null";if(o.constructor==String)
@ -308,7 +314,7 @@ v.push(JSONClient.toJSON(o[i]));return"["+v.join(", ")+"]";}
var v=[];for(attr in o){if(o[attr]==null)
v.push("\""+attr+"\": null");else if(typeof o[attr]=="function");else
v.push(JSONClient.escapeJSONString(attr)+": "+JSONClient.toJSON(o[attr]));}
return"{"+v.join(", ")+"}";};function HTTPBindingClient(name,uri){this.name=name;this.uri=uri;this.apply=this.createApplyMethod();}
return"{"+v.join(", ")+"}";};function HTTPBindingClient(name,uri,domain){this.name=name;this.domain=domain;this.uri=uri;this.apply=this.createApplyMethod();}
HTTPBindingClient.jsonrpcID=1;HTTPBindingClient.prototype.createApplyMethod=function(){var fn=function(){var methodName=arguments[0];var args=[];for(var i=1;i<arguments.length;i++)
args.push(arguments[i]);var cb=null;if(typeof args[args.length-1]=="function")
cb=args.pop();var req=HTTPBindingClient.makeJSONRequest(methodName,args,cb);return fn.client.jsonApply(req);};fn.client=this;return fn;};HTTPBindingClient.makeJSONRequest=function(methodName,args,cb){var req={};req.id=HTTPBindingClient.jsonrpcID++;if(cb)
@ -320,14 +326,14 @@ HTTPBindingClient.charset=httpCharset(http);var obj;eval("obj = "+http.responseT
throw new HTTPBindingClient.Exception(obj.error.code,obj.error.msg);var res=obj.result;return res;};HTTPBindingClient.prototype.jsonApply=function(req){var http=HTTPBindingClient.getHTTPRequest();var hascb=req.cb?true:false;http.open("POST",this.uri,hascb);http.setRequestHeader("Content-Type","application/json-rpc");if(hascb){http.onreadystatechange=function(){if(http.readyState==4){if(http.status==200){var res=null;try{res=HTTPBindingClient.jsonResult(http);try{req.cb(res);}catch(cbe){}}catch(e){try{req.cb(null,e);}catch(cbe){}}}else
try{req.cb(null,HTTPBindingClient.Exception(http.status,http.statusText));}catch(cbe){}}};http.send(req.data);return req.id;}
http.send(req.data);if(http.status==200)
return HTTPBindingClient.jsonResult(http);throw new HTTPBindingClient.Exception(http.status,http.statusText);};HTTPBindingClient.prototype.get=function(id,cb){var u=this.uri+'/'+id;var hascb=cb?true:false;var item=localStorage.getItem(u);if(item!=null&&item!=''){if(!hascb)
return HTTPBindingClient.jsonResult(http);throw new HTTPBindingClient.Exception(http.status,http.statusText);};HTTPBindingClient.prototype.get=function(id,cb){var u=id?(this.uri?this.uri+'/'+id:id):this.uri;var hascb=cb?true:false;var item=localStorage.getItem(u);if(item!=null&&item!=''){if(!hascb)
return item;try{cb(item);}catch(cbe){}}
var http=HTTPBindingClient.getHTTPRequest();http.open("GET",u,hascb);if(hascb){http.onreadystatechange=function(){if(http.readyState==4){if(http.status==200){if(http.getResponseHeader("X-Login")!=null){try{cb(null,new HTTPBindingClient.Exception(403,'X-Login'));}catch(cbe){}}else if(http.responseText==''||http.getResponseHeader("Content-Type")==null){try{cb(null,new HTTPBindingClient.Exception(403,'No-Content'));}catch(cbe){}}else{if(item==null||http.responseText!=item){if(http.responseText!=null){localStorage.setItem(u,http.responseText);}
try{cb(http.responseText);}catch(cbe){}}}}
else{if(item==null){try{cb(null,new HTTPBindingClient.Exception(http.status,http.statusText));}catch(cbe){}}}}};http.send(null);return true;}
http.send(null);if(http.status==200){if(http.getResponseHeader("X-Login")!=null){throw new HTTPBindingClient.Exception(403,'X-Login');}else if(http.responseText==''||http.getResponseHeader("Content-Type")==null){throw new HTTPBindingClient.Exception(403,'No-Content');}
return http.responseText;}
throw new HTTPBindingClient.Exception(http.status,http.statusText);};HTTPBindingClient.prototype.getnocache=function(id,cb){var u=this.uri+'/'+id;var hascb=cb?true:false;var http=HTTPBindingClient.getHTTPRequest();http.open("GET",u,hascb);if(hascb){http.onreadystatechange=function(){if(http.readyState==4){if(http.status==200){if(http.getResponseHeader("X-Login")!=null){try{return cb(null,new HTTPBindingClient.Exception(403,'X-Login'));}catch(cbe){}}else if(http.responseText==''||http.getResponseHeader("Content-Type")==null){try{return cb(null,new HTTPBindingClient.Exception(403,'No-Content'));}catch(cbe){}}else{try{cb(http.responseText);}catch(cbe){}}}else{try{cb(null,new HTTPBindingClient.Exception(http.status,http.statusText));}catch(cbe){}}}};http.send(null);return true;}
throw new HTTPBindingClient.Exception(http.status,http.statusText);};HTTPBindingClient.prototype.getnocache=function(id,cb){var u=id?(this.uri?this.uri+'/'+id:id):this.uri;var hascb=cb?true:false;var http=HTTPBindingClient.getHTTPRequest();http.open("GET",u,hascb);if(hascb){http.onreadystatechange=function(){if(http.readyState==4){if(http.status==200){if(http.getResponseHeader("X-Login")!=null){try{return cb(null,new HTTPBindingClient.Exception(403,'X-Login'));}catch(cbe){}}else if(http.responseText==''||http.getResponseHeader("Content-Type")==null){try{return cb(null,new HTTPBindingClient.Exception(403,'No-Content'));}catch(cbe){}}else{try{cb(http.responseText);}catch(cbe){}}}else{try{cb(null,new HTTPBindingClient.Exception(http.status,http.statusText));}catch(cbe){}}}};http.send(null);return true;}
http.send(null);if(http.status==200){if(http.getResponseHeader("X-Login")!=null){throw new HTTPBindingClient.Exception(403,'X-Login');}else if(http.responseText==''||http.getResponseHeader("Content-Type")==null){throw new HTTPBindingClient.Exception(403,'No-Content');}
return http.responseText;}
throw new HTTPBindingClient.Exception(http.status,http.statusText);};HTTPBindingClient.prototype.post=function(entry,cb){var http=HTTPBindingClient.getHTTPRequest();var hascb=cb?true:false;http.open("POST",this.uri,hascb);http.setRequestHeader("Content-Type","application/atom+xml");if(hascb){http.onreadystatechange=function(){if(http.readyState==4){if(http.status==201){try{cb(http.responseText);}catch(cbe){}}
@ -341,7 +347,9 @@ http.send(null);if(http.status==200)
return true;throw new HTTPBindingClient.Exception(http.status,http.statusText);};HTTPBindingClient.Exception=function(code,message){this.name="HTTPBindingClientException";this.code=code;this.message=message;};HTTPBindingClient.Exception.prototype=new Error();HTTPBindingClient.Exception.prototype.toString=function(){return this.name+": "+this.message;};HTTPBindingClient.msxmlNames=["MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"];HTTPBindingClient.getHTTPRequest=function(){if(HTTPBindingClient.httpFactory)
return HTTPBindingClient.httpFactory();try{HTTPBindingClient.httpFactory=function(){return new XMLHttpRequest();};return HTTPBindingClient.httpFactory();}catch(e){}
for(var i=0;i<HTTPBindingClient.msxmlNames.length;i++){try{HTTPBindingClient.httpFactory=function(){return new ActiveXObject(HTTPBindingClient.msxmlNames[i]);};return HTTPBindingClient.httpFactory();}catch(e){}}
HTTPBindingClient.httpFactory=null;throw new HTTPBindingClient.Exception(0,"Can't create XMLHttpRequest object");};var sca={};sca.httpclient=function(name,uri){return new HTTPBindingClient(name,uri);};sca.component=function(name){return new HTTPBindingClient(name,'/components/'+name);};sca.reference=function(comp,rname){return new HTTPBindingClient(comp.name+'/'+rname,"/references/"+comp.name+"/"+rname);};sca.defun=function(ref){function defapply(name){return function(){var args=new Array();args[0]=name;for(i=0,n=arguments.length;i<n;i++)
HTTPBindingClient.httpFactory=null;throw new HTTPBindingClient.Exception(0,"Can't create XMLHttpRequest object");};var sca={};sca.httpclient=function(name,uri,domain){return new HTTPBindingClient(name,uri,domain);};sca.component=function(name,domain){if(!domain)
return new HTTPBindingClient(name,'/c/'+name,domain);return new HTTPBindingClient(name,'/a/'+domain+'/c/'+name,domain);};sca.reference=function(comp,rname){if(!comp.domain)
return new HTTPBindingClient(comp.name+'/'+rname,'/r/'+comp.name+'/'+rname,comp.domain);return new HTTPBindingClient(comp.name+'/'+rname,'/a/'+comp.domain+'/r/'+comp.name+'/'+rname,comp.domain);};sca.defun=function(ref){function defapply(name){return function(){var args=new Array();args[0]=name;for(i=0,n=arguments.length;i<n;i++)
args[i+1]=arguments[i];return this.apply.apply(this,args);};}
for(f=1;f<arguments.length;f++){var fn=arguments[f];ref[fn]=defapply(fn);}
return ref;};
return ref;};

View file

@ -102,8 +102,9 @@ JSONClient.toJSON = function(o) {
/**
* Construct an HTTPBindingClient.
*/
function HTTPBindingClient(name, uri) {
function HTTPBindingClient(name, uri, domain) {
this.name = name;
this.domain = domain;
this.uri = uri;
this.apply = this.createApplyMethod();
}
@ -230,10 +231,10 @@ HTTPBindingClient.prototype.jsonApply = function(req) {
/**
* REST ATOMPub GET method.
* REST GET method.
*/
HTTPBindingClient.prototype.get = function(id, cb) {
var u = this.uri + '/' + id;
var u = id? (this.uri? this.uri + '/' + id : id) : this.uri;
var hascb = cb? true : false;
// Get from local storage first
@ -321,10 +322,10 @@ HTTPBindingClient.prototype.get = function(id, cb) {
};
/**
* REST ATOMPub GET method, does not use the local cache.
* REST GET method, does not use the local cache.
*/
HTTPBindingClient.prototype.getnocache = function(id, cb) {
var u = this.uri + '/' + id;
var u = id? (this.uri? this.uri + '/' + id : id) : this.uri;
var hascb = cb? true : false;
// Connect to the service
@ -386,7 +387,7 @@ HTTPBindingClient.prototype.getnocache = function(id, cb) {
};
/**
* REST ATOMPub POST method.
* REST POST method.
*/
HTTPBindingClient.prototype.post = function (entry, cb) {
@ -426,7 +427,7 @@ HTTPBindingClient.prototype.post = function (entry, cb) {
};
/**
* REST ATOMPub PUT method.
* REST PUT method.
*/
HTTPBindingClient.prototype.put = function (id, entry, cb) {
var u = this.uri + '/' + id;
@ -470,7 +471,7 @@ HTTPBindingClient.prototype.put = function (id, entry, cb) {
};
/**
* REST ATOMPub DELETE method.
* REST DELETE method.
*/
HTTPBindingClient.prototype.del = function (id, cb) {
var u = this.uri + '/' + id;
@ -569,22 +570,26 @@ var sca = {};
/**
* Return an HTTP client proxy.
*/
sca.httpclient = function(name, uri) {
return new HTTPBindingClient(name, uri);
sca.httpclient = function(name, uri, domain) {
return new HTTPBindingClient(name, uri, domain);
};
/**
* Return a component proxy.
*/
sca.component = function(name) {
return new HTTPBindingClient(name, '/components/' + name);
sca.component = function(name, domain) {
if (!domain)
return new HTTPBindingClient(name, '/c/' + name, domain);
return new HTTPBindingClient(name, '/a/' + domain + '/c/' + name, domain);
};
/**
* Return a reference proxy.
*/
sca.reference = function(comp, rname) {
return new HTTPBindingClient(comp.name + '/' + rname, "/references/" + comp.name + "/" + rname);
if (!comp.domain)
return new HTTPBindingClient(comp.name + '/' + rname, '/r/' + comp.name + '/' + rname, comp.domain);
return new HTTPBindingClient(comp.name + '/' + rname, '/a/' + comp.domain + '/r/' + comp.name + '/' + rname, comp.domain);
};
/**

View file

@ -1,10 +1,38 @@
body{margin-top:0px;margin-bottom:2px;margin-left:2px;margin-right:2px;font-family:"Helvetica Neue", Helvetica;font-style:normal;font-variant:normal;font-size:13px;-webkit-text-size-adjust:none;-webkit-touch-callout:none;-webkit-user-select:none;}
/*
* 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.
*/
body{margin-top:0px;margin-bottom:2px;margin-left:2px;margin-right:2px;font-family:"Helvetica Neue", Helvetica;font-style:normal;font-variant:normal;font-size:13px;-webkit-text-size-adjust:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-user-select:none;}
.delayed{visibility:hidden;}
.devicewidth{position:absolute;top:0px;left:0px;width:100%;height:5000px;overflow:hidden;}
.mainbodydiv{position:absolute;top:0px;left:0px;width:100%;height:5000px;overflow:hidden;}
.bodydiv{position:absolute;top:0px;left:0px;width:100%;height:5000px;overflow:hidden;}
.bodydivloading{position:absolute;top:0px;left:0px;width:100%;height:5000px;overflow:hidden;-webkit-transform:translate(100%, 0px);-webkit-backface-visibility:hidden;-moz-transform:translate(100%, 0px);-ms-transform:translate(100%, 0px);transform:translate(100%, 0px);}
.bodydivloaded{-webkit-transition:-webkit-transform 0.4s linear;-moz-transition:-moz-transform 0.4s linear;-ms-transition:-ms-transform 0.4s linear;transition:transform 0.4s linear;position:absolute;top:0px;left:0px;width:100%;height:5000px;overflow:hidden;-webkit-transform:translate3d(0px, 0px, 0px);-webkit-backface-visibility:hidden;-moz-transform:translate(0px, 0px);-ms-transform:translate(0px, 0px);transform:translate(0px, 0px);}
.bodydivunloaded{-webkit-transition:-webkit-transform 0.4s linear;-moz-transition:-moz-transform 0.4s linear;-ms-transition:-ms-transform 0.4s linear;transition:transform 0.4s linear;position:absolute;top:0px;left:0px;width:100%;height:5000px;overflow:hidden;-webkit-transform:translate3d(-100%, 0px, 0px);-webkit-backface-visibility:hidden;-moz-transform:translate(-100%, 0px);-ms-transform:translate(-100%, 0px);transform:translate(-100%, 0px);}
.viewcontainer3dm{-webkit-perspective:1000;}
.viewcontainer3d{}
.leftviewloading3dm{position:absolute;top:0px;left:0px;width:100%;height:5000px;overflow:visible;-webkit-transform:translate3d(100%, 0px, 0) rotateY(0deg);-webkit-backface-visibility:hidden;background-color:#ffffff;-moz-transform:translate(100%, 0px);-ms-transform:translate(100%, 0px);transform:translate(100%, 0px);}
.rightviewloading3dm{position:absolute;top:0px;left:0px;width:100%;height:5000px;overflow:visible;-webkit-transform:translate3d(-100%, 0px, 0) rotateY(0deg);-webkit-backface-visibility:hidden;background-color:#ffffff;-moz-transform:translate(-100%, 0px);-ms-transform:translate(-100%, 0px);transform:translate(-100%, 0px);}
.flipviewloading3dm{position:absolute;top:0px;left:0px;width:100%;height:5000px;overflow:visible;-webkit-transform:translate3d(0px, 0px, 0) rotateY(180deg);-webkit-backface-visibility:hidden;background-color:#ffffff;-moz-transform:translate(100%, 0px);-ms-transform:translate(100%, 0px);transform:translate(100%, 0px);}
.viewloading3d{position:absolute;top:0px;left:0px;width:100%;height:5000px;overflow:visible;visibility:hidden;-webkit-transform:translate3d(100%, 0px, 0) rotateY(0deg);-webkit-backface-visibility:hidden;background-color:#ffffff;-moz-transform:translate(100%, 0px);-ms-transform:translate(100%, 0px);transform:translate(100%, 0px);}
.viewloaded3dm{position:absolute;top:0px;left:0px;width:100%;height:5000px;overflow:visible;-webkit-transition:-webkit-transform 0.5s ease-in-out;-moz-transition:-moz-transform 0.5s ease-in-out;-ms-transition:-ms-transform 0.5s ease-in-out;transition:transform 0.5s ease-in-out;-webkit-transform:translate3d(0px, 0px, 0) rotateY(0deg);-webkit-backface-visibility:hidden;background-color:#ffffff;-moz-transform:translate(0px, 0px);-ms-transform:translate(0px, 0px);transform:translate(0px, 0px);}
.viewloaded3d{position:absolute;top:0px;left:0px;width:100%;height:5000px;overflow:visible;-webkit-transform:translate3d(0px, 0px, 0) rotateY(0deg);-webkit-backface-visibility:hidden;background-color:#ffffff;-moz-transform:translate(0px, 0px);-ms-transform:translate(0px, 0px);transform:translate(0px, 0px);}
.viewunloading3dm{position:absolute;top:0px;left:0px;width:100%;height:5000px;overflow:visible;-webkit-transform:translate3d(0px, 0px, 0) rotateY(0deg);-webkit-backface-visibility:hidden;background-color:#ffffff;-moz-transform:translate(0px, 0px);-ms-transform:translate(0px, 0px);transform:translate(0px, 0px);}
.leftviewunloaded3dm{position:absolute;top:0px;left:0px;width:100%;height:5000px;overflow:visible;-webkit-transition:-webkit-transform 0.5s ease-in-out;-moz-transition:-moz-transform 0.5s ease-in-out;-ms-transition:-ms-transform 0.5s ease-in-out;transition:transform 0.5s ease-in-out;-webkit-transform:translate3d(-100%, 0px, 0px) rotateY(0deg);-webkit-backface-visibility:hidden;background-color:#ffffff;-moz-transform:translate(-100%, 0px);-ms-transform:translate(-100%, 0px);transform:translate(-100%, 0px);}
.rightviewunloaded3dm{position:absolute;top:0px;left:0px;width:100%;height:5000px;overflow:visible;-webkit-transition:-webkit-transform 0.5s ease-in-out;-moz-transition:-moz-transform 0.5s ease-in-out;-ms-transition:-ms-transform 0.5s ease-in-out;transition:transform 0.5s ease-in-out;-webkit-transform:translate3d(100%, 0px, 0) rotateY(0deg);-webkit-backface-visibility:hidden;background-color:#ffffff;-moz-transform:translate(100%, 0px);-ms-transform:translate(100%, 0px);transform:translate(100%, 0px);}
.flipviewunloaded3dm{position:absolute;top:0px;left:0px;width:100%;height:5000px;overflow:visible;-webkit-transition:-webkit-transform 0.5s ease-in-out;-moz-transition:-moz-transform 0.5s ease-in-out;-ms-transition:-ms-transform 0.5s ease-in-out;transition:transform 0.5s ease-in-out;-webkit-transform:translate3d(0px, 0px, 0) rotateY(-180deg);-webkit-backface-visibility:hidden;background-color:#ffffff;-moz-transform:translate(0px, 0px);-ms-transform:translate(0px, 0px);transform:translate(0px, 0px);}
table{border:0px;border-collapse:collapse;border-color:#a2bae7;border-style:solid;font-family:"Helvetica Neue", Helvetica;font-style:normal;font-variant:normal;font-size:13px;overflow:visible;}
.trb{border-bottom:1px;border-bottom-style:solid;border-color:#dcdcdc;}
th{font-weight:bold;background-color:#d4e6fc;color:#000000;height:18px;text-align:left;padding-left:2px;padding-right:8px;padding-top:0px;padding-bottom:0px;vertical-align:middle;white-space:nowrap;border-top:1px;border-bottom:1px;border-left:1px;border-right:1px;border-style:solid;border-top-color:#a2bae7;border-bottom-color:#d1d3d4;border-left-color:#a2bae7;border-right-color:#a2bae7;overflow:hidden;}
@ -21,6 +49,7 @@ td{padding-left:2px;padding-top:2px;padding-right:8px;white-space:nowrap;vertica
.tdw{padding-left:2px;padding-top:2px;padding-right:8px;white-space:normal;vertical-align:middle;}
.datatd{border-top:1px;border-bottom:1px;border-style:solid;border-color:#dcdcdc;width:10px;vertical-align:middle;}
.datatdl{border-right:1px;border-top:1px;border-bottom:1px;border-style:solid;border-color:#dcdcdc;width:10px;vertical-align:middle;}
.datatdltop{border-right:1px;border-top:1px;border-bottom:1px;border-style:solid;border-color:#dcdcdc;width:10px;vertical-align:top;}
.datatdr{border-left:1px;border-top:1px;border-bottom:1px;border-style:solid;border-color:#dcdcdc;vertical-align:middle;}
.datatable{border-top:1px;border-bottom:1px;border-style:solid;border-color:#dcdcdc;overflow:visible;}
.databg{opacity:.6;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)";filter:alpha(opacity=60);}
@ -51,10 +80,10 @@ img{border:0px;}
.ltbar{padding-left:2px;padding-right:6px;padding-top:3px;padding-bottom:4px;white-space:nowrap;vertical-align:middle;}
.dtbar{padding-left:0px;padding-right:0px;padding-top:3px;padding-bottom:4px;white-space:nowrap;vertical-align:middle;text-align:right;}
.rtbar{padding-left:6px;padding-right:2px;padding-top:3px;padding-bottom:4px;white-space:nowrap;vertical-align:middle;text-align:right;}
.tbaramenu{color:#cccccc;text-decoration:none;white-space:nowrap;}
.tbarsmenu{font-weight:bold;color:#ffffff;text-decoration:none;white-space:nowrap;}
.tbaramenu{color:#cccccc;text-decoration:none;white-space:nowrap;vertical-align:middle;}
.tbarsmenu{font-weight:bold;color:#ffffff;text-decoration:none;white-space:nowrap;vertical-align:middle;}
.suggest{background-color:#d4e6fc;color:#598edd;border-top:1px;border-bottom:1px;border-left:1px;border-right:1px;border-style:solid;border-top-color:#a2bae7;border-bottom-color:#d1d3d4;border-left-color:#d1d3d4;border-right-color:#d1d3d4;position:absolute;overflow:auto;overflow-x:hidden;padding:0px;margin:0px;cursor:default;}
.suggestTable{border:0px;border-collapse:separate;padding-left:5px;padding-right:5px;padding-top:2px;padding-bottom:2px;margin:0px;}
.suggestItem{padding-left:2px;padding-top:0px;padding-bottom:0px;padding-right:2px;vertical-align:middle;background-color:#d4e6fc;color:#598edd;}
.suggestHilighted{padding-left:2px;padding-top:0px;padding-bottom:0px;padding-right:2px;vertical-align:middle;background-color:#598edd;color:#d4e6fc;}
.svgtitle{margin:0px;padding:0px;font-family:"Helvetica Neue", Helvetica;font-style:normal;font-variant:normal;font-size:10px;cursor:default;}
.svgtitle{margin:0px;padding:0px;font-family:"Helvetica Neue", Helvetica;font-style:normal;font-variant:normal;font-size:10px;cursor:default;}

View file

@ -22,6 +22,7 @@ margin-top: 0px; margin-bottom: 2px; margin-left: 2px; margin-right: 2px;
font-family: "Helvetica Neue", Helvetica; font-style: normal; font-variant: normal; font-size: 13px;
-webkit-text-size-adjust: none;
-webkit-touch-callout: none;
-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-user-select: none;
}
@ -33,42 +34,128 @@ visibility: hidden;
position: absolute; top: 0px; left: 0px; width: 100%; height: 5000px; overflow: hidden;
}
.mainbodydiv {
position: absolute; top: 0px; left: 0px; width: 100%; height: 5000px; overflow: hidden;
}
.bodydiv {
position: absolute; top: 0px; left: 0px; width: 100%; height: 5000px; overflow: hidden;
}
.bodydivloading {
position: absolute; top: 0px; left: 0px; width: 100%; height: 5000px; overflow: hidden;
-webkit-transform: translate(100%, 0px); -webkit-backface-visibility: hidden;
.viewcontainer3dm {
-webkit-perspective: 1000;
}
.viewcontainer3d {
}
.leftviewloading3dm {
position: absolute; top: 0px; left: 0px; width: 100%; height: 5000px; overflow: visible;
-webkit-transform: translate3d(100%, 0px, 0) rotateY(0deg);
-webkit-backface-visibility: hidden; background-color: #ffffff;
-moz-transform: translate(100%, 0px);
-ms-transform: translate(100%, 0px);
transform: translate(100%, 0px);
}
.bodydivloaded {
-webkit-transition: -webkit-transform 0.4s linear;
-moz-transition: -moz-transform 0.4s linear;
-ms-transition: -ms-transform 0.4s linear;
transition: transform 0.4s linear;
position: absolute; top: 0px; left: 0px; width: 100%; height: 5000px; overflow: hidden;
-webkit-transform: translate3d(0px, 0px, 0px); -webkit-backface-visibility: hidden;
.rightviewloading3dm {
position: absolute; top: 0px; left: 0px; width: 100%; height: 5000px; overflow: visible;
-webkit-transform: translate3d(-100%, 0px, 0) rotateY(0deg);
-webkit-backface-visibility: hidden; background-color: #ffffff;
-moz-transform: translate(-100%, 0px);
-ms-transform: translate(-100%, 0px);
transform: translate(-100%, 0px);
}
.flipviewloading3dm {
position: absolute; top: 0px; left: 0px; width: 100%; height: 5000px; overflow: visible;
-webkit-transform: translate3d(0px, 0px, 0) rotateY(180deg);
-webkit-backface-visibility: hidden; background-color: #ffffff;
-moz-transform: translate(100%, 0px);
-ms-transform: translate(100%, 0px);
transform: translate(100%, 0px);
}
.viewloading3d {
position: absolute; top: 0px; left: 0px; width: 100%; height: 5000px; overflow: visible;
visibility: hidden;
-webkit-transform: translate3d(100%, 0px, 0) rotateY(0deg);
-webkit-backface-visibility: hidden; background-color: #ffffff;
-moz-transform: translate(100%, 0px);
-ms-transform: translate(100%, 0px);
transform: translate(100%, 0px);
}
.viewloaded3dm {
position: absolute; top: 0px; left: 0px; width: 100%; height: 5000px; overflow: visible;
-webkit-transition: -webkit-transform 0.5s ease-in-out;
-moz-transition: -moz-transform 0.5s ease-in-out;
-ms-transition: -ms-transform 0.5s ease-in-out;
transition: transform 0.5s ease-in-out;
-webkit-transform: translate3d(0px, 0px, 0) rotateY(0deg);
-webkit-backface-visibility: hidden; background-color: #ffffff;
-moz-transform: translate(0px, 0px);
-ms-transform: translate(0px, 0px);
transform: translate(0px, 0px);
}
.bodydivunloaded {
-webkit-transition: -webkit-transform 0.4s linear;
-moz-transition: -moz-transform 0.4s linear;
-ms-transition: -ms-transform 0.4s linear;
transition: transform 0.4s linear;
position: absolute; top: 0px; left: 0px; width: 100%; height: 5000px; overflow: hidden;
-webkit-transform: translate3d(-100%, 0px, 0px); -webkit-backface-visibility: hidden;
.viewloaded3d {
position: absolute; top: 0px; left: 0px; width: 100%; height: 5000px; overflow: visible;
-webkit-transform: translate3d(0px, 0px, 0) rotateY(0deg);
-webkit-backface-visibility: hidden; background-color: #ffffff;
-moz-transform: translate(0px, 0px);
-ms-transform: translate(0px, 0px);
transform: translate(0px, 0px);
}
.viewunloading3dm {
position: absolute; top: 0px; left: 0px; width: 100%; height: 5000px; overflow: visible;
-webkit-transform: translate3d(0px, 0px, 0) rotateY(0deg);
-webkit-backface-visibility: hidden; background-color: #ffffff;
-moz-transform: translate(0px, 0px);
-ms-transform: translate(0px, 0px);
transform: translate(0px, 0px);
}
.leftviewunloaded3dm {
position: absolute; top: 0px; left: 0px; width: 100%; height: 5000px; overflow: visible;
-webkit-transition: -webkit-transform 0.5s ease-in-out;
-moz-transition: -moz-transform 0.5s ease-in-out;
-ms-transition: -ms-transform 0.5s ease-in-out;
transition: transform 0.5s ease-in-out;
-webkit-transform: translate3d(-100%, 0px, 0px) rotateY(0deg);
-webkit-backface-visibility: hidden; background-color: #ffffff;
-moz-transform: translate(-100%, 0px);
-ms-transform: translate(-100%, 0px);
transform: translate(-100%, 0px);
}
.rightviewunloaded3dm {
position: absolute; top: 0px; left: 0px; width: 100%; height: 5000px; overflow: visible;
-webkit-transition: -webkit-transform 0.5s ease-in-out;
-moz-transition: -moz-transform 0.5s ease-in-out;
-ms-transition: -ms-transform 0.5s ease-in-out;
transition: transform 0.5s ease-in-out;
-webkit-transform: translate3d(100%, 0px, 0) rotateY(0deg);
-webkit-backface-visibility: hidden; background-color: #ffffff;
-moz-transform: translate(100%, 0px);
-ms-transform: translate(100%, 0px);
transform: translate(100%, 0px);
}
.flipviewunloaded3dm {
position: absolute; top: 0px; left: 0px; width: 100%; height: 5000px; overflow: visible;
-webkit-transition: -webkit-transform 0.5s ease-in-out;
-moz-transition: -moz-transform 0.5s ease-in-out;
-ms-transition: -ms-transform 0.5s ease-in-out;
transition: transform 0.5s ease-in-out;
-webkit-transform: translate3d(0px, 0px, 0) rotateY(-180deg);
-webkit-backface-visibility: hidden; background-color: #ffffff;
-moz-transform: translate(0px, 0px);
-ms-transform: translate(0px, 0px);
transform: translate(0px, 0px);
}
table {
border: 0px; border-collapse: collapse; border-color: #a2bae7; border-style: solid;
font-family: "Helvetica Neue", Helvetica; font-style: normal; font-variant: normal; font-size: 13px;
@ -143,6 +230,10 @@ border-top: 1px; border-bottom: 1px; border-style: solid; border-color: #dcdcdc;
border-right: 1px; border-top: 1px; border-bottom: 1px; border-style: solid; border-color: #dcdcdc; width: 10px; vertical-align: middle;
}
.datatdltop {
border-right: 1px; border-top: 1px; border-bottom: 1px; border-style: solid; border-color: #dcdcdc; width: 10px; vertical-align: top;
}
.datatdr {
border-left: 1px; border-top: 1px; border-bottom: 1px; border-style: solid; border-color: #dcdcdc; vertical-align: middle;
}
@ -335,11 +426,11 @@ padding-left: 6px; padding-right: 2px; padding-top: 3px; padding-bottom: 4px; wh
}
.tbaramenu {
color: #cccccc; text-decoration: none; white-space: nowrap;
color: #cccccc; text-decoration: none; white-space: nowrap; vertical-align: middle;
}
.tbarsmenu {
font-weight: bold; color: #ffffff; text-decoration: none; white-space: nowrap;
font-weight: bold; color: #ffffff; text-decoration: none; white-space: nowrap; vertical-align: middle;
}
.suggest {

View file

@ -23,6 +23,227 @@
var ui = {};
/**
* Return a child element of a node with the given id.
*/
ui.elementByID = function(node, id) {
if (node.skipNode == true)
return null;
for (var i in node.childNodes) {
var child = node.childNodes[i];
if (child.id == id)
return child;
var gchild = ui.elementByID(child, id);
if (gchild != null)
return gchild;
}
return null;
};
/**
* Return the current document, or a child element with the given id.
*/
function $(id) {
if (id == document)
return document;
return ui.elementByID($(document), id);
};
/**
* Return the query string of a URL.
*/
ui.query = function(url) {
var u = '' + url;
var q = u.indexOf('?');
return q >= 0? u.substring(q + 1) : '';
};
/**
* Return the fragment part of a URL.
*/
ui.fragment = function(url) {
var u = '' + url;
var h = u.indexOf('#');
return h >= 0? u.substring(h + 1) : '';
};
/**
* Return the path and parameters of a URL.
*/
ui.pathandparams = function(url) {
var u = '' + url;
var ds = u.indexOf('//');
var u2 = ds > 0? u.substring(ds + 2) : u;
var s = u2.indexOf('/');
return s > 0? u2.substring(s) : '';
};
/**
* Return a dictionary of query parameters in a URL.
*/
ui.queryParams = function(url) {
var qp = new Array();
var qs = ui.query(url).split('&');
for (var i = 0; i < qs.length; i++) {
var e = qs[i].indexOf('=');
if (e > 0)
qp[qs[i].substring(0, e)] = unescape(qs[i].substring(e + 1));
}
return qp;
};
/**
* Return a dictionary of fragment parameters in a URL.
*/
ui.fragmentParams = function(url) {
var qp = new Array();
var qs = ui.fragment(url).split('&');
for (var i = 0; i < qs.length; i++) {
var e = qs[i].indexOf('=');
if (e > 0)
qp[qs[i].substring(0, e)] = unescape(qs[i].substring(e + 1));
}
return qp;
};
/**
* Convert a base64-encoded image to a data URL.
*/
ui.b64img = function(b64) {
return 'data:image/png;base64,' + b64;
};
/**
* Declare a CSS stylesheet.
*/
ui.declareCSS = function(s) {
var e = document.createElement('style');
e.type = 'text/css';
e.textContent = s;
return e;
};
/**
* Declare a script.
*/
ui.declareScript = function(s) {
var e = document.createElement('script');
e.type = 'text/javascript';
e.text = s;
return e;
};
/**
* Return the scripts elements under a given element.
*/
ui.innerScripts = function(e) {
return map(function(s) { return s.text; }, nodeList(e.getElementsByTagName('script')));
};
/**
* Evaluate a script.
*/
ui.evalScript = function(s) {
return eval('(function() {\n' + s + '\n})();');
};
/**
* Include a script.
*/
ui.includeScript = function(s) {
log('include', s);
return eval(s);
};
/**
* Return true if the client is a mobile device.
*/
ui.mobiledetected = false;
ui.mobile = false;
ui.isMobile = function() {
if (ui.mobiledetected)
return ui.mobile;
var ua = navigator.userAgent;
if (ua.match(/iPhone/i) || ua.match(/iPad/i) || ua.match(/Android/i) || ua.match(/Blackberry/i) || ua.match(/WebOs/i))
ui.mobile = true;
ui.mobiledetected = true;
return ui.mobile;
};
/**
* Convert a host name to a home page title.
*/
ui.hometitle = function(host) {
if (!isNil(window.top.config.hometitle))
return window.top.config.hometitle;
var h = reverse(host.split('.'));
var d = isNil(cdr(h))? car(h) : cadr(h);
return d.substr(0, 1).toUpperCase() + d.substr(1);
};
/**
* Convert a host name to a window title.
*/
ui.windowtitle = function(host) {
if (!isNil(window.top.config.windowtitle))
return window.top.config.windowtitle;
var h = reverse(host.split('.'));
var d = isNil(cdr(h))? car(h) : cadr(h);
return d.substr(0, 1).toUpperCase() + d.substr(1);
};
/**
* Convert a CSS position to a numeric position.
*/
ui.numpos = function(p) {
return p == ''? 0 : Number(p.substr(0, p.length - 2));
};
/**
* Convert a numeric position to a CSS pixel position.
*/
ui.pixpos = function(p) {
return p + 'px';
};
/**
* Reload the current document when orientation changes.
*/
ui.onorientationchange = function() {
window.location.reload();
return true;
}
/**
* Navigate to a new document.
*/
ui.navigate = function(url, win) {
log('navigate', url, win);
// Open a new window
if (win == '_blank')
return window.top.open(url, win);
// Open a new document in the current window
if (win == '_self')
return window.top.open(url, win);
// Reload the current window
if (win == '_reload') {
window.top.location = url;
return window.top.location.reload();
}
// Let the current top window handle the navigation
if (win == '_view') {
if (!window.top.onnavigate)
return window.top.open(url, '_self');
return window.top.onnavigate(url);
}
return window.top.open(url, win);
}
/**
* Build a portable <a href> tag.
*/
@ -35,33 +256,15 @@ ui.ahref = function(loc, target, html) {
/**
* Build a menu bar.
*/
ui.menu = function(name, href, target) {
function Menu(n, h, t) {
this.name = n;
this.href = h;
this.target = isNil(t)? '_parent' : t;
ui.menu = function(name, href, target, hilight) {
function Menu() {
this.content = function() {
function complete(uri) {
var h = uri.indexOf('#');
if (h != -1)
return complete(uri.substr(0, h));
var q = uri.indexOf('?');
if (q != -1)
return complete(uri.substr(0, q));
if (uri.match('.*\.html$'))
return uri;
if (uri.match('.*/$'))
return uri + 'index.html';
return uri + '/index.html';
}
if (complete(this.href) != complete(window.top.location.pathname))
return ui.ahref(this.href, this.target, '<span class="tbaramenu">' + this.name + '</span>');
return ui.ahref(this.href, this.target, '<span class="tbarsmenu">' + this.name + '</span>');
if (hilight)
return ui.ahref(href, target, '<span class="tbarsmenu">' + name + '</span>');
return ui.ahref(href, target, '<span class="tbaramenu">' + name + '</span>');
};
}
return new Menu(name, href, target);
return new Menu();
};
ui.menubar = function(left, right) {
@ -79,6 +282,88 @@ ui.menubar = function(left, right) {
return bar;
};
/**
* Convert a list of elements to an HTML table.
*/
ui.datatable = function(l) {
function indent(i) {
if (i == 0)
return '';
return '&nbsp;&nbsp;' + indent(i - 1);
}
function rows(l, i) {
if (isNil(l))
return '';
var e = car(l);
// Convert a list of simple values into a list of name value pairs
if (!isList(e))
return rows(expandElementValues("'value", l), i);
// Convert a list of complex values into a list of name value pairs
if (isList(car(e)))
return rows(expandElementValues("'value", l), i);
// Generate table row for a simple element value
if (elementHasValue(e)) {
var v = elementValue(e);
if (!isList(v)) {
return '<tr><td class="datatdl">' + indent(i) + elementName(e).slice(1) + '</td>' +
'<td class="datatdr tdw">' + (v != null? v : '') + '</td></tr>' +
rows(cdr(l), i);
}
return rows(expandElementValues(elementName(e), v), i) + rows(cdr(l), i);
}
// Generate table row for an element with children
return '<tr><td class="datatdl">' + indent(i) + elementName(e).slice(1) + '</td>' +
'<td class="datatdr tdw">' + '</td></tr>' +
rows(elementChildren(e), i + 1) +
rows(cdr(l), i);
}
return '<table class="datatable ' + (window.name == 'dataFrame'? ' databg' : '') + '" style="width: 100%;">' + rows(l, 0) + '</table>';
}
/**
* Convert a list of elements to an HTML single column table.
*/
ui.datalist = function(l) {
function rows(l, i) {
if (isNil(l))
return '';
var e = car(l);
// Convert a list of simple values into a list of name value pairs
if (!isList(e))
return rows(expandElementValues("'value", l), i);
// Convert a list of complex values into a list of name value pairs
if (isList(car(e)))
return rows(expandElementValues("'value", l), i);
// Generate table row for a simple element value
if (elementHasValue(e)) {
var v = elementValue(e);
if (!isList(v)) {
return '<tr><td class="datatd tdw">' + (v != null? v : '') + '</td></tr>' +
rows(cdr(l), i);
}
return rows(expandElementValues(elementName(e), v), i) + rows(cdr(l), i);
}
// Generate rows for an element's children
return rows(elementChildren(e), i + 1) + rows(cdr(l), i);
}
return '<table class="datatable ' + (window.name == 'dataFrame'? ' databg' : '') + '" style="width: 100%;">' + rows(l, 0) + '</table>';
}
/**
* Autocomplete / suggest support for input fields
* To use it declare a 'suggest' function as follows:
@ -181,295 +466,3 @@ ui.suggest = function(input, suggestFunction) {
};
};
/**
* Return a child element of a node with the given id.
*/
ui.elementByID = function(node, id) {
for (var i in node.childNodes) {
var child = node.childNodes[i];
if (child.id == id)
return child;
var gchild = ui.elementByID(child, id);
if (gchild != null)
return gchild;
}
return null;
};
/**
* Return the current document, or a child element with the given id.
*/
function $(id) {
if (id == document) {
if (!isNil(document.widget))
return document.widget;
return document;
}
return ui.elementByID($(document), id);
};
/**
* Return a dictionary of the query parameters.
*/
ui.queryParams = function() {
var qp = new Array();
var qs = window.location.search.substring(1).split('&');
for (var i = 0; i < qs.length; i++) {
var e = qs[i].indexOf('=');
if (e > 0)
qp[qs[i].substring(0, e)] = unescape(qs[i].substring(e + 1));
}
return qp;
};
/**
* Return a dictionary of the fragment parameters.
*/
ui.fragmentParams = function() {
var qp = new Array();
var qs = window.location.hash.substring(1).split('&');
for (var i = 0; i < qs.length; i++) {
var e = qs[i].indexOf('=');
if (e > 0)
qp[qs[i].substring(0, e)] = unescape(qs[i].substring(e + 1));
}
return qp;
};
/**
* Return true if the client is a mobile device.
*/
ui.mobiledetected = false;
ui.mobile = false;
ui.isMobile = function() {
if (ui.mobiledetected)
return ui.mobile;
var ua = navigator.userAgent;
if (ua.match(/iPhone/i) || ua.match(/iPad/i) || ua.match(/Android/i) || ua.match(/Blackberry/i) || ua.match(/WebOs/i))
ui.mobile = true;
ui.mobiledetected = true;
return ui.mobile;
};
/**
* Initialize a document's body.
*/
ui.pagetransitions = false;
ui.initbody = function() {
if (ui.isMobile()) {
//log('init', window.location);
// Position the main body div off screen
if (ui.pagetransitions) {
var bdiv = $('bodydiv');
if (!isNil(bdiv)) {
bdiv.className = 'bodydivloading';
}
}
// Install orientation handler
document.body.onorientationchange = ui.onorientationchange;
}
return true;
}
/**
* Reload the current document when orientation changes.
*/
ui.onorientationchange = function() {
window.open(window.location, '_self');
return true;
}
/**
* Post process a document after it's loaded.
*/
ui.onload = function() {
// Save the current page location in local storage
// (except for login and logout pages)
var path = document.location.pathname;
if (path.indexOf('/login/') != 0 && path.indexOf('/logout/') != 0)
localStorage.setItem('ui.lastvisited', '' + document.location);
// Make the document body visible
//log('visible', $('bodydiv').className);
document.body.style.visibility = 'visible';
if (ui.pagetransitions && ui.isMobile()) {
//log('onload', window.location);
// Slide the main body div in
setTimeout(function() {
var bdiv = $('bodydiv');
if (!isNil(bdiv)) {
function transitionend(e) {
bdiv.removeEventListener('webkitTransitionEnd', transitionend, false);
bdiv.removeEventListener('transitionend', transitionend, false);
bdiv.className = 'bodydiv';
//log('loadtransitionend', window.location);
};
bdiv.addEventListener('webkitTransitionEnd', transitionend, false);
bdiv.addEventListener('transitionend', transitionend, false);
//log('loadtransitionstart', window.location);
bdiv.className = 'bodydivloaded';
}
}, 0);
}
return true;
};
/**
* Navigate to a new document.
*/
ui.navigate = function(url, win) {
function opendoc(url, win) {
if (win == '_reload') {
window.location = url;
return window.location.reload();
}
return window.open(url, win);
}
if (ui.pagetransitions && ui.isMobile() && win != '_blank') {
// Slide the main body div out, then open the new document
var bdiv = $('bodydiv');
if (!isNil(bdiv)) {
function transitionend(e) {
bdiv.removeEventListener('webkitTransitionEnd', transitionend, false);
bdiv.removeEventListener('transitionend', transitionend, false);
//log('navigatetransitionend', window.location);
return opendoc(url, win);
};
bdiv.addEventListener('webkitTransitionEnd', transitionend, false);
bdiv.addEventListener('transitionend', transitionend, false);
//log('navigatetransitionstart', window.location);
bdiv.className = 'bodydivunloaded';
return true;
}
}
return opendoc(url, win);
}
/**
* Pre process a document just before it's unloaded.
*/
ui.onbeforeunload = function() {
if (ui.pagetransitions && ui.isMobile()) {
// Slide the main body div out
var bdiv = $('bodydiv');
if (!isNil(bdiv))
bdiv.className = 'bodydivunloaded';
}
};
/**
* Return the last visited page.
*/
ui.lastvisited = function() {
return localStorage.getItem('ui.lastvisited');
}
/**
* Convert a CSS position to a numeric position.
*/
ui.numpos = function(p) {
return p == ''? 0 : Number(p.substr(0, p.length - 2));
};
/**
* Convert a numeric position to a CSS pixel position.
*/
ui.pixpos = function(p) {
return p + 'px';
};
/**
* Convert a list of elements to an HTML table.
*/
ui.datatable = function(l) {
function indent(i) {
if (i == 0)
return '';
return '&nbsp;&nbsp;' + indent(i - 1);
}
function rows(l, i) {
if (isNil(l))
return '';
var e = car(l);
// Convert a list of simple values into a list of name value pairs
if (!isList(e))
return rows(expandElementValues("'value", l), i);
// Convert a list of complex values into a list of name value pairs
if (isList(car(e)))
return rows(expandElementValues("'value", l), i);
// Generate table row for a simple element value
if (elementHasValue(e)) {
var v = elementValue(e);
if (!isList(v)) {
return '<tr><td class="datatdl">' + indent(i) + elementName(e).slice(1) + '</td>' +
'<td class="datatdr tdw">' + (v != null? v : '') + '</td></tr>' +
rows(cdr(l), i);
}
return rows(expandElementValues(elementName(e), v), i) + rows(cdr(l), i);
}
// Generate table row for an element with children
return '<tr><td class="datatdl">' + indent(i) + elementName(e).slice(1) + '</td>' +
'<td class="datatdr tdw">' + '</td></tr>' +
rows(elementChildren(e), i + 1) +
rows(cdr(l), i);
}
return '<table class="datatable ' + (window.name == 'dataFrame'? ' databg' : '') + '" style="width: 100%;">' + rows(l, 0) + '</table>';
}
/**
* Convert a list of elements to an HTML single column table.
*/
ui.datalist = function(l) {
function rows(l, i) {
if (isNil(l))
return '';
var e = car(l);
// Convert a list of simple values into a list of name value pairs
if (!isList(e))
return rows(expandElementValues("'value", l), i);
// Convert a list of complex values into a list of name value pairs
if (isList(car(e)))
return rows(expandElementValues("'value", l), i);
// Generate table row for a simple element value
if (elementHasValue(e)) {
var v = elementValue(e);
if (!isList(v)) {
return '<tr><td class="datatd tdw">' + (v != null? v : '') + '</td></tr>' +
rows(cdr(l), i);
}
return rows(expandElementValues(elementName(e), v), i) + rows(cdr(l), i);
}
// Generate rows for an element's children
return rows(elementChildren(e), i + 1) + rows(cdr(l), i);
}
return '<table class="datatable ' + (window.name == 'dataFrame'? ' databg' : '') + '" style="width: 100%;">' + rows(l, 0) + '</table>';
}

View file

@ -326,28 +326,6 @@ function issubdomain(host) {
return host.split('.').length > 2;
}
/**
* Convert a host name to a home page title.
*/
function hometitle(host) {
if (!isNil(config.hometitle))
return config.hometitle;
var h = reverse(host.split('.'));
var d = isNil(cdr(h))? car(h) : cadr(h);
return d.substr(0, 1).toUpperCase() + d.substr(1);
}
/**
* Convert a host name to a window title.
*/
function windowtitle(host) {
if (!isNil(config.windowtitle))
return config.windowtitle;
var h = reverse(host.split('.'));
var d = isNil(cdr(h))? car(h) : cadr(h);
return d.substr(0, 1).toUpperCase() + d.substr(1);
}
/**
* Format a string like Python format.
*/

View file

@ -185,6 +185,38 @@ int translateService(const ServerConf& sc, request_rec *r) {
return OK;
}
/**
* Route an /apps/app-name/... request to the target app domain.
*/
int translateDomain(request_rec *r) {
httpdDebugRequest(r, "modwiring::translateDomain::input");
debug(r->uri, "modwiring::translateDomain::uri");
// Extract the requested app name
const list<value> apath(pathValues(r->uri));
if (isNil(cdr(apath)))
return HTTP_NOT_FOUND;
// Compute the target uri in the target app domain
ostringstream turi;
turi << httpd::scheme(r) << "://" << string(cadr(apath)) << "." << httpd::hostName(r) << ":" << httpd::port(r) << string(path(cddr(apath))) << (r->args != NULL? string("?") + r->args : string(""));
debug(str(turi), "modwiring::translateDomain::appuri");
// Route to an absolute target URI using mod_proxy or an HTTP client redirect
if (useModProxy) {
r->filename = apr_pstrdup(r->pool, c_str(string("proxy:") + str(turi)));
debug(r->filename, "modwiring::translateDomain::filename");
r->proxyreq = PROXYREQ_REVERSE;
r->handler = "proxy-server";
apr_table_setn(r->notes, "proxy-nocanon", "1");
return OK;
}
debug(str(turi), "modwiring::translateDomain::location");
r->handler = "mod_tuscany_wiring";
return httpd::externalRedirect(str(turi), r);
}
/**
* Read the components declared in a composite.
*/
@ -315,6 +347,10 @@ int translate(request_rec *r) {
// Create a scoped memory pool
gc_scoped_pool pool(r->pool);
// Translate an app domain request
if (!strncmp(r->uri, "/apps/", 6) || !strncmp(r->uri, "/a/", 3))
return translateDomain(r);
// Get the server configuration
const ServerConf& sc = httpd::serverConf<ServerConf>(r, &mod_tuscany_wiring);