]> git.saurik.com Git - cydia.git/blob - Cydia.app/menes/menes.js
Added custom depictions and better webview support.
[cydia.git] / Cydia.app / menes / menes.js
1 var _assert = function (expr) {
2 if (!expr) {
3 var message = "_assert(" + expr + ")";
4 alert(message);
5 throw message;
6 }
7 }
8
9 // Compatibility {{{
10 if (typeof Array.prototype.push != "function")
11 Array.prototype.push = function (value) {
12 this[this.length] = value;
13 };
14 // }}}
15
16 var $ = function (arg, doc) {
17 if (this.magic_ != $.prototype.magic_)
18 return new $(arg);
19
20 var type = $.type(arg);
21
22 if (type == "function")
23 $.ready(arg);
24 else if (type == "string") {
25 if (doc == undefined)
26 doc = document;
27 if (arg.charAt(0) == '#') {
28 var node = doc.getElementById(arg.substring(1));
29 return $(node == null ? [] : [node]);
30 } else if (arg.charAt(0) == '.') {
31 var nodes = doc.getElementsByClassName(arg.substring(1));
32 return $(nodes == null ? [] : nodes);
33 } else
34 return $([doc]).descendants(arg);
35 } else {
36 _assert(doc == undefined);
37 this.set($.array(arg));
38 return this;
39 }
40 };
41
42 $.type = function (value) {
43 var type = typeof value;
44
45 if (
46 type == "function" &&
47 value.toString != null &&
48 value.toString().substring(0, 8) == "[object "
49 )
50 return "object";
51 else
52 return type;
53 };
54
55 (function () {
56 var ready_ = null;
57
58 $.ready = function (_function) {
59 if (ready_ == null) {
60 ready_ = [];
61
62 document.addEventListener("DOMContentLoaded", function () {
63 for (var i = 0; i != ready_.length; ++i)
64 ready_[i]();
65 }, false);
66 }
67
68 ready_.push(_function);
69 };
70 })();
71
72 /* XXX: verify arg3 overflow */
73 $.each = function (values, _function, arg0, arg1, arg2) {
74 for (var i = 0, e = values.length; i != e; ++i)
75 _function(values[i], arg0, arg1, arg2);
76 };
77
78 /* XXX: verify arg3 overflow */
79 $.map = function (values, _function, arg0, arg1, arg2) {
80 var mapped = [];
81 for (var i = 0, e = values.length; i != e; ++i)
82 mapped.push(_function(values[i], arg0, arg1, arg2));
83 return mapped;
84 };
85
86 $.array = function (values) {
87 if (values.constructor == Array)
88 return values;
89 var array = [];
90 for (var i = 0; i != values.length; ++i)
91 array.push(values[i]);
92 return array;
93 };
94
95 $.document = function (node) {
96 for (;;) {
97 var parent = node.parentNode;
98 if (parent == null)
99 return node;
100 node = parent;
101 }
102 };
103
104 $.prototype = {
105 magic_: 2041085062,
106
107 add: function (nodes) {
108 Array.prototype.push.apply(this, nodes);
109 },
110
111 set: function (nodes) {
112 this.length = 0;
113 this.add(nodes);
114 },
115
116 css: function (name, value) {
117 $.each(this, function (node) {
118 node.style[name] = value;
119 });
120 },
121
122 append: function (html) {
123 $.each(this, function (node) {
124 var doc = $.document(node);
125
126 // XXX: implement wrapper system
127 var div = doc.createElement("div");
128 div.innerHTML = html;
129
130 while (div.childNodes.length != 0) {
131 var child = div.childNodes[0];
132 node.appendChild(child);
133 }
134 });
135 },
136
137 descendants: function (expression) {
138 var descendants = $([]);
139
140 $.each(this, function (node) {
141 descendants.add(node.getElementsByTagName(expression));
142 });
143
144 return descendants;
145 },
146
147 remove: function () {
148 $.each(this, function (node) {
149 node.parentNode.removeChild(node);
150 });
151 },
152
153 parent: function () {
154 return $($.map(this, function (node) {
155 return node.parentNode;
156 }));
157 }
158 };
159
160 $.scroll = function (x, y) {
161 window.scrollTo(x, y);
162 };
163
164 // XXX: document.all?
165 $.all = function (doc) {
166 if (doc == undefined)
167 doc = document;
168 return $(doc.getElementsByTagName("*"));
169 };
170
171 $.inject = function (a, b) {
172 if ($.type(a) == "string") {
173 $.prototype[a] = function (value) {
174 if (value == undefined)
175 return $.map(this, function (node) {
176 return b.get(node);
177 });
178 else
179 $.each(this, function (node, value) {
180 b.set(node, value);
181 }, value);
182 };
183 } else for (var name in a)
184 $.inject(name, a[name]);
185 };
186
187 $.inject({
188 display: {
189 get: function (node) {
190 return node.style.display;
191 },
192 set: function (node, value) {
193 node.style.display = value;
194 }
195 },
196
197 html: {
198 get: function (node) {
199 return node.innerHTML;
200 },
201 set: function (node, value) {
202 node.innerHTML = value;
203 }
204 },
205
206 href: {
207 get: function (node) {
208 return node.href;
209 },
210 set: function (node, value) {
211 node.href = value;
212 }
213 },
214
215 src: {
216 get: function (node) {
217 return node.src;
218 },
219 set: function (node, value) {
220 node.src = value;
221 }
222 },
223
224 value: {
225 get: function (node) {
226 return node.value;
227 },
228 set: function (node, value) {
229 node.value = value;
230 }
231 }
232 });
233
234 // Event Registration {{{
235 // XXX: unable to remove registration
236 $.prototype.event = function (event, _function) {
237 $.each(this, function (node) {
238 // XXX: smooth over this pointer ugliness
239 if (node.addEventListener)
240 node.addEventListener(event, _function, false);
241 else if (node.attachEvent)
242 node.attachEvent("on" + event, _function);
243 else
244 // XXX: multiple registration SNAFU
245 node["on" + event] = _function;
246 });
247 };
248
249 $.each([
250 "click", "load", "submit"
251 ], function (event) {
252 $.prototype[event] = function (_function) {
253 if (_function == undefined)
254 _assert(false);
255 else
256 this.event(event, _function);
257 };
258 });
259 // }}}
260 // Timed Animation {{{
261 $.interpolate = function (duration, event) {
262 var start = new Date();
263
264 var next = function () {
265 setTimeout(update, 0);
266 };
267
268 var update = function () {
269 var time = new Date() - start;
270
271 if (time >= duration)
272 event(1);
273 else {
274 event(time / duration);
275 next();
276 }
277 };
278
279 next();
280 };
281 // }}}
282 // AJAX Requests {{{
283 // XXX: abstract and implement other cases
284 $.xhr = function (url, method, headers, data, events) {
285 var xhr = new XMLHttpRequest();
286 xhr.open(method, url, true);
287
288 for (var name in headers)
289 xhr.setRequestHeader(name.replace(/_/, "-"), headers[name]);
290
291 if (events == null)
292 events = {};
293
294 xhr.onreadystatechange = function () {
295 if (xhr.readyState == 4)
296 if (events.complete != null)
297 events.complete(xhr.responseText);
298 };
299
300 xhr.send(data);
301 };
302
303 $.call = function (url, post, onsuccess) {
304 var events = {};
305
306 if (onsuccess != null)
307 events.complete = function (text) {
308 onsuccess(eval(text));
309 };
310
311 if (post == null)
312 $.xhr(url, "POST", null, null, events);
313 else
314 $.xhr(url, "POST", {
315 Content_Type: "application/json"
316 }, $.json(post), events);
317 };
318 // }}}
319 // WWW Form URL Encoder {{{
320 $.form = function (parameters) {
321 var data = "";
322
323 var ampersand = false;
324 for (var name in parameters) {
325 if (!ampersand)
326 ampersand = true;
327 else
328 data += "&";
329
330 var value = parameters[name];
331
332 data += escape(name);
333 data += "=";
334 data += escape(value);
335 }
336
337 return data;
338 };
339 // }}}
340 // JSON Serializer {{{
341 $.json = function (value) {
342 if (value == null)
343 return "null";
344
345 var type = $.type(value);
346
347 if (type == "number")
348 return value;
349 else if (type == "string")
350 return "\"" + value
351 .replace(/\\/, "\\\\")
352 .replace(/\t/, "\\t")
353 .replace(/\r/, "\\r")
354 .replace(/\n/, "\\n")
355 .replace(/"/, "\\\"")
356 + "\"";
357 else if (value.constructor == Array) {
358 var json = "[";
359 var comma = false;
360
361 for (var i = 0; i != value.length; ++i) {
362 if (!comma)
363 comma = true;
364 else
365 json += ",";
366
367 json += $.json(value[i]);
368 }
369
370 return json + "]";
371 } else if (
372 value.constructor == Object &&
373 value.toString() == "[object Object]"
374 ) {
375 var json = "{";
376 var comma = false;
377
378 for (var name in value) {
379 if (!comma)
380 comma = true;
381 else
382 json += ",";
383
384 json += name + ":" + $.json(value[name]);
385 }
386 return json + "}";
387 } else {
388 return value;
389 }
390 };
391 // }}}