d9c6c5ceba2dcac7b92735f40cd5af04a05d5a45
[citadel.git] / webcit / static / roomops.js
1 /*
2  * Copyright 1998 - 2009 The Citadel Team
3  * Licensed under the GPL V3
4  */
5
6 // ROOM list vars:
7 var rooms = null;
8
9 // FLOOR list
10 var floors = null;
11
12 var roomsForFloors = [];
13 /* STRUCT KEYS */
14 /* LKRN etc. */
15 var RN_ROOM_NAME = 0;
16 var RN_ROOM_FLAG = 1;
17 var RN_FLOOR_NUM = 2;
18 var RN_LIST_ORDER = 3;
19 var RN_ACCESS_CONTROL = 4;
20 var RN_CUR_VIEW = 5;
21 var RN_DEF_VIEW = 6;
22 var RN_LAST_CHANGE = 7;
23 var RN_RAFLAGS = 8;
24
25 var QR_PRIVATE = 4;
26 var QR_MAILBOX = 16384;
27
28 var UA_KNOWN = 2;
29 var UA_GOTOALLOWED = 4;
30 var UA_HASNEWMSGS = 8;
31 var UA_ZAPPED = 16;
32
33 var VIEW_BBS = 0;
34 var VIEW_MAILBOX = 1;
35 var VIEW_ADDRESSBOOK = 2;
36 var VIEW_CALENDAR = 3;
37 var VIEW_TASKS = 4;
38 var VIEW_NOTES = 5;
39 var VIEW_WIKI = 6;
40 var VIEW_CALBRIEF = 7;
41 var VIEW_JOURNAL = 8;
42
43 function fillRooms(callback) {
44   var roomFlr = new Ajax.Request("json_roomflr?SortBy=byfloorroom?SortOrder=1", {method: 'get', onSuccess: function(transport) { ProcessRoomFlr(transport); callback.call(); }});
45 }
46 function ProcessRoomFlr(transport) {
47   var data = eval('('+transport.responseText+')');
48   floors = data["floors"];
49   rooms = data["rooms"];
50 }
51 function GetRoomsByFloorNum(flnum) {
52   var roomsForFloor = new Array();
53   var x=0;
54   for(var i=0; i<rooms.length; i++) {
55     var room = rooms[i];
56     var floornum = room[RN_FLOOR_NUM];
57     var flag = room[RN_ROOM_FLAG];
58     if (flnum == floornum && ((flag & QR_MAILBOX) != QR_MAILBOX)) {
59       roomsForFloor[x] = room;
60       x++;
61     }
62   }
63   return roomsForFloor;
64 }
65 function getMailboxRooms() {
66   var roomsForFloor = new Array();
67   var x=0;
68   for(var i=0; i<rooms.length; i++) {
69     var room = rooms[i];
70     var floornum = room[RN_FLOOR_NUM];
71     var flag = room[RN_ROOM_FLAG];
72     if (floornum == -1) {
73       roomsForFloor[x] = room;
74       x++;
75     }
76   }
77   return roomsForFloor;
78 }
79
80 /*
81  * function to delete a comment from a blog post
82  */
83 function DeleteBlogComment(msgnum) {
84         cmd = encodeURI("g_cmd=DELE " + msgnum);
85         new Ajax.Request("ajax_servcmd", { 
86                 parameters: cmd,
87                 method: 'post',
88                 onSuccess: function(transport) {
89                 Effect.BlindUp('blog_comment_' + msgnum);
90                 }
91         });
92 }
93
94 function GenericTreeRoomList(roomlist) {
95   var currentExpanded = ctdlLocalPrefs.readPref("rooms_expanded");
96   var curRoomName = "";
97   if (document.getElementById("rmname")) {
98     curRoomName = getTextContent(document.getElementById("rmname"));
99   }
100   currentDropTargets = [];
101   var iconbar = document.getElementById("iconbar");
102   var ul = document.createElement("ul");
103   roomlist.appendChild(ul);
104   // Add mailbox, because they are special
105   var mailboxLI = document.createElement("li");
106   ul.appendChild(mailboxLI);
107   var mailboxSPAN = document.createElement("span");
108   var _mailbox = getTextContent(document.getElementById("mbox_template"));
109   mailboxSPAN.appendChild(document.createTextNode(_mailbox));
110   $(mailboxSPAN).observe('click', expandFloorEvent);
111   mailboxLI.appendChild(mailboxSPAN);
112   mailboxLI.className = "floor";
113   var mailboxUL = document.createElement("ul");
114   mailboxLI.appendChild(mailboxUL);
115   var mailboxRooms = getMailboxRooms();
116   for(var i=0; i<mailboxRooms.length; i++) {
117           var room = mailboxRooms[i];
118           currentDropTargets.push(addRoomToList(mailboxUL, room, curRoomName));
119   }
120   if (currentExpanded !== null && currentExpanded === _mailbox ) {
121           expandFloor(mailboxSPAN);
122   }
123     for(var a=0; a<floors.length; a++) {
124         var floor = floors[a];
125         var floornum = floor[0];
126         
127         if (floornum !== -1)
128         {
129
130             var name = floor[1];
131             var floorLI = document.createElement("li");
132             ul.appendChild(floorLI);
133             var floorSPAN = document.createElement("span");
134             floorSPAN.appendChild(document.createTextNode(name));
135             $(floorSPAN).observe('click', expandFloorEvent);
136             floorLI.appendChild(floorSPAN);
137             floorLI.className = "floor";
138             var floorUL = document.createElement("ul");
139             floorLI.appendChild(floorUL);
140             var roomsForFloor = GetRoomsByFloorNum(floornum);
141             for(var b=0; b<roomsForFloor.length; b++) {
142                 var oneRoom = roomsForFloor[b];
143                 currentDropTargets.push(addRoomToList(floorUL, oneRoom, curRoomName));
144             }
145             if (currentExpanded !== null && currentExpanded === name) {
146                 expandFloor(floorSPAN);
147             }
148         }
149     }
150 }
151 function iconBarRoomList() {
152   roomlist = document.getElementById("roomlist");
153   GenericTreeRoomList(roomlist);
154 }
155 function knRoomsRoomList() {
156   roomlist = document.getElementById("roomlist_knrooms");
157   GenericTreeRoomList(roomlist);
158 }
159
160 function addRoomToList(floorUL,room, roomToEmphasize) {
161   var roomName = room[RN_ROOM_NAME];
162   var flag = room[RN_ROOM_FLAG];
163   var curView = room[RN_CUR_VIEW];
164   var view = room[RN_DEF_VIEW];
165   var raflags = room[RN_RAFLAGS];
166   var isMailBox = ((flag & QR_MAILBOX) === QR_MAILBOX);
167   var hasNewMsgs = ((raflags & UA_HASNEWMSGS) === UA_HASNEWMSGS);
168   var roomLI = document.createElement("li");
169   var roomA = document.createElement("a");
170   roomA.setAttribute("href","dotgoto?room="+encodeURIComponent(roomName));
171   roomA.appendChild(document.createTextNode(roomName));
172   roomLI.appendChild(roomA);
173   floorUL.appendChild(roomLI);
174   var className = "room ";
175   if (view === VIEW_MAILBOX) {
176     className += "room-private";
177   } else if (view === VIEW_ADDRESSBOOK) {
178     className += "room-addr";
179   } else if (view === VIEW_CALENDAR || view === VIEW_CALBRIEF) {
180     className += "room-cal";
181   } else if (view === VIEW_TASKS) {
182     className += "room-tasks";
183   } else if (view === VIEW_NOTES) {
184     className += "room-notes";
185   } else {
186     className += "room-chat";
187   }
188   if (hasNewMsgs) {
189     className += " room-newmsgs";
190   }
191   if (roomName === roomToEmphasize) {
192     className += " room-emphasized";
193   }
194   roomLI.setAttribute("class", className);
195   roomA.dropTarget = true;
196   roomA.dropHandler = roomListDropHandler;
197   return roomLI;
198 }
199
200 function roomListDropHandler(target, dropped) {
201   var mvCommand;
202   if (dropped.getAttribute("citadel:msgid")) {
203       var room = getTextContent(target);
204       var msgIds = "";
205       for(var msgId in currentlyMarkedRows) {
206           if (currentlyMarkedRows.hasOwnProperty(msgId)) { //defined in summaryview.js
207               msgIds += ","+msgId;
208               if (msgIds.length > 800) {
209                   mvCommand = "g_cmd=MOVE%20" + msgIds + "|"+encodeURIComponent(room)+"|0";
210                   new Ajax.Request("ajax_servcmd", {
211                       parameters: mvCommand,
212                       method: 'post',
213                   });
214                   msgIds = "";
215               }
216           }
217
218       }
219       mvCommand = "g_cmd=MOVE%20" + msgIds + "|"+encodeURIComponent(room)+"|0";
220       new Ajax.Request('ajax_servcmd', {
221           method: 'post',
222           parameters: mvCommand,
223           onComplete: deleteAllMarkedRows()});
224   }
225 }
226 function expandFloorEvent(event) {
227   expandFloor(event.target);
228 }
229 function expandFloor(target) {
230   if (target.nodeName.toLowerCase() !== "span") {
231     return; // ignore clicks on child UL
232   }
233   ctdlLocalPrefs.setPref("rooms_expanded", target.firstChild.nodeValue);
234   var parentUL = target.parentNode;
235   if (currentlyExpandedFloor !== null) {
236     currentlyExpandedFloor.className = currentlyExpandedFloor.className.replace("floor-expanded","");
237   }
238   parentUL.className = parentUL.className + " floor-expanded";
239   currentlyExpandedFloor = parentUL;
240 }