]>
Commit | Line | Data |
---|---|---|
65152b01 CP |
1 | var WINDOW_STATUS = 1; |
2 | var WINDOW_QUERY = 2; | |
3 | var WINDOW_CHANNEL = 3; | |
8af49135 CP |
4 | var WINDOW_CUSTOM = 4; |
5 | var WINDOW_CONNECT = 5; | |
6 | var CUSTOM_CLIENT = "custom"; | |
9e769c12 | 7 | |
381fddfd | 8 | var BaseUI = new Class({ |
a59dc700 CP |
9 | Implements: [Events, Options], |
10 | options: { | |
7c633700 CP |
11 | appTitle: "QuakeNet Web IRC", |
12 | singleWindow: true | |
a59dc700 CP |
13 | }, |
14 | initialize: function(parentElement, windowClass, uiName, options) { | |
15 | this.setOptions(options); | |
16 | ||
9e769c12 | 17 | this.windows = {}; |
8af49135 | 18 | this.windows[CUSTOM_CLIENT] = {}; |
9e769c12 CP |
19 | this.windowArray = []; |
20 | this.windowClass = windowClass; | |
21 | this.parentElement = parentElement; | |
22 | this.parentElement.addClass("qwebirc"); | |
23 | this.parentElement.addClass("qwebirc-" + uiName); | |
e8db8558 | 24 | this.firstClient = false; |
9b63b053 | 25 | this.commandhistory = new CommandHistory(); |
9e769c12 CP |
26 | }, |
27 | newClient: function(client) { | |
28 | this.windows[client] = {} | |
29 | var w = this.newWindow(client, WINDOW_STATUS, "Status"); | |
30 | this.selectWindow(w); | |
e8db8558 CP |
31 | if(!this.firstClient) { |
32 | this.firstClient = true; | |
4094890f CP |
33 | w.addLine("", "qwebirc v" + QWEBIRC_VERSION); |
34 | w.addLine("", "Copyright (C) 2008 Chris Porter. All rights reserved."); | |
e8db8558 | 35 | w.addLine("", "http://webchat.quakenet.org/"); |
4094890f | 36 | w.addLine("", "This is BETA quality software, please report bugs to slug@quakenet.org"); |
e8db8558 | 37 | } |
9e769c12 CP |
38 | return w; |
39 | }, | |
40 | newWindow: function(client, type, name) { | |
41 | var identifier = name; | |
42 | if(type == WINDOW_STATUS) | |
43 | identifier = ""; | |
44 | ||
45 | var w = this.windows[client][identifier] = new this.windowClass(this, client, type, name, identifier); | |
46 | this.windowArray.push(w); | |
47 | ||
48 | return w; | |
49 | }, | |
50 | getActiveWindow: function() { | |
51 | return this.active; | |
52 | }, | |
53 | __setActiveWindow: function(window) { | |
54 | this.active = window; | |
55 | }, | |
56 | selectWindow: function(window) { | |
57 | if(this.active) | |
58 | this.active.deselect(); | |
59 | window.select(); /* calls setActiveWindow */ | |
a59dc700 | 60 | document.title = window.name + " - " + this.options.appTitle; |
9e769c12 CP |
61 | }, |
62 | __closed: function(window) { | |
63 | if(window.active) { | |
64 | this.active = undefined; | |
65 | if(this.windowArray.length == 1) { | |
66 | this.windowArray = []; | |
67 | } else { | |
68 | var index = this.windowArray.indexOf(window); | |
6f2e4a37 CP |
69 | if(index == -1) { |
70 | return; | |
71 | } else if(index == 0) { | |
9e769c12 CP |
72 | this.selectWindow(this.windowArray[1]); |
73 | } else { | |
74 | this.selectWindow(this.windowArray[index - 1]); | |
75 | } | |
76 | ||
77 | this.windowArray = this.windowArray.erase(window); | |
78 | } | |
79 | } | |
80 | ||
81 | delete this.windows[window.client][window.identifier]; | |
eb9b087b | 82 | }, |
eb9b087b CP |
83 | /* |
84 | this shouldn't be called by overriding classes! | |
66de775f | 85 | they should implement their own! |
eb9b087b CP |
86 | some form of user input MUST be received before an |
87 | IRC connection is made, else users are going to get | |
88 | tricked into getting themselves glined | |
89 | */ | |
66de775f CP |
90 | loginBox: function(callback, initialNickname, initialChannels, autoConnect, autoNick) { |
91 | GenericLoginBox(this.parentElement, callback, initialNickname, initialChannels, autoConnect, autoNick); | |
92 | /*if(autoConnect) { | |
93 | var c = initialChannels.split(","); | |
94 | var ctext; | |
95 | ||
96 | if(c.length > 1) { | |
97 | var last = c.pop(); | |
98 | ctext = c.join(", ") + " and " + last; | |
99 | } else { | |
100 | ctext = c[0]; | |
101 | } | |
102 | ||
103 | var nicktext; | |
104 | if(autoNick) { | |
105 | nicktext = ""; | |
106 | } else { | |
107 | nicktext = " (as '" + initialNickname + "')" | |
108 | } | |
109 | if(confirm("Connect to IRC and join channels " + ctext + nicktext + "?")) | |
110 | callback({"nickname": initialNickname, "autojoin": initialChannels}); | |
111 | return; | |
112 | } | |
eb9b087b | 113 | |
d65fe45f | 114 | var nick = prompt("Nickname:", initialNickname); |
eb9b087b CP |
115 | if(!nick) { |
116 | alert("Aborted."); | |
117 | return; | |
118 | } | |
119 | ||
d65fe45f | 120 | var chans = prompt("Channels (seperate by comma):", initialChannels); |
4656ff82 | 121 | callback({"nickname": nick, "autojoin": chans}); |
66de775f | 122 | */ |
9e769c12 CP |
123 | } |
124 | }); | |
381fddfd CP |
125 | |
126 | var UI = new Class({ | |
127 | Extends: BaseUI, | |
128 | initialize: function(parentElement, windowClass, uiName, options) { | |
129 | this.parent(parentElement, windowClass, uiName, options); | |
381fddfd CP |
130 | window.addEvent("keydown", function(x) { |
131 | if(!x.alt) | |
132 | return; | |
133 | ||
134 | if(x.key == "a" || x.key == "A") { | |
424608ac | 135 | new Event(x).stop(); |
381fddfd CP |
136 | for(var i=0;i<this.windowArray.length;i++) { |
137 | if(this.windowArray[i].hilighted) { | |
138 | this.selectWindow(this.windowArray[i]); | |
139 | break; | |
140 | } | |
141 | } | |
142 | } else if(x.key >= '0' && x.key <= '9') { | |
424608ac CP |
143 | new Event(x).stop(); |
144 | ||
381fddfd CP |
145 | number = x.key - '0'; |
146 | if(number == 0) | |
147 | number = 10 | |
148 | ||
149 | number = number - 1; | |
150 | ||
151 | if(number >= this.windowArray.length) | |
152 | return; | |
153 | ||
154 | this.selectWindow(this.windowArray[number]); | |
155 | } | |
156 | }.bind(this)); | |
841a451d | 157 | }, |
8af49135 CP |
158 | newCustomWindow: function(name, select, type) { |
159 | if(!type) | |
160 | type = WINDOW_CUSTOM; | |
161 | ||
162 | var w = this.newWindow(CUSTOM_CLIENT, type, name); | |
163 | w.addEvent("close", function(w) { | |
164 | delete this.windows[name]; | |
165 | }.bind(this)); | |
166 | ||
167 | if(select) | |
168 | this.selectWindow(w); | |
169 | ||
170 | return w; | |
171 | }, | |
172 | embeddedWindow: function() { | |
173 | if(this.embedded) { | |
174 | this.selectWindow(this.embedded) | |
175 | return; | |
841a451d | 176 | } |
8af49135 CP |
177 | |
178 | this.embedded = this.newCustomWindow("Embedded wizard", true); | |
179 | this.embedded.addEvent("close", function() { | |
180 | this.embedded = null; | |
181 | }.bind(this)); | |
182 | ||
183 | var ew = new WebmasterGuide({parent: this.embedded.lines}); | |
184 | ew.addEvent("close", function() { | |
185 | this.embedded.close(); | |
186 | }.bind(this)); | |
841a451d | 187 | }, |
8af49135 CP |
188 | urlDispatcher: function(name) { |
189 | if(name == "embedded") | |
190 | return this.embeddedWindow.bind(this); | |
191 | ||
192 | return null; | |
193 | } | |
381fddfd | 194 | }); |
6f2e4a37 CP |
195 | |
196 | var NewLoginUI = new Class({ | |
197 | Extends: UI, | |
198 | loginBox: function(callbackfn, initialNickname, initialChannels, autoConnect, autoNick) { | |
199 | this.postInitialize(); | |
200 | var w = this.newCustomWindow("Connect", true, WINDOW_CONNECT); | |
201 | var callback = function(args) { | |
202 | w.close(); | |
203 | callbackfn(args); | |
204 | }; | |
205 | ||
206 | GenericLoginBox(w.lines, callback, initialNickname, initialChannels, autoConnect, autoNick); | |
207 | } | |
208 | }); |