C&C Tiberium Alliances Zmail

Complete and comprehensive mail client.

目前為 2014-05-31 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name C&C Tiberium Alliances Zmail
  3. // @description Complete and comprehensive mail client.
  4. // @author arcm111 / zdoom
  5. // @version 2013.10.04
  6. // @namespace http*://*.alliances.commandandconquer.com/*
  7. // @include http*://*.alliances.commandandconquer.com/*
  8. /*
  9. Zmail is fast and easy to use mail client that allows you to send and receive messages.
  10.  
  11. Main features:
  12.  
  13. Send/receive messages.
  14. Save draft messages.
  15. Block messages from unwanted players.
  16. Documents folder.
  17. Trash folder.
  18. Organize contacts.
  19. Rich text editor features(such as tables, lists and text alignment)-€-
  20. Alerts (shows notification sent/received messages).
  21. Search messages by subject or sender's name.
  22. -€- use only if the person receiving your message is using zmail as well.
  23. */
  24. // ==/UserScript==
  25.  
  26. qx.Class.define('zmail.data',
  27. {
  28. type: 'singleton',
  29. extend: qx.core.Object,
  30.  
  31. construct: function()
  32. {
  33. var data = ClientLib.Data.MainData.GetInstance();
  34. var mail = data.get_Mail();
  35. var root = this;
  36. var alliance = data.get_Alliance();
  37. var allianceExists = alliance.get_Exists();
  38. if(allianceExists)
  39. {
  40. var roles = alliance.get_Roles();
  41. var relations = alliance.get_Relationships();
  42. this.roles = roles;
  43.  
  44. for (var i = 0; i < relations.length; i++)
  45. {
  46. var type = relations[i].Relationship, id = relations[i].OtherAllianceId, name = relations[i].OtherAllianceName;
  47. if (type == 1) this.getAllianceMembers(id, name);
  48. }
  49. this.getMembers();
  50. }
  51.  
  52. var ownerName = data.get_Player().get_Name();
  53. var ownerId = data.get_Player().get_Id();
  54. this.ownerName = ownerName;
  55. this.ownerId = ownerId;
  56.  
  57. var getPlayers = function(fi,li)
  58. {
  59. ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand("RankingGetData",
  60. { 'ascending': true, 'firstIndex': fi, 'lastIndex': li, 'rankingType': 0, 'sortColumn': 2, 'view': 0 },
  61. phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, function(context, data)
  62. {
  63. if(data !== null) root.players = root.players.concat(data.p);
  64. }), null);
  65. };
  66. var getList = function(count)
  67. {
  68. var pages = Math.ceil(count/4500);
  69. for(var i = 0; i < pages; i++)
  70. {
  71. var min = i * 4500, max = Math.min((((i+1) * 4500) - 1), (count-1));
  72. getPlayers(min, max);
  73. }
  74. };
  75. ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand("RankingGetCount", { 'rankingType': 0, 'view': 0 },
  76. phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, function(context, data)
  77. {
  78. if (data !== null) getList(data);
  79. }), null);
  80.  
  81. if(typeof localStorage.ccta_zmail !== 'undefined')
  82. {
  83. var json = JSON.parse(localStorage.ccta_zmail);
  84. if(json.hasOwnProperty('archive')) this.archive = json.archive;
  85. }
  86.  
  87. var inbox = {
  88. folder: null,
  89. count: mail.GetMailCount(0),
  90. messages: [],
  91. unRead: mail.GetUnreadCount(),
  92. };
  93.  
  94. var outbox = {
  95. folder: null,
  96. count: mail.GetMailCount(1),
  97. messages: [],
  98. };
  99.  
  100. var getFolder = function(type)
  101. {
  102. var gmh = mail.GetMailHeaders.toString();
  103. var prop = gmh.replace(/^.*?c=this\.(.*?)\.d\[a\].*?$/, '$1');
  104. var folder = mail[prop].d[type].i;
  105. return folder;
  106. }
  107.  
  108. inbox.folder = getFolder(0);
  109. outbox.folder = getFolder(1);
  110.  
  111. this.inbox = inbox;
  112. this.outbox = outbox;
  113.  
  114. this.getMsgHeaders(inbox.folder, inbox.count, 0);
  115. this.getMsgHeaders(outbox.folder, outbox.count, 1);
  116.  
  117. phe.cnc.Util.attachNetEvent(ClientLib.Data.MainData.GetInstance().get_Mail(), 'DataChange', ClientLib.Data.MailDataChange, this, this._onMailChange);
  118. },
  119.  
  120. destruct: function(){},
  121.  
  122. members:
  123. {
  124. inbox: null,
  125. outbox: null,
  126. update: null,
  127. archive: {},
  128. inProgress: false,
  129. players: [],
  130. roles: null,
  131. allianceMembers: null,
  132. allianceCommanders: null,
  133. allies: {},
  134. ownerName: null,
  135. ownerId: null,
  136.  
  137. call: function(fn)
  138. {
  139. var root = this;
  140. root[fn].apply(root, arguments);
  141. },
  142.  
  143. update: function()
  144. {
  145. if(this.inProgress) return;
  146. this.inProgress = true;
  147. console.log('checking mails');
  148. var data = ClientLib.Data.MainData.GetInstance();
  149. var mail = data.get_Mail();
  150. var count = mail.GetUnreadCount();
  151. this.inbox.count = mail.GetMailCount(0);
  152. this.outbox.count = mail.GetMailCount(1);
  153. this.inbox.unRead = count;
  154. this.getMsgHeaders(this.inbox.folder, this.inbox.count, 0);
  155. this.getMsgHeaders(this.outbox.folder, this.outbox.count, 1);
  156. },
  157.  
  158. markRead: function(id, flag)
  159. {
  160. ClientLib.Data.MainData.GetInstance().get_Mail().SetMailRead(id, flag);
  161. },
  162.  
  163. deleteMsgs: function(id, folder)
  164. {
  165. ClientLib.Data.MainData.GetInstance().get_Mail().DeleteMessages(id, folder);
  166. },
  167.  
  168. sendMail: function(to, alliance, subject, message)
  169. {
  170. ClientLib.Data.MainData.GetInstance().get_Mail().SendMail(to, alliance, subject, message);
  171. },
  172.  
  173. createBBCode:
  174. {
  175. 'coords': function(name,x,y)
  176. {
  177. return webfrontend.gui.util.BBCode.createCoordsLinkText(name,x,y).replace('#0d77bb', '#377395');
  178. },
  179.  
  180. 'player': function(name)
  181. {
  182. return webfrontend.gui.util.BBCode.createPlayerLinkText(name).replace('#0d77bb', '#377395');
  183. },
  184.  
  185. 'alliance': function(name)
  186. {
  187. return webfrontend.gui.util.BBCode.createAllianceLinkText(name).replace('#0d77bb', '#377395');
  188. }
  189. },
  190.  
  191. getMembers: function()
  192. {
  193. ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand("AllianceGetMemberData", {},
  194. phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, function(context, data)
  195. {
  196. var members = [], commanders = [];
  197. for (var i = 0; i < data.length; i++)
  198. {
  199. var name = data[i].n, id = data[i].i, roleId = data[i].r, role = this.roles.d[roleId].Name;
  200. switch(role)
  201. {
  202. case 'Leader': role = 'Commander-in-Cheif'; break;
  203. case 'Newbie': role = 'Trial'; break;
  204. }
  205. var member = {'id': id, 'name': name, 'role': role, 'roleId': roleId};
  206. if (role == 'Commander-in-Cheif' || role == 'Second Commander') commanders.push(member);
  207. members.push(member);
  208. }
  209. this.allianceMembers = members;
  210. this.allianceCommanders = commanders;
  211. var structure = zmail.structure.getInstance();
  212. structure.dom.leftBar.contacts.alliance.nodeValue = 'Alliance ' + members.length;
  213. structure.dom.leftBar.contacts.commanders.nodeValue = 'Commanders ' + commanders.length;
  214. }), null);
  215. },
  216.  
  217. getAllianceMembers: function(aid, name)
  218. {
  219. ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand("GetPublicAllianceMemberList", {'id': aid },
  220. phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, function(context, data)
  221. {
  222. this.allies[name] = data;
  223. }), null);
  224. },
  225.  
  226. getMsgHeaders: function(id, count, type)
  227. {
  228. type == 0 ? this.inbox.messages = [] : this.outbox.messages = [];
  229. ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand("IGMGetMsgHeader", { folder: id, ascending: false, skip: 0, take: count, sortColumn: 1 },
  230. phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, function(context, data)
  231. {
  232. for (var i = 0; i < data.length; i++) this.getMsgBody(data[i], type);
  233. }), null);
  234. },
  235.  
  236. getMsgBody: function(msg, type)
  237. {
  238. if(this.archive.hasOwnProperty(msg.i))
  239. {
  240. if(this.archive[msg.i].r != msg.r) this.archive[msg.i].r = msg.r;
  241. type == 0 ? this.inbox.messages.push(this.archive[msg.i]) : this.outbox.messages.push(this.archive[msg.i]);
  242. this.onCompleted();
  243. }
  244. else
  245. {
  246. ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand("IGMGetMsg", { mailId: msg.i },
  247. phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, function(context, data)
  248. {
  249. var cm = msg;
  250. cm.b = data;
  251. type == 0 ? this.inbox.messages.push(cm) : this.outbox.messages.push(cm);
  252. this.archive[msg.i] = cm;
  253. this.onCompleted();
  254. }), null);
  255. }
  256. },
  257.  
  258. onCompleted: function()
  259. {
  260. var ti = this.inbox.count, to = this.outbox.count, ci = this.inbox.messages.length, co = this.outbox.messages.length;
  261. if(ti == ci && to == co)
  262. {
  263. var structure = zmail.structure.getInstance();
  264. structure.callUpdate(this.inbox.messages, this.outbox.messages);
  265. var json = JSON.parse(localStorage.ccta_zmail);
  266. json.archive = this.archive;
  267. localStorage.ccta_zmail = JSON.stringify(json);
  268. this.inProgress = false;
  269. }
  270. },
  271.  
  272. _onMailChange: function()
  273. {
  274. var data = ClientLib.Data.MainData.GetInstance();
  275. var structure = zmail.structure.getInstance();
  276. var mail = data.get_Mail();
  277. var countInbox = mail.GetMailCount(0);
  278. var countOutbox = mail.GetMailCount(1);
  279. console.log('checking new messages');
  280. if(countInbox > this.inbox.count)
  281. {
  282. this.update();
  283. console.log('new message detected');
  284. }
  285. if(countOutbox > this.outbox.count)
  286. {
  287. this.update();
  288. console.log('message sent successfully');
  289. }
  290. }
  291. }
  292. });
  293.  
  294. qx.Class.define('zmail.main',
  295. {
  296. type: 'singleton',
  297. extend: qx.ui.container.Composite,
  298.  
  299. construct: function()
  300. {
  301. this.base(arguments);
  302. var layout = new qx.ui.layout.Canvas();
  303. this._setLayout(layout);
  304.  
  305. zmail.data.getInstance();
  306.  
  307. var widget = new qx.ui.core.Widget();
  308. widget.setPadding(3);
  309. widget.setHeight(546);
  310. var div = new qx.html.Element('div', null, {'id': 'zdoom_mail_container'});
  311. widget.getContentElement().add(div);
  312. this.add(widget, {left: 0, top: 0});
  313. this.widget = widget;
  314.  
  315. this.wdgAnchor = new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_tl1.png").set({ width: 3, height: 32 });
  316. this.__imgTopRightCorner = new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_tr.png").set({ width: 34, height: 35 });
  317. this.__backgroundTop = new qx.ui.basic.Image(null);
  318. var cntBackgroundTop = new qx.ui.container.Composite(new qx.ui.layout.Canvas()).set({ height: 132 , maxHeight: 132 });
  319. var cntBackgroundTopBackground = new qx.ui.container.Composite().set({ backgroundColor: "#000000" });
  320. cntBackgroundTop.add(cntBackgroundTopBackground, { left: 0, top: 0, right: 0, bottom: 0 });
  321. cntBackgroundTop.add(this.__backgroundTop, { left: 0, top: -10 });
  322. this.__background = new qx.ui.basic.Image(null);
  323. var cntBackground = new qx.ui.container.Composite(new qx.ui.layout.Canvas());
  324. cntBackground.add(this.__background, { left: 0, top: -10 });
  325. this._add(cntBackground, { left: -114, top: 132-60 });
  326. this._add(cntBackgroundTop, { left: -114, top: -60 });
  327. this._add(this.__imgTopRightCorner, { right: 0, top: 0, bottom: 28 });
  328. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_r.png").set({ width: 3, height: 1, allowGrowY: true, scale: true }), { right: 0, top: 35, bottom: 29 });
  329. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_br.png").set({ width: 5, height: 28, allowGrowY: true, scale: true }), { right: 0, bottom: 0 });
  330. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_b.png").set({ width: 1, height: 3, allowGrowX: true, scale: true }), { right: 5, bottom: 0, left: 5 });
  331. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_bl.png").set({ width: 5, height: 29 }), { left: 0, bottom: 0 });
  332. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_l.png").set({ width: 3, height: 1, allowGrowY: true, scale: true }), { left: 0, bottom: 29, top: 32 });
  333. this._add(this.wdgAnchor, { left: 0, top: 0 });
  334. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_tl2.png").set({ width: 25, height: 5 }), { left: 3, top: 0 });
  335. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_t.png").set({ width: 1, height: 3, allowGrowX: true, scale: true }), { left: 28, right: 34, top: 0 });
  336. this.__btnClose = new webfrontend.ui.SoundButton(null, "FactionUI/icons/icon_close_button.png").set({ appearance: "button-close", width: 23, height: 23, toolTipText: this.tr("tnf:close base view") });
  337. this.__btnClose.addListener("execute", this._onClose, this);
  338. this._add(this.__btnClose, { top: 6, right: 5 });
  339.  
  340. var app = qx.core.Init.getApplication();
  341. app.getDesktop().addListener('resize', this._onResize, this);
  342. },
  343.  
  344. destruct: function()
  345. {
  346.  
  347. },
  348.  
  349. members:
  350. {
  351. open: function()
  352. {
  353. this._onResize();
  354. var app = qx.core.Init.getApplication();
  355. app.getDesktop().add(this);
  356.  
  357. var mail = zmail.structure.getInstance();
  358. var check = function()
  359. {
  360. var div = document.getElementById('zdoom_mail_container');
  361. if(div) div.appendChild(mail.dom.window.main);
  362. else setTimeout(check, 1000);
  363. };
  364. check();
  365. },
  366.  
  367. _onClose: function ()
  368. {
  369. var app = qx.core.Init.getApplication();
  370. app.getDesktop().remove(this);
  371. },
  372.  
  373. _onResize: function()
  374. {
  375. var app = qx.core.Init.getApplication();
  376. var mainOverlay = app.getMainOverlay();
  377. var left = (app.getDesktop().getBounds().width - mainOverlay.getWidth()) / 2;
  378. this.setUserBounds(left, mainOverlay.getBounds().top, mainOverlay.getWidth(), 546);
  379. this.widget.setWidth(mainOverlay.getWidth());
  380. },
  381.  
  382. center: function()
  383. {
  384. var parent = this.getLayoutParent();
  385. if (parent) var bh = parent.getBounds();
  386. if (bh) var bi = this.getSizeHint();
  387. var bg = Math.round((bh.width - bi.width) / 2);
  388. var top = this.getBounds().top;
  389. this.moveTo(bg,top);
  390. }
  391. }
  392.  
  393. });
  394.  
  395.  
  396. qx.Class.define('zmail.compose',
  397. {
  398. type: 'singleton',
  399. extend: qx.ui.container.Composite,
  400.  
  401. construct: function()
  402. {
  403. this.base(arguments);
  404. var layout = new qx.ui.layout.Canvas();
  405. this._setLayout(layout);
  406.  
  407. zmail.data.getInstance();
  408.  
  409. var widget = new qx.ui.core.Widget();
  410. widget.setPadding(3);
  411. widget.setHeight(546);
  412. var div = new qx.html.Element('div', null, {'id': 'zdoom_newMail_container'});
  413. widget.getContentElement().add(div);
  414. this.add(widget, {left: 0, top: 0});
  415. this.widget = widget;
  416.  
  417. this.wdgAnchor = new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_tl1.png").set({ width: 3, height: 32 });
  418. this.__imgTopRightCorner = new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_tr.png").set({ width: 34, height: 35 });
  419. this.__backgroundTop = new qx.ui.basic.Image(null);
  420. var cntBackgroundTop = new qx.ui.container.Composite(new qx.ui.layout.Canvas()).set({ height: 132 , maxHeight: 132 });
  421. var cntBackgroundTopBackground = new qx.ui.container.Composite().set({ backgroundColor: "#000000" });
  422. cntBackgroundTop.add(cntBackgroundTopBackground, { left: 0, top: 0, right: 0, bottom: 0 });
  423. cntBackgroundTop.add(this.__backgroundTop, { left: 0, top: -10 });
  424. this.__background = new qx.ui.basic.Image(null);
  425. var cntBackground = new qx.ui.container.Composite(new qx.ui.layout.Canvas());
  426. cntBackground.add(this.__background, { left: 0, top: -10 });
  427. this._add(cntBackground, { left: -114, top: 132-60 });
  428. this._add(cntBackgroundTop, { left: -114, top: -60 });
  429. this._add(this.__imgTopRightCorner, { right: 0, top: 0, bottom: 28 });
  430. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_r.png").set({ width: 3, height: 1, allowGrowY: true, scale: true }), { right: 0, top: 35, bottom: 29 });
  431. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_br.png").set({ width: 5, height: 28, allowGrowY: true, scale: true }), { right: 0, bottom: 0 });
  432. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_b.png").set({ width: 1, height: 3, allowGrowX: true, scale: true }), { right: 5, bottom: 0, left: 5 });
  433. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_bl.png").set({ width: 5, height: 29 }), { left: 0, bottom: 0 });
  434. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_l.png").set({ width: 3, height: 1, allowGrowY: true, scale: true }), { left: 0, bottom: 29, top: 32 });
  435. this._add(this.wdgAnchor, { left: 0, top: 0 });
  436. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_tl2.png").set({ width: 25, height: 5 }), { left: 3, top: 0 });
  437. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_t.png").set({ width: 1, height: 3, allowGrowX: true, scale: true }), { left: 28, right: 34, top: 0 });
  438. this.__btnClose = new webfrontend.ui.SoundButton(null, "FactionUI/icons/icon_close_button.png").set({ appearance: "button-close", width: 23, height: 23, toolTipText: this.tr("tnf:close base view") });
  439. this.__btnClose.addListener("execute", this._onClose, this);
  440. this._add(this.__btnClose, { top: 6, right: 5 });
  441.  
  442. var app = qx.core.Init.getApplication();
  443. app.getDesktop().addListener('resize', this._onResize, this);
  444. },
  445.  
  446. destruct: function()
  447. {
  448.  
  449. },
  450.  
  451. members:
  452. {
  453. isOpen: false,
  454. open: function()
  455. {
  456. this._onResize();
  457. var app = qx.core.Init.getApplication();
  458. app.getDesktop().add(this);
  459. this.isOpen = true;
  460.  
  461. var mail = zmail.structure.getInstance();
  462. var check = function()
  463. {
  464. var div = document.getElementById('zdoom_newMail_container');
  465. if(div) div.appendChild(mail.dom.window.compose);
  466. else setTimeout(check, 1000);
  467. };
  468. check();
  469. },
  470.  
  471. _onClose: function()
  472. {
  473. var app = qx.core.Init.getApplication();
  474. app.getDesktop().remove(this);
  475. this.isOpen = false;
  476. },
  477.  
  478. _onResize: function()
  479. {
  480. var app = qx.core.Init.getApplication();
  481. var mainOverlay = app.getMainOverlay();
  482. var left = (app.getDesktop().getBounds().width - mainOverlay.getWidth()) / 2;
  483. this.setUserBounds(left, mainOverlay.getBounds().top, mainOverlay.getWidth(), 546);
  484. this.widget.setWidth(mainOverlay.getWidth());
  485. },
  486.  
  487. center: function()
  488. {
  489. var parent = this.getLayoutParent();
  490. if (parent) var bh = parent.getBounds();
  491. if (bh) var bi = this.getSizeHint();
  492. var bg = Math.round((bh.width - bi.width) / 2);
  493. var top = this.getBounds().top;
  494. this.moveTo(bg,top);
  495. }
  496. }
  497. });
  498.  
  499. qx.Class.define('zmail.structure',
  500. {
  501. type: 'singleton',
  502. extend: qx.core.Object,
  503.  
  504. construct: function()
  505. {
  506. var root = this;
  507. var callUpdate = function()
  508. {
  509. root.update.apply(root, arguments);
  510. };
  511. this.callUpdate = callUpdate;
  512.  
  513. Element.prototype.zm_append = function (arr)
  514. {
  515. for (var i = 0; i < arr.length; i++) this.appendChild(arr[i]);
  516. };
  517.  
  518. Element.prototype.zm_empty = function()
  519. {
  520. while(this.firstChild) this.removeChild(this.firstChild);
  521. };
  522.  
  523. Element.prototype.zm_css = function(css)
  524. {
  525. var iterator = function(obj)
  526. {
  527. for(var x in obj) elm.style[x] = obj[x];
  528. };
  529. var elm = this;
  530. for (var key in css) {
  531. var prop = css[key];
  532. switch(key)
  533. {
  534. case 'over': elm.onmouseover = function(){iterator(css['over'])}; break;
  535. case 'out': elm.onmouseout = function(){iterator(css['out'])}; break;
  536. case 'focus': elm.onfocus = function(){iterator(css['focus'])}; break;
  537. case 'blur': elm.onblur = function(){iterator(css['blur'])}; break;
  538. default: elm.style[key] = css[key];
  539. }
  540. }
  541. };
  542.  
  543. Element.prototype.zm_prop = function (obj)
  544. {
  545. for (var key in object) this[key] = obj[key];
  546. };
  547.  
  548. if(typeof localStorage.ccta_zmail === 'undefined')
  549. {
  550. var sd = {
  551. 'folders': {'draft': {}, 'junk': [], 'trash': [[],[]], 'documents': []},
  552. 'contacts': {'blocked': [], 'friends': []},
  553. 'archive': {}
  554. };
  555. localStorage['ccta_zmail'] = JSON.stringify(sd);
  556. }
  557.  
  558. this.css.topBar.cont.backgroundImage = this.gradient('#5C5E62', '#3E4042');
  559. this.css.searchResults.text.backgroundImage = this.gradient('#5a5a5a', '#4a4a4a');
  560. var blueGrd = root.gradient('#3d7fa0', '#31678a');
  561.  
  562. var create = this.create, cssStyles = this.css, text = this.text;
  563.  
  564. var winCont = create('div', cssStyles.window);
  565. var topBar = create('div', cssStyles.topBar.main);
  566. var topBarCont = create('div', cssStyles.topBar.cont);
  567. var leftBar = create('div', cssStyles.leftBar);
  568. var logo = create('div', cssStyles.topBar.logo);
  569. var tbMenu = create('div', cssStyles.topBar.menu);
  570. var middleBar = create('div', cssStyles.middleBar.cont);
  571. var rightBar = create('div', cssStyles.rightBar.main);
  572. var leftBarWrapper = create('div', cssStyles.tableCellWrapper);
  573. var rightBarWrapper = create('div', cssStyles.tableCellWrapper);
  574. var middleBarWrapper = create('div', cssStyles.tableCellWrapper);
  575. var msgMask = create('div', cssStyles.rightBar.msgMask);
  576. var msgCont = create('div', cssStyles.rightBar.msgCont);
  577. var msgSbc = create('div', cssStyles.rightBar.scrollBar.cont);
  578. var msgSb = create('div', cssStyles.rightBar.scrollBar.bar);
  579. var headersMask = create('div', cssStyles.middleBar.headers.mask);
  580. var headersSbc = create('div', cssStyles.middleBar.scrollBar.cont);
  581. var headersFooter = create('div', cssStyles.middleBar.footer.cont);
  582. var headersCont = create('div', cssStyles.middleBar.headers.scroll);
  583. var mailIcon = document.createElement('img');
  584. var mailText = document.createTextNode('Z'+'MAIL');
  585. var expandCont = create('div', cssStyles.compose.rightBar.expand);
  586. expandCont.style.backgroundImage = 'url(' + this.res.expandDocument + ')';
  587. expandCont.data = {'isExpanded': false};
  588. expandCont.onclick = function()
  589. {
  590. var expanded = this.data.isExpanded;
  591. this.style.backgroundImage = (expanded) ? 'url(' + root.res.expandDocument + ')' : 'url(' + root.res.contractDocument + ')';
  592. leftBar.style.display = (expanded) ? 'table-cell' : 'none';
  593. middleBar.style.display = (expanded) ? 'table-cell' : 'none';
  594. this.data.isExpanded = !expanded;
  595. };
  596. mailIcon.src = this.res.mail;
  597. mailIcon.style.marginRight = '6px';
  598. logo.zm_append([mailIcon, mailText]);
  599. topBarCont.zm_append([logo, tbMenu]);
  600. topBar.appendChild(topBarCont);
  601. msgMask.appendChild(msgCont);
  602. msgSbc.appendChild(msgSb);
  603. rightBarWrapper.zm_append([msgMask, msgSbc]);
  604. rightBar.appendChild(rightBarWrapper);
  605. headersMask.appendChild(headersCont);
  606. middleBarWrapper.zm_append([headersMask, headersSbc, headersFooter]);
  607. middleBar.appendChild(middleBarWrapper);
  608. winCont.zm_append([topBar, leftBar, middleBar, rightBar]);
  609. this.enableScroll(msgSb, msgSbc, msgCont);
  610.  
  611. //middleBar Footer
  612. var pagesBar = create('div', cssStyles.middleBar.footer.pagesBar);
  613. var pagesInd = create('div', cssStyles.middleBar.footer.indicator);
  614. var pagesControlCont = create('div', cssStyles.middleBar.footer.pagesControls.cont);
  615. var pagesControlLabel = create('div', cssStyles.middleBar.footer.pagesControls.label);
  616. var selectAllCont = create('div', cssStyles.middleBar.footer.selectAll.span);
  617. var selectAllCheckBox = create('div', cssStyles.middleBar.footer.selectAll.checkBox);
  618.  
  619. pagesBar.appendChild(pagesInd);
  620. selectAllCont.appendChild(selectAllCheckBox);
  621. headersFooter.zm_append([pagesBar, selectAllCont, pagesControlLabel, pagesControlCont]);
  622.  
  623. headersFooter.onmouseover = function(){ pagesControlLabel.style.display = 'block' };
  624. headersFooter.onmouseout = function(){ pagesControlLabel.style.display = 'none' };
  625.  
  626. var changePage = function(mode)
  627. {
  628. var f = root.selectedFolder, l = root.folders[f].msgs.length, t = Math.ceil(l / 30) - 1, p = root.selectedPage, np;
  629. var populate = function(){ root.populateHeaders.apply(root, arguments) }
  630.  
  631. switch(mode)
  632. {
  633. case 'next': np = (p + 1 > t) ? t : p + 1; break;
  634. case 'previous': np = (p - 1 < 0) ? 0 : p - 1; break;
  635. case 'first': np = 0; break;
  636. case 'last': np = t; break;
  637. }
  638. if ( p == np) return;
  639. root.selectedPage = np;
  640. populate();
  641. };
  642.  
  643. ['first', 'previous', 'next', 'last'].map(function(btn)
  644. {
  645. var controlBtn = create('div', cssStyles.middleBar.footer.pagesControls.icon);
  646. if (btn == 'previous') controlBtn.style.marginRight = '5px';
  647. controlBtn.style.backgroundImage = 'url(' + root.res.controls[btn] + ')';
  648. controlBtn.onclick = function(){ changePage(btn) };
  649. pagesControlCont.appendChild(controlBtn);
  650. });
  651.  
  652. var selectAll = function(){ root.selectAll.apply(root, arguments) };
  653. var addGroup = function(){ root.addGroupToSelection.apply(root, arguments) };
  654. var removeGroup = function(){ root.removeGroupFromSelection.apply(root, arguments) };
  655. selectAllCheckBox.data = {'isChecked': false};
  656. selectAllCheckBox.onmousedown = function(){this.style.background = '#202020'};
  657. selectAllCheckBox.onmouseup = function()
  658. {
  659. var isChecked = this.data.isChecked;
  660. var color = isChecked ? 'transparent' : '#9f9f9f';
  661. this.style.background = color;
  662. this.data.isChecked = !isChecked;
  663. var groups = ['alliance', 'commanders', 'friends', 'blocked'];
  664. (root.selectedFolder) ? selectAll(!isChecked) : (isChecked) ? removeGroup() : addGroup();
  665. };
  666. ///////////////////////////////////////////////////////////////////////////////////
  667.  
  668. //Search Messages
  669. var searchBox = create('textField', cssStyles.input.text.search);
  670. this.placeHolder(searchBox, 'Search...');
  671.  
  672. var resultsCont = create('div', cssStyles.searchResults.cont);
  673. var resultsUl = create('ul', cssStyles.searchResults.ul);
  674. var bySender = create('li', cssStyles.searchResults.li.main);
  675. var bySubject = create('li', cssStyles.searchResults.li.main);
  676. var bySenderCount = create('span', cssStyles.searchResults.count);
  677. var bySubjectCount = create('span', cssStyles.searchResults.count);
  678. var bySenderUl = create('ul', cssStyles.searchResults.ul);
  679. var bySubjectUl = create('ul', cssStyles.searchResults.ul);
  680. var bySenderTxt = create('p', cssStyles.searchResults.text);
  681. var bySubjectTxt = create('p', cssStyles.searchResults.text);
  682. text(bySenderTxt, 'From: ');
  683. text(bySubjectTxt, 'Subject: ');
  684. bySenderTxt.appendChild(bySenderCount);
  685. bySubjectTxt.appendChild(bySubjectCount);
  686. bySender.zm_append([bySenderTxt, bySenderUl]);
  687. bySubject.zm_append([bySubjectTxt, bySubjectUl]);
  688. resultsUl.zm_append([bySender, bySubject]);
  689. resultsCont.appendChild(resultsUl);
  690. resultsCont.data = {'isFocused': false};
  691.  
  692. var searchFolder = function(){ root.searchFolder.apply(root, arguments) };
  693. resultsCont.onmouseover = function(){this.data.isFocused = true};
  694. resultsCont.onmouseout = function(){this.data.isFocused = false};
  695.  
  696. searchBox.onkeyup = function()
  697. {
  698. var str = this.value;
  699. searchFolder(str);
  700. };
  701.  
  702. searchBox.onblur = function()
  703. {
  704. if (!resultsCont.data.isFocused) resultsCont.style.display = 'none';
  705. this.value = 'Search...';
  706. this.style.color = '#333333';
  707. };
  708.  
  709. ///////////////////////////////////////////////////////////////////////////////////
  710.  
  711. //folders & contacts
  712. var lbList = create('ul', cssStyles.ul.leftBar.main);
  713. var foldersLi = create('li', cssStyles.li.leftBar.main);
  714. var contactsLi = create('li', cssStyles.li.leftBar.main);
  715. var foldersUl = create('ul', cssStyles.ul.leftBar.sub);
  716. var contactsUl = create('ul', cssStyles.ul.leftBar.sub);
  717. var inboxLi = create('li', cssStyles.li.leftBar.subSelected);
  718. var outboxLi = create('li', cssStyles.li.leftBar.sub);
  719. var draftLi = create('li', cssStyles.li.leftBar.sub);
  720. var junkLi = create('li', cssStyles.li.leftBar.sub);
  721. var trashLi = create('li', cssStyles.li.leftBar.sub);
  722. var documentsLi = create('li', cssStyles.li.leftBar.sub);
  723. var friendsLi = create('li', cssStyles.li.leftBar.sub);
  724. var blockedLi = create('li', cssStyles.li.leftBar.sub);
  725. var allianceLi = create('li', cssStyles.li.leftBar.sub);
  726. var commandersLi = create('li', cssStyles.li.leftBar.sub);
  727. var inboxTxt = document.createTextNode('Inbox');
  728. var outboxTxt = document.createTextNode('Outbox');
  729. var draftTxt = document.createTextNode('Draft');
  730. var junkTxt = document.createTextNode('Junk');
  731. var trashTxt = document.createTextNode('Trash');
  732. var documentsTxt = document.createTextNode('Documents');
  733. var friendsTxt = document.createTextNode('Friends');
  734. var blockedTxt = document.createTextNode('Blocked');
  735. var allianceTxt = document.createTextNode('Alliance');
  736. var commandersTxt = document.createTextNode('Commanders');
  737.  
  738. inboxLi.appendChild(inboxTxt);
  739. outboxLi.appendChild(outboxTxt);
  740. draftLi.appendChild(draftTxt);
  741. junkLi.appendChild(junkTxt);
  742. trashLi.appendChild(trashTxt);
  743. documentsLi.appendChild(documentsTxt);
  744. friendsLi.appendChild(friendsTxt);
  745. blockedLi.appendChild(blockedTxt);
  746. allianceLi.appendChild(allianceTxt);
  747. commandersLi.appendChild(commandersTxt);
  748.  
  749. var changeFolder = function(folder)
  750. {
  751. if (root.selectedGroup) root.dom.leftBar.items[root.selectedGroup].zm_css(cssStyles.li.leftBar.sub);
  752. if (root.selectedFolder) root.dom.leftBar.items[root.selectedFolder].zm_css(cssStyles.li.leftBar.sub);
  753. root.dom.leftBar.items[folder].zm_css(cssStyles.li.leftBar.subSelected);
  754. root.selectedFolder = folder;
  755. root.selectedGroup = false;
  756. root.resetMsgCont();
  757. root.selectedPage = 0;
  758. root.populateHeaders();
  759. searchBox.disabled = false;
  760. msgSb.data.update();
  761. };
  762.  
  763. var changeGroup = function(group)
  764. {
  765. if (root.selectedGroup) root.dom.leftBar.items[root.selectedGroup].zm_css(cssStyles.li.leftBar.sub);
  766. if (root.selectedFolder) root.dom.leftBar.items[root.selectedFolder].zm_css(cssStyles.li.leftBar.sub);
  767. root.dom.leftBar.items[group].zm_css(cssStyles.li.leftBar.subSelected);
  768. root.selectedGroup = group;
  769. root.selectedFolder = false;
  770. root.populateContacts('rank');
  771. searchBox.disabled = true;
  772. msgSb.data.update();
  773. };
  774.  
  775. [[inboxLi,'inbox'],[outboxLi,'outbox'],[draftLi,'draft'],[junkLi,'junk'],[trashLi,'trash'],[documentsLi,'documents']].map(function(Item)
  776. {
  777. Item[0].onclick = function(){ changeFolder(Item[1]) }
  778. });
  779.  
  780. [[friendsLi,'friends'],[blockedLi,'blocked'],[allianceLi,'alliance'],[commandersLi,'commanders']].map(function(Item)
  781. {
  782. Item[0].onclick = function(){ changeGroup(Item[1]) }
  783. });
  784.  
  785. foldersUl.zm_append([inboxLi, outboxLi, draftLi, junkLi, trashLi, documentsLi]);
  786. contactsUl.zm_append([allianceLi, commandersLi, friendsLi, blockedLi]);
  787. foldersLi.zm_append([document.createTextNode('Folders'), foldersUl]);
  788. contactsLi.zm_append([document.createTextNode('Contacts'), contactsUl]);
  789. lbList.zm_append([foldersLi, contactsLi]);
  790. leftBarWrapper.zm_append([searchBox, lbList, resultsCont]);
  791. leftBar.appendChild(leftBarWrapper);
  792.  
  793. this.dom.leftBar.folders.inbox = inboxTxt;
  794. this.dom.leftBar.folders.outbox = outboxTxt;
  795. this.dom.leftBar.folders.junk = junkTxt;
  796. this.dom.leftBar.folders.trash = trashTxt;
  797. this.dom.leftBar.folders.draft = draftTxt;
  798. this.dom.leftBar.folders.documents = documentsTxt;
  799. this.dom.leftBar.contacts.friends = friendsTxt;
  800. this.dom.leftBar.contacts.blocked = blockedTxt;
  801. this.dom.leftBar.contacts.alliance = allianceTxt;
  802. this.dom.leftBar.contacts.commanders = commandersTxt;
  803. this.dom.leftBar.items.inbox = inboxLi;
  804. this.dom.leftBar.items.outbox = outboxLi;
  805. this.dom.leftBar.items.junk = junkLi;
  806. this.dom.leftBar.items.trash = trashLi;
  807. this.dom.leftBar.items.draft = draftLi;
  808. this.dom.leftBar.items.documents = documentsLi;
  809. this.dom.leftBar.items.friends = friendsLi;
  810. this.dom.leftBar.items.blocked = blockedLi;
  811. this.dom.leftBar.items.alliance = allianceLi;
  812. this.dom.leftBar.items.commanders = commandersLi;
  813. ///////////////////////////////////////////////////////////////////////////////////
  814.  
  815. //selected contacts container
  816. var sc_mainCont = document.createElement('div');
  817. var sc_upperCont = create('div', cssStyles.rightBar.contacts.topWrapper);
  818. var sc_lowerCont = create('div', cssStyles.rightBar.contacts.bottomWrapper);
  819. var sc_header = create('div', cssStyles.message.subject);
  820. var sc_contactsCont = create('div', cssStyles.rightBar.contacts.cont);
  821. var sc_findPlayer = create('textField', cssStyles.rightBar.contacts.search);
  822. var sc_removeAll = create('div', cssStyles.rightBar.contacts.button.disabled);
  823. var sc_message = create('div', cssStyles.rightBar.contacts.button.disabled);
  824. var sc_addToSelection = create('div', cssStyles.rightBar.contacts.button.active);
  825. var sc_addAsFriend = create('div', cssStyles.rightBar.contacts.button.active);
  826. var sc_block = create('div', cssStyles.rightBar.contacts.button.active);
  827. var sc_resultsCont = create('div', cssStyles.rightBar.contacts.results.cont);
  828. var sc_resultsMask = create('div', cssStyles.rightBar.contacts.results.mask);
  829. var sc_resultsContentCont = create('div', cssStyles.rightBar.contacts.results.contentsCont);
  830. var sc_resultsSbc = create('div', cssStyles.rightBar.contacts.results.scrollbar.cont);
  831. text(sc_header, 'No contacts selected.');
  832. text(sc_removeAll, 'Remove all');
  833. text(sc_message, 'Message');
  834. text(sc_addToSelection, 'Add to selection');
  835. text(sc_addAsFriend, 'Add as friend');
  836. text(sc_block, 'Block');
  837. this.placeHolder(sc_findPlayer, 'Find player...');
  838. sc_mainCont.style.overflow = 'hidden';
  839. sc_removeAll.zm_css({'display': 'inline-block', 'verticalAlign': 'top', 'width': '101px'});
  840. sc_message.zm_css({'display': 'inline-block', 'verticalAlign': 'top', 'marginLeft': '5px', 'width': '80px'});
  841. [sc_addToSelection, sc_addAsFriend, sc_block].map(function(x){ x.zm_css({'width': '120px', 'margin': '0 auto 5px auto'}) });
  842. sc_resultsMask.appendChild(sc_resultsContentCont);
  843. sc_resultsCont.zm_append([sc_resultsMask, sc_resultsSbc]);
  844. sc_upperCont.zm_append([sc_contactsCont, sc_findPlayer, sc_removeAll, sc_message]);
  845. sc_lowerCont.zm_append([sc_addToSelection, sc_addAsFriend, sc_block]);
  846. sc_mainCont.zm_append([sc_header, sc_upperCont, sc_lowerCont, sc_resultsCont]);
  847. this.dom.rightBar.contacts.main = sc_mainCont;
  848. this.dom.rightBar.contacts.lowerCont = sc_lowerCont;
  849. this.dom.rightBar.contacts.header = sc_header;
  850. this.dom.rightBar.contacts.cont = sc_contactsCont;
  851. this.dom.rightBar.contacts.search = sc_findPlayer;
  852. this.dom.rightBar.contacts.results = sc_resultsCont;
  853. this.dom.rightBar.contacts.scrollbarCont = sc_resultsSbc;
  854. this.dom.rightBar.contacts.contentsCont = sc_resultsContentCont;
  855. this.dom.rightBar.contacts.buttons.removeAll = sc_removeAll;
  856. this.dom.rightBar.contacts.buttons.message = sc_message;
  857. this.dom.rightBar.contacts.buttons.addToSelection = sc_addToSelection;
  858. this.dom.rightBar.contacts.buttons.addAsFriend = sc_addAsFriend;
  859. this.dom.rightBar.contacts.buttons.block = sc_block;
  860.  
  861. var addFriend = function(){ root.addFriend.apply(root, arguments) };
  862. var removeFriend = function(){ root.removeFriend.apply(root, arguments) };
  863. var blockContact = function(){ root.blockContact.apply(root, arguments) };
  864. var unblockContact = function(){ root.unblockContact.apply(root, arguments) };
  865. var removeAllSelectedContacts = function(){ root.removeAllSelectedContacts.apply(root, arguments) };
  866. var addContact = function(){ root.addToSelection.apply(root, arguments) };
  867. var removeContact = function(){ root.removeFromSelection.apply(root, arguments) };
  868. var setContactOptions = function(){ root.setContactOptions.apply(root, arguments) };
  869. var newMail = function(){ root.openNewMail.apply(root, arguments) };
  870.  
  871. sc_addToSelection.data = {'add': addContact, 'remove': removeContact, 'id': null, 'mode': null, 'update': setContactOptions};
  872. sc_addAsFriend.data = {'add': addFriend, 'remove': removeFriend, 'id': null, 'mode': null, 'update': setContactOptions};
  873. sc_block.data = {'block': blockContact, 'unblock': unblockContact, 'id': null, 'mode': null, 'update': setContactOptions};
  874. sc_removeAll.data = {};
  875. sc_message.data = {};
  876.  
  877. sc_addToSelection.onclick = function()
  878. {
  879. ((this.data.isEnabled) && (this.data.mode == 'add')) ? this.data.add(this.data.id) : this.data.remove(this.data.id);
  880. this.data.update(this.data.id);
  881. };
  882. sc_addAsFriend.onclick = function()
  883. {
  884. ((this.data.isEnabled) && (this.data.mode == 'add')) ? this.data.add(this.data.id) : this.data.remove(this.data.id);
  885. this.data.update(this.data.id);
  886. };
  887. sc_block.onclick = function()
  888. {
  889. ((this.data.isEnabled) && (this.data.mode == 'block')) ? this.data.block(this.data.id) : this.data.unblock(this.data.id);
  890. this.data.update(this.data.id);
  891. };
  892. sc_removeAll.onclick = function(){removeAllSelectedContacts()};
  893.  
  894. sc_message.onclick = function(){ if(this.data.isEnabled) newMail(1) };
  895.  
  896. [sc_addToSelection, sc_addAsFriend, sc_block, sc_removeAll, sc_message].map(function(btn)
  897. {
  898. var enable = function()
  899. {
  900. this.zm_css(cssStyles.rightBar.contacts.button.active);
  901. this.data.isEnabled = true;
  902. };
  903. var disable = function()
  904. {
  905. this.zm_css(cssStyles.rightBar.contacts.button.disabled);
  906. this.data.isEnabled = false;
  907. }
  908. btn.data.enable = function(){ enable.call(btn) };
  909. btn.data.disable = function(){ disable.call(btn) };
  910. btn.data.isEnabled = true;
  911. });
  912. sc_resultsCont.onmouseover = function(){sc_findPlayer.data.isContFocused = true};
  913. sc_resultsCont.onmouseout = function(){sc_findPlayer.data.isContFocused = false};
  914. sc_lowerCont.onmouseover = function(){sc_findPlayer.data.isContFocused = true};
  915. sc_lowerCont.onmouseout = function(){sc_findPlayer.data.isContFocused = false};
  916. sc_findPlayer.data = {'results': [], 'selectedIndex': 0, 'selectedGroup': 'results', 'selectedButton': 0, 'isContOpen': false, 'isContFocused': false, 'buttons': [sc_addToSelection, sc_addAsFriend, sc_block]};
  917. sc_findPlayer.onblur = function()
  918. {
  919. if (this.data.isContOpen && !this.data.isContFocused)
  920. {
  921. this.value = 'Find player...';
  922. this.data.selectedGroup = 'results';
  923. this.data.buttons[this.data.selectedButton].zm_css({'background': '#4e4e4e', 'color': '#8b8b8b'});
  924. this.data.selectedButton = 0;
  925. this.data.selectedIndex = 0;
  926. sc_resultsCont.style.display = 'none';
  927. sc_lowerCont.style.display = 'none';
  928. }
  929. };
  930. sc_findPlayer.onkeyup = function(event)
  931. {
  932. if(!event) event = window.event;
  933. event.preventDefault();
  934. event.stopPropagation();
  935. var populate = function(){ root.findContact.apply(root, arguments) };
  936. var changeSelection = function(){ root.changeContactSelection.apply(root, arguments) };
  937. var updateOptions = function(){ root.setContactOptions.apply(root, arguments) };
  938. var group = this.data.selectedGroup; i = this.data.selectedButton, btns = this.data.buttons, l = btns.length, parent = this;
  939. var changeButton = function(mode)
  940. {
  941. var getIndex = function(mode, x)
  942. {
  943. return (mode) ? ((i + x) % l) : ((i - x < 0) ? l - x : i - x);
  944. };
  945. var n = (btns[getIndex(mode, 1)].data.isEnabled) ? getIndex(mode, 1) : getIndex(mode, 2);
  946. if(btns[i].data.isEnabled) btns[i].zm_css({'background': '#4e4e4e', 'color': '#8b8b8b'});
  947. if(btns[n].data.isEnabled) btns[n].zm_css({'background': '#266589', 'color': '#c2c2c2'});
  948. parent.data.selectedButton = n;
  949. }
  950. if([37, 38, 39, 40, 13, 9].indexOf(event.keyCode) == -1)
  951. {
  952. populate(this.value);
  953. }
  954. if(event.keyCode == 38 && this.data.isContOpen)
  955. {
  956. group == 'results' ? changeSelection(false) : changeButton(false);
  957. }
  958. if(event.keyCode == 40 && this.data.isContOpen)
  959. {
  960. group == 'results' ? changeSelection(true) : changeButton(true);
  961. }
  962. if(event.keyCode == 37 && this.data.isContOpen && group == 'buttons')
  963. {
  964. this.data.selectedGroup = 'results';
  965. var selectedButton = this.data.buttons[this.data.selectedButton];
  966. if(selectedButton.data.isEnabled) selectedButton.zm_css({'background': '#4e4e4e', 'color': '#8b8b8b'});
  967. this.data.selectedButton = 0;
  968. }
  969. if(event.keyCode == 39 && this.data.isContOpen && group == 'results')
  970. {
  971. this.data.selectedGroup = 'buttons';
  972. this.data.buttons[0].zm_css({'background': '#266589', 'color': '#c2c2c2'});
  973. }
  974. if(event.keyCode == 13 && this.data.isContOpen)
  975. {
  976. if(group == 'buttons')
  977. {
  978. this.data.buttons[this.data.selectedButton].onclick();
  979. updateOptions(this.data.results[this.data.selectedIndex].data.id);
  980. var button = this.data.buttons[this.data.selectedButton];
  981. if (button.data.isEnabled) button.zm_css({'background': '#266589', 'color': '#c2c2c2'});
  982. else
  983. {
  984. this.data.buttons[0].zm_css({'background': '#266589', 'color': '#c2c2c2'});
  985. this.data.selectedButton = 0;
  986. }
  987. }
  988. }
  989. };
  990.  
  991. ///////////////////////////////////////////////////////////////////////////////////
  992.  
  993. //tools bar
  994. var toolsConstructor = function()
  995. {
  996. var inboxMsg = create('ul', cssStyles.ul.toolbar.main);
  997. var newMsg = create('li', cssStyles.li.toolbar.withIcon);
  998. var reply = create('li', cssStyles.li.toolbar.withDrop);
  999. var mark = create('li', cssStyles.li.toolbar.withDrop);
  1000. var trash = create('li', cssStyles.li.toolbar.textOnly);
  1001. var restore = create('li', cssStyles.li.toolbar.textOnly);
  1002. var empty = create('li', cssStyles.li.toolbar.textOnly);
  1003. var del = create('li', cssStyles.li.toolbar.textOnly);
  1004. var newMsgIcon = create('span', cssStyles.li.toolbar.newIcon);
  1005. var junk = create('li', cssStyles.li.toolbar.textOnly);
  1006. var notJunk = create('li', cssStyles.li.toolbar.textOnly);
  1007. var markDrop = create('span', cssStyles.li.toolbar.drop);
  1008. var replyDrop = create('span', cssStyles.li.toolbar.drop);
  1009. var replyDropMenu = create('ul', cssStyles.ul.toolbar.sub);
  1010. var markDropMenu = create('ul', cssStyles.ul.toolbar.sub);
  1011. var replyTo = create('li', cssStyles.li.toolbar.sub);
  1012. var replyToAll = create('li', cssStyles.li.toolbar.sub);
  1013. var forwardTo = create('li', cssStyles.li.toolbar.sub);
  1014. var read = create('li', cssStyles.li.toolbar.sub);
  1015. var unread = create('li', cssStyles.li.toolbar.sub);
  1016. var editDraft = create('li', cssStyles.li.toolbar.textOnly);
  1017. var deleteDraft = create('li', cssStyles.li.toolbar.textOnly);
  1018. var toDocuments = create('li', cssStyles.li.toolbar.textOnly);
  1019. [newMsg, reply, mark, del, junk, trash, notJunk, restore, empty, editDraft, deleteDraft, toDocuments].map(function(key)
  1020. {
  1021. key.onmouseover = function(){this.style.backgroundImage = blueGrd};
  1022. key.onmouseout = function(){this.style.backgroundImage = 'none'};
  1023. });
  1024. text(newMsg, 'New');
  1025. text(reply, 'Reply');
  1026. text(del, 'Delete');
  1027. text(mark, 'Mark');
  1028. text(junk, 'Junk');
  1029. text(notJunk, 'Not Junk');
  1030. text(trash, 'Trash');
  1031. text(empty, 'Empty');
  1032. text(restore, 'Restore');
  1033. text(replyTo, 'Reply');
  1034. text(replyToAll, 'Reply all');
  1035. text(forwardTo, 'Forward');
  1036. text(read, 'Read');
  1037. text(unread, 'Unread');
  1038. text(editDraft, 'Edit');
  1039. text(deleteDraft, 'Delete');
  1040. text(toDocuments, 'Document');
  1041. markDrop.style.backgroundImage = 'url(' + root.res.drop + ')';
  1042. replyDrop.style.backgroundImage = 'url(' + root.res.drop + ')';
  1043. newMsgIcon.style.backgroundImage = 'url(' + root.res.compose + ')';
  1044. forwardTo.style.borderBottom = 'none';
  1045. unread.style.borderBottom = 'none';
  1046. replyDropMenu.zm_append([replyTo, replyToAll, forwardTo]);
  1047. markDropMenu.zm_append([read, unread]);
  1048. newMsg.appendChild(newMsgIcon);
  1049. mark.zm_append([markDrop, markDropMenu]);
  1050. reply.zm_append([replyDrop, replyDropMenu]);
  1051. inboxMsg.zm_append([newMsg, reply, mark, del, junk, trash, notJunk, restore, empty, editDraft, deleteDraft, toDocuments]);
  1052.  
  1053. newMsg.onclick = root.callMethod('openNewMail');
  1054. replyTo.onclick = root.callMethod('reply');
  1055. replyToAll.onclick = root.callMethod('replyToAll');
  1056. forwardTo.onclick = root.callMethod('forwardMsg');
  1057. junk.onclick = root.callMethod('toJunk');
  1058. notJunk.onclick = root.callMethod('notJunk');
  1059. trash.onclick = root.callMethod('toTrash');
  1060. restore.onclick = root.callMethod('notTrash');
  1061. del.onclick = root.callMethod('deleteMsg');
  1062. empty.onclick = root.callMethod('emptyFolder');
  1063. read.onclick = root.callMethod('markRead', true);
  1064. unread.onclick = root.callMethod('markRead', false);
  1065. editDraft.onclick = root.callMethod('editDraft');
  1066. deleteDraft.onclick = root.callMethod('deleteDraft');
  1067. toDocuments.onclick = root.callMethod('toDocuments');
  1068.  
  1069. var attachSub = function(btn, menu)
  1070. {
  1071. btn.data = {'isActive': false};
  1072. menu.data = {'isFocused': false};
  1073. btn.addEventListener('mouseover', function()
  1074. {
  1075. var isActive = this.data.isActive;
  1076. menu.style.display = (isActive) ? 'none' : 'block';
  1077. this.data.isActive = !isActive;
  1078. }, false);
  1079. menu.addEventListener('mouseover', function(){this.data.isFocused = true;}, false);
  1080. menu.addEventListener('mouseout', function()
  1081. {
  1082. this.data.isFocused = false;
  1083. setTimeout(function(){if(!menu.data.isFocused){menu.style.display = 'none'; btn.data.isActive = false;}}, 100);
  1084. }, false);
  1085. btn.addEventListener('mouseout', function()
  1086. {
  1087. setTimeout(function(){if(!menu.data.isFocused){menu.style.display = 'none'; btn.data.isActive = false;}}, 100);
  1088. }, false);
  1089. }
  1090. attachSub(replyDrop, replyDropMenu);
  1091. attachSub(markDrop, markDropMenu);
  1092. root.dom.toolBar.compose = newMsg;
  1093. root.dom.topBar.toolbar.newMsg = newMsg;
  1094. root.dom.topBar.toolbar.reply = reply;
  1095. root.dom.topBar.toolbar.trash = trash;
  1096. root.dom.topBar.toolbar.delMsg = del;
  1097. root.dom.topBar.toolbar.junk = junk;
  1098. root.dom.topBar.toolbar.notJunk = notJunk;
  1099. root.dom.topBar.toolbar.restore = restore;
  1100. root.dom.topBar.toolbar.empty = empty;
  1101. root.dom.topBar.toolbar.mark = mark;
  1102. root.dom.topBar.toolbar.editDraft = editDraft;
  1103. root.dom.topBar.toolbar.deleteDraft = deleteDraft;
  1104. root.dom.topBar.toolbar.toDocuments = toDocuments;
  1105. this.inboxMsg = inboxMsg;
  1106. };
  1107.  
  1108. var toolbars = new toolsConstructor();
  1109. tbMenu.appendChild(toolbars.inboxMsg);
  1110. ///////////////////////////////////////////////////////////////////////////////////
  1111.  
  1112. //create main dom tree
  1113. this.dom.window.main = winCont;
  1114. this.dom.rightBar.cont = rightBar;
  1115. this.dom.rightBar.msgCont = msgCont;
  1116. this.dom.rightBar.scrollBar.cont = msgSbc;
  1117. this.dom.rightBar.scrollBar.bar = msgSb;
  1118. this.dom.rightBar.expandCont = expandCont;
  1119. this.dom.searchResults.cont = resultsCont;
  1120. this.dom.searchResults.sender.count = bySenderCount;
  1121. this.dom.searchResults.subject.count = bySubjectCount;
  1122. this.dom.searchResults.sender.list = bySenderUl;
  1123. this.dom.searchResults.subject.list = bySubjectUl;
  1124. this.dom.middleBar.headersCont = headersCont;
  1125. this.dom.middleBar.scrollBar.cont = headersSbc;
  1126. this.dom.middleBar.footer.selectAll = selectAllCheckBox;
  1127. this.dom.middleBar.footer.pagesCount = pagesControlLabel;
  1128. this.dom.middleBar.footer.indicator = pagesInd;
  1129. this.dom.middleBar.footer.controlCont = pagesControlCont;
  1130. this.dom.topBar.logo = logo;
  1131. this.dom.topBar.menu = toolbars.inboxMsg;
  1132. ///////////////////////////////////////////////////////////////////////////////////
  1133.  
  1134. //compose message container
  1135. var composeCont = create('div', cssStyles.compose.window);
  1136. var c_topBar = create('div', cssStyles.topBar.main);
  1137. var c_topBarCont = create('div', cssStyles.topBar.cont);
  1138. var c_leftBar = create('div', cssStyles.compose.leftBar.cont);
  1139. var c_rightBar = create('div', cssStyles.compose.rightBar.cont);
  1140. var c_leftBarWrapper = create('div', cssStyles.tableCellWrapper);
  1141. var c_rightBarWrapper = create('div', cssStyles.tableCellWrapper);
  1142. var c_logo = logo.cloneNode(true);
  1143. var c_tbMenu = create('div', cssStyles.topBar.menu);
  1144. var c_recipients = create('div', cssStyles.compose.leftBar.recipients.main);
  1145. var c_recipientsMask = create('div', cssStyles.compose.leftBar.recipients.mask);
  1146. var c_recipientsCont = create('div', cssStyles.compose.leftBar.recipients.cont);
  1147. var c_recipientsSbc = create('div', cssStyles.compose.leftBar.recipients.scrollbar.cont);
  1148. var c_recipientsSb = create('div', cssStyles.compose.leftBar.recipients.scrollbar.bar);
  1149. var c_searchResults = create('div', cssStyles.compose.leftBar.recipients.searchBox.cont);
  1150. var c_contacts = create('div', cssStyles.compose.leftBar.contacts.cont);
  1151. var c_subject = create('textField', cssStyles.compose.rightBar.textField);
  1152. var c_msgToolbar = create('div', cssStyles.compose.rightBar.toolbar.cont);
  1153. var c_msgBody = create('iframe', cssStyles.compose.rightBar.textArea);
  1154. var c_expandCont = create('div', cssStyles.compose.rightBar.expand);
  1155.  
  1156. //table options
  1157. var c_tableOptions = create('div', cssStyles.tableCellWrapper);
  1158. var c_rowsCont = create('div', cssStyles.compose.leftBar.tableOptions.inputCont);
  1159. var c_rowsInput = create('textField', cssStyles.compose.leftBar.tableOptions.input);
  1160. var c_rowsLabel = create('div', cssStyles.compose.leftBar.tableOptions.label);
  1161. var c_colsInput = create('textField', cssStyles.compose.leftBar.tableOptions.input);
  1162. var c_colsCont = create('div', cssStyles.compose.leftBar.tableOptions.inputCont);
  1163. var c_colsLabel = create('div', cssStyles.compose.leftBar.tableOptions.label);
  1164. var c_headerCheckbox = create('div', cssStyles.compose.leftBar.tableOptions.checkbox);
  1165. var c_headerLabel = create('span', cssStyles.compose.leftBar.tableOptions.span);
  1166. var c_expandCheckbox = create('div', cssStyles.compose.leftBar.tableOptions.checkbox);
  1167. var c_expandLabel = create('span', cssStyles.compose.leftBar.tableOptions.span);
  1168. var c_addTable = create('div', cssStyles.compose.leftBar.tableOptions.button);
  1169. var c_cancelTable = create('div', cssStyles.compose.leftBar.tableOptions.button);
  1170. text(c_rowsLabel, 'Rows');
  1171. text(c_colsLabel, 'Columns');
  1172. text(c_headerLabel, 'Header');
  1173. text(c_expandLabel, 'Expand horizontally');
  1174. text(c_addTable, 'Add table');
  1175. text(c_cancelTable, 'Cancel');
  1176. c_tableOptions.data = {'isOpen': false};
  1177. c_headerCheckbox.data = {'isChecked': false};
  1178. c_expandCheckbox.data = {'isChecked': false};
  1179. c_tableOptions.style.paddingTop = '10px';
  1180. [c_expandCheckbox, c_headerCheckbox].map(function(checkBox)
  1181. {
  1182. checkBox.onmousedown = function(){this.style.background = '#202020'};
  1183. checkBox.onmouseup = function()
  1184. {
  1185. var isChecked = this.data.isChecked;
  1186. this.style.background = (isChecked) ? 'transparent' : '#9f9f9f';
  1187. this.data.isChecked = !isChecked;
  1188. };
  1189. });
  1190. c_rowsCont.zm_append([c_rowsInput, c_rowsLabel]);
  1191. c_colsCont.zm_append([c_colsInput, c_colsLabel]);
  1192. c_headerCheckbox.appendChild(c_headerLabel);
  1193. c_expandCheckbox.appendChild(c_expandLabel);
  1194. c_tableOptions.zm_append([c_rowsCont, c_colsCont, c_headerCheckbox, c_expandCheckbox, c_addTable, c_cancelTable]);
  1195. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1196.  
  1197. var c_search = create('textField', cssStyles.compose.leftBar.recipients.textField);
  1198. var c_searchCont = create('p', cssStyles.compose.leftBar.recipients.textFieldCont);
  1199. var c_toolBar = create('ul', cssStyles.ul.toolbar.main);
  1200. var c_sendMsg = create('li', cssStyles.li.toolbar.withIcon);
  1201. var c_sendMsgIcon = create('span', cssStyles.li.toolbar.newIcon);
  1202. var c_cancelMsg = create('li', cssStyles.li.toolbar.textOnly);
  1203. var c_saveDraft = create('li', cssStyles.li.toolbar.textOnly);
  1204. text(c_sendMsg, 'Send');
  1205. text(c_cancelMsg, 'Cancel');
  1206. text(c_saveDraft, 'Save draft');
  1207. c_sendMsgIcon.style.backgroundImage = 'url(' + root.res.sendMail + ')';
  1208. c_sendMsg.appendChild(c_sendMsgIcon);
  1209. c_toolBar.zm_append([c_sendMsg, c_cancelMsg, c_saveDraft]);
  1210. c_tbMenu.appendChild(c_toolBar);
  1211. c_topBarCont.zm_append([c_logo, c_tbMenu]);
  1212. c_topBar.appendChild(c_topBarCont);
  1213. c_searchCont.appendChild(c_search);
  1214. c_recipientsMask.appendChild(c_recipientsCont);
  1215. c_recipients.zm_append([c_recipientsMask, c_recipientsSbc]);
  1216. c_recipientsSbc.appendChild(c_recipientsSb);
  1217. this.enableScroll(c_recipientsSb, c_recipientsSbc, c_recipientsCont);
  1218. c_msgBody.scrolling = 'no';
  1219. c_expandCont.style.backgroundImage = 'url(' + this.res.expandDocument + ')';
  1220. c_expandCont.data = {'isExpanded': false};
  1221. c_search.data = {'results': [], 'selectedIndex': 0, 'isContOpen': false, 'isContFocused': false};
  1222. [c_sendMsg, c_cancelMsg, c_saveDraft].map(function(key)
  1223. {
  1224. key.onmouseover = function(){this.style.backgroundImage = blueGrd};
  1225. key.onmouseout = function(){this.style.backgroundImage = 'none'};
  1226. });
  1227. var countMsgLength = function(){ root.getCharactersCount.apply(root, arguments) };
  1228. c_sendMsg.onclick = function()
  1229. {
  1230. root.sendMail.call(root);
  1231. zmail.compose.getInstance()._onClose();
  1232. };
  1233. c_saveDraft.onclick = function()
  1234. {
  1235. root.saveDraft.call(root);
  1236. zmail.compose.getInstance()._onClose();
  1237. };
  1238. c_cancelMsg.onclick = function()
  1239. {
  1240. zmail.compose.getInstance()._onClose();
  1241. };
  1242. c_expandCont.onclick = function()
  1243. {
  1244. var expanded = this.data.isExpanded;
  1245. this.style.backgroundImage = (expanded) ? 'url(' + root.res.expandDocument + ')' : 'url(' + root.res.contractDocument + ')';
  1246. c_leftBar.style.display = (expanded) ? 'table-cell' : 'none';
  1247. this.data.isExpanded = !expanded;
  1248. };
  1249.  
  1250. var c_searchResultsMask = create('div', cssStyles.compose.leftBar.recipients.searchBox.mask);
  1251. var c_searchResultsSbc = create('div', cssStyles.compose.leftBar.recipients.searchBox.scrollbar.cont);
  1252. var c_searchResultsCont = create('div', cssStyles.compose.leftBar.recipients.searchBox.itemsCont);
  1253. var c_msgHeader = create('div', cssStyles.compose.rightBar.msgHeader);
  1254. var c_msgMask = create('div', cssStyles.compose.rightBar.msgMask);
  1255. var c_msgCont = create('div', cssStyles.compose.rightBar.msgCont);
  1256. var c_msgSbc = create('div', cssStyles.compose.rightBar.scrollBar.cont);
  1257. var c_msgSb = create('div', cssStyles.compose.rightBar.scrollBar.bar);
  1258. var c_toText = create('div', cssStyles.compose.leftBar.recipients.toText);
  1259. var c_charCount = create('div', {'position': 'absolute', 'bottom': 0, 'right': '16px', 'padding': '10px', 'color': '#999', 'fontSize': '12px'});
  1260. text(c_toText, 'To:');
  1261. this.placeHolder(c_subject, 'Add Subject:');
  1262. c_recipientsCont.appendChild(c_searchCont);
  1263. c_searchResultsMask.appendChild(c_searchResultsCont);
  1264. c_searchResults.zm_append([c_searchResultsMask, c_searchResultsSbc]);
  1265. c_leftBarWrapper.zm_append([c_toText, c_recipients, c_searchResults, c_contacts]);
  1266. c_leftBar.appendChild(c_leftBarWrapper);
  1267. c_msgCont.appendChild(c_msgBody);
  1268. c_msgHeader.zm_append([c_subject, c_msgToolbar, c_expandCont]);
  1269. c_msgMask.zm_append([c_msgCont, c_msgHeader, c_charCount]);
  1270. c_rightBarWrapper.zm_append([c_msgMask, c_msgSbc]);
  1271. c_rightBar.appendChild(c_rightBarWrapper);
  1272. composeCont.zm_append([c_topBar, c_leftBar, c_rightBar]);
  1273. c_searchResultsCont.onmouseover = function(){c_search.data.isContFocused = true};
  1274. c_searchResultsCont.onmouseout = function(){c_search.data.isContFocused = false};
  1275. c_msgSbc.appendChild(c_msgSb);
  1276. root.enableScroll(c_msgSb, c_msgSbc, c_msgCont);
  1277. c_msgSb.style.display = 'none';
  1278.  
  1279. this.dom.compose.leftBar.results.mainCont = c_searchResults;
  1280. this.dom.compose.leftBar.results.resultsCont = c_searchResultsCont;
  1281. this.dom.compose.leftBar.results.scrollbarCont = c_searchResultsSbc;
  1282. this.dom.compose.leftBar.searchBox = c_search;
  1283. this.dom.compose.leftBar.searchBoxCont = c_searchCont;
  1284. this.dom.compose.leftBar.recipientsMainCont = c_recipients;
  1285. this.dom.compose.leftBar.recipientsCont = c_recipientsCont;
  1286. this.dom.compose.leftBar.recipientsSbc = c_recipientsSbc;
  1287. this.dom.compose.leftBar.recipientsSb = c_recipientsSb;
  1288. this.dom.compose.rightBar.iframe = c_msgBody;
  1289. this.dom.compose.rightBar.msgCont = c_msgCont;
  1290. this.dom.compose.rightBar.subject = c_subject;
  1291. this.dom.compose.rightBar.charCount = c_charCount;
  1292.  
  1293. //find contact
  1294. c_search.onblur = function()
  1295. {
  1296. if (this.data.isContOpen && !this.data.isContFocused)
  1297. {
  1298. var rest = function() { root.clearPlayersSearch.apply(root, arguments); };
  1299. var add = function() { root.addRecipient.apply(root, arguments); };
  1300. if( root.completePlayerMatch ) add(this.value);
  1301. this.value = '';
  1302. rest(0);
  1303. }
  1304. };
  1305. c_search.onkeyup = function(event)
  1306. {
  1307. if(!event) event = window.event;
  1308. event.preventDefault();
  1309. var add = function(){ root.addRecipient.apply(root, arguments); };
  1310. if([38, 40, 13, 9].indexOf(event.keyCode) == -1)
  1311. {
  1312. var populate = function(){ root.findPlayer.apply(root, arguments); };
  1313. populate(this.value);
  1314. }
  1315. if(event.keyCode == 40 && this.data.isContOpen)
  1316. {
  1317. var next = function(){ root.changePlayerSelection.apply(root, arguments); };
  1318. next(true);
  1319. }
  1320. if(event.keyCode == 38 && this.data.isContOpen)
  1321. {
  1322. var previous = function(){ root.changePlayerSelection.apply(root, arguments); };
  1323. previous(false);
  1324. }
  1325. if(event.keyCode == 13 && this.data.isContOpen) add(this.data.results[this.data.selectedIndex].data.name);
  1326. };
  1327. //////////////////////////////////////////////////////////////////////////////
  1328.  
  1329. //IFRAME onload + compose message toolbar
  1330. c_msgBody.onload = function()
  1331. {
  1332. c_msgToolbar.zm_empty();
  1333. var iframe = c_msgBody.contentWindow.document;
  1334. var ibody = iframe.body;
  1335. var updateMessage = function(doc)
  1336. {
  1337. var msg = this.encodeMsg(doc);
  1338. var count = this.getCharactersCount(msg);
  1339. c_charCount.innerHTML = 3000 - parseInt(count, 10);
  1340. };
  1341. var updateScroll = function()
  1342. {
  1343. var h = c_msgBody.contentWindow.document.body.offsetHeight;
  1344. c_msgBody.style.height = Math.max(100, h + 10) + 'px';
  1345. c_msgSb.style.display = (c_msgCont.offsetHeight > c_msgMask.offsetHeight) ? 'block' : 'none';
  1346. c_msgSb.data.update();
  1347. };
  1348. var style = iframe.createElement("style");
  1349. var addCSSRule = function(sheet, selector, rules, index)
  1350. {
  1351. (sheet.insertRule) ? sheet.insertRule(selector + "{" + rules + "}", index) : sheet.addRule(selector, rules, index);
  1352. };
  1353. style.appendChild(iframe.createTextNode(""));
  1354. iframe.getElementsByTagName('head')[0].appendChild(style);
  1355. var sheet = style.sheet;
  1356. addCSSRule(sheet, "body", "display:inline-block; color:#999; font-family:vrinda; font-size:14px; width:100%; margin:0; padding:0; word-break:break-all;", 0);
  1357. addCSSRule(sheet, "ul", "margin:0; color:#999;", 1);
  1358. addCSSRule(sheet, "ol", "margin:0; color:#999;", 2);
  1359. addCSSRule(sheet, "li", "font-family:vrinda; color:#999;", 3);
  1360. addCSSRule(sheet, "a", "font-family: vrinda", 4);
  1361. addCSSRule(sheet, "div", "font-family:vrinda; color:#999;", 5);
  1362. addCSSRule(sheet, "blockquote", "font-family:vrinda; color:#999;", 6);
  1363. addCSSRule(sheet, "table", "border-color: #999; color: #999; font-family: vrinda; font-size: 14px;", 7);
  1364. addCSSRule(sheet, "th", "background-color: #999; color: #333; padding: 3px 15px; font-weight: normal; color: #292929; font-family: vrinda; font-size: 14px;", 8);
  1365. addCSSRule(sheet, "td", "padding: 4px 15px; color: #999; font-family: vrinda; font-size: 14px; word-break: break-all;", 9);
  1366.  
  1367. iframe.designMode = 'on';
  1368. ibody.innerHTML = (root.iframeContent) ? root.iframeContent : 'Add Text';
  1369. c_charCount.innerHTML = 3000 - root.getCharactersCount();
  1370. c_msgBody.contentWindow.onfocus = function()
  1371. {
  1372. if (ibody.innerHTML == 'Add Text') ibody.innerHTML = ''
  1373. if (c_tableOptions.data.isOpen)
  1374. {
  1375. c_leftBar.removeChild(c_tableOptions);
  1376. c_leftBarWrapper.style.display = 'block';
  1377. c_tableOptions.data.isOpen = false;
  1378. }
  1379. };
  1380. c_msgBody.contentWindow.onblur = function(){if(ibody.innerHTML == '' || ibody.innerHTML == '<br>') ibody.innerHTML = 'Add Text'};
  1381. c_msgBody.contentWindow.onkeyup = function()
  1382. {
  1383. var clone = this.document.body.cloneNode(true);
  1384. root.iframeContent = this.document.body.innerHTML;
  1385. updateMessage.call(root, clone);
  1386. updateScroll();
  1387. };
  1388.  
  1389. var getSelectedText = function()
  1390. {
  1391. var sel, range, selectedText;
  1392. if (c_msgBody.contentWindow.getSelection)
  1393. {
  1394. sel = c_msgBody.contentWindow.getSelection();
  1395. if (sel.rangeCount) selectedText = sel.getRangeAt(0).toString();
  1396. }
  1397. else if (iframe.selection && iframe.selection.createRange) selectedText = iframe.selection.createRange().text + "";
  1398. return selectedText;
  1399. };
  1400.  
  1401. var createLink = function(type)
  1402. {
  1403. var generateLink = function(txt)
  1404. {
  1405. var data = zmail.data.getInstance(), bb = data.createBBCode, a;
  1406. switch(type)
  1407. {
  1408. case 'coords': a = (txt.match(/^\d+:\d+$/)) ? bb.coords(txt, txt.split(':')[0], txt.split(':')[1]) : false; break;
  1409. case 'player': a = bb.player(txt); break;
  1410. case 'alliance': a = bb.alliance(txt); break;
  1411. }
  1412. return a;
  1413. };
  1414. var selectedText = getSelectedText();
  1415. var Link = generateLink(selectedText).replace('webfrontend', 'parent.webfrontend');
  1416. if(Link) return Link;
  1417. };
  1418.  
  1419. var resetTableOptions = function()
  1420. {
  1421. c_rowsInput.value = '';
  1422. c_colsInput.value = '';
  1423. c_headerCheckbox.data.isChecked = false;
  1424. c_expandCheckbox.data.isChecked = false;
  1425. c_headerCheckbox.style.background = 'transparent';
  1426. c_expandCheckbox.style.background = 'transparent';
  1427. };
  1428.  
  1429. var addTable = function()
  1430. {
  1431. if (c_expandCont.data.isExpanded) c_expandCont.onclick();
  1432. if (c_tableOptions.data.isOpen) return;
  1433. c_leftBarWrapper.style.display = 'none';
  1434. c_leftBar.appendChild(c_tableOptions);
  1435. resetTableOptions();
  1436. c_addTable.onclick = function()
  1437. {
  1438. var rows = c_rowsInput.value;
  1439. var cols = c_colsInput.value;
  1440. var header = c_headerCheckbox.data.isChecked;
  1441. var stretch = c_expandCheckbox.data.isChecked;
  1442. var table = document.createElement('table');
  1443. var tbody = document.createElement('tbody');
  1444. table.rules = 'all';
  1445. table.border = '1';
  1446. table.className = 'table';
  1447. table.style.minWidth = cols * 40 + 'px';
  1448. table.cellpadding = 0;
  1449. table.cellspacing = 0;
  1450. if(stretch) table.width = '100%';
  1451. for(var r = 0; r < rows; r++)
  1452. {
  1453. var tr = document.createElement('tr');
  1454. for (var c = 0; c < cols; c++)
  1455. {
  1456. var td = (header && r == 0) ? document.createElement('th') : document.createElement('td');
  1457. td.innerText = '\u200B';
  1458. tr.appendChild(td);
  1459. }
  1460. tbody.appendChild(tr);
  1461. }
  1462. table.appendChild(tbody);
  1463. c_msgBody.contentWindow.focus();
  1464. iframe.execCommand('insertHTML', false, table.outerHTML + '<br/>\u200B');
  1465. updateScroll();
  1466. };
  1467. c_cancelTable.onclick = function()
  1468. {
  1469. c_leftBar.removeChild(c_tableOptions);
  1470. c_leftBarWrapper.style.display = 'block';
  1471. c_tableOptions.data.isOpen = false;
  1472. };
  1473. c_tableOptions.data.isOpen = true;
  1474. };
  1475.  
  1476. var insertLink = function()
  1477. {
  1478. var val = getSelectedText();
  1479. if (val == '') return;
  1480. var a = create('a', cssStyles.link._14);
  1481. text(a, val);
  1482. a.href = val;
  1483. a.target = 'blank';
  1484. iframe.execCommand('insertHTML', false, a.outerHTML + '<br/>\u200B');
  1485. };
  1486.  
  1487. for (var key in root.res.tools)
  1488. {
  1489. var div = create('div', cssStyles.compose.rightBar.toolbar.icon);
  1490. div.onmousedown = function(event){ var event = event || window.event; event.preventDefault() };
  1491. var callback;
  1492.  
  1493. switch(key)
  1494. {
  1495. case 'coords': callback = function(){iframe.execCommand('insertHTML', false, createLink('coords') + '\u200B')}; break;
  1496. case 'player': callback = function(){iframe.execCommand('insertHTML', false, createLink('player') + '\u200B')}; break;
  1497. case 'alliance': callback = function(){iframe.execCommand('insertHTML', false, createLink('alliance') + '\u200B')}; break;
  1498. case 'table': callback = addTable; break;
  1499. case 'link': callback = insertLink; break;
  1500. default: callback = function(){iframe.execCommand(this.data.id, false, null)};
  1501. }
  1502. div.data = {'id': key, 'callback': callback};
  1503. div.onclick = function()
  1504. {
  1505. this.data.callback.call(this);
  1506. if (key != 'table') c_msgBody.contentWindow.focus();
  1507. updateMessage.call(root, ibody.cloneNode(true));
  1508. };
  1509. try
  1510. {
  1511. div.style.backgroundImage = root.res.tools[key];
  1512. }
  1513. catch(e)
  1514. {
  1515. console.log(e.toString());
  1516. }
  1517. c_msgToolbar.appendChild(div);
  1518. }
  1519.  
  1520. var updateRecipientsHeight = function()
  1521. {
  1522. c_recipients.style.height = Math.max(28, Math.min(180, c_recipientsCont.offsetHeight)) + 'px';
  1523. console.log(c_recipientsCont.offsetHeight, Math.max(28, Math.min(180, c_recipientsCont.offsetHeight)));
  1524. if (c_recipientsCont.offsetHeight == 0 && root.recipients.length > 0) setTimeout(updateRecipientsHeight, 100);
  1525. else
  1526. {
  1527. c_recipientsSbc.style.visibility = (c_recipientsCont.offsetHeight < 180) ? 'hidden' : 'visible';
  1528. c_recipientsSb.data.update();
  1529. c_recipientsSb.data.scrollToEnd();
  1530. }
  1531. }
  1532. updateRecipientsHeight();
  1533. c_msgSb.data.update();
  1534. }
  1535.  
  1536. this.dom.window.compose = composeCont;
  1537. //////////////////////////////////////////////////////////////////////////
  1538. ///////////////////////////////////////////////////////////////////////////////////
  1539. },
  1540.  
  1541. destruct: function(){},
  1542.  
  1543. members:
  1544. {
  1545. iframeContent: null,
  1546. selectedFolder: 'inbox',
  1547. selectedGroup: false,
  1548. selectedMsgs: {'ids': [], 'headers': [], 'checkBoxes': []},
  1549. selectedHeader: null,
  1550. selectedContacts: [],
  1551. selectedPage: 0,
  1552. selectedDraft: null,
  1553. callUpdate: null,
  1554. isLoaded: false,
  1555. generatedHeaders: {},
  1556. generatedSections: [],
  1557. recipients: [],
  1558. completePlayerMatch: false,
  1559. folders: {
  1560. 'inbox': {'ids': [], 'msgs': []},
  1561. 'outbox': {'ids': [], 'msgs': []},
  1562. 'junk': {'ids': [], 'msgs': []},
  1563. 'trash': [{'ids': [], 'msgs': []}, {'ids': [], 'msgs': []}],
  1564. 'draft': {},
  1565. 'documents': {'ids': [], 'msgs': []}
  1566. },
  1567.  
  1568. contacts: {
  1569. 'friends': [],
  1570. 'blocked': []
  1571. },
  1572.  
  1573. callMethod: function (fn, args)
  1574. {
  1575. var root = this;
  1576. var callback = function()
  1577. {
  1578. root[fn].call(root, args);
  1579. }
  1580. return callback;
  1581. },
  1582.  
  1583. create: function (type, css)
  1584. {
  1585. var elm;
  1586. switch(type)
  1587. {
  1588. case 'textField': elm = document.createElement('input'); elm.type = 'text'; break;
  1589. case 'checkBox': elm = document.createElement('input'); elm.type = 'checkBox'; break;
  1590. default: elm = document.createElement(type);
  1591. }
  1592.  
  1593. var iterator = function(obj)
  1594. {
  1595. for(var x in obj) elm.style[x] = obj[x];
  1596. };
  1597.  
  1598. var onDown = function(down, over, out)
  1599. {
  1600. elm.addEventListener('mousedown', function(event)
  1601. {
  1602. var el = event.target;
  1603. el.onmouseout = null;
  1604. el.onmouseover = null;
  1605. for (var x in down) el.style[x] = down[x];
  1606. var onUp = function()
  1607. {
  1608. el.onmouseout = function(){for (var x in out) el.style[x] = out[x]};
  1609. el.onmouseover = function(){for (var x in over) el.style[x] = over[x]};
  1610. for (var x in out) el.style[x] = out[x];
  1611. document.removeEventListener('mouseup', onUp, false);
  1612. };
  1613. document.addEventListener('mouseup', onUp, false);
  1614. }, false);
  1615. };
  1616.  
  1617. if (css === null) return elm;
  1618. for (var key in css) {
  1619. var prop = css[key];
  1620. switch(key)
  1621. {
  1622. case 'over': elm.onmouseover = function(){iterator(css['over'])}; break;
  1623. case 'out': elm.onmouseout = function(){iterator(css['out'])}; break;
  1624. case 'focus': elm.onfocus = function(){iterator(css['focus'])}; break;
  1625. case 'blur': elm.onblur = function(){iterator(css['blur'])}; break;
  1626. case 'down': onDown(css['down'], css['up'], css['out']); break;
  1627. case 'up': ; break;
  1628. default: elm.style[key] = css[key];
  1629. }
  1630. }
  1631. return elm;
  1632. },
  1633.  
  1634. gradient: function (stop1, stop2)
  1635. {
  1636. var browser = navigator.userAgent;
  1637. if (browser.indexOf('Chrome') !== -1) browser = 'chrome';
  1638. else if (browser.indexOf('Firefox') !== -1) browser = 'firefox';
  1639. else browser = 'unsupported';
  1640. var grd = '';
  1641. switch (browser) {
  1642. case 'chrome':
  1643. grd = '-webkit-linear-gradient(top, ' + stop1 + ' 0%, ' + stop2 + ' 100%)';
  1644. break;
  1645. case 'firefox':
  1646. grd = '-moz-linear-gradient(top, ' + stop1 + ' 0%, ' + stop2 + ' 100%)';
  1647. break;
  1648. default:
  1649. alert('your Browser is not supported');
  1650. }
  1651. return grd;
  1652. },
  1653.  
  1654. text: function(elm, txt)
  1655. {
  1656. elm.appendChild(document.createTextNode(txt));
  1657. },
  1658.  
  1659. size: function(obj)
  1660. {
  1661. if(typeof obj !== 'object') return null;
  1662. var s = 0;
  1663. for (var key in obj) s++;
  1664. return s;
  1665. },
  1666.  
  1667. placeHolder: function(input, val)
  1668. {
  1669. input.value = val;
  1670. input.addEventListener('focus', function(){if (input.value == val) input.value = ''; console.log(this.value)}, false);
  1671. input.addEventListener('blur', function(){if (input.value == '') input.value = val; console.log(this.value)}, false);
  1672. },
  1673.  
  1674. enableScroll: function(elm, parent, cont)
  1675. {
  1676. var pos, ph = parent.offsetHeight, ch = cont.offsetHeight, elmY, contY;
  1677. var scale = ch / (ph - 20);
  1678. var bh = ph / scale;
  1679. elm.style.height = bh + 'px';
  1680. var update = function()
  1681. {
  1682. elmY = elm.offsetTop;
  1683. contY = cont.offsetTop;
  1684. ph = parent.offsetHeight;
  1685. ch = cont.offsetHeight;
  1686. scale = ch / (ph - 20);
  1687. bh = ph / scale;
  1688. elm.style.height = bh + 'px';
  1689. elm.style.display = (ch <= ph) ? 'none' : 'block';
  1690. };
  1691. var scrollToEnd = function()
  1692. {
  1693. elm.style.top = ph - bh - 10 + 'px';
  1694. cont.style.top = ph - ch + 'px';
  1695. };
  1696. elm.data = {'update': update, 'scrollToEnd': scrollToEnd};
  1697. var onMove = function(event)
  1698. {
  1699. var e = (event) ? event : window.event, dist = e.pageY - pos;
  1700. if(elmY + dist < 10)
  1701. {
  1702. elm.style.top = '10px';
  1703. cont.style.top = 0;
  1704. }
  1705. else if(elmY + dist + bh > ph - 10)
  1706. {
  1707. elm.style.top = ph - bh - 10 + 'px';
  1708. cont.style.top = ph - ch + 'px';
  1709. }
  1710. else
  1711. {
  1712. elm.style.top = elmY + dist + 'px';
  1713. cont.style.top = contY - scale * dist + 'px';
  1714. }
  1715. };
  1716.  
  1717. var onUp = function()
  1718. {
  1719. document.removeEventListener('mousemove', onMove, false);
  1720. document.removeEventListener('mouseup', onUp, false);
  1721. };
  1722.  
  1723. elm.onmousedown = function(event)
  1724. {
  1725. var e = (event) ? event : window.event, y = e.pageY;
  1726. e.preventDefault();
  1727. pos = y;
  1728. update();
  1729. if (elm.offsetHeight != bh) elm.style.height = bh + 'px';
  1730. document.addEventListener('mousemove', onMove, false);
  1731. document.addEventListener('mouseup', onUp, false);
  1732. };
  1733.  
  1734. var onWheel = function(event){
  1735. var e = (event) ? event : window.event;
  1736. e.preventDefault();
  1737. if (ch < ph) return;
  1738. if (ch == 0) update();
  1739. var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail) ));
  1740. var ct = cont.offsetTop, et = elm.offsetTop;
  1741. var dist = delta * -20 / scale;
  1742. if(et + dist < 10)
  1743. {
  1744. elm.style.top = '10px';
  1745. cont.style.top = 0;
  1746. }
  1747. else if(et + dist + bh > ph - 10)
  1748. {
  1749. elm.style.top = ph - bh - 10 + 'px';
  1750. cont.style.top = ph - ch + 'px';
  1751. }
  1752. else
  1753. {
  1754. elm.style.top = et + dist + 'px';
  1755. cont.style.top = ct - scale * dist + 'px';
  1756. }
  1757. };
  1758. if(cont.hasOwnProperty('removeMouseWheelListener')) cont.removeMouseWheelListener();
  1759. cont.onmousewheel = onWheel;
  1760. cont.addEventListener('DOMMouseScroll', onWheel, false);
  1761. cont.removeMouseWheelListener = function(){this.removeEventListener('DOMMouseScroll', onWheel, false);}
  1762. },
  1763.  
  1764. findPlayer: function(txt)
  1765. {
  1766. this.clearPlayersSearch(0);
  1767. var str = txt.replace(/[^a-z A-Z 0-9 \-_]/g, '').toLowerCase();
  1768. if (str == '') return;
  1769. var players = zmail.data.getInstance().players;
  1770. var matches = [], completeMatch = false, count = 0;
  1771. for(var i = 0; i < players.length; i++)
  1772. {
  1773. if ((players[i].pn.toLowerCase().substr(0,str.length) == str) && count < 21)
  1774. {
  1775. matches.push(players[i]);
  1776. count++;
  1777. }
  1778. if (players[i].pn.toLowerCase() == txt.toLowerCase()) completeMatch = true;
  1779. }
  1780. this.completePlayerMatch = completeMatch;
  1781. this.populatePlayersResultsCont(matches);
  1782. },
  1783.  
  1784. changePlayerSelection: function(mode)
  1785. {
  1786. var searchBox = this.dom.compose.leftBar.searchBox;
  1787. var mainCont = this.dom.compose.leftBar.results.mainCont;
  1788. var resultsSbc = this.dom.compose.leftBar.results.scrollbarCont;
  1789. var resultsCont = this.dom.compose.leftBar.results.resultsCont;
  1790. var index = searchBox.data.selectedIndex;
  1791. var results = searchBox.data.results;
  1792. var length = results.length;
  1793. var newIndex = (mode) ? (index + 1) % length : (index - 1 < 0) ? length - 1 : index - 1;
  1794. var currentItem = results[index];
  1795. var newItem = results[newIndex];
  1796. currentItem.style.background = 'transparent';
  1797. currentItem.style.color = '#8e8e8e';
  1798. newItem.style.background = '#266589';
  1799. newItem.style.color = '#bcbcbc';
  1800. if (newIndex > 4 && length > 5)
  1801. {
  1802. resultsCont.style.top = -(newIndex - 4) * 49 + 'px';
  1803. resultsSbc.firstChild.style.top = (((resultsSbc.offsetHeight - 20) / resultsCont.offsetHeight) * (newIndex - 4) * 49) + 10 +'px';
  1804. }
  1805. if (newIndex < 4 && length > 5)
  1806. {
  1807. resultsCont.style.top = 0;
  1808. resultsSbc.firstChild.style.top = '10px';
  1809. }
  1810. searchBox.data.selectedIndex = newIndex;
  1811. },
  1812.  
  1813. addRecipient: function(name)
  1814. {
  1815. var Item = this.create('div', this.css.compose.leftBar.recipients.recipient.cont);
  1816. var remove = this.create('div', this.css.compose.leftBar.recipients.recipient.remove);
  1817. var mainCont = this.dom.compose.leftBar.recipientsMainCont;
  1818. var cont = this.dom.compose.leftBar.recipientsCont;
  1819. var scrollCont = this.dom.compose.leftBar.recipientsSbc;
  1820. var bar = this.dom.compose.leftBar.recipientsSb;
  1821. var updateScroll = function()
  1822. {
  1823. scrollCont.style.visibility = (cont.offsetHeight > 0 && cont.offsetHeight < 180) ? 'hidden' : 'visible';
  1824. mainCont.style.height = Math.max(28, Math.min(180, cont.offsetHeight)) + 'px';
  1825. bar.data.update();
  1826. bar.data.scrollToEnd();
  1827. };
  1828. var root = this;
  1829. this.text(Item, name);
  1830. this.text(remove, 'X');
  1831. remove.data = {'name': name};
  1832. remove.onclick = function()
  1833. {
  1834. root.dom.compose.leftBar.recipientsCont.removeChild(Item);
  1835. var player = this.data.name, index = root.recipients.indexOf(player);
  1836. if(index > -1) root.recipients.splice(index, 1);
  1837. updateScroll();
  1838. };
  1839. Item.appendChild(remove);
  1840. this.dom.compose.leftBar.recipientsCont.insertBefore(Item, this.dom.compose.leftBar.searchBoxCont);
  1841. this.clearPlayersSearch(1);
  1842. if (this.recipients.indexOf(name) == -1) this.recipients.push(name);
  1843. updateScroll();
  1844. },
  1845.  
  1846. clearPlayersSearch: function(type)
  1847. {
  1848. var searchBox = this.dom.compose.leftBar.searchBox;
  1849. var mainCont = this.dom.compose.leftBar.results.mainCont;
  1850. var resultsSbc = this.dom.compose.leftBar.results.scrollbarCont;
  1851. var resultsCont = this.dom.compose.leftBar.results.resultsCont;
  1852. if (type == 1)
  1853. {
  1854. searchBox.value = '';
  1855. searchBox.focus();
  1856. }
  1857. resultsSbc.zm_empty();
  1858. resultsCont.zm_empty();
  1859. resultsCont.style.top = 0;
  1860. mainCont.style.display = 'none';
  1861. searchBox.data.results = [];
  1862. searchBox.data.selectedIndex = 0;
  1863. searchBox.data.isContOpen = false;
  1864. this.completePlayerMatch = false;
  1865. },
  1866.  
  1867. populatePlayersResultsCont: function(arr)
  1868. {
  1869. var root = this;
  1870. var resultsCont = this.dom.compose.leftBar.results.resultsCont;
  1871. var cont = this.dom.compose.leftBar.results.mainCont;
  1872. var recipientsCont = this.dom.compose.leftBar.recipientsMainCont;
  1873. var scrollbarCont = this.dom.compose.leftBar.results.scrollbarCont;
  1874. var searchBox = this.dom.compose.leftBar.searchBox;
  1875. var add = function()
  1876. {
  1877. root.addRecipient.apply(root, arguments);
  1878. };
  1879. var items = [];
  1880. for(var i = 0; i < arr.length; i++)
  1881. {
  1882. var style = (i == 0) ? 'contSelected' : 'cont';
  1883. var Item = this.create('div', this.css.compose.leftBar.recipients.searchBox.item[style]);
  1884. var player = this.create('p', this.css.compose.leftBar.recipients.searchBox.item.text);
  1885. var alliance = this.create('p', this.css.compose.leftBar.recipients.searchBox.item.text);
  1886. this.text(player, arr[i].pn);
  1887. this.text(alliance, arr[i].an);
  1888. Item.zm_append([player, alliance]);
  1889. Item.data = {'name': arr[i].pn};
  1890. Item.onclick = function()
  1891. {
  1892. add(this.data.name);
  1893. };
  1894. resultsCont.appendChild(Item);
  1895. items.push(Item);
  1896. }
  1897. cont.style.display = 'block';
  1898. cont.style.height = Math.min(244, arr.length * 49) + 'px';
  1899. cont.style.top = recipientsCont.offsetTop + recipientsCont.offsetHeight + 3 + 'px';
  1900. if(arr.length > 5)
  1901. {
  1902. var bar = this.create('div', this.css.compose.leftBar.recipients.searchBox.scrollbar.bar);
  1903. scrollbarCont.appendChild(bar);
  1904. this.enableScroll(bar, scrollbarCont, resultsCont);
  1905. }
  1906. searchBox.data.isContOpen = true;
  1907. searchBox.data.results = items;
  1908. },
  1909.  
  1910. update: function(arr1, arr2)
  1911. {
  1912. console.log('updating');
  1913. if(!this.isLoaded)
  1914. {
  1915. var s = this.storage, j = s.get('junk'), t0 = s.get('trash0'), t1 = s.get('trash1'), d = s.get('draft');
  1916. var doc = s.get('documents'), b = s.get('blocked'), f = s.get('friends');
  1917. this.folders.junk.ids = j;
  1918. this.folders.trash[0].ids = t0;
  1919. this.folders.trash[1].ids = t1;
  1920. this.folders.documents.ids = doc;
  1921. this.folders.draft = d;
  1922. this.contacts.friends = f;
  1923. this.contacts.blocked = b;
  1924. this.isLoaded = true;
  1925. }
  1926. if(arr1 && arr2)
  1927. {
  1928. this.filter(arr1, 0);
  1929. this.filter(arr2, 1);
  1930. }
  1931. var f = this.folders, c = this.contacts, root = this;
  1932. var count = function(r)
  1933. {
  1934. var t = f.trash, d = f.draft, g = ['blocked', 'friends'].indexOf(r);
  1935. var len = function(a){return (!a) ? 0 : a.length;};
  1936. if (g == -1) length = (r == 'draft') ? root.size(d) : (r == 'trash') ? len(t[0].msgs) + len(t[1].msgs) : len(f[r].msgs);
  1937. else length = len(c[r]);
  1938. return (length == 0) ? '' : length;
  1939. };
  1940. this.dom.leftBar.folders.inbox.nodeValue = 'Inbox ' + count('inbox');
  1941. this.dom.leftBar.folders.outbox.nodeValue = 'Outbox ' + count('outbox');
  1942. this.dom.leftBar.folders.draft.nodeValue = 'Draft ' + count('draft');
  1943. this.dom.leftBar.folders.junk.nodeValue = 'Junk ' + count('junk');
  1944. this.dom.leftBar.folders.trash.nodeValue = 'Trash ' + count('trash');
  1945. this.dom.leftBar.folders.documents.nodeValue = 'Documents ' + count('documents');
  1946. this.dom.leftBar.contacts.friends.nodeValue = 'Friends ' + count('friends');
  1947. this.dom.leftBar.contacts.blocked.nodeValue = 'Blocked ' + count('blocked');
  1948. if (this.selectedFolder) this.populateHeaders();
  1949. if (this.selectedGroup) this.populateContacts();
  1950. },
  1951.  
  1952. resetMsgCont: function()
  1953. {
  1954. var expandCont = this.dom.rightBar.expandCont;
  1955. if (expandCont.data.isExpanded) expandCont.onclick();
  1956. this.dom.rightBar.msgCont.zm_empty();
  1957. this.dom.rightBar.msgCont.style.top = 0;
  1958. this.selectedMsgBody = [];
  1959. },
  1960.  
  1961. filter: function(arr, type)
  1962. {
  1963. console.log('filtering messages');
  1964. var i = {'ids': [], 'msgs': []}, t = {'ids': [], 'msgs': []}, j = {'ids': [], 'msgs': []}, d = {'ids': [], 'msgs': []};
  1965. var trash = this.folders.trash[type].ids, junk = this.folders.junk.ids, draft = this.folders.draft;
  1966. var documents = this.folders.documents.ids;
  1967. for (var n = 0; n < arr.length; n++)
  1968. {
  1969. var id = arr[n].i, msg = arr[n];
  1970. if (trash && (trash.indexOf(id) > -1)) { t.ids.push(id); t.msgs.push(msg); }
  1971. else if ((type == 0) && junk && (junk.indexOf(id) > -1)) { j.ids.push(id); j.msgs.push(msg); }
  1972. else if ((type == 0) && documents && (documents.indexOf(id) > -1)) { d.ids.push(id); d.msgs.push(msg); }
  1973. else { i.ids.push(id); i.msgs.push(msg); }
  1974. }
  1975. if (type == 0)
  1976. {
  1977. this.folders.inbox = i;
  1978. this.folders.trash[0] = t;
  1979. this.folders.junk = j;
  1980. this.folders.documents = d;
  1981. }
  1982. if (type == 1)
  1983. {
  1984. this.folders.outbox = i;
  1985. this.folders.trash[1] = t;
  1986. }
  1987. },
  1988.  
  1989. resetComposeContainer: function()
  1990. {
  1991. var recipientsMainCont = this.dom.compose.leftBar.recipientsMainCont;
  1992. var recipientsCont = this.dom.compose.leftBar.recipientsCont;
  1993. var subjectInput = this.dom.compose.rightBar.subject;
  1994. var msgCont = this.dom.compose.rightBar.msgCont;
  1995. this.iframeContent = "";
  1996. this.recipients = [];
  1997. while (recipientsCont.children.length > 1) recipientsCont.removeChild(recipientsCont.firstChild);
  1998. while (msgCont.children.length > 1) msgCont.removeChild(msgCont.lastChild);
  1999. },
  2000.  
  2001. addSections: function()
  2002. {
  2003. var iframe = this.dom.compose.rightBar.iframe;
  2004. if(this.generatedSections != null && this.generatedSections.length > 0)
  2005. {
  2006. var msgCont = this.dom.compose.rightBar.msgCont;
  2007. for (var i = 0; i < this.generatedSections.length; i++) msgCont.appendChild(this.generatedSections[i][0]);
  2008. iframe.style.borderBottom = '2px solid #3f3e3e';
  2009. }
  2010. else iframe.style.borderBottom = 'none';
  2011. },
  2012.  
  2013. openNewMail: function(type)
  2014. {
  2015. this.resetComposeContainer();
  2016. this.generatedSections = [];
  2017. if (type == 1)
  2018. {
  2019. var contacts = this.selectedContacts;
  2020. var playerSearchBox = this.dom.rightBar.contacts.search;
  2021. for (var i = 0; i < contacts.length; i++) this.addRecipient(this.getPlayerNameById(contacts[i]));
  2022. this.selectedContacts = [];
  2023. this.addSelectedContacts();
  2024. this.populateContacts();
  2025. playerSearchBox.onblur();
  2026. }
  2027. zmail.compose.getInstance().open();
  2028. },
  2029.  
  2030. replyToAll: function()
  2031. {
  2032. var msgCont = this.dom.compose.rightBar.msgCont;
  2033. var msg = this.selectedHeader.data.msg;
  2034. this.resetComposeContainer();
  2035. this.addSections();
  2036. this.addRecipient(msg.f);
  2037. for (var i = 0; i < msg.t.length; i++) this.addRecipient(msg.t[i]);
  2038. this.dom.compose.rightBar.subject.value = 'Re: ' + msg.s;
  2039. zmail.compose.getInstance().open();
  2040. },
  2041.  
  2042. reply: function()
  2043. {
  2044. var msgCont = this.dom.compose.rightBar.msgCont;
  2045. var msg = this.selectedHeader.data.msg;
  2046. this.resetComposeContainer();
  2047. this.addSections();
  2048. this.dom.compose.rightBar.subject.value = 'Re: ' + msg.s;
  2049. this.addRecipient(msg.f);
  2050. zmail.compose.getInstance().open();
  2051. },
  2052.  
  2053. forwardMsg: function()
  2054. {
  2055. var msgCont = this.dom.compose.rightBar.msgCont;
  2056. var msg = this.selectedHeader.data.msg;
  2057. this.resetComposeContainer();
  2058. this.addSections();
  2059. this.dom.compose.rightBar.subject.value = 'Fwd: ' + msg.s;
  2060. zmail.compose.getInstance().open();
  2061. },
  2062.  
  2063. sendMail: function()
  2064. {
  2065. var to = this.recipients.join('; ');
  2066. var subject = this.dom.compose.rightBar.subject.value;
  2067. if ((subject == '') || (subject == 'Add Subject:')) subject = 'No subject';
  2068. var date = new Date();
  2069. var from = zmail.data.getInstance().ownerName;
  2070. var clone = this.dom.compose.rightBar.iframe.contentWindow.document.body.cloneNode(true);
  2071. var message = this.encodeMsg(clone);
  2072. date = date.getTime();
  2073. message = '<cnc><cncs>' + from + '</cncs><cncd>' + date + '</cncd><cnct>' + message + '</cnct></cnc>';
  2074. for (var i = 0; i < this.generatedSections.length; i++)
  2075. {
  2076. if(this.generatedSections[i][2] == 1) message += this.generatedSections[i][1];
  2077. }
  2078. zmail.data.getInstance().sendMail(to, "", subject, message)
  2079. console.log(from, to, subject, message);
  2080. },
  2081.  
  2082. saveDraft: function()
  2083. {
  2084. var subject = this.dom.compose.rightBar.subject.value;
  2085. var date = new Date();
  2086. var from = zmail.data.getInstance().ownerName;
  2087. var fromId = zmail.data.getInstance().ownerId;
  2088. var clone = this.dom.compose.rightBar.iframe.contentWindow.document.body.cloneNode(true);
  2089. var message = this.encodeMsg(clone);
  2090. if ((subject == '') || (subject == 'Add Subject:')) subject = 'No subject';
  2091. date = date.getTime();
  2092.  
  2093. message = '<cnc><cncs>' + from + '</cncs><cncd>' + date + '</cncd><cnct>' + message + '</cnct></cnc>';
  2094. for (var i = 0; i < this.generatedSections.length; i++)
  2095. {
  2096. if(this.generatedSections[i][2] == 1) message += this.generatedSections[i][1];
  2097. }
  2098. var id = (this.selectedDraft) ? parseInt(this.selectedDraft) : date;
  2099. var msg = {'b':message,'r':true,'f':from,'fi':fromId,'t':this.recipients,'s':subject,'d':date,'i':id,'rm':clone.innerHTML};
  2100. if (this.folders.draft == null) this.folders.draft = {};
  2101. this.folders.draft[id] = msg;
  2102. this.selectedDraft = null;
  2103. this.update();
  2104. this.storage.save.call(this);
  2105. },
  2106.  
  2107. editDraft: function()
  2108. {
  2109. if(this.selectedFolder == 'draft')
  2110. {
  2111. this.resetComposeContainer();
  2112. var id = this.selectedHeader.data.msg.i;
  2113. var draft = this.folders.draft[id];
  2114. this.recipients = draft.t;
  2115. this.dom.compose.rightBar.subject.value = draft.s;
  2116. this.iframeContent = draft.rm;
  2117. if(this.generatedSections && this.generatedSections.length > 1)
  2118. {
  2119. this.generatedSections.splice(0,1);
  2120. this.addSections();
  2121. }
  2122. this.selectedDraft = id;
  2123. for (var i = 0; i < draft.t.length; i++) this.addRecipient(draft.t[i]);
  2124. zmail.compose.getInstance().open();
  2125. }
  2126. },
  2127.  
  2128. deleteDraft: function()
  2129. {
  2130. if (this.selectedFolder == 'draft')
  2131. {
  2132. var ids = this.getSelectedMsgsIds();
  2133. for (var i = 0; i < ids.length; i++)
  2134. {
  2135. if (this.folders.draft.hasOwnProperty(ids[i])) delete this.folders.draft[ids[i]];
  2136. }
  2137. this.selectAll(false);
  2138. this.update();
  2139. this.storage.save.call(this);
  2140. }
  2141. },
  2142.  
  2143. encodeMsg: function(cont)
  2144. {
  2145. try
  2146. {
  2147. var getMargin = function(a)
  2148. {
  2149. var m = 0, elm = a;
  2150. while (elm.parentElement)
  2151. {
  2152. if (elm.nodeType == 1) m += parseInt(elm.style.marginLeft) || 0;
  2153. elm = elm.parentElement;
  2154. }
  2155. return m;
  2156. };
  2157.  
  2158. var getLinkType = function(a)
  2159. {
  2160. var type;
  2161. if (a.match('webfrontend.gui.util.BBCode.openPlayerProfile')) type = 'player';
  2162. if (a.match('webfrontend.gui.util.BBCode.openAllianceProfile')) type = 'alliance';
  2163. if (a.match('webfrontend.gui.UtilView.centerCoordinatesOnRegionViewWindow')) type = 'coords';
  2164. return type;
  2165. };
  2166.  
  2167. var getAttr = function(a)
  2168. {
  2169. var b = '';
  2170. switch(a.nodeName.toLowerCase())
  2171. {
  2172. case 'div': if (a.style.textAlign !== '') b = a.style.textAlign.charAt(0); break;
  2173. case 'a':
  2174. if (a.attributes.hasOwnProperty('href')) b = 'url';
  2175. if (a['onclick']) b = getLinkType(a.onclick.toString());
  2176. break;
  2177. default: b = '';
  2178. }
  2179. return b;
  2180. };
  2181.  
  2182. var parseHTML = function(a)
  2183. {
  2184. var result = '', o = [];
  2185. for(var i = 0; i < a.childNodes.length; i++)
  2186. {
  2187. var elm = a.childNodes[i], nodeName = elm.nodeName.toLowerCase(), nodeType = elm.nodeType, nodeValue = elm.nodeValue;
  2188. var attr = (nodeType == 1 && getAttr(elm) !== '') ? getAttr(elm) + ']' : ']';
  2189. var nodeText = (elm.innerText) ? elm.innerText : elm.textContent;
  2190. if (nodeType == 1 && elm.children.length == 0)
  2191. {
  2192. if (nodeName == 'div' && attr == ']') result += '\n' + nodeText + '\n';
  2193. else if (nodeName == 'font') result += nodeText;
  2194. else if (nodeName == 'div' && attr != ']') result += '[d' + attr + nodeText + '[/d' + attr;
  2195. else if (nodeName == 'blockquote') result += '[bq' + attr + nodeText + '[/bq' + attr;
  2196. else if (nodeName == 'br') result += '\n';
  2197. else if (nodeName == 'a') result += '[' + attr + nodeText + '[/' + attr;
  2198. else result += '[' + nodeName + attr + nodeText + '[/' + nodeName + ']';
  2199. }
  2200. else if (nodeType == 1 && elm.children.length > 0)
  2201. {
  2202. o.push(elm);
  2203. if (nodeName == 'div' && attr == ']') result += '';
  2204. else if (nodeName == 'div' && attr != ']') result += '[d' + attr;
  2205. else if (nodeName == 'blockquote') result += '[bq' + attr;
  2206. else if (nodeName == 'a') result += '[' + attr;
  2207. else if (nodeName == 'font') result += '';
  2208. else if (nodeName == 'span') result += '';
  2209. else result += '[' + nodeName + ']';
  2210. result += parseHTML(o[o.length - 1]);
  2211. if (nodeName == 'div' && attr == ']') result += '';
  2212. else if (nodeName == 'div' && attr != ']') result += '[/d' + attr;
  2213. else if (nodeName == 'blockquote') result += '[/bq' + attr;
  2214. else if (nodeName == 'a') result += '[/' + attr;
  2215. else if (nodeName == 'font') result += '';
  2216. else if (nodeName == 'span') result += '';
  2217. else result += '[/' + nodeName + ']';
  2218. }
  2219. else if (nodeType == 3 && nodeValue && nodeValue.trim() !== '') result += nodeValue;
  2220. }
  2221. return result;
  2222. };
  2223. var encoded = parseHTML(cont);
  2224. return encoded;
  2225. }
  2226. catch(e)
  2227. {
  2228. console.log(e.toString());
  2229. return 'ERROR';
  2230. }
  2231. },
  2232.  
  2233. getCharactersCount: function(msg)
  2234. {
  2235. var count = 0;
  2236. if (this.generatedSections && this.generatedSections.length)
  2237. {
  2238. for (var i = 0; i < this.generatedSections.length; i++)
  2239. {
  2240. var cnct = this.generatedSections[i][1].replace(/.*?<cnct>([^<\/cnct>]*)<\/cnct>.*/, '$1');
  2241. if (cnct && this.generatedSections[i][2] == 1) count += cnct.length;
  2242. }
  2243. }
  2244. if (msg) count += msg.length;
  2245. return count;
  2246. },
  2247.  
  2248. markRead: function(flag)
  2249. {
  2250. var ids = this.selectedMsgs.ids, headers = this.selectedMsgs.headers, style = (flag) ? 'cont' : 'contUnRead';
  2251. for(var i = 0; i < headers.length; i++)
  2252. {
  2253. var isRead = headers[i].data.isRead;
  2254. var id = headers[i].data.msg.i;
  2255. var index = this.getMsgIndex(id, this.folders.inbox.msgs);
  2256. headers[i].data.isRead = flag;
  2257. headers[i].zm_css(this.css.header[style]);
  2258. if (index > -1) this.folders.inbox.msgs[index].r = flag;
  2259. else console.log('Inbox doesn\'t contain id(' + id + ')');
  2260. }
  2261. this.selectAll(false);
  2262. zmail.data.getInstance().markRead(ids, flag);
  2263. },
  2264.  
  2265. selectAll: function(n)
  2266. {
  2267. var selectAllCheckBox = this.dom.middleBar.footer.selectAll;
  2268. var ids = [], headers = [], boxes = [];
  2269. for(var key in this.generatedHeaders)
  2270. {
  2271. var checkBox = this.generatedHeaders[key].checkBox;
  2272. var header = this.generatedHeaders[key].cont;
  2273. header.style.background = (n) ? '#363636' : (header.data.isRead) ? 'transparent' : '#292929';
  2274. header.data.isSelected = n;
  2275. checkBox.data.isChecked = n;
  2276. checkBox.style.background = (n) ? '#9f9f9f' : 'transparent';
  2277. ids.push(parseInt(key));
  2278. headers.push(header);
  2279. boxes.push(checkBox);
  2280. }
  2281. this.selectedMsgs.ids = (n) ? ids : [];
  2282. this.selectedMsgs.headers = (n) ? headers : [];
  2283. this.selectedMsgs.checkBoxes = (n) ? boxes : [];
  2284. selectAllCheckBox.data.isChecked = n;
  2285. selectAllCheckBox.style.background = (n) ? '#9f9f9f' : 'transparent';
  2286. this.selectedHeader = null;
  2287. this.resetMsgCont();
  2288. this.setToolbar();
  2289. console.log(this.selectedMsgs);
  2290. },
  2291.  
  2292. getSelectedMsgsIds: function()
  2293. {
  2294. var smIds = this.selectedMsgs.ids, sh = this.selectedHeader;
  2295. var ids = (smIds != null && smIds.length > 0) ? smIds : (sh != null) ? [sh.data.msg.i] : null;
  2296. return ids;
  2297. },
  2298.  
  2299. getMsgIndex: function(id, msgs)
  2300. {
  2301. var index = -1;
  2302. for(var i = 0; i < msgs.length; i++)
  2303. {
  2304. if (msgs[i].i == id)
  2305. {
  2306. index = i;
  2307. break;
  2308. }
  2309. }
  2310. return index;
  2311. },
  2312.  
  2313. removeMsgFromFolder: function(id, folder)
  2314. {
  2315. var idIndex = this.folders[folder].ids.indexOf(id);
  2316. if (idIndex > -1)
  2317. {
  2318. if (this.folders[folder].msgs[idIndex].i == id)
  2319. {
  2320. var msg = this.folders[folder].msgs[idIndex];
  2321. this.folders[folder].ids.splice(idIndex, 1);
  2322. this.folders[folder].msgs.splice(idIndex, 1);
  2323. return msg;
  2324. }
  2325. else
  2326. {
  2327. var msgIndex = this.getMsgIndex(id, this.folders[folder].msgs);
  2328. var msgId = this.folders[folder].msgs[msgIndex].i;
  2329. if ((msgIndex > -1) && (msgId == id))
  2330. {
  2331. var msg = this.folders[folder].msgs[msgIndex];
  2332. this.folders[folder].ids.splice(idIndex, 1);
  2333. this.folders[folder].msgs.splice(msgIndex, 1);
  2334. return msg;
  2335. }
  2336. else
  2337. {
  2338. if (msgIndex == -1) console.log('Message with id: ' + id + ' could not be found in ' + folder + '!');
  2339. else if (msgId !== id) console.log('id mismatch (' + id + ' - ' + msgId + ')');
  2340. else console.log('something went terribly wrong');
  2341. return false;
  2342. }
  2343. }
  2344. }
  2345. else console.log('id: ' + id + 'does not exist in folder ' + folder);
  2346. },
  2347.  
  2348.  
  2349. toJunk: function()
  2350. {
  2351. var arr = this.getSelectedMsgsIds();
  2352. if (arr !== null)
  2353. {
  2354. for (var i = 0; i < arr.length; i++)
  2355. {
  2356. var id = arr[i], msg = this.removeMsgFromFolder(id, 'inbox');
  2357. if (msg && this.folders.junk.ids.indexOf(id) == -1)
  2358. {
  2359. this.folders.junk.ids.push(id);
  2360. this.folders.junk.msgs.push(msg);
  2361. }
  2362. if (this.folders.junk.ids.indexOf(id) > -1) console.log('Message with id: ' + id + 'already exists in Junk!');
  2363. }
  2364. this.selectAll(false);
  2365. this.update();
  2366. this.storage.save.call(this);
  2367. }
  2368. else console.log('No messages selected!');
  2369. },
  2370.  
  2371. toDocuments: function()
  2372. {
  2373. var arr = this.getSelectedMsgsIds();
  2374. if (arr !== null)
  2375. {
  2376. for (var i = 0; i < arr.length; i++)
  2377. {
  2378. var id = arr[i], msg = this.removeMsgFromFolder(id, 'inbox'), index = this.folders.documents.ids.indexOf(id);
  2379. if (msg && (index == -1))
  2380. {
  2381. this.folders.documents.ids.push(id);
  2382. this.folders.documents.msgs.push(msg);
  2383. }
  2384. if (index > -1) console.log('Message (' + id + ') already exists in Documents!');
  2385. }
  2386. this.selectAll(false);
  2387. this.update();
  2388. this.storage.save.call(this);
  2389. }
  2390. else console.log('No messages selected!');
  2391. },
  2392.  
  2393. toTrash: function()
  2394. {
  2395. var arr = this.getSelectedMsgsIds();
  2396. var folder = this.selectedFolder;
  2397. var type = (folder == 'outbox') ? 1 : 0;
  2398. if (arr !== null)
  2399. {
  2400. for (var i = 0; i < arr.length; i++)
  2401. {
  2402. var id = arr[i], msg = this.removeMsgFromFolder(id, folder), index = this.folders.trash[type].ids.indexOf(id);
  2403. if (msg && (index == -1))
  2404. {
  2405. this.folders.trash[type].ids.push(id);
  2406. this.folders.trash[type].msgs.push(msg);
  2407. }
  2408. if (index > -1) console.log('Message (' + id + ') already exists in trash[' + type + ']!');
  2409. }
  2410. this.selectAll(false);
  2411. this.update();
  2412. this.storage.save.call(this);
  2413. }
  2414. else console.log('No messages selected!');
  2415. },
  2416.  
  2417. emptyFolder: function()
  2418. {
  2419. var data = zmail.data.getInstance();
  2420. if(this.selectedFolder == 'junk')
  2421. {
  2422. if (this.folders.junk.ids != null && this.folders.junk.ids.length > 0)
  2423. {
  2424. data.deleteMsgs(this.folders.junk.ids, 1);
  2425. this.folders.junk.ids = [];
  2426. this.folders.junk.msgs = [];
  2427. }
  2428. }
  2429. if(this.selectedFolder == 'trash')
  2430. {
  2431. if (this.folders.trash[0].ids != null && this.folders.trash[0].ids.length > 0)
  2432. {
  2433. data.deleteMsgs(this.folders.trash[0].ids, 1);
  2434. this.folders.trash[0].ids = [];
  2435. this.folders.trash[0].msgs = [];
  2436. }
  2437. if (this.folders.trash[1].ids != null && this.folders.trash[1].ids.length > 0)
  2438. {
  2439. data.deleteMsgs(this.folders.trash[1].ids, 0);
  2440. this.folders.trash[1].ids = [];
  2441. this.folders.trash[1].msgs = [];
  2442. }
  2443. }
  2444. this.update();
  2445. this.storage.save.call(this);
  2446. },
  2447.  
  2448. notJunk: function()
  2449. {
  2450. var arr = this.getSelectedMsgsIds();
  2451. if(this.selectedFolder == 'junk' && arr !== null)
  2452. {
  2453. for (var i = 0; i < arr.length; i++)
  2454. {
  2455. var id = arr[i], msg = this.removeMsgFromFolder(id, 'junk'), index = this.folders.inbox.ids.indexOf(id);
  2456. if (msg && (index == -1))
  2457. {
  2458. this.folders.inbox.ids.push(id);
  2459. this.folders.inbox.msgs.push(msg);
  2460. }
  2461. if (index > -1) console.log('Message (' + id + ')already exists in inbox!');
  2462. }
  2463. this.selectAll(false);
  2464. this.update();
  2465. this.storage.save.call(this);
  2466. }
  2467. else console.log('No messages selected!');
  2468. },
  2469.  
  2470. notTrash: function()
  2471. {
  2472. var arr = this.getSelectedMsgsIds();
  2473. if ((this.selectedFolder == 'trash') && (arr !== null))
  2474. {
  2475. for (var i = 0; i < arr.length; i++)
  2476. {
  2477. var id = arr[i];
  2478. if (this.folders.trash[0].ids.indexOf(id) > -1)
  2479. {
  2480. var idIndex = this.folders.trash[0].ids.indexOf(id);
  2481. var msgIndex = this.getMsgIndex(id, this.folders.trash[0].msgs);
  2482. if (msgIndex > -1)
  2483. {
  2484. var msg = this.folders.trash[0].msgs[msgIndex];
  2485. this.folders.trash[0].ids.splice(idIndex, 1);
  2486. this.folders.trash[0].msgs.splice(msgIndex, 1);
  2487. if (this.folders.inbox.ids.indexOf(id) == -1)
  2488. {
  2489. this.folders.inbox.ids.push(id);
  2490. this.folders.inbox.msgs.push(msg);
  2491. }
  2492. else console.log('id(' + id + ') already exists in Inbox!');
  2493. }
  2494. else console.log('trash[inbox] doesn\'t contain message with id(' + id + ')');
  2495. }
  2496. else if (this.folders.trash[1].ids.indexOf(id) > -1)
  2497. {
  2498. var idIndex = this.folders.trash[1].ids.indexOf(id);
  2499. var msgIndex = this.getMsgIndex(id, this.folders.trash[1].msgs);
  2500. if (msgIndex > -1)
  2501. {
  2502. var msg = this.folders.trash[1].msgs[msgIndex];
  2503. this.folders.trash[1].ids.splice(idIndex, 1);
  2504. this.folders.trash[1].msgs.splice(msgIndex, 1);
  2505. if (this.folders.outbox.ids.indexOf(id) == -1)
  2506. {
  2507. this.folders.outbox.ids.push(id);
  2508. this.folders.outbox.msgs.push(msg);
  2509. }
  2510. else console.log('id(' + id + ') already exists in Inbox!');
  2511. }
  2512. else console.log('trash[inbox] doesn\'t contain message with id(' + id + ')');
  2513. }
  2514. else console.log('trash folder doesn\'t contain id(' + id + ')');
  2515. }
  2516. this.selectAll(false);
  2517. this.update();
  2518. this.storage.save.call(this);
  2519. }
  2520. },
  2521.  
  2522. deleteMsg: function()
  2523. {
  2524. var arr = this.getSelectedMsgsIds();
  2525. if (this.selectedFolder == 'trash' && arr !== null)
  2526. {
  2527. var data = zmail.data.getInstance();
  2528. var inbox = [], outbox = [];
  2529. for (var i = 0; i < arr.length; i++)
  2530. {
  2531. var id = arr[i];
  2532. if (this.folders.trash[0].ids.indexOf(id) > -1)
  2533. {
  2534. var idIndex = this.folders.trash[0].ids.indexOf(id);
  2535. var msgIndex = this.getMsgIndex(id, this.folders.trash[0].msgs);
  2536. if(msgIndex > -1)
  2537. {
  2538. inbox.push(id);
  2539. this.folders.trash[0].ids.splice(idIndex, 1);
  2540. this.folders.trash[0].msgs.splice(msgIndex, 1);
  2541. }
  2542. else console.log('trash[inbox] doesn\'t contain a message with id(' + id + ')');
  2543. }
  2544. else if (this.folders.trash[1].ids.indexOf(id) > -1)
  2545. {
  2546. var idIndex = this.folders.trash[1].ids.indexOf(id);
  2547. var msgIndex = this.getMsgIndex(id, this.folders.trash[1].msgs);
  2548. if(msgIndex > -1)
  2549. {
  2550. outbox.push(id);
  2551. this.folders.trash[1].ids.splice(idIndex, 1);
  2552. this.folders.trash[1].msgs.splice(msgIndex, 1);
  2553. }
  2554. else console.log('trash[outbox] doesn\'t contain a message with id(' + id + ')');
  2555. }
  2556. else console.log('trash folder doesn\'t contain id(' + id + ')');
  2557. }
  2558. this.selectAll(false);
  2559. this.update();
  2560. this.storage.save.call(this);
  2561. if (inbox.length > 0) data.deleteMsgs(inbox, 1);
  2562. if (outbox.length > 0) data.deleteMsgs(outbox, 0);
  2563. }
  2564. },
  2565.  
  2566. searchFolder: function(str)
  2567. {
  2568. var msgs = this.folders[this.selectedFolder].msgs;
  2569. var m1 = [], m2 = [], sd = [], sb = [], root = this;
  2570. var cont = this.dom.searchResults.cont;
  2571. var fromUl = this.dom.searchResults.sender.list;
  2572. var subjectUl = this.dom.searchResults.subject.list;
  2573. var fromCount = this.dom.searchResults.sender.count;
  2574. var subjectCount = this.dom.searchResults.subject.count;
  2575. fromUl.zm_empty();
  2576. subjectUl.zm_empty();
  2577. cont.style.display = (str == '') ? 'none' : 'block';
  2578. for (var i = 0; i < msgs.length; i++)
  2579. {
  2580. var sender = msgs[i].f, subject = msgs[i].s.toLowerCase(), id = msgs[i].i, str = str.toLowerCase();
  2581. if ((sender.toLowerCase().match(str) !== null) && (sd.indexOf(sender) == -1))
  2582. {
  2583. m1.push([sender, id]);
  2584. sd.push(sender);
  2585. }
  2586. if ((subject.match(str) !== null) && (sb.indexOf(subject) == -1))
  2587. {
  2588. m2.push([subject, id]);
  2589. sb.push(subject);
  2590. }
  2591. }
  2592. (fromCount.innerText) ? fromCount.innerText = m1.length : fromCount.textContent = m1.length;
  2593. (subjectCount.innerText) ? subjectCount.innerText = m2.length : subjectCount.textContent = m2.length;
  2594. var printMsg = function()
  2595. {
  2596. root.printMsg.apply(root, arguments);
  2597. };
  2598. for (var a = 0; a < Math.min(5, m1.length); a++)
  2599. {
  2600. var li1 = this.create('li', this.css.searchResults.li.sub);
  2601. var t1 = m1[a][0];
  2602. this.text(li1, (t1.length > 15) ? t1.substr(0, 15) + '...' : t1);
  2603. fromUl.appendChild(li1);
  2604. li1.data = {'sender': m1[a][0], 'folder': this.selectedFolder};
  2605. li1.onclick = function()
  2606. {
  2607. var f = this.data.folder, um = [], ui = [];
  2608. var msgs = root.folders[f].msgs;
  2609. if (!msgs) return;
  2610. for (var m = 0; m < msgs.length; m++) if (msgs[m].f == this.data.sender) { um.push(msgs[m]); ui.push(msgs[m].i) };
  2611. root.selectedFolder = 'results';
  2612. root.folders.results = {'ids': ui, 'msgs': um};
  2613. root.populateHeaders();
  2614. root.selectedFolder = this.data.folder;
  2615. cont.style.display = 'none';
  2616. }
  2617. }
  2618. for (var b = 0; b < Math.min(5, m2.length); b++)
  2619. {
  2620. var li2 = this.create('li', this.css.searchResults.li.sub);
  2621. var t2 = m2[b][0];
  2622. this.text(li2, (t2.length > 15) ? t2.substr(0, 15) + '...' : t2);
  2623. subjectUl.appendChild(li2);
  2624. li2.data = {'id': m2[b][1], 'folder': this.selectedFolder};
  2625. li2.onclick = function()
  2626. {
  2627. var id = this.data.id, f = this.data.folder;
  2628. var index = root.folders[f].ids.indexOf(id);
  2629. var msg = root.folders[f].msgs[index];
  2630. printMsg(msg);
  2631. cont.style.display = 'none';
  2632. }
  2633. };
  2634. },
  2635.  
  2636. storage:
  2637. {
  2638. 'save': function()
  2639. {
  2640. console.log('saving');
  2641. var json = JSON.parse(localStorage.ccta_zmail), folders = {}, contacts = {};
  2642. folders.draft = this.folders.draft;
  2643. folders.junk = this.folders.junk.ids;
  2644. folders.trash = [this.folders.trash[0].ids, this.folders.trash[1].ids];
  2645. folders.documents = this.folders.documents.ids;
  2646. contacts.friends = this.contacts.friends;
  2647. contacts.blocked = this.contacts.blocked;
  2648. console.log(folders, contacts);
  2649. localStorage.ccta_zmail = JSON.stringify({'folders': folders, 'contacts': contacts, 'archive': json.archive});
  2650. },
  2651.  
  2652. 'get': function(folder)
  2653. {
  2654. var json = JSON.parse(localStorage.ccta_zmail), folders = json.folders, contacts = json.contacts;
  2655. var x = null;
  2656. var size = function(obj)
  2657. {
  2658. if (typeof obj !== 'object') return null;
  2659. var s = 0;
  2660. for (var key in obj) s++;
  2661. return s;
  2662. };
  2663.  
  2664. switch(folder)
  2665. {
  2666. case 'draft': if (folders.draft !== null) x = folders.draft; break;
  2667. case 'trash0': if (folders.trash !== null) x = folders.trash[0]; break;
  2668. case 'trash1': if (folders.trash !== null) x = folders.trash[1]; break;
  2669. case 'junk': if (folders.junk !== null) x = folders.junk; break;
  2670. case 'draft': if (folders.draft !== null) x = folders.draft; break;
  2671. case 'documents': if (folders.documents !== null) x = folders.documents; break;
  2672. case 'friends': if (contacts.friends !== null) x = contacts.friends; break;
  2673. case 'blocked': if( contacts.blocked !== null) x = contacts.blocked; break;
  2674. }
  2675. x = (x) ? x : (folder == 'draft') ? {} : [];
  2676. console.log(x, folder);
  2677. return x;
  2678. }
  2679. },
  2680.  
  2681. setToolbar: function()
  2682. {
  2683. var folder = this.selectedFolder, selection = this.selectedMsgs, header = this.selectedHeader;
  2684. var type = (selection.ids == null || selection.ids.length == 0) ? (header == null) ? 'default' : 'single' : 'group';
  2685. var toolbarCont = this.dom.topBar.menu;
  2686. var newMsg = this.dom.topBar.toolbar.newMsg;
  2687. var trash = this.dom.topBar.toolbar.trash;
  2688. var delMsg = this.dom.topBar.toolbar.delMsg;
  2689. var junk = this.dom.topBar.toolbar.junk;
  2690. var notJunk = this.dom.topBar.toolbar.notJunk;
  2691. var restore = this.dom.topBar.toolbar.restore;
  2692. var mark = this.dom.topBar.toolbar.mark;
  2693. var reply = this.dom.topBar.toolbar.reply;
  2694. var empty = this.dom.topBar.toolbar.empty;
  2695. var editDraft = this.dom.topBar.toolbar.editDraft;
  2696. var deleteDraft = this.dom.topBar.toolbar.deleteDraft;
  2697. var toDocuments = this.dom.topBar.toolbar.toDocuments;
  2698. var resetBackground = function(){this.style.backgroundImage = 'none'};
  2699. var bars = {
  2700. 'inbox':
  2701. {
  2702. 'single': [reply, trash, junk, toDocuments, mark],
  2703. 'group': [trash, junk, toDocuments, mark],
  2704. 'default': []
  2705. },
  2706. 'outbox':
  2707. {
  2708. 'single': [trash, junk],
  2709. 'group': [trash, junk],
  2710. 'default': []
  2711. },
  2712. 'junk':
  2713. {
  2714. 'single': [notJunk, trash, empty],
  2715. 'group': [notJunk, trash],
  2716. 'default': [empty]
  2717. },
  2718. 'trash':
  2719. {
  2720. 'single': [restore, delMsg, empty],
  2721. 'group': [restore, delMsg],
  2722. 'default': [empty]
  2723. },
  2724. 'draft':
  2725. {
  2726. 'single': [editDraft, deleteDraft],
  2727. 'group': [deleteDraft],
  2728. 'default': []
  2729. },
  2730. };
  2731. toolbarCont.zm_empty();
  2732. toolbarCont.appendChild(newMsg);
  2733. if (bars.hasOwnProperty(folder))
  2734. {
  2735. bars[folder][type].map(function(key){resetBackground.call(key)});
  2736. toolbarCont.zm_append(bars[folder][type]);
  2737. }
  2738. },
  2739.  
  2740. decodeMsg: function(m)
  2741. {
  2742. var match, f = m, create = this.create, cssStyles = this.css, text = this.text;
  2743. var re = /(?:\[(url|player|alliance|coords)\])((?:.(?!\1))+.)(?:\[\/\1\])/g;
  2744. var tags = ['ul', 'ol', 'tr', 'td', 'th', 'table', 'li', 'dr', 'dc', 'dl', 'tbody', 'bq', 'span', 'b', 'i', 'u', 's', 'font'];
  2745. var data = zmail.data.getInstance();
  2746. var BBCode = data.createBBCode;
  2747. var createLink = function(val)
  2748. {
  2749. var a = create('a', cssStyles.link._14);
  2750. text(a, val);
  2751. a.href = val;
  2752. a.target = 'blank';
  2753. return a.outerHTML;
  2754. };
  2755. var convertTag = function(tag)
  2756. {
  2757. var openTag, closeTag, op = new RegExp('\\[' + tag + '\\]', 'g'), cp = new RegExp('\\[\\/' + tag + '\\]', 'g');
  2758. switch(tag)
  2759. {
  2760. case 'dr': openTag = '<div style="text-align: right">'; closeTag = '</div>'; break;
  2761. case 'dc': openTag = '<div style="text-align: center">'; closeTag = '</div>'; break;
  2762. case 'dl': openTag = '<div style="text-align: left">'; closeTag = '</div>'; break;
  2763. case 'bq': openTag = '<div style="margin-left: 40px">'; closeTag = '</div>'; break;
  2764. case 'table': openTag = '<table rules="all" border="1" style="border-color: #999; margin: 10px 0;">'; closeTag = '</table>'; break;
  2765. case 'td': openTag = '<td style="padding: 4px 15px">'; closeTag = '</td>'; break;
  2766. case 'th': openTag = '<th style="background-color: #999; color: #333; padding: 3px 15px;">'; closeTag = '</th>'; break;
  2767. case 'font': openTag = ''; closeTag = ''; break;
  2768. default: openTag = '<' + tag + '>'; closeTag = '</' + tag + '>';
  2769. }
  2770. if (op.test(f)) f = f.replace(op, openTag);
  2771. if (cp.test(f)) f = f.replace(cp, closeTag);
  2772. };
  2773. while((match = re.exec(m)) !== null)
  2774. {
  2775. var code = match[1], val = match[2];
  2776. if(code == 'coords') val = val.split(':');
  2777. switch(code)
  2778. {
  2779. case 'url': f = f.replace(match[0], createLink(val)); break;
  2780. case 'alliance': f = f.replace(match[0], BBCode.alliance(val)); break;
  2781. case 'player': f = f.replace(match[0], BBCode.player(val)); break;
  2782. case 'coords': f = f.replace(match[0], BBCode.coords(val.join(':'), val[0], val[1])); break;
  2783. }
  2784. }
  2785. tags.map(convertTag);
  2786. return f;
  2787. },
  2788.  
  2789. formatDate: function(d,t)
  2790. {
  2791. var date = new Date(parseInt(d));
  2792. var day = date.getDate(), month = date.getMonth() + 1, year = date.getFullYear().toString().slice(2), fullYear = date.getFullYear();
  2793. var hours = date.getHours(), minutes = date.getMinutes();
  2794. var newDate = new Date(), today = newDate.getDate(), thisMonth = newDate.getMonth() + 1, thisYear = newDate.getFullYear();
  2795.  
  2796. var conv = function(n){ return (n > 9) ? n : '0' + n};
  2797.  
  2798. if(day == today && month == thisMonth && fullYear == thisYear && t == 'header')
  2799. {
  2800. return conv(hours) + ':' + conv(minutes);
  2801. }
  2802. else
  2803. {
  2804. var f = conv(day) + '/' + conv(month) + '/' + year;
  2805. if (t == 'header') return f;
  2806. if (t == 'msg') return (f + ' ' + conv(hours) + ':' + conv(minutes));
  2807. }
  2808. },
  2809.  
  2810. printMsg: function(msg)
  2811. {
  2812. var b = msg.b, msgCont = this.dom.rightBar.msgCont, cssStyles = this.css, text = this.text, create = this.create, root = this;
  2813. var msgSbc = this.dom.rightBar.scrollBar.cont;
  2814. var sb = this.dom.rightBar.scrollBar.bar;
  2815. var expandCont = root.dom.rightBar.expandCont;
  2816. this.generatedSections = [];
  2817. msgCont.zm_empty();
  2818. var createSection = function(f,d,m,i,c)
  2819. {
  2820. var s_cont = create('div', cssStyles.compose.rightBar.origionalMsg.cont);
  2821. var s_remove = create('div', cssStyles.compose.rightBar.origionalMsg.close);
  2822. var s_from = create('p', cssStyles.compose.rightBar.origionalMsg.from);
  2823. var s_date = create('p', cssStyles.compose.rightBar.origionalMsg.date);
  2824. var s_message = document.createElement('div');
  2825. var s_sender = f.cloneNode(true);
  2826. text(s_from, 'From: ');
  2827. text(s_date, d);
  2828. text(s_remove, 'x');
  2829. s_message.innerHTML = m.replace(/color: ?#377395|color: ?rgb\(55, 115, 149\)/g, 'color: #194965');
  2830. s_remove.data = {'index': i, 'contents': c};
  2831. s_sender.style.color = '#194965';
  2832. s_sender.style.fontSize = '14px';
  2833. s_from.zm_append([s_sender, s_date]);
  2834. s_cont.zm_append([s_from, s_message, s_remove]);
  2835. s_remove.onclick = function()
  2836. {
  2837. var index = this.data.index, sections = root.generatedSections;
  2838. if(sections[index] && sections[index][2] == 1) root.generatedSections[index][2] = 0;
  2839. this.parentNode.remove();
  2840. console.log(root.generatedSections);
  2841. };
  2842. root.generatedSections.push([s_cont, c, 1]);
  2843. };
  2844.  
  2845. if(msg.fi === -1)
  2846. {
  2847. var subject = create('p', cssStyles.message.subject);
  2848. var from = create('p', cssStyles.message.from);
  2849. var to = create('p', cssStyles.message.from);
  2850. var msgBody = create('p', cssStyles.message.body);
  2851. var date = create('span', cssStyles.message.date);
  2852.  
  2853. text(subject, msg.s);
  2854. text(from, 'From: System');
  2855. text(to, 'To: You');
  2856. text(date, this.formatDate(msg.d, 'msg'));
  2857. msgBody.innerHTML = this.decodeMsg(b);
  2858. from.appendChild(date);
  2859. msgCont.zm_append([subject, from, to, msgBody]);
  2860. this.selectedMsgBody.push(from.outerHTML + msgBody.outerHTML);
  2861. }
  2862.  
  2863. if((msg.fi !== -1) && (/<cnc>/.test(b)))
  2864. {
  2865. str = b.replace(/[\t\r\n]/g, '</br>');
  2866. var sections = [];
  2867. var cnc = str.match(/<cnc>.*?<\/cnc>/g);
  2868. var re = /(?:<(cncs|cncd|cnct)>)((?:.(?!\1))+.)(?:<\/\1>)/g, match;
  2869.  
  2870. for(var i = 0; i < cnc.length; i++)
  2871. {
  2872. var sd, dt, txt;
  2873. while ((match = re.exec(cnc[i])) !== null)
  2874. {
  2875. var tag = match[1], val = match[2];
  2876. switch(tag)
  2877. {
  2878. case 'cncs': sd = val; break;
  2879. case 'cncd': dt = parseInt(val); break;
  2880. case 'cnct': txt = val; break;
  2881. }
  2882. };
  2883. sections.push([sd, dt, txt]);
  2884. }
  2885. console.log(sections);
  2886.  
  2887. for(var n = 0; n < sections.length; n++)
  2888. {
  2889. var subject = create('p', cssStyles.message.subject);
  2890. var from = create('p', cssStyles.message.from);
  2891. var msgBody = create('p', cssStyles.message.body);
  2892. var date = create('span', cssStyles.message.date);
  2893. var sender = create('a', cssStyles.link._12);
  2894. text(subject, msg.s);
  2895. text(from, 'From: ');
  2896. text(date, this.formatDate(sections[n][1], 'msg'));
  2897. text(sender, sections[n][0]);
  2898. sender.data = {'name': sections[n][0]};
  2899. sender.onclick = function(){webfrontend.gui.util.BBCode.openPlayerProfile(this.data.name)};
  2900. sender.style.marginRight = 0;
  2901. from.zm_append([sender, date]);
  2902. if (sections[n][2]) msgBody.innerHTML = this.decodeMsg(sections[n][2]);
  2903.  
  2904. if(n == 0)
  2905. {
  2906. var to = create('p', cssStyles.message.from);
  2907. var expand = create('span', cssStyles.message.expand);
  2908. var addFriend = create('a', cssStyles.message.actionLink);
  2909. var blockContact = create('a', cssStyles.message.actionLink);
  2910. var add = function(){ root.addFriend.apply(root, arguments) };
  2911. var block = function(){ root.blockContact.apply(root, arguments) };
  2912. var isFriend = (this.contacts.friends) ? this.contacts.friends.indexOf(msg.fi) > -1 : false;
  2913. var isBlocked = (this.contacts.blocked) ? this.contacts.blocked.indexOf(msg.fi) > -1 : false;
  2914. text(to, 'To: ');
  2915. text(addFriend, 'Add to contacts');
  2916. text(blockContact, 'Block');
  2917. addFriend.data = {'id': msg.fi};
  2918. blockContact.data = {'id': msg.fi};
  2919. addFriend.onclick = function(){ add(this.data.id); addFriend.remove(); blockContact.remove(); };
  2920. blockContact.onclick = function(){ block(this.data.id); addFriend.remove(); blockContact.remove(); };
  2921. expand.style.backgroundImage = 'url(' + root.res.expand + ')';
  2922. expand.data = {'isCollapsed': true, 'cont': to, 'bar': null};
  2923. expand.onclick = function()
  2924. {
  2925. if (this.data.isCollapsed)
  2926. {
  2927. this.data.cont.style.whiteSpace = 'normal';
  2928. this.style.backgroundImage = 'url(' + root.res.collapse + ')';
  2929. }
  2930. else
  2931. {
  2932. this.data.cont.style.whiteSpace = 'nowrap';
  2933. this.style.backgroundImage = 'url(' + root.res.expand + ')';
  2934. }
  2935. root.dom.rightBar.scrollBar.bar.data.update();
  2936. this.data.isCollapsed = !this.data.isCollapsed;
  2937. };
  2938. if (!isFriend && !isBlocked) from.zm_append([addFriend, blockContact]);
  2939.  
  2940. for(var a = 0; a < msg.t.length; a++)
  2941. {
  2942. var receiver = create('a', cssStyles.link._12);
  2943. var s = (a == msg.t.length - 1) ? msg.t[a] : msg.t[a] + ',';
  2944. receiver.data = {'name': msg.t[a]};
  2945. receiver.onclick = function(){webfrontend.gui.util.BBCode.openPlayerProfile(this.data.name)};
  2946. text(receiver, s);
  2947. to.appendChild(receiver);
  2948. }
  2949. msgCont.zm_append([subject, from, to, msgBody]);
  2950. if (to.scrollWidth > to.offsetWidth) to.appendChild(expand);
  2951. }
  2952. else msgCont.zm_append([from, msgBody]);
  2953. createSection(sender, date.innerHTML, msgBody.innerHTML, n, cnc[n]);
  2954. }
  2955. }
  2956. if (this.selectedFolder == 'inbox') msgCont.appendChild(expandCont);
  2957. msgCont.style.top = 0;
  2958. sb.data.update();
  2959. },
  2960.  
  2961. createHeader: function(msg)
  2962. {
  2963. var create = this.create, text = this.text, cssStyles = this.css, root = this;
  2964. var headerCont = create('div', cssStyles.header.cont);
  2965. var sender = create('a', cssStyles.header.sender);
  2966. var date = create('span', cssStyles.header.date);
  2967. var subject = create('p', cssStyles.header.subject);
  2968. var checkBox = create('div', cssStyles.header.checkBox);
  2969. var span = create('span', cssStyles.header.span);
  2970. text(sender, msg.f);
  2971. text(date, this.formatDate(msg.d, 'header'));
  2972. text(subject, msg.s);
  2973. sender.data = {'from': msg.f};
  2974. sender.onclick = function(){webfrontend.gui.util.BBCode.openPlayerProfile(this.data.from)};
  2975. span.appendChild(checkBox);
  2976. headerCont.zm_append([span, sender, date, subject]);
  2977. headerCont.data = {'msg': msg, 'isSelected': false, 'isRead': msg.r};
  2978. if(!msg.r)
  2979. {
  2980. headerCont.zm_css(cssStyles.header.contUnRead);
  2981. span.style.borderBottom = cssStyles.header.contUnRead.borderBottom;
  2982. }
  2983. headerCont.onmouseover = function(){this.style.background = '#363636'};
  2984. headerCont.onmouseout = function()
  2985. {
  2986. var isSelected = this.data.isSelected, isRead = this.data.isRead;
  2987. var color = isSelected ? '#363636' : (isRead) ? 'transparent' : '#292929';
  2988. this.style.background = color;
  2989. };
  2990. headerCont.onclick = function()
  2991. {
  2992. console.log(this.data.msg.i);
  2993. if(!this.data.isRead)
  2994. {
  2995. var id = this.data.msg.i;
  2996. var index = root.folders.inbox.ids.indexOf(id);
  2997. var data = zmail.data.getInstance();
  2998. data.markRead([id], true);
  2999. this.data.isRead = true;
  3000. if (index > -1) root.folders.inbox.msgs[index].r = true;
  3001. if (index > -1) console.log(id, root.folders.inbox.msgs[index]);
  3002. }
  3003. if(root.selectedHeader !== null)
  3004. {
  3005. root.selectedHeader.style.background = (root.selectedHeader.data.isRead) ? 'transparent' : '#292929';
  3006. root.selectedHeader.style.fontWeight = (root.selectedHeader.data.isRead) ? 'normal' : 'bold';
  3007. root.selectedHeader.data.isSelected = false;
  3008. }
  3009. root.selectedHeader = this;
  3010. this.data.isSelected = true;
  3011. this.style.background = '#363636';
  3012. root.printMsg(this.data.msg);
  3013. root.setToolbar();
  3014. };
  3015. checkBox.data = {'id': msg.i, 'isChecked': false, 'cont': headerCont};
  3016. checkBox.onmousedown = function(){this.style.background = '#202020'};
  3017. checkBox.onmouseup = function()
  3018. {
  3019. var isChecked = this.data.isChecked, isRead = this.data.cont.data.isRead;
  3020. var index = root.selectedMsgs.ids.indexOf(this.data.id);
  3021. if(!isChecked)
  3022. {
  3023. if(index == -1)
  3024. {
  3025. root.selectedMsgs.ids.push(this.data.id);
  3026. root.selectedMsgs.headers.push(this.data.cont);
  3027. root.selectedMsgs.checkBoxes.push(this);
  3028. }
  3029. this.style.background = '#9f9f9f';
  3030. this.data.cont.style.background = '#363636';
  3031. this.data.cont.data.isSelected = true;
  3032. }
  3033. if(isChecked)
  3034. {
  3035. if(index > -1)
  3036. {
  3037. root.selectedMsgs.ids.splice(index, 1);
  3038. root.selectedMsgs.headers.splice(index, 1);
  3039. root.selectedMsgs.checkBoxes.splice(index, 1);
  3040. }
  3041. this.style.background = 'transparent';
  3042. this.data.cont.style.background = isRead ? 'transparent' : '#292929';
  3043. this.data.cont.data.isSelected = false;
  3044. }
  3045. console.log(root.selectedMsgs);
  3046. this.data.isChecked = !isChecked;
  3047. if (root.selectedMsgs.ids != null && root.selectedMsgs.ids.length > 0)
  3048. {
  3049. root.selectedHeader = null;
  3050. root.resetMsgCont();
  3051. }
  3052. root.setToolbar();
  3053. };
  3054.  
  3055. checkBox.onclick = function(event)
  3056. {
  3057. if(!event) event = window.event;
  3058. event.preventDefault();
  3059. event.stopPropagation();
  3060. };
  3061. return {'cont': headerCont, 'checkBox': checkBox};
  3062. },
  3063.  
  3064. populateHeaders: function()
  3065. {
  3066. try
  3067. {
  3068. switch(this.selectedFolder)
  3069. {
  3070. case 'trash': var arr = this.folders.trash[0].msgs.concat(this.folders.trash[1].msgs); break;
  3071. case 'draft':
  3072. var arr = [];
  3073. if (this.folders.draft != null || this.size(this.folders.draft) > 0)
  3074. for (var key in this.folders.draft)
  3075. {
  3076. var msg = this.folders.draft[key];
  3077. arr.push(msg);
  3078. };
  3079. break;
  3080. default: var arr = this.folders[this.selectedFolder].msgs;
  3081. }
  3082. var compare = function(a,b)
  3083. {
  3084. return (a.d < b.d) ? 1 : (a.d > b.d) ? -1 : 0;
  3085. };
  3086. arr = arr.sort(compare);
  3087. var create = this.create, text = this.text, cssStyles = this.css, root = this;
  3088. var headersCont = this.dom.middleBar.headersCont;
  3089. var headersSbc = this.dom.middleBar.scrollBar.cont;
  3090. headersSbc.zm_empty();
  3091. headersCont.zm_empty();
  3092. headersCont.style.top = 0;
  3093. this.resetMsgCont();
  3094. this.selectedHeader = null;
  3095. this.selectedMsgs.ids = [];
  3096. this.selectedMsgs.headers = [];
  3097. this.selectedMsgs.checkBoxes = [];
  3098. this.generatedHeaders = {};
  3099. this.setToolbar();
  3100. if(arr == null) return;
  3101. var Min = this.selectedPage * 30, Max = (this.selectedPage + 1) * 30, pages = Math.ceil(arr.length / 30);
  3102. for(var i = Min; i < Math.min(Max, arr.length); i++)
  3103. {
  3104. var msg = arr[i];
  3105. var header = this.createHeader(msg);
  3106. headersCont.appendChild(header.cont);
  3107. root.generatedHeaders[msg.i] = {
  3108. 'cont': header.cont,
  3109. 'checkBox': header.checkBox,
  3110. 'msg': msg
  3111. };
  3112. }
  3113.  
  3114. var selectAll = this.dom.middleBar.footer.selectAll;
  3115. var ind = this.dom.middleBar.footer.indicator;
  3116. var controlCont = this.dom.middleBar.footer.controlCont;
  3117. var pagesCount = this.dom.middleBar.footer.pagesCount;
  3118. selectAll.style.background = 'transparent';
  3119. selectAll.style.display = (arr.length > 0) ? 'block' : 'none';
  3120. if(arr.length > 30)
  3121. {
  3122. var width = 197 / pages;
  3123. controlCont.style.display = 'block';
  3124. ind.style.display = 'block';
  3125. ind.style.width = width + 'px';
  3126. ind.style.marginLeft = this.selectedPage * width + 'px';
  3127. var text = 'Page ' + (this.selectedPage + 1) + '/' + pages;
  3128. (pagesCount.innerText) ? pagesCount.innerText = text : pagesCount.textContent = text;
  3129. }
  3130. if(arr.length < 30)
  3131. {
  3132. ind.style.display = 'none';
  3133. controlCont.style.display = 'none';
  3134. (pagesCount.innerText) ? pagesCount.innerText = '' : pagesCount.textContent = '';
  3135. }
  3136. if(arr.length * 30 > headersSbc.offsetHeight)
  3137. {
  3138. headersSbc.zm_empty();
  3139. var sb = create('div', cssStyles.middleBar.scrollBar.bar);
  3140. sb.style.height = 422 * 422/(arr.length * 30) + 'px';
  3141. this.dom.middleBar.scrollBar.bar = sb;
  3142. headersSbc.appendChild(sb);
  3143. this.enableScroll(sb, headersSbc, headersCont);
  3144. }
  3145. }
  3146. catch(e)
  3147. {
  3148. console.log(e.toString());
  3149. }
  3150. },
  3151.  
  3152. findContact: function(txt)
  3153. {
  3154. var players = zmail.data.getInstance().players;
  3155. var root = this;
  3156. var resultsCont = this.dom.rightBar.contacts.contentsCont;
  3157. var cont = this.dom.rightBar.contacts.results;
  3158. var scrollbarCont = this.dom.rightBar.contacts.scrollbarCont;
  3159. var searchBox = this.dom.rightBar.contacts.search;
  3160. var lowerCont = this.dom.rightBar.contacts.lowerCont;
  3161. var arr = [];
  3162. var str = txt.replace(/[^a-zA-Z0-9\-_]/g, '').toLowerCase();
  3163. if (str == '')
  3164. {
  3165. cont.style.display = 'none';
  3166. lowerCont.style.display = 'none';
  3167. return;
  3168. }
  3169. for(var i = 0; i < players.length; i++)
  3170. {
  3171. if (players[i].pn.toLowerCase().substr(0,str.length) == str) arr.push(players[i]);
  3172. if (arr.length >= 20) break;
  3173. }
  3174. var activate = function()
  3175. {
  3176. root.changeContactSelection.apply(root, arguments);
  3177. };
  3178. var items = [];
  3179. resultsCont.zm_empty();
  3180. scrollbarCont.zm_empty();
  3181. searchBox.data.selectedIndex = 0;
  3182. searchBox.data.isContOpen = true;
  3183. searchBox.data.selectedGroup = 'results';
  3184. for(var i = 0; i < arr.length; i++)
  3185. {
  3186. var style = (i == 0) ? 'contSelected' : 'cont';
  3187. var Item = this.create('div', this.css.compose.leftBar.recipients.searchBox.item[style]);
  3188. var player = this.create('p', this.css.compose.leftBar.recipients.searchBox.item.text);
  3189. var alliance = this.create('p', this.css.compose.leftBar.recipients.searchBox.item.text);
  3190. this.text(player, arr[i].pn);
  3191. this.text(alliance, arr[i].an);
  3192. Item.zm_append([player, alliance]);
  3193. Item.data = {'id': arr[i].p, 'index': i};
  3194. Item.onclick = function()
  3195. {
  3196. activate(this.data.index);
  3197. };
  3198. resultsCont.appendChild(Item);
  3199. items.push(Item);
  3200. }
  3201. this.setContactOptions(arr[0].p);
  3202. lowerCont.style.display = 'block';
  3203. cont.style.display = 'block';
  3204. cont.style.height = Math.min(145, arr.length * 49) + 'px';
  3205. cont.style.top = searchBox.offsetTop + 30 + 'px';
  3206. if(arr.length > 5)
  3207. {
  3208. var bar = this.create('div', this.css.rightBar.contacts.results.scrollbar.bar);
  3209. scrollbarCont.appendChild(bar);
  3210. this.enableScroll(bar, scrollbarCont, resultsCont);
  3211. }
  3212. searchBox.data.isContOpen = true;
  3213. searchBox.data.results = items;
  3214. },
  3215.  
  3216. changeContactSelection: function(mode)
  3217. {
  3218. var searchBox = this.dom.rightBar.contacts.search;
  3219. var mainCont = this.dom.rightBar.contacts.results;
  3220. var resultsSbc = this.dom.rightBar.contacts.scrollbarCont;
  3221. var resultsCont = this.dom.rightBar.contacts.contentsCont;
  3222. var index = searchBox.data.selectedIndex;
  3223. var results = searchBox.data.results;
  3224. var length = results.length;
  3225. var newIndex = (typeof mode === 'number') ? mode : (mode) ? (index + 1) % length : (index - 1 < 0) ? length - 1 : index - 1;
  3226. var currentItem = results[index];
  3227. var newItem = results[newIndex];
  3228. currentItem.zm_css(this.css.compose.leftBar.recipients.searchBox.item.cont);
  3229. newItem.zm_css(this.css.compose.leftBar.recipients.searchBox.item.contSelected);
  3230. newItem.onmouseout = null;
  3231. if (newIndex > 2 && length > 3)
  3232. {
  3233. resultsCont.style.top = -(newIndex - 2) * 49 + 'px';
  3234. resultsSbc.firstChild.style.top = (((resultsSbc.offsetHeight - 20) / resultsCont.offsetHeight) * (newIndex - 2) * 49) + 10 +'px';
  3235. }
  3236. if (newIndex < 3 && length > 3)
  3237. {
  3238. resultsCont.style.top = 0;
  3239. resultsSbc.firstChild.style.top = '10px';
  3240. }
  3241. searchBox.data.selectedIndex = newIndex;
  3242. this.setContactOptions(newItem.data.id);
  3243. },
  3244.  
  3245. setContactOptions: function(id)
  3246. {
  3247. var addToSelection = this.dom.rightBar.contacts.buttons.addToSelection;
  3248. var addAsFriend = this.dom.rightBar.contacts.buttons.addAsFriend;
  3249. var block = this.dom.rightBar.contacts.buttons.block;
  3250. var isFriend = this.contacts.friends.indexOf(id) > -1;
  3251. var isBlocked = this.contacts.blocked.indexOf(id) > -1;
  3252. var isSelected = this.selectedContacts.indexOf(id) > -1;
  3253. addToSelection.innerHTML = (isSelected) ? 'Remove' : 'Add to selection';
  3254. addToSelection.data.mode = (isSelected) ? 'remove' : 'add';
  3255. addAsFriend.innerHTML = (isFriend) ? 'Remove Friend' : 'Add Friend';
  3256. addAsFriend.data.mode = (isFriend) ? 'remove' : 'add';
  3257. block.innerHTML = (isBlocked) ? 'Unblock' : 'Block';
  3258. block.data.mode = (isBlocked) ? 'unblock' : 'block';
  3259. addAsFriend.data.id = id;
  3260. addToSelection.data.id = id;
  3261. block.data.id = id;
  3262. (isBlocked) ? addAsFriend.data.disable() : addAsFriend.data.enable();
  3263. (isFriend) ? block.data.disable() : block.data.enable();
  3264. },
  3265.  
  3266. addFriend: function(id)
  3267. {
  3268. if(this.contacts.friends.indexOf(id) == -1) this.contacts.friends.push(id);
  3269. this.dom.leftBar.contacts.friends.nodeValue = 'Friends ' + this.contacts.friends.length;
  3270. if(this.selectedGroup == 'friends') this.populateContacts();
  3271. this.storage.save.call(this);
  3272. },
  3273.  
  3274. blockContact: function(id)
  3275. {
  3276. if(this.contacts.blocked.indexOf(id) == -1) this.contacts.blocked.push(id);
  3277. this.dom.leftBar.contacts.blocked.nodeValue = 'Blocked ' + this.contacts.blocked.length;
  3278. if(this.selectedGroup == 'blocked') this.populateContacts();
  3279. this.storage.save.call(this);
  3280. },
  3281.  
  3282. removeFriend: function(id)
  3283. {
  3284. if(this.contacts.friends.indexOf(id) > -1) this.contacts.friends.splice(this.contacts.friends.indexOf(id), 1);
  3285. this.dom.leftBar.contacts.friends.nodeValue = 'Friends ' + (this.contacts.friends.length || '');
  3286. if(this.selectedGroup == 'friends') this.populateContacts();
  3287. this.storage.save.call(this);
  3288. },
  3289.  
  3290. unblockContact: function(id)
  3291. {
  3292. if(this.contacts.blocked.indexOf(id) > -1) this.contacts.blocked.splice(this.contacts.blocked.indexOf(id), 1);
  3293. this.dom.leftBar.contacts.blocked.nodeValue = 'Blocked ' + (this.contacts.blocked.length || '');
  3294. if(this.selectedGroup == 'blocked') this.populateContacts();
  3295. this.storage.save.call(this);
  3296. },
  3297.  
  3298. addToSelection: function(id)
  3299. {
  3300. if(this.selectedContacts.indexOf(id) == -1)
  3301. {
  3302. this.selectedContacts.push(id);
  3303. this.addSelectedContacts();
  3304. }
  3305. },
  3306.  
  3307. removeFromSelection: function(id)
  3308. {
  3309. if(this.selectedContacts.indexOf(id) > -1)
  3310. {
  3311. this.selectedContacts.splice(this.selectedContacts.indexOf(id) , 1);
  3312. this.addSelectedContacts();
  3313. }
  3314. },
  3315.  
  3316. removeAllSelectedContacts: function()
  3317. {
  3318. var arr = this.selectedContacts, headers = this.generatedHeaders;
  3319. for (var id in headers)
  3320. {
  3321. if(arr.indexOf(parseInt(id, 10)) > -1)
  3322. {
  3323. headers[id].checkBox.style.background = 'transparent';
  3324. headers[id].cont.style.background = 'transparent';
  3325. headers[id].cont.data.isSelected = false;
  3326. }
  3327. };
  3328. this.selectedContacts = [];
  3329. this.addSelectedContacts();
  3330. },
  3331.  
  3332. addGroupToSelection: function()
  3333. {
  3334. var arr = this.selectedContacts, headers = this.generatedHeaders;
  3335. for (var id in headers)
  3336. {
  3337. if(arr.indexOf(parseInt(id, 10)) == -1) this.selectedContacts.push(parseInt(id, 10));
  3338. headers[id].checkBox.style.background = '#9f9f9f';
  3339. headers[id].cont.style.background = '#363636';
  3340. headers[id].cont.data.isSelected = true;
  3341. };
  3342. this.addSelectedContacts();
  3343. },
  3344.  
  3345. removeGroupFromSelection: function()
  3346. {
  3347. var arr = this.selectedContacts, headers = this.generatedHeaders;
  3348. for (var id in headers)
  3349. {
  3350. if(arr.indexOf(parseInt(id, 10)) > -1) this.selectedContacts.splice(this.selectedContacts.indexOf(parseInt(id, 10)), 1);
  3351. headers[id].checkBox.style.background = 'transparent';
  3352. headers[id].cont.style.background = 'transparent';
  3353. headers[id].cont.data.isSelected = false;
  3354. };
  3355. this.addSelectedContacts();
  3356. },
  3357.  
  3358. getPlayerNameById: function(id)
  3359. {
  3360. var data = zmail.data.getInstance();
  3361. var players = data.players;
  3362. var name;
  3363. for (var i = 0; i < players.length; i++) if (players[i].p == id) { name = players[i].pn; break; }
  3364. return name;
  3365. },
  3366.  
  3367. getPlayerDataById: function(id)
  3368. {
  3369. var data = zmail.data.getInstance();
  3370. var players = data.players;
  3371. var playerData;
  3372. for (var i = 0; i < players.length; i++) if (players[i].p == id) { playerData = players[i]; break; }
  3373. return playerData;
  3374. },
  3375.  
  3376. addSelectedContacts: function()
  3377. {
  3378. var cont = this.dom.rightBar.contacts.cont;
  3379. var header = this.dom.rightBar.contacts.header;
  3380. var root = this;
  3381. var text = this.selectedContacts.length == 0 ? 'No contacts selected.' : this.selectedContacts.length + ' contacts selected';
  3382. (header.innerText) ? header.innerText = text : header.textContent = text;
  3383. cont.zm_empty();
  3384. for(var i = 0; i < this.selectedContacts.length; i++)
  3385. {
  3386. var id = this.selectedContacts[i], name = this.getPlayerNameById(id);
  3387. var Item = this.create('div', this.css.compose.leftBar.recipients.recipient.cont);
  3388. var remove = this.create('div', this.css.compose.leftBar.recipients.recipient.remove);
  3389. this.text(Item, name);
  3390. this.text(remove, 'X');
  3391. remove.data = {'id': id, 'parent': Item};
  3392. remove.onclick = function()
  3393. {
  3394. cont.removeChild(this.data.parent)
  3395. var pid = this.data.id, index = root.selectedContacts.indexOf(pid);
  3396. if(index > -1) root.selectedContacts.splice(index, 1);
  3397. };
  3398. Item.appendChild(remove);
  3399. cont.appendChild(Item)
  3400. }
  3401. if(this.selectedContacts.length > 0)
  3402. {
  3403. this.dom.rightBar.contacts.buttons.removeAll.data.enable();
  3404. this.dom.rightBar.contacts.buttons.message.data.enable();
  3405. }
  3406. else
  3407. {
  3408. this.dom.rightBar.contacts.buttons.removeAll.data.disable();
  3409. this.dom.rightBar.contacts.buttons.message.data.disable();
  3410. }
  3411. },
  3412.  
  3413. populateContacts: function()
  3414. {
  3415. try
  3416. {
  3417. var data = zmail.data.getInstance();
  3418. var create = this.create, text = this.text, cssStyles = this.css
  3419. var headersCont = this.dom.middleBar.headersCont;
  3420. var headersSbc = this.dom.middleBar.scrollBar.cont, root = this;
  3421. var selectAll = this.dom.middleBar.footer.selectAll;
  3422. var ind = this.dom.middleBar.footer.indicator;
  3423. var controlCont = this.dom.middleBar.footer.controlCont;
  3424. var pagesCount = this.dom.middleBar.footer.pagesCount;
  3425. var isAllContactsSelected = true;
  3426. (pagesCount.innerText) ? pagesCount.innerText = '' : pagesCount.textContent = '';
  3427. ind.style.display = 'none';
  3428. controlCont.style.display = 'none';
  3429. headersSbc.zm_empty();
  3430. headersCont.zm_empty();
  3431. headersCont.style.top = 0;
  3432. this.setToolbar();
  3433. this.resetMsgCont();
  3434. this.generatedHeaders = {};
  3435. this.dom.rightBar.msgCont.appendChild(this.dom.rightBar.contacts.main);
  3436.  
  3437. switch(this.selectedGroup)
  3438. {
  3439. case 'friends':
  3440. var contacts = [];
  3441. this.contacts.friends.map(function(x)
  3442. {
  3443. var c = root.getPlayerDataById(x);
  3444. c.name = c.pn;
  3445. contacts.push(c);
  3446. });
  3447. break;
  3448. case 'blocked':
  3449. var contacts = [];
  3450. this.contacts.blocked.map(function(x)
  3451. {
  3452. var c = root.getPlayerDataById(x);
  3453. c.name = c.pn;
  3454. contacts.push(c);
  3455. });
  3456. break;
  3457. case 'alliance': var contacts = data.allianceMembers; break;
  3458. case 'commanders': var contacts = data.allianceCommanders; break;
  3459. default: var contacts = false;
  3460. }
  3461.  
  3462. var compareRank = function(a,b)
  3463. {
  3464. return (a.roleId > b.roleId) ? 1 : (a.roleId < b.roleId) ? -1 : 0;
  3465. };
  3466. var compareName = function(a,b)
  3467. {
  3468. return (a.name.toLowerCase() > b.name.toLowerCase()) ? 1 : (a.name.toLowerCase() < b.name.toLowerCase()) ? -1 : 0;
  3469. };
  3470. (this.selectedGroup == 'alliance' || this.selectedGroup == 'commanders') ? contacts.sort(compareRank) : contacts.sort(compareName);
  3471. if(!contacts) return;
  3472.  
  3473. for(var i = 0; i < contacts.length; i++)
  3474. {
  3475. var contact = contacts[i];
  3476. var id = contact.p || contact.id;
  3477. var playerName = contact.pn || contact.name;
  3478. var contactCont = create('div', cssStyles.header.cont);
  3479. var name = create('a', cssStyles.header.sender);
  3480. var rank = create('p', cssStyles.header.subject);
  3481. var checkBox = create('div', cssStyles.header.checkBox);
  3482. var span = create('span', cssStyles.header.span);
  3483. contactCont.data = {'id': id, 'name': playerName, 'isSelected': false, 'checkBox': checkBox};
  3484. if (this.selectedContacts.indexOf(id) > -1)
  3485. {
  3486. checkBox.style.background = '#9f9f9f';
  3487. contactCont.style.background = '#363636';
  3488. contactCont.data.isSelected = true;
  3489. }
  3490. else isAllContactsSelected = false;
  3491. text(name, playerName);
  3492. text(rank, (contact.an || contact.role) || '');
  3493. name.data = {'name': playerName};
  3494. name.onclick = function(){webfrontend.gui.util.BBCode.openPlayerProfile(this.data.name)};
  3495. name.onmousedown = function(event){if(!event) event = window.event; event.preventDefault(); event.stopPropagation()};
  3496. name.onmouseup = function(event){if(!event) event = window.event; event.preventDefault(); event.stopPropagation()};
  3497. span.appendChild(checkBox);
  3498. contactCont.zm_append([span, name, rank]);
  3499. contactCont.onmouseover = function(){if (!this.data.isSelected) this.style.background = '#363636'};
  3500. contactCont.onmouseout = function(){if (!this.data.isSelected) this.style.background = 'transparent'};
  3501. contactCont.onmousedown = function(){this.data.checkBox.style.background = '#202020'};
  3502. contactCont.onclick = function()
  3503. {
  3504. var index = root.selectedContacts.indexOf(this.data.id);
  3505. var isSelected = this.data.isSelected;
  3506. if(isSelected)
  3507. {
  3508. this.data.checkBox.style.background = 'transparent';
  3509. this.style.background = 'transparent';
  3510. if (index > -1) root.selectedContacts.splice(index, 1);
  3511. }
  3512. else
  3513. {
  3514. this.data.checkBox.style.background = '#9f9f9f';
  3515. this.style.background = '#363636';
  3516. if (index == -1) root.selectedContacts.push(this.data.id);
  3517. }
  3518. this.data.isSelected = !isSelected;
  3519. root.addSelectedContacts();
  3520. };
  3521. headersCont.appendChild(contactCont);
  3522.  
  3523. root.generatedHeaders[id] = {
  3524. 'cont': contactCont,
  3525. 'checkBox': checkBox,
  3526. 'name': playerName
  3527. };
  3528. }
  3529. selectAll.style.display = (contacts.length > 0) ? 'block' : 'none';
  3530. selectAll.style.background = (isAllContactsSelected && contacts.length > 0) ? '#9f9f9f' : 'transparent';
  3531. selectAll.data.isChecked = (isAllContactsSelected && contacts.length > 0);
  3532.  
  3533. if(contacts.length * 30 > headersSbc.offsetHeight)
  3534. {
  3535. var sb = create('div', cssStyles.middleBar.scrollBar.bar);
  3536. sb.style.height = 422 * 422/(contacts.length * 30) + 'px';
  3537. headersSbc.appendChild(sb);
  3538. this.enableScroll(sb, headersSbc, headersCont);
  3539. }
  3540. }
  3541. catch(e)
  3542. {
  3543. console.log(e.toString());
  3544. }
  3545. },
  3546.  
  3547. dom: {
  3548. 'window':
  3549. {
  3550. 'main': null,
  3551. 'compose': null
  3552. },
  3553. 'leftBar':
  3554. {
  3555. 'folders':
  3556. {
  3557. 'inbox': null,
  3558. 'outbox': null,
  3559. 'draft': null,
  3560. 'junk': null,
  3561. 'trash': null,
  3562. },
  3563. 'items': {
  3564. 'inbox': null,
  3565. 'outbox': null,
  3566. 'draft': null,
  3567. 'junk': null,
  3568. 'trash': null,
  3569. 'friends': null,
  3570. 'blocked': null,
  3571. 'alliance': null,
  3572. 'commanders': null
  3573. },
  3574. 'contacts':
  3575. {
  3576. 'alliance': null,
  3577. 'commanders': null,
  3578. 'friends': null,
  3579. 'blocked': null
  3580. }
  3581. },
  3582. 'rightBar':
  3583. {
  3584. 'cont': null,
  3585. 'msgCont': null,
  3586. 'expandCont': null,
  3587. 'scrollBar':
  3588. {
  3589. 'cont': null,
  3590. 'bar': null
  3591. },
  3592. 'contacts':
  3593. {
  3594. 'main': null,
  3595. 'lowerCont': null,
  3596. 'header': null,
  3597. 'cont': null,
  3598. 'search': null,
  3599. 'results': null,
  3600. 'contentsCont': null,
  3601. 'scrollbarCont': null,
  3602. 'buttons':
  3603. {
  3604. 'removeAll': null,
  3605. 'message': null,
  3606. 'addToSelection': null,
  3607. 'addAsFriend': null,
  3608. 'block': null
  3609. }
  3610. }
  3611. },
  3612. 'middleBar':
  3613. {
  3614. 'headersCont': null,
  3615. 'scrollBar':
  3616. {
  3617. 'cont': null,
  3618. 'bar': null,
  3619. },
  3620. 'footer':
  3621. {
  3622. 'selectAll': null,
  3623. 'pagesCount': null,
  3624. 'indicator': null,
  3625. 'controlCont': null,
  3626. }
  3627. },
  3628. 'topBar':
  3629. {
  3630. 'logo': null,
  3631. 'menu': null,
  3632. 'toolbar':
  3633. {
  3634. 'newMsg': null,
  3635. 'reply': null,
  3636. 'trash': null,
  3637. 'delMsg': null,
  3638. 'junk': null,
  3639. 'notJunk': null,
  3640. 'restore': null,
  3641. 'mark': null,
  3642. 'empty': null
  3643. }
  3644. },
  3645. 'toolBar':
  3646. {
  3647. 'delete': null,
  3648. 'moveToTrash': null,
  3649. 'moveToJunk': null,
  3650. 'moveToInbox': null,
  3651. 'moveToOutbox': null,
  3652. 'compose': null
  3653. },
  3654. 'searchResults':
  3655. {
  3656. 'cont': null,
  3657. 'sender':
  3658. {
  3659. 'count': null,
  3660. 'list': null
  3661. },
  3662. 'subject':
  3663. {
  3664. 'count': null,
  3665. 'list': null
  3666. }
  3667. },
  3668. 'compose':
  3669. {
  3670. 'leftBar':
  3671. {
  3672. 'recipientsMainCont': null,
  3673. 'recipientsCont': null,
  3674. 'recipientsSbc': null,
  3675. 'recipientsSb': null,
  3676. 'searchBox': null,
  3677. 'searchBoxCont': null,
  3678. 'results':
  3679. {
  3680. 'mainCont': null,
  3681. 'scrollbarCont': null,
  3682. 'resultsCont': null
  3683. },
  3684. },
  3685. 'rightBar':
  3686. {
  3687. 'iframe': null,
  3688. 'subject': null,
  3689. 'msgCont': null,
  3690. 'charCount': null
  3691. }
  3692. }
  3693. },
  3694.  
  3695. css:
  3696. {
  3697. 'window':
  3698. {
  3699. 'background': '#292929',
  3700. 'width': '100%',
  3701. 'height': '471px',
  3702. 'paddingTop': '69px',
  3703. 'position': 'relative',
  3704. 'fontFamily': 'vrinda',
  3705. 'display': 'table'
  3706. },
  3707. 'topBar':
  3708. {
  3709. 'main':
  3710. {
  3711. 'width': '100%',
  3712. 'position': 'absolute',
  3713. 'top': 0,
  3714. 'left': 0
  3715. },
  3716. 'cont':
  3717. {
  3718. 'backgroundImage': null,
  3719. 'height': '68px',
  3720. 'borderBottom': '1px solid rgba(0,0,0,0.56)',
  3721. 'width': '100%'
  3722. },
  3723. 'logo':
  3724. {
  3725. 'width': '126px',
  3726. 'height': '24px',
  3727. 'display': 'inline-block',
  3728. 'verticalAlign': 'top',
  3729. 'padding': '22px 0',
  3730. 'textAlign': 'center',
  3731. 'fontSize': '18px',
  3732. 'fontWeight': 'bold',
  3733. 'color': '#cacaca'
  3734. },
  3735. 'menu':
  3736. {
  3737. 'display': 'inline-block',
  3738. 'verticalAlign': 'top',
  3739. 'height': '68px'
  3740. }
  3741. },
  3742. 'leftBar':
  3743. {
  3744. 'background': '#3a3b3b',
  3745. 'minWidth': '126px',
  3746. 'height': '471px',
  3747. 'display': 'table-cell',
  3748. 'verticalAlign': 'top',
  3749. 'position': 'relative'
  3750. },
  3751. 'rightBar':
  3752. {
  3753. 'main':
  3754. {
  3755. 'height': '471px',
  3756. 'display': 'table-cell',
  3757. 'verticalAlign': 'top',
  3758. 'width': '100%',
  3759. 'position': 'relative'
  3760. },
  3761. 'msgMask':
  3762. {
  3763. 'overflow': 'hidden',
  3764. 'position': 'relative',
  3765. 'height': '471px',
  3766.  
  3767. },
  3768. 'msgCont':
  3769. {
  3770. 'width': '394px',
  3771. 'position': 'absolute',
  3772. 'top': 0,
  3773. 'padding': '0 30px 0 20px',
  3774. 'overflow': 'hidden',
  3775. 'width': '100%',
  3776. 'boxSizing': 'border-box',
  3777. 'MozBoxSizing': 'border-box'
  3778. },
  3779. 'scrollBar':
  3780. {
  3781. 'cont':
  3782. {
  3783. 'width': '16px',
  3784. 'position': 'absolute',
  3785. 'background': '#333333',
  3786. 'height': '471px',
  3787. 'top': 0,
  3788. 'right': 0
  3789. },
  3790. 'bar':
  3791. {
  3792. 'width': '16px',
  3793. 'background': '#3b3b3b',
  3794. 'position': 'absolute',
  3795. 'top': '10px',
  3796. 'over': {'background': '#424242'},
  3797. 'out': {'background': '#3b3b3b'},
  3798. 'down': {'background': '#707070'},
  3799. 'up': {'background': '#3d3d3d'},
  3800. 'pointer': 'cursor'
  3801. }
  3802. },
  3803. 'contacts':
  3804. {
  3805. 'topWrapper':
  3806. {
  3807. 'width': '100%',
  3808. 'paddingBottom': '5px',
  3809. 'borderBottom': '1px solid #434343',
  3810. },
  3811. 'bottomWrapper':
  3812. {
  3813. 'marginLeft': '200px',
  3814. 'width': 'auto',
  3815. 'paddingTop': '50px',
  3816. 'height': '125px'
  3817. },
  3818. 'cont':
  3819. {
  3820. 'width': 'auto',
  3821. 'height': '193px',
  3822. 'border': '1px solid #1f1f1f',
  3823. 'background': '#323232',
  3824. 'overflow': 'hidden',
  3825. 'position': 'relative',
  3826. 'padding': '5px 0 0 5px',
  3827. 'margin': '5px 0 5px 0'
  3828. },
  3829. 'search':
  3830. {
  3831. 'width': '188px',
  3832. 'border': '1px solid #1f1f1f',
  3833. 'background': '#323232',
  3834. 'color': '#6c6d6d',
  3835. 'fontSize': '12px',
  3836. 'marginRight': '5px',
  3837. 'paddingLeft': '10px',
  3838. 'outline': 'none',
  3839. 'focus': {'outline': 'none'},
  3840. 'blur': {'outline': 'none'},
  3841. 'height': '25px',
  3842. 'lineHeigt': '25px',
  3843. 'display': 'inline-block',
  3844. 'verticalAlign': 'top'
  3845. },
  3846. 'results':
  3847. {
  3848. 'cont':
  3849. {
  3850. 'position': 'absolute',
  3851. 'width': '198px',
  3852. 'left': '20px',
  3853. 'border': '1px solid #1f1f1f',
  3854. 'background': '#323232',
  3855. 'display': 'none',
  3856. 'maxHeight': '145px',
  3857. },
  3858. 'mask':
  3859. {
  3860. 'position': 'relative',
  3861. 'top': 0,
  3862. 'left': 0,
  3863. 'width': '186px',
  3864. 'height': '100%',
  3865. 'overflow': 'hidden'
  3866. },
  3867. 'contentsCont':
  3868. {
  3869. 'position': 'relative',
  3870. 'width': '100%'
  3871. },
  3872. 'scrollbar':
  3873. {
  3874. 'cont':
  3875. {
  3876. 'position': 'absolute',
  3877. 'top': 0,
  3878. 'right': 0,
  3879. 'width': '16px',
  3880. 'height': '100%',
  3881. 'background': '#363636'
  3882. },
  3883. 'bar':
  3884. {
  3885. 'position': 'absolute',
  3886. 'top': '10px',
  3887. 'background': '#3d3d3d',
  3888. 'width': '16px',
  3889. 'over': {'background': '#424242'},
  3890. 'out': {'background': '#3d3d3d'},
  3891. 'down': {'background': '#707070'},
  3892. 'up': {'background': '#3d3d3d'}
  3893. }
  3894. },
  3895. },
  3896. 'button':
  3897. {
  3898. 'active':
  3899. {
  3900. 'height': '25px',
  3901. 'textAlign': 'center',
  3902. 'background': '#4e4e4e',
  3903. 'color': '#8b8b8b',
  3904. 'fontSize': '12px',
  3905. 'lineHeight': '25px',
  3906. 'over': {'background': '#266589', 'color': '#c2c2c2'},
  3907. 'out': {'background': '#4e4e4e', 'color': '#8b8b8b'},
  3908. 'cursor': 'pointer',
  3909. 'marginTop': '1px'
  3910. },
  3911. 'disabled':
  3912. {
  3913. 'height': '25px',
  3914. 'textAlign': 'center',
  3915. 'background': '#3f3f3f',
  3916. 'color': '#8b8b8b',
  3917. 'fontSize': '12px',
  3918. 'lineHeight': '25px',
  3919. 'over': {'background': '#3f3f3f', 'color': '#8b8b8b'},
  3920. 'out': {'background': '#3f3f3f', 'color': '#8b8b8b'},
  3921. 'cursor': 'default',
  3922. 'marginTop': '1px'
  3923. }
  3924. }
  3925. }
  3926. },
  3927. 'middleBar':
  3928. {
  3929. 'cont':
  3930. {
  3931. 'background': '#2e2e2e',
  3932. 'minWidth': '197px',
  3933. 'height': '471px',
  3934. 'display': 'table-cell',
  3935. 'verticalAlign': 'top',
  3936. 'position': 'relative'
  3937. },
  3938. 'headers':
  3939. {
  3940. 'mask':
  3941. {
  3942. 'width': '180px',
  3943. 'height': '422px',
  3944. 'display': 'inline-block',
  3945. 'verticalAlign': 'top',
  3946. 'overflow': 'hidden',
  3947. 'position': 'relative'
  3948. },
  3949. 'scroll':
  3950. {
  3951. 'position': 'absolute'
  3952. }
  3953. },
  3954. 'scrollBar':
  3955. {
  3956. 'cont':
  3957. {
  3958. 'width': '16px',
  3959. 'height': '421px',
  3960. 'top': 0,
  3961. 'right': 0,
  3962. 'background': '#333333',
  3963. 'borderRight': '1px solid rgba(0,0,0,0.2)',
  3964. 'position': 'absolute'
  3965. },
  3966. 'bar':
  3967. {
  3968. 'width': '16px',
  3969. 'background': '#3b3b3b',
  3970. 'position': 'absolute',
  3971. 'top': '10px',
  3972. 'over': {'background': '#424242'},
  3973. 'out': {'background': '#3b3b3b'},
  3974. 'down': {'background': '#707070'},
  3975. 'up': {'background': '#3d3d3d'},
  3976. 'pointer': 'cursor'
  3977. }
  3978. },
  3979. 'footer':
  3980. {
  3981. 'cont':
  3982. {
  3983. 'width': '197px',
  3984. 'background': '#424343',
  3985. 'borderRight': '1px solid rgba(0,0,0,0.3)',
  3986. 'height': '48px',
  3987. 'display': 'inline-block',
  3988. 'verticalAlign': 'top',
  3989. 'position': 'relative'
  3990. },
  3991. 'pagesBar':
  3992. {
  3993. 'width': '100%',
  3994. 'height': '2px',
  3995. 'background': '#377395'
  3996. },
  3997. 'indicator':
  3998. {
  3999. 'height': '2px',
  4000. 'background': '#898989'
  4001. },
  4002. 'selectAll':
  4003. {
  4004. 'checkBox':
  4005. {
  4006. 'border': '1px solid #5b5e5e',
  4007. 'width': '10px',
  4008. 'height': '10px',
  4009. 'margin': '10px 0 0 5px',
  4010. 'cursor': 'pointer'
  4011. },
  4012. 'span':
  4013. {
  4014. 'width': '20px',
  4015. 'height': '59px',
  4016. 'position': 'absolute',
  4017. 'left': '2px',
  4018. 'top': '2px'
  4019. }
  4020. },
  4021. 'pagesControls':
  4022. {
  4023. 'cont':
  4024. {
  4025. 'width': '85px',
  4026. 'height': '20px',
  4027. 'position': 'absolute',
  4028. 'right': '11px',
  4029. 'top': '10px'
  4030. },
  4031. 'label':
  4032. {
  4033. 'position': 'absolute',
  4034. 'left': '30px',
  4035. 'top': '10px',
  4036. 'padding': 0,
  4037. 'height': '20px',
  4038. 'lineHeight': '20px',
  4039. 'color': '#7f7f7f',
  4040. 'display': 'none',
  4041. 'fontSize': '12px'
  4042. },
  4043. 'icon':
  4044. {
  4045. 'width': '20px',
  4046. 'height': '20px',
  4047. 'backgroundPosition': 'center',
  4048. 'backgroundRepeat': 'no-repeat',
  4049. 'display': 'inline-block',
  4050. 'verticalAlign': 'top',
  4051. 'margin': 0,
  4052. 'padding': 0,
  4053. 'cursor': 'pointer'
  4054. }
  4055. }
  4056. }
  4057. },
  4058.  
  4059. 'tableCellWrapper':
  4060. {
  4061. 'position': 'relative',
  4062. 'display': 'block'
  4063. },
  4064.  
  4065. 'ul':
  4066. {
  4067. 'leftBar':
  4068. {
  4069. 'main':
  4070. {
  4071. 'width': '124px',
  4072. 'listStyleType': 'none',
  4073. 'padding': 0,
  4074. 'margin': '10px 0 0 0'
  4075. },
  4076. 'sub':
  4077. {
  4078. 'width': '124px',
  4079. 'listStyleType': 'none',
  4080. 'padding': 0,
  4081. 'margin': 0
  4082. }
  4083. },
  4084. 'toolbar':
  4085. {
  4086. 'main':
  4087. {
  4088. 'listStyleType': 'none',
  4089. 'margin': 0,
  4090. 'padding': 0,
  4091. 'height': '68px'
  4092. },
  4093. 'sub':
  4094. {
  4095. 'border': '3px solid #404144',
  4096. 'display': 'none',
  4097. 'borderTop': 'none',
  4098. 'background': '#266589',
  4099. 'listStyleType': 'none',
  4100. 'width': '100%',
  4101. 'margin': 0,
  4102. 'padding': 0,
  4103. 'position': 'absolute',
  4104. 'top': '69px',
  4105. 'left': '-3px',
  4106. 'zIndex': 1000
  4107. }
  4108. }
  4109. },
  4110. 'li':
  4111. {
  4112. 'leftBar':
  4113. {
  4114. 'main':
  4115. {
  4116. 'fontSize': '24px',
  4117. 'color': '#999999',
  4118. 'minHeight': '30px',
  4119. 'textIndent': '14px'
  4120. },
  4121. 'sub':
  4122. {
  4123. 'fontSize': '12px',
  4124. 'color': '#909090',
  4125. 'background': 'transparent',
  4126. 'height': '20px',
  4127. 'lineHeight': '20px',
  4128. 'textIndent': '30px',
  4129. 'cursor': 'pointer',
  4130. 'over':
  4131. {
  4132. 'background': '#545555',
  4133. 'color': '#aeaeae'
  4134. },
  4135. 'out':
  4136. {
  4137. 'background': 'transparent',
  4138. 'color': '#909090'
  4139. }
  4140. },
  4141. 'subSelected':
  4142. {
  4143. 'fontSize': '12px',
  4144. 'color': '#aeaeae',
  4145. 'height': '20px',
  4146. 'lineHeight': '20px',
  4147. 'textIndent': '30px',
  4148. 'cursor': 'pointer',
  4149. 'background': '#545555',
  4150. 'over':
  4151. {
  4152. 'background': '#545555',
  4153. 'color': '#aeaeae'
  4154. },
  4155. 'out':
  4156. {
  4157. 'background': '#545555',
  4158. 'color': '#aeaeae'
  4159. }
  4160. }
  4161. },
  4162. 'toolbar':
  4163. {
  4164. 'textOnly':
  4165. {
  4166. 'height': '68px',
  4167. 'display': 'inline-block',
  4168. 'verticalAlign': 'top',
  4169. 'textAlign': 'left',
  4170. 'fontSize': '16px',
  4171. 'lineHeight': '68px',
  4172. 'color': '#cacaca',
  4173. 'cursor': 'pointer',
  4174. 'padding': '0 10px'
  4175. },
  4176. 'withIcon':
  4177. {
  4178. 'height': '68px',
  4179. 'display': 'inline-block',
  4180. 'verticalAlign': 'top',
  4181. 'textAlign': 'left',
  4182. 'fontSize': '16px',
  4183. 'lineHeight': '68px',
  4184. 'color': '#cacaca',
  4185. 'cursor': 'pointer',
  4186. 'padding': '0 10px 0 45px',
  4187. 'position': 'relative'
  4188. },
  4189. 'withDrop':
  4190. {
  4191. 'height': '68px',
  4192. 'display': 'inline-block',
  4193. 'verticalAlign': 'top',
  4194. 'textAlign': 'left',
  4195. 'fontSize': '16px',
  4196. 'lineHeight': '68px',
  4197. 'color': '#cacaca',
  4198. 'cursor': 'pointer',
  4199. 'padding': '0 30px 0 10px',
  4200. 'position': 'relative'
  4201. },
  4202. 'icon':
  4203. {
  4204. 'width': '30px',
  4205. 'height': '30px',
  4206. 'position': 'absolute',
  4207. 'top': '15px',
  4208. 'left': '10px'
  4209. },
  4210. 'drop':
  4211. {
  4212. 'width': '20px',
  4213. 'position': 'absolute',
  4214. 'right': 0,
  4215. 'top': 0,
  4216. 'height': '68px',
  4217. 'lineHeight': '68px',
  4218. 'fontWeight': 'bold',
  4219. 'over': {'backgroundColor': '#266589'},
  4220. 'out': {'backgroundColor': 'transparent'},
  4221. 'backgroundPosition': '0 center',
  4222. 'backgroundRepeat': 'no-repeat'
  4223. },
  4224. 'newIcon':
  4225. {
  4226. 'width': '30px',
  4227. 'height': '30px',
  4228. 'position': 'absolute',
  4229. 'top': '18px',
  4230. 'left': '10px',
  4231. 'padding': 0,
  4232. 'margin': 0,
  4233. 'backgroundPosition': 'center',
  4234. 'backgroundRepeat': 'no-repeat'
  4235. },
  4236. 'sub':
  4237. {
  4238. 'padding': '5px 10px',
  4239. 'over': {'background': '#377395', 'color': '#cacaca'},
  4240. 'out': {'background': 'transparent', 'color': '#aeaeae'},
  4241. 'color': '#aeaeae',
  4242. 'fontSize': '12px',
  4243. 'height': '20px',
  4244. 'lineHeight': '20px',
  4245. 'textAlign': 'center',
  4246. 'borderBottom': '1px solid #404040',
  4247. }
  4248. }
  4249. },
  4250. 'input':
  4251. {
  4252. 'text':
  4253. {
  4254. 'search':
  4255. {
  4256. 'width': '87px',
  4257. 'border': '1px solid #1f1f1f',
  4258. 'height': '14px',
  4259. 'margin': '10px 7px 0 7px',
  4260. 'padding': '5px 15px 5px 10px',
  4261. 'color': '#333333',
  4262. 'fontSize': '12px',
  4263. 'background': '#525252',
  4264. 'focus':
  4265. {
  4266. 'color': '#aeaeae',
  4267. 'outline': 'none'
  4268. },
  4269. 'blur':
  4270. {
  4271. 'color': '#333333'
  4272. }
  4273. }
  4274. }
  4275. },
  4276. 'header':
  4277. {
  4278. 'sender':
  4279. {
  4280. 'fontSize': '14px',
  4281. 'cursor': 'pointer',
  4282. 'color': '#377395',
  4283. 'height': '20px',
  4284. 'lineHeight': '20px',
  4285. 'margin': '2px 0 0 0',
  4286. 'display': 'block',
  4287. 'maxWidth': '96px',
  4288. 'display': 'inline-block',
  4289. 'textOverflow': 'ellipsis',
  4290. 'overflow': 'hidden',
  4291. 'whiteSpace': 'nowrap'
  4292. },
  4293. 'date':
  4294. {
  4295. 'fontSize': '12px',
  4296. 'color': '#4d4d4d',
  4297. 'position': 'absolute',
  4298. 'height': '15px',
  4299. 'right': '10px',
  4300. 'top': '8px',
  4301. 'fontWeight': 'bold',
  4302. 'cursor': 'default'
  4303. },
  4304. 'subject':
  4305. {
  4306. 'fontSize': '14px',
  4307. 'color': '#909090',
  4308. 'width': '100%',
  4309. 'height': '30px',
  4310. 'marginTop': '5px',
  4311. 'textOverflow': 'ellipsis',
  4312. 'overflow': 'hidden',
  4313. 'whiteSpace': 'nowrap'
  4314. },
  4315. 'cont':
  4316. {
  4317. 'width': '150px',
  4318. 'height': '49px',
  4319. 'borderBottom': '1px solid #292929',
  4320. 'position': 'relative',
  4321. 'padding': '5px 5px 5px 25px',
  4322. 'fontWeight': 'normal'
  4323. },
  4324. 'contUnRead':
  4325. {
  4326. 'width': '150px',
  4327. 'height': '49px',
  4328. 'fontWeight': 'bold',
  4329. 'borderBottom': '1px solid #242424',
  4330. 'position': 'relative',
  4331. 'padding': '5px 5px 5px 25px',
  4332. 'background': '#292929'
  4333. },
  4334. 'checkBox':
  4335. {
  4336. 'border': '1px solid #5b5e5e',
  4337. 'width': '10px',
  4338. 'height': '10px',
  4339. 'margin': '10px 0 0 5px',
  4340. },
  4341. 'span':
  4342. {
  4343. 'width': '20px',
  4344. 'height': '59px',
  4345. 'position': 'absolute',
  4346. 'left': '2px',
  4347. 'top': 0,
  4348. 'borderBottom': '1px solid #292929',
  4349. 'cursor': 'pointer'
  4350. }
  4351. },
  4352. 'message':
  4353. {
  4354. 'subject':
  4355. {
  4356. 'color': '#6c6d6d',
  4357. 'fontSize': '18px',
  4358. 'fontWeight': 'bold',
  4359. 'padding': '10px 0 5px 0',
  4360. 'width': '100%',
  4361. 'borderBottom': '2px solid #3f3e3e',
  4362. 'margin': 0
  4363. },
  4364. 'date':
  4365. {
  4366. 'fontSize': '12px',
  4367. 'color': '#6c6d6d',
  4368. 'position': 'absolute',
  4369. 'top': '5px',
  4370. 'right': '10px'
  4371. },
  4372. 'from':
  4373. {
  4374. 'position': 'relative',
  4375. 'fontSize': '12px',
  4376. 'color': '#6c6d6d',
  4377. 'minHeight': '12px',
  4378. 'padding': '5px 5% 0 0',
  4379. 'margin': '0',
  4380. 'display': 'block',
  4381. 'whiteSpace': 'nowrap',
  4382. 'overflow': 'hidden',
  4383. 'maxWidth': '95%'
  4384. },
  4385. 'expand':
  4386. {
  4387. 'width': '5%',
  4388. 'height': '14px',
  4389. 'padding': 0,
  4390. 'lineHeight': '14px',
  4391. 'display': 'block',
  4392. 'position': 'absolute',
  4393. 'bottom': '2px',
  4394. 'background': '#292929',
  4395. 'right': 0,
  4396. 'cursor': 'pointer',
  4397. 'backgroundPosition': 'center',
  4398. 'backgroundRepeat': 'no-repeat',
  4399. 'opacity': 0.8,
  4400. 'over': {'opacity': 1},
  4401. 'out': {'opacity': 0.8}
  4402. },
  4403.  
  4404. 'actionLink':
  4405. {
  4406. 'display': 'inline-block',
  4407. 'verticalAlign': 'top',
  4408. 'color': '#b8b8b8',
  4409. 'cursor': 'pointer',
  4410. 'marginLeft': '20px',
  4411. 'opacity': 0.8,
  4412. 'over': {'opacity': 1},
  4413. 'out': {'opacity': 0.8}
  4414. },
  4415.  
  4416. 'body':
  4417. {
  4418. 'fontSize': '14px',
  4419. 'color': '#848585',
  4420. 'marginTop': '30px',
  4421. 'paddingBottom': '20px',
  4422. 'borderBottom': '1px solid #3f3e3e'
  4423. }
  4424. },
  4425. 'link':
  4426. {
  4427. '_12':
  4428. {
  4429. 'fontSize': '12px',
  4430. 'color': '#377395',
  4431. 'textDecoration': 'none',
  4432. 'cursor': 'pointer',
  4433. 'marginRight': '10px',
  4434. 'display': 'inline-block'
  4435. },
  4436. '_14':
  4437. {
  4438. 'fontSize': '14px',
  4439. 'color': '#377395',
  4440. 'textDecoration': 'none',
  4441. 'cursor': 'pointer'
  4442. }
  4443. },
  4444. 'searchResults':
  4445. {
  4446. 'cont':
  4447. {
  4448. 'border': '1px solid #1f1f1f',
  4449. 'background': '#266589',
  4450. 'position': 'absolute',
  4451. 'top': '37px',
  4452. 'left': '7px',
  4453. 'width': '112px',
  4454. 'display': 'none'
  4455. },
  4456. 'li':
  4457. {
  4458. 'main':
  4459. {
  4460. 'margin': 0,
  4461. 'padding': 0
  4462. },
  4463. 'sub':
  4464. {
  4465. 'color': '#969696',
  4466. 'borderBottom': '#404040',
  4467. 'textIndent': '15px',
  4468. 'cursor': 'pointer',
  4469. 'over': {'background': '#377395', 'color': '#b4b4b4'},
  4470. 'out': {'background': 'transparent', 'color': '#969696'},
  4471. 'fontSize': '12px',
  4472. 'height': '19px',
  4473. 'lineHeight': '20px',
  4474. 'borderBottom': '1px solid #377395'
  4475. }
  4476. },
  4477. 'count':
  4478. {
  4479. 'color': '#919090',
  4480. 'position': 'absolute',
  4481. 'fontSize': '12px',
  4482. 'right': '10px',
  4483. 'top': '2px'
  4484. },
  4485. 'ul':
  4486. {
  4487. 'listStyleType': 'none',
  4488. 'margin': 0,
  4489. 'padding': 0,
  4490. 'width': '100%'
  4491. },
  4492. 'text':
  4493. {
  4494. 'position': 'relative',
  4495. 'backgroundImage': '',
  4496. 'borderBottom': '1px solid rgba(0,0,0,0.30)',
  4497. 'height': '24px',
  4498. 'color': '#292929',
  4499. 'fontSize': '12px',
  4500. 'margin': 0,
  4501. 'padding': '0 5px',
  4502. 'lineHeight': '24px'
  4503. }
  4504. },
  4505. 'compose':
  4506. {
  4507. 'window':
  4508. {
  4509. 'background': '#292929',
  4510. 'width': '100%',
  4511. 'height': '471px',
  4512. 'paddingTop': '69px',
  4513. 'position': 'relative',
  4514. 'fontFamily': 'vrinda',
  4515. 'display': 'table'
  4516. },
  4517. 'topBar':
  4518. {
  4519.  
  4520. },
  4521. 'leftBar':
  4522. {
  4523. 'cont':
  4524. {
  4525. 'minWidth': '256px',
  4526. 'position': 'relative',
  4527. 'background': '#3a3b3b',
  4528. 'height': '471px',
  4529. 'display': 'table-cell',
  4530. 'verticalAlign': 'top'
  4531. },
  4532. 'recipients':
  4533. {
  4534. 'toText':
  4535. {
  4536. 'color': '#8d8c8c',
  4537. 'fontSize': '12px',
  4538. 'margin': '10px 0 5px 15px'
  4539. },
  4540. 'main':
  4541. {
  4542. 'position': 'relative',
  4543. 'border': '1px solid #1f1f1f',
  4544. 'background': '#323232',
  4545. 'width': '238px',
  4546. 'margin': '0 auto',
  4547. 'minHeight': '20px',
  4548. 'maxHeight': '180px'
  4549. },
  4550. 'mask':
  4551. {
  4552. 'position': 'relative',
  4553. 'overflow': 'hidden',
  4554. 'width': '100%',
  4555. 'height': '100%',
  4556. 'maxHeight': '180px'
  4557. },
  4558. 'cont':
  4559. {
  4560. 'padding': '5px 20px 0 5px',
  4561. 'position': 'absolute',
  4562. 'boxSizing': 'border-box',
  4563. 'MozBoxSizing': 'border-box',
  4564. 'width': '100%',
  4565. 'lineHeight': '10px'
  4566. },
  4567. 'scrollbar':
  4568. {
  4569. 'cont':
  4570. {
  4571. 'position': 'absolute',
  4572. 'top': 0,
  4573. 'right': 0,
  4574. 'width': '16px',
  4575. 'height': '100%',
  4576. 'maxHeight': '180px',
  4577. 'background': '#363636'
  4578. },
  4579. 'bar':
  4580. {
  4581. 'position': 'absolute',
  4582. 'top': '10px',
  4583. 'background': '#3d3d3d',
  4584. 'width': '16px',
  4585. 'over': {'background': '#424242'},
  4586. 'out': {'background': '#3d3d3d'},
  4587. 'down': {'background': '#707070'},
  4588. 'up': {'background': '#3d3d3d'}
  4589. }
  4590. },
  4591. 'recipient':
  4592. {
  4593. 'cont':
  4594. {
  4595. 'margin': '0 5px 5px 0',
  4596. 'background': '#266589',
  4597. 'color': '#bcbcbc',
  4598. 'fontSize': '12px',
  4599. 'height': '20px',
  4600. 'lineHeight': '20px',
  4601. 'padding': '0 20px 0 10px',
  4602. 'textOverflow': 'ellipsis',
  4603. 'maxWidth': '100%',
  4604. 'overflow': 'hidden',
  4605. 'display': 'inline-block',
  4606. 'position': 'relative'
  4607. },
  4608. 'remove':
  4609. {
  4610. 'position': 'absolute',
  4611. 'top': 0,
  4612. 'right': 0,
  4613. 'width': '15px',
  4614. 'height': '20px',
  4615. 'lineHeight': '20px',
  4616. 'color': '#bcbcbc',
  4617. 'over': {'background': '#377395'},
  4618. 'out': {'background': 'transparent'},
  4619. 'fontSize': '10px',
  4620. 'textAlign': 'center',
  4621. 'cursor': 'pointer'
  4622. }
  4623. },
  4624. 'textField':
  4625. {
  4626. 'height': '15px',
  4627. 'lineHeight': '15px',
  4628. 'maxWidth': '100%',
  4629. 'minWidth': '20%',
  4630. 'width': '90%',
  4631. 'border': 'none',
  4632. 'background': 'transparent',
  4633. 'outline': 'none',
  4634. 'focus': {'outline': 'none', 'background': 'transparent'},
  4635. 'blur': {'outline': 'none', 'background': 'transparent'},
  4636. 'color': '#919191',
  4637. 'margin': 0,
  4638. 'padding': '0 5px 5px 0'
  4639. },
  4640. 'textFieldCont':
  4641. {
  4642. 'display': 'block',
  4643. 'margin': 0,
  4644. 'padding': 0,
  4645. 'lineHeight': '10px'
  4646. },
  4647. 'searchBox':
  4648. {
  4649. 'cont':
  4650. {
  4651. 'border': '1px solid #1f1f1f',
  4652. 'background': '#323232',
  4653. 'position': 'absolute',
  4654. 'left': '7px',
  4655. 'width': '243px',
  4656. 'maxHeight': '244px',
  4657. 'display': 'none'
  4658. },
  4659. 'mask':
  4660. {
  4661. 'width': '227px',
  4662. 'height': '100%',
  4663. 'overflow': 'hidden',
  4664. 'position': 'relative'
  4665. },
  4666. 'scrollbar':
  4667. {
  4668. 'cont':
  4669. {
  4670. 'position': 'absolute',
  4671. 'top': 0,
  4672. 'right': 0,
  4673. 'width': '16px',
  4674. 'height': '100%',
  4675. 'background': '#363636'
  4676. },
  4677. 'bar':
  4678. {
  4679. 'position': 'absolute',
  4680. 'top': '10px',
  4681. 'background': '#3d3d3d',
  4682. 'width': '16px',
  4683. 'over': {'background': '#424242'},
  4684. 'out': {'background': '#3d3d3d'},
  4685. 'down': {'background': '#707070'},
  4686. 'up': {'background': '#3d3d3d'}
  4687. }
  4688. },
  4689. 'itemsCont':
  4690. {
  4691. 'width': '100%',
  4692. 'position': 'absolute',
  4693. 'top': 0
  4694. },
  4695. 'item':
  4696. {
  4697. 'cont':
  4698. {
  4699. 'height': '48px',
  4700. 'borderBottom': '1px solid #3e3e3e',
  4701. 'color': '#8e8e8e',
  4702. 'background': 'transparent',
  4703. 'over': {'background': '#266589', 'color': '#bcbcbc'},
  4704. 'out': {'background': 'transparent', 'color': '#8e8e8e'}
  4705. },
  4706. 'contSelected':
  4707. {
  4708. 'height': '48px',
  4709. 'borderBottom': '1px solid #3e3e3e',
  4710. 'color': '#bcbcbc',
  4711. 'background': '#266589'
  4712. },
  4713. 'text':
  4714. {
  4715. 'fontSize': '14px',
  4716. 'textOverflow': 'ellipsis',
  4717. 'height': '15px',
  4718. 'lineHeight': '15px',
  4719. 'padding': '5px 10px 0 10px',
  4720. 'margin': 0
  4721. }
  4722. }
  4723. }
  4724. },
  4725. 'contacts':
  4726. {
  4727. 'cont':
  4728. {
  4729. 'position': 'absolute',
  4730. 'bottom': 0
  4731. }
  4732. },
  4733. 'tableOptions':
  4734. {
  4735. 'button':
  4736. {
  4737. 'height': '25px',
  4738. 'width': '40%',
  4739. 'margin': '50px 0 0 15px',
  4740. 'textAlign': 'center',
  4741. 'background': '#4e4e4e',
  4742. 'color': '#8b8b8b',
  4743. 'fontSize': '12px',
  4744. 'lineHeight': '25px',
  4745. 'over': {'background': '#266589', 'color': '#c2c2c2'},
  4746. 'out': {'background': '#4e4e4e', 'color': '#8b8b8b'},
  4747. 'cursor': 'pointer',
  4748. 'display': 'inline-block'
  4749. },
  4750. 'inputCont':
  4751. {
  4752. 'position': 'relative'
  4753. },
  4754. 'input':
  4755. {
  4756. 'width': '150px',
  4757. 'border': '1px solid #1f1f1f',
  4758. 'background': '#323232',
  4759. 'color': '#6c6d6d',
  4760. 'fontSize': '12px',
  4761. 'margin': '10px 15px 0 15px',
  4762. 'paddingLeft': '10px',
  4763. 'outline': 'none',
  4764. 'focus': {'outline': 'none'},
  4765. 'blur': {'outline': 'none'},
  4766. 'height': '23px',
  4767. 'lineHeigt': '25px'
  4768. },
  4769. 'label':
  4770. {
  4771. 'display': 'inline-block',
  4772. 'verticalAlign': 'top',
  4773. 'height': '25px',
  4774. 'marginTop': '10px',
  4775. 'lineHeight': '25px',
  4776. 'color': '#6c6d6d',
  4777. 'fontSize': '12px'
  4778. },
  4779. 'span':
  4780. {
  4781. 'position': 'absolute',
  4782. 'top': '-5px',
  4783. 'left': '25px',
  4784. 'height': '20px',
  4785. 'lineHeight': '20px',
  4786. 'color': '#6c6d6d',
  4787. 'width': '190px',
  4788. 'fontSize': '12px'
  4789. },
  4790. 'checkbox':
  4791. {
  4792. 'border': '1px solid #5b5e5e',
  4793. 'width': '10px',
  4794. 'height': '10px',
  4795. 'margin': '15px 0 0 15px',
  4796. 'cursor': 'pointer',
  4797. 'position': 'relative'
  4798. }
  4799. }
  4800. },
  4801. 'rightBar':
  4802. {
  4803. 'cont':
  4804. {
  4805. 'height': '471px',
  4806. 'display': 'table-cell',
  4807. 'verticalAlign': 'top',
  4808. 'position': 'relative',
  4809. 'width': '100%'
  4810. },
  4811. 'msgMask':
  4812. {
  4813. 'overflow': 'hidden',
  4814. 'position': 'relative',
  4815. 'height': '471px',
  4816. 'width': 'inherit',
  4817. },
  4818. 'msgCont':
  4819. {
  4820. 'width': '100%',
  4821. 'position': 'absolute',
  4822. 'top': 0,
  4823. 'overflowX': 'hidden',
  4824. 'padding': '107px 30px 20px 20px',
  4825. 'boxSizing': 'border-box',
  4826. 'MozBoxSizing': 'border-box'
  4827. },
  4828. 'msgHeader':
  4829. {
  4830. 'position': 'absolute',
  4831. 'top': 0,
  4832. 'left': 0,
  4833. 'padding': '0 30px 0 14px',
  4834. 'boxSizing': 'border-box',
  4835. 'MozBoxSizing': 'border-box',
  4836. 'background': '#292929',
  4837. 'width': '100%'
  4838. },
  4839. 'scrollBar':
  4840. {
  4841. 'cont':
  4842. {
  4843. 'width': '16px',
  4844. 'position': 'absolute',
  4845. 'background': '#333333',
  4846. 'height': '471px',
  4847. 'top': 0,
  4848. 'right': 0
  4849. },
  4850. 'bar':
  4851. {
  4852. 'width': '16px',
  4853. 'background': '#3b3b3b',
  4854. 'position': 'absolute',
  4855. 'top': '10px',
  4856. 'over': {'background': '#424242'},
  4857. 'out': {'background': '#3b3b3b'},
  4858. 'down': {'background': '#707070'},
  4859. 'up': {'background': '#3d3d3d'},
  4860. 'pointer': 'cursor'
  4861. }
  4862. },
  4863. 'textField':
  4864. {
  4865. 'color': '#6c6d6d',
  4866. 'fontSize': '18px',
  4867. 'fontWeight': 'bold',
  4868. 'width': '100%',
  4869. 'border': 'none',
  4870. 'borderBottom': '2px solid #3f3e3e',
  4871. 'margin': '0',
  4872. 'padding': '10px 0 5px 0',
  4873. 'outline': 'none',
  4874. 'background': 'transparent',
  4875. 'focus': {'outline': 'none'},
  4876. 'blur': {'outline': 'none'},
  4877. 'height': '25px',
  4878. 'lineHeigt': '25px'
  4879. },
  4880. 'textArea':
  4881. {
  4882. 'margin': 0,
  4883. 'padding': 0,
  4884. 'border': 'none',
  4885. 'width': '100%',
  4886. 'minHeight': '30px',
  4887. 'height': '100px',
  4888. 'cursor': 'text'
  4889. },
  4890. 'expand':
  4891. {
  4892. 'position': 'absolute',
  4893. 'top': '7px',
  4894. 'right': '27px',
  4895. 'backgroundPosition': 'center',
  4896. 'backgroundRepeat': 'no-repeat',
  4897. 'width': '30px',
  4898. 'height': '30px',
  4899. 'opacity': 0.6,
  4900. 'cursor': 'pointer',
  4901. 'over': {'opacity': 1},
  4902. 'out': {'opacity': 0.6}
  4903. },
  4904. 'toolbar':
  4905. {
  4906. 'cont':
  4907. {
  4908. 'height': '20px',
  4909. 'margin': '10px 0 20px 0'
  4910. },
  4911. 'icon':
  4912. {
  4913. 'display': 'inline-block',
  4914. 'verticalAlign': 'top',
  4915. 'cursor': 'pointer',
  4916. 'backgroundRepeat': 'no-repeat',
  4917. 'backgroundPosition': 'center',
  4918. 'width': '26px',
  4919. 'height': '20px',
  4920. 'opacity': 0.5,
  4921. 'over': {'opacity': 0.8},
  4922. 'out': {'opacity': 0.5}
  4923. },
  4924. },
  4925. 'origionalMsg':
  4926. {
  4927. 'cont':
  4928. {
  4929. 'width': '100%',
  4930. 'background': '#747474',
  4931. 'color': '#292929',
  4932. 'position': 'relative',
  4933. 'border': '1px solid #1d1d1d',
  4934. 'fontSize': '14px',
  4935. 'padding': '20px',
  4936. 'boxSizing': 'border-box',
  4937. 'MozBoxSizing': 'border-box',
  4938. 'margin': '10px 0'
  4939. },
  4940. 'close':
  4941. {
  4942. 'width': '20px',
  4943. 'height': '20px',
  4944. 'position': 'absolute',
  4945. 'top': '3px',
  4946. 'right': '3px',
  4947. 'color': '#080808',
  4948. 'textAlign': 'center',
  4949. 'lineHeight': '20px',
  4950. 'fontSize': '12px',
  4951. 'fontWeight': 'bold',
  4952. 'cursor': 'pointer'
  4953. },
  4954. 'date':
  4955. {
  4956. 'fontSize': '12px',
  4957. 'position': 'absolute',
  4958. 'top': '5px',
  4959. 'right': '12px',
  4960. 'margin': 0
  4961. },
  4962. 'from':
  4963. {
  4964. 'position': 'relative',
  4965. 'fontSize': '14px',
  4966. 'paddingTop': '5px',
  4967. 'margin': '0 0 10px 0',
  4968. 'fontWeight': 'bold'
  4969. },
  4970. }
  4971. }
  4972. }
  4973. },
  4974.  
  4975. res:
  4976. {
  4977. 'controls':
  4978. {
  4979. 'next': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAXUlEQVQYV2Oct3DhBsZ//xISExM/MOABjPMXLvzP8P//AyAGqk08gEstRCECNCTGxzdiU4yukAGoa2FSfHwCumJ0hY1AExtwmgg05SHUQ7jdSLSv8QUJshwj1RUCALdQMQvYKq1HAAAAAElFTkSuQmCC',
  4980. 'previous': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAZUlEQVQYV2NkwALmz58vwMDIOD8xISEQJs2Irg6oyAGkCIgVEuPj4fIoCucvXNgA1FgP04xV4byFCxcAdcUj20CZiTCTQG78z8QEMl0ep4lIigVAipPi4wNw+hpbcIHEMIKHYoUATvMeC0yTB00AAAAASUVORK5CYII=',
  4981. 'first': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAd0lEQVQYV2Ocv3DhfwYg+PfnD19ycvJnEHv+/PkCDIyM8xMTEgJBfBBgRFcIVOQAUgTEConx8YxYFTKxsBQDJephktgV/v+/lImRMRqmCERTaCLUMyA3/mdiWgB0nDxOE5F9DVKcFB8fAPcMspvwseHeJ6SBaIUAZidKC2YCLWUAAAAASUVORK5CYII=',
  4982. 'last': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAdElEQVQYV2Oct3DhBsZ//xISExM/MADB3LlzeZlYWD6B2Inx8YwgGgQY5y9c+J/h//8HQAxUm3gAv0KYNgaGhn9//vThNhGhkOHf//9LmRgZo7FbjVDYCDSxF6eJ/xkYHkI9hNuNRPsayXl4mfBwIqSBaIUAjElLC7H537YAAAAASUVORK5CYII='
  4983. },
  4984. 'tools':
  4985. {
  4986. 'bold': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAjElEQVQ4jeXSIQoCURCA4QWrYLJ6AMEqWD2DN/AYJu+xySSYBG9gtQqCYLIKewDhs0xYlo3zBPGHgceUD4ZXVX8balw6s8M0Gzrr74VJNtTEe4AlnoGti0Ct3b44hBUa3DHMhro9vv0Z5tlQ+3QjbAI7FoNiNw7oVhraBnTKhvp6Y1ESuuKAWRryU30AvDon2Jg0sc0AAAAASUVORK5CYII=)',
  4987. 'italic': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAbElEQVQ4jc3SsQmDUABFUSshrZWQDQIOIKQSskoqIasEUrmKYBVwEsEqM5w02UD+I3eB09yq+udQo0tAPdYEdMeUgJ54JKAZtwS04VwaafApivygK94JKHbcC2MCWjAkoB1taSR23AmX4tCRvtMVYAewYq2yAAAAAElFTkSuQmCC)',
  4988. 'underline': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAjElEQVQ4je3TsQkCQRBG4QNBuMgabMJW7OBSwcgChIss4DoQTO3ASDC1BlMjo4PPwAEvWRB2OQzuRcP+MI8ZZqvqn8ATbSLb+bCYRJNodFFdQvRAl8ha9NmSaHbBNZGdcS8l2sZ6DpgP3hv02JcSzXD05YZX1KehvJRwiXVMtsGqqGAU4rR/Jf8v5fIG4y4UzcoLKWQAAAAASUVORK5CYII=)',
  4989. 'fontColor': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAnUlEQVQ4jeWSUQ2AMAwFkYAEJEwCEpCABCQgAQmTgoRJQMIcHD9tWCCULGwJCS9p0o+2t66vaTIE9Bzqc3qzBPgE5GtBWiACAdgkb2uARtlkBCbNa4CCbiEBEEpD3Pkuyb1cSdBlaOJAb7RmgyL3iqUgaoIVmE+xFjNFMuxyC2DQR7yFdDJoM2r0W7s3oEWGLEaNf6r5hgyXmfoPaAdIK7bxpwVYhAAAAABJRU5ErkJggg==)',
  4990. 'highlight': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAbklEQVQ4je3SUQ2AMAyE4UlAyiRMwiRMAlKQgASk4eDnpSzNAsmStXuBE9AvvVwIAwEKcAJx5E4PcscHa5CKzUAAyo88IdkdESjKslyRVWrTmDmS9AeCZWtkaeraTAEFJeAQZHdBpuVlyt35BnQBq8S/rmUi4OkAAAAASUVORK5CYII=)',
  4991. 'player': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAoUlEQVQ4jc3PsQpBYQCG4VMmk9XkJpTJBSjX4AJMymo6ZTIppUzuQLkMk9WkTCYXoNRjIcrf4fSfv7wX8D19WfaPoYERJminQpo4e3VDPwWU+2yXAloHoFMKqBeA5pVDD2z+hhxQT4FMA4+2qFWJjAPIs2VVSAvXAggGVUCLLwgcYpEaLj9A0I2BOj8ikMdAwxLQJgaalYD2MdCqBHQs2roDRL7rpNTLvRUAAAAASUVORK5CYII=)',
  4992. 'alliance': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAABGklEQVQ4jc3U0UdDYRjH8RGxq66ivyEiRv9EtxG7jRGxq4gRIyJijIjoPxgR3XYVY3Q1RoyuInYVMcani206PXsdOxT9rs55/J7f93nf876nVPqPwhrqaKDyV5ANvPnWBLu/FVzHKXbQtKhu9BWFbOIjE9jHbQL0ilao1YqArkPzBNUEqIWnCC8CaiRCj8P0A1QSvscioDIeMs1dXCZC71DLvL9gqwhoH++z5r70QZjrCu3Z8ycusLoM5DAEHWCcA4IjjMJKV/Ig26Yffq5eZto8DXAeavU8UCeYT8KkeYo7MUI5BVkPq0k156np558DqinQXjCNTW/8surgPtRuUqCzYBqanqBl9WzxovdSoGhKNeZpaPFADOf5X3Iixhnv5aZoAAAAAElFTkSuQmCC)',
  4993. 'coords': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAA00lEQVQ4jc3SIQoCQRTG8YVNWz2AYDIJpk0eYGGryQMIgrDJKphMgskDmASrJzGZBGFBEASTICz8DY7weDiLzkzwi/Ox78fOvCj6twApsAPOvHICtkA7JDIDKj7nDgxDIIUYegFSc54BD9HlPkgCXMWwQvVL0R18oFxdk4YWqu+4QhM16Ai0TNcFbqrvu0IjywKUlnO3dwJ6loG2NF0hvQx12TshAtMPbsvYF2p88VclkHhBBhvUIBWQeSMCW1mgaTDEQDGwVsgGiINCAnwvx/yX757Sbx5xpkiHLQAAAABJRU5ErkJggg==)',
  4994. 'table': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAgUlEQVQ4je3RIQ6DQBRFUSyKBIvForqnJii2UlvFhpqQsIbaWuzBjJ0MM2JSwUuee/k3P7dpIkGLR2bb2L1oMMnP9NegEQc2fBLdwnbMBgXYju7CrsNeBKkGwoAfVrwTXcN2KAH1+GLBM9ElbPvSr25Ht6OKoNqOXpgvOJrDNuroBLUtQ3//HcJ5AAAAAElFTkSuQmCC)',
  4995. 'insertunorderedList': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAO0lEQVQ4jWNgGEjw//9/g////z/4//+/Aa0tevAfAh4giRENSLEIw0c0sWj4gdHEMJoY4GA0MYzMxAAA6QxndHKcgPEAAAAASUVORK5CYII=)',
  4996. 'insertorderedList': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAcElEQVQ4je3SMQ2AQAxG4UpBAhKQgDSkIOEkIAEJOPhYbrgQBiCUiTe2aV7b/BEnYIGz3qugP4rc4K4sX/R4ux+s9XNLtqjDgLWppYRhqFeN2SJVVC4P/UREoGD7KnUFc1NLCUOHqR3KEpWautdetwOK5H3Pn7B4CQAAAABJRU5ErkJggg==)',
  4997. 'indent': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAUUlEQVQ4jdWRwQkAIAwD3X+KbBq/UiIF20p7z2A8jGt1hYLZohJI4peIVqamC095dCGyuOjSh1sMvKRWJIQQWfxvzKUQWboI7qHxpE7WQvTKBmYgK+hcRGVIAAAAAElFTkSuQmCC)',
  4998. 'outdent': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAS0lEQVQ4jWNgGEzgPxYwtC0aVOD///8LyNFEEKBbQlZwkmIRzBKaxhuyJTRNKFSziG5BR4xFyJaRbRGJjlpAF4uoAuiSsuhqETUAAAP+K+ha7EZ4AAAAAElFTkSuQmCC)',
  4999. 'justifyleft': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAALElEQVQ4jWNgGEjwn0Iw+CwafoBuQTUaJ2QDUoOO7KCkm0XDD9AtqIZ0nAAA5z6+ULjEuxYAAAAASUVORK5CYII=)',
  5000. 'justifycenter': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAALElEQVQ4jWNgGEjwn0Iw+Cwa3oBuwTUaLyQB8hI1GcFIN4uGN6BbcA25eAEAdxKecO5FA68AAAAASUVORK5CYII=)',
  5001. 'justifyright': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAALElEQVQ4jWNgGEjwn0Iw+Cwa/oBuQTcaR0QDUoOK7KCjm0XDH9At6IZUHAEA8oq+UNVXS0cAAAAASUVORK5CYII=)',
  5002. 'link': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAiElEQVQ4je2S3Q2AIAyEHcFRGIERGIERHIERGMURGMUR3ODzwWoqIUZ8MJhwSV96lOvPDUPHbwEEIGXhFG8KfHgjAjADFvDAIjkLjMAq4SU3C/9cTD5IVd3tdQlYawrOztR0d7i8bVLos9UdU0Q59KSOPwJO+EWZIVabQYnl9jWKdwW+TqSjKWyaolPi2Vd/5AAAAABJRU5ErkJggg==)',
  5003. // 'emotions': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAABBklEQVQ4jbWVwZGDMAxFXQIlUEJKoBRKoASXQgkpYUvgHIt5ogN34BzWyng8hGB2oxkO0gh96+vLdu6EAf0Kkyg/5bfCBPRnany0AF6UZIUDDAGGFaagLKKkAP5PILIxixIDDAcHGUSJsjFfAsmdxAfcPuU+4JYP5JtAgD5TMpi/11UZz52lppkZ/+bn4UegK/PqeFCWFabTQDb4wo+ipJrGOm7KPA0UlOVIAG//+6XvOtARHXmXuktAu9TBWOeZaEwAzdTVYtiTOtDlhX0VbhZDLW/nnJONuyhJNubXIitLRVubvN91ITAG8AG8wGgglxe26OL7V1BRyIuSjP+vXKpm//FMPAHSdrKARyrVTwAAAABJRU5ErkJggg==)',
  5004. // 'fontFamily': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAtUlEQVQ4je2SSw0EIQxARwoSkLASkDASRsJKGAlIQAISkIAEHLy9tNmGMJPhwGGTbdKET9vX37b95ecFcHzFrQQdBnSsBBWgipZVEK+VAKec/QqQBndmVucKUAWyuRegdjYJaGaO+yzE945mMbx5S8AuFSeAWVDkWuIgqaA+s6AmrXt3WoFmAFXgRfQ5SLIbDt4sSACybaUkMgWKNsBFEtHYBeCl1c2Amrbn7l8WQKvKuiwjnw/EnHrb6C3cXgAAAABJRU5ErkJggg==)',
  5005. // 'fontSize': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAtElEQVQ4jbWUXRGGIBBFjUAEIhDhi0IEIxjBCEYwghGM8EWwwfHlMoM74gM/d4bBZZk9DnthmjoICMAfCD3qlSBOEDS7UaCTp84hoK4CtuF/qx7kGtNwYBZg17yZfJ8eyUmX/c7yDrgEuapcB/xUYFW8KI5mX9s9ykzgFXvFR1XBAiQdyWHWH/AeoMi31l6g5KblZWBNUQsJX1bNrB5bQakPcyGfjnVvBaV74Qv5/LV43WN1AxG4aOeiSzd1AAAAAElFTkSuQmCC)',
  5006. },
  5007. 'mail': "data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACUAAAAYCAYAAAEKfQTmAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN\/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz\/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH\/w\/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA\/g88wAAKCRFRHgg\/P9eM4Ors7ONo62Dl8t6r8G\/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt\/qIl7gRoXgugdfeLZrIPQLUAoOnaV\/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl\/AV\/1s+X48\/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H\/LcL\/\/wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93\/+8\/\/UegJQCAZkmScQAAXkQkLlTKsz\/HCAAARKCBKrBBG\/TBGCzABhzBBdzBC\/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD\/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q\/pH5Z\/YkGWcNMw09DpFGgsV\/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY\/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4\/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L\/1U\/W36p\/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N\/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26\/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE\/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV\/MN8C3yLfLT8Nvnl+F30N\/I\/9k\/3r\/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt\/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi\/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a\/zYnKOZarnivN7cyzytuQN5zvn\/\/tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO\/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3\/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA\/0HIw6217nU1R3SPVRSj9Yr60cOxx++\/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3\/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX\/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8\/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb\/1tWeOT3dvfN6b\/fF9\/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR\/cGhYPP\/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF\/6i\/suuFxYvfvjV69fO0ZjRoZfyl5O\/bXyl\/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o\/2j5sfVT0Kf7kxmTk\/8EA5jz\/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5\/wAAgOkAAHUwAADqYAAAOpgAABdvkl\/FRgAAButJREFUeNpifPr0KYO0tHQmAxJgZGBgMDx69OhRVlZWTpggCwMDA8OpU6duS0lJ6cEEAQAAAP\/\/YmRgYEDR+v\/\/\/+ksp06dmgYT+P79+ydGRsbzLPfv34erev369XMGBgYGAAAAAP\/\/YmBgYDAMDAxsv3Hjxn9s2MnJqYGBgcGCkYGBwXDXrl3nYLpOnjy5hYODg1NfX98ZJubm5mbJzMDAIHn+\/PlnGhoajh8\/fmTg4eFR4+DgUPr48SPDx48fGbq7u1uePXt2GwAAAP\/\/dI0xCsIwAEV\/VQISyNTSpkMRuhQPIHToATxAzyHewNMIHXubLAVRawYzfQhkKXXRpeCDzxv+8CIARwA7\/OcZGWNma+2gtS6Xr3PuHsdxsSIJKWVZ1\/WJJH5rmuYshChIYt227SWEgGmaHuM43rIs2\/d9f03TdFtV1SGEgKjrutl7\/5ZSJsscyZdSKt+QBIDk6yU5SXwAAAD\/\/5xSsUqFUAA999HkUPBwfIu4C28QkeAiRE4RtDSFm9APtAvOfURORrTcFqHJC8JtuYSDo4tIaos83nCRwKYeEUHxDpzlcM4ZDocAOAJwXNf1EyFkgT1gGMY5gJwAWJdlKQGgqipRFMVrGIbXfxWkaXpnmubKtu0TALAsyyUA1pxz+dNMKT3Nsuxe07Tll6aU2vi+f8Y557\/43QUAjOO4o5Typeu6DWPseZqmZdu275TSoGmaN6XUIWOMD8OwFULw77nd65MkkfM8f+R5nnqed\/XfrYQQD47jXBBCDoIgcAmAla7rl1EU3WJPxHF80\/f94yep5A+aRhxH8ef5Kx50kkxdup2DU6losMQ\/4KJEKUW4TWg4XKQ1oi3kpHCWDieJWBJKb3FxchLCUUodNGbRrZTeIG51c+ns\/X73u9qhWKQtJbZf+CwP3uPB+3oA3AVwiP+7DySZTD6WZfleJpN59C8J4\/H4fafT2RPy+fz9cDgcz2azJ5RS7IIsyy+CwWBIUZQDwjmHz+fb6\/V6zWg0ejwcDk8JIb6\/tXBd14nFYrXJZHIBAJxzEMdxYNs2AGAwGJwbhvE2kUiEAoHA\/p9CFovFZ9M0r0aj0cXGxxiDwBiDbds\/KRQKJcaYoGlac1u3bRutVuv1crn8WiwWj7d1xhiETaNtptPpp0ql8iwej2c3WiqVeqIoytPZbPZltVp9+y3o10blcrmey+WKlFJimuY7TdNeqaqq9fv9N5RSkk6nj+r1+sttj+M48NRqtctIJPIQAFRVPdF1vXmT2avV6vN2u30GAJZlDQTOOSil6Ha7541Go3nT6XVdPzMM45RS+qNRqVS6FEVRlCTpgBBye5dn5Jyv5vP5tSAIHq\/f738gSVJIFMU7rutiF9br9S2v10ssy\/r4XYwMDAysEhIS2StWrEhUVlbWYxgg8Pjx4+txcXHz7ty5M5mZgYFBv6urK0FQUFA4JCSk+969e1cNDQ21GRkZ2Un1Lan4+\/fvXydMmDCroKBgubu7u6apqanEhg0bbrIwMDAw\/P79m0FSUlJn06ZN3X\/\/\/v29cePG1U1NTcdmzZoVCCv2qQkuXbp0JDU1dVV2drZ+ampqamZmJjsDAwPD8+fPd8JbKchFAQMDA6unp2eUp6dn1Lt3754kJSXVsrCwMDU2NqYLCgpKkeuQz58\/v25vb5\/5\/Pnzbx0dHckHDx6El0V\/\/vyBFycojvr58yeGQdzc3DL9\/f3N0FbNjrKysraysjIrT0\/PMCYmJhZCDvn\/\/\/+\/AwcObKyurp7d3t6eXldXVwWr8bHZ9\/v3bwZcIYUV6OjoOLu5uV369+8fS1dX14QLFy68bG1tTZSWltZCV\/vq1au7dXV1s5WUlATMzc3VnZycrIyNjd1+\/vyJtwmCElKw4g4XOHbs2MYzZ87czM7OLmRmZma1tbWFlejnQ0NDC52dnZXCw8OjN2\/evGb9+vVXW1tboyZMmAAv6czMzHynTJkyUUVFRdrFxSWCaEd9\/\/6dAYuPbzY0NMzq6OgoNjQ09IdpggExMTHDWbNmGf79+\/f35cuXD3h5ecX7+vqyQ9vGyEpZ4uPjiz9\/\/vw8NTW1tKqqKlFCQkILl6OYkNMUDH\/9+vV7c3Nz\/ZMnTx719\/f3srOzS+Erjv\/8+cOqpqbm+ufPH3Z86tjY2CS7u7u737x586a+vr728+fPX5DlMdMUNOEdOnRoyYsXL97m5uXVMjIysvzAkiApBbJycnaFRUU2mzZtmsXBwcHu4uqayMDAwPAL3VGPHj68NGPGjMVlZWVl5mZmor9o4Bg0wOTq6prx8+fPD7U1NWWJiYnhv6HRxzhx4kSG\/Px8GQYGBnYGBgZtBgYG6QGoZV4xMDBcZWBg+Pn\/\/\/\/7gAEAb05N4qKYeo4AAAAASUVORK5CYII=",
  5008. 'compose': "data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAAHeTXxYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw\/eHBhY2tldCBiZWdpbj0i77u\/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDA5QkJFRjAyMUM4MTFFM0FFNDdDRTZFMkNGQ0U4QjciIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDA5QkJFRjEyMUM4MTFFM0FFNDdDRTZFMkNGQ0U4QjciPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowMDlCQkVFRTIxQzgxMUUzQUU0N0NFNkUyQ0ZDRThCNyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowMDlCQkVFRjIxQzgxMUUzQUU0N0NFNkUyQ0ZDRThCNyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI\/PiCpd68AAAM7SURBVHjaYjx16hQDCJiamoJpJgYkcPr06aUgAU4ksUCQwHcgXgSUfQvUxgUQQAwgM4A47f\/\/\/3D9XRiGwTh3QARAADFC7f0AxAIw+4EGrgbSoSCVFVCJNCD+BpRIA0kA6WMwnauBOBTZ5SAAEEAwSRAwBmIDoORcEIcFKgjyyVkoBtmnC7JrO9RHcADUdRlmlBYQ2yBJzAIZ5QfEm4D4GnrQHWdAA0A7boMkXkP5\/4H4IVDQDKhLFSCAkJ0LAiuAmB+Io4H4HVQsCoiXArEwUMM7ZD+CBFPQXY4eIECbLgH5eiAnWAJxFhYNH7AYoAfU+AfkU10kT4kCsRyUzQwKYaAimIazUPHXMOeBPMqIxSYBNOeBwvYXLHoYoTYuAmJDqJgAmuJFQAOUQHyAAEIPPRhIhjrvLJKz4IAFiS0ExG+hwT0XJga0BZQePgI1R6AnXZDTZkKduQzJoHdAxZ5AOhGo+QO6pqWwhIoNADWCokMSlNNgmkCe18OidgsWjUIwTVEMxIMIUEiCAgI5+NKQ2KBIToNG7jKgTV+A+CNMkyKSQuTg\/YjE\/4UcOCzQVI1TE1qKAGWuxSA\/OSBnPQJgIyhAYH66B8RKaAp80HIlqPwQQ44nJahGrDYCNZwHUk1AW16jJyOQRjNoUvoCzeqgrLEYqNgQ2RCAAMOVYJFLrHwg9oZG7AsgfgqVkwZiCWixsBWIJ2JL3NgSOQyAyrGNUBfmAnEcPpfAYgQU51Cv8wCxP1D8Gi4fgUqHY0B8AV96x1dWoUWOARBbwcIbFkmgcH4FymlEWPIBPc9gsTwUatYrUJEMswhUSRwA4iAgPsJAJQC07AjUzANAyzhBFsVCI3k9A5UB0LL1ULNjWaCp6R0WdZlAPA2HGd7QQpwBVspDgTzQ8EdoakFmC4ESgw006ASgKY2BiDg6Asud2BIDUqLggap3YIJqWgNtBlAbgMxcA4ovWD6KgNbNoHxgha3KRQILYE0cPD7hhGaVm7BKBjnDRkArmudAvBuaUbFZWEDAAlA14grEtqDWDKEiSAhas4UA8Q6oL3ZAy2dkACrHPYA4AUqDoiAd1jIhpaxDL\/eMoZU2CPzFVXljAwBsiybgUCzWVAAAAABJRU5ErkJggg==",
  5009. 'sendMail': "data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAAHeTXxYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw\/eHBhY2tldCBiZWdpbj0i77u\/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkJBMDU2QjAyMUM4MTFFMzhENTM5NzJBMTI2OEM2QjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkJBMDU2QjEyMUM4MTFFMzhENTM5NzJBMTI2OEM2QjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyQkEwNTZBRTIxQzgxMUUzOEQ1Mzk3MkExMjY4QzZCNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyQkEwNTZBRjIxQzgxMUUzOEQ1Mzk3MkExMjY4QzZCNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI\/PspK+6wAAANsSURBVHjaYjx16hQDCJiamoJpJgYkcPr06aUgAU4ksUCQwHcgXgSUfQvUxgUQQAwgM4A47f\/\/\/3D9lsiGaSFzmEEEQAAxQu39AMQCMPuBBq4G0qEsQH4FTALqjv9ACUYgfQymczUQhyK7HAQAAggmCQLGQGwAlJwL4rBABUE+OQvFIGN1Qa7aDvWRGUwrUNdlkIQnlH8KOVBAEn5IfDlkieNIEo+gdtwGSbyGCv4H4odAQTOgHaoAAYTsXBBYAcT8QBwNxO+gYlFAvBSIhYEa3iH7ESSYAnU5CkAOEKBNl4B8PSZolGRh0cADchKaAXpAjX9AmnSB+CMDJvgCxOuBimLRxF\/DnAfyKCOSBMgfy7A4zwZI\/YJFDyPUxkVAbAjTgKZ4EdAAJRAfIIDQQw8GkqGJ7CxQ4Vl0SRYkthAQv4UG91yYGNAWUHr4CNQcgRyzDFCnzYQ6E9lp74CKQWklEaj5A7qmpbCEig0ANYKiQxKU02CaQJ7XQ1P3HIjZsGgUgmmKwmK4JBBvhDobGUSAQpIJPV0jAZBfvIGKKpBsAyUCG1DoKTLgBnXg8gAVvGOCpmp0IAHE54GYCy2SQZlrMUiTA8hKNE1O0JSBDjaCAoQF6qd7QKyEJLkMXTWopAFSYsjxpATVaIPNY0ANIKc2AW15jZ6MlKBFx1totgApMAZqWAxUjOJUgADDlWCRS6x8UNBDI\/YFED+FyklDAwxUBGwF4onYEje2RM6AVAZvhLowF4jj8LkElkdBCQXqdVAp4Q8Uv4bLR6JAfAyIL+BL7\/jKKrTIMQBiK1h4wyIJFM6vQDkNhyWgfA8qkkKItDwUatYrUJEMswhUSRwA4iAgPoJD719QIoUmt0tAfBIaP\/gsOwI18wDQMk4mqEtBkbyeCMc+gpYKtkDcDsSfgYZ447FsPdTsWCZoanrHQBr4BQ2aSlDCAVrWjkctyGwhFmhwtUBTyxciLOGElnc20NTFgksh0AE80ERRwAS1aA20GYAP6EIrt0XQJC+Jp9iDAZCZa0DxBXNNBLRuBuUDK2xVLhBcBmJ5YsIVFPnQrHITVskgezsC6mpQkb8b6urvpEQc1AKQj11BCQbUmiFUBAlBazZQvtkBxAugNHrVDyrHPYA4AUqDoiAd1jIhpaxDL\/eMYS1DaN46i698QwYA7ichDuh2+qMAAAAASUVORK5CYII=",
  5010. 'expand': "data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAHCAYAAAG3oLd4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw\/eHBhY2tldCBiZWdpbj0i77u\/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OENBNTNFOTYyMUM5MTFFMzgxQ0U4NURBODIyODZFQjEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OENBNTNFOTcyMUM5MTFFMzgxQ0U4NURBODIyODZFQjEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Q0E1M0U5NDIxQzkxMUUzODFDRTg1REE4MjI4NkVCMSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Q0E1M0U5NTIxQzkxMUUzODFDRTg1REE4MjI4NkVCMSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI\/PkXCZdMAAAB7SURBVHjaYrhy5UoUQAAxAIk6gABiBBJODAwMpQABBOIxMAFZiwACCCTEA2R8BmIrFiDxBYjFgPg1QACBZHSBjMsgdQlA\/BDEyARiNpA6LiBmAAgwkJocIN0IxBFAnAzE9iBZkJHdQCwNxBNBNEiwA4jNgHg7EG8CYmcAZrIfR0hmuRcAAAAASUVORK5CYII=",
  5011. 'collapse': "data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAHCAYAAAG3oLd4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw\/eHBhY2tldCBiZWdpbj0i77u\/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjJFQkEwM0YyMUM5MTFFMzgwM0JDNkQ5QzlCNjQ3MUMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjJFQkEwNDAyMUM5MTFFMzgwM0JDNkQ5QzlCNjQ3MUMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCMkVCQTAzRDIxQzkxMUUzODAzQkM2RDlDOUI2NDcxQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCMkVCQTAzRTIxQzkxMUUzODAzQkM2RDlDOUI2NDcxQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI\/Pi65wUkAAAB0SURBVHjaYrhy5QoDQAAxgAiAAGIEEjwMDAxaAAEE4okyAVmvAAIIJOQEZKQBMT9IRAKII4D4FEAAMYK1AQELEH8D4o8g6elA\/AvEWADE8gABBlNjBsTbgXgTEKeD1FcwQEAxEN8E4sMgLV+gEk+BuAiIpQHP\/SBDZEL2QgAAAABJRU5ErkJggg==",
  5012. 'drop': "data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAKCAYAAAEle4U0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw\/eHBhY2tldCBiZWdpbj0i77u\/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjM5REMxOTYyMUM3MTFFM0JBODRGNUVCNzE5NTlBMUUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjM5REMxOTcyMUM3MTFFM0JBODRGNUVCNzE5NTlBMUUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCMzlEQzE5NDIxQzcxMUUzQkE4NEY1RUI3MTk1OUExRSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCMzlEQzE5NTIxQzcxMUUzQkE4NEY1RUI3MTk1OUExRSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI\/Phn5Ps0AAADuSURBVHjaYjh16pTx\/\/\/\/GUCYhQEITp8+DaIYAAKIESQCAkxQUX6AAGKAqQXS3kAMotsBAgiuDAbgAkAt34DURxYkSS4QARBAjCBzTE1Nz8JEgSpVgNQdJIWWTAyYAKSgHYhB5q8D4uMAAQRywTuY67FhFnQjgFaJAqnXUC4bNmteAXEUyA1A\/JMFiwKQ2B8omxebgr8gX8I4AAEGDjZCDiWEsdmC7jFvIDUNiP2B+AKSlDQ0uPYxMRAGR4D4GhCfh4bzalAgAPETIOYE4rnEGPIRiD2hYRAKxCCXNUH5eqCIJOgdYPJA5q6BYhQAAIt8mGSW9QmrAAAAAElFTkSuQmCC",
  5013. 'expandDocument': "data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAATCAYAAAEMvKYgAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw\/eHBhY2tldCBiZWdpbj0i77u\/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODZDRjVGNDEyOTI5MTFFM0JFRjBCRjEyQTVDODM4OEMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODZDRjVGNDIyOTI5MTFFM0JFRjBCRjEyQTVDODM4OEMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4NkNGNUYzRjI5MjkxMUUzQkVGMEJGMTJBNUM4Mzg4QyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4NkNGNUY0MDI5MjkxMUUzQkVGMEJGMTJBNUM4Mzg4QyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI\/PrFxFU0AAAEZSURBVHjaYly3bh0DFPxnAhI8IAYQM4I4X0AMkBRAADFClYFkGJhgDJAEC0wJCAAEECOSaSiACUpLo0sABBCyjv\/YdMAVwuxhQVcJAyguwWUUik6AAMLl3P84TPqPbNIZNMfh9XcvEBszEAFgGorRTP2PSwMLHsOwagIIIGyeJtl0gqFDtEdVgLiCmGCcD8S3gbgd6t7\/uNwNUpwOZVcipRycaeMXVPIssW4Ggd2Ego6k0GAhJQYBAgxnLiM2VslxCQMJKQGnY7CFCRsQa+HK7OSkKBAIB+LPQPwTiP0YqABAhitCc\/0KaDHJgCU1\/ieUOnEZfh+ITaDe9gHid1hSLyOh1ExMhG4FYmEGKgEmEmL\/P62TIkkWAABseD4pIBbN+AAAAABJRU5ErkJggg==",
  5014. 'contractDocument': "data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAATCAYAAAEMvKYgAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw\/eHBhY2tldCBiZWdpbj0i77u\/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NkNEQ0Q3NUUyOTI5MTFFM0FGNjZFQ0JERDMxN0EzMkQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NkNEQ0Q3NUYyOTI5MTFFM0FGNjZFQ0JERDMxN0EzMkQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2Q0RDRDc1QzI5MjkxMUUzQUY2NkVDQkREMzE3QTMyRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo2Q0RDRDc1RDI5MjkxMUUzQUY2NkVDQkREMzE3QTMyRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI\/PhXno4sAAAEjSURBVHjaYvz\/\/z\/D+vXrGYDgPxMDBPwHESxQDiOIAAggxnXr1sFlYMrAEkzIygACiBHJNBTAxIADAAQQso7\/+HQwwuxAcSSU5sRwMBBIA\/F3ZAmYapgCBoAAAlsOAmhORlGELI7LGzDFZ4j2NxQYA3EvsgALDoX\/kYOAGA0YAQoDAAGEzdP\/cZnAQsDDRIUOVsCEx9QKIFbBp\/g\/Em4H4ttAPJ9QygHhSqhYOjHBdxbdo0x4wng3qVHPQGy0YwCAAIPHIAxgy3H4YpUclzCQkBJwOoaJBEORDdYCYjZyUhQxwA+IfwLxZyAOJ8fw\/3hwO1QNDxCvAOKTQKxIiuGMeDAoNb8DYh8o3xyI71MrWDqAWBiIt1IjzP+TkxxJTYokWQAA4GhPRy5oqbUAAAAASUVORK5CYII="
  5015. }
  5016. }
  5017. });