]>
Commit | Line | Data |
---|---|---|
9e769c12 CP |
1 | Array.prototype.indexFromEnd = function(d) { |
2 | var p = this; | |
3 | ||
4 | if(d < 0) | |
5 | return p[p.length + d]; | |
6 | ||
7 | return p[d]; | |
8 | } | |
9 | ||
96f28062 CP |
10 | qwebirc.util.dictCopy = function(d) { |
11 | var n = {}; | |
12 | for(var k in d) | |
13 | n[k] = d[k]; | |
14 | ||
15 | return n; | |
16 | } | |
17 | ||
9e769c12 CP |
18 | /* how horribly inefficient */ |
19 | String.prototype.replaceAll = function(f, t) { | |
20 | var i = this.indexOf(f); | |
21 | var c = this; | |
22 | ||
23 | while(i > -1) { | |
24 | c = c.replace(f, t); | |
25 | i = c.indexOf(f); | |
26 | } | |
27 | return c; | |
28 | } | |
29 | ||
30 | /* how horribly inefficient (again) */ | |
31 | String.prototype.splitMax = function(by, max) { | |
32 | var items = this.split(by); | |
33 | var newitems = items.slice(0, max-1); | |
34 | ||
35 | if(items.length >= max) | |
36 | newitems.push(items.slice(max-1).join(by)); | |
37 | ||
38 | return newitems; | |
39 | } | |
9b63b053 | 40 | |
66de775f | 41 | /* returns the arguments */ |
e20e5a6b | 42 | qwebirc.util.parseURI = function(uri) { |
66de775f CP |
43 | var result = {} |
44 | ||
45 | var start = uri.indexOf('?'); | |
46 | if(start == -1) | |
47 | return result; | |
48 | ||
49 | var querystring = uri.substring(start + 1); | |
50 | ||
51 | var args = querystring.split("&"); | |
52 | ||
29453513 | 53 | for(var i=0;i<args.length;i++) { |
66de775f CP |
54 | var r = args[i].splitMax("=", 2); |
55 | if(r.length < 2) | |
56 | continue; | |
57 | ||
58 | result[unescape(r[0])] = unescape(r[1]); | |
59 | } | |
60 | ||
61 | return result; | |
62 | } | |
35155ba7 | 63 | |
e20e5a6b CP |
64 | qwebirc.util.DaysOfWeek = { |
65 | 0: "Sun", | |
66 | 1: "Mon", | |
67 | 2: "Tue", | |
68 | 3: "Wed", | |
69 | 4: "Thu", | |
70 | 5: "Fri", | |
71 | 6: "Sat" | |
72 | }; | |
73 | ||
74 | qwebirc.util.MonthsOfYear = { | |
75 | 0: "Jan", | |
76 | 1: "Feb", | |
77 | 2: "Mar", | |
78 | 3: "Apr", | |
79 | 4: "May", | |
80 | 5: "Jun", | |
81 | 6: "Jul", | |
82 | 7: "Aug", | |
83 | 8: "Sep", | |
84 | 9: "Oct", | |
85 | 10: "Nov", | |
86 | 11: "Dec" | |
87 | }; | |
1d6756bc CP |
88 | |
89 | qwebirc.util.NBSPCreate = function(text, element) { | |
90 | var e = text.split(" "); | |
91 | for(var i=0;i<e.length;i++) { | |
92 | var tn = document.createTextNode(e[i]); | |
93 | element.appendChild(tn); | |
94 | ||
95 | if(i != e.length - 1) { | |
96 | var e2 = new Element("span"); | |
97 | e2.set("html", " "); | |
98 | element.appendChild(e2); | |
99 | } | |
100 | } | |
101 | }; | |
102 | ||
103 | qwebirc.util.longtoduration = function(l) { | |
104 | var seconds = l % 60; | |
32d0e6f5 CP |
105 | var minutes = Math.floor((l % 3600) / 60); |
106 | var hours = Math.floor((l % (3600 * 24)) / 3600); | |
107 | var days = Math.floor(l / (24*3600)); | |
1d6756bc CP |
108 | |
109 | return days + " days " + hours + " hours " + minutes + " minutes " + seconds + " seconds"; | |
110 | } | |
8408e834 CP |
111 | |
112 | qwebirc.util.pad = function(x) { | |
113 | x = "" + x; | |
114 | if(x.length == 1) | |
115 | return "0" + x; | |
116 | return x | |
117 | } | |
96f28062 CP |
118 | |
119 | RegExp.escape = function(text) { | |
120 | if(!arguments.callee.sRE) { | |
121 | var specials = [ | |
122 | '/', '.', '*', '+', '?', '|', | |
123 | '(', ')', '[', ']', '{', '}', '\\' | |
124 | ]; | |
125 | arguments.callee.sRE = new RegExp('(\\' + specials.join('|\\') + ')', 'g'); | |
126 | } | |
127 | ||
128 | return text.replace(arguments.callee.sRE, '\\$1'); | |
52090a1f CP |
129 | } |
130 | ||
131 | qwebirc.ui.insertAt = function(position, parent, element) { | |
132 | if(!parent.childNodes || (position >= parent.childNodes.length)) { | |
133 | parent.appendChild(element); | |
134 | } else { | |
135 | parent.insertBefore(element, parent.childNodes[position]); | |
136 | } | |
3c3ddb14 CP |
137 | } |
138 | ||
3184781b | 139 | qwebirc.util.setCaretPos = function(obj, pos) { |
3c3ddb14 CP |
140 | if($defined(obj.selectionStart)) { |
141 | obj.focus(); | |
142 | obj.setSelectionRange(pos, pos); | |
143 | } else if(obj.createTextRange) { | |
144 | var range = obj.createTextRange(); | |
145 | range.move("character", pos); | |
146 | range.select(); | |
147 | } | |
148 | } | |
149 | ||
150 | qwebirc.util.setAtEnd = function(obj) { | |
3184781b | 151 | qwebirc.util.setCaretPos(obj.value.length); |
3c3ddb14 CP |
152 | } |
153 | ||
154 | qwebirc.util.getCaretPos = function(element) { | |
155 | if($defined(element.selectionStart)) | |
156 | return element.selectionStart; | |
157 | ||
158 | if(document.selection) { | |
159 | element.focus(); | |
160 | var sel = document.selection.createRange(); | |
161 | sel.moveStart("character", -element.value.length); | |
162 | return sel.text.length; | |
163 | } | |
164 | } | |
165 | ||
166 | qwebirc.util.browserVersion = function() { | |
167 | //return "engine: " + Browser.Engine.name + " platform: " + Browser.Platform.name + " user agent: " + navigator.userAgent; | |
168 | return navigator.userAgent; | |
169 | } | |
3184781b CP |
170 | |
171 | qwebirc.util.getEnclosedWord = function(text, position) { | |
172 | var l = text.split(""); | |
173 | var buf = []; | |
174 | ||
175 | if(text == "") | |
176 | return; | |
177 | ||
178 | var start = position - 1; | |
179 | if(start < 0) { | |
180 | /* special case: starting with space */ | |
181 | start = 0; | |
182 | } else { | |
183 | /* work back until we find the first space */ | |
184 | for(;start>=0;start--) { | |
185 | if(l[start] == ' ') { | |
186 | start = start + 1; | |
187 | break; | |
188 | } | |
189 | } | |
190 | } | |
191 | ||
192 | if(start < 0) | |
193 | start = 0; | |
194 | ||
195 | var s = text.substring(start); | |
196 | var pos = s.indexOf(" "); | |
197 | if(pos != -1) | |
198 | s = s.substring(0, pos); | |
199 | ||
200 | return [start, s]; | |
201 | } | |
202 | ||
203 | String.prototype.startsWith = function(what) { | |
204 | return this.substring(0, what.length) == what; | |
205 | } | |
f59585a7 CP |
206 | |
207 | /* NOT cryptographically secure! */ | |
208 | qwebirc.util.randHexString = function(numBytes) { | |
209 | var getByte = function() { | |
210 | return (((1+Math.random())*0x100)|0).toString(16).substring(1); | |
211 | }; | |
212 | ||
213 | var l = []; | |
214 | for(var i=0;i<numBytes;i++) | |
215 | l.push(getByte()); | |
216 | ||
217 | return l.join(""); | |
218 | } | |
127631e0 CP |
219 | |
220 | qwebirc.util.importJS = function(name, watchFor, onload) { | |
221 | var script = document.createElement("script"); | |
222 | script.type = "text/javascript"; | |
223 | script.src = name; | |
224 | ||
225 | if(Browser.Engine.trident) { | |
226 | /* HORRID */ | |
227 | var checkFn = function() { | |
228 | if(eval("typeof " + watchFor) != "undefined") { | |
229 | onload(); | |
230 | } else { | |
5ad04c7b | 231 | checkFn.delay(100); |
127631e0 CP |
232 | } |
233 | } | |
234 | checkFn(); | |
235 | } else { | |
236 | script.onload = onload; | |
237 | } | |
238 | document.getElementsByTagName("head")[0].appendChild(script); | |
239 | } | |
a1e826c7 | 240 | |
a9cbd00d | 241 | qwebirc.util.createInput = function(type, parent, name, selected, id) { |
a1e826c7 CP |
242 | var r; |
243 | if(Browser.Engine.trident) { | |
244 | if(name) { | |
245 | name = " name=\"" + escape(name) + "\""; | |
246 | } else { | |
247 | name = ""; | |
248 | } | |
a9cbd00d CP |
249 | if(id) { |
250 | id = " id=\"" + escape(id) + "\""; | |
251 | } else { | |
252 | id = ""; | |
253 | } | |
254 | r = $(document.createElement("<input type=\"" + type + "\"" + name + id + " " + (selected?" checked":"") + "/>")); | |
a1e826c7 CP |
255 | } else { |
256 | r = new Element("input"); | |
257 | r.type = type; | |
258 | if(name) | |
259 | r.name = name; | |
a9cbd00d CP |
260 | if(id) |
261 | r.id = id; | |
a1e826c7 CP |
262 | |
263 | if(selected) | |
264 | r.checked = true; | |
265 | } | |
266 | ||
267 | parent.appendChild(r); | |
268 | return r; | |
269 | } | |
e516cc76 CP |
270 | |
271 | /* From: www.webtoolkit.info */ | |
272 | qwebirc.util.b64Table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; | |
273 | qwebirc.util.b64Encode = function(data) { | |
274 | var output = []; | |
275 | var table = qwebirc.util.b64Table; | |
2a802692 | 276 | for(var i=0;i<data.length;) { |
e516cc76 CP |
277 | var chr1 = data.charCodeAt(i++); |
278 | var chr2 = data.charCodeAt(i++); | |
279 | var chr3 = data.charCodeAt(i++); | |
280 | ||
281 | var enc1 = chr1 >> 2; | |
282 | var enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); | |
283 | var enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); | |
284 | var enc4 = chr3 & 63; | |
285 | ||
286 | if(isNaN(chr2)) { | |
287 | enc3 = enc4 = 64; | |
288 | } else if(isNaN(chr3)) { | |
289 | enc4 = 64; | |
290 | } | |
291 | ||
292 | output.push(table.charAt(enc1) + table.charAt(enc2) + table.charAt(enc3) + table.charAt(enc4)); | |
293 | } | |
294 | return output.join(""); | |
295 | } | |
296 | ||
297 | /* From: www.webtoolkit.info */ | |
298 | qwebirc.util.b64Decode = function(data) { | |
299 | data = data.replace(/[^A-Za-z0-9\+\/\=]/g, ""); | |
300 | ||
301 | var output = []; | |
302 | var table = qwebirc.util.b64Table; | |
8d1217eb CP |
303 | |
304 | /* grossly inefficient... so sue me */ | |
305 | while(data.length % 4 != 0) | |
306 | data = data + "="; | |
307 | ||
e516cc76 CP |
308 | for(var i=0;i<data.length;) { |
309 | var enc1 = table.indexOf(data.charAt(i++)); | |
310 | var enc2 = table.indexOf(data.charAt(i++)); | |
311 | var enc3 = table.indexOf(data.charAt(i++)); | |
312 | var enc4 = table.indexOf(data.charAt(i++)); | |
313 | ||
314 | var chr1 = (enc1 << 2) | (enc2 >> 4); | |
315 | var chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); | |
316 | var chr3 = ((enc3 & 3) << 6) | enc4; | |
317 | ||
318 | output.push(String.fromCharCode(chr1)); | |
319 | if (enc3 != 64) | |
320 | output.push(String.fromCharCode(chr2)); | |
321 | if (enc4 != 64) | |
322 | output.push(String.fromCharCode(chr3)); | |
323 | } | |
324 | ||
325 | return output.join(""); | |
326 | } | |
27add99a CP |
327 | |
328 | qwebirc.util.composeAnd = function() { | |
329 | var xargs = arguments; | |
330 | ||
331 | return function() { | |
332 | for(var i=0;i<xargs.length;i++) | |
333 | if(!xargs[i].apply(this, arguments)) | |
334 | return false; | |
335 | ||
336 | return true; | |
337 | } | |
338 | } | |
339 | ||
340 | qwebirc.util.invertFn = function(fn) { | |
341 | return function() { | |
342 | return !fn.apply(this, arguments); | |
343 | } | |
344 | } | |
c1416a8d CP |
345 | |
346 | qwebirc.util.deviceHasKeyboard = function() { | |
347 | var determine = function() { | |
348 | if(Browser.Engine.ipod) | |
349 | return true; | |
350 | ||
351 | var MOBILE_UAs = ["Nintendo Wii", " PIE", "BlackBerry", "IEMobile", "Windows CE", "Nokia", "Opera Mini", "Mobile", "mobile", "Pocket", "pocket", "Android"]; | |
352 | /* safari not included because iphones/ipods send that, and we checked for iphone/ipod specifically above */ | |
353 | var DESKTOP_UAs = ["Chrome", "Firefox", "Camino", "Iceweasel", "K-Meleon", "Konqueror", "SeaMonkey", "Windows NT", "Windows 9"]; | |
354 | ||
355 | var ua = navigator.userAgent; | |
356 | ||
357 | var contains = function(v) { | |
358 | return ua.indexOf(v) > -1; | |
359 | } | |
360 | ||
361 | for(var i=0;i<MOBILE_UAs.length;i++) | |
362 | if(contains(MOBILE_UAs[i])) | |
363 | return false; | |
364 | ||
365 | for(var i=0;i<DESKTOP_UAs.length;i++) | |
366 | if(contains(DESKTOP_UAs[i])) | |
367 | return true; | |
368 | ||
369 | return false; | |
370 | }; | |
371 | var v = determine(); | |
372 | ||
373 | qwebirc.util.deviceHasKeyboard = function() { | |
374 | return v; | |
375 | } | |
376 | ||
377 | return v; | |
378 | } | |
a9cbd00d CP |
379 | |
380 | qwebirc.util.generateID_ID = 0; | |
381 | qwebirc.util.generateID = function() { | |
382 | return "qqa-" + qwebirc.util.generateID_ID++; | |
383 | } |