]> jfr.im git - irc/quakenet/qwebirc.git/blob - js/ui/baseui.js
Add mousewheel on tab bar and alt+left/right.
[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 if(x.key == "a" || x.key == "A") {
128 var highestNum = 0;
129 var highestIndex = -1;
130 new Event(x).stop();
131 for(var i=0;i<this.windowArray.length;i++) {
132 var h = this.windowArray[i].hilighted;
133 if(h > highestNum) {
134 highestIndex = i;
135 highestNum = h;
136 }
137 }
138 if(highestIndex > -1)
139 this.selectWindow(this.windowArray[highestIndex]);
140 } else if(x.key >= '0' && x.key <= '9') {
141 new Event(x).stop();
142
143 number = x.key - '0';
144 if(number == 0)
145 number = 10
146
147 number = number - 1;
148
149 if(number >= this.windowArray.length)
150 return;
151
152 this.selectWindow(this.windowArray[number]);
153 } else if(x.key == "left") {
154 this.prevWindow();
155 } else if(x.key == "right") {
156 this.nextWindow();
157 }
158 }.bind(this));
159 },
160 newCustomWindow: function(name, select, type) {
161 if(!type)
162 type = qwebirc.ui.WINDOW_CUSTOM;
163
164 var w = this.newWindow(qwebirc.ui.CUSTOM_CLIENT, type, name);
165 w.addEvent("close", function(w) {
166 delete this.windows[name];
167 }.bind(this));
168
169 if(select)
170 this.selectWindow(w);
171
172 return w;
173 },
174 embeddedWindow: function() {
175 if(this.embedded) {
176 this.selectWindow(this.embedded)
177 return;
178 }
179
180 this.embedded = this.newCustomWindow("Embedding wizard", true);
181 this.embedded.addEvent("close", function() {
182 this.embedded = null;
183 }.bind(this));
184
185 var ew = new qwebirc.ui.EmbedWizard({parent: this.embedded.lines});
186 ew.addEvent("close", function() {
187 this.embedded.close();
188 }.bind(this));
189 },
190 urlDispatcher: function(name) {
191 if(name == "embedded")
192 return ["a", this.embeddedWindow.bind(this)];
193
194 return null;
195 }
196 });
197
198 qwebirc.ui.QuakeNetUI = new Class({
199 Extends: qwebirc.ui.StandardUI,
200 urlDispatcher: function(name, window) {
201 if(name == "qwhois") {
202 return ["a", function(auth) {
203 this.client.exec("/MSG Q whois #" + auth);
204 }.bind(window)];
205 }
206 if(name == "whois") {
207 return ["span", function(nick) {
208 this.client.exec("/WHOIS " + nick);
209 }.bind(window)];
210 }
211
212 return this.parent(name);
213 }
214 });
215
216 qwebirc.ui.NewLoginUI = new Class({
217 Extends: qwebirc.ui.QuakeNetUI,
218 loginBox: function(callbackfn, initialNickname, initialChannels, autoConnect, autoNick) {
219 this.postInitialize();
220 var w = this.newCustomWindow("Connect", true, qwebirc.ui.WINDOW_CONNECT);
221 var callback = function(args) {
222 w.close();
223 callbackfn(args);
224 };
225
226 qwebirc.ui.GenericLoginBox(w.lines, callback, initialNickname, initialChannels, autoConnect, autoNick);
227 }
228 });