]> jfr.im git - irc/quakenet/qwebirc.git/blob - js/ui/baseui.js
Should stop the event ideally.
[irc/quakenet/qwebirc.git] / js / ui / baseui.js
1 qwebirc.ui.WINDOW_STATUS = 1;
2 qwebirc.ui.WINDOW_QUERY = 2;
3 qwebirc.ui.WINDOW_CHANNEL = 3;
4 qwebirc.ui.WINDOW_CUSTOM = 4;
5 qwebirc.ui.WINDOW_CONNECT = 5;
6 qwebirc.ui.CUSTOM_CLIENT = "custom";
7
8 qwebirc.ui.BaseUI = new Class({
9 Implements: [Events, Options],
10 options: {
11 appTitle: "QuakeNet Web IRC",
12 singleWindow: true
13 },
14 initialize: function(parentElement, windowClass, uiName, options) {
15 this.setOptions(options);
16
17 this.windows = {};
18 this.windows[qwebirc.ui.CUSTOM_CLIENT] = {};
19 this.windowArray = [];
20 this.windowClass = windowClass;
21 this.parentElement = parentElement;
22 this.parentElement.addClass("qwebirc");
23 this.parentElement.addClass("qwebirc-" + uiName);
24 this.firstClient = false;
25 this.commandhistory = new qwebirc.irc.CommandHistory();
26 },
27 newClient: function(client) {
28 client.hilightController = new qwebirc.ui.HilightController(client);
29
30 this.windows[client] = {}
31 var w = this.newWindow(client, qwebirc.ui.WINDOW_STATUS, "Status");
32 this.selectWindow(w);
33 if(!this.firstClient) {
34 this.firstClient = true;
35 w.addLine("", "qwebirc v" + qwebirc.VERSION);
36 w.addLine("", "Copyright (C) 2008 Chris Porter. All rights reserved.");
37 w.addLine("", "http://webchat.quakenet.org/");
38 w.addLine("", "This is BETA quality software, please report bugs to slug@quakenet.org");
39 }
40 return w;
41 },
42 newWindow: function(client, type, name) {
43 var identifier = name;
44 if(type == qwebirc.ui.WINDOW_STATUS)
45 identifier = "";
46
47 var w = this.windows[client][identifier] = new this.windowClass(this, client, type, name, identifier);
48 this.windowArray.push(w);
49
50 return w;
51 },
52 getActiveWindow: function() {
53 return this.active;
54 },
55 __setActiveWindow: function(window) {
56 this.active = window;
57 },
58 selectWindow: function(window) {
59 if(this.active)
60 this.active.deselect();
61 window.select(); /* calls setActiveWindow */
62 document.title = window.name + " - " + this.options.appTitle;
63 },
64 nextWindow: function(direction) {
65 if(this.windowArray.length == 0 || !this.active)
66 return;
67
68 if(!direction)
69 direction = 1;
70
71 var index = this.windowArray.indexOf(this.active);
72 if(index == -1)
73 return;
74
75 index = index + direction;
76 if(index < 0) {
77 index = this.windowArray.length - 1;
78 } else if(index >= this.windowArray.length) {
79 index = 0;
80 }
81
82 this.selectWindow(this.windowArray[index]);
83 },
84 prevWindow: function() {
85 this.nextWindow(-1);
86 },
87 __closed: function(window) {
88 if(window.active) {
89 this.active = undefined;
90 if(this.windowArray.length == 1) {
91 this.windowArray = [];
92 } else {
93 var index = this.windowArray.indexOf(window);
94 if(index == -1) {
95 return;
96 } else if(index == 0) {
97 this.selectWindow(this.windowArray[1]);
98 } else {
99 this.selectWindow(this.windowArray[index - 1]);
100 }
101 }
102 }
103
104 this.windowArray = this.windowArray.erase(window);
105 delete this.windows[window.client][window.identifier];
106 },
107 /*
108 this shouldn't be called by overriding classes!
109 they should implement their own!
110 some form of user input MUST be received before an
111 IRC connection is made, else users are going to get
112 tricked into getting themselves glined
113 */
114 loginBox: function(callback, initialNickname, initialChannels, autoConnect, autoNick) {
115 qwebirc.ui.GenericLoginBox(this.parentElement, callback, initialNickname, initialChannels, autoConnect, autoNick);
116 }
117 });
118
119 qwebirc.ui.StandardUI = new Class({
120 Extends: qwebirc.ui.BaseUI,
121 initialize: function(parentElement, windowClass, uiName, options) {
122 this.parent(parentElement, windowClass, uiName, options);
123 window.addEvent("keydown", function(x) {
124 if(!x.alt || x.control)
125 return;
126
127 var success = false;
128 if(x.key == "a" || x.key == "A") {
129 var highestNum = 0;
130 var highestIndex = -1;
131 success = true;
132
133 new Event(x).stop();
134 for(var i=0;i<this.windowArray.length;i++) {
135 var h = this.windowArray[i].hilighted;
136 if(h > highestNum) {
137 highestIndex = i;
138 highestNum = h;
139 }
140 }
141 if(highestIndex > -1)
142 this.selectWindow(this.windowArray[highestIndex]);
143 } else if(x.key >= '0' && x.key <= '9') {
144 success = true;
145
146 number = x.key - '0';
147 if(number == 0)
148 number = 10
149
150 number = number - 1;
151
152 if(number >= this.windowArray.length)
153 return;
154
155 this.selectWindow(this.windowArray[number]);
156 } else if(x.key == "left") {
157 this.prevWindow();
158 success = true;
159 } else if(x.key == "right") {
160 this.nextWindow();
161 success = true;
162 }
163 if(success)
164 new Event(x).stop();
165 }.bind(this));
166 },
167 newCustomWindow: function(name, select, type) {
168 if(!type)
169 type = qwebirc.ui.WINDOW_CUSTOM;
170
171 var w = this.newWindow(qwebirc.ui.CUSTOM_CLIENT, type, name);
172 w.addEvent("close", function(w) {
173 delete this.windows[name];
174 }.bind(this));
175
176 if(select)
177 this.selectWindow(w);
178
179 return w;
180 },
181 embeddedWindow: function() {
182 if(this.embedded) {
183 this.selectWindow(this.embedded)
184 return;
185 }
186
187 this.embedded = this.newCustomWindow("Embedding wizard", true);
188 this.embedded.addEvent("close", function() {
189 this.embedded = null;
190 }.bind(this));
191
192 var ew = new qwebirc.ui.EmbedWizard({parent: this.embedded.lines});
193 ew.addEvent("close", function() {
194 this.embedded.close();
195 }.bind(this));
196 },
197 urlDispatcher: function(name) {
198 if(name == "embedded")
199 return ["a", this.embeddedWindow.bind(this)];
200
201 return null;
202 }
203 });
204
205 qwebirc.ui.QuakeNetUI = new Class({
206 Extends: qwebirc.ui.StandardUI,
207 urlDispatcher: function(name, window) {
208 if(name == "qwhois") {
209 return ["a", function(auth) {
210 this.client.exec("/MSG Q whois #" + auth);
211 }.bind(window)];
212 }
213 if(name == "whois") {
214 return ["span", function(nick) {
215 this.client.exec("/WHOIS " + nick);
216 }.bind(window)];
217 }
218
219 return this.parent(name);
220 }
221 });
222
223 qwebirc.ui.NewLoginUI = new Class({
224 Extends: qwebirc.ui.QuakeNetUI,
225 loginBox: function(callbackfn, initialNickname, initialChannels, autoConnect, autoNick) {
226 this.postInitialize();
227 var w = this.newCustomWindow("Connect", true, qwebirc.ui.WINDOW_CONNECT);
228 var callback = function(args) {
229 w.close();
230 callbackfn(args);
231 };
232
233 qwebirc.ui.GenericLoginBox(w.lines, callback, initialNickname, initialChannels, autoConnect, autoNick);
234 }
235 });