]> jfr.im git - irc/quakenet/qwebirc.git/blame - js/ui/baseui.js
Whoops.
[irc/quakenet/qwebirc.git] / js / ui / baseui.js
CommitLineData
65152b01
CP
1var WINDOW_STATUS = 1;
2var WINDOW_QUERY = 2;
3var WINDOW_CHANNEL = 3;
8af49135
CP
4var WINDOW_CUSTOM = 4;
5var WINDOW_CONNECT = 5;
6var CUSTOM_CLIENT = "custom";
9e769c12 7
381fddfd 8var 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 = {};
8af49135 18 this.windows[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;
9b63b053 25 this.commandhistory = new CommandHistory();
9e769c12
CP
26 },
27 newClient: function(client) {
28 this.windows[client] = {}
29 var w = this.newWindow(client, WINDOW_STATUS, "Status");
30 this.selectWindow(w);
e8db8558
CP
31 if(!this.firstClient) {
32 this.firstClient = true;
4094890f
CP
33 w.addLine("", "qwebirc v" + QWEBIRC_VERSION);
34 w.addLine("", "Copyright (C) 2008 Chris Porter. All rights reserved.");
e8db8558 35 w.addLine("", "http://webchat.quakenet.org/");
4094890f 36 w.addLine("", "This is BETA quality software, please report bugs to slug@quakenet.org");
e8db8558 37 }
9e769c12
CP
38 return w;
39 },
40 newWindow: function(client, type, name) {
41 var identifier = name;
42 if(type == WINDOW_STATUS)
43 identifier = "";
44
45 var w = this.windows[client][identifier] = new this.windowClass(this, client, type, name, identifier);
46 this.windowArray.push(w);
47
48 return w;
49 },
50 getActiveWindow: function() {
51 return this.active;
52 },
53 __setActiveWindow: function(window) {
54 this.active = window;
55 },
56 selectWindow: function(window) {
57 if(this.active)
58 this.active.deselect();
59 window.select(); /* calls setActiveWindow */
a59dc700 60 document.title = window.name + " - " + this.options.appTitle;
9e769c12
CP
61 },
62 __closed: function(window) {
63 if(window.active) {
64 this.active = undefined;
65 if(this.windowArray.length == 1) {
66 this.windowArray = [];
67 } else {
68 var index = this.windowArray.indexOf(window);
6f2e4a37
CP
69 if(index == -1) {
70 return;
71 } else if(index == 0) {
9e769c12
CP
72 this.selectWindow(this.windowArray[1]);
73 } else {
74 this.selectWindow(this.windowArray[index - 1]);
75 }
76
77 this.windowArray = this.windowArray.erase(window);
78 }
79 }
80
81 delete this.windows[window.client][window.identifier];
eb9b087b 82 },
eb9b087b
CP
83 /*
84 this shouldn't be called by overriding classes!
66de775f 85 they should implement their own!
eb9b087b
CP
86 some form of user input MUST be received before an
87 IRC connection is made, else users are going to get
88 tricked into getting themselves glined
89 */
66de775f
CP
90 loginBox: function(callback, initialNickname, initialChannels, autoConnect, autoNick) {
91 GenericLoginBox(this.parentElement, callback, initialNickname, initialChannels, autoConnect, autoNick);
92 /*if(autoConnect) {
93 var c = initialChannels.split(",");
94 var ctext;
95
96 if(c.length > 1) {
97 var last = c.pop();
98 ctext = c.join(", ") + " and " + last;
99 } else {
100 ctext = c[0];
101 }
102
103 var nicktext;
104 if(autoNick) {
105 nicktext = "";
106 } else {
107 nicktext = " (as '" + initialNickname + "')"
108 }
109 if(confirm("Connect to IRC and join channels " + ctext + nicktext + "?"))
110 callback({"nickname": initialNickname, "autojoin": initialChannels});
111 return;
112 }
eb9b087b 113
d65fe45f 114 var nick = prompt("Nickname:", initialNickname);
eb9b087b
CP
115 if(!nick) {
116 alert("Aborted.");
117 return;
118 }
119
d65fe45f 120 var chans = prompt("Channels (seperate by comma):", initialChannels);
4656ff82 121 callback({"nickname": nick, "autojoin": chans});
66de775f 122 */
9e769c12
CP
123 }
124});
381fddfd
CP
125
126var UI = new Class({
127 Extends: BaseUI,
128 initialize: function(parentElement, windowClass, uiName, options) {
129 this.parent(parentElement, windowClass, uiName, options);
381fddfd
CP
130 window.addEvent("keydown", function(x) {
131 if(!x.alt)
132 return;
133
134 if(x.key == "a" || x.key == "A") {
424608ac 135 new Event(x).stop();
381fddfd
CP
136 for(var i=0;i<this.windowArray.length;i++) {
137 if(this.windowArray[i].hilighted) {
138 this.selectWindow(this.windowArray[i]);
139 break;
140 }
141 }
142 } else if(x.key >= '0' && x.key <= '9') {
424608ac
CP
143 new Event(x).stop();
144
381fddfd
CP
145 number = x.key - '0';
146 if(number == 0)
147 number = 10
148
149 number = number - 1;
150
151 if(number >= this.windowArray.length)
152 return;
153
154 this.selectWindow(this.windowArray[number]);
155 }
156 }.bind(this));
841a451d 157 },
8af49135
CP
158 newCustomWindow: function(name, select, type) {
159 if(!type)
160 type = WINDOW_CUSTOM;
161
162 var w = this.newWindow(CUSTOM_CLIENT, type, name);
163 w.addEvent("close", function(w) {
164 delete this.windows[name];
165 }.bind(this));
166
167 if(select)
168 this.selectWindow(w);
169
170 return w;
171 },
172 embeddedWindow: function() {
173 if(this.embedded) {
174 this.selectWindow(this.embedded)
175 return;
841a451d 176 }
8af49135
CP
177
178 this.embedded = this.newCustomWindow("Embedded wizard", true);
179 this.embedded.addEvent("close", function() {
180 this.embedded = null;
181 }.bind(this));
182
183 var ew = new WebmasterGuide({parent: this.embedded.lines});
184 ew.addEvent("close", function() {
185 this.embedded.close();
186 }.bind(this));
841a451d 187 },
8af49135
CP
188 urlDispatcher: function(name) {
189 if(name == "embedded")
190 return this.embeddedWindow.bind(this);
191
192 return null;
193 }
381fddfd 194});
6f2e4a37
CP
195
196var NewLoginUI = new Class({
197 Extends: UI,
198 loginBox: function(callbackfn, initialNickname, initialChannels, autoConnect, autoNick) {
199 this.postInitialize();
200 var w = this.newCustomWindow("Connect", true, WINDOW_CONNECT);
201 var callback = function(args) {
202 w.close();
203 callbackfn(args);
204 };
205
206 GenericLoginBox(w.lines, callback, initialNickname, initialChannels, autoConnect, autoNick);
207 }
208});