]> jfr.im git - irc/quakenet/qwebirc.git/blame - js/ui/baseui.js
Scrolling now works in IE.
[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);
9e769c12
CP
92 }
93});
381fddfd
CP
94
95var UI = new Class({
96 Extends: BaseUI,
97 initialize: function(parentElement, windowClass, uiName, options) {
98 this.parent(parentElement, windowClass, uiName, options);
381fddfd
CP
99 window.addEvent("keydown", function(x) {
100 if(!x.alt)
101 return;
102
103 if(x.key == "a" || x.key == "A") {
424608ac 104 new Event(x).stop();
381fddfd
CP
105 for(var i=0;i<this.windowArray.length;i++) {
106 if(this.windowArray[i].hilighted) {
107 this.selectWindow(this.windowArray[i]);
108 break;
109 }
110 }
111 } else if(x.key >= '0' && x.key <= '9') {
424608ac
CP
112 new Event(x).stop();
113
381fddfd
CP
114 number = x.key - '0';
115 if(number == 0)
116 number = 10
117
118 number = number - 1;
119
120 if(number >= this.windowArray.length)
121 return;
122
123 this.selectWindow(this.windowArray[number]);
124 }
125 }.bind(this));
841a451d 126 },
8af49135
CP
127 newCustomWindow: function(name, select, type) {
128 if(!type)
129 type = WINDOW_CUSTOM;
130
131 var w = this.newWindow(CUSTOM_CLIENT, type, name);
132 w.addEvent("close", function(w) {
133 delete this.windows[name];
134 }.bind(this));
135
136 if(select)
137 this.selectWindow(w);
6c19eb8f 138
8af49135
CP
139 return w;
140 },
141 embeddedWindow: function() {
142 if(this.embedded) {
143 this.selectWindow(this.embedded)
144 return;
841a451d 145 }
8af49135 146
6c19eb8f 147 this.embedded = this.newCustomWindow("Embedding wizard", true);
8af49135
CP
148 this.embedded.addEvent("close", function() {
149 this.embedded = null;
150 }.bind(this));
151
152 var ew = new WebmasterGuide({parent: this.embedded.lines});
153 ew.addEvent("close", function() {
154 this.embedded.close();
155 }.bind(this));
841a451d 156 },
8af49135
CP
157 urlDispatcher: function(name) {
158 if(name == "embedded")
159 return this.embeddedWindow.bind(this);
160
161 return null;
162 }
381fddfd 163});
6f2e4a37
CP
164
165var NewLoginUI = new Class({
166 Extends: UI,
167 loginBox: function(callbackfn, initialNickname, initialChannels, autoConnect, autoNick) {
168 this.postInitialize();
169 var w = this.newCustomWindow("Connect", true, WINDOW_CONNECT);
170 var callback = function(args) {
171 w.close();
172 callbackfn(args);
173 };
174
175 GenericLoginBox(w.lines, callback, initialNickname, initialChannels, autoConnect, autoNick);
176 }
177});