]> jfr.im git - irc/quakenet/qwebirc.git/blob - js/qwebircinterface.js
Merge default into quakenet.
[irc/quakenet/qwebirc.git] / js / qwebircinterface.js
1 function qwebirc_ui_onbeforeunload(e) { /* IE sucks */
2 if(qwebirc.connected) {
3 var message = "This action will close all active IRC connections.";
4 var e = e || window.event;
5 if(e)
6 e.returnValue = message;
7 return message;
8 }
9 }
10
11 qwebirc.ui.Interface = new Class({
12 Implements: [Options],
13 options: {
14 initialNickname: "qwebirc" + Math.ceil(Math.random() * 100000),
15 initialChannels: "",
16 networkName: "ExampleNetwork",
17 networkServices: [],
18 loginRegex: null,
19 appTitle: "ExampleNetwork Web IRC",
20 searchURL: true,
21 theme: undefined,
22 baseURL: null,
23 hue: null,
24 saturation: null,
25 lightness: null,
26 thue: null,
27 tsaturation: null,
28 tlightness: null,
29 uiOptionsArg: null,
30 nickValidation: null,
31 helpURL: null,
32 dynamicBaseURL: "/",
33 staticBaseURL: "/"
34 },
35 initialize: function(element, ui, options) {
36 this.setOptions(options);
37 var extractHost = function() {
38 var uri = document.location.href;
39
40 /* IE6 doesn't have document.origin ... */
41 var start = uri.indexOf('?');
42 if(start != -1)
43 uri = uri.substring(0, start);
44 var start = uri.indexOf('#');
45 if(start != -1)
46 uri = uri.substring(0, start);
47
48 if(QWEBIRC_DEBUG && uri.endsWith(".html")) {
49 var last = uri.lastIndexOf("/");
50 uri = uri.substring(0, last + 1);
51 }
52 if(uri.substr(uri.length - 1) != "/")
53 uri = uri + "/";
54
55 return uri;
56 };
57
58 options.baseURL = extractHost();
59
60 /* HACK */
61 qwebirc.global = {
62 dynamicBaseURL: options.dynamicBaseURL,
63 staticBaseURL: options.staticBaseURL,
64 baseURL: options.baseURL,
65 helpURL: options.helpURL,
66 nicknameValidator: $defined(options.nickValidation) ? new qwebirc.irc.NicknameValidator(options.nickValidation) : new qwebirc.irc.DummyNicknameValidator()
67 };
68
69 window.addEvent("domready", function() {
70 var callback = function(options) {
71 var IRC = new qwebirc.irc.IRCClient(options, ui_);
72 IRC.connect();
73 window.onbeforeunload = qwebirc_ui_onbeforeunload;
74 window.addEvent("unload", function() {
75 IRC.quit("Page closed");
76 });
77 };
78
79 var inick = null;
80 var ichans = this.options.initialChannels;
81 var autoConnect = false;
82
83 if(this.options.searchURL) {
84 var args = qwebirc.util.parseURI(String(document.location));
85 this.options.hue = this.getHueArg(args, "");
86 this.options.saturation = this.getSaturationArg(args, "");
87 this.options.lightness = this.getLightnessArg(args, "");
88
89 this.options.thue = this.getHueArg(args, "t");
90 this.options.tsaturation = this.getSaturationArg(args, "t");
91 this.options.tlightness = this.getLightnessArg(args, "t");
92
93 if(args.contains("uio"))
94 this.options.uiOptionsArg = args.get("uio");
95
96 var url = args.get("url");
97 var chans, nick = args.get("nick");
98
99 if($defined(url)) {
100 ichans = this.parseIRCURL(url);
101 if($defined(chans) && chans != "")
102 canAutoConnect = true;
103 } else {
104 chans = args.get("channels");
105
106 var canAutoConnect = false;
107
108 if(chans) {
109 var cdata = chans.split(" ");
110
111 chans = cdata[0].split(",");
112 var chans2 = [];
113
114 for(var i=0;i<chans.length;i++) {
115 chans2[i] = chans[i];
116
117 var prefix = chans[i].charAt(0);
118 if(prefix != '#' && prefix != '&')
119 chans2[i] = "#" + chans2[i]
120 }
121 cdata[0] = chans2.join(",");
122 ichans = cdata.join(" ");
123 canAutoConnect = true;
124 }
125 }
126
127 if($defined(nick))
128 inick = this.randSub(nick);
129
130 if(args.contains("randomnick") && args.get("randomnick") == 1)
131 inick = this.options.initialNickname;
132
133 /* we only consider autoconnecting if the nick hasn't been supplied, or it has and it's not "" */
134 if(canAutoConnect && (!$defined(inick) || ($defined(inick) && (inick != "")))) {
135 var p = args.get("prompt");
136 var pdefault = false;
137
138 if(!$defined(p) || p == "") {
139 pdefault = true;
140 p = false;
141 } else if(p == "0") {
142 p = false;
143 } else {
144 p = true;
145 }
146
147 /* autoconnect if we have channels and nick but only if prompt != 1 */
148 if($defined(inick) && !p) {
149 autoConnect = true;
150 } else if(!pdefault && !p) { /* OR if prompt=0, but not prompt=(nothing) */
151 autoConnect = true;
152 }
153 }
154 }
155
156 var ui_ = new ui($(element), new qwebirc.ui.Theme(this.options.theme), this.options);
157
158 var usingAutoNick = !$defined(nick);
159 if(usingAutoNick && autoConnect)
160 inick = this.options.initialNickname;
161
162 var details = ui_.loginBox(callback, inick, ichans, autoConnect, usingAutoNick);
163 }.bind(this));
164 },
165 getHueArg: function(args, t) {
166 var hue = args.get(t + "hue");
167 if(!$defined(hue))
168 return null;
169 hue = parseInt(hue);
170 if(hue > 360 || hue < 0)
171 return null;
172 return hue;
173 },
174 getSaturationArg: function(args, t) {
175 var saturation = args.get(t + "saturation");
176 if(!$defined(saturation))
177 return null;
178 saturation = parseInt(saturation);
179 if(saturation > 100 || saturation < -100)
180 return null;
181 return saturation;
182 },
183 getLightnessArg: function(args, t) {
184 var lightness = args.get(t + "lightness");
185 if(!$defined(lightness))
186 return null;
187 lightness = parseInt(lightness);
188 if(lightness > 100 || lightness < -100)
189 return null;
190 return lightness;
191 },
192 randSub: function(nick) {
193 var getDigit = function() { return Math.floor(Math.random() * 10); }
194
195 return nick.split("").map(function(v) {
196 if(v == ".") {
197 return getDigit();
198 } else {
199 return v;
200 }
201 }).join("");
202
203 },
204 parseIRCURL: function(url) {
205 if(url.indexOf(":") == 0)
206 return;
207 var schemeComponents = url.splitMax(":", 2);
208 if(schemeComponents[0].toLowerCase() != "irc" && schemeComponents[0].toLowerCase() != "ircs") {
209 alert("Bad IRC URL scheme.");
210 return;
211 }
212
213 if(url.indexOf("/") == 0) {
214 /* irc: */
215 return;
216 }
217
218 var pathComponents = url.splitMax("/", 4);
219 if(pathComponents.length < 4 || pathComponents[3] == "") {
220 /* irc://abc */
221 return;
222 }
223
224 var args, queryArgs;
225 if(pathComponents[3].indexOf("?") > -1) {
226 queryArgs = qwebirc.util.parseURI(pathComponents[3]);
227 args = pathComponents[3].splitMax("?", 2)[0];
228 } else {
229 args = pathComponents[3];
230 }
231 var parts = args.split(",");
232
233 var channel = parts[0];
234 if(channel.charAt(0) != "#")
235 channel = "#" + channel;
236
237 var not_supported = [], needkey = false, key;
238 for(var i=1;i<parts.length;i++) {
239 var value = parts[i];
240 if(value == "needkey") {
241 needkey = true;
242 } else {
243 not_supported.push(value);
244 }
245 }
246
247 if($defined(queryArgs)) {
248 queryArgs.each(function(key_, value) {
249 if(key_ == "key") {
250 key = value;
251 needkey = true;
252 } else {
253 not_supported.push(key_);
254 }
255 });
256 }
257
258 if(needkey) {
259 if(!$defined(key))
260 key = prompt("Please enter the password for channel " + channel + ":");
261 if($defined(key))
262 channel = channel + " " + key;
263 }
264
265 if(not_supported.length > 0)
266 alert("The following IRC URL components were not accepted: " + not_supported.join(", ") + ".");
267
268 return channel;
269 }
270 });