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