@@ -42,51 +42,53 @@ Elm.init = function(module, baseNode) {
4242 // object. This permits many Elm programs to be embedded per document.
4343 var elm = {notify: notify, node: baseNode, id: ElmRuntime.guid(), inputs: inputs};
4444
45− // If graphics are enabled, set up the `main` value in baseNode.
46− if (baseNode !== null) {
47− var Render = ElmRuntime.use(ElmRuntime.Render.Element);
45+ // Set up methods to communicate with Elm program from JS.
46+ function send(name, value) {
47+ var e = document.createEvent('Event');
48+ e.initEvent(name + '_' + elm.id, true, true);
49+ e.value = value;
50+ document.dispatchEvent(e);
51+ }
52+ function recv(name, handler) {
53+ document.addEventListener(name + '_' + elm.id, handler);
54+ }
4855
49− // evaluate the given module and extract its 'main' value.
50− signalGraph = module(elm).main;
56+ // If graphics are not enabled, escape early, skip over setting up DOM stuff.
57+ if (baseNode === null) return { send : send, recv : recv };
5158
52− // make sure the signal graph is actually a signal, extract the visual model,
53− // and filter out any unused inputs.
54− var Signal = Elm.Signal(elm);
55− if (!('recv' in signalGraph)) signalGraph = Signal.constant(signalGraph);
56− visualModel = signalGraph.value;
57− inputs = ElmRuntime.filterDeadInputs(inputs);
5859
59− // Add the visualModel to the DOM
60− baseNode.appendChild(Render.render(visualModel));
60+ var Render = ElmRuntime.use(ElmRuntime.Render.Element);
6161
62− if ('Window' in elm) {
62+ // evaluate the given module and extract its 'main' value.
63+ signalGraph = module(elm).main;
64+
65+ // make sure the signal graph is actually a signal, extract the visual model,
66+ // and filter out any unused inputs.
67+ var Signal = Elm.Signal(elm);
68+ if (!('recv' in signalGraph)) signalGraph = Signal.constant(signalGraph);
69+ visualModel = signalGraph.value;
70+ inputs = ElmRuntime.filterDeadInputs(inputs);
71+
72+ // Add the visualModel to the DOM
73+ baseNode.appendChild(Render.render(visualModel));
74+
75+ if ('Window' in elm) {
6376 var w = baseNode.clientWidth;
6477 if (w !== elm.Window.dimensions.value._0) {
6578 notify(elm.Window.dimensions.id,
6679 Elm.Native.Utils(elm).Tuple2(w, baseNode.clientHeight));
6780 }
68− }
81+ }
6982
70− // set up updates so that the DOM is adjusted as necessary.
71− var update = Render.update;
72− function domUpdate(value) {
83+ // set up updates so that the DOM is adjusted as necessary.
84+ var update = Render.update;
85+ function domUpdate(value) {
7386 update(baseNode.firstChild, visualModel, value);
7487 visualModel = value;
7588 return value;
76− }
77−
78− signalGraph = A2(Signal.lift, domUpdate, signalGraph);
79− }
80−
81− function send(name, value) {
82− var e = document.createEvent('Event');
83− e.initEvent(name + '_' + elm.id, true, true);
84− e.value = value;
85− document.dispatchEvent(e);
8689 }
87− function recv(name, handler) {
88− document.addEventListener(name + '_' + elm.id, handler);
89− }
90−
90+
91+ signalGraph = A2(Signal.lift, domUpdate, signalGraph);
92+
9193 return { send : send, recv : recv };
9294};