]> jfr.im git - irc/quakenet/qwebirc.git/blame - js/ui/swmui.js
Finish the job :(.
[irc/quakenet/qwebirc.git] / js / ui / swmui.js
CommitLineData
9e769c12
CP
1var SWMUIWindow = new Class({
2 Extends: UIWindow,
3
4 initialize: function(parentObject, client, type, name) {
5 this.parent(parentObject, client, type, name);
18559d33
CP
6 this.contentPanel = new SWMPanel(parentObject.mainPanel, true);
7 this.contentPanel.addClass("content");
9e769c12
CP
8
9 if(type == WINDOW_CHANNEL) {
18559d33 10 this.nickList = new SWMPanel(this.contentPanel);
9e769c12 11 this.nickList.anchor = SWM_ANCHOR_RIGHT;
18559d33 12 this.nickList.addClass("nicklist");
9e769c12 13
18559d33 14 this.topic = new SWMPanel(this.contentPanel);
9e769c12 15 this.topic.anchor = SWM_ANCHOR_TOP;
18559d33 16 this.topic.addClass("topic");
9e769c12
CP
17 }
18
18559d33 19 this.lines = new SWMPanel(this.contentPanel);
9e769c12
CP
20
21 this.tab = new Element("span");
22 this.tab.addClass("tab");
23
24 this.tab.appendText(name);
25 this.tab.addEvent("click", function() {
26 parentObject.selectWindow(this);
27 }.bind(this));
28
18559d33 29 parentObject.tabPanel.appendChild(this.tab);
9e769c12
CP
30 parentObject.resize();
31
32 if(type != WINDOW_STATUS) {
33 tabclose = new Element("span");
34 tabclose.addClass("tabclose");
35 tabclose.addEvent("click", function(e) {
36 new Event(e).stop();
37
38 if(type == WINDOW_CHANNEL)
39 this.client.exec("/PART " + name);
40
41 this.close();
42 }.bind(this));
43 tabclose.set("text", "X");
44 this.tab.appendChild(tabclose);
45 }
46 },
47 updateNickList: function(nicks) {
48 this.parent(nicks);
49
18559d33 50 this.nickList.removeAllChildren();
9e769c12
CP
51 nicks.each(function(nick) {
52 var e = new Element("div");
18559d33 53 this.nickList.appendChild(e);
9e769c12 54 e.appendChild(document.createTextNode(nick));
18559d33 55 }.bind(this));
9e769c12
CP
56
57 this.parentObject.resize();
58 },
59 updateTopic: function(topic) {
60 this.parent(topic);
9e769c12 61
18559d33
CP
62 this.topic.removeAllChildren();
63 Colourise(topic, this.topic.element);
9e769c12
CP
64
65 this.parentObject.resize();
66 },
67 select: function() {
68 this.parent();
69
70 this.contentPanel.setHidden(false);
71 this.parentObject.resize();
72 this.tab.removeClass("tab-highlighted");
73 this.tab.removeClass("tab-unselected");
74 this.tab.addClass("tab-selected");
75 },
76 deselect: function() {
77 this.parent();
78
79 this.contentPanel.setHidden(true);
80 this.parentObject.resize();
81 this.tab.removeClass("tab-selected");
82 this.tab.addClass("tab-unselected");
83 },
84 close: function() {
85 this.parent();
86
18559d33
CP
87 this.parentObject.mainPanel.removeChild(this.contentPanel.element);
88 this.parentObject.tabPanel.removeChild(this.tab);
9e769c12
CP
89 },
90 addLine: function(type, line, colour) {
91 this.parent(type, line, colour);
92
93 var e = new Element("div");
94
95 if(colour) {
65152b01 96 e.setStyles({"background": colour});
9e769c12
CP
97 } else if(this.lastcolour) {
98 e.addClass("linestyle1");
99 } else {
100 e.addClass("linestyle2");
101 }
102
103 if(type)
104 line = this.parentObject.theme.message(type, line);
105
106 Colourise(IRCTimestamp(new Date()) + " " + line, e);
107
108 this.lastcolour = !this.lastcolour;
18559d33 109
9e769c12
CP
110 var prev = this.lines.element.getScroll();
111 var prevbottom = this.lines.element.getScrollSize().y;
112 var prevsize = this.lines.element.getSize();
18559d33
CP
113 this.lines.appendChild(e);
114
9e769c12
CP
115 if(prev.y + prevsize.y == prevbottom)
116 this.lines.element.scrollTo(prev.x, this.lines.element.getScrollSize().y);
18559d33 117
9e769c12
CP
118 if(!this.active)
119 this.tab.addClass("tab-highlighted");
120 }
121});
122
123var SWMUI = new Class({
124 Extends: UI,
125 initialize: function(parentElement, theme) {
126 this.parent(parentElement, SWMUIWindow, "swmui");
18559d33 127
eb9b087b 128 this.parentElement = parentElement;
9e769c12 129 this.theme = theme;
eb9b087b
CP
130 },
131 postInitialize: function() {
18559d33
CP
132 this.rootFrame = new SWMFrame(this.parentElement);
133
134 this.tabPanel = new SWMPanel(this.rootFrame);
9e769c12 135 this.tabPanel.anchor = SWM_ANCHOR_TOP;
18559d33 136 this.tabPanel.addClass("tabs");
9e769c12 137
18559d33
CP
138 this.mainPanel = new SWMPanel(this.rootFrame);
139 this.mainPanel.addClass("main");
9e769c12 140
18559d33 141 this.entryPanel = new SWMPanel(this.rootFrame);
9e769c12 142 this.entryPanel.anchor = SWM_ANCHOR_BOTTOM;
18559d33 143 this.entryPanel.addClass("entry");
9e769c12
CP
144
145 var form = new Element("form");
146
147 var inputbox = new Element("input");
18559d33 148 inputbox.setStyle("border", "0px");
9e769c12
CP
149
150 window.addEvent("resize", function() {
18559d33 151 var s = this.entryPanel.getInnerSize().x;
9e769c12
CP
152 inputbox.setStyle("width", s + "px");
153 }.bind(this));
154
155 form.addEvent("submit", function(e) {
156 new Event(e).stop();
157
158 this.getActiveWindow().client.exec(inputbox.value);
159 inputbox.value = "";
160 }.bind(this));
161
18559d33 162 this.entryPanel.appendChild(form);
9e769c12
CP
163 form.appendChild(inputbox);
164 inputbox.focus();
165
166 this.resize();
167 },
168 resize: function() {
169 window.fireEvent("resize");
eb9b087b 170 },
d65fe45f 171 loginBox: function(callback, initialNickname, initialChannels) {
eb9b087b 172 var box = new Element("div");
3aaa4f2f 173 this.parentElement.appendChild(box);
eb9b087b
CP
174
175 var header = new Element("h1");
176 header.set("text", "qwebirc");
177 box.appendChild(header);
178
179 var form = new Element("form");
3aaa4f2f 180 box.appendChild(form);
eb9b087b
CP
181
182 var boxtable = new Element("table");
3aaa4f2f 183 form.appendChild(boxtable);
eb9b087b 184
3aaa4f2f
CP
185 var tbody = new Element("tbody");
186 boxtable.appendChild(tbody); /* stupid IE */
eb9b087b 187
3aaa4f2f
CP
188 function createRow(label, e2) {
189 var r = new Element("tr");
190 tbody.appendChild(r);
eb9b087b 191
3aaa4f2f
CP
192 var d1 = new Element("td");
193 if(label)
194 d1.set("text", label);
195 r.appendChild(d1);
eb9b087b 196
3aaa4f2f
CP
197 var d2 = new Element("td");
198 r.appendChild(d2);
199 d2.appendChild(e2);
200 return d1;
201 }
202
203 var nick = new Element("input");
204 createRow("Nickname:", nick);
eb9b087b 205 var chan = new Element("input");
3aaa4f2f 206 createRow("Channels (comma seperated):", chan);
eb9b087b 207
eb9b087b
CP
208 var connbutton = new Element("input", {"type": "submit"});
209 connbutton.set("value", "Connect");
3aaa4f2f 210 createRow(undefined, connbutton)
eb9b087b
CP
211
212 form.addEvent("submit", function(e) {
213 new Event(e).stop();
214 var nickname = nick.value;
215 var chans = chan.value;
d65fe45f
CP
216 if(chans == "#") /* sorry channel "#" :P */
217 chans = "";
218
eb9b087b
CP
219 if(!nickname) {
220 alert("You must supply a nickname.");
221 nick.focus();
222 return;
223 }
224
225 this.parentElement.removeChild(box);
226 this.postInitialize();
4656ff82 227 callback({"nickname": nickname, "autojoin": chans});
eb9b087b
CP
228 }.bind(this));
229
d65fe45f
CP
230 nick.set("value", initialNickname);
231 chan.set("value", initialChannels);
eb9b087b
CP
232
233 nick.focus();
9e769c12
CP
234 }
235});