]> jfr.im git - irc/quakenet/qwebirc.git/blame - js/ui/baseui.js
Add mousewheel on tab bar and alt+left/right.
[irc/quakenet/qwebirc.git] / js / ui / baseui.js
CommitLineData
e20e5a6b
CP
1qwebirc.ui.WINDOW_STATUS = 1;
2qwebirc.ui.WINDOW_QUERY = 2;
3qwebirc.ui.WINDOW_CHANNEL = 3;
4qwebirc.ui.WINDOW_CUSTOM = 4;
5qwebirc.ui.WINDOW_CONNECT = 5;
6qwebirc.ui.CUSTOM_CLIENT = "custom";
9e769c12 7
e20e5a6b 8qwebirc.ui.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 = {};
e20e5a6b 18 this.windows[qwebirc.ui.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;
e20e5a6b 25 this.commandhistory = new qwebirc.irc.CommandHistory();
9e769c12
CP
26 },
27 newClient: function(client) {
96f28062
CP
28 client.hilightController = new qwebirc.ui.HilightController(client);
29
9e769c12 30 this.windows[client] = {}
e20e5a6b 31 var w = this.newWindow(client, qwebirc.ui.WINDOW_STATUS, "Status");
9e769c12 32 this.selectWindow(w);
e8db8558
CP
33 if(!this.firstClient) {
34 this.firstClient = true;
e20e5a6b 35 w.addLine("", "qwebirc v" + qwebirc.VERSION);
4094890f 36 w.addLine("", "Copyright (C) 2008 Chris Porter. All rights reserved.");
e8db8558 37 w.addLine("", "http://webchat.quakenet.org/");
4094890f 38 w.addLine("", "This is BETA quality software, please report bugs to slug@quakenet.org");
e8db8558 39 }
9e769c12
CP
40 return w;
41 },
42 newWindow: function(client, type, name) {
43 var identifier = name;
e20e5a6b 44 if(type == qwebirc.ui.WINDOW_STATUS)
9e769c12
CP
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 */
a59dc700 62 document.title = window.name + " - " + this.options.appTitle;
9e769c12 63 },
ff4befd8
CP
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 },
9e769c12
CP
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);
6f2e4a37
CP
94 if(index == -1) {
95 return;
96 } else if(index == 0) {
9e769c12
CP
97 this.selectWindow(this.windowArray[1]);
98 } else {
99 this.selectWindow(this.windowArray[index - 1]);
100 }
9e769c12
CP
101 }
102 }
103
404cfb58 104 this.windowArray = this.windowArray.erase(window);
9e769c12 105 delete this.windows[window.client][window.identifier];
eb9b087b 106 },
eb9b087b
CP
107 /*
108 this shouldn't be called by overriding classes!
66de775f 109 they should implement their own!
eb9b087b
CP
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 */
66de775f 114 loginBox: function(callback, initialNickname, initialChannels, autoConnect, autoNick) {
e20e5a6b 115 qwebirc.ui.GenericLoginBox(this.parentElement, callback, initialNickname, initialChannels, autoConnect, autoNick);
9e769c12
CP
116 }
117});
381fddfd 118
e20e5a6b
CP
119qwebirc.ui.StandardUI = new Class({
120 Extends: qwebirc.ui.BaseUI,
381fddfd
CP
121 initialize: function(parentElement, windowClass, uiName, options) {
122 this.parent(parentElement, windowClass, uiName, options);
381fddfd 123 window.addEvent("keydown", function(x) {
bc4d9f4a 124 if(!x.alt || x.control)
381fddfd
CP
125 return;
126
127 if(x.key == "a" || x.key == "A") {
ffe442b0
CP
128 var highestNum = 0;
129 var highestIndex = -1;
424608ac 130 new Event(x).stop();
381fddfd 131 for(var i=0;i<this.windowArray.length;i++) {
ffe442b0
CP
132 var h = this.windowArray[i].hilighted;
133 if(h > highestNum) {
134 highestIndex = i;
135 highestNum = h;
381fddfd
CP
136 }
137 }
ffe442b0
CP
138 if(highestIndex > -1)
139 this.selectWindow(this.windowArray[highestIndex]);
381fddfd 140 } else if(x.key >= '0' && x.key <= '9') {
424608ac
CP
141 new Event(x).stop();
142
381fddfd
CP
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]);
ff4befd8
CP
153 } else if(x.key == "left") {
154 this.prevWindow();
155 } else if(x.key == "right") {
156 this.nextWindow();
381fddfd
CP
157 }
158 }.bind(this));
841a451d 159 },
8af49135
CP
160 newCustomWindow: function(name, select, type) {
161 if(!type)
e20e5a6b 162 type = qwebirc.ui.WINDOW_CUSTOM;
8af49135 163
e20e5a6b 164 var w = this.newWindow(qwebirc.ui.CUSTOM_CLIENT, type, name);
8af49135
CP
165 w.addEvent("close", function(w) {
166 delete this.windows[name];
167 }.bind(this));
168
169 if(select)
170 this.selectWindow(w);
6c19eb8f 171
8af49135
CP
172 return w;
173 },
174 embeddedWindow: function() {
175 if(this.embedded) {
176 this.selectWindow(this.embedded)
177 return;
841a451d 178 }
8af49135 179
6c19eb8f 180 this.embedded = this.newCustomWindow("Embedding wizard", true);
8af49135
CP
181 this.embedded.addEvent("close", function() {
182 this.embedded = null;
183 }.bind(this));
184
e20e5a6b 185 var ew = new qwebirc.ui.EmbedWizard({parent: this.embedded.lines});
8af49135
CP
186 ew.addEvent("close", function() {
187 this.embedded.close();
188 }.bind(this));
841a451d 189 },
8af49135
CP
190 urlDispatcher: function(name) {
191 if(name == "embedded")
925fc357 192 return ["a", this.embeddedWindow.bind(this)];
8af49135
CP
193
194 return null;
195 }
381fddfd 196});
6f2e4a37 197
2cd9e32d 198qwebirc.ui.QuakeNetUI = new Class({
e20e5a6b 199 Extends: qwebirc.ui.StandardUI,
2cd9e32d
CP
200 urlDispatcher: function(name, window) {
201 if(name == "qwhois") {
925fc357 202 return ["a", function(auth) {
2cd9e32d 203 this.client.exec("/MSG Q whois #" + auth);
925fc357
CP
204 }.bind(window)];
205 }
206 if(name == "whois") {
207 return ["span", function(nick) {
208 this.client.exec("/WHOIS " + nick);
209 }.bind(window)];
2cd9e32d
CP
210 }
211
212 return this.parent(name);
213 }
214});
215
216qwebirc.ui.NewLoginUI = new Class({
217 Extends: qwebirc.ui.QuakeNetUI,
6f2e4a37
CP
218 loginBox: function(callbackfn, initialNickname, initialChannels, autoConnect, autoNick) {
219 this.postInitialize();
e20e5a6b 220 var w = this.newCustomWindow("Connect", true, qwebirc.ui.WINDOW_CONNECT);
6f2e4a37
CP
221 var callback = function(args) {
222 w.close();
223 callbackfn(args);
224 };
225
e20e5a6b 226 qwebirc.ui.GenericLoginBox(w.lines, callback, initialNickname, initialChannels, autoConnect, autoNick);
6f2e4a37
CP
227 }
228});