| 1 | {% extends "common/email_listing.html" %} |
|---|
| 2 | {% load i18n %} |
|---|
| 3 | {% block css %} |
|---|
| 4 | #leftcol { |
|---|
| 5 | float: left; |
|---|
| 6 | width: 150px; |
|---|
| 7 | } |
|---|
| 8 | |
|---|
| 9 | thead tr { |
|---|
| 10 | position: relative; |
|---|
| 11 | top: expression(offsetParent.scrollTop); /*IE5+ only*/ |
|---|
| 12 | z-index: 1; |
|---|
| 13 | } |
|---|
| 14 | |
|---|
| 15 | table#emails > tbody { |
|---|
| 16 | position: fixed; |
|---|
| 17 | bottom: 35px; |
|---|
| 18 | top: 155px; |
|---|
| 19 | left: 155px; |
|---|
| 20 | right: 0px; |
|---|
| 21 | overflow-x: hidden; |
|---|
| 22 | overflow-y: auto; |
|---|
| 23 | } |
|---|
| 24 | |
|---|
| 25 | #emails th { |
|---|
| 26 | /*text-align: center;*/ |
|---|
| 27 | } |
|---|
| 28 | |
|---|
| 29 | #emails tr { |
|---|
| 30 | width: 100%; |
|---|
| 31 | } |
|---|
| 32 | |
|---|
| 33 | .box h3 { |
|---|
| 34 | font-size: small; |
|---|
| 35 | margin: 2px 0px 2px 0px; |
|---|
| 36 | text-align: center; |
|---|
| 37 | } |
|---|
| 38 | |
|---|
| 39 | .box ul { |
|---|
| 40 | list-style: none; |
|---|
| 41 | padding: 5px 5px; |
|---|
| 42 | margin: 0; |
|---|
| 43 | } |
|---|
| 44 | |
|---|
| 45 | .box li { |
|---|
| 46 | clear: both; |
|---|
| 47 | margin-bottom: 4px; |
|---|
| 48 | } |
|---|
| 49 | |
|---|
| 50 | .box li.selected { |
|---|
| 51 | background: #ffffcc; |
|---|
| 52 | } |
|---|
| 53 | |
|---|
| 54 | .box a:link, .box a:visited { |
|---|
| 55 | background: transparent; |
|---|
| 56 | color: black; |
|---|
| 57 | font-weight: bold; |
|---|
| 58 | text-decoration: none; |
|---|
| 59 | } |
|---|
| 60 | |
|---|
| 61 | .box a:hover { |
|---|
| 62 | color: #6AB0C5; |
|---|
| 63 | text-decoration: none; |
|---|
| 64 | } |
|---|
| 65 | |
|---|
| 66 | .box img { |
|---|
| 67 | float: left; |
|---|
| 68 | margin-right: 2px; |
|---|
| 69 | border: 0; |
|---|
| 70 | } |
|---|
| 71 | |
|---|
| 72 | th { |
|---|
| 73 | /*-moz-box-shadow: 0px -15px 10px -10px rgba(0,0,0,0.6) inset; |
|---|
| 74 | -webkit-box-shadow: 0px -15px 10px -10px rgba(0,0,0,0.6) inset;*/ |
|---|
| 75 | } |
|---|
| 76 | |
|---|
| 77 | th.selected { |
|---|
| 78 | background: #EEEEEE; |
|---|
| 79 | } |
|---|
| 80 | |
|---|
| 81 | .draggable {2 |
|---|
| 82 | cursor: move; |
|---|
| 83 | } |
|---|
| 84 | |
|---|
| 85 | .dragging { |
|---|
| 86 | background: #6AB0C5; |
|---|
| 87 | } |
|---|
| 88 | |
|---|
| 89 | tr { |
|---|
| 90 | position: relative; |
|---|
| 91 | border-bottom: 1px solid #C8D6E8; |
|---|
| 92 | } |
|---|
| 93 | |
|---|
| 94 | tr.selected { |
|---|
| 95 | background: #ffffcc; |
|---|
| 96 | } |
|---|
| 97 | |
|---|
| 98 | {% endblock %} |
|---|
| 99 | {% block js %} |
|---|
| 100 | navparams = new Hash({ |
|---|
| 101 | {% for k, v in navparams.items %} |
|---|
| 102 | {{ k }} : "{{ v }}", |
|---|
| 103 | {% endfor %} |
|---|
| 104 | }); |
|---|
| 105 | |
|---|
| 106 | updatelisting = function(resp) { |
|---|
| 107 | if ($defined(resp.menu)) { |
|---|
| 108 | $("menubar").set("html", resp.menu); |
|---|
| 109 | parse_menubar("menubar"); |
|---|
| 110 | } |
|---|
| 111 | $("listing").set("html", resp.listing); |
|---|
| 112 | if ($defined(resp.navbar)) { |
|---|
| 113 | $("navbar").set("html", resp.navbar); |
|---|
| 114 | $("navbar").getChildren("a").addEvent("click", navbarcallback); |
|---|
| 115 | } |
|---|
| 116 | $$("a[name=compose]").addEvent("click", loadCompose); |
|---|
| 117 | $$("a[name=empty]").addEvent("click", empty); |
|---|
| 118 | if (!checkSelection()) { |
|---|
| 119 | select($$("a[href=INBOX]")); |
|---|
| 120 | } |
|---|
| 121 | } |
|---|
| 122 | |
|---|
| 123 | empty = function(event) { |
|---|
| 124 | event.stop(); |
|---|
| 125 | new Request.JSON({url : event.target.get("href"), onSuccess : function(resp) { |
|---|
| 126 | updatelisting(resp); |
|---|
| 127 | }}).get(); |
|---|
| 128 | } |
|---|
| 129 | |
|---|
| 130 | checkSelection = function() { |
|---|
| 131 | var selection = false; |
|---|
| 132 | |
|---|
| 133 | $$("a[name=loadfolder]").each(function(item) { |
|---|
| 134 | if (!selection) { |
|---|
| 135 | selection = item.getParent().hasClass("selected"); |
|---|
| 136 | } |
|---|
| 137 | }); |
|---|
| 138 | return selection; |
|---|
| 139 | } |
|---|
| 140 | |
|---|
| 141 | select = function(obj) { |
|---|
| 142 | $$("a[name=loadfolder]").each(function(item) { |
|---|
| 143 | item.getParent().removeClass("selected"); |
|---|
| 144 | item.getParent().addClass("droppable"); |
|---|
| 145 | }); |
|---|
| 146 | obj.getParent().removeClass("droppable"); |
|---|
| 147 | obj.getParent().addClass("selected"); |
|---|
| 148 | } |
|---|
| 149 | |
|---|
| 150 | {% url extensions.webmail.main.folder as view_url %} |
|---|
| 151 | viewmail = function(event) { |
|---|
| 152 | event.stop(); |
|---|
| 153 | if (event.target.parentNode.id) { |
|---|
| 154 | var url = event.target.parentNode.id + "/"; |
|---|
| 155 | event.target.parentNode.setStyle("background", "#ffffcc"); |
|---|
| 156 | current_anchor.baseurl(url).update(); |
|---|
| 157 | } |
|---|
| 158 | } |
|---|
| 159 | register_callback("viewmail", function(resp) { |
|---|
| 160 | updatelisting(resp, "hidden"); |
|---|
| 161 | $$("a[name=back]").addEvent("click", loadFolder); |
|---|
| 162 | $$("a[name=reply]").addEvent("click", reply); |
|---|
| 163 | $$("a[name=replyall]").addEvent("click", replyall); |
|---|
| 164 | $$("a[name=forward]").addEvent("click", forward); |
|---|
| 165 | $$("a[name=delete]").addEvent("click", function(event) { |
|---|
| 166 | var lnk = event.target; |
|---|
| 167 | |
|---|
| 168 | event.stop(); |
|---|
| 169 | new Request.JSON({url: lnk.get("href"), |
|---|
| 170 | onSuccess: get_callback("folder")}).get(); |
|---|
| 171 | }); |
|---|
| 172 | setDivHeight("mailcontent", 5, 0); |
|---|
| 173 | }); |
|---|
| 174 | |
|---|
| 175 | compose_callback = function(resp) { |
|---|
| 176 | updatelisting(resp); |
|---|
| 177 | window.addEvent("resize", function(evt) { |
|---|
| 178 | setDivHeight("id_body", $("mailheader").getSize().y, 0); |
|---|
| 179 | }); |
|---|
| 180 | $$("a[name=back]").addEvent("click", loadFolder); |
|---|
| 181 | $$("a[name=sendmail]").addEvent("click", function(evt) { |
|---|
| 182 | evt.stop(); |
|---|
| 183 | $("composemail").set("send", { |
|---|
| 184 | onSuccess: function(resp) { |
|---|
| 185 | resp = JSON.decode(resp); |
|---|
| 186 | if (resp.status == "ko") { |
|---|
| 187 | updatelisting(resp); |
|---|
| 188 | window.fireEvent("resize"); |
|---|
| 189 | return; |
|---|
| 190 | } |
|---|
| 191 | current_anchor.parse_string(resp.url, true).setparams(navparams); |
|---|
| 192 | current_anchor.update(); |
|---|
| 193 | } |
|---|
| 194 | }); |
|---|
| 195 | $("composemail").send(); |
|---|
| 196 | }); |
|---|
| 197 | window.fireEvent("resize"); |
|---|
| 198 | } |
|---|
| 199 | |
|---|
| 200 | loadCompose = function(event) { |
|---|
| 201 | event.stop(); |
|---|
| 202 | current_anchor.baseurl("compose/").update(); |
|---|
| 203 | } |
|---|
| 204 | register_callback("compose", compose_callback); |
|---|
| 205 | |
|---|
| 206 | reply = function(event) { |
|---|
| 207 | event.stop(); |
|---|
| 208 | location.hash += event.target.get("href"); |
|---|
| 209 | } |
|---|
| 210 | register_callback("reply", compose_callback); |
|---|
| 211 | replyall = function(event) { |
|---|
| 212 | event.stop(); |
|---|
| 213 | location.hash += event.target.get("href") + "?all=1"; |
|---|
| 214 | } |
|---|
| 215 | register_callback("replyall", compose_callback); |
|---|
| 216 | forward = function(event) { |
|---|
| 217 | event.stop(); |
|---|
| 218 | location.hash += event.target.get("href"); |
|---|
| 219 | } |
|---|
| 220 | register_callback("forward", compose_callback); |
|---|
| 221 | |
|---|
| 222 | loadFolder = function(event, obj) { |
|---|
| 223 | if (!$defined(obj)) { |
|---|
| 224 | obj = event.target; |
|---|
| 225 | } |
|---|
| 226 | event.stop(); |
|---|
| 227 | current_anchor.parse_string(obj.get("href"), true).setparams(navparams); |
|---|
| 228 | current_anchor.update(); |
|---|
| 229 | } |
|---|
| 230 | register_callback("folder", function(resp) { |
|---|
| 231 | updatelisting(resp); |
|---|
| 232 | if (navparams.has("order")) { |
|---|
| 233 | src = navparams.get("order").charAt(0) == "-" ? "down_arrow.png" : "up_arrow.png"; |
|---|
| 234 | th = $$("th[id=" + navparams.get("order").substring(1) + "]"); |
|---|
| 235 | th.getElement("img").set("src", "/static/pics/" + src); |
|---|
| 236 | th.addClass("selected"); |
|---|
| 237 | } |
|---|
| 238 | var selectedRows = new Array(); |
|---|
| 239 | $$("tr").addEvent("click", function(event) { |
|---|
| 240 | var tr = event.target.getParent(); |
|---|
| 241 | if (!tr.hasClass("selected")) { |
|---|
| 242 | tr.addClass("selected"); |
|---|
| 243 | selectedRows.include(tr); |
|---|
| 244 | } else { |
|---|
| 245 | tr.removeClass("selected"); |
|---|
| 246 | selectedRows.erase(tr); |
|---|
| 247 | } |
|---|
| 248 | }); |
|---|
| 249 | |
|---|
| 250 | $$("tr").each(function(item) { |
|---|
| 251 | new Drag.Move(item, { |
|---|
| 252 | droppables: ".droppable", |
|---|
| 253 | }).addEvents({ |
|---|
| 254 | "start" : function(item) { |
|---|
| 255 | if (!item.hasClass("selected")) { |
|---|
| 256 | selectedRows.each(function(item, index) { |
|---|
| 257 | item.removeClass("selected"); |
|---|
| 258 | }); |
|---|
| 259 | selectedRows.empty(); |
|---|
| 260 | item.addClass("selected"); |
|---|
| 261 | selectedRows.include(item); |
|---|
| 262 | } |
|---|
| 263 | var block = new Element("div", {id: "draggeditems"}) |
|---|
| 264 | .setStyles({"position" : "absolute", |
|---|
| 265 | "opacity" : 0.8, |
|---|
| 266 | "width" : "200px", |
|---|
| 267 | "padding" : "5px", |
|---|
| 268 | "text-align" : "center", |
|---|
| 269 | "height" : "25px", |
|---|
| 270 | "border" : "1px solid #333", |
|---|
| 271 | "background" : "white"}) |
|---|
| 272 | .setStyles(item.getPosition()) |
|---|
| 273 | .inject(document.body); |
|---|
| 274 | block.set("html", "Moving " + selectedRows.length + " messages"); |
|---|
| 275 | this.oldelement = this.element; |
|---|
| 276 | this.element = block; |
|---|
| 277 | }, |
|---|
| 278 | "cancel" : function(item) { |
|---|
| 279 | if ($defined(this.oldelement)) { |
|---|
| 280 | item.dispose(); |
|---|
| 281 | delete(item); |
|---|
| 282 | this.element = this.oldelement; |
|---|
| 283 | } |
|---|
| 284 | }, |
|---|
| 285 | "enter" : function(item, droppable) { |
|---|
| 286 | droppable.addClass("dragging"); |
|---|
| 287 | }, |
|---|
| 288 | "leave" : function(item, droppable) { |
|---|
| 289 | droppable.removeClass("dragging"); |
|---|
| 290 | }, |
|---|
| 291 | "drop" : function(item, droppable, event) { |
|---|
| 292 | item.dispose(); |
|---|
| 293 | delete(item); |
|---|
| 294 | if (!droppable) { |
|---|
| 295 | this.element = this.oldelement; |
|---|
| 296 | return; |
|---|
| 297 | } |
|---|
| 298 | droppable.removeClass("dragging"); |
|---|
| 299 | dest = droppable.getFirst("a").get("href"); |
|---|
| 300 | msgset = new Array(); |
|---|
| 301 | selectedRows.each(function(item, index) { |
|---|
| 302 | msgset.include(item.get("id")); |
|---|
| 303 | }); |
|---|
| 304 | {% url extensions.webmail.main.move as moveurl %} |
|---|
| 305 | new Request.JSON({url: "{{ moveurl }}", |
|---|
| 306 | onSuccess: get_callback("folder")} |
|---|
| 307 | ).get({msgset : msgset.join(), to : dest}); |
|---|
| 308 | }, |
|---|
| 309 | }); |
|---|
| 310 | }); |
|---|
| 311 | $("toggleselect").addEvent("click", function(evt) { |
|---|
| 312 | var checked = evt.target.get("checked"); |
|---|
| 313 | if (checked) { |
|---|
| 314 | $$("tbody>tr").each(function(item) { |
|---|
| 315 | item.addClass("selected"); |
|---|
| 316 | selectedRows.include(item); |
|---|
| 317 | }); |
|---|
| 318 | } else { |
|---|
| 319 | $$("tr").each(function(item) { item.removeClass("selected"); }); |
|---|
| 320 | selectedRows.empty(); |
|---|
| 321 | } |
|---|
| 322 | }); |
|---|
| 323 | |
|---|
| 324 | |
|---|
| 325 | $$("tr").addEvent("dblclick", viewmail); |
|---|
| 326 | $$("th[class*=sortable]").addEvent("click", function(evt) { |
|---|
| 327 | var tmp = "?"; |
|---|
| 328 | var order = (navparams.has("order")) ? navparams.get("order") : ""; |
|---|
| 329 | |
|---|
| 330 | if (order == "") { |
|---|
| 331 | order = current_anchor.getparam("order"); |
|---|
| 332 | } |
|---|
| 333 | if (order.substring(1) == evt.target.id) { |
|---|
| 334 | var sign = (order.charAt(0) == '+') ? '-' : '+'; |
|---|
| 335 | order = sign + evt.target.id; |
|---|
| 336 | } else { |
|---|
| 337 | order = "-" + evt.target.id; |
|---|
| 338 | } |
|---|
| 339 | navparams.set("order", order); |
|---|
| 340 | current_anchor.setparams(navparams).update(); |
|---|
| 341 | }); |
|---|
| 342 | }); |
|---|
| 343 | |
|---|
| 344 | navbarcallback = function(event) { |
|---|
| 345 | event.stop(); |
|---|
| 346 | current_anchor.setparams(navparams); |
|---|
| 347 | current_anchor.parse_string(event.target.getParent().get("href")).update(); |
|---|
| 348 | } |
|---|
| 349 | |
|---|
| 350 | foldercallback = function(event) { |
|---|
| 351 | select(event.target); |
|---|
| 352 | loadFolder(event, event.target); |
|---|
| 353 | } |
|---|
| 354 | |
|---|
| 355 | ajaxListener("INBOX/", updatelisting); |
|---|
| 356 | $$("a[name=loadfolder]").addEvent("click", foldercallback); |
|---|
| 357 | {% endblock %} |
|---|
| 358 | {% block middletitle %}{% trans "Webmail" %}{% endblock %} |
|---|
| 359 | {% block leftcol %} |
|---|
| 360 | <div id="leftcol" class="box"> |
|---|
| 361 | <h3>{% trans "Folders" %}</h3> |
|---|
| 362 | <ul> |
|---|
| 363 | {% for fd in folders %} |
|---|
| 364 | {% url extensions.webmail.main.folder fd.name as fdurl %} |
|---|
| 365 | <li class="droppable"> |
|---|
| 366 | <a href="{{ fd.name }}" name="loadfolder"> |
|---|
| 367 | {% if fd.icon %}<img src="/static/pics/{{ fd.icon }}" /> |
|---|
| 368 | {% else %}<img src="/static/pics/folder.png" /> |
|---|
| 369 | {% endif %} |
|---|
| 370 | {{ fd.name }} |
|---|
| 371 | </a> |
|---|
| 372 | </li> |
|---|
| 373 | {% endfor %} |
|---|
| 374 | </ul> |
|---|
| 375 | </div> |
|---|
| 376 | {% endblock %} |
|---|