]> jfr.im git - irc/quakenet/qwebirc.git/blame - js/qwebircinterface.js
Support asynchronous DNS resolution in webirc/None WEBIRC modes.
[irc/quakenet/qwebirc.git] / js / qwebircinterface.js
CommitLineData
e20e5a6b 1qwebirc.ui.Interface = new Class({
d65fe45f
CP
2 Implements: [Options],
3 options: {
4 initialNickname: "qwebirc" + Math.ceil(Math.random() * 100000),
5 initialChannels: "",
348574ee
CP
6 networkName: "ExampleNetwork",
7 networkServices: [],
8 loginRegex: null,
9 appTitle: "ExampleNetwork Web IRC",
66de775f 10 searchURL: true,
d65fe45f
CP
11 theme: undefined
12 },
13 initialize: function(element, ui, options) {
14 this.setOptions(options);
15
16 window.addEvent("domready", function() {
2cad083e 17 var ui_ = new ui($(element), new qwebirc.ui.Theme(this.options.theme), this.options);
66de775f
CP
18
19 var callback = function(options) {
e20e5a6b 20 var IRC = new qwebirc.irc.IRCClient(options, ui_);
d65fe45f
CP
21 IRC.connect();
22 window.addEvent("beforeunload", function() {
23 IRC.quit("Page closed");
24 });
66de775f
CP
25 };
26
6500b600
CP
27 var inick = null;
28 var ichans = this.options.initialChannels;
29 var autoConnect = false;
30
66de775f 31 if(this.options.searchURL) {
e20e5a6b 32 var args = qwebirc.util.parseURI(String(document.location));
66de775f 33
8d614417
CP
34 var url = args["url"];
35 var chans, nick = args["nick"];
36
37 if($defined(url)) {
38 ichans = this.parseIRCURL(url);
39 if($defined(chans) && chans != "")
40 canAutoConnect = true;
41 } else {
42 chans = args["channels"];
66de775f 43
8d614417 44 var canAutoConnect = false;
6500b600 45
8d614417
CP
46 if(chans) {
47 var cdata = chans.split(" ");
290c60db 48
8d614417
CP
49 chans = cdata[0].split(",");
50 var chans2 = [];
66de775f 51
8d614417
CP
52 for(i=0;i<chans.length;i++) {
53 chans2[i] = chans[i];
66de775f 54
8d614417
CP
55 if(chans[i].charAt(0) != '#')
56 chans2[i] = "#" + chans2[i]
57 }
58 cdata[0] = chans2.join(",");
59 ichans = cdata.join(" ");
60 canAutoConnect = true;
66de775f 61 }
66de775f
CP
62 }
63
6500b600 64 if($defined(nick))
05d4b0b5
CP
65 inick = this.randSub(nick);
66
6500b600
CP
67 if(args["randomnick"] && args["randomnick"] == 1)
68 inick = this.options.initialNickname;
69
70 /* we only consider autoconnecting if the nick hasn't been supplied, or it has and it's not "" */
71 if(canAutoConnect && (!$defined(inick) || ($defined(inick) && (inick != "")))) {
72 var p = args["prompt"];
73 var pdefault = false;
74
75 if(!$defined(p) || p == "") {
76 pdefault = true;
77 p = false;
78 } else if(p == "0") {
79 p = false;
80 } else {
81 p = true;
82 }
83
84 /* autoconnect if we have channels and nick but only if prompt != 1 */
85 if($defined(inick) && !p) {
86 autoConnect = true;
87 } else if(!pdefault && !p) { /* OR if prompt=0, but not prompt=(nothing) */
88 autoConnect = true;
89 }
90 }
66de775f 91 }
6500b600
CP
92
93 var usingAutoNick = !$defined(nick);
94 if(usingAutoNick && autoConnect)
95 inick = this.options.initialNickname;
bede573a 96
6500b600 97 var details = ui_.loginBox(callback, inick, ichans, autoConnect, usingAutoNick);
d65fe45f 98 }.bind(this));
05d4b0b5
CP
99 },
100 randSub: function(nick) {
101 var getDigit = function() { return Math.floor(Math.random() * 10); }
102
103 return nick.split("").map(function(v) {
104 if(v == ".") {
105 return getDigit();
106 } else {
107 return v;
108 }
109 }).join("");
110
8d614417
CP
111 },
112 parseIRCURL: function(url) {
113 if(url.indexOf(":") == 0)
114 return;
115 var schemeComponents = url.splitMax(":", 2);
116 if(schemeComponents[0].toLowerCase() != "irc" && schemeComponents[0].toLowerCase() != "ircs") {
117 alert("Bad IRC URL scheme.");
118 return;
119 }
120
121 if(url.indexOf("/") == 0) {
122 /* irc: */
123 return;
124 }
125
126 var pathComponents = url.splitMax("/", 4);
127 if(pathComponents.length < 4 || pathComponents[3] == "") {
128 /* irc://abc */
129 return;
130 }
131
132 var args, queryArgs;
133 if(pathComponents[3].indexOf("?") > -1) {
134 queryArgs = qwebirc.util.parseURI(pathComponents[3]);
135 args = pathComponents[3].splitMax("?", 2)[0];
136 } else {
137 args = pathComponents[3];
138 }
139 var parts = args.split(",");
140
141 var channel = parts[0];
142 if(channel.charAt(0) != "#")
143 channel = "#" + channel;
144
145 var not_supported = [], needkey = false, key;
146 for(var i=1;i<parts.length;i++) {
147 var value = parts[i];
148 if(value == "needkey") {
149 needkey = true;
150 } else {
151 not_supported.push(value);
152 }
153 }
154
155 if($defined(queryArgs)) {
156 for(var key_ in queryArgs) {
157 var value = queryArgs[key_];
158
159 if(key_ == "key") {
160 key = value;
161 needkey = true;
162 } else {
163 not_supported.push(key_);
164 }
165 }
166 }
167
168 if(needkey) {
169 if(!$defined(key))
170 key = prompt("Please enter the password for channel " + channel + ":");
171 if($defined(key))
172 channel = channel + " " + key;
173 }
174
175 if(not_supported.length > 0)
176 alert("The following IRC URL components were not accepted: " + not_supported.join(", ") + ".");
177
178 return channel;
d65fe45f
CP
179 }
180});