]>
jfr.im git - irc/quakenet/qwebirc.git/blob - js/jslib.js
1 Array
.prototype.indexFromEnd = function(d
) {
5 return p
[p
.length
+ d
];
10 qwebirc
.util
.dictCopy = function(d
) {
18 /* how horribly inefficient */
19 String
.prototype.replaceAll = function(f
, t
) {
20 //return new RegExp("/" + RegExp.escape(f) + "/g").replace(f, RegExp.escape(t));
21 var i
= this.indexOf(f
);
31 /* how horribly inefficient (again) */
32 String
.prototype.splitMax = function(by
, max
) {
33 var items
= this.split(by
);
34 var newitems
= items
.slice(0, max
-1);
36 if(items
.length
>= max
)
37 newitems
.push(items
.slice(max
-1).join(by
));
42 /* returns the arguments */
43 qwebirc
.util
.parseURI = function(uri
) {
44 var result
= new QHash();
46 var start
= uri
.indexOf('?');
50 var querystring
= uri
.substring(start
+ 1);
52 var args
= querystring
.split("&");
54 for(var i
=0;i
<args
.length
;i
++) {
55 var r
= args
[i
].splitMax("=", 2);
59 result
.put(unescape(r
[0]), unescape(r
[1]));
65 qwebirc
.util
.DaysOfWeek
= {
75 qwebirc
.util
.MonthsOfYear
= {
90 qwebirc
.util
.NBSPCreate = function(text
, element
) {
91 var e
= text
.split(" ");
92 for(var i
=0;i
<e
.length
;i
++) {
93 var tn
= document
.createTextNode(e
[i
]);
94 element
.appendChild(tn
);
96 if(i
!= e
.length
- 1) {
97 var e2
= new Element("span");
98 e2
.set("html", " ");
99 element
.appendChild(e2
);
104 qwebirc
.util
.longtoduration = function(l
) {
105 var seconds
= l
% 60;
106 var minutes
= Math
.floor((l
% 3600) / 60);
107 var hours
= Math
.floor((l
% (3600 * 24)) / 3600);
108 var days
= Math
.floor(l
/ (24*3600));
110 return days
+ " days " + hours
+ " hours " + minutes
+ " minutes " + seconds
+ " seconds";
113 qwebirc
.util
.pad = function(x
) {
120 RegExp
.escape = function(text
) {
121 return text
.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
124 RegExp
.fromIRCPattern = function(t
) {
125 /* escape everything but ? . and * */
126 var t
= t
.replace(/[-[\]{}()+,\\^$|#\s]/g, "\\$&");
130 /* now process the rest */
131 for(var i
=0;i
<t
.length
;i
++) {
150 qwebirc
.ui
.insertAt = function(position
, parent
, element
) {
151 if(!parent
.childNodes
|| (position
>= parent
.childNodes
.length
)) {
152 parent
.appendChild(element
);
154 parent
.insertBefore(element
, parent
.childNodes
[position
]);
158 qwebirc
.util
.setCaretPos = function(obj
, pos
) {
159 if($defined(obj
.selectionStart
)) {
161 obj
.setSelectionRange(pos
, pos
);
162 } else if(obj
.createTextRange
) {
163 var range
= obj
.createTextRange();
164 range
.move("character", pos
);
169 qwebirc
.util
.setAtEnd = function(obj
) {
170 qwebirc
.util
.setCaretPos(obj
.value
.length
);
173 qwebirc
.util
.getCaretPos = function(element
) {
174 if($defined(element
.selectionStart
))
175 return element
.selectionStart
;
177 if(document
.selection
) {
179 var sel
= document
.selection
.createRange();
180 sel
.moveStart("character", -element
.value
.length
);
181 return sel
.text
.length
;
185 qwebirc
.util
.browserVersion = function() {
186 //return "engine: " + Browser.Engine.name + " platform: " + Browser.Platform.name + " user agent: " + navigator.userAgent;
187 return navigator
.userAgent
;
190 qwebirc
.util
.getEnclosedWord = function(text
, position
) {
191 var l
= text
.split("");
197 var start
= position
- 1;
199 /* special case: starting with space */
202 /* work back until we find the first space */
203 for(;start
>=0;start
--) {
204 if(l
[start
] == ' ') {
214 var s
= text
.substring(start
);
215 var pos
= s
.indexOf(" ");
217 s
= s
.substring(0, pos
);
222 String
.prototype.startsWith = function(what
) {
223 return this.substring(0, what
.length
) == what
;
226 /* NOT cryptographically secure! */
227 qwebirc
.util
.randHexString = function(numBytes
) {
228 var getByte = function() {
229 return (((1+Math
.random())*0x100)|0).toString(16).substring(1);
233 for(var i
=0;i
<numBytes
;i
++)
239 qwebirc
.util
.importJS = function(name
, watchFor
, onload
) {
240 var script
= document
.createElement("script");
241 script
.type
= "text/javascript";
244 if(Browser
.Engine
.trident
) {
246 var checkFn = function() {
247 if(eval("typeof " + watchFor
) != "undefined") {
255 script
.onload
= onload
;
257 document
.getElementsByTagName("head")[0].appendChild(script
);
260 qwebirc
.util
.createInput = function(type
, parent
, name
, selected
, id
) {
262 if(Browser
.Engine
.trident
) {
264 name
= " name=\"" + escape(name
) + "\"";
269 id
= " id=\"" + escape(id
) + "\"";
274 return $(document
.createElement("<input type=\"" + type
+ "\"" + name
+ id
+ " " + (selected
?" checked":"") + "/>"));
276 /* fallthough, trying it the proper way... */
280 r
= new Element("input");
290 parent
.appendChild(r
);
294 /* From: www.webtoolkit.info */
295 qwebirc
.util
.b64Table
= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
296 qwebirc
.util
.b64Encode = function(data
) {
298 var table
= qwebirc
.util
.b64Table
;
299 for(var i
=0;i
<data
.length
;) {
300 var chr1
= data
.charCodeAt(i
++);
301 var chr2
= data
.charCodeAt(i
++);
302 var chr3
= data
.charCodeAt(i
++);
304 var enc1
= chr1
>> 2;
305 var enc2
= ((chr1
& 3) << 4) | (chr2
>> 4);
306 var enc3
= ((chr2
& 15) << 2) | (chr3
>> 6);
307 var enc4
= chr3
& 63;
311 } else if(isNaN(chr3
)) {
315 output
.push(table
.charAt(enc1
) + table
.charAt(enc2
) + table
.charAt(enc3
) + table
.charAt(enc4
));
317 return output
.join("");
320 /* From: www.webtoolkit.info */
321 qwebirc
.util
.b64Decode = function(data
) {
322 data
= data
.replace(/[^A-Za-z0-9\+\/\=]/g, "");
325 var table
= qwebirc
.util
.b64Table
;
327 /* grossly inefficient... so sue me */
328 while(data
.length
% 4 != 0)
331 for(var i
=0;i
<data
.length
;) {
332 var enc1
= table
.indexOf(data
.charAt(i
++));
333 var enc2
= table
.indexOf(data
.charAt(i
++));
334 var enc3
= table
.indexOf(data
.charAt(i
++));
335 var enc4
= table
.indexOf(data
.charAt(i
++));
337 var chr1
= (enc1
<< 2) | (enc2
>> 4);
338 var chr2
= ((enc2
& 15) << 4) | (enc3
>> 2);
339 var chr3
= ((enc3
& 3) << 6) | enc4
;
341 output
.push(String
.fromCharCode(chr1
));
343 output
.push(String
.fromCharCode(chr2
));
345 output
.push(String
.fromCharCode(chr3
));
348 return output
.join("");
351 qwebirc
.util
.composeAnd = function() {
352 var xargs
= arguments
;
355 for(var i
=0;i
<xargs
.length
;i
++)
356 if(!xargs
[i
].apply(this, arguments
))
363 qwebirc
.util
.invertFn = function(fn
) {
365 return !fn
.apply(this, arguments
);
369 qwebirc
.util
.deviceHasKeyboard = function() {
370 var determine = function() {
371 if(Browser
.Engine
.ipod
)
374 var MOBILE_UAs
= ["Nintendo Wii", " PIE", "BlackBerry", "IEMobile", "Windows CE", "Nokia", "Opera Mini", "Mobile", "mobile", "Pocket", "pocket", "Android"];
375 /* safari not included because iphones/ipods send that, and we checked for iphone/ipod specifically above */
376 var DESKTOP_UAs
= ["Chrome", "Firefox", "Camino", "Iceweasel", "K-Meleon", "Konqueror", "SeaMonkey", "Windows NT", "Windows 9"];
378 var ua
= navigator
.userAgent
;
380 var contains = function(v
) {
381 return ua
.indexOf(v
) > -1;
384 for(var i
=0;i
<MOBILE_UAs
.length
;i
++)
385 if(contains(MOBILE_UAs
[i
]))
388 for(var i
=0;i
<DESKTOP_UAs
.length
;i
++)
389 if(contains(DESKTOP_UAs
[i
]))
396 qwebirc
.util
.deviceHasKeyboard = function() {
403 qwebirc
.util
.generateID_ID
= 0;
404 qwebirc
.util
.generateID = function() {
405 return "qqa-" + qwebirc
.util
.generateID_ID
++;
408 qwebirc
.util
.__log = function(x
) {
410 if(typeof console
== "undefined") {
418 qwebirc
.util
.logger
= {
419 log: function(x
) { qwebirc
.util
.__log("L " + x
) },
420 info: function(x
) { qwebirc
.util
.__log("I " + x
) },
421 error: function(x
) { qwebirc
.util
.__log("E " + x
) },
422 warn: function(x
) { qwebirc
.util
.__log("W " + x
) }
425 qwebirc
.util
.log
= qwebirc
.util
.logger
.log
;