summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/modules/edit/htdocs
diff options
context:
space:
mode:
Diffstat (limited to 'sca-cpp/trunk/modules/edit/htdocs')
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/account/index.html45
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/app/index.html279
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/graph/index.html1
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/page/page.js5
-rw-r--r--sca-cpp/trunk/modules/edit/htdocs/store/index.html3
5 files changed, 234 insertions, 99 deletions
diff --git a/sca-cpp/trunk/modules/edit/htdocs/account/index.html b/sca-cpp/trunk/modules/edit/htdocs/account/index.html
index 3a3ddad383..8f23b8c59c 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/account/index.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/account/index.html
@@ -60,6 +60,21 @@
<br/>
<table style="width: 100%;">
<tr>
+<th class="thl thr" style="padding-top: 4px; padding-bottom: 4px; padding-left: 2px; padding-right: 2px; ">Calendar</th>
+</tr>
+</table>
+
+<table>
+<tr><td style="padding-right: 2px;"><input type="text" id="sched1" size="10" placeholder="Schedule" style="width: 80px;"/></td><td><input type="text" id="service1" size="2048" placeholder="Service URL" style="width: 200px;"/></td></tr>
+<tr><td style="padding-right: 2px;"><input type="text" id="sched2" size="10" placeholder="Schedule" style="width: 80px;"/></td><td><input type="text" id="service2" size="2048" placeholder="Service URL" style="width: 200px;"/></td></tr>
+<tr><td style="padding-right: 2px;"><input type="text" id="sched3" size="10" placeholder="Schedule" style="width: 80px;"/></td><td><input type="text" id="service3" size="2048" placeholder="Service URL" style="width: 200px;"/></td></tr>
+<tr><td style="padding-right: 2px;"><input type="text" id="sched4" size="10" placeholder="Schedule" style="width: 80px;"/></td><td><input type="text" id="service4" size="2048" placeholder="Service URL" style="width: 200px;"/></td></tr>
+<tr><td style="padding-right: 2px;"><input type="text" id="sched5" size="10" placeholder="Schedule" style="width: 80px;"/></td><td><input type="text" id="service5" size="2048" placeholder="Service URL" style="width: 200px;"/></td></tr>
+</table>
+<br/>
+
+<table style="width: 100%;">
+<tr>
<th class="thl thr" style="padding-top: 4px; padding-bottom: 4px; padding-left: 2px; padding-right: 2px; ">Key chain</th>
</tr>
</table>
@@ -70,6 +85,11 @@
<tr><td style="padding-right: 2px;"><input type="text" id="name3" size="10" placeholder="Key name" style="width: 80px;"/></td><td><input type="text" id="value3" size="2048" placeholder="Key value" style="width: 200px;"/></td></tr>
<tr><td style="padding-right: 2px;"><input type="text" id="name4" size="10" placeholder="Key name" style="width: 80px;"/></td><td><input type="text" id="value4" size="2048" placeholder="Key value" style="width: 200px;"/></td></tr>
<tr><td style="padding-right: 2px;"><input type="text" id="name5" size="10" placeholder="Key name" style="width: 80px;"/></td><td><input type="text" id="value5" size="2048" placeholder="Key value" style="width: 200px;"/></td></tr>
+<tr><td style="padding-right: 2px;"><input type="text" id="name6" size="10" placeholder="Key name" style="width: 80px;"/></td><td><input type="text" id="value6" size="2048" placeholder="Key value" style="width: 200px;"/></td></tr>
+<tr><td style="padding-right: 2px;"><input type="text" id="name7" size="10" placeholder="Key name" style="width: 80px;"/></td><td><input type="text" id="value7" size="2048" placeholder="Key value" style="width: 200px;"/></td></tr>
+<tr><td style="padding-right: 2px;"><input type="text" id="name8" size="10" placeholder="Key name" style="width: 80px;"/></td><td><input type="text" id="value8" size="2048" placeholder="Key value" style="width: 200px;"/></td></tr>
+<tr><td style="padding-right: 2px;"><input type="text" id="name9" size="10" placeholder="Key name" style="width: 80px;"/></td><td><input type="text" id="value9" size="2048" placeholder="Key value" style="width: 200px;"/></td></tr>
+<tr><td style="padding-right: 2px;"><input type="text" id="name10" size="10" placeholder="Key name" style="width: 80px;"/></td><td><input type="text" id="value10" size="2048" placeholder="Key value" style="width: 200px;"/></td></tr>
</table>
</form>
@@ -115,6 +135,15 @@ function getaccount(name) {
var desc = assoc("'description", acct);
$('userDescription').innerHTML = isNil(desc) || isNil(cdr(desc))? '' : cadr(desc);
+ var cal = assoc("'calendar", acct);
+ reduce(function(i, evt) {
+ var sched = assoc("'@schedule", evt);
+ var svc = assoc("'@service", evt);
+ $('sched' + i).value = isNil(sched)? '' : cadr(sched);
+ $('service' + i).value = isNil(svc)? '' : cadr(svc);
+ return i + 1;
+ }, 1, isNil(cal)? mklist() : cadr(cadr(cal)));
+
var keys = assoc("'keys", acct);
reduce(function(i, key) {
var kn = assoc("'@name", key);
@@ -146,14 +175,19 @@ function save(entryxml) {
function onaccountchange() {
var title = $('userTitle').value;
var desc = $('userDescription').value;
+ var cal = map(function(i) {
+ var sched = $('sched' + i).value;
+ var svc = $('service' + i).value;
+ return mklist("'event", mklist("'@schedule", sched), mklist("'@service", svc));
+ }, range(1, 6));
var keys = map(function(i) {
var kn = $('name' + i).value;
var kv = $('value' + i).value;
return mklist("'key", mklist("'@name", kn), mklist("'@value", kv));
- }, range(1, 6));
+ }, range(1, 11));
var accountentry = mklist("'entry", mklist("'title", title != ''? title : username), mklist("'id", username),
- mklist("'content", mklist("'account", mklist("'description", desc), cons("'keys", keys))));
+ mklist("'content", mklist("'account", mklist("'description", desc), cons("'keys", keys), cons("'calendar", cal))));
var entryxml = car(atom.writeATOMEntry(valuesToElements(mklist(accountentry))));
if (savedaccountentryxml == entryxml)
return false;
@@ -165,10 +199,15 @@ function onaccountchange() {
$('userTitle').onchange = onaccountchange;
$('userDescription').onchange = onaccountchange;
map(function(i) {
+ $('sched' + i).onchange = onaccountchange;
+ $('service' + i).onchange = onaccountchange;
+ return true;
+}, range(1, 6));
+map(function(i) {
$('name' + i).onchange = onaccountchange;
$('value' + i).onchange = onaccountchange;
return true;
-}, range(1, 6));
+}, range(1, 11));
/**
* Handle a form submit event.
diff --git a/sca-cpp/trunk/modules/edit/htdocs/app/index.html b/sca-cpp/trunk/modules/edit/htdocs/app/index.html
index 99a523362f..570d1e00f1 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/app/index.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/app/index.html
@@ -50,17 +50,19 @@ document.title = window.location.hostname.split('.')[0];
var appdiv = $('app');
/**
- * Start, stop, timer and location components.
+ * Start, stop, timer, animation and location components.
*/
var startcomp = sca.httpclient('start', '/start');
var stopcomp = sca.httpclient('stop', '/stop');
var timercomp = sca.httpclient('timer', '/timer');
+var animationcomp = sca.httpclient('animation', '/animation');
var locationcomp = sca.httpclient('location', '/location');
/**
- * Find a named value in a tree of elements.
+ * Find a named value in a tree of elements. The value name is given
+ * as a list of ids.
*/
-function datavalue(l, id) {
+function namedvalue(l, id) {
if (isNil(l))
return null;
var e = car(l);
@@ -74,7 +76,7 @@ function datavalue(l, id) {
// Search for next id segments in child elements
if (!elementHasValue(e)) {
- var v = datavalue(elementChildren(e), cdr(id));
+ var v = namedvalue(elementChildren(e), cdr(id));
if (v != null)
return v;
}
@@ -82,11 +84,11 @@ function datavalue(l, id) {
// Search for id through the whole element tree
if (!elementHasValue(e)) {
- var v = datavalue(elementChildren(e), id);
+ var v = namedvalue(elementChildren(e), id);
if (v != null)
return v;
}
- return datavalue(cdr(l), id);
+ return namedvalue(cdr(l), id);
}
/**
@@ -111,84 +113,101 @@ function inputvalue(e) {
};
/**
- * Set a data value into a widget.
+ * Set a value into a widget.
*/
function setwidgetvalue(e, dv) {
-
- function datatext(dv) {
- if (!elementHasValue(dv))
- return '';
- var t = elementValue(dv);
- return t == null? '' : t;
- }
+ var htattrs = namedElementChild("'htattrs", dv);
+ var attrs = append(isNil(htattrs)? mklist() :
+ map(function(ce) { return mklist(elementName(ce).substring(1), elementHasValue(ce)? elementValue(ce) : elementChildren(ce)); }, elementChildren(htattrs)),
+ elementHasValue(dv)? mklist(mklist('value', isNil(elementValue(dv))? '' : elementValue(dv))) : mklist());
if (e.className == 'h1' || e.className == 'h2' || e.className == 'text' || e.className == 'section') {
- var t = datatext(dv);
- car(childElements(e)).innerHTML = t;
- return t;
+ var ce = car(childElements(e));
+ return map(function(a) { car(a) == 'value'? ce.innerHTML = cadr(a) : ce.setAttribute(car(a), cadr(a)); }, attrs);
}
+
if (e.className == 'entry' || e.className == 'password') {
- var t = datatext(dv);
- car(childElements(e)).defaultValue = t;
- return t;
+ var ce = car(childElements(e));
+ return map(function(a) { car(a) == 'value'? ce.defaultValue = cadr(a) : ce.setAttribute(car(a), cadr(a)); }, attrs);
}
+
if (e.className == 'button') {
- var t = datatext(dv);
- car(childElements(e)).value = t;
- return t;
+ var ce = car(childElements(e));
+ return map(function(a) { car(a) == 'value'? ce.value = cadr(a) : ce.setAttribute(car(a), cadr(a)); }, attrs);
}
+
if (e.className == 'checkbox') {
- var t = datatext(dv);
- car(childElements(e)).value = t;
- map(function(n) { if (n.nodeName == "SPAN") n.innerHTML = t; return n; }, nodeList(e.childNodes));
- return t;
+ var ce = car(childElements(e));
+
+ function setcheckvalue(ce, v) {
+ ce.value = v;
+ map(function(n) { if (n.nodeName == "SPAN") n.innerHTML = v; return n; }, nodeList(e.childNodes));
+ return true;
+ }
+
+ var r = map(function(a) { car(a) == 'value'? setcheckvalue(ce, cadr(a)) : ce.setAttribute(car(a), cadr(a)); }, attrs);
+ return r;
}
+
if (e.className == 'select') {
- var t = datatext(dv);
var ce = car(childElements(car(childElements(e))));
- ce.value = t;
- ce.innerHTML = t;
- return t;
+
+ function setselectvalue(ce, v) {
+ ce.value = v;
+ ce.innerHTML = v;
+ return true;
+ }
+
+ var r = map(function(a) { car(a) == 'value'? setselectvalue(ce, cadr(a)) : ce.setAttribute(car(a), cadr(a)); }, attrs);
+ return r;
}
if (e.className == 'list') {
- var t = ui.datalist(isNil(dv)? mklist() : mklist(dv));
- e.innerHTML = t;
- return t;
+ var dl = ui.datalist(isNil(dv)? mklist() : mklist(dv));
+ e.innerHTML = dl;
+ return dl;
}
if (e.className == 'table') {
- var t = ui.datatable(isNil(dv)? mklist() : mklist(dv));
- e.innerHTML = t;
- return t;
+ var dl = ui.datatable(isNil(dv)? mklist() : mklist(dv));
+ e.innerHTML = dl;
+ return dl;
}
if (e.className == 'link') {
- var t = datatext(dv);
var ce = car(childElements(e));
- ce.href = isList(t)? car(t) : t;
- car(childElements(ce)).innerHTML = isList(t)? cadr(t) : t;
- return t;
+
+ function setlinkvalue(ce, v) {
+ if (isList(v)) {
+ ce.href = car(v);
+ ce.innerHTML = cadr(v);
+ return true;
+ }
+ ce.href = v;
+ ce.innerHTML = v;
+ return true;
+ }
+
+ return map(function(a) { car(a) == 'value'? setlinkvalue(ce, cadr(a)) : ce.setAttribute(car(a), cadr(a)); }, attrs);
}
if (e.className == 'img') {
- var t = datatext(dv);
- var img = car(childElements(e));
- img.setAttribute('src', t);
- return t;
+ var ce = car(childElements(e));
+ return map(function(a) { car(a) == 'value'? ce.setAttribute('src', cadr(a)) : ce.setAttribute(car(a), cadr(a)); }, attrs);
}
if (e.className == 'iframe') {
- var t = datatext(dv);
- car(childElements(e)).src = t;
- return t;
+ var ce = car(childElements(e));
+ return map(function(a) { car(a) == 'value'? ce.setAttribute('src', cadr(a)) : ce.setAttribute(car(a), cadr(a)); }, attrs);
}
return '';
};
/**
- * Display data on the app page.
+ * Update the app page with the given app data.
*/
-function displaydata(l) {
+function updatepage(l) {
+ if (isNil(l))
+ return true;
// Update the widgets values
function updatewidget(e) {
- var dv = datavalue(l, map(function(t) { return "'" + t; }, e.id.split('.')));
+ var dv = namedvalue(l, map(function(t) { return "'" + t; }, e.id.split('.')));
if (dv == null || isNil(dv))
return e;
setwidgetvalue(e, dv);
@@ -200,22 +219,22 @@ function displaydata(l) {
}
/**
- * Display data from a document on the app page.
+ * Convert a document to application data.
*/
-function displaydoc(doc) {
+function docdata(doc) {
if (isNil(doc))
- return true;
+ return null;
if (json.isJSON(mklist(doc)))
- return displaydata(json.readJSON(mklist(doc)));
+ return json.readJSON(mklist(doc));
if (atom.isATOMEntry(mklist(doc)))
- return displaydata(atom.readATOMEntry(mklist(doc)));
+ return atom.readATOMEntry(mklist(doc));
if (atom.isATOMFeed(mklist(doc)))
- return displaydata(atom.readATOMFeed(mklist(doc)));
+ return atom.readATOMFeed(mklist(doc));
- return displaydata(doc);
+ return doc;
}
/**
@@ -278,6 +297,18 @@ function initwidget(e) {
}
/**
+ * Get document from a component.
+ */
+function getdoc(comp, name, uri) {
+ try {
+ return comp.get(uri);
+ } catch(e) {
+ log('exception on get(' + name + ', ' + uri + ')', e);
+ return null;
+ }
+}
+
+/**
* Get app data from the main app page component.
*/
function getpagedata() {
@@ -285,8 +316,7 @@ function getpagedata() {
// Display component data on the page
function displaypage(doc) {
- if (!isNil(doc))
- displaydoc(doc);
+ updatepage(docdata(doc));
// Reveal the page
ui.showbody();
@@ -312,42 +342,35 @@ function getpagedata() {
}
// Get the component app data
- var doc = startcomp.get(window.location.search);
- try {
- var appFrame = $('appFrame');
- if (!isNil(appFrame.contentDocument.body)) {
- appdiv.innerHTML = appFrame.contentDocument.body.innerHTML;
- } else {
- $('appebuffer').appendChild(appFrame.contentDocument.documentElement);
- appdiv.innerHTML = appebuffer.innerHTML;
- appebuffer.innerHTML = '';
- }
+ var doc = getdoc(startcomp, 'start', window.location.search);
+
+ // Prepare app HTML page
+ var appFrame = $('appFrame');
+ if (!isNil(appFrame.contentDocument.body)) {
+ appdiv.innerHTML = appFrame.contentDocument.body.innerHTML;
+ } else {
+ $('appebuffer').appendChild(appFrame.contentDocument.documentElement);
+ appdiv.innerHTML = appebuffer.innerHTML;
+ appebuffer.innerHTML = '';
+ }
- // Initial setup of the widgets
- map(setupwidget, filter(function(e) { return !isNil(e.id); }, nodeList(ui.elementByID(appdiv, 'page').childNodes)));
+ // Setup the widgets
+ map(setupwidget, filter(function(e) { return !isNil(e.id); }, nodeList(ui.elementByID(appdiv, 'page').childNodes)));
- // Display data on the page
- displaypage(doc);
+ // Display data on the page
+ displaypage(doc);
- // Get and eval the optional timer and location watch setup scripts
- evalcompinit(timercomp.get('setup'));
- evalcompinit(locationcomp.get('setup'));
- return true;
+ // Get and eval the optional timer, animation and location watch setup scripts
+ evalcompinit(getdoc(timercomp, 'timer', 'setup'));
+ evalcompinit(getdoc(animationcomp, 'animation', 'setup'));
+ evalcompinit(getdoc(locationcomp, 'location', 'setup'));
+
+ return true;
- } catch(e) {
- log('exception on startcomp.get()', e);
- }
} catch(e) {
log('exception in getpagedata()', e);
+ return true;
}
- return true;
-}
-
-/**
- * Get app data from a component.
- */
-function getcompdata(comp, qs) {
- return displaydoc(comp.get(qs));
}
/**
@@ -380,9 +403,10 @@ function compquery() {
*/
function buttonClickHandler(id) {
try {
- return getcompdata(sca.component(id), compquery());
+ return updatepage(docdata(getdoc(sca.component(id), 'button', compquery())));
} catch(e) {
log('exception in buttonClickHandler()', e);
+ return true;
}
}
@@ -391,9 +415,10 @@ function buttonClickHandler(id) {
*/
function intervalHandler() {
try {
- return getcompdata(timercomp, compquery());
+ return updatepage(docdata(getdoc(timercomp, 'timer', compquery())));
} catch(e) {
log('exception in intervalHandler()', e);
+ return true;
}
}
@@ -406,6 +431,76 @@ function setupIntervalHandler(msec) {
return setInterval(intervalHandler, msec);
} catch(e) {
log('exception in setupIntervalHandler()', e);
+ return true;
+ }
+}
+
+/**
+ * Handle an animation event.
+ */
+var animationData = null;
+var currentAnimationData = null;
+var animationLoop = 0;
+var currentAnimationLoop = 0;
+
+function animationHandler() {
+ try {
+ // Get animation data if necessary
+ if (isNil(animationData)) {
+ animationData = docdata(getdoc(animationcomp, 'animation', compquery()));
+ if (isNil(animationData)) {
+ // Retry later
+ return true;
+ }
+ currentAnimationData = animationData;
+ currentAnimationLoop = animationLoop;
+ }
+
+ // Update page with animation data
+ updatepage(car(currentAnimationData));
+
+ // End of animation?
+ if (isNil(cdr(currentAnimationData))) {
+ if (currentAnimationLoop == -1) {
+ // Repeat current animation forever
+ currentAnimationData = animationData;
+ return true;
+ }
+
+ currentAnimationLoop = currentAnimationLoop - 1;
+ if (currentAnimationLoop <= 0) {
+ // Get next animation data
+ currentAnimationData = null;
+ animationData = null;
+ return true;
+ }
+
+ // Repeat animation
+ currentAnimationData = animationData;
+ return true;
+ }
+
+ // Move to the next animation frame
+ currentAnimationData = cdr(currentAnimationData);
+ return true;
+
+ } catch(e) {
+ log('exception in animationHandler()', e);
+ return true;
+ }
+}
+
+/**
+ * Setup an animation.
+ */
+function setupAnimationHandler(msec, loop) {
+ animationLoop = loop;
+ animationHandler();
+ try {
+ return setInterval(animationHandler, msec);
+ } catch(e) {
+ log('exception in setupAnimationHandler()', e);
+ return true;
}
}
@@ -418,7 +513,7 @@ var geoposition = null;
function locationHandler(pos) {
try {
geoposition = pos;
- return getcompdata(locationcomp, compquery());
+ return updatepage(docdata(getdoc(locationcomp, 'location', compquery())));
} catch(e) {
locationErrorHandler(e);
}
diff --git a/sca-cpp/trunk/modules/edit/htdocs/graph/index.html b/sca-cpp/trunk/modules/edit/htdocs/graph/index.html
index 626edf1c52..b8370ec75a 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/graph/index.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/graph/index.html
@@ -384,6 +384,7 @@ installpalette('lists', pos.rmove(0, 35), g, bg, spalette, gpalettes);
installpalette('transform', pos.rmove(0, 35), g, bg, spalette, gpalettes);
installpalette('text', pos.rmove(0, 35), g, bg, spalette, gpalettes);
installpalette('http', pos.rmove(0, 35), g, bg, spalette, gpalettes);
+installpalette('animation', pos.rmove(0, 35), g, bg, spalette, gpalettes);
installpalette('talk', pos.rmove(0, 35), g, bg, spalette, gpalettes);
installpalette('social', pos.rmove(0, 35), g, bg, spalette, gpalettes);
installpalette('search', pos.rmove(0, 35), g, bg, spalette, gpalettes);
diff --git a/sca-cpp/trunk/modules/edit/htdocs/page/page.js b/sca-cpp/trunk/modules/edit/htdocs/page/page.js
index 707788cc64..d316cb72dd 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/page/page.js
+++ b/sca-cpp/trunk/modules/edit/htdocs/page/page.js
@@ -428,9 +428,8 @@ page.widgetselect = function(n, s, wvalue, wdelete) {
// Clear the widget outline
if (!isNil(n))
n.cover.style.borderWidth = '0px';
- }
- if (isNil(n))
return true;
+ }
// Update the widget value field
wvalue.value = page.text(n);
@@ -438,7 +437,7 @@ page.widgetselect = function(n, s, wvalue, wdelete) {
wdelete.disabled = false;
// Outline the widget
- n.cover.style.borderWidth = s? '2px' : '0px';
+ n.cover.style.borderWidth = '2px';
return true;
};
diff --git a/sca-cpp/trunk/modules/edit/htdocs/store/index.html b/sca-cpp/trunk/modules/edit/htdocs/store/index.html
index 1d96781801..601a5905b9 100644
--- a/sca-cpp/trunk/modules/edit/htdocs/store/index.html
+++ b/sca-cpp/trunk/modules/edit/htdocs/store/index.html
@@ -139,7 +139,8 @@ function getapps(category) {
function display(doc) {
var apps = '<div>';
var feed = car(elementsToValues(atom.readATOMFeed(mklist(doc))));
- var entries = cadr(assoc("'entry", cdr(feed)));
+ var aentries = assoc("'entry", cdr(feed));
+ var entries = isNil(aentries)? mklist() : isList(car(cadr(aentries)))? cadr(aentries) : mklist(cdr(aentries));
for (var i = 0; i < length(entries); i++) {
var entry = entries[i];
var title = cadr(assoc("'title", entry))