summaryrefslogtreecommitdiffstats
path: root/sca-cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sca-cpp')
-rw-r--r--sca-cpp/trunk/modules/edit/apps.py2
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/app/index.html292
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/dash/dashboard.html46
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/dash/index.html16
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/data/index.html28
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/favicon.icobin0 -> 2238 bytes
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/graph/graph.html59
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/graph/graph.js20
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/graph/index.html22
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/index.html22
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/login/index.html5
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/logout/index.html5
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/main.html9
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/menu.html15
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/page/index.html23
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/page/page.html30
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/page/page.js38
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/props/index.html22
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/props/props.html7
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/public/app.pngbin635 -> 258 bytes
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/public/app.xcfbin0 -> 1294 bytes
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/public/iframe.html32
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/public/img.pngbin0 -> 368 bytes
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/public/img.xcfbin0 -> 1639 bytes
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/public/notauth.html26
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/public/notfound.html20
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/public/oops.html18
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/public/touchicon.pngbin0 -> 606 bytes
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/public/touchicon.xcfbin0 -> 3400 bytes
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/robots.txt2
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/store/index.html21
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/store/store.html57
-rwxr-xr-xsca-cpp/trunk/modules/edit/mkapplinks2
-rwxr-xr-xsca-cpp/trunk/modules/http/httpd-conf4
-rw-r--r--sca-cpp/trunk/modules/js/htdocs/component.js7
-rw-r--r--sca-cpp/trunk/modules/js/htdocs/ui.css18
-rw-r--r--sca-cpp/trunk/modules/js/htdocs/ui.js23
-rw-r--r--sca-cpp/trunk/modules/js/htdocs/uicyan.css18
-rw-r--r--sca-cpp/trunk/modules/js/htdocs/util.js37
39 files changed, 732 insertions, 214 deletions
diff --git a/sca-cpp/trunk/modules/edit/apps.py b/sca-cpp/trunk/modules/edit/apps.py
index 600a841ed5..233202040f 100644
--- a/sca-cpp/trunk/modules/edit/apps.py
+++ b/sca-cpp/trunk/modules/edit/apps.py
@@ -36,6 +36,8 @@ def mkapplink(id):
os.symlink('../../../htdocs/public', 'apps/' + car(id) + '/htdocs/public');
os.symlink('../../../htdocs/data', 'apps/' + car(id) + '/htdocs/data');
os.symlink('../../../htdocs/app/index.html', 'apps/' + car(id) + '/htdocs/index.html');
+ os.symlink('../../../htdocs/robots.txt', 'apps/' + car(id) + '/htdocs/robots.txt');
+ os.symlink('../../../htdocs/favicon.ico', 'apps/' + car(id) + '/htdocs/favicon.ico');
os.symlink('../app.html', 'apps/' + car(id) + '/htdocs/app.html');
except:
pass
diff --git a/sca-cpp/trunk/modules/edit/htdocs/app/index.html b/sca-cpp/trunk/modules/edit/htdocs/app/index.html
index 29f9efae65..bc8eb78e7d 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/app/index.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/app/index.html
@@ -22,6 +22,10 @@
<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-translucent"/>
+<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.css"/>
<script type="text/javascript" src="/util.js"></script>
<script type="text/javascript" src="/elemutil.js"></script>
@@ -33,34 +37,83 @@
<script type="text/javascript" src="/component.js"></script>
</head>
<body class="delayed">
+
+<div id="bodydiv" style="position: absolute; top: 0px; left: 0px; right: 0px;">
+
<div id="app"></div>
+
<span id="appFrame"></span>
+</div>
+
<script type="text/javascript">
if (ui.isIE()) $('bodydiv').style.right = -20;
/**
- * The main page component.
+ * Page, every and location components.
*/
-var comp = sca.component('page');
+var pagecomp = sca.httpclient('page', '/page');
+var everycomp = sca.httpclient('every', '/every');
+var locationcomp = sca.httpclient('location', '/location');
/**
- * Returns the text value of a data element.
+ * Find a named value in a tree of elements.
*/
-function datatext(dv) {
- return elementHasValue(dv)? elementValue(dv) : '';
+function datavalue(l, id) {
+ if (isNil(l))
+ return null;
+ var e = car(l);
+ if (id == elementName(e))
+ return e;
+ if (!elementHasValue(e)) {
+ var v = datavalue(elementChildren(e), id);
+ if (v != null)
+ return v;
+ }
+ return datavalue(cdr(l), id);
}
/**
+ * Return the value of an input element.
+ */
+function inputvalue(e) {
+ if (e.className == 'entry' || e.className == 'password') {
+ return car(childElements(e)).value;
+ }
+ if (e.className == 'button') {
+ return car(childElements(e)).value;
+ }
+ if (e.className == 'checkbox') {
+ return car(childElements(e)).value;
+ }
+ if (e.className == 'list') {
+ return car(childElements(car(childElements(e)))).value;
+ }
+ return null;
+};
+
+/**
* Set a data value into a widget.
*/
function setwidgetvalue(e, dv) {
+
+ function datatext(dv) {
+ return elementHasValue(dv)? elementValue(dv) : '';
+ }
+
if (e.className == 'h1' || e.className == 'h2' || e.className == 'text' || e.className == 'section') {
- car(childElements(e)).innerHTML = datatext(dv);
+ var t = datatext(dv);
+ car(childElements(e)).innerHTML = t;
return t;
}
- if (e.className == 'button' || e.className == 'entry' || e.className == 'password') {
- car(childElements(e)).value = datatext(dv);
+ if (e.className == 'entry' || e.className == 'password') {
+ var t = datatext(dv);
+ car(childElements(e)).defaultValue = t;
+ return t;
+ }
+ if (e.className == 'button') {
+ var t = datatext(dv);
+ car(childElements(e)).value = t;
return t;
}
if (e.className == 'checkbox') {
@@ -76,16 +129,26 @@ function setwidgetvalue(e, dv) {
ce.innerHTML = t;
return t;
}
+ if (e.className == 'table') {
+ var t = ui.datatable(elementChildren(dv));
+ car(childElements(e)).innerHTML = t;
+ return t;
+ }
if (e.className == 'link') {
var t = datatext(dv);
- var ce = car(childElements(car(childElements(e))));
- ce.href = t;
- ce.innerHTML = t;
+ var ce = car(childElements(e));
+ ce.href = isList(t)? car(t) : t;
+ car(childElements(ce)).innerHTML = isList(t)? cadr(t) : t;
return t;
}
- if (e.className == 'table') {
- var t = ui.datatable(mklist(dv));
- car(childElements(e)).innerHTML = t;
+ if (e.className == 'img') {
+ var t = datatext(dv);
+ car(childElements(e)).src = t;
+ return t;
+ }
+ if (e.className == 'iframe') {
+ var t = datatext(dv);
+ car(childElements(e)).src = t;
return t;
}
return '';
@@ -94,56 +157,201 @@ function setwidgetvalue(e, dv) {
/**
* Display data on the app page.
*/
-function display(l) {
- if (isNil(l))
- return false;
- var v = car(l);
-
- // For each widget in the app page, look for a data element with the widget id
- // then set the data value into the widget
- function datavalue(id) {
- var dv = namedElementChild("'" + id, v);
- return dv;
- }
+function displaydata(l) {
+ // Update the widgets values
function updatewidget(e) {
- var dv = datavalue(e.id);
+ var dv = datavalue(l, "'" + e.id);
if (dv == null || isNil(dv))
return e;
setwidgetvalue(e, dv);
return e;
}
- var e = map(updatewidget, filter(function(e) { return !isNil(e.id); }, nodeList(ui.elementByID($('app'), 'page').childNodes)));
-
- // Make the page visible
- ui.showbody();
+ map(updatewidget, filter(function(e) { return !isNil(e.id); }, nodeList(ui.elementByID($('app'), 'page').childNodes)));
return true;
}
/**
- * Get the contents of the main page component.
+ * Display data from a document on the app page.
*/
-function getdata() {
- $('app').innerHTML = $('appFrame').contentDocument.body.innerHTML;
+function displaydoc(doc) {
+ if (isNil(doc))
+ return true;
- var doc = comp.get('', function(doc) {
+ if (json.isJSON(mklist(doc)))
+ return displaydata(json.readJSON(mklist(doc)));
- if (json.isJSON(mklist(doc)))
- return display(json.readJSON(mklist(doc)));
+ if (atom.isATOMEntry(mklist(doc)))
+ return displaydata(atom.readATOMEntry(mklist(doc)));
- if (atom.isATOMEntry(mklist(doc)))
- return display(atom.readATOMEntry(mklist(doc)));
+ if (atom.isATOMFeed(mklist(doc)))
+ return displaydata(atom.readATOMFeed(mklist(doc)));
- if (atom.isATOMFeed(mklist(doc)))
- return display(atom.readATOMFeed(mklist(doc)));
+ return displaydata(doc);
+}
- return display(doc);
+/**
+ * Bind a handler to a widget.
+ */
+function bindwidgethandler(e) {
+ if (e.className == 'button') {
+ var b = car(childElements(e));
+ b.onclick = function() { return buttonClickHandler(e.id); };
+ return e;
+ }
+ if (e.className == 'button' || e.className == 'entry' || e.className == 'password' || e.className == 'checkbox') {
+ car(childElements(e)).name = e.id;
+ return e;
+ }
+ if (e.className == 'list') {
+ var ce = car(childElements(car(childElements(e))));
+ ce.name = e.id;
+ return e;
+ }
+ return e;
+}
+
+/**
+ * Initial fixup of a widget.
+ */
+function fixupwidget(e) {
+ if (e.className == 'iframe') {
+ var f = car(childElements(e));
+ e.innerHTML = '<iframe src="' + f.href + '" frameborder="no" scrolling="no"></iframe>';
+ return e;
+ }
+ return e;
+}
+
+/**
+ * Get app data from the main app page component.
+ */
+function getpagedata() {
+
+ // Display component data on the page
+ function displaypage(doc) {
+ if (!isNil(doc))
+ displaydoc(doc);
+
+ // Reveal the page
+ ui.showbody();
+ return true;
+ }
+
+ // Eval a component init script
+ function evalcompinit(doc) {
+ if (isNil(doc))
+ return true;
+ var js = car(json.readJSON(mklist(doc)));
+ if (!elementHasValue(js))
+ return true;
+ eval(elementValue(js));
+ return true;
+ }
+
+ // Initial setup of a widget
+ function setupwidget(e) {
+ fixupwidget(e);
+ bindwidgethandler(e);
+ }
+
+ // Get the component app data
+ var doc = pagecomp.get(window.location.search, function(doc) {
+ $('app').innerHTML = $('appFrame').contentDocument.body.innerHTML;
+
+ // Initial setup of the widgets
+ map(setupwidget, filter(function(e) { return !isNil(e.id); }, nodeList(ui.elementByID($('app'), 'page').childNodes)));
+
+ // Display data on the page
+ displaypage(doc);
+
+ // Get and eval the optional timer and location watch setup scripts
+ everycomp.get('setup', evalcompinit);
+ locationcomp.get('setup', evalcompinit);
+ return true;
});
+
+ return true;
+}
+
+/**
+ * Get app data from a component.
+ */
+function getcompdata(comp, qs) {
+ var doc = comp.get(qs, function(doc) {
+ return displaydoc(doc);
+ });
+ return true;
+}
+
+/**
+ * Build a query string from the values of the page's input fields.
+ */
+function compquery() {
+ function queryarg(e) {
+ return e.id + '=' + inputvalue(e);
+ }
+
+ var args = map(queryarg, filter(function(e) { return !isNil(e.id) && !isNil(inputvalue(e)); }, nodeList(ui.elementByID($('app'), 'page').childNodes)));
+
+ // Append current location properties if known
+ if (!isNil(geoposition)) {
+ var g = geoposition;
+ args = append(args, mklist('latitude=' + g.coords.latitude, 'longitude=' + g.coords.longitude, 'altitude=' + g.coords.altitude,
+ 'accuracy=' + g.coords.accuracy, 'altitudeAccuracy=' + g.coords.altitudeAccuracy, 'heading=' + g.coords.heading,
+ 'speed=' + g.coords.speed));
+ }
+
+ return '?' + args.join('&');
+}
+
+/**
+ * Handle a button click event.
+ */
+function buttonClickHandler(id) {
+ return getcompdata(sca.component(id), compquery());
+}
+
+/**
+ * Handle a timer interval event.
+ */
+function intervalHandler() {
+ return getcompdata(everycomp, compquery());
+}
+
+/**
+ * Setup an interval timer.
+ */
+function setupIntervalHandler(sec) {
+ return setInterval(intervalHandler, sec);
+}
+
+/**
+ * Handle a location watch event.
+ */
+var geoposition;
+
+function locationHandler(pos) {
+ geoposition = pos;
+ return getcompdata(locationcomp, compquery());
+}
+
+function locationErrorHandler(e) {
+ return true;
+}
+
+/**
+ * Setup a location watch handler.
+ */
+function setupLocationHandler() {
+ navigator.geolocation.getCurrentPosition(locationHandler, locationErrorHandler);
+ navigator.geolocation.watchPosition(locationHandler, locationErrorHandler);
+ return true;
}
// Load the app frame
-$('app').innerHTML = '<iframe id="appFrame" class="widgetFrame" src="app.html" onload="getdata()"></iframe>';
+$('app').innerHTML = '<iframe id="appFrame" class="widgetFrame" src="app.html" onload="getpagedata()"></iframe>';
</script>
</body>
diff --git a/sca-cpp/trunk/modules/edit/htdocs/dash/dashboard.html b/sca-cpp/trunk/modules/edit/htdocs/dash/dashboard.html
index 89091c0517..d2bebe5114 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/dash/dashboard.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/dash/dashboard.html
@@ -27,7 +27,7 @@
<script type="text/javascript" src="/ui.js"></script>
<script type="text/javascript" src="/component.js"></script>
</head>
-<body>
+<body class="delayed">
<div id="bodydiv" style="position: absolute; top: 0px; left: 0px; right: 0px;">
@@ -46,7 +46,7 @@
<table style="width: 100%;">
<tr><td><b>App Name:</b></td></tr>
-<tr><td><input type="text" id="appName" size="10"/></td></tr>
+<tr><td><input type="text" id="appName" size="10"/>&nbsp;<span id="appDomain"></span></td></tr>
<tr><tr><td><b>App Title:</b></td></tr>
<tr><td><input type="text" id="appTitle" size="80"/></td></tr>
<tr><tr><td><b>Category:</b></td></tr>
@@ -72,33 +72,58 @@ var editWidget = sca.component("EditWidget");
var dashboard = sca.reference(editWidget, "dashboard");
/**
+ * Return the link to an app.
+ */
+function applink(appname) {
+ 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 + '/';
+ return link;
+}
+
+/**
* Get and display list of apps.
*/
function getapps(sync) {
function display(doc) {
var apps = '<table style="width: 100%;">';
- apps += '<tr><th class="thl thr" style="width: 225px; min-width: 225px; padding-top: 4px; padding-right: 4px;">App</th>' +
+ apps += '<tr><th class="thl thr" style="width: 20px; padding-top: 4px; padding-right: 4px;">App</th>' +
+ '<th class="thr thl" style="width: 20px;">Domain</th>' +
+ '<th class="thr thl">Category</th>' +
'<th class="thr thl" style="width: 100%;">Title</th>' +
- '<th class="thl thr" style="width: 30px;">Sharing</th></tr>';
+ '<th class="thr thl">Updated</th>' +
+ '<th class="thl thr">Sharing</th></tr>';
var feed = car(elementsToValues(atom.readATOMFeed(mklist(doc))));
var entries = cadr(assoc("'entry", cdr(feed)));
for (var i = 0; i < length(entries); i++) {
var entry = entries[i];
- title = cadr(assoc("'title", entry))
- name = cadr(assoc("'id", entry))
- hreflink = '<a href=\"' + '/graph/?app=' + name + '\" target=\"_parent\">';
- sharing = 'Shared with everybody';
+ var title = cadr(assoc("'title", entry))
+ var name = cadr(assoc("'id", entry))
+ var editlink = '<a href=\"' + '/graph/?app=' + name + '\" target=\"_parent\">';
+ var domainlink = '<a href=\"' + applink(name) + '\" target=\"_' + name + '\">' + name + '.' + window.location.hostname + '</a>';
+ var category = 'coolapps';
+ var updated = 'Feb 4, 2011';
+ var sharing = 'Public';
apps += '<tr class="trb"><td>';
- apps += hreflink + '<img src="/public/app.png" style="width: 50px; height: 50px; margin-right: 10px; vertical-align: middle;"></img>' + '</a>';
- apps += '&nbsp;' + hreflink + name + '</a></td>';
+ apps += editlink + '<img src="/public/app.png" style="width: 50px; height: 50px; margin-right: 10px; vertical-align: middle;"></img>' + '</a>';
+ apps += '&nbsp;' + editlink + name + '</a></td>';
+ apps += '<td>' + domainlink + '</td>';
+ apps += '<td>' + category + '</td>';
apps += '<td class="tdw">' + title + '</td>';
+ apps += '<td>' + updated + '</td>';
apps += '<td>' + sharing + '</td>';
apps += '</tr>';
}
apps += '</table>';
$('apps').innerHTML = apps;
+
+ // Show the page
+ ui.showbody();
}
if (sync) {
@@ -123,6 +148,7 @@ var defdesc = 'Enter a short description of your app here';
*/
$('createAppButton').onclick = function() {
$('appName').value = '';
+ $('appDomain').innerHTML = '.' + window.location.hostname;
$('appTitle').value = deftitle;
$('appCategory').value = defcategory;
$('appDescription').value = defdesc;
diff --git a/sca-cpp/trunk/modules/edit/htdocs/dash/index.html b/sca-cpp/trunk/modules/edit/htdocs/dash/index.html
index 281e2afff2..ea1b2f03b6 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/dash/index.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/dash/index.html
@@ -22,6 +22,7 @@
<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-translucent"/>
+<link rel="apple-touch-icon" href="/public/touchicon.png"/>
<link rel="stylesheet" type="text/css" href="/ui.css"/>
<script type="text/javascript" src="/util.js"></script>
<script type="text/javascript" src="/ui.js"></script>
@@ -29,24 +30,25 @@
<body class="delayed">
<div id="menu"></div>
-<script type="text/javascript">
-
-// Load the menu bar
-ui.loadwidget('menu', '/menu.html', ui.showbody);
-</script>
-
-<h1>App Edit</h1>
+<h1 id="h1"></h1>
<br/>
<div id="dashboard"></div>
<script type="text/javascript">
+// Load the menu bar
+ui.loadwidget('menu', '/menu.html', ui.showbody);
+
+$('h1').innerHTML = domaintitle(window.location.hostname);
+
// Load the dashboard
$('dashboard').innerHTML =
'<iframe id="dashboardFrame" style="height: 5000px; width: 100%; border: 0px;" scrolling="no" frameborder="0" src="dashboard.html"></iframe>';
+ui.showbody();
</script>
+
</body>
</html>
diff --git a/sca-cpp/trunk/modules/edit/htdocs/data/index.html b/sca-cpp/trunk/modules/edit/htdocs/data/index.html
index 9fe5b1b5a0..8a7a63e798 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/data/index.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/data/index.html
@@ -17,11 +17,16 @@
* under the License.
-->
<html>
-<head>
-<title>Results</title>
+<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-translucent"/>
+<link rel="apple-touch-icon" href="/public/touchicon.png"/>
<link rel="stylesheet" type="text/css" href="/ui.css">
<script type="text/javascript" src="/util.js"></script>
<script type="text/javascript" src="/elemutil.js"></script>
@@ -32,7 +37,7 @@
<script type="text/javascript" src="/ui.js"></script>
<script type="text/javascript" src="/component.js"></script>
</head>
-<body>
+<body class="delayed">
<div id="bodydiv" style="position: absolute; top: 0px; left: 0px; right: 0px;">
@@ -52,10 +57,19 @@ var comp = sca.component(cname);
*/
function display(e) {
$('bodydiv').innerHTML = e;
+
+ ui.showbody();
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) {
@@ -70,15 +84,15 @@ function getdata() {
comp.get('', function(doc) {
if (json.isJSON(mklist(doc)))
- return display(ui.datatable(json.readJSON(mklist(doc))));
+ return display(datatable(json.readJSON(mklist(doc))));
if (atom.isATOMEntry(mklist(doc)))
- return display(ui.datatable(atom.readATOMEntry(mklist(doc))));
+ return display(datatable(atom.readATOMEntry(mklist(doc))));
if (atom.isATOMFeed(mklist(doc)))
- return display(ui.datatable(atom.readATOMFeed(mklist(doc))));
+ return display(datatable(atom.readATOMFeed(mklist(doc))));
- return display(mkdoctable(doc));
+ return display(mkdoctable('<iframe style="width: 100%; height: 5000px;" scrolling="no" frameborder="0" src="' + comp.uri + '"/>'));
});
}
diff --git a/sca-cpp/trunk/modules/edit/htdocs/favicon.ico b/sca-cpp/trunk/modules/edit/htdocs/favicon.ico
new file mode 100644
index 0000000000..a7b502b9e1
--- /dev/null
+++ b/sca-cpp/trunk/modules/edit/htdocs/favicon.ico
Binary files differ
diff --git a/sca-cpp/trunk/modules/edit/htdocs/graph/graph.html b/sca-cpp/trunk/modules/edit/htdocs/graph/graph.html
index 0e2a1bf2d2..604892fa27 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/graph/graph.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/graph/graph.html
@@ -28,7 +28,7 @@
<script type="text/javascript" src="/component.js"></script>
<script type="text/javascript" src="graph.js"></script>
</head>
-<body>
+<body class="delayed">
<div id="bodydiv" style="position: absolute; top: 0px; left: 0px; right: 0px;">
@@ -39,8 +39,9 @@
<th class="thr" style="padding-left: 4px; padding-top: 0px; padding-bottom: 0px;">
<input id="compName" type="text" value="component name" title="Component name" style="position: relative; width: 200px;"/>
<input id="propValue" type="text" value="property value" title="Component property value" style="position: relative; width: 300px;"/>
-<input type="button" id="autoplayButton" title="Turn autoplay on/off" style="font-weight: bold;" Value="Autoplay is on"/>
-<span id="compValue" style="position: relative; font-weight: normal;"></span><br/>
+<input type="button" id="autoplayButton" title="Turn preview on/off" style="font-weight: bold;" Value="Preview is on"/>
+<span id="compValue" style="position: relative; font-weight: normal;"></span>
+<span id="compDebug" style="position: relative; font-weight: normal;"></span>
</th>
<th class="thl thr" style="padding-top: 0px; padding-bottom: 0px; padding-right: 0px; text-align: right;">
@@ -114,6 +115,9 @@ function getapp(name, g) {
// Track the saved composite XML
savedcomposxml = car(writeXML(composite, false));
+
+ // Show the page
+ ui.showbody();
});
}
@@ -203,6 +207,21 @@ function compvaluelink(appname, cname) {
}
/**
+ * Return the link to a component raw data.
+ */
+function compdebuglink(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 + '/components/' + cname;
+ return link;
+}
+
+/**
* Track whether we're always showing the result data of the selected component.
*/
var autoplay = true;
@@ -228,7 +247,8 @@ function oncompselect(appname, cname) {
return true;
compname = cname;
var link = compvaluelink(appname, cname);
- $('compValue').innerHTML = link != ''? '<a href="' + link + '" target="_blank">' + 'Results' + '</a>' : '';
+ $('compValue').innerHTML = link != ''? '<input type="button" id="playButton" title="View the component value" style="font-weight: bold;" value="View" onclick="playcomp()"/>' : '';
+ $('compDebug').innerHTML = link != ''? '<input type="button" id="debugButton" title="View the component raw data" style="font-weight: bold;" value="URL" onclick="debugcomp()"/>' : '';
if (autoplay)
return showData(cname);
@@ -236,21 +256,40 @@ function oncompselect(appname, cname) {
}
/**
+ * Play the current component.
+ */
+function playcomp() {
+ var link = compvaluelink(appname, compname);
+ return window.open(link, '_' + appname + '_' + compname);
+}
+
+/**
+ * Debug the current component.
+ */
+function debugcomp() {
+ var link = compdebuglink(appname, compname);
+ return window.open(link, '_' + appname + '_' + compname);
+}
+
+/**
* Handle autoplay on/off click event.
*/
$('autoplayButton').onclick = function(e) {
if (autoplay) {
autoplay = false;
showData('');
- $('autoplayButton').value = 'Autoplay is off';
+ $('autoplayButton').value = 'Autorun is off';
return true;
}
autoplay = true;
showData(compname);
- $('autoplayButton').value = 'Autoplay is on';
+ $('autoplayButton').value = 'Autorun is on';
return true;
};
+// Init the play app button
+
+
// Create editor graph area
var g = graph.mkgraph(graph.mkpath().move(0,40), $('compName'), $('propValue'));
var bg = graph.mkgroup(graph.mkpath());
@@ -261,16 +300,16 @@ var spalette = 'event';
var pos = graph.mkpath();
installpalette('event', pos.rmove(0,0), g, bg, spalette, gpalettes);
installpalette('value', pos.rmove(0,40), g, bg, spalette, gpalettes);
-installpalette('url', pos.rmove(0, 40), g, bg, spalette, gpalettes);
installpalette('list', pos.rmove(0, 40), g, bg, spalette, gpalettes);
installpalette('transform', pos.rmove(0, 40), g, bg, spalette, gpalettes);
installpalette('text', pos.rmove(0, 40), g, bg, spalette, gpalettes);
-installpalette('logic', pos.rmove(0, 40), g, bg, spalette, gpalettes);
-installpalette('math', pos.rmove(0, 40), g, bg, spalette, gpalettes);
+installpalette('http', pos.rmove(0, 40), g, bg, spalette, gpalettes);
installpalette('talk', pos.rmove(0, 40), g, bg, spalette, gpalettes);
installpalette('social', pos.rmove(0, 40), g, bg, spalette, gpalettes);
installpalette('search', pos.rmove(0, 40), g, bg, spalette, gpalettes);
-installpalette('sensor', pos.rmove(0, 40), g, bg, spalette, gpalettes);
+installpalette('logic', pos.rmove(0, 40), g, bg, spalette, gpalettes);
+installpalette('math', pos.rmove(0, 40), g, bg, spalette, gpalettes);
+installpalette('python', pos.rmove(0, 40), g, bg, spalette, gpalettes);
// Get and display the current app
getapp(appname, g);
diff --git a/sca-cpp/trunk/modules/edit/htdocs/graph/graph.js b/sca-cpp/trunk/modules/edit/htdocs/graph/graph.js
index 3535dce0df..13543b4d61 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/graph/graph.js
+++ b/sca-cpp/trunk/modules/edit/htdocs/graph/graph.js
@@ -408,7 +408,7 @@ if (ui.isIE()) {
graph.comptitlewidth = function(comp) {
var t = graph.title(comp);
graph.comptitlewidthdiv.innerHTML = t;
- var twidth = graph.comptitlewidthdiv.offsetWidth + 4;
+ var twidth = graph.comptitlewidthdiv.offsetWidth + 2;
graph.comptitlewidthdiv.innerHTML = '';
return twidth;
};
@@ -419,7 +419,7 @@ if (ui.isIE()) {
graph.proptitle = function(comp) {
var tsvcs = graph.tsvcs(comp);
var lsvcs = graph.lsvcs(comp);
- var pos = graph.mkpath().move(isNil(lsvcs)? tabsz : (tabsz * 5), isNil(tsvcs)? 15 + tabsz : 15 + (tabsz * 5));
+ var pos = graph.mkpath().move(graph.comptitlewidth(comp) + 7 + (isNil(lsvcs)? tabsz : (tabsz * 5)), isNil(tsvcs)? tabsz : (tabsz * 5));
return graph.mktitle(graph.property(comp), true, pos);
};
@@ -429,7 +429,7 @@ if (ui.isIE()) {
graph.proptitlewidth = function(comp) {
var t = graph.property(comp);
graph.proptitlewidthdiv.innerHTML = t;
- var twidth = graph.proptitlewidthdiv.offsetWidth + 4;
+ var twidth = graph.proptitlewidthdiv.offsetWidth + 2;
graph.proptitlewidthdiv.innerHTML = '';
return twidth;
};
@@ -902,7 +902,7 @@ if (ui.isIE()) {
graph.comptitlewidth = function(comp) {
var title = graph.comptitle(comp);
graph.titlewidthsvg.appendChild(title);
- var width = title.getBBox().width + 4;
+ var width = title.getBBox().width + 2;
graph.titlewidthsvg.removeChild(title);
return width;
};
@@ -930,7 +930,7 @@ if (ui.isIE()) {
*/
graph.proptitle = function(comp) {
var title = graph.mktitle(graph.property(comp), true);
- title.setAttribute('y', 30);
+ title.setAttribute('x', graph.comptitlewidth(comp) + 7);
return title;
};
@@ -940,7 +940,7 @@ if (ui.isIE()) {
graph.proptitlewidth = function(comp) {
var title = graph.proptitle(comp);
graph.titlewidthsvg.appendChild(title);
- var width = title.getBBox().width + 4;
+ var width = title.getBBox().width + 2;
graph.titlewidthsvg.removeChild(title);
return width;
};
@@ -1085,7 +1085,9 @@ graph.title = function(e) {
return '>'
if (t == 'lt')
return '<';
- return t;
+ if (t.indexOf('{') == -1)
+ return t;
+ return t.replace('{compname}', scdl.name(e));
}
return scdl.name(e);
};
@@ -1236,8 +1238,6 @@ graph.compheight = function(comp, cassoc) {
var height = Math.max(lsvcsh, rrefsh);
if (!isNil(graph.brefs(comp)))
height = Math.max(height, (tabsz * 10) + (tabsz * 4) + (tabsz * 2));
- if (graph.property(comp) != '')
- height = Math.max(40, height);
return height;
});
};
@@ -1288,7 +1288,7 @@ graph.rrefswidth = function(refs, cassoc) {
*/
graph.compwidth = function(comp, cassoc) {
return memo(comp, 'width', function() {
- var twidth = Math.max(graph.comptitlewidth(comp), graph.proptitlewidth(comp)) + (tabsz * 8);
+ var twidth = graph.comptitlewidth(comp) + graph.proptitlewidth(comp) + (tabsz * 8);
var tsvcs = graph.tsvcs(comp);
var tsvcsw = Math.max(1, length(tsvcs)) * (tabsz * 10) + (tabsz * 4);
var brefs = graph.brefs(comp);
diff --git a/sca-cpp/trunk/modules/edit/htdocs/graph/index.html b/sca-cpp/trunk/modules/edit/htdocs/graph/index.html
index 9484946f72..9cda960f6e 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/graph/index.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/graph/index.html
@@ -18,10 +18,11 @@
-->
<html>
<head>
-<title>App Composition Editor</title>
+<title>Composition</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-translucent"/>
+<link rel="apple-touch-icon" href="/public/touchicon.png"/>
<link rel="stylesheet" type="text/css" href="/ui.css"/>
<script type="text/javascript" src="/util.js"></script>
<script type="text/javascript" src="/ui.js"></script>
@@ -29,6 +30,11 @@
<body class="delayed">
<div id="menu"></div>
+<h1><span id="h1"></span> <span id="appNameHeader" style="font-weight: normal;"></span></h1>
+<br/>
+
+<div id="graph"></div>
+
<script type="text/javascript">
// Get the app name
@@ -36,14 +42,10 @@ var appname = ui.queryParams()['app'];
// Load the menu bar
ui.loadwidget('menu', '/menu.html?app=' + appname, ui.showbody);
-</script>
-
-<h1>App Edit <span id="appNameHeader" style="font-weight: normal;"></span></h1>
-<br/>
-<div id="graph"></div>
-
-<script type="text/javascript">
+$('h1').innerHTML = domaintitle(window.location.hostname);
+document.title = 'Composition - ' + appname;
+$('appNameHeader').innerHTML = ' - ' + appname;
/**
* Display the editor for an app.
@@ -58,11 +60,11 @@ function editapp(name) {
}
// Display the editor for the current app
-document.title = 'Composition - ' + appname;
-$('appNameHeader').innerHTML = ' - ' + appname;
editapp(appname);
+ui.showbody();
</script>
+
</body>
</html>
diff --git a/sca-cpp/trunk/modules/edit/htdocs/index.html b/sca-cpp/trunk/modules/edit/htdocs/index.html
index eb331ea406..278f6ec260 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/index.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/index.html
@@ -18,33 +18,39 @@
-->
<html>
<head>
-<title>App Edit</title>
+<title>Home</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-translucent"/>
+<link rel="apple-touch-icon" href="/public/touchicon.png"/>
<link rel="stylesheet" type="text/css" href="/ui.css"/>
<script type="text/javascript" src="/util.js"></script>
+<script type="text/javascript">
+document.title = domaintitle(window.location.hostname);
+</script>
<script type="text/javascript" src="/ui.js"></script>
</head>
<body class="delayed">
<div id="menu"></div>
-<script type="text/javascript">
-
-// Load the menu bar
-ui.loadwidget('menu', '/menu.html', ui.showbody);
-</script>
-
-<h1>App Edit</h1>
+<h1 id="h1"></h1>
<br/>
<div id="main"></div>
<script type="text/javascript">
+// Load the menu bar
+ui.loadwidget('menu', '/menu.html', ui.showbody);
+
+$('h1').innerHTML = domaintitle(window.location.hostname);
+
// Load the main page
ui.loadiframe('main', 'main.html');
+
+ui.showbody();
</script>
+
</body>
</html>
diff --git a/sca-cpp/trunk/modules/edit/htdocs/login/index.html b/sca-cpp/trunk/modules/edit/htdocs/login/index.html
index 8ba796643f..89dbd4a1c3 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/login/index.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/login/index.html
@@ -19,9 +19,11 @@
<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-translucent"/>
+<link rel="apple-touch-icon" href="/public/touchicon.png"/>
<link rel="stylesheet" type="text/css" href="/ui.css"/>
<script type="text/javascript" src="/util.js"></script>
<script type="text/javascript" src="/ui.js"></script>
@@ -69,7 +71,8 @@ if (typeof(oauthReferrer()) == 'undefined') {
}
function submitFormSignin() {
- document.cookie = 'TuscanyOpenAuth=;expires=' + new Date(1970,01,01).toGMTString() + ';path=/;secure=TRUE';
+ var reset = 'TuscanyOpenAuth=;expires=' + new Date(1970,01,01).toGMTString() + ';domain=.' + domainname(window.location.hostname) + ';path=/;secure=TRUE';
+ document.cookie = reset;
document.formSignin.httpd_location.value = oauthReferrer();
document.formSignin.submit();
}
diff --git a/sca-cpp/trunk/modules/edit/htdocs/logout/index.html b/sca-cpp/trunk/modules/edit/htdocs/logout/index.html
index ff27f5a8cb..bf6623dc70 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/logout/index.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/logout/index.html
@@ -19,9 +19,11 @@
<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-translucent"/>
+<link rel="apple-touch-icon" href="/public/touchicon.png"/>
<link rel="stylesheet" type="text/css" href="/ui.css"/>
<script type="text/javascript" src="/util.js"></script>
<script type="text/javascript" src="/ui.js"></script>
@@ -36,7 +38,8 @@
<script type="text/javascript">
function submitSignout() {
- document.cookie = 'TuscanyOpenAuth=;expires=' + new Date(1970,01,01).toGMTString() + ';path=/;secure=TRUE';
+ 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;
}
diff --git a/sca-cpp/trunk/modules/edit/htdocs/main.html b/sca-cpp/trunk/modules/edit/htdocs/main.html
index ee9f0d3fd6..105dda9fe8 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/main.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/main.html
@@ -22,14 +22,14 @@
<script type="text/javascript" src="/util.js"></script>
<script type="text/javascript" src="/ui.js"></script>
</head>
-<body>
+<body class="delayed">
<div id="bodydiv" style="position: absolute; top: 0px; left: 0px; right: 0px;">
<div style="margin-left: auto; margin-right: auto; text-align: center;">
<br/><br/><br/>
-<a href="dash" target="_parent"><img src="home.png" style="width: 426px; height: 145px;"></img></a>
+<a href="dash" target="_parent"><img src="home.png" style="width: 426px; height: 145px;"/></a>
<br/><br/>
@@ -38,12 +38,17 @@
<br/><br/><br/>
<div>This module implements a simple App store to help you create and share Tuscany apps.</div>
<div>The user interface is minimalistic, by design.</div>
+<br/>
+<div>Works with Safari, Chrome and Firefox. Doesn't work with IE.</div>
</div>
</div>
<script type="text/javascript">
if (ui.isIE()) $('bodydiv').style.right = -20;
+
+ui.showbody();
+
</script>
</body>
diff --git a/sca-cpp/trunk/modules/edit/htdocs/menu.html b/sca-cpp/trunk/modules/edit/htdocs/menu.html
index 6346075df3..0b9b7ddd8a 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/menu.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/menu.html
@@ -51,12 +51,25 @@ function appname() {
return ui.queryParams()['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;
+ if (port == ':80' || port == ':443' || port == ':')
+ port = '';
+ var link = protocol + '//' + appname + '.' + host + port + '/';
+ return link;
+}
+
// Display the menu bar
var mdiv = $('menu');
var name = appname();
mdiv.innerHTML = ui.menubar(
append(mklist(ui.menu('Home', '/'), ui.menu('Store', '/store'), ui.menu('Dashboard', '/dash')),
- (isNil(name) || name == 'undefined')? mklist() : mklist(ui.menu('Composition', '/graph/?app=' + name), ui.menu('Page', '/page/?app=' + name), ui.menu('Settings', '/props/?app=' + name))),
+ (isNil(name) || name == 'undefined')? mklist() : mklist(ui.menu('Composition', '/graph/?app=' + name), ui.menu('Page', '/page/?app=' + name), ui.menu('Settings', '/props/?app=' + name), ui.menu(name + '.' + window.location.hostname, applink(name), '_' + name))),
mklist(userMenu(), ui.menu('Account', '/account'), ui.menu('Sign out', '/logout')));
</script>
diff --git a/sca-cpp/trunk/modules/edit/htdocs/page/index.html b/sca-cpp/trunk/modules/edit/htdocs/page/index.html
index a328998177..bacd801429 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/page/index.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/page/index.html
@@ -18,10 +18,11 @@
-->
<html>
<head>
-<title>App Page Editor</title>
+<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-translucent"/>
+<link rel="apple-touch-icon" href="/public/touchicon.png"/>
<link rel="stylesheet" type="text/css" href="/ui.css"/>
<script type="text/javascript" src="/util.js"></script>
<script type="text/javascript" src="/ui.js"></script>
@@ -29,6 +30,11 @@
<body class="delayed">
<div id="menu"></div>
+<h1><span id="h1"></span> <span id="appNameHeader" style="font-weight: normal;"></span></h1>
+<br/>
+
+<div id="page"></div>
+
<script type="text/javascript">
// Get the app name
@@ -36,14 +42,11 @@ var appname = ui.queryParams()['app'];
// Load the menu bar
ui.loadwidget('menu', '/menu.html?app=' + appname, ui.showbody);
-</script>
-
-<h1>App Edit <span id="appNameHeader" style="font-weight: normal;"></span></h1>
-<br/>
-
-<div id="page"></div>
-<script type="text/javascript">
+// Display the editor for the current app
+document.title = 'Page - ' + appname;
+$('h1').innerHTML = domaintitle(window.location.hostname);
+$('appNameHeader').innerHTML = ' - ' + appname;
/**
* Display the page editor for an app.
@@ -57,11 +60,9 @@ function editapp(name) {
'"></iframe>';
}
-// Display the editor for the current app
-document.title = 'Page - ' + appname;
-$('appNameHeader').innerHTML = ' - ' + appname;
editapp(appname);
+ui.showbody();
</script>
</body>
</html>
diff --git a/sca-cpp/trunk/modules/edit/htdocs/page/page.html b/sca-cpp/trunk/modules/edit/htdocs/page/page.html
index 6cd828ea74..219374a3d1 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/page/page.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/page/page.html
@@ -28,7 +28,7 @@
<script type="text/javascript" src="/component.js"></script>
<script type="text/javascript" src="page.js"></script>
</head>
-<body>
+<body class="delayed">
<div id="bodydiv" style="position: absolute; top: 0px; left: 0px; right: 0px;">
@@ -52,19 +52,20 @@
<div id="page" style="position: absolute; top: 40px; left: 0px; width: 5000px; height: 5000px;">
<span class="h1" id="palette:h1" style="position: absolute; left: 0px; top: 0px;"><h1>Header1</h1></span>
-<span class="h2" id="palette:h2" style="position: absolute; left: 0px; top: 40px;"><h2>Header2</h2></span>
-<span class="section" id="palette:section" style="position: absolute; left: 0px; top: 80px;"><span class="section">section</span></span>
-<span class="button" id="palette:button" style="position: absolute; left: 0px; top: 120px;"><input type="button" value="button"/></span>
-<span class="entry" id="palette:entry" style="position: absolute; left: 0px; top: 160px;"><input type="text" value="field" size="5"/></span>
-<span class="password" id="palette:password" style="position: absolute; left: 0px; top: 200px;"><input type="password" value="password" size="5"/></span>
-<span class="checkbox" id="palette:checkbox" style="position: absolute; left: 0px; top: 240px;"><input type="checkbox" value="checkbox"/><span>checkbox</span></span>
-<span class="list" id="palette:list" style="position: absolute; left: 0px; top: 280px;"><select><option value="list">list</option></select></span>
-<span class="table" id="palette:table" style="position: absolute; left: 0px; top: 320px;">
-<table class="datatable"><tr><td class="datatdl">name</td><td class="datatdr">value</td></tr><tr><td class="datatdl">name</td><td class="datatdr">value</td></tr></table>
+<span class="h2" id="palette:h2" style="position: absolute; left: 0px; top: 35px;"><h2>Header2</h2></span>
+<span class="section" id="palette:section" style="position: absolute; left: 0px; top: 70px;"><span class="section">section</span></span>
+<span class="button" id="palette:button" style="position: absolute; left: 0px; top: 100px;"><input type="button" value="button"/></span>
+<span class="entry" id="palette:entry" style="position: absolute; left: 0px; top: 130px;"><input type="text" value="field" size="10"/></span>
+<span class="password" id="palette:password" style="position: absolute; left: 0px; top: 160px;"><input type="password" value="password" size="10"/></span>
+<span class="checkbox" id="palette:checkbox" style="position: absolute; left: 0px; top: 190px;"><input type="checkbox" value="checkbox"/><span>checkbox</span></span>
+<span class="list" id="palette:list" style="position: absolute; left: 0px; top: 220px;"><select><option value="list">list</option></select></span>
+<span class="table" id="palette:table" style="position: absolute; left: 0px; top: 250px;">
+<table class="datatable"><tr><td class="datatdl">table</td><td class="datatdr">...</td></tr><tr><td class="datatdl">...</td><td class="datatdr">...</td></tr></table>
</span>
-<span class="link" id="palette:link" style="position: absolute; left: 0px; top: 380px;"><a href="/"><span>link</span></a></span>
-<span class="text" id="palette:text" style="position: absolute; left: 0px; top: 420px;"><span>text</span></span>
-<span class="img" id="palette:img" style="position: absolute; left: 0px; top: 460px;"><img src=""/></span>
+<span class="link" id="palette:link" style="position: absolute; left: 0px; top: 300px;"><a href="/"><span>link</span></a></span>
+<span class="text" id="palette:text" style="position: absolute; left: 0px; top: 330px;"><span>text</span></span>
+<span class="iframe" id="palette:iframe" style="position: absolute; left: 0px; top: 360px;"><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: 390px;"><img src="/public/img.png"/></span>
</div>
@@ -129,6 +130,9 @@ function getpage(name, edit) {
}, nodeList(buffer.childNodes[0].childNodes));
savedpagexhtml = pagexhtml();
+
+ // Show the page
+ ui.showbody();
});
}
diff --git a/sca-cpp/trunk/modules/edit/htdocs/page/page.js b/sca-cpp/trunk/modules/edit/htdocs/page/page.js
index 1fb136236b..54b3751900 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/page/page.js
+++ b/sca-cpp/trunk/modules/edit/htdocs/page/page.js
@@ -337,12 +337,23 @@ if (ui.isIE()) {
page.text = function(e) {
if (e.className == 'h1' || e.className == 'h2' || e.className == 'text' || e.className == 'section')
return car(childElements(e)).innerHTML;
- if (e.className == 'button' || e.className == 'entry' || e.className == 'password' || e.className == 'checkbox')
+ if (e.className == 'button' || e.className == 'checkbox')
return car(childElements(e)).value;
+ if (e.className == 'entry' || e.className == 'password')
+ return car(childElements(e)).defaultValue;
if (e.className == 'list')
return car(childElements(car(childElements(e)))).value;
- if (e.className == 'link')
- return car(childElements(car(childElements(e)))).innerHTML;
+ if (e.className == 'link') {
+ var hr = car(childElements(e)).href;
+ var t = car(childElements(car(childElements(e)))).innerHTML;
+ return 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')
+ return car(childElements(e)).href;
if (e.className == 'table')
return '';
return '';
@@ -357,7 +368,7 @@ page.settext = function(e, t) {
return t;
}
if (e.className == 'button' || e.className == 'entry' || e.className == 'password') {
- car(childElements(e)).value = t;
+ car(childElements(e)).defaultValue = t;
return t;
}
if (e.className == 'checkbox') {
@@ -371,14 +382,23 @@ page.settext = function(e, t) {
ce.innerHTML = t;
return t;
}
+ if (e.className == 'table') {
+ return '';
+ }
if (e.className == 'link') {
- var ce = car(childElements(car(childElements(e))));
- ce.href = t;
- ce.innerHTML = t;
+ var l = t.split(',');
+ var ce = car(childElements(e));
+ ce.href = car(l);
+ car(childElements(ce)).innerHTML = isNil(cdr(l))? car(l) : cadr(l);
return t;
}
- if (e.className == 'table') {
- return '';
+ if (e.className == 'img') {
+ car(childElements(e)).src = t;
+ return t;
+ }
+ if (e.className == 'iframe') {
+ car(childElements(e)).href = t;
+ return t;
}
return '';
};
diff --git a/sca-cpp/trunk/modules/edit/htdocs/props/index.html b/sca-cpp/trunk/modules/edit/htdocs/props/index.html
index 650c68a350..9c7553bef2 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/props/index.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/props/index.html
@@ -18,10 +18,11 @@
-->
<html>
<head>
-<title>App Settings</title>
+<title>Settings</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-translucent"/>
+<link rel="apple-touch-icon" href="/public/touchicon.png"/>
<link rel="stylesheet" type="text/css" href="/ui.css"/>
<script type="text/javascript" src="/util.js"></script>
<script type="text/javascript" src="/ui.js"></script>
@@ -29,6 +30,11 @@
<body class="delayed">
<div id="menu"></div>
+<h1><span id="h1"></span> <span id="appNameHeader" style="font-weight: normal;"></span></h1>
+<br/>
+
+<div id="props"></div>
+
<script type="text/javascript">
// Get the app name
@@ -36,14 +42,10 @@ var appname = ui.queryParams()['app'];
// Load the menu bar
ui.loadwidget('menu', '/menu.html?app=' + appname, ui.showbody);
-</script>
-
-<h1>App Edit <span id="appNameHeader" style="font-weight: normal;"></span></h1>
-<br/>
-<div id="props"></div>
-
-<script type="text/javascript">
+document.title = 'Settings - ' + appname;
+$('h1').innerHTML = domaintitle(window.location.hostname);
+$('appNameHeader').innerHTML = ' - ' + appname;
/**
* Display the properties editor for an app.
@@ -55,11 +57,11 @@ function editapp(name) {
}
// Display the editor for the current app
-document.title = 'App - ' + appname;
-$('appNameHeader').innerHTML = ' - ' + appname;
editapp(appname);
+ui.showbody();
</script>
+
</body>
</html>
diff --git a/sca-cpp/trunk/modules/edit/htdocs/props/props.html b/sca-cpp/trunk/modules/edit/htdocs/props/props.html
index 36d4e075ad..698dfb2b57 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/props/props.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/props/props.html
@@ -27,7 +27,7 @@
<script type="text/javascript" src="/ui.js"></script>
<script type="text/javascript" src="/component.js"></script>
</head>
-<body>
+<body class="delayed">
<div id="bodydiv" style="position: absolute; top: 0px; left: 0px; right: 0px;">
@@ -45,6 +45,8 @@
<div>
<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;"></td></tr>
<tr><tr><td><b>App Title:</b></td></tr>
<tr><td><input type="text" id="appTitle" size="80"/></td></tr>
<tr><tr><td><b>Category:</b></td></tr>
@@ -97,6 +99,9 @@ function getapp(name) {
$('appUpdated').innerHTML = defdate;
$('appDescription').innerHTML = defdesc;
savedappentryxml = car(atom.writeATOMEntry(valuesToElements(mklist(appentry))));
+
+ // Show the page
+ ui.showbody();
});
}
diff --git a/sca-cpp/trunk/modules/edit/htdocs/public/app.png b/sca-cpp/trunk/modules/edit/htdocs/public/app.png
index bae5415d0c..d3bf372316 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/public/app.png
+++ b/sca-cpp/trunk/modules/edit/htdocs/public/app.png
Binary files differ
diff --git a/sca-cpp/trunk/modules/edit/htdocs/public/app.xcf b/sca-cpp/trunk/modules/edit/htdocs/public/app.xcf
new file mode 100644
index 0000000000..741b7ff43f
--- /dev/null
+++ b/sca-cpp/trunk/modules/edit/htdocs/public/app.xcf
Binary files differ
diff --git a/sca-cpp/trunk/modules/edit/htdocs/public/iframe.html b/sca-cpp/trunk/modules/edit/htdocs/public/iframe.html
new file mode 100644
index 0000000000..140ff48b8b
--- /dev/null
+++ b/sca-cpp/trunk/modules/edit/htdocs/public/iframe.html
@@ -0,0 +1,32 @@
+<!--
+ * 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>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-translucent"/>
+<link rel="stylesheet" type="text/css" href="/ui.css"/>
+</head>
+<body style="margin:3px; padding: 0px; background-color: #dcdcdc;">
+
+<div>frame ...</div>
+
+</body>
+</html>
diff --git a/sca-cpp/trunk/modules/edit/htdocs/public/img.png b/sca-cpp/trunk/modules/edit/htdocs/public/img.png
new file mode 100644
index 0000000000..42fcce9212
--- /dev/null
+++ b/sca-cpp/trunk/modules/edit/htdocs/public/img.png
Binary files differ
diff --git a/sca-cpp/trunk/modules/edit/htdocs/public/img.xcf b/sca-cpp/trunk/modules/edit/htdocs/public/img.xcf
new file mode 100644
index 0000000000..ffcc124584
--- /dev/null
+++ b/sca-cpp/trunk/modules/edit/htdocs/public/img.xcf
Binary files differ
diff --git a/sca-cpp/trunk/modules/edit/htdocs/public/notauth.html b/sca-cpp/trunk/modules/edit/htdocs/public/notauth.html
index f49c914057..a4c808deb7 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/public/notauth.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/public/notauth.html
@@ -18,7 +18,7 @@
-->
<html>
<head>
-<title>App Edit - Sorry</title>
+<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-translucent"/>
@@ -29,20 +29,27 @@
<body class="delayed">
<div id="menu"></div>
-<script type="text/javascript">
-
-// Load the menu bar
-ui.loadwidget('menu', '/menu.html', ui.showbody);
-</script>
-
-<h1>App Edit</h1>
+<h1 id="h1"></h1>
<br/>
+
<div class="hd1">Sorry, you're not authorized to view this page.</div>
<form name="signout" action="/public/notauth.html" method="GET">
+</form>
+
<script type="text/javascript">
+
+// Load the menu bar
+if (!issubdomain(window.location.hostname))
+ ui.loadwidget('menu', '/menu.html', ui.showbody);
+
+$('h1').innerHTML = domaintitle(window.location.hostname);
+
+ui.showbody();
+
function submitSignout() {
- document.cookie = 'TuscanyOpenAuth=;expires=' + new Date(1970,01,01).toGMTString() + ';path=/;secure=TRUE';
+ 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;
}
@@ -50,7 +57,6 @@ function submitSignout() {
if (window.top.location.pathname != '/public/notauth.html')
submitSignout();
</script>
-</form>
</body>
</html>
diff --git a/sca-cpp/trunk/modules/edit/htdocs/public/notfound.html b/sca-cpp/trunk/modules/edit/htdocs/public/notfound.html
index 980d1e1960..a69cd7dd6e 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/public/notfound.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/public/notfound.html
@@ -18,7 +18,7 @@
-->
<html>
<head>
-<title>App Edit - Page not found</title>
+<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-translucent"/>
@@ -29,16 +29,22 @@
<body class="delayed">
<div id="menu"></div>
+<h1 id="h1"></h1>
+<br/>
+
+<div class="hd1">Sorry, that page was not found.</div>
+<div>You may have clicked an expired link or mistyped the address.</div>
+
<script type="text/javascript">
// Load the menu bar
-ui.loadwidget('menu', '/menu.html', ui.showbody);
-</script>
+if (!issubdomain(window.location.hostname))
+ ui.loadwidget('menu', '/menu.html', ui.showbody);
-<h1>App Edit</h1>
-<br/>
-<div class="hd1">Sorry, that page was not found.</div>
-<div>You may have clicked an expired link or mistyped the address.</div>
+$('h1').innerHTML = domaintitle(window.location.hostname);
+
+ui.showbody();
+</script>
</body>
</html>
diff --git a/sca-cpp/trunk/modules/edit/htdocs/public/oops.html b/sca-cpp/trunk/modules/edit/htdocs/public/oops.html
index f4f23d2f60..e7e5085db5 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/public/oops.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/public/oops.html
@@ -18,7 +18,7 @@
-->
<html>
<head>
-<title>App Edit - Oops</title>
+<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-translucent"/>
@@ -29,15 +29,21 @@
<body class="delayed">
<div id="menu"></div>
+<h1 id="h1"></h1>
+<br/>
+
+<div class="hd1">Oops, something went wrong...</div>
+
<script type="text/javascript">
// Load the menu bar
-ui.loadwidget('menu', '/menu.html', ui.showbody);
-</script>
+if (!issubdomain(window.location.hostname))
+ ui.loadwidget('menu', '/menu.html', ui.showbody);
-<h1>App Edit</h1>
-<br/>
-<div class="hd1">Oops, something went wrong...</div>
+$('h1').innerHTML = domaintitle(window.location.hostname);
+
+ui.showbody();
+</script>
</body>
</html>
diff --git a/sca-cpp/trunk/modules/edit/htdocs/public/touchicon.png b/sca-cpp/trunk/modules/edit/htdocs/public/touchicon.png
new file mode 100644
index 0000000000..f22c33d2a0
--- /dev/null
+++ b/sca-cpp/trunk/modules/edit/htdocs/public/touchicon.png
Binary files differ
diff --git a/sca-cpp/trunk/modules/edit/htdocs/public/touchicon.xcf b/sca-cpp/trunk/modules/edit/htdocs/public/touchicon.xcf
new file mode 100644
index 0000000000..fc713b478b
--- /dev/null
+++ b/sca-cpp/trunk/modules/edit/htdocs/public/touchicon.xcf
Binary files differ
diff --git a/sca-cpp/trunk/modules/edit/htdocs/robots.txt b/sca-cpp/trunk/modules/edit/htdocs/robots.txt
new file mode 100644
index 0000000000..1f53798bb4
--- /dev/null
+++ b/sca-cpp/trunk/modules/edit/htdocs/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow: /
diff --git a/sca-cpp/trunk/modules/edit/htdocs/store/index.html b/sca-cpp/trunk/modules/edit/htdocs/store/index.html
index f425c0117a..849600d84e 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/store/index.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/store/index.html
@@ -22,6 +22,7 @@
<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-translucent"/>
+<link rel="apple-touch-icon" href="/public/touchicon.png"/>
<link rel="stylesheet" type="text/css" href="/ui.css"/>
<script type="text/javascript" src="/util.js"></script>
<script type="text/javascript" src="/ui.js"></script>
@@ -29,24 +30,30 @@
<body class="delayed">
<div id="menu"></div>
+<h1 id="h1"></h1>
+<br/>
+
+<div id="store"></div>
+
<script type="text/javascript">
// Load the menu bar
ui.loadwidget('menu', '/menu.html', ui.showbody);
-</script>
-<h1>App Edit</h1>
-<br/>
+$('h1').innerHTML = domaintitle(window.location.hostname);
-<div id="store"></div>
-
-<script type="text/javascript">
+// Get the store category
+var category = ui.queryParams()['category'];
+if (isNil(category))
+ category = 'new';
// Load the store
$('store').innerHTML =
- '<iframe id="storeFrame" style="height: 5000px; width: 100%; border: 0px;" scrolling="no" frameborder="0" src="store.html"></iframe>';
+ '<iframe id="storeFrame" style="height: 5000px; width: 100%; border: 0px;" scrolling="no" frameborder="0" src="store.html?category=' + category + '"></iframe>';
+ui.showbody();
</script>
+
</body>
</html>
diff --git a/sca-cpp/trunk/modules/edit/htdocs/store/store.html b/sca-cpp/trunk/modules/edit/htdocs/store/store.html
index d8b0f44e01..79717a01ef 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/store/store.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/store/store.html
@@ -27,15 +27,11 @@
<script type="text/javascript" src="/ui.js"></script>
<script type="text/javascript" src="/component.js"></script>
</head>
-<body>
+<body class="delayed">
<div id="bodydiv" style="position: absolute; top: 0px; left: 0px; right: 0px;">
-<table style="width: 100%;">
-<tr>
-<th class="thl thr" style="padding-top: 4px; padding-bottom: 4px;">Cool Apps</th>
-</tr>
-</table>
+<div id="catmenu"></div>
<div id="apps"></div>
<br/>
@@ -43,7 +39,39 @@
<script type="text/javascript">
if (ui.isIE()) $('bodydiv').style.right = -20;
-// Init service references
+/**
+ * The current app category.
+ */
+var category = ui.queryParams()['category'];
+if (isNil(category))
+ category = 'new';
+
+/**
+ * Build store menu bar
+ */
+function catmenu() {
+ function catmenuitem(name, cat) {
+ var c = cat == category? "smenu" : "amenu";
+ return '<th class="thl thr" style="width: 30px; padding-top: 4px; padding-bottom: 4px; padding-right: 10px;">'
+ + '<a href="/store/?category=' + cat + '" target="_parent"><span class="' + c + '">' + name + '</span></a></th>';
+ }
+
+ var m = '<table style="width: 100%;"><tr>';
+ m += catmenuitem('New Apps', 'new');
+ m += catmenuitem('Top Charts', 'top');
+ m += catmenuitem('Featured', 'featured');
+ m += catmenuitem('Services', 'services');
+ m += catmenuitem('Tests', 'tests');
+ m += '<th class="thl thr" style="width: 100%;"></th></tr></table>';
+ return m;
+}
+
+// Build store menu bar
+$('catmenu').innerHTML = catmenu();
+
+/**
+ * Service references.
+ */
var editWidget = sca.component("EditWidget");
var store = sca.reference(editWidget, "store");
@@ -56,14 +84,14 @@ function applink(appname) {
var port = ':' + window.location.port;
if (port == ':80' || port == ':443' || port == ':')
port = '';
- var link = protocol + '//' + appname + '.' + host + port + '/index.html';
+ var link = protocol + '//' + appname + '.' + host + port + '/';
return link;
}
/**
* Get and display list of apps.
*/
-function getapps(sync) {
+function getapps(category, sync) {
function display(doc) {
var apps = '<div>';
var feed = car(elementsToValues(atom.readATOMFeed(mklist(doc))));
@@ -73,7 +101,7 @@ function getapps(sync) {
title = cadr(assoc("'title", entry))
name = cadr(assoc("'id", entry))
author = 'joe@localhost';
- hreflink = '<a href=\"' + applink(name) + '\" target=\"_parent\">';
+ hreflink = '<a href=\"' + applink(name) + '\" target=\"' + name + '\">';
apps += '<div class="box" style="width: 250px; display: inline-block; border: 1px; border-style: solid; border-color: #dcdcdc; border-collapse: collapse; margin: 5px; padding: 10px; vertical-align: top;">'
apps += '<table><tr>';
@@ -92,19 +120,22 @@ function getapps(sync) {
}
apps += '</div>';
$('apps').innerHTML = apps;
+
+ // Show the page
+ ui.showbody();
}
if (sync) {
- display(store.get('coolapps'));
+ display(store.get(category));
} else {
- store.get('coolapps', function(doc) {
+ store.get(category, function(doc) {
display(doc);
});
}
}
// Get and display the list of apps
-getapps(true);
+getapps(category, true);
</script>
</body>
diff --git a/sca-cpp/trunk/modules/edit/mkapplinks b/sca-cpp/trunk/modules/edit/mkapplinks
index 9114210d8c..ac7baf4f17 100755
--- a/sca-cpp/trunk/modules/edit/mkapplinks
+++ b/sca-cpp/trunk/modules/edit/mkapplinks
@@ -38,6 +38,8 @@ for n in `ls apps | awk '{ printf "apps/%s/htdocs\n", $1 }'`; do
ln -s ../../../htdocs/public "$n/public"
ln -s ../../../htdocs/data "$n/data"
ln -s ../../../htdocs/app/index.html "$n/index.html"
+ ln -s ../../../htdocs/robots.txt "$n/robots.txt"
+ ln -s ../../../htdocs/favicon.ico "$n/favicon.ico"
ln -s ../app.html "$n/app.html"
fi
done
diff --git a/sca-cpp/trunk/modules/http/httpd-conf b/sca-cpp/trunk/modules/http/httpd-conf
index e32acf2268..46a8fc3cce 100755
--- a/sca-cpp/trunk/modules/http/httpd-conf
+++ b/sca-cpp/trunk/modules/http/httpd-conf
@@ -109,6 +109,10 @@ Require all granted
AuthType None
Require all granted
</Location>
+<Location /robots.txt>
+AuthType None
+Require all granted
+</Location>
# Listen on HTTP port
Listen $listen
diff --git a/sca-cpp/trunk/modules/js/htdocs/component.js b/sca-cpp/trunk/modules/js/htdocs/component.js
index beef9357e5..3712ee59cb 100644
--- a/sca-cpp/trunk/modules/js/htdocs/component.js
+++ b/sca-cpp/trunk/modules/js/htdocs/component.js
@@ -407,6 +407,13 @@ HTTPBindingClient.getHTTPRequest = function() {
var sca = {};
/**
+ * Return an HTTP client proxy.
+ */
+sca.httpclient = function(name, uri) {
+ return new HTTPBindingClient(name, uri);
+};
+
+/**
* Return a component proxy.
*/
sca.component = function(name) {
diff --git a/sca-cpp/trunk/modules/js/htdocs/ui.css b/sca-cpp/trunk/modules/js/htdocs/ui.css
index 9b960e95ca..d3089c8ff3 100644
--- a/sca-cpp/trunk/modules/js/htdocs/ui.css
+++ b/sca-cpp/trunk/modules/js/htdocs/ui.css
@@ -20,6 +20,7 @@
body {
white-space: margin: 0px;
font-family: arial,sans-serif; font-style: normal; font-variant: normal; font-size: 13px;
+-webkit-text-size-adjust: none;
}
.delayed {
@@ -81,11 +82,11 @@ padding-left: 2px; padding-top: 2px; padding-right: 8px; white-space: normal; ve
}
.datatdl {
-border-right: 1px; border-top: 1px; border-bottom: 1px; border-style: solid; border-color: #dcdcdc; width: 10px;
+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;
+border-left: 1px; border-top: 1px; border-bottom: 1px; border-style: solid; border-color: #dcdcdc; vertical-align: top;
}
.datatable {
@@ -99,19 +100,26 @@ opacity: .6;
filter: alpha(opacity=60);
}
+iframe {
+border: 0px; margin: 0px; padding: 0px;
+}
+
.widgetframe {
visibility: hidden; width: 0px; height: 0px; border: 0px;
}
.loadedframe {
-width: 100%; height: 100%; border: 0px;
-margin: 0px; padding: 0px;
+width: 100%; height: 100%;
+}
+
+.fakeframe {
+padding: 3px; background-color: #dcdcdc; color: #000000;
}
input {
vertical-align: middle;
font-family: arial,sans-serif; font-style: normal; font-variant: normal; font-size: 13px;
--webkit-text-size-adjust: 140%;
+-webkit-text-size-adjust: 100%;
}
textarea {
diff --git a/sca-cpp/trunk/modules/js/htdocs/ui.js b/sca-cpp/trunk/modules/js/htdocs/ui.js
index db8c439de4..5c1f45e244 100644
--- a/sca-cpp/trunk/modules/js/htdocs/ui.js
+++ b/sca-cpp/trunk/modules/js/htdocs/ui.js
@@ -36,10 +36,11 @@ ui.isIE = function() {
/**
* Build a menu bar.
*/
-ui.menu = function(name, href) {
- function Menu(n, h) {
+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) {
@@ -54,11 +55,11 @@ ui.menu = function(name, href) {
}
if (complete(this.href) != complete(window.top.location.pathname))
- return '<a href="' + this.href + '" target="_parent"><span class=amenu>' + this.name + '</span></a>';
- return '<a href="' + this.href + '" target="_parent"><span class=smenu>' + this.name + '</span></a>';
+ return '<a href="' + this.href + '" target="' + this.target + '"><span class=amenu>' + this.name + '</span></a>';
+ return '<a href="' + this.href + '" target="' + this.target + '"><span class=smenu>' + this.name + '</span></a>';
};
}
- return new Menu(name, href);
+ return new Menu(name, href, target);
};
ui.menubar = function(left, right) {
@@ -295,7 +296,6 @@ ui.csspos = function(p) {
* Convert a list of elements to an HTML table.
*/
ui.datatable = function(l) {
- log('datatable', writeValue(l));
function indent(i) {
if (i == 0)
@@ -308,22 +308,29 @@ ui.datatable = function(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">' + v + '</td></tr>' +
+ '<td class="datatdr tdw">' + 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">' + '</td></tr>' +
+ '<td class="datatdr tdw">' + '</td></tr>' +
rows(elementChildren(e), i + 1) +
rows(cdr(l), i);
}
diff --git a/sca-cpp/trunk/modules/js/htdocs/uicyan.css b/sca-cpp/trunk/modules/js/htdocs/uicyan.css
index 9b960e95ca..d3089c8ff3 100644
--- a/sca-cpp/trunk/modules/js/htdocs/uicyan.css
+++ b/sca-cpp/trunk/modules/js/htdocs/uicyan.css
@@ -20,6 +20,7 @@
body {
white-space: margin: 0px;
font-family: arial,sans-serif; font-style: normal; font-variant: normal; font-size: 13px;
+-webkit-text-size-adjust: none;
}
.delayed {
@@ -81,11 +82,11 @@ padding-left: 2px; padding-top: 2px; padding-right: 8px; white-space: normal; ve
}
.datatdl {
-border-right: 1px; border-top: 1px; border-bottom: 1px; border-style: solid; border-color: #dcdcdc; width: 10px;
+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;
+border-left: 1px; border-top: 1px; border-bottom: 1px; border-style: solid; border-color: #dcdcdc; vertical-align: top;
}
.datatable {
@@ -99,19 +100,26 @@ opacity: .6;
filter: alpha(opacity=60);
}
+iframe {
+border: 0px; margin: 0px; padding: 0px;
+}
+
.widgetframe {
visibility: hidden; width: 0px; height: 0px; border: 0px;
}
.loadedframe {
-width: 100%; height: 100%; border: 0px;
-margin: 0px; padding: 0px;
+width: 100%; height: 100%;
+}
+
+.fakeframe {
+padding: 3px; background-color: #dcdcdc; color: #000000;
}
input {
vertical-align: middle;
font-family: arial,sans-serif; font-style: normal; font-variant: normal; font-size: 13px;
--webkit-text-size-adjust: 140%;
+-webkit-text-size-adjust: 100%;
}
textarea {
diff --git a/sca-cpp/trunk/modules/js/htdocs/util.js b/sca-cpp/trunk/modules/js/htdocs/util.js
index 5697ad27d4..3719a9cecc 100644
--- a/sca-cpp/trunk/modules/js/htdocs/util.js
+++ b/sca-cpp/trunk/modules/js/htdocs/util.js
@@ -286,6 +286,43 @@ function properties(o) {
}
/**
+ * Convert a host name to a domain name.
+ */
+function domainname(host) {
+ var h = reverse(host.split('.'));
+ return reverse(mklist(car(h), cadr(h))).join('.');
+}
+
+/**
+ * Return true if a host name is a subdomain.
+ */
+function issubdomain(host) {
+ return host.split('.').length > 2;
+}
+
+/**
+ * Convert a host name to a domain name title.
+ */
+function domaintitle(host) {
+ 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.
+ */
+function format() {
+ var i = 0;
+ var s = '';
+ for (a in arguments) {
+ s = i == 0? arguments[a] : s.replace('{' + a + '}', arguments[a]);
+ i++;
+ }
+ return s;
+}
+
+/**
* Functions with side effects. Use with moderation.
*/