@@ -0,0 +1,283 @@
1+
2+/*
3+import List
4+import Maybe
5+import JavaScript
6+import Dict
7+import JSON
8+*/
9+
10+(function(){
11+ 'use strict';
12+
13+ var eq = function(x,y) {
14+ if (typeof x === "object") {
15+ if (x !== null && '_' in x) {
16+ for (var i in x) { if (x[i] != y[i]) return false; }
17+ for (var i in y) { if (!(i in x)) return false; }
18+ return true;
19+ }
20+ if (x === y) return true;
21+ if (x.length !== y.length) return false;
22+ for (var i = x.length; i--; ) {
23+ if (!eq(x[i],y[i])) return false;
24+ }
25+ return true;
26+ }
27+ return x === y;
28+ };
29+
30+ var Tuple0 = { ctor: "Tuple0" }
31+ function Tuple2(x,y) { return { ctor = "Tuple2", _0:x, _1:y }; }
32+
33+ function makeSpaces(s) {
34+ if (s.length == 0) { return s; }
35+ var arr = s.split('');
36+ if (arr[0] == ' ') { arr[0] = " " }
37+ for (var i = arr.length; --i; ) {
38+ if (arr[i][0] == ' ' && arr[i-1] == ' ') {
39+ arr[i-1] = arr[i-1] + arr[i];
40+ arr[i] = '';
41+ }
42+ }
43+ for (var i = arr.length; i--; ) {
44+ if (arr[i].length > 1 && arr[i][0] == ' ') {
45+ var spaces = arr[i].split('');
46+ for (var j = spaces.length - 2; j >= 0; j -= 2) {
47+ spaces[j] = ' ';
48+ }
49+ arr[i] = spaces.join('');
50+ }
51+ }
52+ arr = arr.join('');
53+ if (arr[arr.length-1] === " ") {
54+ return arr.slice(0,-1) + ' ';
55+ }
56+ return arr;
57+ }
58+
59+ function properEscape(str) {
60+ if (str.length == 0) return str;
61+ str = str //.replace(/&/g, "&")
62+ .replace(/"/g, /*"*/ """)
63+ .replace(/'/g, /*'*/ "'")
64+ .replace(/</g, "<")
65+ .replace(/>/g, ">")
66+ .replace(/\n/g, "<br/>");
67+ var arr = str.split('<br/>');
68+ for (var i = arr.length; i--; ) {
69+ arr[i] = makeSpaces(arr[i]);
70+ }
71+ return arr.join('<br/>');
72+ }
73+
74+ var toText = function(elmList) {
75+ if (typeof elmList === "string") return properEscape(elmList);
76+ var a = [];
77+ while (elmList.ctor === "Cons") {
78+ a.push(elmList._0);
79+ elmList = elmList._1;
80+ }
81+ return properEscape(a.join(''));
82+ };
83+
84+ function getTextSize(w,h,txt) {
85+ var t = document.createElement('div');
86+ t.innerHTML = txt;
87+ t.style.textAlign = 'left';
88+ if (w > 0) { t.style.width = w + "px"; }
89+
90+ t.style.visibility = "hidden";
91+ t.style.styleFloat = "left";
92+ t.style.cssFloat = "left";
93+
94+ document.body.appendChild(t);
95+ var cStyle = window.getComputedStyle(t,null);
96+ var realW = cStyle.getPropertyValue("width").slice(0,-2) - 0;
97+ var realH = cStyle.getPropertyValue("height").slice(0,-2) - 0;
98+ document.body.removeChild(t);
99+ //delete t;
100+ return [Math.ceil(realW),Math.ceil(Math.max(h,realH))];
101+ }
102+
103+ function getSize(e) {
104+ var t = e.cloneNode(true);
105+
106+ t.style.visibility = "hidden";
107+ t.style.styleFloat = "left";
108+ t.style.cssFloat = "left";
109+
110+ document.body.appendChild(t);
111+ var w = t.offsetWidth;
112+ var h = t.offsetHeight;
113+ document.body.removeChild(t);
114+ //delete t;
115+ return [w,h];
116+ }
117+
118+ function getExcess(e) {
119+ var t = e.cloneNode(true);
120+
121+ t.style.visibility = "hidden";
122+ t.style.styleFloat = "left";
123+ t.style.cssFloat = "left";
124+
125+ document.body.appendChild(t);
126+ var ow = t.offsetWidth;
127+ var oh = t.offsetHeight;
128+ var cStyle = window.getComputedStyle(t,null);
129+ var w = cStyle.getPropertyValue("width").slice(0,-2) - 0;
130+ var h = cStyle.getPropertyValue("height").slice(0,-2) - 0;
131+ document.body.removeChild(t);
132+ //delete t;
133+ return [ow-w,oh-h];
134+ }
135+
136+
137+ function groupForms(forms) {
138+ forms = Elm.JavaScript.castListToJSArray(forms);
139+ var groups = [];
140+ var arr = [];
141+ for (var i = forms.length; i--; ) {
142+ var f = forms[i];
143+ switch(f._3.ctor) {
144+ case "FElement":
145+ if (arr.length > 0) {
146+ groups.push(arr);
147+ arr = [];
148+ }
149+ groups.push(f);
150+ break;
151+ default:
152+ arr.push(f);
153+ }
154+ }
155+ if (arr.length > 0) groups.push(arr);
156+ return groups;
157+ }
158+
159+ var toString = function(v) {
160+ if (typeof v === "function") {
161+ return "<function>";
162+ } else if (typeof v === "boolean") {
163+ return v ? "True" : "False";
164+ } else if (typeof v === "number") {
165+ return v+"";
166+ } else if (typeof v === "string" && v.length < 2) {
167+ return "'"+v+"'";
168+ } else if (typeof v === "object" && ('_' in v)) {
169+ var output = [];
170+ for (var k in v._) {
171+ console.log(k,v._[k]);
172+ for (var i = v._[k].length; i--; ) {
173+ output.push(k + " = " + toString(v._[k][i]));
174+ }
175+ }
176+ for (var k in v) {
177+ if (k === '_') continue;
178+ output.push(k + " = " + toString(v[k]));
179+ }
180+ if (output.length === 0) return "{}";
181+ return "{ " + output.join(", ") + " }";
182+ } else if ('ctor' in v) {
183+ if (v.ctor.substring(0,5) === "Tuple") {
184+ var output = new Array(v.length-1);
185+ for (var i = v.length; --i; ) { output[i-1] = toString(v[i]); }
186+ return "(" + output.join(",") + ")";
187+ } else if (v.ctor === "Cons") {
188+ var isStr = typeof v._0 === "string";
189+ var start = isStr ? '"' : "[";
190+ var end = isStr ? '"' : "]";
191+ var sep = isStr ? "" : ",";
192+ var f = isStr ? function(x){return x} : toString;
193+ var output = start + f(v._0);
194+ v = v._1;
195+ while (v.ctor === "Cons") {
196+ output += sep + f(v._0);
197+ v = v._1;
198+ }
199+ return output + end;
200+ } else if (v.ctor === "Nil") {
201+ return "[]";
202+ } else if (v.ctor === "JSON") {
203+ return "(JSON.fromList " + toString(Elm.JSON.toList(v)) + ")";
204+ } else if (v.ctor === "RBNode" || v.ctor === "RBEmpty") {
205+ function cons(k){ return function(v) { return function(acc) { return Elm.Native.List.Cons(Tuple2(k,v),acc); }; }; }
206+ var list = Elm.Dict.foldr(cons)(Elm.Native.List.Nil)(v);
207+ var name = "Dict";
208+ if (list.ctor === "Cons" && list._0._1.ctor === "Tuple0") {
209+ name = "Set";
210+ list = Elm.List.map(function(x) { return x._0; })(list);
211+ }
212+ return "(" + name + ".fromList " + toString(list) + ")";
213+ } else {
214+ var output = "";
215+ for (var i = v.length; --i; ) { output = ' ' + toString(v[i]) + output; }
216+ output = v.ctor + output;
217+ return (v.length > 1) ? "(" + output + ")" : output;
218+ }
219+ }
220+ return v+"";
221+ };
222+ var show = function(v) { return str(toString(v)); };
223+ var append = function(xs,ys) {
224+ if (typeof xs === "string" && typeof ys === "string") {
225+ return xs.concat(ys);
226+ }
227+ if (xs.ctor === "Nil") {
228+ return ys;
229+ }
230+ var root = Elm.Native.List.Cons(xs._0. Elm.Native.List.Nil);
231+ var curr = root;
232+ xs = xs._1;
233+ while (xs.ctor==="Cons") {
234+ curr._1 = Elm.Native.List.Cons(xs._0. Elm.Native.List.Nil);
235+ xs = xs._1;
236+ curr = curr._1;
237+ }
238+ curr._1 = ys;
239+ return root;
240+ };
241+
242+ var str = function(s) {
243+ var out = Elm.Native.List.Nil;
244+ for (var i = s.length; i--; ) {
245+ out = Elm.Native.List.Cons(s[i], out);
246+ }
247+ return out;
248+ };
249+
250+ function wrap(elem) {
251+ var p = Value.getSize(elem);
252+ return ['Element', Guid.guid(), ["EHtml",elem],
253+ p.ctor, p._0, 1, Elm.Maybe.Nothing, Elm.Maybe.Nothing];
254+ }
255+ var addListener = function() {
256+ if(document.addEventListener) {
257+ return function(element, event, handler) {
258+ element.addEventListener(event, handler, false);
259+ };
260+ } else {
261+ return function(element, event, handler) {
262+ element.attachEvent('on' + event, handler);
263+ };
264+ }
265+ }();
266+
267+ Elm.Native.Misc = {
268+ eq:eq,
269+ str:str,
270+ show:show,
271+ Tuple:Tuple,
272+ append:append,
273+ listToArray:listToArray,
274+ toText : toText,
275+ properEscape : properEscape,
276+ getTextSize : getTextSize,
277+ getSize : getSize,
278+ getExcess : getExcess,
279+ groupForms : groupForms,
280+ wrap : wrap,
281+ addListener : addListener
282+ };
283+}());