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