Comparing versions 16 and 17.
AtomicConstructor
Dynamically constructs an infotron from a javascript blueprint. It can also destruct the constructed infotron.
Sample Declaration
<div id="atomic_konstructor"
impl="~01A13E7DA4AC6944339D713FA5A32773A6"
script="http://localhost/AtomicConstructor.js">
</div>
## Input Terminals
+ request\_in: (expected message type: array - i.e. [request\_id, op_code, blueprint\_uuid, property\_value\_map])
## Output Terminals
+ response\_out: (message type: array - i.e. [request\_id, op\_code, id, input\_terminals, output\_terminals ])
## Properties
* N/A
## Demos that use it
+
/*
Atomic JavaScript Constructor
[id, infotron_id, iterms, oterms]
Seung Chan Lim ( slim@maya.com )
*/
BLUEPRINT(
"~01A13E7DA4AC6944339D713FA5A32773A6",
[
["request_in", "onRequest", -1]
],
[
"response_out"
],
function(props)
{
var Blueprint = function(id, props, bp_uuid)
{
var self = this;
this.__init__(id, bp_uuid);
this._uid = 0;
this._HANDLER = {"construct" : this._construct,
"destruct" : this._destruct};
this._ids = {};
function _onBpLoad(bp)
{
var i, n, ids, id, bp_iterms;
var iterms = [];
self.info(bp.uuid + " got loaded!");
ids = self._ids[bp.uuid];
if (ids) {
bp_iterms = bp.iterms;
iterms = self._flattenIterms(bp.iterms);
n = ids.length;
for (i = 0; i < n; i ++) {
id = ids[i];
self.postMessage("response_out", [id[0], "construct", id[1], iterms, bp.oterms]);
}
}
}
__star.addEventListener("afterbpload", _onBpLoad);
};
Blueprint.prototype = new Infotron;
Blueprint.prototype._flattenIterms = function(iterms)
{
var i, n;
var l = [];
n = iterms.length;
for (i =0; i < n; i ++) {
l.push(iterms[i][0]);
}
return l;
}
Blueprint.prototype._construct = function(req_id, bp, iprops, xprops)
{
var i, n, e, o, arr, cbs;
var d = this.dom_node.ownerDocument || __d;
o = d.createElement("DIV");
if (xprops) {
o.className = xprops["css_prefix"] || "";
if (xprops["id"]) {
o.id = xprops["id"];
}
}
if (!o.id) {
o.id = this.dom_node.id + "_" + new String(this._uid) + "_" +
new String((new Date()).valueOf()) ;
}
this._uid += 1;
o.setAttribute("impl", bp);
this.dom_node.parentNode.appendChild(o);
arr = __star.addInfotron(o.id, bp, iprops);
if (!arr) {
if (!this._ids[bp]) {
this._ids[bp] = [];
}
this._ids[bp].push([req_id, o.id]);
// here onMissingImpl is called immediately before waiting for a
// message to arrive
__star.dispatchEvent({type:"bpmiss", context:[o.id, bp]});
} else {
// send out the available input and output terminals
return [req_id, "construct", o.id, this._flattenIterms(arr[0]), arr[1]];
/*****************************************************************/
}
}
Blueprint.prototype._destruct = function(req_id, id)
{
this.info("destroying " + id);
__star.removeInfotron(id, 1);
return [req_id, "destruct", id];
}
Blueprint.prototype.onRequest = function(msg)
{
var resp, id;
id = msg[0];
op = msg[1];
args = msg[2];
try {
resp = this._HANDLER[op].apply(this, ([id]).concat(args));
} catch (ex) {
this.error(ex, "Error handling " + op);
}
if (resp != undefined) {
this.postMessage("response_out", resp);
}
};
return Blueprint;
},
"Atomic Constructor")