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