]> jfr.im git - irc/quakenet/qwebirc.git/blame - js/ui/baseui.js
TODO update, also include more instead of sortables.
[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);
3184781b
CP
123
124 this.tabCompleter = new qwebirc.ui.TabCompleterFactory(this);
125
381fddfd 126 window.addEvent("keydown", function(x) {
bc4d9f4a 127 if(!x.alt || x.control)
381fddfd
CP
128 return;
129
cf00dc43 130 var success = false;
381fddfd 131 if(x.key == "a" || x.key == "A") {
ffe442b0
CP
132 var highestNum = 0;
133 var highestIndex = -1;
cf00dc43
CP
134 success = true;
135
424608ac 136 new Event(x).stop();
381fddfd 137 for(var i=0;i<this.windowArray.length;i++) {
ffe442b0
CP
138 var h = this.windowArray[i].hilighted;
139 if(h > highestNum) {
140 highestIndex = i;
141 highestNum = h;
381fddfd
CP
142 }
143 }
ffe442b0
CP
144 if(highestIndex > -1)
145 this.selectWindow(this.windowArray[highestIndex]);
381fddfd 146 } else if(x.key >= '0' && x.key <= '9') {
cf00dc43 147 success = true;
424608ac 148
381fddfd
CP
149 number = x.key - '0';
150 if(number == 0)
151 number = 10
152
153 number = number - 1;
154
155 if(number >= this.windowArray.length)
156 return;
157
158 this.selectWindow(this.windowArray[number]);
ff4befd8
CP
159 } else if(x.key == "left") {
160 this.prevWindow();
cf00dc43 161 success = true;
ff4befd8
CP
162 } else if(x.key == "right") {
163 this.nextWindow();
cf00dc43 164 success = true;
381fddfd 165 }
cf00dc43
CP
166 if(success)
167 new Event(x).stop();
381fddfd 168 }.bind(this));
841a451d 169 },
8af49135
CP
170 newCustomWindow: function(name, select, type) {
171 if(!type)
e20e5a6b 172 type = qwebirc.ui.WINDOW_CUSTOM;
8af49135 173
e20e5a6b 174 var w = this.newWindow(qwebirc.ui.CUSTOM_CLIENT, type, name);
8af49135
CP
175 w.addEvent("close", function(w) {
176 delete this.windows[name];
177 }.bind(this));
178
179 if(select)
180 this.selectWindow(w);
6c19eb8f 181
8af49135
CP
182 return w;
183 },
184 embeddedWindow: function() {
185 if(this.embedded) {
186 this.selectWindow(this.embedded)
187 return;
841a451d 188 }
8af49135 189
6c19eb8f 190 this.embedded = this.newCustomWindow("Embedding wizard", true);
8af49135
CP
191 this.embedded.addEvent("close", function() {
192 this.embedded = null;
193 }.bind(this));
194
f9b2babd 195 this.embedded.lines.addClass("embeddedwizard");
e20e5a6b 196 var ew = new qwebirc.ui.EmbedWizard({parent: this.embedded.lines});
8af49135
CP
197 ew.addEvent("close", function() {
198 this.embedded.close();
199 }.bind(this));
841a451d 200 },
8af49135
CP
201 urlDispatcher: function(name) {
202 if(name == "embedded")
925fc357 203 return ["a", this.embeddedWindow.bind(this)];
8af49135
CP
204
205 return null;
3184781b
CP
206 },
207 tabComplete: function(element) {
208 this.tabCompleter.tabComplete(element);
209 },
210 resetTabComplete: function() {
211 this.tabCompleter.reset();
8af49135 212 }
381fddfd 213});
6f2e4a37 214
2cd9e32d 215qwebirc.ui.QuakeNetUI = new Class({
e20e5a6b 216 Extends: qwebirc.ui.StandardUI,
2cd9e32d
CP
217 urlDispatcher: function(name, window) {
218 if(name == "qwhois") {
7cb09779 219 return ["span", function(auth) {
2cd9e32d 220 this.client.exec("/MSG Q whois #" + auth);
925fc357
CP
221 }.bind(window)];
222 }
223 if(name == "whois") {
224 return ["span", function(nick) {
225 this.client.exec("/WHOIS " + nick);
226 }.bind(window)];
2cd9e32d
CP
227 }
228
229 return this.parent(name);
230 }
231});
232
233qwebirc.ui.NewLoginUI = new Class({
234 Extends: qwebirc.ui.QuakeNetUI,
6f2e4a37
CP
235 loginBox: function(callbackfn, initialNickname, initialChannels, autoConnect, autoNick) {
236 this.postInitialize();
e20e5a6b 237 var w = this.newCustomWindow("Connect", true, qwebirc.ui.WINDOW_CONNECT);
6f2e4a37
CP
238 var callback = function(args) {
239 w.close();
240 callbackfn(args);
241 };
242
e20e5a6b 243 qwebirc.ui.GenericLoginBox(w.lines, callback, initialNickname, initialChannels, autoConnect, autoNick);
6f2e4a37
CP
244 }
245});