on master help sign in
Add support for links and DOM nodes. Fix lots of bugs.
38d0e8fevancz
core-js/Graphics/Collage.js+5−4
@@ -105,7 +105,7 @@ function renderForm(redo,ctx,theta,scale,x,y,form) {
105 ctx.save();
105 ctx.save();
106 if (x !== 0 || y !== 0) ctx.translate(x,y);
106 if (x !== 0 || y !== 0) ctx.translate(x,y);
107 if (theta !== ~~theta) ctx.rotate(2*Math.PI*theta);
107 if (theta !== ~~theta) ctx.rotate(2*Math.PI*theta);
108− if (scale !== 1) ctx.scale(scale);
108+ if (scale !== 1) ctx.scale(scale,scale);
109 ctx.beginPath();
109 ctx.beginPath();
110 switch(form[0]) {
110 switch(form[0]) {
111 case "FLine": drawLine(ctx,form); break;
111 case "FLine": drawLine(ctx,form); break;
@@ -127,6 +127,7 @@ function collageForms(w,h,forms) {
127 var canvas = Render.newElement('canvas');
127 var canvas = Render.newElement('canvas');
128 canvas.style.width = (~~w) + 'px';
128 canvas.style.width = (~~w) + 'px';
129 canvas.style.height = (~~h) + 'px';
129 canvas.style.height = (~~h) + 'px';
130+ canvas.style.display = "block";
130 canvas.width = ~~w;
131 canvas.width = ~~w;
131 canvas.height = ~~h;
132 canvas.height = ~~h;
132 if (canvas.getContext) {
133 if (canvas.getContext) {
@@ -137,7 +138,7 @@ function collageForms(w,h,forms) {
137 return canvas;
138 return canvas;
138 }
139 }
139 canvas.innerHTML = "Your browser does not support the canvas element.";
140 canvas.innerHTML = "Your browser does not support the canvas element.";
140− return canvas;
141+ return canvas;
141};
142};
142
143
143function collageElement(w,h,theta,scale,x,y,elem) {
144function collageElement(w,h,theta,scale,x,y,elem) {
@@ -155,6 +156,7 @@ function collageElement(w,h,theta,scale,x,y,elem) {
155 Render.addTo(div,e);
156 Render.addTo(div,e);
156 div.style.width = (~~w) + "px";
157 div.style.width = (~~w) + "px";
157 div.style.height = (~~h) + "px";
158 div.style.height = (~~h) + "px";
159+ div.style.overflow = "hidden";
158 return div;
160 return div;
159}
161}
160
162
@@ -195,9 +197,8 @@ function updateFormSet(node,currSet,nextSet) {
195 return node.parentNode.replaceChild(newNode,node);
197 return node.parentNode.replaceChild(newNode,node);
196}
198}
197
199
200+// assumes that the form sets are the same length.
198function updateCollage(node,currs,nexts) {
201function updateCollage(node,currs,nexts) {
199− if (currs.length !== nexts.length) {
200− return node.parentNode.replaceChild(render(next),node); }
201 if (nexts.length === 1) {
202 if (nexts.length === 1) {
202 return updateFormSet(node,currs[0],nexts[0]);
203 return updateFormSet(node,currs[0],nexts[0]);
203 }
204 }
core-js/Graphics/Element.js+59−115
@@ -41,18 +41,8 @@ ElmCode.Graphics.Element = function() {
41 return["PositionBR", a1, a2]
41 return["PositionBR", a1, a2]
42 }
42 }
43 }
43 }
44− function Element_37(a1) {
44+ function Element_37(id,e,w,h,o,c,l) {
45− return function(a2) {
46− return function(a3) {
47− return function(a4) {
48− return function(a5) {
49− return function(a6) {
50− return["Element", a1, a2, a3, a4, a5, a6]
45+ return["Element", id, e, w, h, o, c, l ]
51− }
52− }
53− }
54− }
55− }
56 }
46 }
57 function EText_39(a1) {
47 function EText_39(a1) {
58 return function(a2) {
48 return function(a2) {
@@ -164,7 +154,8 @@ ElmCode.Graphics.Element = function() {
164 var bottomRightAt_34 = PositionBR_21;
154 var bottomRightAt_34 = PositionBR_21;
165 var absolute_35 = Absolute_12;
155 var absolute_35 = Absolute_12;
166 var relative_36 = Relative_13;
156 var relative_36 = Relative_13;
167− function newElement_38(a) { return Element_37(Guid.guid())(a); }
157+ function newElement_38(e,w,h,o,c,l) { return Element_37(Guid.guid(),e,w,h,o,c,l); }
158+ function basicNewElement(e,w,h) { return Element_37(Guid.guid(),e,w,h,1,Nothing,Nothing); }
168 var line_76 = Line_75;
159 var line_76 = Line_75;
169 var polygon_79 = Shape_78;
160 var polygon_79 = Shape_78;
170 function sprite_96(src) {
161 function sprite_96(src) {
@@ -182,89 +173,50 @@ ElmCode.Graphics.Element = function() {
182 }
173 }
183 }
174 }
184 function width_47(w__101) {
175 function width_47(w__101) {
185− return function(Element$_ewhoc_102) {
176+ return function(e) {
186− return function(case7) {
177+ var be = e[2];
187− var case0 = case7;
188− switch(case0[0]) {
189− case "Element":
190− var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4], case5 = case0[5], case6 = case0[6];
191− return function(case12) {
192− var case8 = case12;
193− switch(case8[0]) {
178+ switch(be[0]) {
194− case "EImage":
179+ case "EImage":
195− case "EVideo":
180+ case "EVideo":
196− return newElement_38(case2)(w__101)(case4 * w__101 / case3)(case5)(case6);
181+ return newElement_38(e[2],w__101,e[4] * w__101 / e[3], e[5], e[6], e[7]);
197− case "EText":
182+ case "EText":
198− var p = Value.getTextSize(w__101,case4,case8[2]);
183+ var p = Value.getTextSize(w__101,e[4],be[2]);
199− return newElement_38(case2)(w__101)(p[1])(case5)(case6);
184+ return newElement_38(e[2], w__101, p[1], e[5], e[6], e[7]);
200− }
185+ }
201− return newElement_38(case2)(w__101)(case4)(case5)(case6)
186+ return newElement_38(e[2], w__101, e[4], e[5], e[6], e[7]);
202− }(case2)
203− }
204− throw"Non-exhaustive pattern match in case";
205− }(Element$_ewhoc_102)
206 }
187 }
207 }
188 }
208 function height_48(h__108) {
189 function height_48(h__108) {
209− return function(Element$_ewhoc_109) {
190+ return function(e) {
210− return function(case7) {
191+ var be = e[2];
211− var case0 = case7;
212− switch(case0[0]) {
213− case "Element":
214− var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4], case5 = case0[5], case6 = case0[6];
215− return function(case12) {
216− var case8 = case12;
217− switch(case8[0]) {
192+ switch(be[0]) {
218− case "EImage":
193+ case "EImage":
219− case "EVideo":
194+ case "EVideo":
220− return newElement_38(case2)(case3 * h__108 / case4)(h__108)(case5)(case6);
195+ return newElement_38(e[2], e[3] * h__108 / e[4], h__108, e[5], e[6], e[7]);
221− }
196+ }
222− return newElement_38(case2)(case3)(h__108)(case5)(case6)
197+ return newElement_38(e[2], e[3], h__108, e[5], e[6], e[7]);
223− }(case2)
224− }
225− throw"Non-exhaustive pattern match in case";
226− }(Element$_ewhoc_109)
227 }
198 }
228 }
199 }
229− function size_49(w__115) {
200+ function size_49(w) {
230− return function(h__116) {
201+ return function(h) {
231− return function(Element$_ewhoc_117) {
202+ return function(e) {
232− return function(case7) {
203+ return newElement_38(e[2], w, h, e[5], e[6], e[7]);
233− var case0 = case7;
234− switch(case0[0]) {
235− case "Element":
236− var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4], case5 = case0[5], case6 = case0[6];
237− return newElement_38(case2)(w__115)(h__116)(case5)(case6)
238− }
239− throw"Non-exhaustive pattern match in case";
240− }(Element$_ewhoc_117)
241 }
204 }
242 }
205 }
243 }
206 }
244− function opacity_50(o__123) {
207+ function opacity_50(o) {
245− return function(Element$_ewhoc_124) {
208+ return function(e) {
246− return function(case7) {
209+ return newElement_38(e[2], e[3], e[4], o, e[6], e[7]);
247− var case0 = case7;
248− switch(case0[0]) {
249− case "Element":
250− var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4], case5 = case0[5], case6 = case0[6];
251− return newElement_38(case2)(case3)(case4)(o__123)(case6)
252− }
253− throw"Non-exhaustive pattern match in case";
254− }(Element$_ewhoc_124)
255 }
210 }
256 }
211 }
257− function color_51(c__130) {
212+ function color_51(c) {
258− return function(Element$_ewhoc_131) {
213+ return function(e) {
259− return function(case7) {
214+ return newElement_38(e[2], e[3], e[4], e[5], Just(c), e[7]);
260− var case0 = case7;
215+ }
261− switch(case0[0]) {
216+ }
262− case "Element":
217+ function link(lnk) {
263− var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4], case5 = case0[5], case6 = case0[6];
218+ return function(e) {
264− return newElement_38(case2)(case3)(case4)(case5)(Just(c__130))
219+ return newElement_38(e[2], e[3], e[4], e[5], e[6], Just(Foreign.JavaScript.castStringToJSString(lnk)));
265− }
266− throw"Non-exhaustive pattern match in case";
267− }(Element$_ewhoc_131)
268 }
220 }
269 }
221 }
270 function widthOf_52(e) { return ~~e[3]; }
222 function widthOf_52(e) { return ~~e[3]; }
@@ -272,48 +224,48 @@ ElmCode.Graphics.Element = function() {
272 function sizeOf_54(e) { return["Tuple2", ~~e[3], ~~e[4]] }
224 function sizeOf_54(e) { return["Tuple2", ~~e[3], ~~e[4]] }
273 function text_56(txt) {
225 function text_56(txt) {
274 var p = Value.getTextSize(-1,-1,txt);
226 var p = Value.getTextSize(-1,-1,txt);
275− return newElement_38(EText_39("left")(txt))(p[0])(p[1])(1)(Nothing)
227+ return basicNewElement(EText_39("left")(txt), p[0], p[1])
276 }
228 }
277 function plainText(str) {
229 function plainText(str) {
278 var txt = Value.toText(str);
230 var txt = Value.toText(str);
279 var p = Value.getTextSize(-1,-1,txt);
231 var p = Value.getTextSize(-1,-1,txt);
280− return newElement_38(EText_39("left")(txt))(p[0])(p[1])(1)(Nothing)
232+ return basicNewElement(EText_39("left")(txt),p[0],p[1])
281 }
233 }
282 function asText(v) {
234 function asText(v) {
283 var txt = Value.show(v);
235 var txt = Value.show(v);
284 var p = Value.getTextSize(-1,-1,txt);
236 var p = Value.getTextSize(-1,-1,txt);
285− return newElement_38(EText_39("left")(txt))(p[0])(p[1])(1)(Nothing)
237+ return basicNewElement(EText_39("left")(txt),p[0],p[1])
286 }
238 }
287 function centeredText(txt) {
239 function centeredText(txt) {
288 var p = Value.getTextSize(-1,-1,txt);
240 var p = Value.getTextSize(-1,-1,txt);
289− return newElement_38(EText_39("center")(txt))(p[0])(p[1])(1)(Nothing)
241+ return basicNewElement(EText_39("center")(txt),p[0],p[1])
290 }
242 }
291 function justifiedText(txt) {
243 function justifiedText(txt) {
292 var p = Value.getTextSize(-1,-1,txt);
244 var p = Value.getTextSize(-1,-1,txt);
293− return newElement_38(EText_39("justify")(txt))(p[0])(p[1])(1)(Nothing)
245+ return basicNewElement(EText_39("justify")(txt),p[0],p[1])
294 }
246 }
295 function rightedText(txt) {
247 function rightedText(txt) {
296 var p = Value.getTextSize(-1,-1,txt);
248 var p = Value.getTextSize(-1,-1,txt);
297− return newElement_38(EText_39("right")(txt))(p[0])(p[1])(1)(Nothing)
249+ return basicNewElement(EText_39("right")(txt),p[0],p[1])
298 }
250 }
299 function image_57(w) {
251 function image_57(w) {
300 return function(h) {
252 return function(h) {
301 return function(src) {
253 return function(src) {
302− return newElement_38(EImage_40(src))(w)(h)(1)(Nothing)
254+ return basicNewElement(EImage_40(src),w,h)
303 }
255 }
304 }
256 }
305 }
257 }
306 function video_58(w) {
258 function video_58(w) {
307 return function(h) {
259 return function(h) {
308 return function(src) {
260 return function(src) {
309− return newElement_38(EVideo_41(src))(w)(h)(1)(Nothing)
261+ return basicNewElement(EVideo_41(src),w,h)
310 }
262 }
311 }
263 }
312 }
264 }
313 function fittedImage_59(w_147) {
265 function fittedImage_59(w_147) {
314 return function(h_148) {
266 return function(h_148) {
315 return function(s_149) {
267 return function(s_149) {
316− return newElement_38(EFittedImage_42(s_149))(w_147)(h_148)(1)(Nothing)
268+ return basicNewElement(EFittedImage_42(s_149),w_147,h_148)
317 }
269 }
318 }
270 }
319 }
271 }
@@ -346,45 +298,45 @@ ElmCode.Graphics.Element = function() {
346 return maximum(hs_155)
298 return maximum(hs_155)
347 }(dir_150)
299 }(dir_150)
348 }();
300 }();
349− return newElement_38(EFlow_43(dir_150)(es_151))(w_152)(h_153)(1)(Nothing)
301+ return basicNewElement(EFlow_43(dir_150)(es_151), w_152, h_153)
350 }()
302 }()
351 }
303 }
352 }
304 }
353 function above_61(e1_156) {
305 function above_61(e1_156) {
354 return function(e2_157) {
306 return function(e2_157) {
355− return newElement_38(EFlow_43(DDown_3)(["Cons", e1_156, ["Cons", e2_157, ["Nil"]]]))(max(widthOf_52(e1_156))(widthOf_52(e2_157)))(heightOf_53(e1_156) + heightOf_53(e2_157))(1)(Nothing)
307+ return basicNewElement(EFlow_43(DDown_3)(["Cons", e1_156, ["Cons", e2_157, ["Nil"]]]), max(widthOf_52(e1_156))(widthOf_52(e2_157)), heightOf_53(e1_156) + heightOf_53(e2_157))
356 }
308 }
357 }
309 }
358 function below_62(e1_158) {
310 function below_62(e1_158) {
359 return function(e2_159) {
311 return function(e2_159) {
360− return newElement_38(EFlow_43(DDown_3)(["Cons", e2_159, ["Cons", e1_158, ["Nil"]]]))(max(widthOf_52(e1_158))(widthOf_52(e2_159)))(heightOf_53(e1_158) + heightOf_53(e2_159))(1)(Nothing)
312+ return basicNewElement(EFlow_43(DDown_3)(["Cons", e2_159, ["Cons", e1_158, ["Nil"]]]), max(widthOf_52(e1_158))(widthOf_52(e2_159)), heightOf_53(e1_158) + heightOf_53(e2_159))
361 }
313 }
362 }
314 }
363 function beside_63(e1_160) {
315 function beside_63(e1_160) {
364 return function(e2_161) {
316 return function(e2_161) {
365− return newElement_38(EFlow_43(DRight_1)(["Cons", e1_160, ["Cons", e2_161, ["Nil"]]]))(widthOf_52(e1_160) + widthOf_52(e2_161))(max(heightOf_53(e1_160))(heightOf_53(e2_161)))(1)(Nothing)
317+ return basicNewElement(EFlow_43(DRight_1)(["Cons", e1_160, ["Cons", e2_161, ["Nil"]]]), widthOf_52(e1_160) + widthOf_52(e2_161), max(heightOf_53(e1_160))(heightOf_53(e2_161)))
366 }
318 }
367 }
319 }
368 function layers_64(es_162) {
320 function layers_64(es_162) {
369− return newElement_38(EFlow_43(DOut_5)(es_162))(maximum(map(widthOf_52)(es_162)))(maximum(map(heightOf_53)(es_162)))(1)(Nothing)
321+ return basicNewElement(EFlow_43(DOut_5)(es_162), maximum(map(widthOf_52)(es_162)), maximum(map(heightOf_53)(es_162)))
370 }
322 }
371 function collage_65(w_163) {
323 function collage_65(w_163) {
372 return function(h_164) {
324 return function(h_164) {
373 return function(forms_165) {
325 return function(forms_165) {
374− return newElement_38(ECollage_44(w_163)(h_164)(forms_165))(w_163)(h_164)(1)(Nothing)
326+ return basicNewElement(ECollage_44(w_163)(h_164)(forms_165),w_163,h_164)
375 }
327 }
376 }
328 }
377 }
329 }
378 function spacer_66(w_166) {
330 function spacer_66(w_166) {
379 return function(h_167) {
331 return function(h_167) {
380− return newElement_38(EEmpty_45)(w_166)(h_167)(1)(Nothing)
332+ return basicNewElement(EEmpty_45,w_166,h_167)
381 }
333 }
382 }
334 }
383 function container_67(w_169) {
335 function container_67(w_169) {
384 return function(h_170) {
336 return function(h_170) {
385 return function(pos_168) {
337 return function(pos_168) {
386 return function(e_171) {
338 return function(e_171) {
387− return newElement_38(EContainer_46(pos_168)(e_171))(w_169)(h_170)(1)(Nothing)
339+ return basicNewElement(EContainer_46(pos_168)(e_171),w_169,h_170)
388 }
340 }
389 }
341 }
390 }
342 }
@@ -511,17 +463,9 @@ ElmCode.Graphics.Element = function() {
511 }(Form$thetascaleposform_213)
463 }(Form$thetascaleposform_213)
512 }
464 }
513 }
465 }
514− function scale_99(s_218) {
466+ function scale_99(s) {
515− return function(Form$thetascaleposform_219) {
467+ return function(form) {
516− return function(case5) {
468+ return Form_84(form[1])(s * form[2])(form[3])(form[4])
517− var case0 = case5;
518− switch(case0[0]) {
519− case "Form":
520− var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
521− return Form_84(case1)(s_218 * case2)(case3)(case4)
522− }
523− throw"Non-exhaustive pattern match in case";
524− }(Form$thetascaleposform_219)
525 }
469 }
526 }
470 }
527 function move_100(x_224) {
471 function move_100(x_224) {
@@ -545,6 +489,6 @@ ElmCode.Graphics.Element = function() {
545 }
489 }
546 }
490 }
547 return{left:left_6, right:right_7, down:down_8, up:up_9, inward:inward_10, outward:outward_11, topLeft:topLeft_22, topRight:topRight_23, bottomLeft:bottomLeft_24, bottomRight:bottomRight_25, midLeft:midLeft_26, midRight:midRight_27, midTop:midTop_28, midBottom:midBottom_29, middle:middle_30, middleAt:middleAt, topLeftAt:topLeftAt_31, topRightAt:topRightAt_32, bottomLeftAt:bottomLeftAt_33, bottomRightAt:bottomRightAt_34, absolute:absolute_35, relative:relative_36, width:width_47, height:height_48, size:size_49, opacity:opacity_50,
491 return{left:left_6, right:right_7, down:down_8, up:up_9, inward:inward_10, outward:outward_11, topLeft:topLeft_22, topRight:topRight_23, bottomLeft:bottomLeft_24, bottomRight:bottomRight_25, midLeft:midLeft_26, midRight:midRight_27, midTop:midTop_28, midBottom:midBottom_29, middle:middle_30, middleAt:middleAt, topLeftAt:topLeftAt_31, topRightAt:topRightAt_32, bottomLeftAt:bottomLeftAt_33, bottomRightAt:bottomRightAt_34, absolute:absolute_35, relative:relative_36, width:width_47, height:height_48, size:size_49, opacity:opacity_50,
548− color:color_51, widthOf:widthOf_52, heightOf:heightOf_53, sizeOf:sizeOf_54, text:text_56, plainText:plainText, centeredText:centeredText, justifiedText:justifiedText, rightedText:rightedText, image:image_57, video:video_58, fittedImage:fittedImage_59, flow:flow_60, above:above_61, below:below_62, beside:beside_63, layers:layers_64, collage:collage_65, spacer:spacer_66, container:container_67, line:line_76, segment:segment_77, polygon:polygon_79, rect:rect_80, oval:oval_81, circle:circle_82, ngon:ngon_83, solid:solid_89, dotted:dotted_90, dashed:dashed_91, customLine:customLine_92, filled:filled_93,
492+ color:color_51, link:link, widthOf:widthOf_52, heightOf:heightOf_53, sizeOf:sizeOf_54, text:text_56, asText:asText, plainText:plainText, centeredText:centeredText, justifiedText:justifiedText, rightedText:rightedText, image:image_57, video:video_58, fittedImage:fittedImage_59, flow:flow_60, above:above_61, below:below_62, beside:beside_63, layers:layers_64, collage:collage_65, spacer:spacer_66, container:container_67, line:line_76, segment:segment_77, polygon:polygon_79, rect:rect_80, oval:oval_81, circle:circle_82, ngon:ngon_83, solid:solid_89, dotted:dotted_90, dashed:dashed_91, customLine:customLine_92, filled:filled_93,
549 outlined:outlined_94, customOutline:customOutline_95, textured:textured, sprite:sprite_96, toForm:toForm_97, rotate:rotate_98, scale:scale_99, move:move_100}
493 outlined:outlined_94, customOutline:customOutline_95, textured:textured, sprite:sprite_96, toForm:toForm_97, rotate:rotate_98, scale:scale_99, move:move_100}
550}();
494}();
core-js/Graphics/Render.js+47−10
@@ -23,11 +23,13 @@ function image(src) {
23 var img = newElement('img');
23 var img = newElement('img');
24 img.src = src;
24 img.src = src;
25 img.name = src;
25 img.name = src;
26+ img.style.display = "block";
26 return img;
27 return img;
27}
28}
28
29
29function fittedImage(w,h,src) {
30function fittedImage(w,h,src) {
30 var canvas = newElement('canvas');
31 var canvas = newElement('canvas');
32+ canvas.style.display = "block";
31 canvas.style.width = w + 'px';
33 canvas.style.width = w + 'px';
32 canvas.style.height = h + 'px';
34 canvas.style.height = h + 'px';
33 canvas.width = w;
35 canvas.width = w;
@@ -62,6 +64,7 @@ var video = function(src) {
62 var segs = src.split('.');
64 var segs = src.split('.');
63 source.type = "video/" + segs[segs.length-1];
65 source.type = "video/" + segs[segs.length-1];
64 addTo(e, source);
66 addTo(e, source);
67+ e.style.display = "block";
65 return e;
68 return e;
66};
69};
67
70
@@ -140,6 +143,7 @@ function container(pos,elem) {
140 setPos(pos,e);
143 setPos(pos,e);
141 var div = newElement('div');
144 var div = newElement('div');
142 div.style.position = "relative";
145 div.style.position = "relative";
146+ div.style.overflow = "hidden";
143 addTo(div,e);
147 addTo(div,e);
144 return div;
148 return div;
145};
149};
@@ -155,6 +159,12 @@ function render(elem) {
155 case "ECollage": e = Collage.collage(elem[2][1],elem[2][2],elem[2][3]); break;
159 case "ECollage": e = Collage.collage(elem[2][1],elem[2][2],elem[2][3]); break;
156 case "EEmpty": e = newElement('div'); break;
160 case "EEmpty": e = newElement('div'); break;
157 case "EContainer": e = container(elem[2][1],elem[2][2]); break;
161 case "EContainer": e = container(elem[2][1],elem[2][2]); break;
162+ case "EHtml":
163+ e = elem[2][1];
164+ var p = Value.getExcess(e);
165+ elem[3] -= p[0];
166+ elem[4] -= p[1];
167+ break;
158 }
168 }
159 e.id = elem[1];
169 e.id = elem[1];
160 e.style.width = (~~elem[3]) + 'px';
170 e.style.width = (~~elem[3]) + 'px';
@@ -163,42 +173,61 @@ function render(elem) {
163 if (elem[6][0] === "Just") {
173 if (elem[6][0] === "Just") {
164 e.style.backgroundColor = ElmCode.Graphics.Color.extract(elem[6][1]);
174 e.style.backgroundColor = ElmCode.Graphics.Color.extract(elem[6][1]);
165 }
175 }
176+ if (elem[7][0] === "Just") {
177+ var a = newElement('a');
178+ a.href = elem[7][1];
179+ addTo(a,e);
180+ return a;
181+ }
166 return e;
182 return e;
167};
183};
168
184
169function update(node,curr,next) {
185function update(node,curr,next) {
186+ if (node.tagName === 'A') { node = node.firstChild; }
170 if (curr[1] === next[1]) return;
187 if (curr[1] === next[1]) return;
171 if (curr[2][0] !== next[2][0]) {
188 if (curr[2][0] !== next[2][0]) {
172− node.parentNode.replaceChild(render(next),node);
189+ return node.parentNode.replaceChild(render(next),node);
173 }
190 }
174 var nextE = next[2], currE = curr[2];
191 var nextE = next[2], currE = curr[2];
175 switch(nextE[0]) {
192 switch(nextE[0]) {
176 case "EText":
193 case "EText":
177− if (nextE[1] !== currE[1]) node.innerHTML = Value.toText(nextE[1]);
194+ if (nextE[1] !== currE[1]) node.style.textAlign = nextE[1];
195+ if (nextE[2] !== currE[2]) node.innerHTML = nextE[2];
178 break;
196 break;
179 case "EImage":
197 case "EImage":
180 if (nextE[1] !== currE[1]) node.src = nextE[1];
198 if (nextE[1] !== currE[1]) node.src = nextE[1];
181 break;
199 break;
182 case "EVideo":
200 case "EVideo":
183 case "EFittedImage":
201 case "EFittedImage":
184− if (Value.eq(nextE,currE)) break;
202+ if (!Value.eq(nextE,currE) || next[3]!==curr[3] || next[4]!==curr[4]) {
185− return node.parentNode.replaceChild(render(next),node);
203+ return node.parentNode.replaceChild(render(next),node);
204+ }
205+ break;
186 case "ECollage":
206 case "ECollage":
187− if (nextE[1] !== currE[1] || nextE[2] !== currE[2]) {
207+ if (nextE[1] !== currE[1] || nextE[2] !== currE[2] || nextE[3].length !== currE[3].length) {
188− return node.parentNode.replaceChild(render(nextE),node);
208+ return node.parentNode.replaceChild(render(next),node);
189 }
209 }
190 Collage.updateCollage(node,currE[3],nextE[3]);
210 Collage.updateCollage(node,currE[3],nextE[3]);
191 break;
211 break;
192 case "EFlow":
212 case "EFlow":
193− if (nextE[1] !== currE[1])
213+ if (nextE[1] !== currE[1]) {
194 return node.parentNode.replaceChild(render(next),node);
214 return node.parentNode.replaceChild(render(next),node);
215+ }
195 var nexts = nextE[2];
216 var nexts = nextE[2];
196 var kids = node.childNodes;
217 var kids = node.childNodes;
197− if (nexts.length !== kids.length)
218+ if (nexts.length !== kids.length) {
198 return node.parentNode.replaceChild(render(next),node);
219 return node.parentNode.replaceChild(render(next),node);
220+ }
199 var currs = currE[2];
221 var currs = currE[2];
222+ var goDir = {};
223+ switch(nextE[1][0]) {
224+ case "DDown": case "DUp": goDir = goDown; break;
225+ case "DRight": case "DLeft": goDir = goRight; break;
226+ case "DOut": case "DIn": goDir = goIn; break;
227+ }
200− for (var i = kids.length ; i-- ; ) {
228+ for (var i = kids.length; i-- ;) {
201 update(kids[i],currs[i],nexts[i]);
229 update(kids[i],currs[i],nexts[i]);
230+ goDir(kids[i]);
202 }
231 }
203 break;
232 break;
204 case "EContainer":
233 case "EContainer":
@@ -206,13 +235,21 @@ function update(node,curr,next) {
206 setPos(nextE[1],node.childNodes[0]);
235 setPos(nextE[1],node.childNodes[0]);
207 break;
236 break;
208 case "EEmpty":
237 case "EEmpty":
238+ break;
239+ case "EHtml":
240+ var p = Value.getExcess(node);
241+ next[3] -= p[0];
242+ next[4] -= p[1];
209 }
243 }
210 if (next[3] !== curr[3]) node.style.width = (~~next[3]) + 'px';
244 if (next[3] !== curr[3]) node.style.width = (~~next[3]) + 'px';
211 if (next[4] !== curr[4]) node.style.height = (~~next[4]) + 'px';
245 if (next[4] !== curr[4]) node.style.height = (~~next[4]) + 'px';
212 if (next[5] !== curr[5]) node.style.opacity = next[5];
246 if (next[5] !== curr[5]) node.style.opacity = next[5];
213 if (next[6].length === 2) {
247 if (next[6].length === 2) {
214 var clr = ElmCode.Graphics.Color.extract(next[6][1]);
248 var clr = ElmCode.Graphics.Color.extract(next[6][1]);
215− if (clr !== node.style.color) node.style.color = clr;
249+ if (clr !== node.style.backgroundColor) node.style.backgroundColor = clr;
250+ }
251+ if (next[7].length === 2) {
252+ if (curr[7].length === 1 || next[7][1] !== curr[7][1]) node.parentNode.href = next[7][1];
216 }
253 }
217 next[1] = curr[1];
254 next[1] = curr[1];
218}
255}
core-js/Text.js+1−1
@@ -20,7 +20,7 @@ var Text = function() {
20 var italic = addStyle('font-style', 'italic');
20 var italic = addStyle('font-style', 'italic');
21 var bold = addTag('b');
21 var bold = addTag('b');
22 var color = function(c) {
22 var color = function(c) {
23− return addStyle('color', Color.Internal.extract(c));
23+ return addStyle('color', ElmCode.Graphics.Color.extract(c));
24 };
24 };
25 var underline = addStyle('text-decoration', 'underline');
25 var underline = addStyle('text-decoration', 'underline');
26 var overline = addStyle('text-decoration', 'overline');
26 var overline = addStyle('text-decoration', 'overline');
core-js/Value.js+37
@@ -93,9 +93,44 @@ var Value = function(){
93 var realW = cStyle.getPropertyValue("width").slice(0,-2) - 0;
93 var realW = cStyle.getPropertyValue("width").slice(0,-2) - 0;
94 var realH = cStyle.getPropertyValue("height").slice(0,-2) - 0;
94 var realH = cStyle.getPropertyValue("height").slice(0,-2) - 0;
95 document.body.removeChild(t);
95 document.body.removeChild(t);
96+ delete t;
96 return [realW,Math.max(h,realH)];
97 return [realW,Math.max(h,realH)];
97 }
98 }
98
99
100+ function getSize(e) {
101+ var t = e.cloneNode(true);
102+
103+ t.style.visibility = "hidden";
104+ t.style.styleFloat = "left";
105+ t.style.cssFloat = "left";
106+
107+ document.body.appendChild(t);
108+ var w = t.offsetWidth;
109+ var h = t.offsetHeight;
110+ document.body.removeChild(t);
111+ delete t;
112+ return [w,h];
113+ }
114+
115+ function getExcess(e) {
116+ var t = e.cloneNode(true);
117+
118+ t.style.visibility = "hidden";
119+ t.style.styleFloat = "left";
120+ t.style.cssFloat = "left";
121+
122+ document.body.appendChild(t);
123+ var ow = t.offsetWidth;
124+ var oh = t.offsetHeight;
125+ var cStyle = window.getComputedStyle(t);
126+ var w = cStyle.getPropertyValue("width").slice(0,-2) - 0;
127+ var h = cStyle.getPropertyValue("height").slice(0,-2) - 0;
128+ document.body.removeChild(t);
129+ delete t;
130+ return [ow-w,oh-h];
131+ }
132+
133+
99 function groupForms(forms) {
134 function groupForms(forms) {
100 forms = Foreign.JavaScript.castListToJSArray(forms);
135 forms = Foreign.JavaScript.castListToJSArray(forms);
101 var groups = [];
136 var groups = [];
@@ -202,5 +237,7 @@ var Value = function(){
202 toText : toText,
237 toText : toText,
203 properEscape : properEscape,
238 properEscape : properEscape,
204 getTextSize : getTextSize,
239 getTextSize : getTextSize,
240+ getSize : getSize,
241+ getExcess : getExcess,
205 groupForms : groupForms };
242 groupForms : groupForms };
206}();
243}();
core-js/foreign/JavaScript.js+8−2
@@ -10,8 +10,14 @@ var Foreign = function() {
10 function castJSNumberToInt(n) { return ~~n; }
10 function castJSNumberToInt(n) { return ~~n; }
11 function castIntToJSNumber(n) { return n; }
11 function castIntToJSNumber(n) { return n; }
12
12
13− function castJSElementToElement(w) { return Element.jsElement(w); }
13+ function castJSElementToElement(w) {
14+ return function(h) {
15+ return function(node) {
16+ return ["Element",Guid.guid(),["EHtml",node],w,h,1,Nothing,Nothing];
17+ }
18+ }
19+ }
14− function castElementToJSElement(elem) { return elem; }
20+ function castElementToJSElement(elem) { return Render.render(elem); }
15
21
16 function castJSArrayToList(arr) {
22 function castJSArrayToList(arr) {
17 var list = ["Nil"];
23 var list = ["Nil"];
core-js/runtime/Signal.js+12−6
@@ -242,18 +242,24 @@ var Signal = function() {
242 return { inRange:inRange, randomize:randomize };
242 return { inRange:inRange, randomize:randomize };
243 }();
243 }();
244 var Input = function() {
244 var Input = function() {
245+ function wrap(elem) {
246+ var p = Value.getSize(elem);
247+ return ["Element", Guid.guid(), ["EHtml",elem], p[0], p[1], 1, Nothing, Nothing];
248+ }
245 var newTextInput = function(elem, ghostText) {
249 var newTextInput = function(elem, ghostText) {
246− elem.isElmLeaf = true;
250+ elem.placeholder = Foreign.JavaScript.castStringToJSString(ghostText);
247 var str = Elm.Input(["Nil"]);
251 var str = Elm.Input(["Nil"]);
248 addListener(elem, 'keyup', function(e) {
252 addListener(elem, 'keyup', function(e) {
249 Dispatcher.notify(str.id, toElmString(elem.value));
253 Dispatcher.notify(str.id, toElmString(elem.value));
250 elem.focus();
254 elem.focus();
251 });
255 });
256+ elem.style.padding = "1px";
252− return Value.Tuple(elem, str);
257+ return Value.Tuple(wrap(elem), str);
253 };
258 };
254 var newElement = function(name) {
259 var newElement = function(name) {
255 var e = document.createElement(name);
260 var e = document.createElement(name);
256− e.id = Guid.guid();
261+ e.style.padding = "0";
262+ e.style.margin = "0";
257 return e;
263 return e;
258 };
264 };
259 var textArea = function(cols) { return function(rows) {
265 var textArea = function(cols) { return function(rows) {
@@ -281,7 +287,7 @@ var Signal = function() {
281 addListener(box, 'change', function(e) {
287 addListener(box, 'change', function(e) {
282 Dispatcher.notify(status.id, box.checked);
288 Dispatcher.notify(status.id, box.checked);
283 });
289 });
284− return Value.Tuple(box, status);
290+ return Value.Tuple(wrap(box), status);
285 };
291 };
286 var dropDown = function(options) {
292 var dropDown = function(options) {
287 var slct = newElement('select');
293 var slct = newElement('select');
@@ -299,7 +305,7 @@ var Signal = function() {
299 addListener(slct, 'change', function(e) {
305 addListener(slct, 'change', function(e) {
300 Dispatcher.notify(status.id, opts[slct.selectedIndex]);
306 Dispatcher.notify(status.id, opts[slct.selectedIndex]);
301 });
307 });
302− return Value.Tuple(slct, status);
308+ return Value.Tuple(wrap(slct), status);
303 };
309 };
304 var stringDropDown = function(opts) {
310 var stringDropDown = function(opts) {
305 return dropDown(List.map (function(x) {return Value.Tuple(x,x);}) (opts));
311 return dropDown(List.map (function(x) {return Value.Tuple(x,x);}) (opts));
@@ -313,7 +319,7 @@ var Signal = function() {
313 Dispatcher.notify(press.id, true);
319 Dispatcher.notify(press.id, true);
314 Dispatcher.notify(press.id, false);
320 Dispatcher.notify(press.id, false);
315 });
321 });
316− return Value.Tuple(b,press);
322+ return Value.Tuple(wrap(b),press);
317 };
323 };
318 return {textArea:textArea, textField:textField,
324 return {textArea:textArea, textField:textField,
319 password:password, checkbox:checkbox,
325 password:password, checkbox:checkbox,
elm/elm-runtime-0.4.0.jsnew file+2814
@@ -0,0 +1,2814 @@
1+
2+var Guid = function() {
3+ var counter = 0;
4+ var guid = function() { counter += 1; return counter; };
5+ return {guid : guid};
6+}();
7+var Foreign = function() {
8+ var JavaScript = function() {
9+ function castJSBoolToBool(b) { return b; }
10+ function castBoolToJSBool(b) { return b; }
11+
12+ function castJSNumberToFloat(n) { return n; }
13+ function castFloatToJSNumber(n) { return n; }
14+
15+ function castJSNumberToInt(n) { return ~~n; }
16+ function castIntToJSNumber(n) { return n; }
17+
18+ function castJSElementToElement(w) {
19+ return function(h) {
20+ return function(node) {
21+ return ["Element",Guid.guid(),["EHtml",node],w,h,1,Nothing,Nothing];
22+ }
23+ }
24+ }
25+ function castElementToJSElement(elem) { return Render.render(elem); }
26+
27+ function castJSArrayToList(arr) {
28+ var list = ["Nil"];
29+ for (var i = arr.length; i--; ) {
30+ list = [ "Cons", arr[i], list ];
31+ }
32+ return list;
33+ }
34+ function castListToJSArray(list) {
35+ var a = [];
36+ while (list[0] === "Cons") {
37+ a.push(list[1]);
38+ list = list[2];
39+ }
40+ return a;
41+ }
42+
43+ var castJSStringToString = castJSArrayToList;
44+ function castStringToJSString(str) {
45+ if (typeof str === "string") return str;
46+ return castListToJSArray(str).join('');
47+ }
48+
49+ function fromTuple(t) { return t.slice(1); }
50+ function toTuple(a) { return ["Tuple" + a.length].concat(a); }
51+
52+ return {castJSBoolToBool:castJSBoolToBool,
53+ castBoolToJSBool:castBoolToJSBool,
54+ castJSNumberToFloat:castJSNumberToFloat,
55+ castFloatToJSNumber:castFloatToJSNumber,
56+ castJSNumberToInt:castJSNumberToInt,
57+ castIntToJSNumber:castIntToJSNumber,
58+ Experimental : {castJSElementToElement:castJSElementToElement,
59+ castElementToJSElement:castElementToJSElement},
60+ castJSArrayToList:castJSArrayToList,
61+ castListToJSArray:castListToJSArray,
62+ castJSStringToString:castJSStringToString,
63+ castStringToJSString:castStringToJSString,
64+ castTupleToJSTuple2:fromTuple,
65+ castTupleToJSTuple3:fromTuple,
66+ castTupleToJSTuple4:fromTuple,
67+ castTupleToJSTuple5:fromTuple,
68+ castJSTupleToTuple2:toTuple,
69+ castJSTupleToTuple3:toTuple,
70+ castJSTupleToTuple4:toTuple,
71+ castJSTupleToTuple5:toTuple
72+ };
73+ }();
74+ return {JavaScript:JavaScript};
75+}();
76+var ElmJSON = function() {
77+ var JS = Foreign.JavaScript;
78+ var empty = ['JSON',{}];
79+ function singleton(k) { return function(v) {
80+ var obj = {};
81+ obj[JS.castStringToJSString(k)] = v;
82+ return ['JSON', obj ];
83+ };
84+ }
85+ function insert(k) { return function(v) { return function(inObj) {
86+ var obj = inObj[1];
87+ var outObj = {};
88+ for (var i in obj) {
89+ outObj[i] = obj[i];
90+ }
91+ outObj[JS.castStringToJSString(k)] = v;
92+ return ['JSON', outObj ];
93+ };
94+ };
95+ }
96+ function lookup(key) { return function(obj) {
97+ var k = JS.castStringToJSString(key);
98+ return obj[1].hasOwnProperty(k) ? Just(obj[1][k]) : Nothing ;
99+ };
100+ }
101+ function lookupWithDefault(base) { return function(key) { return function(obj) {
102+ var k = JS.castStringToJSString(key);
103+ return obj[1].hasOwnProperty(k) ? obj[1][k] : base ;
104+ };
105+ };
106+ }
107+ function remove(k) { return function(inObj) {
108+ var obj = inObj[1];
109+ var outObj = {};
110+ for (var i in obj) {
111+ outObj[i] = obj[i];
112+ }
113+ delete outObj[JS.castStringToJSString(k)];
114+ return ['JSON', outObj];
115+ };
116+ }
117+
118+ function JsonString(v) { return [ "JsonString", v ]; }
119+ function JsonNumber(v) { return [ "JsonNumber", v ]; }
120+ function JsonBool(v) { return [ "JsonBool", v ]; }
121+ var JsonNull = [ "JsonNull" ];
122+ function JsonArray(v) { return [ "JsonArray", v ]; }
123+ function JsonObject(v) { return [ "JsonObject", v ]; }
124+
125+ function toList(json) {
126+ var obj = json[1];
127+ var arr = [];
128+ for (var i in obj) {
129+ arr.push(Value.Tuple(JS.castJSStringToString(i), obj[i]));
130+ }
131+ return JS.castJSArrayToList(arr);
132+ }
133+ function fromList(list) {
134+ var arr = JS.castListToJSArray(list);
135+ var obj = {};
136+ for (var i = arr.length; i--; ) {
137+ obj[JS.castStringToJSString(arr[i][1])] = arr[i][2];
138+ }
139+ return [ "JSON", obj ];
140+ }
141+
142+ function toPrettyJSString(sep) { return function (obj) {
143+ function fromValue(v) {
144+ switch (v[0]) {
145+ case 'JsonNull' : return null;
146+ case 'JsonString' : return JS.castStringToJSString(v[1]);
147+ case 'JsonObject' :
148+ var o = {};
149+ var from = v[1][1];
150+ for (var i in from) {
151+ o[i] = fromValue(from[i]);
152+ }
153+ return o;
154+ case 'JsonArray' :
155+ var a = JS.castListToJSArray(v[1]);
156+ for (var i = a.length; i--; ) {
157+ a[i] = fromValue(a[i]);
158+ }
159+ return a;
160+ default :
161+ return v[1];
162+ }
163+ }
164+ return JSON.stringify(fromValue([ 'JsonObject', obj ]), null, JS.castStringToJSString(sep));
165+ };
166+ }
167+ function fromJSString(str) {
168+ var obj = JSON.parse(str);
169+ function toValue(v) {
170+ switch (typeof v) {
171+ case 'string' : return [ "JsonString", JS.castJSStringToString(v) ];
172+ case 'number' : return [ "JsonNumber", JS.castJSNumberToFloat(v) ];
173+ case 'boolean' : return [ "JsonBool", JS.castJSBoolToBool(v) ];
174+ case 'object' :
175+ if (v === null) return [ "JsonNull" ];
176+ for (var i in v) {
177+ v[i] = toValue(v[i]);
178+ }
179+ if (v instanceof Array) return [ "JsonArray", JS.castJSArrayToList(v) ];
180+ return [ "JsonObject", [ "JSON", v ] ];
181+ }
182+ }
183+ for (var i in obj) {
184+ obj[i] = toValue(obj[i]);
185+ }
186+ return ['JSON',obj];
187+ }
188+ return {empty : empty,
189+ singleton : singleton,
190+ insert : insert,
191+ lookup : lookup,
192+ findWithDefault : lookupWithDefault,
193+ remove : remove,
194+ toPrettyJSString : toPrettyJSString,
195+ toJSString : toPrettyJSString(''),
196+ fromJSString : fromJSString,
197+ toPrettyString : function(sep) { return function(v) {
198+ return JS.castJSStringToString(toPrettyJSString(sep)(v)); }; },
199+ toString : function(v) { return JS.castJSStringToString(toPrettyJSString('')(v)); },
200+ fromString : function(v) { return fromJSString(JS.castStringToJSString(v)); },
201+ toList : toList,
202+ fromList : fromList,
203+ JsonString : JsonString,
204+ JsonNumber : JsonNumber,
205+ JsonBool : JsonBool,
206+ JsonNull : JsonNull,
207+ JsonArray : JsonArray,
208+ JsonObject : JsonObject
209+ };
210+}();
211+
212+Foreign.JavaScript.JSON = ElmJSON;
213+var Value = function(){
214+
215+ var eq = function(x,y) {
216+ if (typeof x === "object") {
217+ if (x === y) return true;
218+ if (x.length !== y.length) return false;
219+ for (var i = x.length; i--; ) {
220+ if (!eq(x[i],y[i])) return false;
221+ }
222+ return true;
223+ }
224+ return x === y;
225+ };
226+
227+ var Tuple = function() {
228+ var len = arguments.length;
229+ var arr = new Array(len+1);
230+ arr[0] = "Tuple" + arguments.length;
231+ for (var i = len; i--; ) {
232+ arr[i+1] = arguments[i];
233+ }
234+ return arr;
235+ };
236+
237+ var listToArray = function(list) {
238+ var arr = [];
239+ while (list[0] === "Cons") {
240+ arr.push(list[1]);
241+ list = list[2];
242+ }
243+ return arr;
244+ };
245+
246+ function makeSpaces(s) {
247+ var arr = s.split('');
248+ if (arr[0] == ' ') { arr[0] = " " }
249+ for (var i = arr.length; --i; ) {
250+ if (arr[i][0] == ' ' && arr[i-1] == ' ') {
251+ arr[i-1] = arr[i-1] + arr[i];
252+ arr[i] = '';
253+ }
254+ }
255+ for (var i = arr.length; i--; ) {
256+ if (arr[i].length > 1 && arr[i][0] == ' ') {
257+ var spaces = arr[i].split('');
258+ for (var j = spaces.length - 2; j >= 0; j -= 2) {
259+ spaces[j] = ' ';
260+ }
261+ arr[i] = spaces.join('');
262+ }
263+ }
264+ return arr.join('');
265+ }
266+
267+ function properEscape(str) {
268+ if (str.length == 0) return str;
269+ str = str //.replace(/&/g, "&")
270+ .replace(/"/g, /*"*/ """)
271+ .replace(/'/g, /*'*/ "'")
272+ .replace(/</g, "&#60;")
273+ .replace(/>/g, "&#62;")
274+ .replace(/\n/g, "<br/>");
275+ var arr = str.split('<br/>');
276+ for (var i = arr.length; i--; ) {
277+ arr[i] = makeSpaces(arr[i]);
278+ }
279+ return arr.join('<br/>');
280+ }
281+
282+ var toText = function(elmList) {
283+ if (typeof elmList === "string") return properEscape(elmList);
284+ var a = [];
285+ while (elmList[0] === "Cons") {
286+ a.push(elmList[1]);
287+ elmList = elmList[2];
288+ }
289+ return properEscape(a.join(''));
290+ };
291+
292+ function getTextSize(w,h,txt) {
293+ var t = document.createElement('div');
294+ t.innerHTML = txt;
295+ t.style.width = w + "px";
296+ //t.style.height = h + 'px';
297+
298+ t.style.visibility = "hidden";
299+ t.style.styleFloat = "left";
300+ t.style.cssFloat = "left";
301+
302+ document.body.appendChild(t);
303+ var cStyle = window.getComputedStyle(t);
304+ var realW = cStyle.getPropertyValue("width").slice(0,-2) - 0;
305+ var realH = cStyle.getPropertyValue("height").slice(0,-2) - 0;
306+ document.body.removeChild(t);
307+ delete t;
308+ return [realW,Math.max(h,realH)];
309+ }
310+
311+ function getSize(e) {
312+ var t = e.cloneNode(true);
313+
314+ t.style.visibility = "hidden";
315+ t.style.styleFloat = "left";
316+ t.style.cssFloat = "left";
317+
318+ document.body.appendChild(t);
319+ var w = t.offsetWidth;
320+ var h = t.offsetHeight;
321+ document.body.removeChild(t);
322+ delete t;
323+ return [w,h];
324+ }
325+
326+ function getExcess(e) {
327+ var t = e.cloneNode(true);
328+
329+ t.style.visibility = "hidden";
330+ t.style.styleFloat = "left";
331+ t.style.cssFloat = "left";
332+
333+ document.body.appendChild(t);
334+ var ow = t.offsetWidth;
335+ var oh = t.offsetHeight;
336+ var cStyle = window.getComputedStyle(t);
337+ var w = cStyle.getPropertyValue("width").slice(0,-2) - 0;
338+ var h = cStyle.getPropertyValue("height").slice(0,-2) - 0;
339+ document.body.removeChild(t);
340+ delete t;
341+ return [ow-w,oh-h];
342+ }
343+
344+
345+ function groupForms(forms) {
346+ forms = Foreign.JavaScript.castListToJSArray(forms);
347+ var groups = [];
348+ var arr = [];
349+ for (var i = forms.length; i--; ) {
350+ var f = forms[i];
351+ switch(f[4][0]) {
352+ case "FElement":
353+ if (arr.length > 0) {
354+ groups.push(arr);
355+ arr = [];
356+ }
357+ groups.push(f);
358+ break;
359+ default:
360+ arr.push(f);
361+ }
362+ }
363+ if (arr.length > 0) groups.push(arr);
364+ return groups;
365+ }
366+
367+ var toString = function(v) {
368+ if (typeof v === "boolean") {
369+ return v ? "True" : "False";
370+ } else if (typeof v === "number") {
371+ return v+"";
372+ } else if (typeof v === "string" && v.length < 2) {
373+ return "'"+v+"'";
374+ } else if (v[0]) {
375+ if (v[0].substring(0,5) === "Tuple") {
376+ var output = "";
377+ for (var i = v.length; --i; ) {
378+ output = "," + toString(v[i]) + output;
379+ }
380+ if (output[0] === ",") output = output.substring(1);
381+ return "("+output+")";
382+ } else if (v[0] === "Cons") {
383+ var start = (typeof v[1] === "string") ? '"' : "[";
384+ var end = (typeof v[1] === "string") ? '"' : "]";
385+ var div = (typeof v[1] === "string") ? "" : ",";
386+ var f = (typeof v[1] === "string") ? function(x){return x} : toString;
387+ var output = start + f(v[1]);
388+ v = v[2];
389+ while (true) {
390+ if (v[0] === "Cons") {
391+ output += div + f(v[1]);
392+ v = v[2];
393+ } else {
394+ return output + end;
395+ }
396+ }
397+ } else if (v[0] === "Nil") {
398+ return "[]";
399+ } else if (v[0] === "JSON") {
400+ return "(JSON.fromList " + toString(ElmJSON.toList(v)) + ")";
401+ } else {
402+ var output = "";
403+ for (var i = v.length; --i; ) {
404+ output = " " + toString(v[i]) + output
405+ }
406+ output = v[0] + output;
407+ return (v.length > 1) ? "(" + output + ")" : output;
408+ }
409+ }
410+ return v+"";
411+ };
412+ var show = function(v) {
413+ return Text.monospace(properEscape(toString(v)));
414+ };
415+ var append = function(xs,ys) {
416+ if (typeof xs === "string" && typeof ys === "string") {
417+ return xs.concat(ys);
418+ }
419+ if (xs[0] === "Nil") {
420+ return ys;
421+ }
422+ var root = ["Cons", xs[1], ["Nil"]];
423+ var curr = root;
424+ xs = xs[2];
425+ while (xs[0]==="Cons") {
426+ curr[2] = ["Cons", xs[1], ["Nil"]];
427+ xs = xs[2];
428+ curr = curr[2];
429+ }
430+ curr[2] = ys;
431+ return root;
432+ };
433+
434+ var str = function(s) {
435+ var out = ["Nil"];
436+ for (var i = s.length; i--; ) {
437+ out = ["Cons", s[i], out];
438+ }
439+ return out;
440+ };
441+
442+ return {eq:eq,
443+ str:str,
444+ show:show,
445+ Tuple:Tuple,
446+ append:append,
447+ listToArray:listToArray,
448+ toText : toText,
449+ properEscape : properEscape,
450+ getTextSize : getTextSize,
451+ getSize : getSize,
452+ getExcess : getExcess,
453+ groupForms : groupForms };
454+}();var List = function() {
455+
456+ var throwError = function(f) {
457+ throw "Function '" + f + "' expecting a list!";
458+ }
459+
460+ function length(xs) {
461+ var out = 0;
462+ while (xs[0] === "Cons") {
463+ out += 1;
464+ xs = xs[2];
465+ }
466+ return out;
467+ };
468+ var reverse = foldl(function(x_72) {
469+ return function(y_73) {
470+ return["Cons", x_72, y_73]
471+ }
472+ })(["Nil"]);
473+ var concat = foldr(function(x_74) {
474+ return function(y_75) {
475+ return Value.append(x_74, y_75)
476+ }
477+ })(["Nil"]);
478+ var and = foldl(function(x_77) {
479+ return function(y_78) {
480+ return x_77 && y_78
481+ }
482+ })(true);
483+ var or = foldl(function(x_79) {
484+ return function(y_80) {
485+ return x_79 || y_80
486+ }
487+ })(false);
488+ var sum = foldl(function(x_89) {
489+ return function(y_90) {
490+ return x_89 + y_90
491+ }
492+ })(0);
493+ var product = foldl(function(x_91) {
494+ return function(y_92) {
495+ return x_91 * y_92
496+ }
497+ })(1);
498+ var maximum = foldl1(function(x) { return function(y) { return Math.max(x,y) } });
499+ var minimum = foldl1(function(x) { return function(y) { return Math.min(x,y) } });
500+ function head(v) {
501+ if (v[0] !== "Cons") {
502+ throw "Error: 'head' only accepts lists of length greater than one.";
503+ }
504+ return v[1];
505+ }
506+ function tail(v) {
507+ if (v[0] !== "Cons") {
508+ throw "Error: 'tail' only accepts lists of length greater than one.";
509+ }
510+ return v[2];
511+ }
512+ function last(v) {
513+ if (v[0] !== "Cons") {
514+ throw "Error: 'last' only accepts lists of length greater than one.";
515+ }
516+ var out = v[1];
517+ while (v[0] === "Cons") {
518+ out = v[1];
519+ v = v[2];
520+ }
521+ return out;
522+ }
523+ function map(f) {
524+ return function(xs) {
525+ if (xs[0] === "Nil") { return xs; }
526+ if (xs[0] !== "Cons") { throwError('map'); }
527+ var root = ["Cons", f(xs[1]), ["Nil"]];
528+ var curr = root;
529+ xs = xs[2];
530+ while (xs[0]==="Cons") {
531+ curr[2] = ["Cons", f(xs[1]), ["Nil"]];
532+ xs = xs[2];
533+ curr = curr[2];
534+ }
535+ return root;
536+ }
537+ }
538+ function foldl(f) {
539+ return function(b) {
540+ return function(xs) {
541+ var acc = b;
542+ if (xs[0] === "Nil") { return acc; }
543+ if (xs[0] !== "Cons") { throwError('foldl'); }
544+ while (xs[0] === "Cons") {
545+ acc = f(xs[1])(acc);
546+ xs = xs[2];
547+ }
548+ return acc;
549+ }
550+ }
551+ }
552+ function foldr(f) {
553+ return function(b) {
554+ return function(xs) {
555+ var acc = b;
556+ if (xs[0] === "Nil") { return acc; }
557+ if (xs[0] !== "Cons") { throwError('foldr'); }
558+ var arr = [];
559+ while (xs[0] === "Cons") {
560+ arr.push(xs[1]);
561+ xs = xs[2];
562+ }
563+ for (var i = arr.length; i--; ) {
564+ acc = f(arr[i])(acc);
565+ }
566+ return acc;
567+ }
568+ }
569+ }
570+ function foldl1(f_49) {
571+ return function(_temp_50) {
572+ return function(v) {
573+ if("Cons" !== v[0]) {
574+ return undefined
575+ }else {
576+ var x_51 = v[1];
577+ var xs_52 = v[2];
578+ return foldl(f_49)(x_51)(xs_52)
579+ }
580+ }(_temp_50)
581+ }
582+ }
583+ function foldr1(f) {
584+ return function(xs) {
585+ if (xs[0] === "Nil") { throw "'foldr1' requires an non-empty list." }
586+ if (xs[0] !== "Cons") { throwError('foldr1'); }
587+ var arr = [];
588+ while (xs[0] === "Cons") {
589+ arr.push(xs[1]);
590+ xs = xs[2];
591+ }
592+ var acc = arr.pop();
593+ for (var i = arr.length; i--; ) {
594+ acc = f(arr[i])(acc);
595+ }
596+ return acc;
597+ }
598+ }
599+ function scanl(f) {
600+ return function(b) {
601+ return function(xs) {
602+ if (xs[0] === "Nil") { return ["Cons",b,["Nil"]]; }
603+ if (xs[0] !== "Cons") { throwError('scanl'); }
604+ var arr = [b];
605+ while (xs[0] === "Cons") {
606+ b = f(xs[1])(b);
607+ arr.push(b);
608+ xs = xs[2];
609+ }
610+ var out = ["Nil"];
611+ for (var i = arr.length; i--; ) {
612+ out = ["Cons", arr[i], out];
613+ }
614+ return out;
615+ }
616+ }
617+ }
618+ function scanl1(f) {
619+ return function(xs) {
620+ if (xs[0] !== "Cons") {
621+ throw "Error: 'scanl1' requires a list of at least length 1.";
622+ }
623+ return scanl(f)(xs[1])(xs[2]);
624+ }
625+ }
626+ function filter(pred) {
627+ return function(xs) {
628+ if (xs[0] === "Nil") { return xs; }
629+ if (xs[0] !== "Cons") { throwError('filter'); }
630+ var arr = [];
631+ while (xs[0] === "Cons") {
632+ if (pred(xs[1])) { arr.push(xs[1]); }
633+ xs = xs[2];
634+ }
635+ var out = ["Nil"];
636+ for (var i = arr.length; i--; ) {
637+ out = ["Cons", arr[i], out];
638+ }
639+ return out;
640+ }
641+ }
642+ function concatMap(f_76) {
643+ return function(x) {
644+ return concat(map(f_76)(x))
645+ }
646+ }
647+ function forall(pred) {
648+ return foldl(function(x) { return function(acc) {
649+ return acc && pred(x);
650+ };})(true);
651+ }
652+ function exists(pred) {
653+ return foldl(function(x) { return function(acc) {
654+ return acc || pred(x);
655+ };})(false);
656+ }
657+ function partition(pred_93) {
658+ return function(lst_94) {
659+ return function() {
660+ var v = lst_94;
661+ var c = [function(v) {
662+ if("Nil" !== v[0]) {
663+ return undefined
664+ }else {
665+ return["Tuple2", ["Nil"], ["Nil"]]
666+ }
667+ }, function(v) {
668+ if("Cons" !== v[0]) {
669+ return undefined
670+ }else {
671+ var x_95 = v[1];
672+ var xs_96 = v[2];
673+ return function(v) {
674+ if("Tuple2" !== v[0]) {
675+ return undefined
676+ }else {
677+ var as_97 = v[1];
678+ var bs_98 = v[2];
679+ return pred_93(x_95) ? ["Tuple2", ["Cons", x_95, as_97], bs_98] : ["Tuple2", as_97, ["Cons", x_95, bs_98]]
680+ }
681+ }(partition(pred_93)(xs_96))
682+ }
683+ }];
684+ for(var i = c.length;i--;) {
685+ var r = c[i](v);
686+ if(r !== undefined) {
687+ return r
688+ }
689+ }
690+ }()
691+ }
692+ }
693+ function zipWith(f) {
694+ return function(listA) {
695+ return function(listB) {
696+ if (listA[0] === "Nil" || listB[0] === "Nil") { return ["Nil"]; }
697+ if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError('zipWith'); }
698+ var arr = [];
699+ while (listA[0] === "Cons" && listB[0] === "Cons") {
700+ arr.push(f(listA[1])(listB[1]));
701+ listA = listA[2];
702+ listB = listB[2];
703+ }
704+ var out = ["Nil"];
705+ for (var i = arr.length; i--; ) {
706+ out = ["Cons", arr[i], out];
707+ }
708+ return out;
709+ }
710+ }
711+ }
712+ function zip(listA) {
713+ return function(listB) {
714+ if (listA[0] === "Nil" || listB[0] === "Nil") { return ["Nil"]; }
715+ if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError('zip'); }
716+ var arr = [];
717+ while (listA[0] === "Cons" && listB[0] === "Cons") {
718+ arr.push(["Tuple2", listA[1], listB[1]]);
719+ listA = listA[2];
720+ listB = listB[2];
721+ }
722+ var out = ["Nil"];
723+ for (var i = arr.length; i--; ) {
724+ out = ["Cons", arr[i], out];
725+ }
726+ return out;
727+ }
728+ }
729+ function unzip(pairs_112) {
730+ return function() {
731+ var v = pairs_112;
732+ var c = [function(v) {
733+ if("Nil" !== v[0]) {
734+ return undefined
735+ }else {
736+ return["Tuple2", ["Nil"], ["Nil"]]
737+ }
738+ }, function(v) {
739+ if("Cons" !== v[0]) {
740+ return undefined
741+ }else {
742+ var p_113 = v[1];
743+ var ps_114 = v[2];
744+ return function(v) {
745+ if("Tuple2" !== v[0]) {
746+ return undefined
747+ }else {
748+ if("Tuple2" !== v[1][0]) {
749+ return undefined
750+ }else {
751+ var x_115 = v[1][1];
752+ var y_116 = v[1][2];
753+ if("Tuple2" !== v[2][0]) {
754+ return undefined
755+ }else {
756+ var xs_117 = v[2][1];
757+ var ys_118 = v[2][2];
758+ return["Tuple2", ["Cons", x_115, xs_117], ["Cons", y_116, ys_118]]
759+ }
760+ }
761+ }
762+ }(["Tuple2", p_113, unzip(ps_114)])
763+ }
764+ }];
765+ for(var i = c.length;i--;) {
766+ var r = c[i](v);
767+ if(r !== undefined) {
768+ return r
769+ }
770+ }
771+ }()
772+ }
773+ function intersperse(sep_119) {
774+ return function(xs_120) {
775+ return function() {
776+ var v = xs_120;
777+ var c = [function(v) {
778+ if("Nil" !== v[0]) {
779+ return undefined
780+ }else {
781+ return["Nil"]
782+ }
783+ }, function(v) {
784+ if("Cons" !== v[0]) {
785+ return undefined
786+ }else {
787+ var a_124 = v[1];
788+ if("Nil" !== v[2][0]) {
789+ return undefined
790+ }else {
791+ return["Cons", a_124, ["Nil"]]
792+ }
793+ }
794+ }, function(v) {
795+ if("Cons" !== v[0]) {
796+ return undefined
797+ }else {
798+ var a_121 = v[1];
799+ if("Cons" !== v[2][0]) {
800+ return undefined
801+ }else {
802+ var b_122 = v[2][1];
803+ var cs_123 = v[2][2];
804+ return["Cons", a_121, ["Cons", sep_119, intersperse(sep_119)(["Cons", b_122, cs_123])]]
805+ }
806+ }
807+ }];
808+ for(var i = c.length;i--;) {
809+ var r = c[i](v);
810+ if(r !== undefined) {
811+ return r
812+ }
813+ }
814+ }()
815+ }
816+ }
817+ function intercalate(sep_125) {
818+ return function(xs_126) {
819+ return function() {
820+ var v = xs_126;
821+ var c = [function(v) {
822+ if("Nil" !== v[0]) {
823+ return undefined
824+ }else {
825+ return["Nil"]
826+ }
827+ }, function(v) {
828+ if("Cons" !== v[0]) {
829+ return undefined
830+ }else {
831+ var a_130 = v[1];
832+ if("Nil" !== v[2][0]) {
833+ return undefined
834+ }else {
835+ return a_130
836+ }
837+ }
838+ }, function(v) {
839+ if("Cons" !== v[0]) {
840+ return undefined
841+ }else {
842+ var a_127 = v[1];
843+ if("Cons" !== v[2][0]) {
844+ return undefined
845+ }else {
846+ var b_128 = v[2][1];
847+ var cs_129 = v[2][2];
848+ return Value.append(a_127, Value.append(sep_125, intercalate(sep_125)(["Cons", b_128, cs_129])))
849+ }
850+ }
851+ }];
852+ for(var i = c.length;i--;) {
853+ var r = c[i](v);
854+ if(r !== undefined) {
855+ return r
856+ }
857+ }
858+ }()
859+ }
860+ }
861+ function sort(xs) {
862+ if (xs[0] === "Nil") { return xs; }
863+ if (xs[0] !== "Cons") { throwError('sort'); }
864+ var arr = [];
865+ while (xs[0] === "Cons") {
866+ arr.push(xs[1]);
867+ xs = xs[2];
868+ }
869+ arr.sort(function(a,b) { return a - b});
870+ var out = ["Nil"];
871+ for (var i = arr.length; i--; ) {
872+ out = [ "Cons", arr[i], out ];
873+ }
874+ return out;
875+ }
876+ function take(n) { return function(xs) {
877+ if (n <= 0) { return ["Nil"]; }
878+ if (xs[0] === "Nil") { return xs; }
879+ if (xs[0] !== "Cons") { throwError('take'); }
880+ var out = [ "Cons", xs[1], ["Nil"] ];
881+ var temp = out;
882+ xs = xs[2];
883+ --n;
884+ while (xs[0] === "Cons" && n > 0) {
885+ temp[2] = [ "Cons", xs[1], ["Nil"] ];
886+ temp = temp[2];
887+ xs = xs[2];
888+ --n;
889+ }
890+ return out;
891+ };
892+ }
893+ function drop(n) { return function(xs) {
894+ if (xs[0] === "Nil") { return xs; }
895+ if (xs[0] !== "Cons") { throwError('drop'); }
896+ while (xs[0] === "Cons" && n > 0) {
897+ xs = xs[2];
898+ --n;
899+ }
900+ return xs;
901+ };
902+ }
903+ return {head:head,
904+ tail:tail,
905+ last:last,
906+ map:map,
907+ foldl:foldl,
908+ foldr:foldr,
909+ foldl1:foldl1,
910+ foldr1:foldr1,
911+ scanl:scanl,
912+ scanl1:scanl1,
913+ filter:filter,
914+ length:length,
915+ reverse:reverse,
916+ concat:concat,
917+ concatMap:concatMap,
918+ and:and,
919+ or:or,
920+ forall:forall,
921+ exists:exists,
922+ sum:sum,
923+ product:product,
924+ maximum:maximum,
925+ minimum:minimum,
926+ partition:partition,
927+ zipWith:zipWith,
928+ zip:zip,
929+ unzip:unzip,
930+ intersperse:intersperse,
931+ intercalate:intercalate,
932+ sort:sort,
933+ take:take,
934+ drop:drop};
935+}();
936+var Data = function() {
937+
938+var Char = function() {
939+ return {fromCode : function(c) { return String.fromCharCode(c); },
940+ toCode : function(c) { return c.charCodeAt(0); },
941+ toUpper : function(c) { return c.toUpperCase(); },
942+ toLower : function(c) { return c.toLowerCase(); },
943+ toLocaleUpper : function(c) { return c.toLocaleUpperCase(); },
944+ toLocaleLower : function(c) { return c.toLocaleLowerCase(); }
945+ };
946+}();
947+
948+var Maybe = function() {
949+ function consMaybe(x) { return function(xs) {
950+ if (x[0] === "Just") return ["Cons", x[1], xs];
951+ return xs;
952+ };
953+ }
954+ function fromMaybe(b) { return function(m) {
955+ if (m[0] === "Just") return m[1];
956+ return b;
957+ };
958+ }
959+ function mapCons(f) { return function(y) { return function(xs) {
960+ var x = f(y);
961+ if (x[0] === "Just") return ["Cons", x[1], xs];
962+ return xs;
963+ };
964+ };
965+ }
966+ function maybe(b) { return function(f) { return function(m) {
967+ if (m[0] === "Just") return f(m[1]);
968+ return b;
969+ };
970+ };
971+ }
972+
973+ return {Just : function(x) { return ["Just",x]; },
974+ Nothing : ["Nothing"],
975+ catMaybes : List.foldr(consMaybe)(["Nil"]),
976+ isJust : function(m) { return m[0] === "Just"; },
977+ isNothing : function(m) { return m[0] === "Nothing"; },
978+ fromMaybe : fromMaybe,
979+ consMaybe : consMaybe,
980+ mapMaybe : function(f) { return List.foldr(mapCons(f))(["Nil"]); },
981+ maybe : maybe
982+ };
983+}();
984+
985+/*
986+var String = function() {
987+
988+ function append(s1) { return function(s2) {
989+ return s1.concat(s2);
990+ };
991+ }
992+ function map(f) { return function(s) {
993+ for (var i = s.length; i--; ) { s[i] = f(s[i]); }
994+ };
995+ }
996+
997+ function intercalate(sep) { return function(ss) {
998+ return Value.listToArray(ss).join(sep);
999+ };
1000+ }
1001+ function intersperse(sep) { return function(s) {
1002+ return s.split("").join(sep);
1003+ };
1004+ }
1005+
1006+ function foldl(f) { return function(b) { return function(s) {
1007+ var acc = b;
1008+ for (var i = 0, len = s.length; i < len; ++i) { acc = f(s[i])(acc); }
1009+ return acc;
1010+ };
1011+ };
1012+ }
1013+ function foldr(f) { return function(b) { return function(s) {
1014+ var acc = b;
1015+ for (var i = s.length; i--; ) { acc = f(s[i])(acc); }
1016+ return acc;
1017+ };
1018+ };
1019+ }
1020+
1021+ function concatMap(f) { return function(s) {
1022+ var a = s.split("");
1023+ for (var i = a.length; i--; ) { a[i] = f(a[i]); }
1024+ return a.join("");
1025+ };
1026+ }
1027+
1028+ function forall(pred) { return function(s) {
1029+ for (var i = s.length; i--; ) { if (!pred(s[i])) {return false}; }
1030+ return true;
1031+ };
1032+ }
1033+ function exists(pred) { return function(s) {
1034+ for (var i = s.length; i--; ) { if (pred(s[i])) {return true}; }
1035+ return false;
1036+ };
1037+ }
1038+
1039+ return {cons : append,
1040+ snoc : append,
1041+ head : function(s) { return s[0]; },
1042+ last : function(s) { return s[s.length-1]; },
1043+ tail : function(s) { return s.slice(1); },
1044+ length : function(s) { return s.length; },
1045+ map : map,
1046+ intercalate : intercalate,
1047+ intersperse : intersperse,
1048+ reverse : function(s) { return s.split("").reverse().join(""); },
1049+ toLower : function(s) { return s.toLowerCase(); },
1050+ toUpper : function(s) { return s.toUpperCase(); },
1051+ foldl : foldl,
1052+ foldr : foldr,
1053+ concat : function(ss) { return Value.listToArray(ss).join(""); },
1054+ concatMap : concatMap,
1055+ forall : forall,
1056+ exists : exists,
1057+ //filter : filter,
1058+ //take:,
1059+ //drop:,
1060+ toText : Value.toText,
1061+ properEscape : Value.properEscape
1062+ };
1063+}();
1064+*/
1065+return {String: {toText:Value.toText, properEscape:Value.properEscape},
1066+ Char:Char,
1067+ Maybe:Maybe,
1068+ List:List
1069+ };
1070+}();var ElmCode = ElmCode || {};
1071+ElmCode.Graphics = ElmCode.Graphics || {};
1072+ElmCode.Graphics.Color = function() {
1073+ function Color_0(a1) {
1074+ return function(a2) {
1075+ return function(a3) {
1076+ return function(a4) {
1077+ return["Color", a1, a2, a3, a4]
1078+ }
1079+ }
1080+ }
1081+ }
1082+ var rgba_1 = Color_0;
1083+ var red_3 = ["Color",255,0,0,1];
1084+ var green_4 = ["Color",0,255,0,1];
1085+ var blue_5 = ["Color",0,0,255,1];
1086+ var yellow_6 = ["Color",255,255,0,1];
1087+ var cyan_7 = ["Color",0,255,255,1];
1088+ var magenta_8 = ["Color",255,0,255,1];
1089+ var black_9 = ["Color",0,0,0,1];
1090+ var white_10 = ["Color",255,255,255,1];
1091+ var gray_11 = ["Color",128,128,128,1];
1092+ var grey_12 = ["Color",128,128,128,1];
1093+ function rgb_2(r_13) {
1094+ return function(g_14) {
1095+ return function(b_15) {
1096+ return ["Color",r_13,g_14,b_15,1]
1097+ }
1098+ }
1099+ }
1100+ function extract(c) {
1101+ if (c[4] === 1) { return 'rgb(' + c[1] + ',' + c[2] + ',' + c[3] + ')'; }
1102+ return 'rgba(' + c[1] + ',' + c[2] + ',' + c[3] + ',' + c[4] + ')';
1103+ }
1104+ return{rgba:rgba_1, rgb:rgb_2, red:red_3, green:green_4, blue:blue_5, yellow:yellow_6, cyan:cyan_7, magenta:magenta_8, black:black_9, white:white_10, gray:gray_11, grey:grey_12,extract:extract}
1105+}();
1106+var Collage = function() {
1107+
1108+function tracePoints(ctx,points) {
1109+ var i = points.length - 1;
1110+ if (i <= 0) return;
1111+ ctx.moveTo(points[i][1], points[i][2]);
1112+ while (i--) { ctx.lineTo(points[i][1], points[i][2]); }
1113+}
1114+
1115+function solid(ctx,color,points) {
1116+ tracePoints(ctx,points);
1117+ ctx.strokeStyle = ElmCode.Graphics.Color.extract(color);
1118+ ctx.stroke();
1119+};
1120+
1121+function filled(ctx,color,points) {
1122+ tracePoints(ctx,points);
1123+ ctx.fillStyle = ElmCode.Graphics.Color.extract(color);
1124+ ctx.fill();
1125+}
1126+
1127+function textured(redo,ctx,src,points) {
1128+ var img = new Image();
1129+ img.src = Foreign.JavaScript.castStringToJSString(src);
1130+ img.onload = redo;
1131+
1132+ tracePoints(ctx,points);
1133+ ctx.fillStyle = ctx.createPattern(img,'repeat');
1134+ ctx.fill();
1135+}
1136+
1137+function customLine(pattern,ctx,color,points) {
1138+ if (pattern.length === 0) { pattern = [8,4]; }
1139+ customLineHelp(ctx, pattern, points);
1140+ ctx.strokeStyle = ElmCode.Graphics.Color.extract(color);
1141+ ctx.stroke();
1142+};
1143+
1144+var customLineHelp = function(ctx, pattern, points) {
1145+ var i = points.length - 1;
1146+ if (i <= 0) return;
1147+ var x0 = points[i][1], y0 = points[i][2];
1148+ var x1=0, y1=0, dx=0, dy=0, remaining=0, nx=0, ny=0;
1149+ var pindex = 0, plen = pattern.length;
1150+ var draw = true, segmentLength = pattern[0];
1151+ ctx.moveTo(x0,y0);
1152+ while (i--) {
1153+ x1 = points[i][1]; y1 = points[i][2];
1154+ dx = x1 - x0; dy = y1 - y0;
1155+ remaining = Math.sqrt(dx * dx + dy * dy);
1156+ while (segmentLength <= remaining) {
1157+ x0 += dx * segmentLength / remaining;
1158+ y0 += dy * segmentLength / remaining;
1159+ ctx[draw ? 'lineTo' : 'moveTo'](x0, y0);
1160+ // update starting position
1161+ dx = x1 - x0; dy = y1 - y0;
1162+ remaining = Math.sqrt(dx * dx + dy * dy);
1163+ // update pattern
1164+ draw = !draw;
1165+ pindex = (pindex + 1) % plen;
1166+ segmentLength = pattern[pindex];
1167+ }
1168+ if (remaining > 0) {
1169+ ctx[draw ? 'lineTo' : 'moveTo'](x1, y1);
1170+ segmentLength -= remaining;
1171+ }
1172+ x0 = x1; y0 = y1;
1173+ }
1174+};
1175+
1176+function drawLine(ctx,form) {
1177+ var points = Foreign.JavaScript.castListToJSArray(form[3][1]);
1178+ switch(form[1][0]) {
1179+ case "Solid" : return solid(ctx,form[2],points);
1180+ case "Dotted": return customLine([3,3],ctx,form[2],points);
1181+ case "Dashed": return customLine([8,4],ctx,form[2],points);
1182+ case "Custom":
1183+ var pattern = Foreign.JavaScript.castListToJSArray(form[1][1]);
1184+ customLine(pattern,ctx,form[2],points);
1185+ }
1186+};
1187+
1188+function drawShape(redo,ctx,shapeStyle,color,points) {
1189+ points = Foreign.JavaScript.castListToJSArray(points);
1190+ if (points.length > 0) points.push(points[0]);
1191+ switch(shapeStyle[0]) {
1192+ case "Filled": return filled(ctx,color,points);
1193+ case "Outlined": return solid(ctx,color,points);
1194+ case "Textured": return textured(redo,ctx,shapeStyle[1],points);
1195+ case "CustomOutline":
1196+ var pattern = Foreign.JavaScript.castListToJSArray(shapeStyle[1]);
1197+ customLine(pattern,ctx,color,points);
1198+ }
1199+};
1200+
1201+function drawImage(redo,ctx,w,h,src) {
1202+ var img = new Image();
1203+ img.onload = redo;
1204+ img.src = Foreign.JavaScript.castStringToJSString(src);
1205+ ctx.drawImage(img,-w/2,-h/2,w,h);
1206+}
1207+
1208+function renderForm(redo,ctx,theta,scale,x,y,form) {
1209+ ctx.save();
1210+ if (x !== 0 || y !== 0) ctx.translate(x,y);
1211+ if (theta !== ~~theta) ctx.rotate(2*Math.PI*theta);
1212+ if (scale !== 1) ctx.scale(scale,scale);
1213+ ctx.beginPath();
1214+ switch(form[0]) {
1215+ case "FLine": drawLine(ctx,form); break;
1216+ case "FShape": drawShape(redo,ctx,form[1],form[2],form[3][1]); break;
1217+ case "FImage": drawImage(redo,ctx,form[1],form[2],form[3]); break;
1218+ }
1219+ ctx.restore();
1220+};
1221+
1222+function renderForms(redo,ctx,w,h,forms) {
1223+ ctx.clearRect(0,0,w,h);
1224+ for (var i = forms.length; i--; ) {
1225+ var f = forms[i];
1226+ renderForm(redo,ctx,f[1],f[2],f[3][1],f[3][2],f[4]);
1227+ }
1228+}
1229+
1230+function collageForms(w,h,forms) {
1231+ var canvas = Render.newElement('canvas');
1232+ canvas.style.width = (~~w) + 'px';
1233+ canvas.style.height = (~~h) + 'px';
1234+ canvas.style.display = "block";
1235+ canvas.width = ~~w;
1236+ canvas.height = ~~h;
1237+ if (canvas.getContext) {
1238+ var ctx = canvas.getContext('2d');
1239+ var w = canvas.width, h = canvas.height;
1240+ function redo() { renderForms(this,ctx,w,h,forms); }
1241+ renderForms(redo,ctx,w,h,forms);
1242+ return canvas;
1243+ }
1244+ canvas.innerHTML = "Your browser does not support the canvas element.";
1245+ return canvas;
1246+};
1247+
1248+function collageElement(w,h,theta,scale,x,y,elem) {
1249+ var e = Render.render(elem);
1250+ var t = "translate(" + (x - elem[3] / 2) + "px,"+ (y - elem[4] / 2) + "px)";
1251+ var r = theta === (~~theta) ? "" : "rotate(" + theta*360 + "deg)";
1252+ var s = scale === 1 ? "" : "scale(" + scale + "," + scale + ")";
1253+ var transforms = t + " " + s + " " + r;
1254+ e.style.transform = transforms;
1255+ e.style.msTransform = transforms;
1256+ e.style.MozTransform = transforms;
1257+ e.style.webkitTransform = transforms;
1258+ e.style.OTransform = transforms;
1259+ var div = Render.newElement('div');
1260+ Render.addTo(div,e);
1261+ div.style.width = (~~w) + "px";
1262+ div.style.height = (~~h) + "px";
1263+ div.style.overflow = "hidden";
1264+ return div;
1265+}
1266+
1267+function collage(w,h,formss) {
1268+ if (formss.length === 0) { return collageForms(w,h,[]); }
1269+ var elems = new Array(formss.length);
1270+ for (var i = formss.length; i--; ) {
1271+ var f = formss[i];
1272+ if (typeof f[0] === "string") {
1273+ elems[i] = collageElement(w,h,f[1],f[2],f[3][1],f[3][2],f[4][1]);
1274+ } else {
1275+ elems[i] = collageForms(w,h,f);
1276+ }
1277+ }
1278+ if (formss.length === 1) { return elems[0]; }
1279+ return Render.flowWith(Render.goIn,function(x){return x},elems);
1280+}
1281+
1282+function updateFormSet(node,currSet,nextSet) {
1283+ if (Value.eq(nextSet,currSet)) return;
1284+ var w = node.style.width.slice(0,-2) - 0;
1285+ var h = node.style.height.slice(0,-2) - 0;
1286+ if (typeof nextSet[0] === "object") {
1287+ if (typeof currSet[0] === "object") {
1288+ if (node.getContext) {
1289+ var ctx = node.getContext('2d');
1290+ function redo() { renderForms(this,ctx,w,h,nextSet); }
1291+ return renderForms(redo,ctx,w,h,nextSet);
1292+ }
1293+ }
1294+ var newNode = collageForms(w,h,nextSet);
1295+ newNode.style.position = 'absolute';
1296+ return node.parentNode.replaceChild(newNode,node);
1297+ }
1298+ var f = nextSet;
1299+ var newNode = collageElement(w,h,f[1],f[2],f[3][1],f[3][2],f[4][1]);
1300+ newNode.style.position = 'absolute';
1301+ return node.parentNode.replaceChild(newNode,node);
1302+}
1303+
1304+// assumes that the form sets are the same length.
1305+function updateCollage(node,currs,nexts) {
1306+ if (nexts.length === 1) {
1307+ return updateFormSet(node,currs[0],nexts[0]);
1308+ }
1309+ var kids = node.childNodes;
1310+ var len = kids.length;
1311+ for (var i = len; i--; ) {
1312+ updateFormSet(kids[len-i-1], currs[i], nexts[i]);
1313+ }
1314+}
1315+
1316+return {collage:collage, updateCollage:updateCollage};
1317+
1318+}();var ElmCode = ElmCode || {};
1319+ElmCode.Graphics = ElmCode.Graphics || {};
1320+ElmCode.Graphics.Element = function() {
1321+ var DLeft_0 = ["DLeft"];
1322+ var DRight_1 = ["DRight"];
1323+ var DUp_2 = ["DUp"];
1324+ var DDown_3 = ["DDown"];
1325+ var DIn_4 = ["DIn"];
1326+ var DOut_5 = ["DOut"];
1327+ function Absolute_12(a1) {
1328+ return["Absolute", a1]
1329+ }
1330+ function Relative_13(a1) {
1331+ return["Relative", a1]
1332+ }
1333+ var Near_14 = ["Near"];
1334+ var Mid_15 = ["Mid"];
1335+ var Far_16 = ["Far"];
1336+ function Position_17(a1) {
1337+ return function(a2) {
1338+ return["Position", a1, a2]
1339+ }
1340+ }
1341+ function PositionTL_18(a1) {
1342+ return function(a2) {
1343+ return["PositionTL", a1, a2]
1344+ }
1345+ }
1346+ function PositionTR_19(a1) {
1347+ return function(a2) {
1348+ return["PositionTR", a1, a2]
1349+ }
1350+ }
1351+ function PositionBL_20(a1) {
1352+ return function(a2) {
1353+ return["PositionBL", a1, a2]
1354+ }
1355+ }
1356+ function PositionBR_21(a1) {
1357+ return function(a2) {
1358+ return["PositionBR", a1, a2]
1359+ }
1360+ }
1361+ function Element_37(id,e,w,h,o,c,l) {
1362+ return["Element", id, e, w, h, o, c, l ]
1363+ }
1364+ function EText_39(a1) {
1365+ return function(a2) {
1366+ return["EText", a1, a2]
1367+ }
1368+ }
1369+ function EImage_40(a1) {
1370+ return["EImage", Foreign.JavaScript.castStringToJSString(a1)]
1371+ }
1372+ function EVideo_41(a1) {
1373+ return["EVideo", Foreign.JavaScript.castStringToJSString(a1)]
1374+ }
1375+ function EFittedImage_42(a1) {
1376+ return["EFittedImage", Foreign.JavaScript.castStringToJSString(a1)]
1377+ }
1378+ function EFlow_43(a1) {
1379+ return function(a2) {
1380+ return["EFlow", a1, Foreign.JavaScript.castListToJSArray(a2)]
1381+ }
1382+ }
1383+ function ECollage_44(a1) {
1384+ return function(a2) {
1385+ return function(a3) {
1386+ return["ECollage", a1, a2, Value.groupForms(a3)]
1387+ }
1388+ }
1389+ }
1390+ var EEmpty_45 = ["EEmpty"];
1391+ function EContainer_46(a1) {
1392+ return function(a2) {
1393+ return["EContainer", a1, a2]
1394+ }
1395+ }
1396+ var Solid_68 = ["Solid"];
1397+ var Dotted_69 = ["Dotted"];
1398+ var Dashed_70 = ["Dashed"];
1399+ function Custom_71(a1) {
1400+ return["Custom", a1]
1401+ }
1402+ var Filled_72 = ["Filled"];
1403+ var Outlined_73 = ["Outlined"];
1404+ function CustomOutline_74(a1) {
1405+ return["CustomOutline", a1]
1406+ }
1407+ function Line_75(a1) {
1408+ return["Line", a1]
1409+ }
1410+ function Shape_78(a1) {
1411+ return function(a2) {
1412+ return["Shape", a1, a2]
1413+ }
1414+ }
1415+ function Form_84(a1) {
1416+ return function(a2) {
1417+ return function(a3) {
1418+ return function(a4) {
1419+ return["Form", a1, a2, a3, a4]
1420+ }
1421+ }
1422+ }
1423+ }
1424+ function FLine_85(a1) {
1425+ return function(a2) {
1426+ return function(a3) {
1427+ return["FLine", a1, a2, a3]
1428+ }
1429+ }
1430+ }
1431+ function FShape_86(a1) {
1432+ return function(a2) {
1433+ return function(a3) {
1434+ return["FShape", a1, a2, a3]
1435+ }
1436+ }
1437+ }
1438+ function FImage_87(a1) {
1439+ return function(a2) {
1440+ return function(a3) {
1441+ return["FImage", a1, a2, Foreign.JavaScript.castStringToJSString(a3)]
1442+ }
1443+ }
1444+ }
1445+ function FElement_88(a1) {
1446+ return["FElement", a1]
1447+ }
1448+ var left_6 = DLeft_0;
1449+ var right_7 = DRight_1;
1450+ var down_8 = DDown_3;
1451+ var up_9 = DUp_2;
1452+ var inward_10 = DIn_4;
1453+ var outward_11 = DOut_5;
1454+ var topLeft_22 = Position_17(Near_14)(Near_14);
1455+ var topRight_23 = Position_17(Far_16)(Near_14);
1456+ var bottomLeft_24 = Position_17(Near_14)(Far_16);
1457+ var bottomRight_25 = Position_17(Far_16)(Far_16);
1458+ var midLeft_26 = Position_17(Near_14)(Mid_15);
1459+ var midRight_27 = Position_17(Far_16)(Mid_15);
1460+ var midTop_28 = Position_17(Mid_15)(Near_14);
1461+ var midBottom_29 = Position_17(Mid_15)(Far_16);
1462+ var middle_30 = Position_17(Mid_15)(Mid_15);
1463+ function middleAt(a1) {
1464+ return function(a2) {
1465+ return["PositionAt", a1, a2]
1466+ }
1467+ }
1468+ var topLeftAt_31 = PositionTL_18;
1469+ var topRightAt_32 = PositionTR_19;
1470+ var bottomLeftAt_33 = PositionBL_20;
1471+ var bottomRightAt_34 = PositionBR_21;
1472+ var absolute_35 = Absolute_12;
1473+ var relative_36 = Relative_13;
1474+ function newElement_38(e,w,h,o,c,l) { return Element_37(Guid.guid(),e,w,h,o,c,l); }
1475+ function basicNewElement(e,w,h) { return Element_37(Guid.guid(),e,w,h,1,Nothing,Nothing); }
1476+ var line_76 = Line_75;
1477+ var polygon_79 = Shape_78;
1478+ function sprite_96(src) {
1479+ return function(w) {
1480+ return function(h) {
1481+ return function(pos) {
1482+ return Form_84(0)(1)(pos)(FImage_87(w)(h)(src))
1483+ }
1484+ }
1485+ }
1486+ }
1487+ function toForm_97(pos) {
1488+ return function(e) {
1489+ return Form_84(0)(1)(pos)(FElement_88(e))
1490+ }
1491+ }
1492+ function width_47(w__101) {
1493+ return function(e) {
1494+ var be = e[2];
1495+ switch(be[0]) {
1496+ case "EImage":
1497+ case "EVideo":
1498+ return newElement_38(e[2],w__101,e[4] * w__101 / e[3], e[5], e[6], e[7]);
1499+ case "EText":
1500+ var p = Value.getTextSize(w__101,e[4],be[2]);
1501+ return newElement_38(e[2], w__101, p[1], e[5], e[6], e[7]);
1502+ }
1503+ return newElement_38(e[2], w__101, e[4], e[5], e[6], e[7]);
1504+ }
1505+ }
1506+ function height_48(h__108) {
1507+ return function(e) {
1508+ var be = e[2];
1509+ switch(be[0]) {
1510+ case "EImage":
1511+ case "EVideo":
1512+ return newElement_38(e[2], e[3] * h__108 / e[4], h__108, e[5], e[6], e[7]);
1513+ }
1514+ return newElement_38(e[2], e[3], h__108, e[5], e[6], e[7]);
1515+ }
1516+ }
1517+ function size_49(w) {
1518+ return function(h) {
1519+ return function(e) {
1520+ return newElement_38(e[2], w, h, e[5], e[6], e[7]);
1521+ }
1522+ }
1523+ }
1524+ function opacity_50(o) {
1525+ return function(e) {
1526+ return newElement_38(e[2], e[3], e[4], o, e[6], e[7]);
1527+ }
1528+ }
1529+ function color_51(c) {
1530+ return function(e) {
1531+ return newElement_38(e[2], e[3], e[4], e[5], Just(c), e[7]);
1532+ }
1533+ }
1534+ function link(lnk) {
1535+ return function(e) {
1536+ return newElement_38(e[2], e[3], e[4], e[5], e[6], Just(Foreign.JavaScript.castStringToJSString(lnk)));
1537+ }
1538+ }
1539+ function widthOf_52(e) { return ~~e[3]; }
1540+ function heightOf_53(e) { return ~~e[4]; }
1541+ function sizeOf_54(e) { return["Tuple2", ~~e[3], ~~e[4]] }
1542+ function text_56(txt) {
1543+ var p = Value.getTextSize(-1,-1,txt);
1544+ return basicNewElement(EText_39("left")(txt), p[0], p[1])
1545+ }
1546+ function plainText(str) {
1547+ var txt = Value.toText(str);
1548+ var p = Value.getTextSize(-1,-1,txt);
1549+ return basicNewElement(EText_39("left")(txt),p[0],p[1])
1550+ }
1551+ function asText(v) {
1552+ var txt = Value.show(v);
1553+ var p = Value.getTextSize(-1,-1,txt);
1554+ return basicNewElement(EText_39("left")(txt),p[0],p[1])
1555+ }
1556+ function centeredText(txt) {
1557+ var p = Value.getTextSize(-1,-1,txt);
1558+ return basicNewElement(EText_39("center")(txt),p[0],p[1])
1559+ }
1560+ function justifiedText(txt) {
1561+ var p = Value.getTextSize(-1,-1,txt);
1562+ return basicNewElement(EText_39("justify")(txt),p[0],p[1])
1563+ }
1564+ function rightedText(txt) {
1565+ var p = Value.getTextSize(-1,-1,txt);
1566+ return basicNewElement(EText_39("right")(txt),p[0],p[1])
1567+ }
1568+ function image_57(w) {
1569+ return function(h) {
1570+ return function(src) {
1571+ return basicNewElement(EImage_40(src),w,h)
1572+ }
1573+ }
1574+ }
1575+ function video_58(w) {
1576+ return function(h) {
1577+ return function(src) {
1578+ return basicNewElement(EVideo_41(src),w,h)
1579+ }
1580+ }
1581+ }
1582+ function fittedImage_59(w_147) {
1583+ return function(h_148) {
1584+ return function(s_149) {
1585+ return basicNewElement(EFittedImage_42(s_149),w_147,h_148)
1586+ }
1587+ }
1588+ }
1589+ function flow_60(dir_150) {
1590+ return function(es_151) {
1591+ return function() {
1592+ var w_152 = function() {
1593+ var ws_154 = map(widthOf_52)(es_151);
1594+ return function(case1) {
1595+ var case0 = case1;
1596+ switch(case0[0]) {
1597+ case "DLeft":
1598+ return sum(ws_154);
1599+ case "DRight":
1600+ return sum(ws_154)
1601+ }
1602+ return maximum(ws_154)
1603+ }(dir_150)
1604+ }();
1605+ var h_153 = function() {
1606+ var hs_155 = map(heightOf_53)(es_151);
1607+ return function(case3) {
1608+ var case2 = case3;
1609+ switch(case2[0]) {
1610+ case "DDown":
1611+ return sum(hs_155);
1612+ case "DUp":
1613+ return sum(hs_155)
1614+ }
1615+ return maximum(hs_155)
1616+ }(dir_150)
1617+ }();
1618+ return basicNewElement(EFlow_43(dir_150)(es_151), w_152, h_153)
1619+ }()
1620+ }
1621+ }
1622+ function above_61(e1_156) {
1623+ return function(e2_157) {
1624+ return basicNewElement(EFlow_43(DDown_3)(["Cons", e1_156, ["Cons", e2_157, ["Nil"]]]), max(widthOf_52(e1_156))(widthOf_52(e2_157)), heightOf_53(e1_156) + heightOf_53(e2_157))
1625+ }
1626+ }
1627+ function below_62(e1_158) {
1628+ return function(e2_159) {
1629+ return basicNewElement(EFlow_43(DDown_3)(["Cons", e2_159, ["Cons", e1_158, ["Nil"]]]), max(widthOf_52(e1_158))(widthOf_52(e2_159)), heightOf_53(e1_158) + heightOf_53(e2_159))
1630+ }
1631+ }
1632+ function beside_63(e1_160) {
1633+ return function(e2_161) {
1634+ return basicNewElement(EFlow_43(DRight_1)(["Cons", e1_160, ["Cons", e2_161, ["Nil"]]]), widthOf_52(e1_160) + widthOf_52(e2_161), max(heightOf_53(e1_160))(heightOf_53(e2_161)))
1635+ }
1636+ }
1637+ function layers_64(es_162) {
1638+ return basicNewElement(EFlow_43(DOut_5)(es_162), maximum(map(widthOf_52)(es_162)), maximum(map(heightOf_53)(es_162)))
1639+ }
1640+ function collage_65(w_163) {
1641+ return function(h_164) {
1642+ return function(forms_165) {
1643+ return basicNewElement(ECollage_44(w_163)(h_164)(forms_165),w_163,h_164)
1644+ }
1645+ }
1646+ }
1647+ function spacer_66(w_166) {
1648+ return function(h_167) {
1649+ return basicNewElement(EEmpty_45,w_166,h_167)
1650+ }
1651+ }
1652+ function container_67(w_169) {
1653+ return function(h_170) {
1654+ return function(pos_168) {
1655+ return function(e_171) {
1656+ return basicNewElement(EContainer_46(pos_168)(e_171),w_169,h_170)
1657+ }
1658+ }
1659+ }
1660+ }
1661+ function segment_77(p1_172) {
1662+ return function(p2_173) {
1663+ return Line_75(["Cons", p1_172, ["Cons", p2_173, ["Nil"]]])
1664+ }
1665+ }
1666+ function rect_80(w_174) {
1667+ return function(h_175) {
1668+ return function(pos_176) {
1669+ return Shape_78(["Cons", ["Tuple2", 0 - w_174 / 2, 0 - h_175 / 2], ["Cons", ["Tuple2", 0 - w_174 / 2, h_175 / 2], ["Cons", ["Tuple2", w_174 / 2, h_175 / 2], ["Cons", ["Tuple2", w_174 / 2, 0 - h_175 / 2], ["Nil"]]]]])(pos_176)
1670+ }
1671+ }
1672+ }
1673+ function oval_81(w_177) {
1674+ return function(h_178) {
1675+ return function(pos_179) {
1676+ return function() {
1677+ var n_180 = 50;
1678+ return function() {
1679+ function f_181(i_182) {
1680+ return["Tuple2", w_177 / 2 * cos(2 * (pi / n_180) * i_182), h_178 / 2 * sin(2 * (pi / n_180) * i_182)]
1681+ }
1682+ return Shape_78(map(f_181)(function() {
1683+ var lo = 0;
1684+ var hi = n_180 - 1;
1685+ var lst = ["Nil"];
1686+ if(lo <= hi) {
1687+ do {
1688+ var lst = ["Cons", hi, lst]
1689+ }while(hi-- > lo)
1690+ }
1691+ return lst
1692+ }()))(pos_179)
1693+ }()
1694+ }()
1695+ }
1696+ }
1697+ }
1698+ function circle_82(r_183) {
1699+ return oval_81(2 * r_183)(2 * r_183)
1700+ }
1701+ function ngon_83(n_184) {
1702+ return function(r_185) {
1703+ return function(pos_186) {
1704+ return function() {
1705+ var m_187 = toFloat(n_184);
1706+ return function() {
1707+ function f_188(i_189) {
1708+ return["Tuple2", r_185 * cos(2 * (pi / m_187) * i_189), r_185 * sin(2 * (pi / m_187) * i_189)]
1709+ }
1710+ return Shape_78(map(f_188)(function() {
1711+ var lo = 0;
1712+ var hi = n_184 - 1;
1713+ var lst = ["Nil"];
1714+ if(lo <= hi) {
1715+ do {
1716+ var lst = ["Cons", hi, lst]
1717+ }while(hi-- > lo)
1718+ }
1719+ return lst
1720+ }()))(pos_186)
1721+ }()
1722+ }()
1723+ }
1724+ }
1725+ }
1726+ function solid_89(clr_190) {
1727+ return function(ln_191) {
1728+ return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Solid_68)(clr_190)(ln_191))
1729+ }
1730+ }
1731+ function dotted_90(clr_192) {
1732+ return function(ln_193) {
1733+ return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Dotted_69)(clr_192)(ln_193))
1734+ }
1735+ }
1736+ function dashed_91(clr_194) {
1737+ return function(ln_195) {
1738+ return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Dashed_70)(clr_194)(ln_195))
1739+ }
1740+ }
1741+ function customLine_92(pattern_196) {
1742+ return function(clr_197) {
1743+ return function(ln_198) {
1744+ return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Custom_71(pattern_196))(clr_197)(ln_198))
1745+ }
1746+ }
1747+ }
1748+ function filled_93(clr) {
1749+ return function(shape) {
1750+ return Form_84(0)(1)(shape[2])(FShape_86(Filled_72)(clr)(shape));
1751+ }
1752+ }
1753+ function outlined_94(clr) {
1754+ return function(shape) {
1755+ return Form_84(0)(1)(shape[2])(FShape_86(Outlined_73)(clr)(shape));
1756+ }
1757+ }
1758+ function customOutline_95(pattern) {
1759+ return function(clr) {
1760+ return function(shape) {
1761+ return Form_84(0)(1)(shape[2])(FShape_86(["CustomOutline",pattern])(clr)(shape));
1762+ }
1763+ }
1764+ }
1765+ function textured(src) {
1766+ return function(shape) {
1767+ return Form_84(0)(1)(shape[2])(FShape_86(["Textured",src])(null)(shape));
1768+ }
1769+ }
1770+ function rotate_98(t_212) {
1771+ return function(Form$thetascaleposform_213) {
1772+ return function(case5) {
1773+ var case0 = case5;
1774+ switch(case0[0]) {
1775+ case "Form":
1776+ var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
1777+ return Form_84(t_212 + case1)(case2)(case3)(case4)
1778+ }
1779+ throw"Non-exhaustive pattern match in case";
1780+ }(Form$thetascaleposform_213)
1781+ }
1782+ }
1783+ function scale_99(s) {
1784+ return function(form) {
1785+ return Form_84(form[1])(s * form[2])(form[3])(form[4])
1786+ }
1787+ }
1788+ function move_100(x_224) {
1789+ return function(y_225) {
1790+ return function(Form$thetascaleTuple2$pxpyform_226) {
1791+ return function(case7) {
1792+ var case0 = case7;
1793+ switch(case0[0]) {
1794+ case "Form":
1795+ var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
1796+ switch(case3[0]) {
1797+ case "Tuple2":
1798+ var case5 = case3[1], case6 = case3[2];
1799+ return Form_84(case1)(case2)(["Tuple2", x_224 + case5, y_225 + case6])(case4)
1800+ }
1801+ break
1802+ }
1803+ throw"Non-exhaustive pattern match in case";
1804+ }(Form$thetascaleTuple2$pxpyform_226)
1805+ }
1806+ }
1807+ }
1808+ return{left:left_6, right:right_7, down:down_8, up:up_9, inward:inward_10, outward:outward_11, topLeft:topLeft_22, topRight:topRight_23, bottomLeft:bottomLeft_24, bottomRight:bottomRight_25, midLeft:midLeft_26, midRight:midRight_27, midTop:midTop_28, midBottom:midBottom_29, middle:middle_30, middleAt:middleAt, topLeftAt:topLeftAt_31, topRightAt:topRightAt_32, bottomLeftAt:bottomLeftAt_33, bottomRightAt:bottomRightAt_34, absolute:absolute_35, relative:relative_36, width:width_47, height:height_48, size:size_49, opacity:opacity_50,
1809+ color:color_51, link:link, widthOf:widthOf_52, heightOf:heightOf_53, sizeOf:sizeOf_54, text:text_56, asText:asText, plainText:plainText, centeredText:centeredText, justifiedText:justifiedText, rightedText:rightedText, image:image_57, video:video_58, fittedImage:fittedImage_59, flow:flow_60, above:above_61, below:below_62, beside:beside_63, layers:layers_64, collage:collage_65, spacer:spacer_66, container:container_67, line:line_76, segment:segment_77, polygon:polygon_79, rect:rect_80, oval:oval_81, circle:circle_82, ngon:ngon_83, solid:solid_89, dotted:dotted_90, dashed:dashed_91, customLine:customLine_92, filled:filled_93,
1810+ outlined:outlined_94, customOutline:customOutline_95, textured:textured, sprite:sprite_96, toForm:toForm_97, rotate:rotate_98, scale:scale_99, move:move_100}
1811+}();
1812+var Text = function() {
1813+ function fromString(s) { return Value.toText(s); }
1814+
1815+ var addTag = function(tag) { return function(text) {
1816+ return '<' + tag + ' style="padding:0;margin:0">' + text + '</' + tag + '>';
1817+ };
1818+ };
1819+ var addStyle = function(style, value) { return function(text) {
1820+ return "<span style='" + style + ":" + value + "'>" + text + "</span>";
1821+ };
1822+ };
1823+
1824+ var typeface = function(name) { return addStyle('font-family', name); };
1825+ var size = function(px) {
1826+ return addStyle('font-size', px + 'px');
1827+ };
1828+ var header = addTag('h1');
1829+ var height = function(h) { return addStyle('font-size', h+'em'); }
1830+ var italic = addStyle('font-style', 'italic');
1831+ var bold = addTag('b');
1832+ var color = function(c) {
1833+ return addStyle('color', ElmCode.Graphics.Color.extract(c));
1834+ };
1835+ var underline = addStyle('text-decoration', 'underline');
1836+ var overline = addStyle('text-decoration', 'overline');
1837+ var strikeThrough = addStyle('text-decoration', 'line-through');
1838+ var link = function(href) { return function(text) {
1839+ return "<a href='" + fromString(href) + "'>" + text + "</a>";
1840+ };
1841+ };
1842+
1843+ return {fromString : fromString,
1844+ toText: fromString,
1845+ header : header,
1846+ height : height,
1847+ italic : italic,
1848+ bold : bold,
1849+ underline : underline,
1850+ overline : overline,
1851+ strikeThrough : strikeThrough,
1852+ monospace : typeface('monospace'),
1853+ typeface : typeface,
1854+ color : color,
1855+ link : link };
1856+}();
1857+var Render = function(){
1858+
1859+function newElement(elementType) {
1860+ var e = document.createElement(elementType);
1861+ e.style.padding = "0";
1862+ e.style.margin = "0";
1863+ return e;
1864+};
1865+
1866+function addTo(container, elem) {
1867+ container.appendChild(elem);
1868+};
1869+
1870+function makeText(pos,txt) {
1871+ var e = newElement('div');
1872+ e.innerHTML = txt;
1873+ e.style.textAlign = pos;
1874+ return e;
1875+};
1876+
1877+function image(src) {
1878+ var img = newElement('img');
1879+ img.src = src;
1880+ img.name = src;
1881+ img.style.display = "block";
1882+ return img;
1883+}
1884+
1885+function fittedImage(w,h,src) {
1886+ var canvas = newElement('canvas');
1887+ canvas.style.display = "block";
1888+ canvas.style.width = w + 'px';
1889+ canvas.style.height = h + 'px';
1890+ canvas.width = w;
1891+ canvas.height = h;
1892+ canvas.innerHTML = "Your browser does not support the canvas element.";
1893+
1894+ var img = newElement('img');
1895+ img.onload = function() {
1896+ if (canvas.getContext) {
1897+ var ctx = canvas.getContext('2d');
1898+ var sx = 0, sy = 0, sWidth = this.width, sHeight = this.height;
1899+ if (w / h > this.width / this.height) {
1900+ sHeight = this.width * h / w;
1901+ sy = (this.height - sHeight) / 2;
1902+ } else {
1903+ sWidth = this.height * w / h;
1904+ sx = (this.width - sWidth) / 2;
1905+ }
1906+ ctx.drawImage(img, sx, sy, sWidth, sHeight,
1907+ 0,0, canvas.width, canvas.height);
1908+ }
1909+ };
1910+ img.src = src;
1911+ return canvas;
1912+};
1913+
1914+var video = function(src) {
1915+ var e = newElement('video');
1916+ e.controls = "controls";
1917+ var source = newElement('source');
1918+ source.src = src;
1919+ var segs = src.split('.');
1920+ source.type = "video/" + segs[segs.length-1];
1921+ addTo(e, source);
1922+ e.style.display = "block";
1923+ return e;
1924+};
1925+
1926+function divify(e) {
1927+ var div = newElement('div');
1928+ addTo(div, e);
1929+ return div;
1930+};
1931+function goDown(e) {
1932+ return e //.tagName === "DIV" ? e : divify(e);
1933+};
1934+function goRight(e) {
1935+ e.style.styleFloat = "left";
1936+ e.style.cssFloat = "left";
1937+ return e;
1938+};
1939+function goIn(e) {
1940+ e.style.position = 'absolute';
1941+ return e;
1942+};
1943+function flowWith(f, prep, elist) {
1944+ var container = newElement('div');
1945+ for (var i = elist.length; i--; ) {
1946+ addTo(container, f(prep(elist[i])));
1947+ }
1948+ return container;
1949+};
1950+
1951+function flow(dir,elist) {
1952+ switch(dir) {
1953+ case "DDown": elist = elist.slice(0).reverse();
1954+ case "DUp": return flowWith(goDown,render,elist);
1955+ case "DRight": elist = elist.slice(0).reverse();
1956+ case "DLeft": return flowWith(goRight,render,elist);
1957+ case "DOut": elist = elist.slice(0).reverse();
1958+ case "DIn": return flowWith(goIn,render,elist);
1959+ };
1960+};
1961+
1962+function toPos(pos) {
1963+ switch(pos[0]) {
1964+ case "Absolute": return pos[1] + "px";
1965+ case "Relative": return (pos[1] * 100) + "%";
1966+ }
1967+}
1968+
1969+function setPos(pos,e) {
1970+ e.style.position = 'absolute';
1971+ e.style.margin = 'auto';
1972+ switch(pos[0]) {
1973+ case "Position":
1974+ if (pos[1][0] !== "Far") e.style.left = 0;
1975+ if (pos[1][0] !== "Near") e.style.right = 0;
1976+ if (pos[2][0] !== "Far") e.style.top = 0;
1977+ if (pos[2][0] !== "Near") e.style.bottom = 0;
1978+ break;
1979+ case "PositionAt":
1980+ e.style.top = toPos(pos[2]);
1981+ e.style.left = toPos(pos[1]);
1982+ var shift = "translate(" + (-elem[3]/2) + "px," + (-elem[4]/2) + "px)";
1983+ e.style.transform = shift;
1984+ e.style.msTransform = shift;
1985+ e.style.MozTransform = shift;
1986+ e.style.webkitTransform = shift;
1987+ e.style.OTransform = shift;
1988+ break;
1989+ default:
1990+ var p = pos[0].slice(-2);
1991+ e.style[p[0] === "T" ? 'top' : 'bottom'] = toPos(pos[2]);
1992+ e.style[p[1] === "L" ? 'left' : 'right'] = toPos(pos[1]);
1993+ }
1994+}
1995+
1996+function container(pos,elem) {
1997+ var e = render(elem);
1998+ setPos(pos,e);
1999+ var div = newElement('div');
2000+ div.style.position = "relative";
2001+ div.style.overflow = "hidden";
2002+ addTo(div,e);
2003+ return div;
2004+};
2005+
2006+function render(elem) {
2007+ var e = {};
2008+ switch(elem[2][0]) {
2009+ case "EText": e = makeText(elem[2][1],elem[2][2]); break;
2010+ case "EImage": e = image(elem[2][1]); break;
2011+ case "EVideo": e = video(elem[2][1]); break;
2012+ case "EFittedImage": e = fittedImage(elem[3],elem[4],elem[2][1]); break;
2013+ case "EFlow": e = flow(elem[2][1][0],elem[2][2]); break;
2014+ case "ECollage": e = Collage.collage(elem[2][1],elem[2][2],elem[2][3]); break;
2015+ case "EEmpty": e = newElement('div'); break;
2016+ case "EContainer": e = container(elem[2][1],elem[2][2]); break;
2017+ case "EHtml":
2018+ e = elem[2][1];
2019+ var p = Value.getExcess(e);
2020+ elem[3] -= p[0];
2021+ elem[4] -= p[1];
2022+ break;
2023+ }
2024+ e.id = elem[1];
2025+ e.style.width = (~~elem[3]) + 'px';
2026+ e.style.height = (~~elem[4]) + 'px';
2027+ if (elem[5] !== 1) { e.style.opacity = elem[5]; }
2028+ if (elem[6][0] === "Just") {
2029+ e.style.backgroundColor = ElmCode.Graphics.Color.extract(elem[6][1]);
2030+ }
2031+ if (elem[7][0] === "Just") {
2032+ var a = newElement('a');
2033+ a.href = elem[7][1];
2034+ addTo(a,e);
2035+ return a;
2036+ }
2037+ return e;
2038+};
2039+
2040+function update(node,curr,next) {
2041+ if (node.tagName === 'A') { node = node.firstChild; }
2042+ if (curr[1] === next[1]) return;
2043+ if (curr[2][0] !== next[2][0]) {
2044+ return node.parentNode.replaceChild(render(next),node);
2045+ }
2046+ var nextE = next[2], currE = curr[2];
2047+ switch(nextE[0]) {
2048+ case "EText":
2049+ if (nextE[1] !== currE[1]) node.style.textAlign = nextE[1];
2050+ if (nextE[2] !== currE[2]) node.innerHTML = nextE[2];
2051+ break;
2052+ case "EImage":
2053+ if (nextE[1] !== currE[1]) node.src = nextE[1];
2054+ break;
2055+ case "EVideo":
2056+ case "EFittedImage":
2057+ if (!Value.eq(nextE,currE) || next[3]!==curr[3] || next[4]!==curr[4]) {
2058+ return node.parentNode.replaceChild(render(next),node);
2059+ }
2060+ break;
2061+ case "ECollage":
2062+ if (nextE[1] !== currE[1] || nextE[2] !== currE[2] || nextE[3].length !== currE[3].length) {
2063+ return node.parentNode.replaceChild(render(next),node);
2064+ }
2065+ Collage.updateCollage(node,currE[3],nextE[3]);
2066+ break;
2067+ case "EFlow":
2068+ if (nextE[1] !== currE[1]) {
2069+ return node.parentNode.replaceChild(render(next),node);
2070+ }
2071+ var nexts = nextE[2];
2072+ var kids = node.childNodes;
2073+ if (nexts.length !== kids.length) {
2074+ return node.parentNode.replaceChild(render(next),node);
2075+ }
2076+ var currs = currE[2];
2077+ var goDir = {};
2078+ switch(nextE[1][0]) {
2079+ case "DDown": case "DUp": goDir = goDown; break;
2080+ case "DRight": case "DLeft": goDir = goRight; break;
2081+ case "DOut": case "DIn": goDir = goIn; break;
2082+ }
2083+ for (var i = kids.length; i-- ;) {
2084+ update(kids[i],currs[i],nexts[i]);
2085+ goDir(kids[i]);
2086+ }
2087+ break;
2088+ case "EContainer":
2089+ update(node.childNodes[0],currE[2],nextE[2]);
2090+ setPos(nextE[1],node.childNodes[0]);
2091+ break;
2092+ case "EEmpty":
2093+ break;
2094+ case "EHtml":
2095+ var p = Value.getExcess(node);
2096+ next[3] -= p[0];
2097+ next[4] -= p[1];
2098+ }
2099+ if (next[3] !== curr[3]) node.style.width = (~~next[3]) + 'px';
2100+ if (next[4] !== curr[4]) node.style.height = (~~next[4]) + 'px';
2101+ if (next[5] !== curr[5]) node.style.opacity = next[5];
2102+ if (next[6].length === 2) {
2103+ var clr = ElmCode.Graphics.Color.extract(next[6][1]);
2104+ if (clr !== node.style.backgroundColor) node.style.backgroundColor = clr;
2105+ }
2106+ if (next[7].length === 2) {
2107+ if (curr[7].length === 1 || next[7][1] !== curr[7][1]) node.parentNode.href = next[7][1];
2108+ }
2109+ next[1] = curr[1];
2110+}
2111+
2112+return {render:render,update:update,addTo:addTo,newElement:newElement,flowWith:flowWith,goIn:goIn};
2113+
2114+}();
2115+var Elm = function() {
2116+ var send = function(node, timestep, changed) {
2117+ var kids = node.kids;
2118+ for (var i = kids.length; i--; ) {
2119+ kids[i].recv(timestep, changed, node.id);
2120+ }
2121+ };
2122+ var input = function(base) {
2123+ this.id = Guid.guid();
2124+ this.value = base;
2125+ this.kids = [];
2126+ this.defaultNumberOfKids = 0;
2127+ this.recv = function(timestep, eid, v) {
2128+ var changed = eid === this.id;
2129+ if (changed) { this.value = v; }
2130+ send(this, timestep, changed);
2131+ return changed;
2132+ };
2133+ Dispatcher.inputs.push(this);
2134+ };
2135+ var lift = function(func,args) {
2136+ this.id = Guid.guid();
2137+ this.value = null;
2138+ this.kids = [];
2139+ this.inbox = {};
2140+
2141+ args.reverse();
2142+ this.recalc = function() {
2143+ var f = func;
2144+ for (var i = args.length; i--; ) {
2145+ f = f(args[i].value);
2146+ }
2147+ this.value = f;
2148+ };
2149+ this.recalc();
2150+
2151+ this.recv = function(timestep, changed, parentID) {
2152+ if (!this.inbox.hasOwnProperty(timestep)) {
2153+ this.inbox[timestep] = { changed: false, count: 0 };
2154+ }
2155+ var box = this.inbox[timestep];
2156+ box.count += 1;
2157+ if (changed) { box.changed = true; }
2158+ if (box.count == args.length) {
2159+ if (box.changed) { this.recalc() }
2160+ send(this, timestep, box.changed);
2161+ delete this.inbox[timestep];
2162+ }
2163+ };
2164+ for (var i = args.length; i--; ) {
2165+ args[i].kids.push(this);
2166+ }
2167+ };
2168+ var fold = function(func,base,input) {
2169+ this.id = Guid.guid();
2170+ this.value = base;
2171+ this.kids = [];
2172+ this.recv = function(timestep, changed, parentID) {
2173+ if (changed) { this.value = func(input.value)(this.value); }
2174+ send(this, timestep, changed);
2175+ };
2176+ input.kids.push(this);
2177+ };
2178+
2179+ var dropIf = function(pred,base,input) {
2180+ this.id = Guid.guid();
2181+ this.value = pred(input.value) ? base : input.value;
2182+ this.kids = [];
2183+ this.recv = function(timestep, changed, parentID) {
2184+ var chng = changed && !pred(input.value);
2185+ if (chng) { this.value = input.value; }
2186+ send(this, timestep, chng);
2187+ };
2188+ input.kids.push(this);
2189+ };
2190+ var dropRepeats = function(input) {
2191+ this.id = Guid.guid();
2192+ this.value = input.value;
2193+ this.kids = [];
2194+ this.recv = function(timestep, changed, parentID) {
2195+ var chng = changed && !eq(this.value,input.value);
2196+ if (chng) { this.value = input.value; }
2197+ send(this, timestep, chng);
2198+ };
2199+ input.kids.push(this);
2200+ };
2201+
2202+ var dropWhen = function(s1) { return function(b) { return function(s2) {
2203+ var pairs = new lift(function(x){return function(y){return [x,y];};},[s1,s2]);
2204+ var dropped = new dropIf(function(p){return p[0];},[true,b],pairs);
2205+ return new lift(function(p){return p[1];},[dropped]); }; };
2206+ };
2207+
2208+ var sampleOn = function(s1,s2) {
2209+ this.id = Guid.guid();
2210+ this.value = s2.value;
2211+ this.kids = [];
2212+ this.inbox = {};
2213+
2214+ this.recv = function(timestep, changed, parentID) {
2215+ var chng = changed && parentID === s1.id;
2216+ if (chng) { this.value = s2.value; }
2217+ send(this, timestep, chng);
2218+ };
2219+ s1.kids.push(this);
2220+ s2.kids.push(this);
2221+ };
2222+
2223+ return {Input: function(x) {return new input(x);},
2224+ Lift: function(f,xs){return new lift(f,xs);},
2225+ Fold: function(f,b,x){return new fold(f,b,x);},
2226+ keepIf : function(pred) { return function(base) { return function(sig) {
2227+ return new dropIf(function(x) { return !pred(x)},base,sig); }; }; },
2228+ dropIf : function(pred) { return function(base) { return function(sig) {
2229+ return new dropIf(pred,base,sig); }; }; },
2230+ keepWhen : function(s) { return dropWhen(new lift(function(b){return !b;},[s])); },
2231+ dropWhen : dropWhen,
2232+ dropRepeats : function(s) { return new dropRepeats(s);},
2233+ sampleOn : function(s1) { return function(s2) { return new sampleOn(s1,s2); }; }
2234+ };
2235+}();
2236+
2237+var Dispatcher = function() {
2238+ var program = null;
2239+ var timestep = 0;
2240+ var inputs = [];
2241+ var currentElement = null;
2242+
2243+ var initialize = function() {
2244+ program = ElmCode.main();
2245+ if (!program.hasOwnProperty('recv')) {
2246+ program = Elm.Input(program);
2247+ }
2248+
2249+ currentElement = program.value;
2250+ filterDeadInputs();
2251+
2252+ var content = document.getElementById('content');
2253+ content.appendChild(Render.render(currentElement));
2254+ var w = document.getElementById('widthChecker').offsetWidth;
2255+ if (w !== window.innerWidth) {
2256+ Dispatcher.notify(Window.dimensions.id, Value.Tuple(w, window.innerHeight));
2257+ }
2258+ program = Elm.Lift(function(value) {
2259+ var content = document.getElementById('content');
2260+ Render.update(content.firstChild,currentElement,value);
2261+ currentElement = value;
2262+ return value;
2263+ }, [program]);
2264+ };
2265+ var notify = function(id, v) {
2266+ timestep += 1;
2267+ //console.log(timestep);
2268+ var hasListener = false;
2269+ for (var i = inputs.length; i--; ) {
2270+ hasListener = inputs[i].recv(timestep, id, v) || hasListener;
2271+ }
2272+ return hasListener;
2273+ };
2274+
2275+ function isAlive(input) {
2276+ if (!input.hasOwnProperty('defaultNumberOfKids')) return true;
2277+ var len = input.kids.length;
2278+ if (len == 0) return false;
2279+ if (len > input.defaultNumberOfKids) return true;
2280+ var alive = false;
2281+ for (var i = len; i--; ) {
2282+ alive = alive || isAlive(input.kids[i]);
2283+ }
2284+ return alive;
2285+ }
2286+ function filterDeadInputs() {
2287+ var temp = [];
2288+ for (var i = inputs.length; i--; ) {
2289+ if (isAlive(inputs[i])) temp.push(inputs[i]);
2290+ }
2291+ inputs = temp;
2292+ }
2293+
2294+ return {initialize:initialize, notify:notify, inputs:inputs};
2295+}();
2296+var Signal = function() {
2297+ function toElmString(str) {
2298+ var out = ["Nil"];
2299+ for (var i = str.length; i--; ) {
2300+ out = ["Cons", str[i], out];
2301+ }
2302+ return out;
2303+ }
2304+ var addListener = function() {
2305+ if(document.addEventListener) {
2306+ return function(element, event, handler) {
2307+ element.addEventListener(event, handler, false);
2308+ };
2309+ }
2310+ else {
2311+ return function(element, event, handler) {
2312+ element.attachEvent('on' + event, handler);
2313+ };
2314+ }
2315+ }();
2316+
2317+ var Mouse = function() {
2318+ var position = Elm.Input(Value.Tuple(0,0));
2319+ position.defaultNumberOfKids = 2;
2320+
2321+ var x = Elm.Lift(function(p){return p[1];},[position]);
2322+ x.defaultNumberOfKids = 0;
2323+ var y = Elm.Lift(function(p){return p[2];},[position]);
2324+ y.defaultNumberOfKids = 0;
2325+
2326+ var isDown = Elm.Input(false);
2327+ var isClicked = Elm.Input(false);
2328+ var clicks = Elm.Input(Value.Tuple());
2329+
2330+ function getXY(e) {
2331+ var posx = 0;
2332+ var posy = 0;
2333+ if (!e) var e = window.event;
2334+ if (e.pageX || e.pageY) {
2335+ posx = e.pageX;
2336+ posy = e.pageY;
2337+ } else if (e.clientX || e.clientY) {
2338+ posx = e.clientX + document.body.scrollLeft +
2339+ document.documentElement.scrollLeft;
2340+ posy = e.clientY + document.body.scrollTop +
2341+ document.documentElement.scrollTop;
2342+ }
2343+ return Value.Tuple(posx, posy);
2344+ }
2345+
2346+ addListener(document, 'click', function(e) {
2347+ var hasListener1 = Dispatcher.notify(isClicked.id, true);
2348+ var hasListener2 = Dispatcher.notify(clicks.id, Value.Tuple());
2349+ Dispatcher.notify(isClicked.id, false);
2350+ if (!hasListener1 && !hasListener2)
2351+ this.removeEventListener('click',arguments.callee,false);
2352+ });
2353+ addListener(document, 'mousedown', function(e) {
2354+ var hasListener = Dispatcher.notify(isDown.id, true);
2355+ if (!hasListener)
2356+ this.removeEventListener('mousedown',arguments.callee,false);
2357+ });
2358+ addListener(document, 'mouseup', function(e) {
2359+ var hasListener = Dispatcher.notify(isDown.id, false);
2360+ if (!hasListener)
2361+ this.removeEventListener('mouseup',arguments.callee,false);
2362+ });
2363+ addListener(document, 'mousemove', function(e) {
2364+ var hasListener = Dispatcher.notify(position.id, getXY(e));
2365+ if (!hasListener)
2366+ this.removeEventListener('mousemove',arguments.callee,false);
2367+ });
2368+ var clickedOn = function(elem) {
2369+ var click = Elm.Input(false);
2370+ addListener(elem, 'click', function(e) {
2371+ Dispatcher.notify(click.id, true);
2372+ Dispatcher.notify(click.id, false);
2373+ });
2374+ return Value.Tuple(elem, click);
2375+ };
2376+ return {position: position,
2377+ x:x,
2378+ y:y,
2379+ isClicked: isClicked,
2380+ isDown: isDown,
2381+ clicks: clicks,
2382+ isClickedOn: clickedOn
2383+ };
2384+ }();
2385+
2386+ var Time = function() {
2387+ var every = function(t) {
2388+ t *= 1000;
2389+ var clock = Elm.Input(0);
2390+ var time = 0;
2391+ setInterval(function() {
2392+ time += t;
2393+ Dispatcher.notify(clock.id, time/1000);
2394+ }, t);
2395+ return clock;
2396+ };
2397+ var after = function(t) {
2398+ t *= 1000;
2399+ var thread = Elm.Input(false);
2400+ setTimeout(function() { Dispatcher.notify(thread.id, true); }, t);
2401+ return thread;
2402+ };
2403+ var before = function(t) {
2404+ t *= 1000;
2405+ var thread = Elm.Input(true);
2406+ setTimeout(function() { Dispatcher.notify(thread.id, false); }, t);
2407+ return thread;
2408+ };
2409+ return {every:every,after:after,before:before};
2410+ }();
2411+
2412+ var Window = function() {
2413+ var dimensions = Elm.Input(Value.Tuple(window.innerWidth,window.innerHeight));
2414+ dimensions.defaultNumberOfKids = 2;
2415+
2416+ var width = Elm.Lift(function(p){return p[1];},[dimensions]);
2417+ width.defaultNumberOfKids = 0;
2418+ var height = Elm.Lift(function(p){return p[2];},[dimensions]);
2419+ height.defaultNumberOfKids = 0;
2420+
2421+ addListener(window, 'resize', function(e) {
2422+ var w = document.getElementById('widthChecker').offsetWidth;
2423+ var hasListener = Dispatcher.notify(dimensions.id, Value.Tuple(w, window.innerHeight));
2424+ if (!hasListener)
2425+ this.removeEventListener('resize',arguments.callee,false);
2426+ });
2427+ return {dimensions:dimensions,width:width,height:height};
2428+ }();
2429+
2430+ var Keyboard = { Raw : function() {
2431+ var keysDown = Elm.Input(["Nil"]);
2432+ var charPressed = Elm.Input(["Nothing"]);
2433+ function remove(x,xs) {
2434+ if (xs[0] === "Nil") return xs;
2435+ if (xs[1] === x) return xs[2];
2436+ return ["Cons", xs[1], remove(x,xs[2])];
2437+ }
2438+ function has(x,xs) {
2439+ while (xs[0] !== "Nil") {
2440+ if (xs[1] === x) return true;
2441+ xs = xs[2];
2442+ }
2443+ return false;
2444+ }
2445+ addListener(document, 'keydown', function(e) {
2446+ if (has(e.keyCode, keysDown.value)) return;
2447+ var hasListener = Dispatcher.notify(keysDown.id, ["Cons", e.keyCode, keysDown.value]);
2448+ if (!hasListener)
2449+ this.removeEventListener('keydown',arguments.callee,false);
2450+ });
2451+ addListener(document, 'keyup', function(e) {
2452+ var codes = remove(e.keyCode, keysDown.value);
2453+ var hasListener = Dispatcher.notify(keysDown.id, codes);
2454+ if (!hasListener)
2455+ this.removeEventListener('keyup',arguments.callee,false);
2456+ });
2457+ addListener(window, 'blur', function(e) {
2458+ var hasListener = Dispatcher.notify(keysDown.id, ["Nil"]);
2459+ if (!hasListener)
2460+ this.removeEventListener('blur',arguments.callee,false);
2461+ });
2462+ addListener(document, 'keypress', function(e) {
2463+ var hasListener = Dispatcher.notify(charPressed.id, ["Just",e.charCode || e.keyCode]);
2464+ Dispatcher.notify(charPressed.id, ["Nothing"]);
2465+ if (!hasListener)
2466+ this.removeEventListener('keypress',arguments.callee,false);
2467+ });
2468+ return {keysDown:keysDown,
2469+ charPressed:charPressed};
2470+ }()
2471+ };
2472+
2473+ var HTTP = function() {
2474+ var fetch = function(how) { return function(url) {
2475+ var thread = Elm.Input(["Waiting"]);
2476+ var request = {};
2477+ if (window.XMLHttpRequest) { request = new XMLHttpRequest(); }
2478+ else if (window.ActiveXObject) { request = new ActiveXObject("Microsoft.XMLHTTP"); }
2479+ request.onreadystatechange = function(e) {
2480+ if (request.readyState === 4) {
2481+ Dispatcher.notify(thread.id,
2482+ request.status === 200
2483+ ? ["Success", toElmString(request.responseText)]
2484+ : ["Failure", request.status, toElmString(request.statusText)]);
2485+ }
2486+ };
2487+ request.open(how, Value.toText(url), true);
2488+ request.send(null);
2489+ return thread;
2490+ };
2491+ };
2492+ var fetches = function(how) { return function(input) {
2493+ var output = Elm.Input(["Nothing"]);
2494+ var fetcher = Elm.Lift(update, [input]);
2495+ var combine = Elm.Lift(function(x) { return function(y) { return x; } }, [output,fetcher]);
2496+ function update(strOpt) {
2497+ if (strOpt[0] !== "Just") {
2498+ try { Dispatcher.notify(output.id, ["Nothing"]); } catch(e) {}
2499+ return [];
2500+ }
2501+ try {
2502+ Dispatcher.notify(output.id, ["Just", ["Waiting"]]);
2503+ } catch(e) { output.value = ["Just", ["Waiting"]]; }
2504+ var request = {};
2505+ if (window.XMLHttpRequest) { request = new XMLHttpRequest(); }
2506+ else if (window.ActiveXObject) { request = new ActiveXObject("Microsoft.XMLHTTP"); }
2507+ request.onreadystatechange = function(e) {
2508+ if (request.readyState === 4) {
2509+ Dispatcher.notify(output.id,
2510+ ["Just", request.status === 200
2511+ ? ["Success", toElmString(request.responseText)]
2512+ : ["Failure", request.status, toElmString(request.statusText)]]);
2513+ }
2514+ };
2515+ request.open(how, Value.toText(strOpt[1]), true);
2516+ request.send(null);
2517+ return [];
2518+ }
2519+ return combine;
2520+ };
2521+ };
2522+ return {get : fetch("GET"), post : fetch("POST"),
2523+ gets : fetches("GET"), posts : fetches("POST")
2524+ };
2525+ }();
2526+ var Random = function() {
2527+ var inRange = function(min) { return function(max) {
2528+ return Elm.Input(Math.floor(Math.random() * (max-min+1)) + min);
2529+ };
2530+ };
2531+ var randomize = function(min) { return function(max) { return function(signal) {
2532+ return Elm.Lift(function(x) { return Math.floor(Math.random() * (max-min+1)) + min;},[signal]);
2533+ };
2534+ };
2535+ };
2536+ return { inRange:inRange, randomize:randomize };
2537+ }();
2538+ var Input = function() {
2539+ function wrap(elem) {
2540+ var p = Value.getSize(elem);
2541+ return ["Element", Guid.guid(), ["EHtml",elem], p[0], p[1], 1, Nothing, Nothing];
2542+ }
2543+ var newTextInput = function(elem, ghostText) {
2544+ elem.placeholder = Foreign.JavaScript.castStringToJSString(ghostText);
2545+ var str = Elm.Input(["Nil"]);
2546+ addListener(elem, 'keyup', function(e) {
2547+ Dispatcher.notify(str.id, toElmString(elem.value));
2548+ elem.focus();
2549+ });
2550+ elem.style.padding = "1px";
2551+ return Value.Tuple(wrap(elem), str);
2552+ };
2553+ var newElement = function(name) {
2554+ var e = document.createElement(name);
2555+ e.style.padding = "0";
2556+ e.style.margin = "0";
2557+ return e;
2558+ };
2559+ var textArea = function(cols) { return function(rows) {
2560+ var textarea = newElement('textarea');
2561+ textarea.rows = rows;
2562+ textarea.cols = cols;
2563+ return newTextInput(textarea, "");
2564+ };
2565+ };
2566+ var textField = function(ghostText) {
2567+ var field = newElement('input');
2568+ field.type = 'text';
2569+ return newTextInput(field, ghostText);
2570+ };
2571+ var password = function(ghostText) {
2572+ var field = newElement('input');
2573+ field.type = 'password';
2574+ return newTextInput(field, ghostText);
2575+ };
2576+ var checkbox = function(checked) {
2577+ var box = newElement('input');
2578+ box.type = 'checkbox';
2579+ box.checked = checked;
2580+ var status = Elm.Input(checked);
2581+ addListener(box, 'change', function(e) {
2582+ Dispatcher.notify(status.id, box.checked);
2583+ });
2584+ return Value.Tuple(wrap(box), status);
2585+ };
2586+ var dropDown = function(options) {
2587+ var slct = newElement('select');
2588+ var opts = [];
2589+ while (options[0] === "Cons") {
2590+ var opt = newElement('option');
2591+ var str = Text.toText(options[1][1]);
2592+ opt.value = str;
2593+ opt.innerHTML = str;
2594+ slct.appendChild(opt);
2595+ opts.push(options[1][2]);
2596+ options = options[2];
2597+ }
2598+ var status = Elm.Input(opts[0]);
2599+ addListener(slct, 'change', function(e) {
2600+ Dispatcher.notify(status.id, opts[slct.selectedIndex]);
2601+ });
2602+ return Value.Tuple(wrap(slct), status);
2603+ };
2604+ var stringDropDown = function(opts) {
2605+ return dropDown(List.map (function(x) {return Value.Tuple(x,x);}) (opts));
2606+ };
2607+ var button = function(name) {
2608+ var b = newElement('input');
2609+ b.type = "button";
2610+ b.value = Foreign.JavaScript.castStringToJSString(name);
2611+ var press = Elm.Input(false);
2612+ addListener(b, 'click', function(e) {
2613+ Dispatcher.notify(press.id, true);
2614+ Dispatcher.notify(press.id, false);
2615+ });
2616+ return Value.Tuple(wrap(b),press);
2617+ };
2618+ return {textArea:textArea, textField:textField,
2619+ password:password, checkbox:checkbox,
2620+ dropDown:dropDown, stringDropDown:stringDropDown,
2621+ button:button};
2622+ }();
2623+
2624+ return {addListener:addListener,
2625+ Mouse:Mouse,
2626+ Keyboard:Keyboard,
2627+ Time:Time,
2628+ Window:Window,
2629+ HTTP:HTTP,
2630+ Random:Random,
2631+ Input:Input,
2632+ constant : function(v) { return Elm.Input(v); },
2633+ lift : function(f){return function(e){return Elm.Lift(f,[e]);};},
2634+ lift2 : function(f) { return function(e1) { return function(e2) {
2635+ return Elm.Lift(f, [e1,e2]); }; }; },
2636+ lift3 : function(f) { return function(e1) { return function(e2) {
2637+ return function(e3){return Elm.Lift(f,[e1,e2,e3]);};};};},
2638+ lift4 : function(f) { return function(e1) { return function(e2) {
2639+ return function(e3) { return function(e4) {
2640+ return Elm.Lift(f, [e1,e2,e3,e4]); }; }; }; }; },
2641+ foldp : function(f) { return function(b) { return function(e) {
2642+ return Elm.Fold(f,b,e); }; }; },
2643+ count : function(sig){return Elm.Fold(function(_){return function(c){return c+1;};},0,sig)},
2644+ keepIf : Elm.keepIf,
2645+ dropIf : Elm.dropIf,
2646+ keepWhen : Elm.keepWhen,
2647+ dropWhen : Elm.dropWhen,
2648+ dropRepeats : Elm.dropRepeats,
2649+ sampleOn : Elm.sampleOn
2650+ };
2651+}();
2652+var Prelude = function() {
2653+ var mod = function(x) { return function(y) {
2654+ var r = x % y;
2655+ var m = x==0 ? 0 : (y>0 ? (x>=0 ? r : r+y) : -mod(-x)(-y));
2656+ return m == y ? 0 : m;
2657+ }; };
2658+
2659+ var min = function(x) { return function(y) { return Math.min(x,y); }; };
2660+ var max = function(x) { return function(y) { return Math.max(x,y); }; };
2661+
2662+ var flip=function(f){return function(x){return function(y){return f(y)(x);};};};
2663+ var clamp = function(lo) { return function(hi) {
2664+ return function(x) { return Math.min(hi, Math.max(lo, x)); };
2665+ };
2666+ };
2667+ var curry = function(f) { return function(x) { return function(y) {
2668+ return f(["Tuple2",x,y]); }; };
2669+ };
2670+ var uncurry = function(f) { return function(p) {
2671+ if (p[0] !== "Tuple2") {
2672+ throw "Function was uncurry'd but was not given a pair.";
2673+ }
2674+ return f(p[1])(p[2]); };
2675+ };
2676+
2677+ var logBase=function(b){return function(x){return Math.log(x)/Math.log(b);};};
2678+
2679+ return {id : function(x) { return x; },
2680+ not : function(b) { return !b; },
2681+ fst : function(p) { return p[1]; },
2682+ snd : function(p) { return p[2]; },
2683+ rem : function(x) { return function(y) { return x % y; }; },
2684+ div : function(x) { return function(y) { return ~~(x / y); }; },
2685+ compare : function(x) { return function (y) {
2686+ x = (typeof x === "object") ? toText(x) : x;
2687+ y = (typeof y === "object") ? toText(y) : y;
2688+ return [ x === y ? 'EQ' : (x < y ? 'LT' : 'GT') ];
2689+ };
2690+ },
2691+ toFloat : function(x) { return x; },
2692+ round : function(n) { return Math.round(n); },
2693+ floor : function(n) { return Math.floor(n); },
2694+ ceiling : function(n) { return Math.ceil(n); },
2695+ truncate : function(n) { return ~~n; },
2696+ sqrt : Math.sqrt,
2697+ abs : Math.abs,
2698+ pi : Math.PI,
2699+ e : Math.E,
2700+ sin : Math.sin,
2701+ cos : Math.cos,
2702+ tan : Math.tan,
2703+ asin : Math.asin,
2704+ acos : Math.acos,
2705+ atan : Math.atan,
2706+ mod : mod,
2707+ min : min,
2708+ max : max,
2709+ flip : flip,
2710+ clamp : clamp,
2711+ curry : curry,
2712+ uncurry : uncurry,
2713+ logBase : logBase,
2714+ Just : Data.Maybe.Just,
2715+ Nothing : Data.Maybe.Nothing,
2716+ maybe : Data.Maybe.maybe,
2717+ map : Data.List.map,
2718+ filter : Data.List.filter,
2719+ head : Data.List.head,
2720+ tail : Data.List.tail,
2721+ last : Data.List.last,
2722+ length : Data.List.length,
2723+ reverse : Data.List.reverse,
2724+ foldr : Data.List.foldr,
2725+ foldr1 : Data.List.foldr1,
2726+ foldl : Data.List.foldl,
2727+ foldl1 : Data.List.foldl1,
2728+ and : Data.List.and,
2729+ or : Data.List.or,
2730+ forall : Data.List.forall,
2731+ exists : Data.List.exists,
2732+ sum : Data.List.sum,
2733+ product : Data.List.product,
2734+ concat : Data.List.concat,
2735+ concatMap : Data.List.concatMap,
2736+ maximum : Data.List.maximum,
2737+ minimum : Data.List.minimum,
2738+ scanl : Data.List.scanl,
2739+ scanl1 : Data.List.scanl1,
2740+ take : Data.List.take,
2741+ drop : Data.List.drop,
2742+ lift : Signal.lift,
2743+ lift2 : Signal.lift2,
2744+ lift3 : Signal.lift3,
2745+ lift4 : Signal.lift4,
2746+ foldp : Signal.foldp,
2747+ constant : Signal.constant,
2748+ count : Signal.count,
2749+ keepIf : Signal.keepIf,
2750+ dropIf : Signal.dropIf,
2751+ keepWhen : Signal.keepWhen,
2752+ dropWhen : Signal.dropWhen,
2753+ dropRepeats : Signal.dropRepeats,
2754+ sampleOn : Signal.sampleOn
2755+ };
2756+}();
2757+var eq = Value.eq;
2758+
2759+Signal.addListener(document, 'elm_log', function(e) { console.log(e.value); });
2760+Signal.addListener(document, 'elm_title', function(e) { document.title = e.value; });
2761+Signal.addListener(document, 'elm_redirect', function(e) {
2762+ if (e.value.length > 0) { window.location = e.value; }
2763+ });
2764+
2765+var includeGlobal = this;
2766+(function() {
2767+ var include = function(library) {
2768+ for (var i in library) {
2769+ if (i === 'Internal') continue;
2770+ try {
2771+ includeGlobal[i] = library[i];
2772+ } catch (err) {
2773+ if (i === 'length') {
2774+ includeGlobal.execScript('var length;');
2775+ length = library[i];
2776+ continue;
2777+ }
2778+ }
2779+ }
2780+ };
2781+ var includeAs = function(name) { return function(library) {
2782+ includeGlobal[name] = includeGlobal[name] || {};
2783+ for (var i in library) {
2784+ if (i === 'Internal') continue;
2785+ includeGlobal[name][i] = library[i];
2786+ }
2787+ };
2788+ };
2789+ include (Element);
2790+ include (Text);
2791+
2792+ color = Element.color;
2793+ height = Element.height;
2794+ show = Value.show;
2795+
2796+ include (ElmCode.Graphics.Color);
2797+ include (ElmCode.Graphics.Element);
2798+
2799+ includeAs ('Time') (Signal.Time);
2800+ includeAs ('Mouse') (Signal.Mouse);
2801+ includeAs ('Keyboard') (Signal.Keyboard);
2802+ includeAs ('Window') (Signal.Window);
2803+ includeAs ('HTTP') (Signal.HTTP);
2804+ includeAs ('Input') (Signal.Input);
2805+ includeAs ('Random') (Signal.Random);
2806+
2807+}());
2808+
2809+var ElmCode = ElmCode || {};
2810+ElmCode.Data = Data;
2811+ElmCode.Signal = Signal;
2812+ElmCode.Data.List = List;
2813+ElmCode.Foreign = Foreign;
2814+ElmCode.Prelude = Prelude;