Command & Conquer TA Zmail

Complete and comprehensive CCTA mail client. Zmail is fast and easy to use mail client that allows you to send and receive messages.

  1. // ==UserScript==
  2. // @name Command & Conquer TA Zmail
  3. // @description Complete and comprehensive CCTA mail client. Zmail is fast and easy to use mail client that allows you to send and receive messages.
  4. // @namespace http*://*.alliances.commandandconquer.com/*
  5. // @include http*://*.alliances.commandandconquer.com/*
  6. // @version 2015.11.08
  7. // @grant none
  8. // @author zdoom
  9. // ==/UserScript==
  10.  
  11. (function(){
  12. var injectFunction = function()
  13. {
  14. function createClass()
  15. {
  16. qx.Class.define('zmail.data',
  17. {
  18. type: 'singleton',
  19. extend: qx.core.Object,
  20. construct: function()
  21. {
  22. try
  23. {
  24. if (typeof localStorage.ccta_zmail !== 'undefined')
  25. {
  26. var json = JSON.parse(localStorage.ccta_zmail);
  27. if (json.hasOwnProperty('archive')) this.archive = json.archive;
  28. }
  29. else
  30. {
  31. var sd = {
  32. 'folders': {'draft': {}, 'junk': [], 'trash': [[],[]], 'documents': []},
  33. 'contacts': {'blocked': [], 'friends': [], 'groups': {}},
  34. 'archive': {}
  35. };
  36. localStorage['ccta_zmail'] = JSON.stringify(sd);
  37. console.log('zmail: starting zmail for the first time......');
  38. this.firstTime = true;
  39. }
  40. var inbox = {
  41. folder: null,
  42. count: null,
  43. messages: [],
  44. newMessages: [],
  45. unRead: null
  46. };
  47. var outbox = {
  48. folder: null,
  49. count: null,
  50. messages: [],
  51. newMessages: []
  52. };
  53. this.inbox = inbox;
  54. this.outbox = outbox;
  55. var data = ClientLib.Data.MainData.GetInstance();
  56. var mail = data.get_Mail();
  57. var root = this;
  58. var alliance = data.get_Alliance();
  59. var allianceExists = alliance.get_Exists();
  60. this.allianceExists = allianceExists;
  61. if (allianceExists)
  62. {
  63. var roles = alliance.get_Roles();
  64. var relations = alliance.get_Relationships();
  65. this.roles = roles;
  66. if (relations !== null)
  67. {
  68. var totalAllies = 0;
  69. for (var i = 0; i < relations.length; i++) if (relations[i].Relationship == 1) totalAllies++;
  70. for (var i = 0; i < relations.length; i++)
  71. {
  72. var type = relations[i].Relationship, id = relations[i].OtherAllianceId, name = relations[i].OtherAllianceName;
  73. if (type == 1) this.getAllianceMembers(id, name, totalAllies, true);
  74. }
  75. }
  76. else
  77. {
  78. this.allies = {};
  79. this.status.allies = true;
  80. console.log('zmail: allies(0).......................... ready');
  81. this.onReady();
  82. }
  83. this.getMembers(true);
  84. }
  85. else console.log('zmail: ' + 'No alliance detected: ' + alliance.get_Exists());
  86. var ownerName = data.get_Player().get_Name();
  87. var ownerId = data.get_Player().get_Id();
  88. this.ownerName = ownerName;
  89. this.ownerId = ownerId;
  90. var getPlayers = function(fi,li,ti)
  91. {
  92. ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand("RankingGetData",
  93. { 'ascending': true, 'firstIndex': fi, 'lastIndex': li, 'rankingType': 0, 'sortColumn': 2, 'view': 0 },
  94. phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, function(context, data)
  95. {
  96. if (data !== null) this.players = this.players.concat(data.p);
  97. if (this.players.length == ti)
  98. {
  99. this.status.playersList = true;
  100. console.log('zmail: ' + 'global players list.......................... ready');
  101. this.onReady();
  102. }
  103. }), null);
  104. };
  105. var getList = function(count)
  106. {
  107. var pages = Math.ceil(count/4500);
  108. for (var i = 0; i < pages; i++)
  109. {
  110. var Min = i * 4500, Max = Math.min((((i + 1) * 4500) - 1), (count - 1));
  111. getPlayers.apply(root, [Min, Max, count]);
  112. }
  113. };
  114. ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand("RankingGetCount", { 'rankingType': 0, 'view': 0 },
  115. phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, function(context, data)
  116. {
  117. if (data !== null) getList(data);
  118. }), null);
  119. var getFolder = function(type)
  120. {
  121. var gmh = mail.GetMailHeaders.toString();
  122. var prop = gmh.replace(/^.*?c=this\.(.*?)\.d\[a\].*?$/, '$1');
  123. var folder = mail[prop].d[type].i;
  124. return folder;
  125. }
  126. ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand ("IGMGetFolders", {},
  127. phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, function(context, data)
  128. {
  129. if (data !== null)
  130. {
  131. this.inbox.folder = data[0].i;
  132. this.outbox.folder = data[1].i;
  133. console.log('zmail: ' + 'folders ids.......................... ready');
  134. }
  135. else
  136. {
  137. console.log('zmail: ' + 'Attempting folder ids fallback function');
  138. this.inbox.folder = getFolder(0);
  139. this.outbox.folder = getFolder(1);
  140. console.log('zmail: ' + 'folders ids.......................... ready');
  141. }
  142. ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand("IGMGetMsgCount", {'folderId': this.inbox.folder},
  143. phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, function(context, data)
  144. {
  145. console.log('zmail: inbox(' + data + ')');
  146. this.inbox.count = data;
  147. if ((data !== null) && (this.outbox.count !== null))
  148. {
  149. this.getMsgHeaders(this.inbox.folder, this.inbox.count, 0);
  150. this.getMsgHeaders(this.outbox.folder, this.outbox.count, 1);
  151. }
  152. }), null);
  153. ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand("IGMGetMsgCount", {'folderId': this.outbox.folder},
  154. phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, function(context, data)
  155. {
  156. console.log('zmail: outbox(' + data + ')');
  157. this.outbox.count = data;
  158. if ((data !== null) && (this.inbox.count !== null))
  159. {
  160. this.getMsgHeaders(this.inbox.folder, this.inbox.count, 0);
  161. this.getMsgHeaders(this.outbox.folder, this.outbox.count, 1);
  162. }
  163. }), null);
  164. this.status.folders = true;
  165. this.onReady();
  166. }), null);
  167. this.timer = new qx.event.Timer(300);
  168. this.timer.addListener('interval', this.onMailSent, this);
  169. }
  170. catch(e)
  171. {
  172. console.log('zmail: ' + e.toString())
  173. }
  174. },
  175. destruct: function(){},
  176. members:
  177. {
  178. inbox: null,
  179. outbox: null,
  180. update: null,
  181. archive: {},
  182. inProgress: false,
  183. players: [],
  184. allianceExists: null,
  185. roles: null,
  186. allianceMembers: null,
  187. allianceCommanders: null,
  188. allianceOfficers: null,
  189. allies: {},
  190. ownerName: null,
  191. ownerId: null,
  192. counter: 0,
  193. timer: null,
  194. isLoaded: false,
  195. firstTime: false,
  196. status: {'playersList': false, 'allianceMembers': false, 'allies': false, 'folders': false, 'messages': false},
  197. callMethod: function(fn, args)
  198. {
  199. var root = this;
  200. root[fn].apply(root, args);
  201. },
  202. update: function()
  203. {
  204. if(this.inProgress) return;
  205. this.inProgress = true;
  206. var data = ClientLib.Data.MainData.GetInstance();
  207. var mail = data.get_Mail();
  208. this.inbox.count = mail.GetMailCount(0);
  209. this.outbox.count = mail.GetMailCount(1);
  210. this.inbox.unRead = mail.GetUnreadCount();;
  211. this.getMsgHeaders(this.inbox.folder, this.inbox.count, 0);
  212. this.getMsgHeaders(this.outbox.folder, this.outbox.count, 1);
  213. },
  214. markRead: function(id, flag)
  215. {
  216. ClientLib.Data.MainData.GetInstance().get_Mail().SetMailRead(id, flag);
  217. },
  218. deleteMsgs: function(id, folder)
  219. {
  220. ClientLib.Data.MainData.GetInstance().get_Mail().DeleteMessages(id, folder);
  221. },
  222. sendMail: function(to, alliance, subject, message)
  223. {
  224. ClientLib.Data.MainData.GetInstance().get_Mail().SendMail(to, alliance, subject, message);
  225. this.counter = 0;
  226. this.onMailSent();
  227. this.timer.start();
  228. },
  229. onMailSent: function()
  230. {
  231. ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand("IGMGetMsgCount", {'folderId': this.outbox.folder},
  232. phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, function(context, data)
  233. {
  234. if ((data !== null) && (data > this.outbox.count))
  235. {
  236. this.update();
  237. this.timer.stop();
  238. this.counter = 0;
  239. }
  240. else if (this.counter > 20)
  241. {
  242. alert('Error sending message');
  243. this.timer.stop();
  244. }
  245. else this.counter++;
  246. }), null);
  247. },
  248. createBBCode:
  249. {
  250. 'coords': function(name,x,y)
  251. {
  252. return webfrontend.gui.util.BBCode.createCoordsLinkText(name,x,y).replace('#0d77bb', '#377395');
  253. },
  254. 'player': function(name)
  255. {
  256. return webfrontend.gui.util.BBCode.createPlayerLinkText(name).replace('#0d77bb', '#377395');
  257. },
  258. 'alliance': function(name)
  259. {
  260. return webfrontend.gui.util.BBCode.createAllianceLinkText(name).replace('#0d77bb', '#377395');
  261. }
  262. },
  263. getMembers: function(flag)
  264. {
  265. ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand("AllianceGetMemberData", {},
  266. phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, function(context, data)
  267. {
  268. var alliance = [], commanders = [], officers = [];
  269. for (var i = 0; i < data.length; i++)
  270. {
  271. var name = data[i].n, id = data[i].i, roleId = data[i].r, role = this.roles.d[roleId].Name;
  272. switch(role)
  273. {
  274. case 'Leader': role = 'Commander-in-Cheif'; break;
  275. case 'Newbie': role = 'Trial'; break;
  276. }
  277. var member = {'id': id, 'name': name, 'role': role, 'roleId': roleId};
  278. if (role == 'Commander-in-Cheif' || role == 'Second Commander') commanders.push(member);
  279. if (role == 'Officer') officers.push(member);
  280. alliance.push(member);
  281. }
  282. this.allianceMembers = alliance;
  283. this.allianceCommanders = commanders;
  284. this.allianceOfficers = officers;
  285. var structure = zmail.structure.getInstance();
  286. structure.applyMethod('updateContacts', [alliance, commanders, officers]);
  287. if (flag)
  288. {
  289. this.status.allianceMembers = true;
  290. console.log('zmail: ' + 'alliance members.......................... ready');
  291. this.onReady();
  292. }
  293. }), null);
  294. },
  295. getAllianceMembers: function(aid, name, total, flag)
  296. {
  297. ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand("GetPublicAllianceMemberList", {'id': aid },
  298. phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, function(context, data)
  299. {
  300. this.allies[name] = data;
  301. var loaded = 0;
  302. for (var x in this.allies) loaded++;
  303. if (loaded == total)
  304. {
  305. var structure = zmail.structure.getInstance();
  306. structure.applyMethod('updateAllies', [this.allies]);
  307. if (flag)
  308. {
  309. this.status.allies = true;
  310. console.log('zmail: ' + 'allies (' + total + ').......................... ready');
  311. this.onReady();
  312. }
  313. }
  314. }), null);
  315. },
  316. _onAllianceChange: function()
  317. {
  318. var data = ClientLib.Data.MainData.GetInstance();
  319. var alliance = data.get_Alliance();
  320. var allianceExists = alliance.get_Exists();
  321. this.allianceExists = allianceExists;
  322. this.allies = {};
  323. if(allianceExists)
  324. {
  325. var relations = alliance.get_Relationships();
  326. if (relations !== null)
  327. {
  328. var totalAllies = 0;
  329. for (var i = 0; i < relations.length; i++) if (relations[i].Relationship == 1) totalAllies++;
  330. for (var i = 0; i < relations.length; i++)
  331. {
  332. var type = relations[i].Relationship, id = relations[i].OtherAllianceId, name = relations[i].OtherAllianceName;
  333. if (type == 1) this.getAllianceMembers(id, name, totalAllies, false);
  334. }
  335. }
  336. else zmail.structure.getInstance().callMethod('updateAllies', null);
  337. this.getMembers(false);
  338. }
  339. else
  340. {
  341. console.log('zmail: ' + 'No alliance detected: ' + alliance.get_Exists());
  342. var structure = zmail.structure.getInstance();
  343. structure.applyMethod('updateContacts', [null, null, null]);
  344. structure.applyMethod('updateAllies', [null]);
  345. }
  346. },
  347. getMsgHeaders: function(id, count, type)
  348. {
  349. type == 0 ? this.inbox.messages = [] : this.outbox.messages = [];
  350. type == 0 ? this.inbox.newMessages = [] : this.outbox.newMessages = [];
  351. var pages = Math.ceil(count/1000);
  352. for (var n = 0; n < pages; n++)
  353. {
  354. var start = n * 1000;
  355. var amount = (pages > 1) ? (n == pages - 1) ? (count - (n * 1000)) : 1000 : count;
  356. ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand("IGMGetMsgHeader",
  357. {folder: id, ascending: false, skip: start, take: amount, sortColumn: 1},
  358. phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, function(context, data)
  359. {
  360. for (var i = 0; i < data.length; i++) this.getMsgBody(data[i], type);
  361. }), null);
  362. }
  363. },
  364. getMsgBody: function(msg, type)
  365. {
  366. if (this.archive.hasOwnProperty(msg.i))
  367. {
  368. if (this.archive[msg.i].r != msg.r) this.archive[msg.i].r = msg.r;
  369. type == 0 ? this.inbox.messages.push(this.archive[msg.i]) : this.outbox.messages.push(this.archive[msg.i]);
  370. this.onCompleted();
  371. }
  372. else
  373. {
  374. ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand("IGMGetMsg", { mailId: msg.i },
  375. phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, function(context, data)
  376. {
  377. var cm = msg;
  378. cm.b = data;
  379. type == 0 ? this.inbox.messages.push(cm) : this.outbox.messages.push(cm);
  380. if (type == 0)
  381. {
  382. if (this.isLoaded) this.inbox.newMessages.push(cm);
  383. else
  384. {
  385. if (!cm.r) this.inbox.newMessages.push(cm);
  386. }
  387. }
  388. else
  389. {
  390. if (this.isLoaded) this.outbox.newMessages.push(cm);
  391. }
  392. this.archive[msg.i] = cm;
  393. this.onCompleted();
  394. }), null);
  395. }
  396. },
  397. onCompleted: function()
  398. {
  399. var ti = this.inbox.count, to = this.outbox.count, ci = this.inbox.messages.length, co = this.outbox.messages.length;
  400. var structure = zmail.structure.getInstance();
  401. if ((ti == ci) && (to == co))
  402. {
  403. var json = JSON.parse(localStorage.ccta_zmail);
  404. json.archive = this.archive;
  405. localStorage.ccta_zmail = JSON.stringify(json);
  406. var received = this.inbox.newMessages, sent = this.outbox.newMessages;
  407. if (((received.length + sent.length) > 0) || !this.isLoaded)
  408. {
  409. if (this.firstTime)
  410. {
  411. structure.applyMethod('updateDownloads', [ci + co, ti + to]);
  412. }
  413. if (this.isLoaded) structure.callUpdate(this.inbox.messages, this.outbox.messages, received, sent);
  414. if (!this.isLoaded)
  415. {
  416. this.isLoaded = true;
  417. this.status.messages = true;
  418. console.log('zmail: ' + 'messages.......................... ready');
  419. this.onReady();
  420. }
  421. }
  422. if (this.firstTime) this.firstTime = false;
  423. this.inProgress = false;
  424. }
  425. else
  426. {
  427. if (this.firstTime)
  428. {
  429. var current = ci + co, total = ti + to;
  430. if (!structure.downloadsCont) structure.applyMethod('showDownloads', [total]);
  431. structure.applyMethod('updateDownloads', [current, total]);
  432. }
  433. }
  434. },
  435. _onMailChange: function()
  436. {
  437. console.log('zmail: checking new messages');
  438. this.update();
  439. },
  440. attachEvent: function()
  441. {
  442. if (typeof phe.cnc.Util.attachNetEvent == 'undefined') webfrontend.gui.Util.attachNetEvent.apply(null, arguments);
  443. else phe.cnc.Util.attachNetEvent.apply(null, arguments);
  444. },
  445. onReady: function()
  446. {
  447. var status = this.status, ready = true, exists = this.allianceExists;
  448. if (exists == true)
  449. {
  450. for (var x in status) if (status[x] === false) ready = false;
  451. }
  452. else if (exists == false)
  453. {
  454. if (!status.playersList || !status.folders || !status.messages) ready = false;
  455. }
  456. else
  457. {
  458. ready = false;
  459. console.log('zmail: ' + 'alliance is null', exists);
  460. }
  461. if (ready)
  462. {
  463. var structure = zmail.structure.getInstance(), inbox = this.inbox, outbox = this.outbox;
  464. var data = ClientLib.Data, mainData = data.MainData.GetInstance();
  465. structure.callUpdate(inbox.messages, outbox.messages, inbox.newMessages, outbox.newMessages);
  466. zmail.main.getInstance().initScriptButton();
  467. this.attachEvent(mainData.get_Mail(), 'DataChange', data.MailDataChange, this, this._onMailChange);
  468. this.attachEvent(mainData.get_Alliance(), 'Change', data.AllianceChange, this, this._onAllianceChange);
  469. }
  470. }
  471. }
  472. });
  473. qx.Class.define('zmail.main',
  474. {
  475. type: 'singleton',
  476. extend: qx.ui.container.Composite,
  477. construct: function()
  478. {
  479. this.base(arguments);
  480. var layout = new qx.ui.layout.Canvas();
  481. this._setLayout(layout);
  482. var widget = new qx.ui.core.Widget();
  483. widget.setPadding(3);
  484. widget.setHeight(546);
  485. var div = new qx.html.Element('div', null, {'id': 'zdoom_mail_container'});
  486. widget.getContentElement().add(div);
  487. this.add(widget, {left: 0, top: 0});
  488. this.widget = widget;
  489. this.wdgAnchor = new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_tl1.png").set({ width: 3, height: 32 });
  490. this.__imgTopRightCorner = new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_tr.png").set({ width: 34, height: 35 });
  491. this.__backgroundTop = new qx.ui.basic.Image(null);
  492. var cntBackgroundTop = new qx.ui.container.Composite(new qx.ui.layout.Canvas()).set({ height: 132 , maxHeight: 132 });
  493. var cntBackgroundTopBackground = new qx.ui.container.Composite().set({ backgroundColor: "#000000" });
  494. cntBackgroundTop.add(cntBackgroundTopBackground, { left: 0, top: 0, right: 0, bottom: 0 });
  495. cntBackgroundTop.add(this.__backgroundTop, { left: 0, top: -10 });
  496. this.__background = new qx.ui.basic.Image(null);
  497. var cntBackground = new qx.ui.container.Composite(new qx.ui.layout.Canvas());
  498. cntBackground.add(this.__background, { left: 0, top: -10 });
  499. this._add(cntBackground, { left: -114, top: 132-60 });
  500. this._add(cntBackgroundTop, { left: -114, top: -60 });
  501. this._add(this.__imgTopRightCorner, { right: 0, top: 0, bottom: 28 });
  502. 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 });
  503. 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 });
  504. 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 });
  505. 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 });
  506. 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 });
  507. this._add(this.wdgAnchor, { left: 0, top: 0 });
  508. 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 });
  509. 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 });
  510. 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") });
  511. this.__btnClose.addListener("execute", this._onClose, this);
  512. this._add(this.__btnClose, { top: 6, right: 5 });
  513. var app = qx.core.Init.getApplication();
  514. app.getDesktop().addListener('resize', this._onResize, this);
  515. },
  516. destruct: function()
  517. {
  518. },
  519. members:
  520. {
  521. isOpen: false,
  522. open: function()
  523. {
  524. this._onResize();
  525. var root = this;
  526. var app = qx.core.Init.getApplication();
  527. app.getDesktop().add(this);
  528. var mail = zmail.structure.getInstance();
  529. var check = function()
  530. {
  531. var div = document.getElementById('zdoom_mail_container');
  532. if(div)
  533. {
  534. div.appendChild(mail.dom.window.main);
  535. root.isOpen = true;
  536. }
  537. else setTimeout(check, 1000);
  538. };
  539. check();
  540. },
  541. initScriptButton: function()
  542. {
  543. var init = function()
  544. {
  545. var app = qx.core.Init.getApplication();
  546. var scriptMenu = app.getMenuBar().getScriptsButton();
  547. var subMenu = new qx.ui.menu.Menu();
  548. var btn = new qx.ui.menu.Button("Open Window", null, null);
  549. scriptMenu.getMenu().setWidth(94);
  550. btn.addListener("execute", this.open, this);
  551. subMenu.add(btn);
  552. scriptMenu.Add("Zmail", null, subMenu);
  553. }
  554. init.call(this);
  555. },
  556. _onClose: function ()
  557. {
  558. var app = qx.core.Init.getApplication();
  559. app.getDesktop().remove(this);
  560. this.isOpen = false;
  561. },
  562. _onResize: function()
  563. {
  564. var app = qx.core.Init.getApplication();
  565. var mainOverlay = app.getMainOverlay();
  566. var left = (app.getDesktop().getBounds().width - mainOverlay.getWidth()) / 2;
  567. this.setUserBounds(left, mainOverlay.getBounds().top, mainOverlay.getWidth(), 546);
  568. this.widget.setWidth(mainOverlay.getWidth());
  569. },
  570. center: function()
  571. {
  572. var parent = this.getLayoutParent();
  573. if (parent) var bh = parent.getBounds();
  574. if (bh) var bi = this.getSizeHint();
  575. var bg = Math.round((bh.width - bi.width) / 2);
  576. var top = this.getBounds().top;
  577. this.moveTo(bg,top);
  578. }
  579. }
  580. });
  581. qx.Class.define('zmail.compose',
  582. {
  583. type: 'singleton',
  584. extend: qx.ui.container.Composite,
  585. construct: function()
  586. {
  587. this.base(arguments);
  588. var layout = new qx.ui.layout.Canvas();
  589. this._setLayout(layout);
  590. zmail.data.getInstance();
  591. var widget = new qx.ui.core.Widget();
  592. widget.setPadding(3);
  593. widget.setHeight(546);
  594. var div = new qx.html.Element('div', null, {'id': 'zdoom_newMail_container'});
  595. widget.getContentElement().add(div);
  596. this.add(widget, {left: 0, top: 0});
  597. this.widget = widget;
  598. this.wdgAnchor = new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_tl1.png").set({ width: 3, height: 32 });
  599. this.__imgTopRightCorner = new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_tr.png").set({ width: 34, height: 35 });
  600. this.__backgroundTop = new qx.ui.basic.Image(null);
  601. var cntBackgroundTop = new qx.ui.container.Composite(new qx.ui.layout.Canvas()).set({ height: 132 , maxHeight: 132 });
  602. var cntBackgroundTopBackground = new qx.ui.container.Composite().set({ backgroundColor: "#000000" });
  603. cntBackgroundTop.add(cntBackgroundTopBackground, { left: 0, top: 0, right: 0, bottom: 0 });
  604. cntBackgroundTop.add(this.__backgroundTop, { left: 0, top: -10 });
  605. this.__background = new qx.ui.basic.Image(null);
  606. var cntBackground = new qx.ui.container.Composite(new qx.ui.layout.Canvas());
  607. cntBackground.add(this.__background, { left: 0, top: -10 });
  608. this._add(cntBackground, { left: -114, top: 132-60 });
  609. this._add(cntBackgroundTop, { left: -114, top: -60 });
  610. this._add(this.__imgTopRightCorner, { right: 0, top: 0, bottom: 28 });
  611. 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 });
  612. 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 });
  613. 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 });
  614. 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 });
  615. 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 });
  616. this._add(this.wdgAnchor, { left: 0, top: 0 });
  617. 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 });
  618. 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 });
  619. 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") });
  620. this.__btnClose.addListener("execute", this._onClose, this);
  621. this._add(this.__btnClose, { top: 6, right: 5 });
  622. var app = qx.core.Init.getApplication();
  623. app.getDesktop().addListener('resize', this._onResize, this);
  624. },
  625. destruct: function()
  626. {
  627. },
  628. members:
  629. {
  630. isOpen: false,
  631. open: function()
  632. {
  633. this._onResize();
  634. var app = qx.core.Init.getApplication();
  635. app.getDesktop().add(this);
  636. this.isOpen = true;
  637. var mail = zmail.structure.getInstance();
  638. var check = function()
  639. {
  640. var div = document.getElementById('zdoom_newMail_container');
  641. if(div) div.appendChild(mail.dom.window.compose);
  642. else setTimeout(check, 1000);
  643. };
  644. check();
  645. },
  646. _onClose: function()
  647. {
  648. var app = qx.core.Init.getApplication();
  649. app.getDesktop().remove(this);
  650. this.isOpen = false;
  651. },
  652. _onResize: function()
  653. {
  654. var app = qx.core.Init.getApplication();
  655. var mainOverlay = app.getMainOverlay();
  656. var left = (app.getDesktop().getBounds().width - mainOverlay.getWidth()) / 2;
  657. this.setUserBounds(left, mainOverlay.getBounds().top, mainOverlay.getWidth(), 546);
  658. this.widget.setWidth(mainOverlay.getWidth());
  659. },
  660. center: function()
  661. {
  662. var parent = this.getLayoutParent();
  663. if (parent) var bh = parent.getBounds();
  664. if (bh) var bi = this.getSizeHint();
  665. var bg = Math.round((bh.width - bi.width) / 2);
  666. var top = this.getBounds().top;
  667. this.moveTo(bg,top);
  668. }
  669. }
  670. });
  671. qx.Class.define('zmail.structure',
  672. {
  673. type: 'singleton',
  674. extend: qx.core.Object,
  675. construct: function()
  676. {
  677. try
  678. {
  679. var root = this;
  680. var callUpdate = function()
  681. {
  682. root.update.apply(root, arguments);
  683. };
  684. this.callUpdate = callUpdate;
  685. Element.prototype.zm_append = function (arr)
  686. {
  687. for (var i = 0; i < arr.length; i++) this.appendChild(arr[i]);
  688. };
  689. Element.prototype.zm_empty = function()
  690. {
  691. while(this.firstChild) this.removeChild(this.firstChild);
  692. };
  693. Element.prototype.zm_css = function(css)
  694. {
  695. var iterator = function(obj)
  696. {
  697. for(var x in obj) elm.style[x] = obj[x];
  698. };
  699. var elm = this;
  700. for (var key in css) {
  701. var prop = css[key];
  702. switch(key)
  703. {
  704. case 'over': elm.onmouseover = function(){iterator(css['over'])}; break;
  705. case 'out': elm.onmouseout = function(){iterator(css['out'])}; break;
  706. case 'focus': elm.onfocus = function(){iterator(css['focus'])}; break;
  707. case 'blur': elm.onblur = function(){iterator(css['blur'])}; break;
  708. default: elm.style[key] = css[key];
  709. }
  710. }
  711. };
  712. Element.prototype.zm_prop = function (obj)
  713. {
  714. for (var key in object) this[key] = obj[key];
  715. };
  716. this.css.topBar.cont.backgroundImage = this.gradient('#5C5E62', '#3E4042');
  717. this.css.searchResults.text.backgroundImage = this.gradient('#5a5a5a', '#4a4a4a');
  718. var blueGrd = root.gradient('#3d7fa0', '#31678a');
  719. var create = this.create, cssStyles = this.css, text = this.text;
  720. var winCont = create('div', cssStyles.window);
  721. var topBar = create('div', cssStyles.topBar.main);
  722. var topBarCont = create('div', cssStyles.topBar.cont);
  723. var leftBar = create('div', cssStyles.leftBar);
  724. var logo = create('div', cssStyles.topBar.logo);
  725. var tbMenu = create('div', cssStyles.topBar.menu);
  726. var middleBar = create('div', cssStyles.middleBar.cont);
  727. var rightBar = create('div', cssStyles.rightBar.main);
  728. var leftBarWrapper = create('div', cssStyles.tableCellWrapper);
  729. var rightBarWrapper = create('div', cssStyles.tableCellWrapper);
  730. var middleBarWrapper = create('div', cssStyles.tableCellWrapper);
  731. var msgMask = create('div', cssStyles.rightBar.msgMask);
  732. var msgCont = create('div', cssStyles.rightBar.msgCont);
  733. var msgSbc = create('div', cssStyles.rightBar.scrollBar.cont);
  734. var msgSb = create('div', cssStyles.rightBar.scrollBar.bar);
  735. var headersMask = create('div', cssStyles.middleBar.headers.mask);
  736. var headersSbc = create('div', cssStyles.middleBar.scrollBar.cont);
  737. var headersFooter = create('div', cssStyles.middleBar.footer.cont);
  738. var headersCont = create('div', cssStyles.middleBar.headers.scroll);
  739. var mailIcon = document.createElement('img');
  740. var mailText = document.createTextNode('Z'+'MA'+'IL');
  741. var expandCont = create('div', cssStyles.compose.rightBar.expand);
  742. mailIcon.style.display = 'inline-block';
  743. mailIcon.style.verticalAlign = 'top';
  744. expandCont.style.backgroundImage = 'url(' + this.res.expandDocument + ')';
  745. expandCont.data = {'isExpanded': false, 'isFocused': false};
  746. expandCont.onmouseover = function(){this.data.isFocused = true};
  747. expandCont.onmouseout = function(){this.data.isFocused = false; this.style.visibility = 'hidden';};
  748. expandCont.onclick = function()
  749. {
  750. var expanded = this.data.isExpanded;
  751. this.style.backgroundImage = (expanded) ? 'url('+root.res.expandDocument+')' : 'url('+root.res.contractDocument+')';
  752. leftBar.style.display = (expanded) ? 'table-cell' : 'none';
  753. middleBar.style.display = (expanded) ? 'table-cell' : 'none';
  754. this.data.isExpanded = !expanded;
  755. };
  756. mailIcon.src = this.res.mail;
  757. mailIcon.style.marginRight = '6px';
  758. logo.zm_append([mailIcon, mailText]);
  759. topBarCont.zm_append([logo, tbMenu]);
  760. topBar.appendChild(topBarCont);
  761. msgMask.appendChild(msgCont);
  762. msgSbc.appendChild(msgSb);
  763. rightBarWrapper.zm_append([msgMask, msgSbc]);
  764. rightBar.appendChild(rightBarWrapper);
  765. headersMask.appendChild(headersCont);
  766. middleBarWrapper.zm_append([headersMask, headersSbc, headersFooter]);
  767. middleBar.appendChild(middleBarWrapper);
  768. winCont.zm_append([topBar, leftBar, middleBar, rightBar]);
  769. this.enableScroll(msgSb, msgSbc, msgCont);
  770. //middleBar Footer
  771. var pagesBar = create('div', cssStyles.middleBar.footer.pagesBar);
  772. var pagesInd = create('div', cssStyles.middleBar.footer.indicator);
  773. var pagesControlCont = create('div', cssStyles.middleBar.footer.pagesControls.cont);
  774. var pagesControlLabel = create('div', cssStyles.middleBar.footer.pagesControls.label);
  775. var selectAllCont = create('div', cssStyles.middleBar.footer.selectAll.span);
  776. var selectAllCheckBox = create('div', cssStyles.middleBar.footer.selectAll.checkBox);
  777. pagesBar.appendChild(pagesInd);
  778. selectAllCont.appendChild(selectAllCheckBox);
  779. headersFooter.zm_append([pagesBar, selectAllCont, pagesControlLabel, pagesControlCont]);
  780. headersFooter.onmouseover = function(){ pagesControlLabel.style.display = 'block' };
  781. headersFooter.onmouseout = function(){ pagesControlLabel.style.display = 'none' };
  782. var changePage = function(mode)
  783. {
  784. var f = root.selectedFolder, l = root.folders[f].msgs.length, t = Math.ceil(l / 30) - 1, p = root.selectedPage, np;
  785. var populate = function(){ root.populateHeaders.apply(root, arguments) }
  786. switch(mode)
  787. {
  788. case 'next': np = (p + 1 > t) ? t : p + 1; break;
  789. case 'previous': np = (p - 1 < 0) ? 0 : p - 1; break;
  790. case 'first': np = 0; break;
  791. case 'last': np = t; break;
  792. }
  793. if ( p == np) return;
  794. root.selectedPage = np;
  795. populate();
  796. };
  797. ['first', 'previous', 'next', 'last'].map(function(btn)
  798. {
  799. var controlBtn = create('div', cssStyles.middleBar.footer.pagesControls.icon);
  800. if (btn == 'previous') controlBtn.style.marginRight = '5px';
  801. controlBtn.style.backgroundImage = 'url(' + root.res.controls[btn] + ')';
  802. controlBtn.onclick = function(){ changePage(btn) };
  803. pagesControlCont.appendChild(controlBtn);
  804. });
  805. var selectAll = function(){ root.selectAll.apply(root, arguments) };
  806. var addGroup = function(){ root.addGroupToSelection.apply(root, arguments) };
  807. var removeGroup = function(){ root.removeGroupFromSelection.apply(root, arguments) };
  808. selectAllCheckBox.data = {'isChecked': false};
  809. selectAllCheckBox.onmousedown = function(){this.style.background = '#202020'};
  810. selectAllCheckBox.onmouseup = function()
  811. {
  812. var isChecked = this.data.isChecked;
  813. var color = isChecked ? 'transparent' : '#9f9f9f';
  814. this.style.background = color;
  815. this.data.isChecked = !isChecked;
  816. (root.selectedFolder) ? selectAll(!isChecked) : (isChecked) ? removeGroup() : addGroup();
  817. };
  818. ///////////////////////////////////////////////////////////////////////////////////
  819. //Search Messages
  820. var searchBox = create('textField', cssStyles.input.text.search);
  821. this.placeHolder(searchBox, 'Search...');
  822. var resultsCont = create('div', cssStyles.searchResults.cont);
  823. var resultsUl = create('ul', cssStyles.searchResults.ul);
  824. var bySender = create('li', cssStyles.searchResults.li.main);
  825. var bySubject = create('li', cssStyles.searchResults.li.main);
  826. var bySenderCount = create('span', cssStyles.searchResults.count);
  827. var bySubjectCount = create('span', cssStyles.searchResults.count);
  828. var bySenderUl = create('ul', cssStyles.searchResults.ul);
  829. var bySubjectUl = create('ul', cssStyles.searchResults.ul);
  830. var bySenderTxt = create('p', cssStyles.searchResults.text);
  831. var bySubjectTxt = create('p', cssStyles.searchResults.text);
  832. text(bySenderTxt, 'From: ');
  833. text(bySubjectTxt, 'Subject: ');
  834. bySenderTxt.appendChild(bySenderCount);
  835. bySubjectTxt.appendChild(bySubjectCount);
  836. bySender.zm_append([bySenderTxt, bySenderUl]);
  837. bySubject.zm_append([bySubjectTxt, bySubjectUl]);
  838. resultsUl.zm_append([bySender, bySubject]);
  839. resultsCont.appendChild(resultsUl);
  840. resultsCont.data = {'isFocused': false};
  841. var searchFolder = function(){ root.searchFolder.apply(root, arguments) };
  842. resultsCont.onmouseover = function(){this.data.isFocused = true};
  843. resultsCont.onmouseout = function(){this.data.isFocused = false};
  844. searchBox.onkeyup = function()
  845. {
  846. var str = this.value;
  847. searchFolder(str);
  848. };
  849. searchBox.onblur = function()
  850. {
  851. if (!resultsCont.data.isFocused) resultsCont.style.display = 'none';
  852. this.value = 'Search...';
  853. this.style.color = '#333333';
  854. };
  855. ///////////////////////////////////////////////////////////////////////////////////
  856. //folders & contacts
  857. var lbList = create('ul', cssStyles.ul.leftBar.main);
  858. var foldersLi = create('li', cssStyles.li.leftBar.main);
  859. var contactsLi = create('li', cssStyles.li.leftBar.main);
  860. var foldersUl = create('ul', cssStyles.ul.leftBar.sub);
  861. var contactsUl = create('ul', cssStyles.ul.leftBar.sub);
  862. var inboxLi = create('li', cssStyles.li.leftBar.subSelected);
  863. var outboxLi = create('li', cssStyles.li.leftBar.sub);
  864. var draftLi = create('li', cssStyles.li.leftBar.sub);
  865. var junkLi = create('li', cssStyles.li.leftBar.sub);
  866. var trashLi = create('li', cssStyles.li.leftBar.sub);
  867. var documentsLi = create('li', cssStyles.li.leftBar.sub);
  868. var friendsLi = create('li', cssStyles.li.leftBar.sub);
  869. var blockedLi = create('li', cssStyles.li.leftBar.sub);
  870. var allianceLi = create('li', cssStyles.li.leftBar.sub);
  871. var commandersLi = create('li', cssStyles.li.leftBar.sub);
  872. var officersLi = create('li', cssStyles.li.leftBar.sub);
  873. var alliesLi = create('li', cssStyles.li.leftBar.sub);
  874. var groupsLi = create('li', cssStyles.li.leftBar.sub);
  875. var inboxTxt = document.createTextNode('Inbox');
  876. var outboxTxt = document.createTextNode('Outbox');
  877. var draftTxt = document.createTextNode('Draft');
  878. var junkTxt = document.createTextNode('Junk');
  879. var trashTxt = document.createTextNode('Trash');
  880. var documentsTxt = document.createTextNode('Documents');
  881. var friendsTxt = document.createTextNode('Friends');
  882. var blockedTxt = document.createTextNode('Blocked');
  883. var allianceTxt = document.createTextNode('Alliance');
  884. var commandersTxt = document.createTextNode('Commanders');
  885. var officersTxt = document.createTextNode('Officers');
  886. var alliesTxt = document.createTextNode('Allies');
  887. var groupsTxt = document.createTextNode('Groups');
  888. inboxLi.appendChild(inboxTxt);
  889. outboxLi.appendChild(outboxTxt);
  890. draftLi.appendChild(draftTxt);
  891. junkLi.appendChild(junkTxt);
  892. trashLi.appendChild(trashTxt);
  893. documentsLi.appendChild(documentsTxt);
  894. friendsLi.appendChild(friendsTxt);
  895. blockedLi.appendChild(blockedTxt);
  896. allianceLi.appendChild(allianceTxt);
  897. commandersLi.appendChild(commandersTxt);
  898. officersLi.appendChild(officersTxt);
  899. alliesLi.appendChild(alliesTxt);
  900. groupsLi.appendChild(groupsTxt);
  901. var changeFolder = function(folder)
  902. {
  903. if (root.selectedGroup) root.dom.leftBar.items[root.selectedGroup].zm_css(cssStyles.li.leftBar.sub);
  904. if (root.selectedFolder) root.dom.leftBar.items[root.selectedFolder].zm_css(cssStyles.li.leftBar.sub);
  905. root.dom.leftBar.items[folder].zm_css(cssStyles.li.leftBar.subSelected);
  906. root.selectedFolder = folder;
  907. root.selectedGroup = false;
  908. root.resetMsgCont(1);
  909. root.selectedPage = 0;
  910. root.populateHeaders();
  911. searchBox.disabled = false;
  912. msgSb.data.update();
  913. };
  914. var changeGroup = function(group)
  915. {
  916. if (root.selectedGroup) root.dom.leftBar.items[root.selectedGroup].zm_css(cssStyles.li.leftBar.sub);
  917. if (root.selectedFolder) root.dom.leftBar.items[root.selectedFolder].zm_css(cssStyles.li.leftBar.sub);
  918. root.dom.leftBar.items[group].zm_css(cssStyles.li.leftBar.subSelected);
  919. root.selectedGroup = group;
  920. root.selectedFolder = false;
  921. root.populateContacts();
  922. searchBox.disabled = true;
  923. msgSb.data.update();
  924. };
  925. [[inboxLi,'inbox'],[outboxLi,'outbox'],[draftLi,'draft'],[junkLi,'junk'],[trashLi,'trash'],[documentsLi,'documents']].map(function(Item)
  926. {
  927. Item[0].onclick = function(){ changeFolder(Item[1]) }
  928. });
  929. [[friendsLi,'friends'],[blockedLi,'blocked'],[allianceLi,'alliance'],[commandersLi,'commanders'], [officersLi,'officers'], [alliesLi,'allies'], [groupsLi,'groups']].map(function(Item)
  930. {
  931. Item[0].onclick = function(){ changeGroup(Item[1]) }
  932. });
  933. foldersUl.zm_append([inboxLi, outboxLi, draftLi, junkLi, trashLi, documentsLi]);
  934. contactsUl.zm_append([allianceLi, commandersLi, officersLi, alliesLi, friendsLi, blockedLi, groupsLi]);
  935. foldersLi.zm_append([document.createTextNode('Folders'), foldersUl]);
  936. contactsLi.zm_append([document.createTextNode('Contacts'), contactsUl]);
  937. lbList.zm_append([foldersLi, contactsLi]);
  938. leftBarWrapper.zm_append([searchBox, lbList, resultsCont]);
  939. leftBar.appendChild(leftBarWrapper);
  940. this.dom.leftBar.folders.inbox = inboxTxt;
  941. this.dom.leftBar.folders.outbox = outboxTxt;
  942. this.dom.leftBar.folders.junk = junkTxt;
  943. this.dom.leftBar.folders.trash = trashTxt;
  944. this.dom.leftBar.folders.draft = draftTxt;
  945. this.dom.leftBar.folders.documents = documentsTxt;
  946. this.dom.leftBar.contacts.friends = friendsTxt;
  947. this.dom.leftBar.contacts.blocked = blockedTxt;
  948. this.dom.leftBar.contacts.alliance = allianceTxt;
  949. this.dom.leftBar.contacts.commanders = commandersTxt;
  950. this.dom.leftBar.contacts.officers = officersTxt;
  951. this.dom.leftBar.contacts.allies = alliesTxt;
  952. this.dom.leftBar.contacts.groups = groupsTxt;
  953. this.dom.leftBar.items.inbox = inboxLi;
  954. this.dom.leftBar.items.outbox = outboxLi;
  955. this.dom.leftBar.items.junk = junkLi;
  956. this.dom.leftBar.items.trash = trashLi;
  957. this.dom.leftBar.items.draft = draftLi;
  958. this.dom.leftBar.items.documents = documentsLi;
  959. this.dom.leftBar.items.friends = friendsLi;
  960. this.dom.leftBar.items.blocked = blockedLi;
  961. this.dom.leftBar.items.alliance = allianceLi;
  962. this.dom.leftBar.items.commanders = commandersLi;
  963. this.dom.leftBar.items.officers = officersLi;
  964. this.dom.leftBar.items.allies = alliesLi;
  965. this.dom.leftBar.items.groups = groupsLi;
  966. this.dom.leftBar.searchBox = searchBox;
  967. ///////////////////////////////////////////////////////////////////////////////////
  968. //selected contacts container
  969. var sc_mainCont = document.createElement('div');
  970. var sc_upperCont = create('div', cssStyles.rightBar.contacts.topWrapper);
  971. var sc_lowerCont = create('div', cssStyles.rightBar.contacts.bottomWrapper);
  972. var sc_header = create('div', cssStyles.message.subject);
  973. var sc_contactsMain = create('div', cssStyles.rightBar.contacts.main);
  974. var sc_contactsMask = create('div', cssStyles.rightBar.contacts.mask);
  975. var sc_contactsSbc = create('div', cssStyles.rightBar.contacts.scrollbar.cont);
  976. var sc_contactsSb = create('div', cssStyles.rightBar.contacts.scrollbar.bar);
  977. var sc_contactsCont = create('div', cssStyles.rightBar.contacts.cont);
  978. var sc_findPlayer = create('textField', cssStyles.rightBar.contacts.search);
  979. var sc_removeAll = create('div', cssStyles.rightBar.contacts.button.disabled);
  980. var sc_message = create('div', cssStyles.rightBar.contacts.button.disabled);
  981. var sc_addToSelection = create('div', cssStyles.rightBar.contacts.button.active);
  982. var sc_addAsFriend = create('div', cssStyles.rightBar.contacts.button.active);
  983. var sc_block = create('div', cssStyles.rightBar.contacts.button.active);
  984. var sc_resultsCont = create('div', cssStyles.rightBar.contacts.results.cont);
  985. var sc_resultsMask = create('div', cssStyles.rightBar.contacts.results.mask);
  986. var sc_resultsContentCont = create('div', cssStyles.rightBar.contacts.results.contentsCont);
  987. var sc_resultsSbc = create('div', cssStyles.rightBar.contacts.results.scrollbar.cont);
  988. var sc_saveGroup = create('div', cssStyles.rightBar.contacts.saveButton.cont.disabled);
  989. var sc_saveGroupOptions = create('span', cssStyles.rightBar.contacts.saveButton.span);
  990. var sc_saveNewGroup = create('div', cssStyles.rightBar.contacts.saveButton.sub);
  991. var sc_saveExistedGroup = create('div', cssStyles.rightBar.contacts.saveButton.sub);
  992. text(sc_header, 'No contacts selected.');
  993. text(sc_removeAll, 'Remove all');
  994. text(sc_message, 'Message');
  995. text(sc_saveGroup, 'Save group');
  996. text(sc_saveNewGroup, 'New group');
  997. text(sc_saveExistedGroup, 'Existed group');
  998. text(sc_addToSelection, 'Add to selection');
  999. text(sc_addAsFriend, 'Add as friend');
  1000. text(sc_block, 'Block');
  1001. this.placeHolder(sc_findPlayer, 'Find player...');
  1002. sc_mainCont.style.overflow = 'hidden';
  1003. sc_removeAll.zm_css({'display': 'inline-block', 'verticalAlign': 'top', 'width': '101px'});
  1004. sc_message.zm_css({'display': 'inline-block', 'verticalAlign': 'top', 'marginLeft': '5px', 'width': '80px'});
  1005. [sc_addToSelection, sc_addAsFriend, sc_block].map(function(x){ x.zm_css({'width': '120px', 'margin': '0 auto 5px auto'}) });
  1006. root.enableScroll(sc_contactsSb, sc_contactsSbc, sc_contactsCont);
  1007. sc_mainCont.style.height = '471px';
  1008. sc_lowerCont.style.display = 'none';
  1009. sc_saveGroupOptions.zm_append([sc_saveNewGroup, sc_saveExistedGroup]);
  1010. sc_saveGroup.appendChild(sc_saveGroupOptions);
  1011. sc_resultsMask.appendChild(sc_resultsContentCont);
  1012. sc_resultsCont.zm_append([sc_resultsMask, sc_resultsSbc]);
  1013. sc_contactsSbc.appendChild(sc_contactsSb);
  1014. sc_contactsMask.appendChild(sc_contactsCont);
  1015. sc_contactsMain.zm_append([sc_contactsMask, sc_contactsSbc]);
  1016. sc_upperCont.zm_append([sc_contactsMain, sc_findPlayer, sc_removeAll, sc_message]);
  1017. sc_lowerCont.zm_append([sc_addToSelection, sc_addAsFriend, sc_block]);
  1018. sc_mainCont.zm_append([sc_header, sc_upperCont, sc_lowerCont, sc_resultsCont, sc_saveGroup]);
  1019. this.dom.rightBar.contacts.main = sc_mainCont;
  1020. this.dom.rightBar.contacts.lowerCont = sc_lowerCont;
  1021. this.dom.rightBar.contacts.header = sc_header;
  1022. this.dom.rightBar.contacts.cont = sc_contactsCont;
  1023. this.dom.rightBar.contacts.bar = sc_contactsSb;
  1024. this.dom.rightBar.contacts.search = sc_findPlayer;
  1025. this.dom.rightBar.contacts.results = sc_resultsCont;
  1026. this.dom.rightBar.contacts.scrollbarCont = sc_resultsSbc;
  1027. this.dom.rightBar.contacts.contentsCont = sc_resultsContentCont;
  1028. this.dom.rightBar.contacts.buttons.removeAll = sc_removeAll;
  1029. this.dom.rightBar.contacts.buttons.message = sc_message;
  1030. this.dom.rightBar.contacts.buttons.addToSelection = sc_addToSelection;
  1031. this.dom.rightBar.contacts.buttons.addAsFriend = sc_addAsFriend;
  1032. this.dom.rightBar.contacts.buttons.block = sc_block;
  1033. this.dom.rightBar.contacts.buttons.saveGroup = sc_saveGroup;
  1034. var addFriend = function(){ root.addFriend.apply(root, arguments) };
  1035. var removeFriend = function(){ root.removeFriend.apply(root, arguments) };
  1036. var blockContact = function(){ root.blockContact.apply(root, arguments) };
  1037. var unblockContact = function(){ root.unblockContact.apply(root, arguments) };
  1038. var removeAllSelectedContacts = function(){ root.removeAllSelectedContacts.apply(root, arguments) };
  1039. var addContact = function(){ root.addToSelection.apply(root, arguments) };
  1040. var removeContact = function(){ root.removeFromSelection.apply(root, arguments) };
  1041. var setContactOptions = function(){ root.setContactOptions.apply(root, arguments) };
  1042. var newMail = function(){ root.openNewMail.apply(root, arguments) };
  1043. var saveNewGroup = function(){ root.saveNewGroup.apply(root, arguments) };
  1044. var saveExistedGroup = function(){ root.saveExistedGroup.apply(root, arguments) };
  1045. sc_addToSelection.data = {'add':addContact, 'remove':removeContact, 'id':null, 'mode':null, 'update':setContactOptions};
  1046. sc_addAsFriend.data = {'add':addFriend, 'remove':removeFriend, 'id':null, 'mode':null, 'update':setContactOptions};
  1047. sc_block.data = {'block':blockContact, 'unblock':unblockContact, 'id':null, 'mode':null, 'update':setContactOptions};
  1048. sc_removeAll.data = {};
  1049. sc_message.data = {};
  1050. sc_saveGroup.data = {'isExpanded': false, 'isEnabled': false};
  1051. sc_saveGroupOptions.data = {'isFocused': false};
  1052. sc_addToSelection.onclick = function()
  1053. {
  1054. ((this.data.isEnabled)&&(this.data.mode == 'add')) ? this.data.add(this.data.id) : this.data.remove(this.data.id);
  1055. this.data.update(this.data.id);
  1056. };
  1057. sc_addAsFriend.onclick = function()
  1058. {
  1059. ((this.data.isEnabled)&&(this.data.mode == 'add')) ? this.data.add(this.data.id) : this.data.remove(this.data.id);
  1060. this.data.update(this.data.id);
  1061. };
  1062. sc_block.onclick = function()
  1063. {
  1064. ((this.data.isEnabled)&&(this.data.mode == 'block')) ? this.data.block(this.data.id) : this.data.unblock(this.data.id);
  1065. this.data.update(this.data.id);
  1066. };
  1067. sc_removeAll.onclick = removeAllSelectedContacts;
  1068. sc_saveGroup.onclick = function()
  1069. {
  1070. var enabled = this.data.isEnabled;
  1071. if (enabled)
  1072. {
  1073. var expanded = this.data.isExpanded;
  1074. sc_saveGroupOptions.style.display = (expanded) ? 'none' : 'block';
  1075. this.data.isExpanded = !expanded;
  1076. }
  1077. };
  1078. sc_saveNewGroup.addEventListener('mouseover', function(){sc_saveGroupOptions.data.isFocused = true;}, false);
  1079. sc_saveExistedGroup.addEventListener('mouseover', function(){sc_saveGroupOptions.data.isFocused = true;}, false);
  1080. sc_saveGroupOptions.addEventListener('mouseout', function()
  1081. {
  1082. sc_saveGroupOptions.data.isFocused = false;
  1083. setTimeout(function()
  1084. {
  1085. var expanded = sc_saveGroup.data.isExpanded, focused = sc_saveGroupOptions.data.isFocused;
  1086. if (expanded && !focused)
  1087. {
  1088. sc_saveGroupOptions.style.display = 'none';
  1089. sc_saveGroup.data.isExpanded = false;
  1090. }
  1091. }, 50);
  1092. }, false);
  1093. sc_saveNewGroup.onclick = function()
  1094. {
  1095. sc_saveGroupOptions.style.display = 'none';
  1096. sc_saveGroupOptions.data.isFocused = false;
  1097. sc_saveGroup.data.isExpanded = false;
  1098. saveNewGroup();
  1099. };
  1100. sc_saveExistedGroup.onclick = function()
  1101. {
  1102. sc_saveGroupOptions.style.display = 'none';
  1103. sc_saveGroupOptions.data.isFocused = false;
  1104. sc_saveGroup.data.isExpanded = false;
  1105. saveExistedGroup();
  1106. };
  1107. sc_message.onclick = function(){ if(this.data.isEnabled) newMail(1) };
  1108. [sc_addToSelection, sc_addAsFriend, sc_block, sc_removeAll, sc_message, sc_saveGroup].map(function(btn)
  1109. {
  1110. var enable = function()
  1111. {
  1112. this.zm_css(cssStyles.rightBar.contacts.button.active);
  1113. this.data.isEnabled = true;
  1114. };
  1115. var disable = function()
  1116. {
  1117. this.zm_css(cssStyles.rightBar.contacts.button.disabled);
  1118. this.data.isEnabled = false;
  1119. }
  1120. btn.data.enable = function(){ enable.call(btn) };
  1121. btn.data.disable = function(){ disable.call(btn) };
  1122. btn.data.isEnabled = (btn == sc_saveGroup) ? false : true;
  1123. });
  1124. sc_resultsCont.onmouseover = function(){sc_findPlayer.data.isContFocused = true};
  1125. sc_resultsCont.onmouseout = function(){sc_findPlayer.data.isContFocused = false};
  1126. sc_lowerCont.onmouseover = function(){sc_findPlayer.data.isContFocused = true};
  1127. sc_lowerCont.onmouseout = function(){sc_findPlayer.data.isContFocused = false};
  1128. sc_findPlayer.data = {'results': [], 'selectedIndex': 0, 'selectedGroup': 'results', 'selectedButton': 0, 'isContOpen': false, 'isContFocused': false, 'buttons': [sc_addToSelection, sc_addAsFriend, sc_block]};
  1129. sc_findPlayer.onblur = function()
  1130. {
  1131. if (this.data.isContOpen && !this.data.isContFocused)
  1132. {
  1133. this.value = 'Find player...';
  1134. this.data.selectedGroup = 'results';
  1135. this.data.buttons[this.data.selectedButton].zm_css({'background': '#4e4e4e', 'color': '#8b8b8b'});
  1136. this.data.selectedButton = 0;
  1137. this.data.selectedIndex = 0;
  1138. sc_resultsCont.style.display = 'none';
  1139. sc_lowerCont.style.display = 'none';
  1140. sc_saveGroup.style.display = 'block';
  1141. }
  1142. };
  1143. sc_findPlayer.onkeyup = function(event)
  1144. {
  1145. if(!event) event = window.event;
  1146. root.preventDefaults(event);
  1147. var populate = function(){ root.findContact.apply(root, arguments) };
  1148. var changeSelection = function(){ root.changeContactSelection.apply(root, arguments) };
  1149. var updateOptions = function(){ root.setContactOptions.apply(root, arguments) };
  1150. var group = this.data.selectedGroup, btns = this.data.buttons;
  1151. var i = this.data.selectedButton, l = btns.length, parent = this;
  1152. var changeButton = function(mode)
  1153. {
  1154. var getIndex = function(mode, x)
  1155. {
  1156. return (mode) ? ((i + x) % l) : ((i - x < 0) ? l - x : i - x);
  1157. };
  1158. var n = (btns[getIndex(mode, 1)].data.isEnabled) ? getIndex(mode, 1) : getIndex(mode, 2);
  1159. if(btns[i].data.isEnabled) btns[i].zm_css({'background': '#4e4e4e', 'color': '#8b8b8b'});
  1160. if(btns[n].data.isEnabled) btns[n].zm_css({'background': '#266589', 'color': '#c2c2c2'});
  1161. parent.data.selectedButton = n;
  1162. }
  1163. if([37, 38, 39, 40, 13, 9].indexOf(event.keyCode) == -1)
  1164. {
  1165. populate(this.value);
  1166. }
  1167. if(event.keyCode == 38 && this.data.isContOpen)
  1168. {
  1169. group == 'results' ? changeSelection(false) : changeButton(false);
  1170. }
  1171. if(event.keyCode == 40 && this.data.isContOpen)
  1172. {
  1173. group == 'results' ? changeSelection(true) : changeButton(true);
  1174. }
  1175. if(event.keyCode == 37 && this.data.isContOpen && group == 'buttons')
  1176. {
  1177. this.data.selectedGroup = 'results';
  1178. var selectedButton = this.data.buttons[this.data.selectedButton];
  1179. if(selectedButton.data.isEnabled) selectedButton.zm_css({'background': '#4e4e4e', 'color': '#8b8b8b'});
  1180. this.data.selectedButton = 0;
  1181. }
  1182. if(event.keyCode == 39 && this.data.isContOpen && group == 'results')
  1183. {
  1184. this.data.selectedGroup = 'buttons';
  1185. this.data.buttons[0].zm_css({'background': '#266589', 'color': '#c2c2c2'});
  1186. }
  1187. if(event.keyCode == 13 && this.data.isContOpen)
  1188. {
  1189. if (group == 'buttons')
  1190. {
  1191. this.data.buttons[this.data.selectedButton].onclick();
  1192. updateOptions(this.data.results[this.data.selectedIndex].data.id);
  1193. var button = this.data.buttons[this.data.selectedButton];
  1194. if (button.data.isEnabled) button.zm_css({'background': '#266589', 'color': '#c2c2c2'});
  1195. else
  1196. {
  1197. this.data.buttons[0].zm_css({'background': '#266589', 'color': '#c2c2c2'});
  1198. this.data.selectedButton = 0;
  1199. }
  1200. }
  1201. }
  1202. };
  1203. ///////////////////////////////////////////////////////////////////////////////////
  1204. //tools bar
  1205. var toolsConstructor = function()
  1206. {
  1207. var inboxMsg = create('ul', cssStyles.ul.toolbar.main);
  1208. var newMsg = create('li', cssStyles.li.toolbar.withIcon);
  1209. var reply = create('li', cssStyles.li.toolbar.withDrop);
  1210. var mark = create('li', cssStyles.li.toolbar.withDrop);
  1211. var trash = create('li', cssStyles.li.toolbar.textOnly);
  1212. var restore = create('li', cssStyles.li.toolbar.textOnly);
  1213. var empty = create('li', cssStyles.li.toolbar.textOnly);
  1214. var del = create('li', cssStyles.li.toolbar.textOnly);
  1215. var newMsgIcon = create('span', cssStyles.li.toolbar.newIcon);
  1216. var junk = create('li', cssStyles.li.toolbar.textOnly);
  1217. var notJunk = create('li', cssStyles.li.toolbar.textOnly);
  1218. var markDrop = create('span', cssStyles.li.toolbar.drop);
  1219. var replyDrop = create('span', cssStyles.li.toolbar.drop);
  1220. var replyDropMenu = create('ul', cssStyles.ul.toolbar.sub);
  1221. var markDropMenu = create('ul', cssStyles.ul.toolbar.sub);
  1222. var replyTo = create('li', cssStyles.li.toolbar.sub);
  1223. var replyToAll = create('li', cssStyles.li.toolbar.sub);
  1224. var forwardTo = create('li', cssStyles.li.toolbar.sub);
  1225. var read = create('li', cssStyles.li.toolbar.sub);
  1226. var unread = create('li', cssStyles.li.toolbar.sub);
  1227. var editDraft = create('li', cssStyles.li.toolbar.textOnly);
  1228. var deleteDraft = create('li', cssStyles.li.toolbar.textOnly);
  1229. var toDocuments = create('li', cssStyles.li.toolbar.textOnly);
  1230. var notDocument = create('li', cssStyles.li.toolbar.textOnly);
  1231. var fwdMsg = create('li', cssStyles.li.toolbar.textOnly);
  1232. var tabs = [newMsg, reply, mark, del, junk, trash, notJunk, restore, empty, editDraft, deleteDraft, toDocuments, notDocument, fwdMsg];
  1233. tabs.map(function(key)
  1234. {
  1235. key.addEventListener('mouseover', function(){this.style.backgroundImage = blueGrd}, false);
  1236. key.addEventListener('mouseout', function(){this.style.backgroundImage = 'none'}, false);
  1237. key.addEventListener('click', function(){this.style.backgroundImage = 'none'}, false);
  1238. });
  1239. text(newMsg, 'New');
  1240. text(reply, 'Reply');
  1241. text(del, 'Delete');
  1242. text(mark, 'Mark');
  1243. text(junk, 'Junk');
  1244. text(notJunk, 'Not Junk');
  1245. text(trash, 'Trash');
  1246. text(empty, 'Empty');
  1247. text(restore, 'Restore');
  1248. text(replyTo, 'Reply');
  1249. text(replyToAll, 'Reply all');
  1250. text(forwardTo, 'Forward');
  1251. text(read, 'Read');
  1252. text(unread, 'Unread');
  1253. text(editDraft, 'Edit');
  1254. text(deleteDraft, 'Delete');
  1255. text(toDocuments, 'Document');
  1256. text(notDocument, 'Move to Inbox');
  1257. text(fwdMsg, 'Forward');
  1258. markDrop.style.backgroundImage = 'url(' + root.res.drop + ')';
  1259. replyDrop.style.backgroundImage = 'url(' + root.res.drop + ')';
  1260. newMsgIcon.style.backgroundImage = 'url(' + root.res.compose + ')';
  1261. forwardTo.style.borderBottom = 'none';
  1262. unread.style.borderBottom = 'none';
  1263. replyDropMenu.zm_append([replyTo, replyToAll, forwardTo]);
  1264. markDropMenu.zm_append([read, unread]);
  1265. newMsg.appendChild(newMsgIcon);
  1266. mark.zm_append([markDrop, markDropMenu]);
  1267. reply.zm_append([replyDrop, replyDropMenu]);
  1268. inboxMsg.appendChild(newMsg);
  1269. newMsg.onclick = root.callMethod('openNewMail');
  1270. replyTo.onclick = root.callMethod('reply');
  1271. replyToAll.onclick = root.callMethod('replyToAll');
  1272. forwardTo.onclick = root.callMethod('forwardMsg');
  1273. junk.onclick = root.callMethod('toJunk');
  1274. notJunk.onclick = root.callMethod('notJunk');
  1275. trash.onclick = root.callMethod('toTrash');
  1276. restore.onclick = root.callMethod('notTrash');
  1277. del.onclick = root.callMethod('deleteMsg');
  1278. empty.onclick = root.callMethod('emptyFolder');
  1279. read.onclick = root.callMethod('markRead', true);
  1280. unread.onclick = root.callMethod('markRead', false);
  1281. editDraft.onclick = root.callMethod('editDraft');
  1282. deleteDraft.onclick = root.callMethod('deleteDraft');
  1283. toDocuments.onclick = root.callMethod('toDocuments');
  1284. notDocument.onclick = root.callMethod('notDocument');
  1285. fwdMsg.onclick = root.callMethod('forwardMsg');
  1286. var attachSub = function(btn, menu)
  1287. {
  1288. btn.data = {'isActive': false};
  1289. menu.data = {'isFocused': false};
  1290. btn.addEventListener('mouseover', function()
  1291. {
  1292. var isActive = this.data.isActive;
  1293. menu.style.display = (isActive) ? 'none' : 'block';
  1294. this.data.isActive = !isActive;
  1295. }, false);
  1296. btn.addEventListener('mouseout', function()
  1297. {
  1298. setTimeout(function(){if(!menu.data.isFocused){menu.style.display = 'none'; btn.data.isActive = false;}}, 100);
  1299. }, false);
  1300. menu.addEventListener('mouseover', function(){this.data.isFocused = true;}, false);
  1301. menu.addEventListener('mouseout', function()
  1302. {
  1303. this.data.isFocused = false;
  1304. setTimeout(function(){if(!menu.data.isFocused){menu.style.display = 'none'; btn.data.isActive = false;}}, 100);
  1305. }, false);
  1306. menu.addEventListener('click', function()
  1307. {
  1308. this.data.isFocused = false;
  1309. menu.style.display = 'none';
  1310. btn.data.isActive = false;
  1311. }, false);
  1312. }
  1313. attachSub(replyDrop, replyDropMenu);
  1314. attachSub(markDrop, markDropMenu);
  1315. root.dom.toolBar.compose = newMsg;
  1316. root.dom.topBar.toolbar.newMsg = newMsg;
  1317. root.dom.topBar.toolbar.reply = reply;
  1318. root.dom.topBar.toolbar.trash = trash;
  1319. root.dom.topBar.toolbar.delMsg = del;
  1320. root.dom.topBar.toolbar.junk = junk;
  1321. root.dom.topBar.toolbar.notJunk = notJunk;
  1322. root.dom.topBar.toolbar.restore = restore;
  1323. root.dom.topBar.toolbar.empty = empty;
  1324. root.dom.topBar.toolbar.mark = mark;
  1325. root.dom.topBar.toolbar.editDraft = editDraft;
  1326. root.dom.topBar.toolbar.deleteDraft = deleteDraft;
  1327. root.dom.topBar.toolbar.toDocuments = toDocuments;
  1328. root.dom.topBar.toolbar.notDocument = notDocument;
  1329. root.dom.topBar.toolbar.forwardMsg = fwdMsg;
  1330. this.inboxMsg = inboxMsg;
  1331. };
  1332. var toolbars = new toolsConstructor();
  1333. tbMenu.appendChild(toolbars.inboxMsg);
  1334. ///////////////////////////////////////////////////////////////////////////////////
  1335. //create main dom tree
  1336. this.dom.window.main = winCont;
  1337. this.dom.rightBar.cont = rightBar;
  1338. this.dom.rightBar.msgCont = msgCont;
  1339. this.dom.rightBar.scrollBar.cont = msgSbc;
  1340. this.dom.rightBar.scrollBar.bar = msgSb;
  1341. this.dom.rightBar.expandCont = expandCont;
  1342. this.dom.searchResults.cont = resultsCont;
  1343. this.dom.searchResults.sender.count = bySenderCount;
  1344. this.dom.searchResults.subject.count = bySubjectCount;
  1345. this.dom.searchResults.sender.list = bySenderUl;
  1346. this.dom.searchResults.subject.list = bySubjectUl;
  1347. this.dom.middleBar.headersCont = headersCont;
  1348. this.dom.middleBar.scrollBar.cont = headersSbc;
  1349. this.dom.middleBar.footer.selectAll = selectAllCheckBox;
  1350. this.dom.middleBar.footer.pagesCount = pagesControlLabel;
  1351. this.dom.middleBar.footer.indicator = pagesInd;
  1352. this.dom.middleBar.footer.controlCont = pagesControlCont;
  1353. this.dom.topBar.logo = logo;
  1354. this.dom.topBar.menu = toolbars.inboxMsg;
  1355. ///////////////////////////////////////////////////////////////////////////////////
  1356. //compose message container
  1357. var composeCont = create('div', cssStyles.compose.window);
  1358. var c_topBar = create('div', cssStyles.topBar.main);
  1359. var c_topBarCont = create('div', cssStyles.topBar.cont);
  1360. var c_leftBar = create('div', cssStyles.compose.leftBar.cont);
  1361. var c_rightBar = create('div', cssStyles.compose.rightBar.cont);
  1362. var c_leftBarWrapper = create('div', cssStyles.tableCellWrapper);
  1363. var c_rightBarWrapper = create('div', cssStyles.tableCellWrapper);
  1364. var c_logo = logo.cloneNode(true);
  1365. var c_tbMenu = create('div', cssStyles.topBar.menu);
  1366. var c_recipients = create('div', cssStyles.compose.leftBar.recipients.main);
  1367. var c_recipientsMask = create('div', cssStyles.compose.leftBar.recipients.mask);
  1368. var c_recipientsCont = create('div', cssStyles.compose.leftBar.recipients.cont);
  1369. var c_recipientsSbc = create('div', cssStyles.compose.leftBar.recipients.scrollbar.cont);
  1370. var c_recipientsSb = create('div', cssStyles.compose.leftBar.recipients.scrollbar.bar);
  1371. var c_searchResults = create('div', cssStyles.compose.leftBar.recipients.searchBox.cont);
  1372. var c_contacts = create('div', cssStyles.compose.leftBar.contacts.cont);
  1373. var c_subject = create('textField', cssStyles.compose.rightBar.textField);
  1374. var c_msgToolbar = create('div', cssStyles.compose.rightBar.toolbar.cont);
  1375. var c_msgBody = create('iframe', cssStyles.compose.rightBar.textArea);
  1376. var c_expandCont = create('div', cssStyles.compose.rightBar.expand);
  1377. //table options
  1378. var c_tableOptions = create('div', cssStyles.tableCellWrapper);
  1379. var c_rowsCont = create('div', cssStyles.compose.leftBar.tableOptions.inputCont);
  1380. var c_rowsInput = create('textField', cssStyles.compose.leftBar.tableOptions.input);
  1381. var c_rowsLabel = create('div', cssStyles.compose.leftBar.tableOptions.label);
  1382. var c_colsInput = create('textField', cssStyles.compose.leftBar.tableOptions.input);
  1383. var c_colsCont = create('div', cssStyles.compose.leftBar.tableOptions.inputCont);
  1384. var c_colsLabel = create('div', cssStyles.compose.leftBar.tableOptions.label);
  1385. var c_headerCheckbox = create('div', cssStyles.compose.leftBar.tableOptions.checkbox);
  1386. var c_headerLabel = create('span', cssStyles.compose.leftBar.tableOptions.span);
  1387. var c_expandCheckbox = create('div', cssStyles.compose.leftBar.tableOptions.checkbox);
  1388. var c_expandLabel = create('span', cssStyles.compose.leftBar.tableOptions.span);
  1389. var c_addTable = create('div', cssStyles.compose.leftBar.tableOptions.button);
  1390. var c_cancelTable = create('div', cssStyles.compose.leftBar.tableOptions.button);
  1391. text(c_rowsLabel, 'Rows');
  1392. text(c_colsLabel, 'Columns');
  1393. text(c_headerLabel, 'Header');
  1394. text(c_expandLabel, 'Expand horizontally');
  1395. text(c_addTable, 'Add table');
  1396. text(c_cancelTable, 'Cancel');
  1397. c_tableOptions.data = {'isOpen': false};
  1398. c_headerCheckbox.data = {'isChecked': false};
  1399. c_expandCheckbox.data = {'isChecked': false};
  1400. c_tableOptions.style.paddingTop = '10px';
  1401. [c_expandCheckbox, c_headerCheckbox].map(function(checkBox)
  1402. {
  1403. checkBox.onmousedown = function(){this.style.background = '#202020'};
  1404. checkBox.onmouseup = function()
  1405. {
  1406. var isChecked = this.data.isChecked;
  1407. this.style.background = (isChecked) ? 'transparent' : '#9f9f9f';
  1408. this.data.isChecked = !isChecked;
  1409. };
  1410. });
  1411. c_rowsCont.zm_append([c_rowsInput, c_rowsLabel]);
  1412. c_colsCont.zm_append([c_colsInput, c_colsLabel]);
  1413. c_headerCheckbox.appendChild(c_headerLabel);
  1414. c_expandCheckbox.appendChild(c_expandLabel);
  1415. c_tableOptions.zm_append([c_rowsCont, c_colsCont, c_headerCheckbox, c_expandCheckbox, c_addTable, c_cancelTable]);
  1416. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1417. //Compose contacts list
  1418. var createComposeContacts = function()
  1419. {
  1420. try
  1421. {
  1422. var c_contactsCont = create('div', cssStyles.compose.leftBar.contacts.main);
  1423. var c_mainUl = create('ul', cssStyles.compose.leftBar.contacts.ul.main);
  1424. var c_subUl = create('ul', cssStyles.compose.leftBar.contacts.ul.sub);
  1425. var c_contactsLi = create('li', cssStyles.compose.leftBar.contacts.li.main);
  1426. var c_contLi = create('li', cssStyles.compose.leftBar.contacts.li.main);
  1427. text(c_contactsLi, 'Contacts');
  1428. var c_contactsList = ['Alliance', 'Commanders', 'Officers', 'Allies', 'Friends', 'Groups'];
  1429. c_contactsList.map(function(name)
  1430. {
  1431. var data = zmail.data.getInstance();
  1432. var li = create('li', cssStyles.compose.leftBar.contacts.li.sub);
  1433. var div = create('div', cssStyles.compose.leftBar.contacts.select);
  1434. var divText = document.createTextNode(name);
  1435. var selectSpan = create('span', cssStyles.compose.leftBar.contacts.span.sub);
  1436. var itemsCont = create('ul', cssStyles.compose.leftBar.contacts.ul.span);
  1437. var selectSbc = create('div', cssStyles.compose.leftBar.contacts.scrollbar.cont);
  1438. var selectSb = create('div', cssStyles.compose.leftBar.contacts.scrollbar.bar);
  1439. var span = create('span', cssStyles.compose.leftBar.contacts.span.main);
  1440. text(span, 'Add selected');
  1441. div.appendChild(divText);
  1442. div.data = {'selected': null};
  1443. itemsCont.data = {'isFocused': false};
  1444. div.addEventListener('mouseover', function()
  1445. {
  1446. if (itemsCont.children.length > 0)
  1447. {
  1448. divText.nodeValue = '+ ' + divText.nodeValue;
  1449. this.style.cursor = 'pointer';
  1450. }
  1451. else this.style.cursor = 'default';
  1452. }, false);
  1453. div.addEventListener('mouseout', function(){divText.nodeValue = divText.nodeValue.replace('+ ', '')}, false);
  1454. div.onclick = function()
  1455. {
  1456. var isOpen = (selectSpan.style.display == 'block');
  1457. if ((itemsCont.children.length > 0) && !isOpen) selectSpan.style.display = 'block';
  1458. if (isOpen) selectSpan.style.display = 'none';
  1459. };
  1460. itemsCont.addEventListener('mouseout', function()
  1461. {
  1462. setTimeout(function(){if (!itemsCont.data.isFocused) selectSpan.style.display = 'none'}, 50);
  1463. itemsCont.data.isFocused = false;
  1464. }, false);
  1465. li.addEventListener('mouseover', function(){if(div.data.selected !== null) span.style.display='block'}, false);
  1466. li.addEventListener('mouseout', function()
  1467. {
  1468. span.style.display = 'none';
  1469. setTimeout(function(){if (!itemsCont.data.isFocused) selectSpan.style.display = 'none'}, 50);
  1470. }, false);
  1471. selectSbc.addEventListener('mouseover', function(){itemsCont.data.isFocused = true}, false);
  1472. selectSb.addEventListener('mouseover', function(){itemsCont.data.isFocused = true}, false);
  1473. var extractName = function(obj)
  1474. {
  1475. if (obj.hasOwnProperty('name')) return obj.name;
  1476. else if(obj.hasOwnProperty('n')) return obj.n;
  1477. else console.log('zmail: ' + 'Error: ' + obj + ' doesn\'t have property name');
  1478. };
  1479. var compareName = function(a,b)
  1480. {
  1481. return (a.toLowerCase() > b.toLowerCase()) ? 1 : (a.toLowerCase() < b.toLowerCase()) ? -1 : 0;
  1482. };
  1483. var contacts = ((name == 'Allies')||(name == 'Groups')) ? {} : [];
  1484. switch(name)
  1485. {
  1486. case 'Friends': root.contacts.friends.map(function(x){contacts.push(root.getPlayerNameById(x))}); break;
  1487. case 'Allies':
  1488. var arr = data.allies;
  1489. if (arr) for (var x in arr) contacts[x] = arr[x].map(extractName);
  1490. break;
  1491. case 'Groups':
  1492. var arr = root.contacts.groups;
  1493. if (arr) for (var x in arr) contacts[x] = arr[x].map(extractName);
  1494. break;
  1495. case 'Alliance': if (data.allianceMembers) contacts = data.allianceMembers.map(extractName); break;
  1496. case 'Commanders': if (data.allianceCommanders) contacts = data.allianceCommanders.map(extractName); break;
  1497. case 'Officers': if (data.allianceOfficers) contacts = data.allianceOfficers.map(extractName); break;
  1498. }
  1499. span.onclick = function()
  1500. {
  1501. var con = div.data.selected;
  1502. for (var i = 0; i < con.length; i++) root.addRecipient(con[i]);
  1503. divText.nodeValue = name;
  1504. div.data.selected = (name == 'Allies') ? null : contacts;
  1505. };
  1506. var selectItem = function(a,b)
  1507. {
  1508. var fn = function()
  1509. {
  1510. divText.nodeValue = a;
  1511. div.data.selected = b;
  1512. selectSpan.style.display = 'none';
  1513. }
  1514. return fn;
  1515. };
  1516. if ((name != 'Allies') && (name != 'Groups') && contacts && (contacts.length > 0))
  1517. {
  1518. contacts.sort(compareName);
  1519. var All = create('li', cssStyles.compose.leftBar.contacts.li.span);
  1520. text(All, 'All');
  1521. itemsCont.appendChild(All);
  1522. All.onclick = selectItem(name, contacts);
  1523. All.addEventListener('mouseover', function(){itemsCont.data.isFocused = true}, false);
  1524. for(var i = 0; i < contacts.length; i++)
  1525. {
  1526. var Item = create('li', cssStyles.compose.leftBar.contacts.li.span);
  1527. text(Item, contacts[i]);
  1528. Item.onclick = selectItem(contacts[i], [contacts[i]]);
  1529. Item.addEventListener('mouseover', function(){itemsCont.data.isFocused = true}, false);
  1530. itemsCont.appendChild(Item);
  1531. }
  1532. div.data.selected = contacts;
  1533. }
  1534. else if ((name == 'Allies') && contacts && (root.size(contacts) > 0))
  1535. {
  1536. for (var an in contacts)
  1537. {
  1538. var Item = create('li', cssStyles.compose.leftBar.contacts.li.span);
  1539. text(Item, an);
  1540. Item.onclick = selectItem(an, contacts[an].sort(compareName));
  1541. Item.addEventListener('mouseover', function(){itemsCont.data.isFocused = true}, false);
  1542. itemsCont.appendChild(Item);
  1543. }
  1544. }
  1545. else if ((name == 'Groups') && contacts && (root.size(contacts) > 0))
  1546. {
  1547. for (var gn in contacts)
  1548. {
  1549. var Item = create('li', cssStyles.compose.leftBar.contacts.li.span);
  1550. text(Item, gn);
  1551. Item.onclick = selectItem(gn, contacts[gn].sort(compareName));
  1552. Item.addEventListener('mouseover', function(){itemsCont.data.isFocused = true}, false);
  1553. itemsCont.appendChild(Item);
  1554. }
  1555. }
  1556. else
  1557. {
  1558. if (contacts) console.log('zmail: ' + name + ' contacts empty');
  1559. else console.log('zmail: ' + name + 'contacts undefined');
  1560. }
  1561. selectSbc.appendChild(selectSb);
  1562. selectSpan.zm_append([itemsCont, selectSbc]);
  1563. div.appendChild(selectSpan);
  1564. li.zm_append([div, span]);
  1565. c_subUl.appendChild(li);
  1566. root.enableScroll(selectSb, selectSbc, itemsCont);
  1567. var ch = itemsCont.children.length * 24, ph = Math.min(172, ch + 4);
  1568. selectSpan.style.height = ph + 'px';
  1569. selectSb.style.height = ph * (ph - 20) / ch + 'px';
  1570. selectSbc.style.display = (ch < 168) ? 'none': 'block';
  1571. });
  1572. c_mainUl.zm_append([c_contactsLi, c_contLi]);
  1573. c_contLi.appendChild(c_subUl);
  1574. c_contactsCont.appendChild(c_mainUl);
  1575. if(root.dom.compose.leftBar.contactsCont !== null) c_leftBar.removeChild(root.dom.compose.leftBar.contactsCont);
  1576. c_leftBar.appendChild(c_contactsCont);
  1577. root.dom.compose.leftBar.contactsCont = c_contactsCont;
  1578. }
  1579. catch(e)
  1580. {
  1581. console.log('zmail: ' + e.toString());
  1582. }
  1583. }
  1584. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1585. var c_search = create('textField', cssStyles.compose.leftBar.recipients.textField);
  1586. var c_searchCont = create('p', cssStyles.compose.leftBar.recipients.textFieldCont);
  1587. var c_toolBar = create('ul', cssStyles.ul.toolbar.main);
  1588. var c_sendMsg = create('li', cssStyles.li.toolbar.withIcon);
  1589. var c_sendMsgIcon = create('span', cssStyles.li.toolbar.newIcon);
  1590. var c_cancelMsg = create('li', cssStyles.li.toolbar.textOnly);
  1591. var c_saveDraft = create('li', cssStyles.li.toolbar.textOnly);
  1592. text(c_sendMsg, 'Send');
  1593. text(c_cancelMsg, 'Cancel');
  1594. text(c_saveDraft, 'Save draft');
  1595. c_sendMsgIcon.style.backgroundImage = 'url(' + root.res.sendMail + ')';
  1596. c_sendMsg.appendChild(c_sendMsgIcon);
  1597. c_toolBar.zm_append([c_sendMsg, c_cancelMsg, c_saveDraft]);
  1598. c_tbMenu.appendChild(c_toolBar);
  1599. c_topBarCont.zm_append([c_logo, c_tbMenu]);
  1600. c_topBar.appendChild(c_topBarCont);
  1601. c_searchCont.appendChild(c_search);
  1602. c_recipientsMask.appendChild(c_recipientsCont);
  1603. c_recipients.zm_append([c_recipientsMask, c_recipientsSbc]);
  1604. c_recipientsSbc.appendChild(c_recipientsSb);
  1605. this.enableScroll(c_recipientsSb, c_recipientsSbc, c_recipientsCont);
  1606. c_msgBody.scrolling = 'no';
  1607. c_expandCont.style.backgroundImage = 'url(' + this.res.expandDocument + ')';
  1608. c_expandCont.data = {'isExpanded': false, 'isFocused': false};
  1609. c_expandCont.onmouseover = function(){this.data.isFocused = true};
  1610. c_expandCont.onmouseout = function(){this.data.isFocused = false; this.style.visibility = 'hidden';};
  1611. c_search.data = {'results': [], 'selectedIndex': 0, 'isContOpen': false, 'isContFocused': false};
  1612. [c_sendMsg, c_cancelMsg, c_saveDraft].map(function(key)
  1613. {
  1614. key.addEventListener('mouseover', function(){this.style.backgroundImage = blueGrd}, false);
  1615. key.addEventListener('mouseout', function(){this.style.backgroundImage = 'none'}, false);
  1616. key.addEventListener('click', function(){this.style.backgroundImage = 'none'}, false);
  1617. });
  1618. var countMsgLength = function(){ root.getCharactersCount.apply(root, arguments) };
  1619. c_sendMsg.onclick = function()
  1620. {
  1621. root.sendMail.call(root);
  1622. zmail.compose.getInstance()._onClose();
  1623. };
  1624. c_saveDraft.onclick = function()
  1625. {
  1626. root.saveDraft.call(root);
  1627. zmail.compose.getInstance()._onClose();
  1628. };
  1629. c_cancelMsg.onclick = function()
  1630. {
  1631. zmail.compose.getInstance()._onClose();
  1632. };
  1633. c_expandCont.onclick = function()
  1634. {
  1635. var expanded = this.data.isExpanded;
  1636. this.style.backgroundImage = (expanded) ? 'url('+root.res.expandDocument+')' : 'url('+root.res.contractDocument+')';
  1637. c_leftBar.style.display = (expanded) ? 'table-cell' : 'none';
  1638. this.data.isExpanded = !expanded;
  1639. };
  1640. var c_searchResultsMask = create('div', cssStyles.compose.leftBar.recipients.searchBox.mask);
  1641. var c_searchResultsSbc = create('div', cssStyles.compose.leftBar.recipients.searchBox.scrollbar.cont);
  1642. var c_searchResultsCont = create('div', cssStyles.compose.leftBar.recipients.searchBox.itemsCont);
  1643. var c_msgHeader = create('div', cssStyles.compose.rightBar.msgHeader);
  1644. var c_msgMask = create('div', cssStyles.compose.rightBar.msgMask);
  1645. var c_msgCont = create('div', cssStyles.compose.rightBar.msgCont);
  1646. var c_msgSbc = create('div', cssStyles.compose.rightBar.scrollBar.cont);
  1647. var c_msgSb = create('div', cssStyles.compose.rightBar.scrollBar.bar);
  1648. var c_toText = create('div', cssStyles.compose.leftBar.recipients.toText);
  1649. var c_charCount = create('div', cssStyles.compose.leftBar.recipients.count);
  1650. text(c_toText, 'To:');
  1651. this.placeHolder(c_subject, 'Add Subject:');
  1652. c_recipientsCont.appendChild(c_searchCont);
  1653. c_searchResultsMask.appendChild(c_searchResultsCont);
  1654. c_searchResults.zm_append([c_searchResultsMask, c_searchResultsSbc]);
  1655. c_leftBarWrapper.zm_append([c_toText, c_recipients, c_searchResults, c_contacts]);
  1656. c_leftBar.appendChild(c_leftBarWrapper);
  1657. c_msgCont.appendChild(c_msgBody);
  1658. c_msgHeader.zm_append([c_subject, c_msgToolbar, c_expandCont]);
  1659. c_msgMask.zm_append([c_msgCont, c_msgHeader, c_charCount]);
  1660. c_rightBarWrapper.zm_append([c_msgMask, c_msgSbc]);
  1661. c_rightBar.appendChild(c_rightBarWrapper);
  1662. composeCont.zm_append([c_topBar, c_leftBar, c_rightBar]);
  1663. c_searchResultsCont.onmouseover = function(){c_search.data.isContFocused = true};
  1664. c_searchResultsCont.onmouseout = function(){c_search.data.isContFocused = false};
  1665. c_msgSbc.appendChild(c_msgSb);
  1666. root.enableScroll(c_msgSb, c_msgSbc, c_msgCont);
  1667. c_msgSb.style.display = 'none';
  1668. c_subject.addEventListener('mouseover', function(){c_expandCont.style.visibility = 'visible';}, false);
  1669. c_subject.addEventListener('mouseout', function()
  1670. {
  1671. setTimeout(function(){if (!c_expandCont.data.isFocused) c_expandCont.style.visibility = 'hidden'}, 50);
  1672. }, false);
  1673. this.dom.compose.leftBar.results.mainCont = c_searchResults;
  1674. this.dom.compose.leftBar.results.resultsCont = c_searchResultsCont;
  1675. this.dom.compose.leftBar.results.scrollbarCont = c_searchResultsSbc;
  1676. this.dom.compose.leftBar.searchBox = c_search;
  1677. this.dom.compose.leftBar.searchBoxCont = c_searchCont;
  1678. this.dom.compose.leftBar.recipientsMainCont = c_recipients;
  1679. this.dom.compose.leftBar.recipientsCont = c_recipientsCont;
  1680. this.dom.compose.leftBar.recipientsSbc = c_recipientsSbc;
  1681. this.dom.compose.leftBar.recipientsSb = c_recipientsSb;
  1682. this.dom.compose.rightBar.iframe = c_msgBody;
  1683. this.dom.compose.rightBar.msgCont = c_msgCont;
  1684. this.dom.compose.rightBar.subject = c_subject;
  1685. this.dom.compose.rightBar.charCount = c_charCount;
  1686. this.dom.compose.rightBar.msgSb = c_msgSb;
  1687. //find contact
  1688. c_search.onblur = function()
  1689. {
  1690. if (this.data.isContOpen && !this.data.isContFocused)
  1691. {
  1692. var rest = function() { root.clearPlayersSearch.apply(root, arguments); };
  1693. var add = function() { root.addRecipient.apply(root, arguments); };
  1694. if( root.completePlayerMatch ) add(this.value);
  1695. this.value = '';
  1696. rest(0);
  1697. }
  1698. };
  1699. c_search.onkeyup = function(event)
  1700. {
  1701. if(!event) event = window.event;
  1702. event.preventDefault();
  1703. var add = function(){ root.addRecipient.apply(root, arguments); };
  1704. if([38, 40, 13, 9].indexOf(event.keyCode) == -1)
  1705. {
  1706. var populate = function(){ root.findPlayer.apply(root, arguments); };
  1707. populate(this.value);
  1708. }
  1709. if(event.keyCode == 40 && this.data.isContOpen)
  1710. {
  1711. var next = function(){ root.changePlayerSelection.apply(root, arguments); };
  1712. next(true);
  1713. }
  1714. if(event.keyCode == 38 && this.data.isContOpen)
  1715. {
  1716. var previous = function(){ root.changePlayerSelection.apply(root, arguments); };
  1717. previous(false);
  1718. }
  1719. if(event.keyCode == 13 && this.data.isContOpen) add(this.data.results[this.data.selectedIndex].data.name);
  1720. };
  1721. //////////////////////////////////////////////////////////////////////////////
  1722. //IFRAME onload + compose message toolbar
  1723. c_msgBody.onload = function()
  1724. {
  1725. createComposeContacts.call(root);
  1726. c_msgToolbar.zm_empty();
  1727. c_msgCont.style.top = 0;
  1728. var iframe = c_msgBody.contentWindow.document;
  1729. var ibody = iframe.body;
  1730. var updateMessage = function(doc)
  1731. {
  1732. var msg = this.encodeMsg(doc);
  1733. var count = this.getCharactersCount(msg);
  1734. c_charCount.innerHTML = 3000 - parseInt(count, 10);
  1735. };
  1736. var updateScroll = function()
  1737. {
  1738. var h = c_msgBody.contentWindow.document.body.offsetHeight;
  1739. var ph = c_msgMask.offsetHeight, ch = c_msgCont.offsetHeight;
  1740. c_msgBody.style.height = Math.max(100, h + 10) + 'px';
  1741. c_msgSb.style.display = (ch > ph) ? 'block' : 'none';
  1742. c_msgSb.data.update();
  1743. if ((ch > ph) && (c_msgCont.offsetTop + (ch - ph) - 50 < 0)) c_msgSb.data.scrollToEnd();
  1744. };
  1745. var style = iframe.createElement("style");
  1746. var addCSSRule = function(sheet, selector, rules, index)
  1747. {
  1748. (sheet.insertRule) ? sheet.insertRule(selector + "{" + rules + "}", index) : sheet.addRule(selector, rules, index);
  1749. };
  1750. style.appendChild(iframe.createTextNode(""));
  1751. iframe.getElementsByTagName('head')[0].appendChild(style);
  1752. var sheet = style.sheet;
  1753. addCSSRule(sheet, "html", "color:#848585; font-family:vrinda; font-size:14px;", 0);
  1754. addCSSRule(sheet, "body", "width:100%; margin:0; padding:0 0 10px 0; word-wrap:break-word; line-height: 18px;", 1);
  1755. addCSSRule(sheet, "ul", "margin:0; color:#848585;", 2);
  1756. addCSSRule(sheet, "ol", "margin:0; color:#848585;", 3);
  1757. addCSSRule(sheet, "li", "font-family:vrinda; color:#848585;", 4);
  1758. addCSSRule(sheet, "a", "font-family: vrinda", 5);
  1759. addCSSRule(sheet, "div", "font-family:vrinda; color:#848585;", 6);
  1760. addCSSRule(sheet, "blockquote", "font-family:vrinda; color:#848585;", 7);
  1761. addCSSRule(sheet, "table", "border-color: #848585; color: #848585; font-family: vrinda; font-size: 14px;", 8);
  1762. addCSSRule(sheet, "th", "background-color: #848585; color: #333; padding: 3px 15px; font-weight: normal; color: #292929; font-family: vrinda; font-size: 14px;", 9);
  1763. addCSSRule(sheet, "td", "padding: 4px 15px; color: #848585; font-family: vrinda; font-size: 14px; word-wrap: break-word;", 10);
  1764. addCSSRule(sheet, ".quote", "padding:10px; border:1px solid #5a5a5a; background:#303030; box-sizing:border-box; -moz-box-sizing:border-box; word-wrap:break-word", 11);
  1765. addCSSRule(sheet, ".quote p", "padding: 0; margin: 0;", 12);
  1766. iframe.designMode = 'on';
  1767. ibody.innerHTML = (root.iframeContent) ? root.iframeContent : 'Add Text';
  1768. c_charCount.innerHTML = 3000 - root.getCharactersCount();
  1769. c_msgBody.contentWindow.onfocus = function()
  1770. {
  1771. if (ibody.innerHTML == 'Add Text') ibody.innerHTML = ''
  1772. if (c_tableOptions.data.isOpen)
  1773. {
  1774. c_leftBar.removeChild(c_tableOptions);
  1775. c_leftBarWrapper.style.display = 'block';
  1776. c_tableOptions.data.isOpen = false;
  1777. }
  1778. this.document.body.style.color = '#848585';
  1779. };
  1780. c_msgBody.contentWindow.onblur = function()
  1781. {
  1782. if(ibody.innerHTML == '' || ibody.innerHTML == '<br>')
  1783. {
  1784. ibody.innerHTML = 'Add Text';
  1785. this.document.body.style.color = '#666';
  1786. }
  1787. };
  1788. c_msgBody.contentWindow.onkeyup = function()
  1789. {
  1790. var clone = this.document.body.cloneNode(true);
  1791. root.iframeContent = this.document.body.innerHTML;
  1792. updateMessage.call(root, clone);
  1793. this.document.body.style.display = 'inline-block';
  1794. updateScroll();
  1795. this.document.body.style.display = 'block';
  1796. };
  1797. var getSelectedText = function()
  1798. {
  1799. var sel, range, selectedText;
  1800. if (c_msgBody.contentWindow.getSelection)
  1801. {
  1802. sel = c_msgBody.contentWindow.getSelection();
  1803. if (sel.rangeCount) selectedText = sel.getRangeAt(0).toString();
  1804. }
  1805. else if (iframe.selection && iframe.selection.createRange) selectedText = iframe.selection.createRange().text + "";
  1806. return selectedText;
  1807. };
  1808. var createLink = function(type)
  1809. {
  1810. var generateLink = function(txt)
  1811. {
  1812. var data = zmail.data.getInstance(), bb = data.createBBCode, a;
  1813. switch(type)
  1814. {
  1815. case 'coords': a = (txt.match(/^\d+:\d+$/)) ? bb.coords(txt, txt.split(':')[0], txt.split(':')[1]) : false; break;
  1816. case 'player': a = bb.player(txt); break;
  1817. case 'alliance': a = bb.alliance(txt); break;
  1818. }
  1819. return a;
  1820. };
  1821. var selectedText = getSelectedText();
  1822. var Link = generateLink(selectedText).replace('webfrontend', 'parent.webfrontend');
  1823. if(Link) return Link;
  1824. };
  1825. var resetTableOptions = function()
  1826. {
  1827. c_rowsInput.value = '';
  1828. c_colsInput.value = '';
  1829. c_headerCheckbox.data.isChecked = false;
  1830. c_expandCheckbox.data.isChecked = false;
  1831. c_headerCheckbox.style.background = 'transparent';
  1832. c_expandCheckbox.style.background = 'transparent';
  1833. };
  1834. var addTable = function()
  1835. {
  1836. if (c_expandCont.data.isExpanded) c_expandCont.onclick();
  1837. if (c_tableOptions.data.isOpen) return;
  1838. c_leftBarWrapper.style.display = 'none';
  1839. c_leftBar.appendChild(c_tableOptions);
  1840. resetTableOptions();
  1841. c_addTable.onclick = function()
  1842. {
  1843. var rows = c_rowsInput.value;
  1844. var cols = c_colsInput.value;
  1845. var header = c_headerCheckbox.data.isChecked;
  1846. var stretch = c_expandCheckbox.data.isChecked;
  1847. var table = document.createElement('table');
  1848. var tbody = document.createElement('tbody');
  1849. table.rules = 'all';
  1850. table.border = '1';
  1851. table.className = 'table';
  1852. table.style.minWidth = cols * 40 + 'px';
  1853. table.cellpadding = 0;
  1854. table.cellspacing = 0;
  1855. if(stretch) table.width = '100%';
  1856. for(var r = 0; r < rows; r++)
  1857. {
  1858. var tr = document.createElement('tr');
  1859. for (var c = 0; c < cols; c++)
  1860. {
  1861. var td = (header && r == 0) ? document.createElement('th') : document.createElement('td');
  1862. td.innerText = '\u200B';
  1863. tr.appendChild(td);
  1864. }
  1865. tbody.appendChild(tr);
  1866. }
  1867. table.appendChild(tbody);
  1868. c_msgBody.contentWindow.focus();
  1869. iframe.execCommand('insertHTML', false, table.outerHTML + '<br/>\u200B');
  1870. updateScroll();
  1871. };
  1872. c_cancelTable.onclick = function()
  1873. {
  1874. c_leftBar.removeChild(c_tableOptions);
  1875. c_leftBarWrapper.style.display = 'block';
  1876. c_tableOptions.data.isOpen = false;
  1877. };
  1878. c_tableOptions.data.isOpen = true;
  1879. };
  1880. var insertLink = function()
  1881. {
  1882. var val = getSelectedText();
  1883. if (val == '') return;
  1884. var a = create('a', cssStyles.link._14);
  1885. text(a, val);
  1886. a.href = val;
  1887. a.target = 'blank';
  1888. iframe.execCommand('insertHTML', false, a.outerHTML + '<br/>\u200B');
  1889. };
  1890. var insertQuote = function()
  1891. {
  1892. var txt = getSelectedText();
  1893. if (txt == '') txt = '\u200B';
  1894. var html = '<div class="quote"><p>' + txt + '</p></div><br/>';
  1895. iframe.execCommand('insertHTML', false, html);
  1896. };
  1897. for (var key in root.res.tools)
  1898. {
  1899. var div = create('div', cssStyles.compose.rightBar.toolbar.icon);
  1900. div.onmousedown = function(event){ root.preventDefaults(event) };
  1901. var callback;
  1902. switch(key)
  1903. {
  1904. case 'coords':
  1905. callback = function(){iframe.execCommand('insertHTML', false, createLink('coords') + '\u200B')};
  1906. break;
  1907. case 'player':
  1908. callback = function(){iframe.execCommand('insertHTML', false, createLink('player') + '\u200B')};
  1909. break;
  1910. case 'alliance':
  1911. callback = function(){iframe.execCommand('insertHTML', false, createLink('alliance') + '\u200B')};
  1912. break;
  1913. case 'table': callback = addTable; break;
  1914. case 'link': callback = insertLink; break;
  1915. case 'quote': callback = insertQuote; break;
  1916. default: callback = function(){iframe.execCommand(this.data.id, false, null)};
  1917. }
  1918. div.data = {'id': key, 'callback': callback};
  1919. div.onclick = function()
  1920. {
  1921. this.data.callback.call(this);
  1922. if (key != 'table') c_msgBody.contentWindow.focus();
  1923. updateMessage.call(root, ibody.cloneNode(true));
  1924. };
  1925. div.style.backgroundImage = root.res.tools[key];
  1926. c_msgToolbar.appendChild(div);
  1927. }
  1928. var updateRecipientsHeight = function()
  1929. {
  1930. c_recipients.style.height = Math.max(28, Math.min(180, c_recipientsCont.offsetHeight)) + 'px';
  1931. if (c_recipientsCont.offsetHeight == 0 && root.recipients.length > 0) setTimeout(updateRecipientsHeight, 100);
  1932. else
  1933. {
  1934. c_recipientsSbc.style.visibility = (c_recipientsCont.offsetHeight < 180) ? 'hidden' : 'visible';
  1935. c_recipientsSb.data.update();
  1936. c_recipientsSb.data.scrollToEnd();
  1937. }
  1938. }
  1939. c_msgBody.contentWindow.focus();
  1940. updateRecipientsHeight();
  1941. updateScroll();
  1942. }
  1943. this.dom.window.compose = composeCont;
  1944. //////////////////////////////////////////////////////////////////////////
  1945. ///////////////////////////////////////////////////////////////////////////////////
  1946. }
  1947. catch(e)
  1948. {
  1949. console.log('zmail: ' + e.toString());
  1950. }
  1951. },
  1952. destruct: function(){},
  1953. members:
  1954. {
  1955. iframeContent: null,
  1956. selectedFolder: 'inbox',
  1957. selectedGroup: false,
  1958. selectedMsgs: {'ids': [], 'headers': [], 'checkBoxes': []},
  1959. selectedHeader: null,
  1960. selectedContacts: [],
  1961. selectedPage: 0,
  1962. selectedDraft: null,
  1963. callUpdate: null,
  1964. isLoaded: false,
  1965. generatedHeaders: {},
  1966. generatedSections: [],
  1967. recipients: [],
  1968. completePlayerMatch: false,
  1969. openNotificationsCount: 0,
  1970. downloadsCont: null,
  1971. folders: {
  1972. 'inbox': {'ids': [], 'msgs': []},
  1973. 'outbox': {'ids': [], 'msgs': []},
  1974. 'junk': {'ids': [], 'msgs': []},
  1975. 'trash': [{'ids': [], 'msgs': []}, {'ids': [], 'msgs': []}],
  1976. 'draft': {},
  1977. 'documents': {'ids': [], 'msgs': []}
  1978. },
  1979. contacts: {
  1980. 'friends': [],
  1981. 'blocked': [],
  1982. 'groups': {}
  1983. },
  1984. callMethod: function (fn, args)
  1985. {
  1986. var root = this;
  1987. var callback = function()
  1988. {
  1989. root[fn].call(root, args);
  1990. }
  1991. return callback;
  1992. },
  1993. applyMethod: function (fn, args)
  1994. {
  1995. var root = this;
  1996. root[fn].apply(root, args)
  1997. },
  1998. create: function (type, css)
  1999. {
  2000. var elm;
  2001. switch(type)
  2002. {
  2003. case 'textField': elm = document.createElement('input'); elm.type = 'text'; break;
  2004. case 'checkBox': elm = document.createElement('input'); elm.type = 'checkBox'; break;
  2005. default: elm = document.createElement(type);
  2006. }
  2007. var iterator = function(obj)
  2008. {
  2009. for(var x in obj) elm.style[x] = obj[x];
  2010. };
  2011. var onDown = function(down, over, out)
  2012. {
  2013. elm.addEventListener('mousedown', function(event)
  2014. {
  2015. var el = event.target;
  2016. el.onmouseout = null;
  2017. el.onmouseover = null;
  2018. for (var x in down) el.style[x] = down[x];
  2019. var onUp = function()
  2020. {
  2021. el.onmouseout = function(){for (var x in out) el.style[x] = out[x]};
  2022. el.onmouseover = function(){for (var x in over) el.style[x] = over[x]};
  2023. for (var x in out) el.style[x] = out[x];
  2024. document.removeEventListener('mouseup', onUp, false);
  2025. };
  2026. document.addEventListener('mouseup', onUp, false);
  2027. }, false);
  2028. };
  2029. if (css === null) return elm;
  2030. for (var key in css) {
  2031. var prop = css[key];
  2032. switch(key)
  2033. {
  2034. case 'over': elm.onmouseover = function(){iterator(css['over'])}; break;
  2035. case 'out': elm.onmouseout = function(){iterator(css['out'])}; break;
  2036. case 'focus': elm.onfocus = function(){iterator(css['focus'])}; break;
  2037. case 'blur': elm.onblur = function(){iterator(css['blur'])}; break;
  2038. case 'down': onDown(css['down'], css['up'], css['out']); break;
  2039. case 'up': ; break;
  2040. default: elm.style[key] = css[key];
  2041. }
  2042. }
  2043. return elm;
  2044. },
  2045. gradient: function (stop1, stop2)
  2046. {
  2047. var browser = navigator.userAgent;
  2048. if (browser.indexOf('Chrome') !== -1) browser = 'chrome';
  2049. else if (browser.indexOf('Firefox') !== -1) browser = 'firefox';
  2050. else browser = 'unsupported';
  2051. var grd = '';
  2052. switch (browser) {
  2053. case 'chrome':
  2054. grd = '-webkit-linear-gradient(top, ' + stop1 + ' 0%, ' + stop2 + ' 100%)';
  2055. break;
  2056. case 'firefox':
  2057. grd = '-moz-linear-gradient(top, ' + stop1 + ' 0%, ' + stop2 + ' 100%)';
  2058. break;
  2059. default:
  2060. alert('your Browser is not supported');
  2061. }
  2062. return grd;
  2063. },
  2064. text: function(elm, txt)
  2065. {
  2066. elm.appendChild(document.createTextNode(txt));
  2067. },
  2068. size: function(obj)
  2069. {
  2070. if(typeof obj !== 'object') return null;
  2071. var s = 0;
  2072. for (var key in obj) s++;
  2073. return s;
  2074. },
  2075. placeHolder: function(input, val)
  2076. {
  2077. input.value = val;
  2078. input.addEventListener('focus', function(){if (input.value == val) input.value = ''}, false);
  2079. input.addEventListener('blur', function(){if (input.value == '') input.value = val}, false);
  2080. },
  2081. preventDefaults: function(e)
  2082. {
  2083. if (!e) e = window.event;
  2084. e.preventDefault();
  2085. e.stopPropagation();
  2086. },
  2087. enableScroll: function(elm, parent, cont)
  2088. {
  2089. var pos, ph = parent.offsetHeight, ch = cont.offsetHeight, elmY, contY;
  2090. var scale = ch / (ph - 20);
  2091. var bh = ph / scale;
  2092. elm.style.height = bh + 'px';
  2093. var update = function()
  2094. {
  2095. elmY = elm.offsetTop;
  2096. contY = cont.offsetTop;
  2097. ph = parent.offsetHeight;
  2098. ch = cont.offsetHeight;
  2099. scale = ch / (ph - 20);
  2100. bh = ph / scale;
  2101. if (ch <= ph) cont.style.top = 0;
  2102. elm.style.height = bh + 'px';
  2103. elm.style.top = -contY / scale + 10 + 'px';
  2104. elm.style.display = (ch <= ph) ? 'none' : 'block';
  2105. };
  2106. var scrollToEnd = function()
  2107. {
  2108. if (ch > ph)
  2109. {
  2110. elm.style.top = ph - bh - 10 + 'px';
  2111. cont.style.top = ph - ch + 'px';
  2112. }
  2113. };
  2114. elm.data = {'update': update, 'scrollToEnd': scrollToEnd};
  2115. var onMove = function(event)
  2116. {
  2117. var e = (event) ? event : window.event, dist = e.pageY - pos;
  2118. if(elmY + dist < 10)
  2119. {
  2120. elm.style.top = '10px';
  2121. cont.style.top = 0;
  2122. }
  2123. else if(elmY + dist + bh > ph - 10)
  2124. {
  2125. elm.style.top = ph - bh - 10 + 'px';
  2126. cont.style.top = ph - ch + 'px';
  2127. }
  2128. else
  2129. {
  2130. elm.style.top = elmY + dist + 'px';
  2131. cont.style.top = contY - scale * dist + 'px';
  2132. }
  2133. };
  2134. var onUp = function()
  2135. {
  2136. document.removeEventListener('mousemove', onMove, false);
  2137. document.removeEventListener('mouseup', onUp, false);
  2138. };
  2139. elm.onmousedown = function(event)
  2140. {
  2141. var e = (event) ? event : window.event, y = e.pageY;
  2142. e.preventDefault();
  2143. pos = y;
  2144. update();
  2145. if (elm.offsetHeight != bh) elm.style.height = bh + 'px';
  2146. document.addEventListener('mousemove', onMove, false);
  2147. document.addEventListener('mouseup', onUp, false);
  2148. };
  2149. var onWheel = function(event){
  2150. var e = (event) ? event : window.event;
  2151. e.preventDefault();
  2152. if (ch < ph) return;
  2153. if (ch == 0) update();
  2154. var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail) ));
  2155. var ct = cont.offsetTop, et = elm.offsetTop;
  2156. var dist = delta * -20 / scale;
  2157. if(et + dist < 10)
  2158. {
  2159. elm.style.top = '10px';
  2160. cont.style.top = 0;
  2161. }
  2162. else if(et + dist + bh > ph - 10)
  2163. {
  2164. elm.style.top = ph - bh - 10 + 'px';
  2165. cont.style.top = ph - ch + 'px';
  2166. }
  2167. else
  2168. {
  2169. elm.style.top = et + dist + 'px';
  2170. cont.style.top = ct - scale * dist + 'px';
  2171. }
  2172. };
  2173. if(cont.hasOwnProperty('removeMouseWheelListener')) cont.removeMouseWheelListener();
  2174. cont.onmousewheel = onWheel;
  2175. cont.addEventListener('DOMMouseScroll', onWheel, false);
  2176. cont.removeMouseWheelListener = function(){this.removeEventListener('DOMMouseScroll', onWheel, false);}
  2177. },
  2178. showDownloads: function(total)
  2179. {
  2180. var create = this.create, css = this.css, text = this.text, root = this;
  2181. var mailCont = zmail.main.getInstance();
  2182. var BBCode = zmail.data.getInstance().createBBCode;
  2183. var cont = create('div', css.notification.cont);
  2184. var header = create('div', css.notification.header.cont);
  2185. var headerText = create('p', css.notification.header.text);
  2186. var mail = create('div', css.notification.header.mail);
  2187. var description = create('p', css.notification.from);
  2188. var downloaded = create('p', css.notification.link);
  2189. var count = create('span', {'position': 'absolute', 'right': 0, 'top': 0, 'height': '100%', 'lineHeight': '100%'});
  2190. var closeCont = create('div', css.notification.remove);
  2191. text(headerText, 'Welcome to ZMail');
  2192. text(downloaded, 'Downloaded: ');
  2193. text(count, '0/' + total);
  2194. description.innerHTML = 'Downloading messages, please wait...<br/>This is one time process.'
  2195. closeCont.innerHTML = 'X';
  2196. var removeCont = function()
  2197. {
  2198. if (cont.parentElement && cont.data.isOpen)
  2199. {
  2200. document.body.removeChild(cont);
  2201. cont.data.isOpen = false;
  2202. }
  2203. }
  2204. closeCont.onclick = removeCont;
  2205. mail.style.backgroundImage = 'url(' + this.res.mail + ')';
  2206. description.style.lineHeight = '12px';
  2207. downloaded.style.position = 'relative';
  2208. downloaded.style.margin = '5px 0 0 0';
  2209. downloaded.appendChild(count);
  2210. header.zm_append([mail, headerText]);
  2211. cont.zm_append([header, description, downloaded, closeCont]);
  2212. cont.data = {'count': count, 'isOpen': true};
  2213. cont.style.height = 'auto';
  2214. document.body.appendChild(cont);
  2215. this.downloadsCont = cont;
  2216. },
  2217. updateDownloads: function(c, t)
  2218. {
  2219. var cont = this.downloadsCont;
  2220. if (cont && cont.data.isOpen)
  2221. {
  2222. var count = cont.data.count;
  2223. if (c < t)
  2224. {
  2225. count.innerHTML = c + '/' + t;
  2226. }
  2227. else
  2228. {
  2229. document.body.removeChild(cont);
  2230. cont.data.isOpen = false;
  2231. this.downlodsCont = null;
  2232. }
  2233. }
  2234. },
  2235. notify: function(msg, type)
  2236. {
  2237. var create = this.create, css = this.css, text = this.text, root = this;
  2238. var mailCont = zmail.main.getInstance();
  2239. var BBCode = zmail.data.getInstance().createBBCode;
  2240. var cont = create('div', css.notification.cont);
  2241. var header = create('div', css.notification.header.cont);
  2242. var headerTextCss = css.notification.header;
  2243. var headerText = (type == 2) ? create('p', headerTextCss.textMultiple) : create('p', headerTextCss.text);
  2244. var mail = create('div', css.notification.header.mail);
  2245. var mailType = create('span', css.notification.header.type);
  2246. var closeCont = create('div', css.notification.remove);
  2247. var labelText = ['New mail received', 'Mail has been sent', 'You have (' + msg + ')<br/> new messages'];
  2248. var label = labelText[type];
  2249. (type == 2) ? headerText.innerHTML = label : text(headerText, label);
  2250. closeCont.innerHTML = 'X';
  2251. var removeCont = function()
  2252. {
  2253. if (cont.parentElement)
  2254. {
  2255. document.body.removeChild(cont);
  2256. root.openNotificationsCount--;
  2257. }
  2258. }
  2259. closeCont.onclick = removeCont;
  2260. mail.style.backgroundImage = 'url(' + this.res.mail + ')';
  2261. mailType.style.backgroundImage = (type == 1) ? 'url(' + this.res.arrowRight + ')' : 'url(' + this.res.arrowLeft + ')';
  2262. mail.appendChild(mailType);
  2263. header.zm_append([mail, headerText]);
  2264. if (type == 2)
  2265. {
  2266. var openButton = create('div', css.notification.button);
  2267. var cancelButton = create('div', css.notification.button);
  2268. text(openButton, 'Open mail');
  2269. text(cancelButton, 'Cancel');
  2270. openButton.onclick = function()
  2271. {
  2272. if (!mailCont.isOpen) mailCont.open();
  2273. removeCont();
  2274. };
  2275. cancelButton.onclick = function()
  2276. {
  2277. removeCont();
  2278. };
  2279. openButton.style.left = '10px';
  2280. cancelButton.style.right = '10px';
  2281. cont.zm_append([header, openButton, cancelButton, closeCont]);
  2282. }
  2283. else
  2284. {
  2285. var from = create('p', css.notification.from);
  2286. var subject = create('p', css.notification.subject);
  2287. if (type == 0)
  2288. {
  2289. var subjectLink = create('a', css.notification.link);
  2290. subjectLink.innerHTML = msg.s;
  2291. var openMessage = function()
  2292. {
  2293. var searchBox = root.dom.leftBar.searchBox;
  2294. var msgSb = root.dom.rightBar.scrollBar.bar;
  2295. var generatedHeaders = root.generatedHeaders;
  2296. if (!mailCont.isOpen) mailCont.open();
  2297. if (root.selectedGroup) root.dom.leftBar.items[root.selectedGroup].zm_css(root.css.li.leftBar.sub);
  2298. if (root.selectedFolder) root.dom.leftBar.items[root.selectedFolder].zm_css(root.css.li.leftBar.sub);
  2299. root.dom.leftBar.items.inbox.zm_css(root.css.li.leftBar.subSelected);
  2300. root.selectedFolder = 'inbox';
  2301. root.selectedGroup = false;
  2302. root.resetMsgCont(1);
  2303. root.selectedPage = 0;
  2304. root.populateHeaders();
  2305. searchBox.disabled = false;
  2306. msgSb.data.update();
  2307. for (var i in generatedHeaders)
  2308. {
  2309. var id = generatedHeaders[i].msg.i;
  2310. if (parseInt(id, 10) == parseInt(msg.i, 10))
  2311. {
  2312. generatedHeaders[i].cont.onclick();
  2313. break;
  2314. }
  2315. }
  2316. removeCont();
  2317. };
  2318. subjectLink.onclick = function(){openMessage.call(root)};
  2319. text(subject, 'Subject: ');
  2320. subject.appendChild(subjectLink);
  2321. from.innerHTML = 'From: ' + BBCode.player(msg.f);
  2322. }
  2323. else if(type == 1)
  2324. {
  2325. text(subject, 'Subject: ' + msg.s);
  2326. if (msg.t.length == 1) from.innerHTML = 'To: ' + BBCode.player(msg.t[0]);
  2327. else text(from, 'To: ' + msg.t.length + ' Players');
  2328. }
  2329. cont.zm_append([header, from, subject, closeCont]);
  2330. }
  2331. cont.style.bottom = (this.openNotificationsCount * 103) + 30 + 'px';
  2332. cont.style.zIndex = 1000 - this.openNotificationsCount;
  2333. document.body.appendChild(cont);
  2334. root.openNotificationsCount++;
  2335. setTimeout(removeCont, 30000);
  2336. },
  2337. findPlayer: function(txt)
  2338. {
  2339. this.clearPlayersSearch(0);
  2340. var str = txt.replace(/[^a-z A-Z 0-9 \-_]/g, '').toLowerCase();
  2341. if (str == '') return;
  2342. var players = zmail.data.getInstance().players;
  2343. var matches = [], completeMatch = false, count = 0;
  2344. for(var i = 0; i < players.length; i++)
  2345. {
  2346. if ((players[i].pn.toLowerCase().substr(0,str.length) == str) && count < 21)
  2347. {
  2348. matches.push(players[i]);
  2349. count++;
  2350. }
  2351. if (players[i].pn.toLowerCase() == txt.toLowerCase()) completeMatch = true;
  2352. }
  2353. this.completePlayerMatch = completeMatch;
  2354. this.populatePlayersResultsCont(matches);
  2355. },
  2356. changePlayerSelection: function(mode)
  2357. {
  2358. var searchBox = this.dom.compose.leftBar.searchBox;
  2359. var mainCont = this.dom.compose.leftBar.results.mainCont;
  2360. var resultsSbc = this.dom.compose.leftBar.results.scrollbarCont;
  2361. var resultsCont = this.dom.compose.leftBar.results.resultsCont;
  2362. var index = searchBox.data.selectedIndex;
  2363. var results = searchBox.data.results;
  2364. var length = results.length;
  2365. var newIndex = (mode) ? (index + 1) % length : (index - 1 < 0) ? length - 1 : index - 1;
  2366. var currentItem = results[index];
  2367. var newItem = results[newIndex];
  2368. currentItem.style.background = 'transparent';
  2369. currentItem.style.color = '#8e8e8e';
  2370. newItem.style.background = '#266589';
  2371. newItem.style.color = '#bcbcbc';
  2372. if (newIndex > 4 && length > 5)
  2373. {
  2374. var ch = resultsCont.offsetHeight, ph = resultsSbc.offsetHeight;
  2375. resultsCont.style.top = -(newIndex - 4) * 49 + 'px';
  2376. resultsSbc.firstChild.style.top = (((ph - 20) / ch) * (newIndex - 4) * 49) + 10 +'px';
  2377. }
  2378. if (newIndex < 4 && length > 5)
  2379. {
  2380. resultsCont.style.top = 0;
  2381. resultsSbc.firstChild.style.top = '10px';
  2382. }
  2383. searchBox.data.selectedIndex = newIndex;
  2384. },
  2385. addRecipient: function(name)
  2386. {
  2387. if (this.recipients.indexOf(name) == -1)
  2388. {
  2389. var Item = this.create('div', this.css.compose.leftBar.recipients.recipient.cont);
  2390. var remove = this.create('div', this.css.compose.leftBar.recipients.recipient.remove);
  2391. var mainCont = this.dom.compose.leftBar.recipientsMainCont;
  2392. var cont = this.dom.compose.leftBar.recipientsCont;
  2393. var scrollCont = this.dom.compose.leftBar.recipientsSbc;
  2394. var bar = this.dom.compose.leftBar.recipientsSb;
  2395. var updateScroll = function()
  2396. {
  2397. scrollCont.style.visibility = (cont.offsetHeight > 0 && cont.offsetHeight < 180) ? 'hidden' : 'visible';
  2398. mainCont.style.height = Math.max(28, Math.min(180, cont.offsetHeight)) + 'px';
  2399. bar.data.update();
  2400. bar.data.scrollToEnd();
  2401. };
  2402. var root = this;
  2403. this.text(Item, name);
  2404. this.text(remove, 'X');
  2405. remove.data = {'name': name};
  2406. remove.onclick = function()
  2407. {
  2408. root.dom.compose.leftBar.recipientsCont.removeChild(Item);
  2409. var player = this.data.name, index = root.recipients.indexOf(player);
  2410. if(index > -1) root.recipients.splice(index, 1);
  2411. updateScroll();
  2412. };
  2413. Item.appendChild(remove);
  2414. this.dom.compose.leftBar.recipientsCont.insertBefore(Item, this.dom.compose.leftBar.searchBoxCont);
  2415. this.clearPlayersSearch(1);
  2416. this.recipients.push(name);
  2417. updateScroll();
  2418. }
  2419. },
  2420. clearPlayersSearch: function(type)
  2421. {
  2422. var searchBox = this.dom.compose.leftBar.searchBox;
  2423. var mainCont = this.dom.compose.leftBar.results.mainCont;
  2424. var resultsSbc = this.dom.compose.leftBar.results.scrollbarCont;
  2425. var resultsCont = this.dom.compose.leftBar.results.resultsCont;
  2426. if (type == 1)
  2427. {
  2428. searchBox.value = '';
  2429. searchBox.focus();
  2430. }
  2431. resultsSbc.zm_empty();
  2432. resultsCont.zm_empty();
  2433. resultsCont.style.top = 0;
  2434. mainCont.style.display = 'none';
  2435. searchBox.data.results = [];
  2436. searchBox.data.selectedIndex = 0;
  2437. searchBox.data.isContOpen = false;
  2438. this.completePlayerMatch = false;
  2439. },
  2440. populatePlayersResultsCont: function(arr)
  2441. {
  2442. var root = this;
  2443. var resultsCont = this.dom.compose.leftBar.results.resultsCont;
  2444. var cont = this.dom.compose.leftBar.results.mainCont;
  2445. var recipientsCont = this.dom.compose.leftBar.recipientsMainCont;
  2446. var scrollbarCont = this.dom.compose.leftBar.results.scrollbarCont;
  2447. var searchBox = this.dom.compose.leftBar.searchBox;
  2448. var add = function()
  2449. {
  2450. root.addRecipient.apply(root, arguments);
  2451. };
  2452. var items = [];
  2453. for(var i = 0; i < arr.length; i++)
  2454. {
  2455. var style = (i == 0) ? 'contSelected' : 'cont';
  2456. var Item = this.create('div', this.css.compose.leftBar.recipients.searchBox.item[style]);
  2457. var player = this.create('p', this.css.compose.leftBar.recipients.searchBox.item.text);
  2458. var alliance = this.create('p', this.css.compose.leftBar.recipients.searchBox.item.text);
  2459. this.text(player, arr[i].pn);
  2460. this.text(alliance, arr[i].an);
  2461. Item.zm_append([player, alliance]);
  2462. Item.data = {'name': arr[i].pn};
  2463. Item.onclick = function()
  2464. {
  2465. add(this.data.name);
  2466. };
  2467. resultsCont.appendChild(Item);
  2468. items.push(Item);
  2469. }
  2470. cont.style.display = 'block';
  2471. cont.style.height = Math.min(244, arr.length * 49) + 'px';
  2472. cont.style.top = recipientsCont.offsetTop + recipientsCont.offsetHeight + 3 + 'px';
  2473. if(arr.length > 5)
  2474. {
  2475. var bar = this.create('div', this.css.compose.leftBar.recipients.searchBox.scrollbar.bar);
  2476. scrollbarCont.appendChild(bar);
  2477. this.enableScroll(bar, scrollbarCont, resultsCont);
  2478. }
  2479. searchBox.data.isContOpen = true;
  2480. searchBox.data.results = items;
  2481. },
  2482. update: function(arr1, arr2, arr3, arr4)
  2483. {
  2484. if(!this.isLoaded)
  2485. {
  2486. var s = this.storage, j = s.get('junk'), t0 = s.get('trash0'), t1 = s.get('trash1'), d = s.get('draft');
  2487. var doc = s.get('documents'), b = s.get('blocked'), f = s.get('friends'), g = s.get('groups');
  2488. this.folders.junk.ids = j;
  2489. this.folders.trash[0].ids = t0;
  2490. this.folders.trash[1].ids = t1;
  2491. this.folders.documents.ids = doc;
  2492. this.folders.draft = d;
  2493. this.contacts.friends = f;
  2494. this.contacts.blocked = b;
  2495. this.contacts.groups = g;
  2496. this.isLoaded = true;
  2497. }
  2498. if(arr1 && arr2)
  2499. {
  2500. this.filter(arr1, 0);
  2501. this.filter(arr2, 1);
  2502. }
  2503. if (arr4 && (arr4.length > 0)) this.notify(arr4[0], 1);
  2504. if (arr3 && (arr3.length > 0))
  2505. {
  2506. if(arr3.length == 1) this.notify(arr3[0], 0);
  2507. else this.notify(arr3.length, 2);
  2508. }
  2509. var f = this.folders, c = this.contacts, root = this;
  2510. var count = function(r)
  2511. {
  2512. var t = f.trash, d = f.draft, g = ['blocked', 'friends', 'groups'].indexOf(r);
  2513. var len = function(a){return (!a) ? 0 : a.length;};
  2514. if (g == -1) length = (r == 'draft') ? root.size(d) : (r == 'trash') ? len(t[0].msgs) + len(t[1].msgs) : len(f[r].msgs);
  2515. else length = (r == 'groups') ? root.size(c[r]) : len(c[r]);
  2516. return (length == 0) ? '' : length;
  2517. };
  2518. this.dom.leftBar.folders.inbox.nodeValue = 'Inbox ' + count('inbox');
  2519. this.dom.leftBar.folders.outbox.nodeValue = 'Outbox ' + count('outbox');
  2520. this.dom.leftBar.folders.draft.nodeValue = 'Draft ' + count('draft');
  2521. this.dom.leftBar.folders.junk.nodeValue = 'Junk ' + count('junk');
  2522. this.dom.leftBar.folders.trash.nodeValue = 'Trash ' + count('trash');
  2523. this.dom.leftBar.folders.documents.nodeValue = 'Documents ' + count('documents');
  2524. this.dom.leftBar.contacts.friends.nodeValue = 'Friends ' + count('friends');
  2525. this.dom.leftBar.contacts.blocked.nodeValue = 'Blocked ' + count('blocked');
  2526. this.dom.leftBar.contacts.groups.nodeValue = 'Groups ' + count('groups');
  2527. if (this.selectedFolder) this.populateHeaders();
  2528. if (this.selectedGroup) this.populateContacts();
  2529. },
  2530. resetMsgCont: function(type)
  2531. {
  2532. var expandCont = this.dom.rightBar.expandCont;
  2533. var msgCont = this.dom.rightBar.msgCont;
  2534. var selectedMsgs = this.getSelectedMsgsIds();
  2535. if (expandCont.data.isExpanded) expandCont.onclick();
  2536. msgCont.zm_empty();
  2537. msgCont.style.top = 0;
  2538. if ((type == 1) && !this.selectedGroup)
  2539. {
  2540. var count = (selectedMsgs == null) ? 0 : selectedMsgs.length;
  2541. var header = this.create('p', this.css.message.subject);
  2542. header.innerHTML = (count > 0) ? count + ' messages selected.' : 'No messages selected.';
  2543. msgCont.appendChild(header);
  2544. };
  2545. },
  2546. filter: function(arr, type)
  2547. {
  2548. var i = {'ids': [], 'msgs': []}, t = {'ids': [], 'msgs': []}, j = {'ids': [], 'msgs': []}, d = {'ids': [], 'msgs': []};
  2549. var trash = this.folders.trash[type].ids, junk = this.folders.junk.ids, draft = this.folders.draft;
  2550. var documents = this.folders.documents.ids, blocked = this.contacts.blocked;
  2551. for (var n = 0; n < arr.length; n++)
  2552. {
  2553. var id = arr[n].i, msg = arr[n], fid = arr[n].fi;
  2554. if ((trash)&&(trash.indexOf(id) > -1)) { t.ids.push(id); t.msgs.push(msg); }
  2555. else if ((type == 0)&&(junk)&&(junk.indexOf(id) > -1)) { j.ids.push(id); j.msgs.push(msg); }
  2556. else if ((type == 0)&&(documents)&&(documents.indexOf(id) > -1)) { d.ids.push(id); d.msgs.push(msg); }
  2557. else if ((type == 0)&&(blocked)&&(blocked.indexOf(fid) > -1)) { j.ids.push(id); j.msgs.push(msg); }
  2558. else { i.ids.push(id); i.msgs.push(msg); }
  2559. }
  2560. if (type == 0)
  2561. {
  2562. this.folders.inbox = i;
  2563. this.folders.trash[0] = t;
  2564. this.folders.junk = j;
  2565. this.folders.documents = d;
  2566. }
  2567. if (type == 1)
  2568. {
  2569. this.folders.outbox = i;
  2570. this.folders.trash[1] = t;
  2571. }
  2572. },
  2573. updateContacts: function(alliance, commanders, officers)
  2574. {
  2575. var allianceTxt = this.dom.leftBar.contacts.alliance;
  2576. var commandersTxt = this.dom.leftBar.contacts.commanders;
  2577. var officersTxt = this.dom.leftBar.contacts.officers;
  2578. var sg = this.selectedGroup;
  2579. allianceTxt.nodeValue = (alliance && (alliance.length > 0)) ? 'Alliance ' + alliance.length : 'Alliance';
  2580. commandersTxt.nodeValue = (commanders && (commanders.length > 0)) ? 'Commanders ' + commanders.length : 'Commanders';
  2581. officersTxt.nodeValue = (officers && (officers.length > 0)) ? 'Officers ' + officers.length : 'Officers';
  2582. if (sg && (['commanders', 'officers', 'alliance'].indexOf(sg) > -1)) this.populateContacts();
  2583. },
  2584. updateAllies: function(allies)
  2585. {
  2586. console.log(allies);
  2587. var alliesTxt = this.dom.leftBar.contacts.allies, sg = this.selectedGroup;
  2588. alliesTxt.nodeValue = (allies && this.size(allies) > 0) ? 'Allies ' + this.size(allies) : 'Allies';
  2589. if (sg && sg == 'allies') this.populateContacts();
  2590. },
  2591. resetComposeContainer: function()
  2592. {
  2593. var recipientsCont = this.dom.compose.leftBar.recipientsCont;
  2594. var msgCont = this.dom.compose.rightBar.msgCont;
  2595. var iframe = this.dom.compose.rightBar.iframe;
  2596. this.dom.compose.rightBar.subject.value = "Add Subject:";
  2597. this.iframeContent = "";
  2598. this.recipients = [];
  2599. while (recipientsCont.children.length > 1) recipientsCont.removeChild(recipientsCont.firstChild);
  2600. while (msgCont.children.length > 1) msgCont.removeChild(msgCont.lastChild);
  2601. iframe.style.height = '100px';
  2602. },
  2603. addSections: function()
  2604. {
  2605. var iframe = this.dom.compose.rightBar.iframe;
  2606. if(this.generatedSections != null && this.generatedSections.length > 0)
  2607. {
  2608. var msgCont = this.dom.compose.rightBar.msgCont;
  2609. for (var i = 0; i < this.generatedSections.length; i++) msgCont.appendChild(this.generatedSections[i][0]);
  2610. }
  2611. },
  2612. openNewMail: function(type)
  2613. {
  2614. this.resetComposeContainer();
  2615. this.generatedSections = [];
  2616. if (type == 1)
  2617. {
  2618. var contacts = this.selectedContacts;
  2619. var playerSearchBox = this.dom.rightBar.contacts.search;
  2620. for (var i = 0; i < contacts.length; i++) this.addRecipient(this.getPlayerNameById(contacts[i]));
  2621. this.selectedContacts = [];
  2622. this.addSelectedContacts();
  2623. this.populateContacts();
  2624. playerSearchBox.onblur();
  2625. }
  2626. zmail.compose.getInstance().open();
  2627. },
  2628. replyToAll: function()
  2629. {
  2630. var msgCont = this.dom.compose.rightBar.msgCont;
  2631. var msg = this.selectedHeader.data.msg;
  2632. this.resetComposeContainer();
  2633. this.addSections();
  2634. this.addRecipient(msg.f);
  2635. for (var i = 0; i < msg.t.length; i++) this.addRecipient(msg.t[i]);
  2636. this.dom.compose.rightBar.subject.value = 'Re: ' + msg.s;
  2637. zmail.compose.getInstance().open();
  2638. },
  2639. reply: function()
  2640. {
  2641. var msgCont = this.dom.compose.rightBar.msgCont;
  2642. var msg = this.selectedHeader.data.msg;
  2643. this.resetComposeContainer();
  2644. this.addSections();
  2645. this.dom.compose.rightBar.subject.value = 'Re: ' + msg.s;
  2646. this.addRecipient(msg.f);
  2647. zmail.compose.getInstance().open();
  2648. },
  2649. forwardMsg: function()
  2650. {
  2651. var msgCont = this.dom.compose.rightBar.msgCont;
  2652. var msg = this.selectedHeader.data.msg;
  2653. this.resetComposeContainer();
  2654. this.addSections();
  2655. this.dom.compose.rightBar.subject.value = 'Fwd: ' + msg.s;
  2656. zmail.compose.getInstance().open();
  2657. },
  2658. sendMail: function()
  2659. {
  2660. var to = this.recipients.join('; ');
  2661. var subject = this.dom.compose.rightBar.subject.value;
  2662. var date = new Date();
  2663. var from = zmail.data.getInstance().ownerName;
  2664. var clone = this.dom.compose.rightBar.iframe.contentWindow.document.body.cloneNode(true);
  2665. var message = this.encodeMsg(clone);
  2666. date = date.getTime();
  2667. if ((subject == '') || (subject == 'Add Subject:')) subject = 'No subject';
  2668. if (message.trim() == 'Add Text') message = '';
  2669. message = '<cnc><cncs>' + from + '</cncs><cncd>' + date + '</cncd><cnct>' + message + '</cnct></cnc>';
  2670. for (var i = 0; i < this.generatedSections.length; i++)
  2671. {
  2672. if(this.generatedSections[i][2] == 1) message += this.generatedSections[i][1];
  2673. }
  2674. zmail.data.getInstance().callMethod('sendMail', [to, "", subject, message]);
  2675. if (this.selectedDraft)
  2676. {
  2677. var id = parseInt(this.selectedDraft, 10), header = this.selectedHeader;
  2678. if (header.data.msg.i == id) this.deleteDraft();
  2679. else
  2680. {
  2681. if (this.folders.draft.hasOwnProperty(id)) delete this.folders.draft[id];
  2682. this.update();
  2683. this.storage.save.call(this);
  2684. }
  2685. }
  2686. },
  2687. saveDraft: function()
  2688. {
  2689. var subject = this.dom.compose.rightBar.subject.value;
  2690. var date = new Date();
  2691. var from = zmail.data.getInstance().ownerName;
  2692. var fromId = zmail.data.getInstance().ownerId;
  2693. var clone = this.dom.compose.rightBar.iframe.contentWindow.document.body.cloneNode(true);
  2694. var message = this.encodeMsg(clone);
  2695. if ((subject == '') || (subject == 'Add Subject:')) subject = 'No subject';
  2696. date = date.getTime();
  2697. message = '<cnc><cncs>' + from + '</cncs><cncd>' + date + '</cncd><cnct>' + message + '</cnct></cnc>';
  2698. for (var i = 0; i < this.generatedSections.length; i++)
  2699. {
  2700. if(this.generatedSections[i][2] == 1) message += this.generatedSections[i][1];
  2701. }
  2702. var id = (this.selectedDraft) ? parseInt(this.selectedDraft) : date;
  2703. var msg = {'b':message,'r':true,'f':from,'fi':fromId,'t':this.recipients,'s':subject,'d':date,'i':id,'rm':clone.innerHTML};
  2704. if (this.folders.draft == null) this.folders.draft = {};
  2705. this.folders.draft[id] = msg;
  2706. this.selectedDraft = null;
  2707. this.update();
  2708. this.storage.save.call(this);
  2709. },
  2710. editDraft: function()
  2711. {
  2712. if(this.selectedFolder == 'draft')
  2713. {
  2714. this.resetComposeContainer();
  2715. var id = this.selectedHeader.data.msg.i;
  2716. var draft = this.folders.draft[id];
  2717. this.recipients = draft.t;
  2718. this.dom.compose.rightBar.subject.value = draft.s;
  2719. this.iframeContent = draft.rm;
  2720. if(this.generatedSections && this.generatedSections.length > 1)
  2721. {
  2722. this.generatedSections.splice(0,1);
  2723. this.addSections();
  2724. }
  2725. this.selectedDraft = id;
  2726. for (var i = 0; i < draft.t.length; i++) this.addRecipient(draft.t[i]);
  2727. zmail.compose.getInstance().open();
  2728. }
  2729. },
  2730. deleteDraft: function()
  2731. {
  2732. if (this.selectedFolder == 'draft')
  2733. {
  2734. var ids = this.getSelectedMsgsIds();
  2735. for (var i = 0; i < ids.length; i++)
  2736. {
  2737. if (this.folders.draft.hasOwnProperty(ids[i])) delete this.folders.draft[ids[i]];
  2738. }
  2739. this.selectAll(false);
  2740. this.update();
  2741. this.storage.save.call(this);
  2742. }
  2743. },
  2744. encodeMsg: function(cont)
  2745. {
  2746. try
  2747. {
  2748. var getMargin = function(a)
  2749. {
  2750. var m = 0, elm = a;
  2751. while (elm.parentElement)
  2752. {
  2753. if (elm.nodeType == 1) m += parseInt(elm.style.marginLeft) || 0;
  2754. elm = elm.parentElement;
  2755. }
  2756. return m;
  2757. };
  2758. var getLinkType = function(a)
  2759. {
  2760. var type;
  2761. if (a.match('webfrontend.gui.util.BBCode.openPlayerProfile')) type = 'player';
  2762. if (a.match('webfrontend.gui.util.BBCode.openAllianceProfile')) type = 'alliance';
  2763. if (a.match('webfrontend.gui.UtilView.centerCoordinatesOnRegionViewWindow')) type = 'coords';
  2764. return type;
  2765. };
  2766. var getAttr = function(a)
  2767. {
  2768. var b = '';
  2769. switch(a.nodeName.toLowerCase())
  2770. {
  2771. case 'p': case 'div':
  2772. if (a.style.textAlign !== '') b = a.style.textAlign.charAt(0);
  2773. else if (a.align !== '') b = a.align.charAt(0);
  2774. break;
  2775. case 'a':
  2776. if (a.attributes.hasOwnProperty('href')) b = 'url';
  2777. if (a['onclick']) b = getLinkType(a.onclick.toString());
  2778. break;
  2779. default: b = '';
  2780. }
  2781. return b;
  2782. };
  2783. var parseHTML = function(a)
  2784. {
  2785. var result = '', o = [];
  2786. for(var i = 0; i < a.childNodes.length; i++)
  2787. {
  2788. var elm = a.childNodes[i], nodeName = elm.nodeName.toLowerCase(), nodeType = elm.nodeType;
  2789. var attr = (nodeType == 1 && getAttr(elm) !== '') ? getAttr(elm) + ']' : ']';
  2790. var className = elm.className, nodeValue = elm.nodeValue;
  2791. var nodeText = (elm.innerText) ? elm.innerText : elm.textContent;
  2792. var isLineBreak = (elm.innerHTML == '<br>') ? true : false;
  2793. if (nodeType == 1 && elm.children.length == 0)
  2794. {
  2795. if ((nodeName == 'div') && (attr == ']') && (className != 'quote')) result += nodeText + '\n';
  2796. else if ((nodeName == 'div') && (attr != ']')) result += '[d' + attr + nodeText + '[/d' + attr;
  2797. else if ((nodeName == 'div') && (className == 'quote')) result += '[quote]' + nodeTExt + '[/quote]';
  2798. else if ((nodeName == 'p') && (attr == ']')) result += nodeText;
  2799. else if ((nodeName == 'p') && (attr != ']')) result += '[d' + attr + nodeText + '[/d' + attr;
  2800. else if (nodeName == 'blockquote') result += '[bq' + attr + nodeText + '[/bq' + attr;
  2801. else if (nodeName == 'br') result += '\n';
  2802. else if (nodeName == 'a') result += '[' + attr + nodeText + '[/' + attr;
  2803. else if (nodeName == 'font') result += nodeText;
  2804. else if (nodeName == 'strike') result += '[s]' + nodeText + '[/s]';
  2805. else result += '[' + nodeName + attr + nodeText + '[/' + nodeName + ']';
  2806. }
  2807. else if (nodeType == 1 && elm.children.length > 0)
  2808. {
  2809. o.push(elm);
  2810. if ((nodeName == 'div') && (attr == ']') && (className != 'quote') && !isLineBreak) result += '';
  2811. else if ((nodeName == 'div') && (attr != ']') && !isLineBreak) result += '[d' + attr;
  2812. else if ((nodeName == 'div') && isLineBreak) result += '';
  2813. else if ((nodeName == 'div') && (className == 'quote')) result += '[quote]';
  2814. else if ((nodeName == 'p') && (attr == ']')) result += '';
  2815. else if ((nodeName == 'p') && (attr != ']')) result += '[d' + attr;
  2816. else if (nodeName == 'blockquote') result += '[bq' + attr;
  2817. else if (nodeName == 'a') result += '[' + attr;
  2818. else if (nodeName == 'font') result += '';
  2819. else if (nodeName == 'span') result += '';
  2820. else if (nodeName == 'strike') result += '[s]';
  2821. else result += '[' + nodeName + ']';
  2822. result += parseHTML(o[o.length - 1]);
  2823. if ((nodeName == 'div') && (attr == ']') && (className != 'quote') && !isLineBreak) result += '\n';
  2824. else if ((nodeName == 'div') && (attr != ']') && !isLineBreak) result += '[/d' + attr;
  2825. else if ((nodeName == 'div') && isLineBreak) result += '';
  2826. else if ((nodeName == 'div') && (className == 'quote')) result += '[/quote]';
  2827. else if ((nodeName == 'p') && (attr == ']')) result += '';
  2828. else if ((nodeName == 'p') && (attr != ']')) result += '[/d' + attr;
  2829. else if (nodeName == 'blockquote') result += '[/bq' + attr;
  2830. else if (nodeName == 'a') result += '[/' + attr;
  2831. else if (nodeName == 'font') result += '';
  2832. else if (nodeName == 'span') result += '';
  2833. else if (nodeName == 'strike') result += '[/s]';
  2834. else result += '[/' + nodeName + ']';
  2835. }
  2836. else if (nodeType == 3 && nodeValue && nodeValue.trim() !== '') result += nodeValue;
  2837. }
  2838. result.replace('\u200B', '');
  2839. return result;
  2840. };
  2841. var encoded = parseHTML(cont);
  2842. return encoded;
  2843. }
  2844. catch(e)
  2845. {
  2846. console.log('zmail: ' + e.toString());
  2847. return 'ERROR';
  2848. }
  2849. },
  2850. getCharactersCount: function(msg)
  2851. {
  2852. var count = 0;
  2853. if (this.generatedSections && this.generatedSections.length)
  2854. {
  2855. for (var i = 0; i < this.generatedSections.length; i++)
  2856. {
  2857. var cnct = this.generatedSections[i][1].replace(/.*?<cnct>([^<\/cnct>]*)<\/cnct>.*/, '$1');
  2858. if (cnct && this.generatedSections[i][2] == 1) count += cnct.length;
  2859. }
  2860. }
  2861. if (msg) count += msg.length;
  2862. return count;
  2863. },
  2864. markRead: function(flag)
  2865. {
  2866. var ids = this.getSelectedMsgsIds(), style = (flag) ? 'cont' : 'contUnRead';
  2867. var headers = (this.selectedMsgs.headers.length == 0) ? [this.selectedHeader] : this.selectedMsgs.headers;
  2868. for(var i = 0; i < headers.length; i++)
  2869. {
  2870. var isRead = headers[i].data.isRead;
  2871. var id = headers[i].data.msg.i;
  2872. var index = this.getMsgIndex(id, this.folders.inbox.msgs);
  2873. headers[i].data.isRead = flag;
  2874. headers[i].zm_css(this.css.header[style]);
  2875. if (index > -1) this.folders.inbox.msgs[index].r = flag;
  2876. else console.log('zmail: ' + 'Inbox doesn\'t contain id(' + id + ')');
  2877. }
  2878. this.selectAll(false);
  2879. zmail.data.getInstance().markRead(ids, flag);
  2880. },
  2881. selectAll: function(n)
  2882. {
  2883. var selectAllCheckBox = this.dom.middleBar.footer.selectAll;
  2884. var ids = [], headers = [], boxes = [];
  2885. for(var key in this.generatedHeaders)
  2886. {
  2887. var checkBox = this.generatedHeaders[key].checkBox;
  2888. var header = this.generatedHeaders[key].cont;
  2889. header.style.background = (n) ? '#363636' : (header.data.isRead) ? 'transparent' : '#292929';
  2890. header.data.isSelected = n;
  2891. checkBox.data.isChecked = n;
  2892. checkBox.style.background = (n) ? '#9f9f9f' : 'transparent';
  2893. ids.push(parseInt(key));
  2894. headers.push(header);
  2895. boxes.push(checkBox);
  2896. }
  2897. this.selectedMsgs.ids = (n) ? ids : [];
  2898. this.selectedMsgs.headers = (n) ? headers : [];
  2899. this.selectedMsgs.checkBoxes = (n) ? boxes : [];
  2900. selectAllCheckBox.data.isChecked = n;
  2901. selectAllCheckBox.style.background = (n) ? '#9f9f9f' : 'transparent';
  2902. this.selectedHeader = null;
  2903. this.resetMsgCont(1);
  2904. this.setToolbar();
  2905. },
  2906. getSelectedMsgsIds: function()
  2907. {
  2908. var smIds = this.selectedMsgs.ids, sh = this.selectedHeader;
  2909. var ids = (smIds != null && smIds.length > 0) ? smIds : (sh != null) ? [sh.data.msg.i] : null;
  2910. return ids;
  2911. },
  2912. getMsgIndex: function(id, msgs)
  2913. {
  2914. var index = -1;
  2915. for(var i = 0; i < msgs.length; i++)
  2916. {
  2917. if (msgs[i].i == id)
  2918. {
  2919. index = i;
  2920. break;
  2921. }
  2922. }
  2923. return index;
  2924. },
  2925. removeMsgFromFolder: function(id, folder)
  2926. {
  2927. var idIndex = this.folders[folder].ids.indexOf(id);
  2928. if (idIndex > -1)
  2929. {
  2930. if (this.folders[folder].msgs[idIndex].i == id)
  2931. {
  2932. var msg = this.folders[folder].msgs[idIndex];
  2933. this.folders[folder].ids.splice(idIndex, 1);
  2934. this.folders[folder].msgs.splice(idIndex, 1);
  2935. return msg;
  2936. }
  2937. else
  2938. {
  2939. var msgIndex = this.getMsgIndex(id, this.folders[folder].msgs);
  2940. var msgId = this.folders[folder].msgs[msgIndex].i;
  2941. if ((msgIndex > -1) && (msgId == id))
  2942. {
  2943. var msg = this.folders[folder].msgs[msgIndex];
  2944. this.folders[folder].ids.splice(idIndex, 1);
  2945. this.folders[folder].msgs.splice(msgIndex, 1);
  2946. return msg;
  2947. }
  2948. else
  2949. {
  2950. if (msgIndex == -1) console.log('zmail: ' + 'Message with id: ' + id + ' could not be found in ' + folder + '!');
  2951. else if (msgId !== id) console.log('zmail: ' + 'id mismatch (' + id + ' - ' + msgId + ')');
  2952. else console.log('zmail: ' + 'something went terribly wrong');
  2953. return false;
  2954. }
  2955. }
  2956. }
  2957. else console.log('zmail: ' + 'id: ' + id + 'does not exist in folder ' + folder);
  2958. },
  2959. toJunk: function()
  2960. {
  2961. var arr = this.getSelectedMsgsIds();
  2962. if (arr !== null)
  2963. {
  2964. for (var i = 0; i < arr.length; i++)
  2965. {
  2966. var id = arr[i], msg = this.removeMsgFromFolder(id, 'inbox');
  2967. if (msg && this.folders.junk.ids.indexOf(id) == -1)
  2968. {
  2969. this.folders.junk.ids.push(id);
  2970. this.folders.junk.msgs.push(msg);
  2971. }
  2972. if (this.folders.junk.ids.indexOf(id) > -1) console.log('zmail: ' + 'Message with id: ' + id + 'already exists in Junk!');
  2973. }
  2974. this.selectAll(false);
  2975. this.update();
  2976. this.storage.save.call(this);
  2977. }
  2978. else console.log('zmail: ' + 'No messages selected!');
  2979. },
  2980. toDocuments: function()
  2981. {
  2982. var arr = this.getSelectedMsgsIds();
  2983. if (arr !== null)
  2984. {
  2985. for (var i = 0; i < arr.length; i++)
  2986. {
  2987. var id = arr[i], msg = this.removeMsgFromFolder(id, 'inbox'), index = this.folders.documents.ids.indexOf(id);
  2988. if (msg && (index == -1))
  2989. {
  2990. this.folders.documents.ids.push(id);
  2991. this.folders.documents.msgs.push(msg);
  2992. }
  2993. if (index > -1) console.log('zmail: ' + 'Message (' + id + ') already exists in Documents!');
  2994. }
  2995. this.selectAll(false);
  2996. this.update();
  2997. this.storage.save.call(this);
  2998. }
  2999. else console.log('zmail: ' + 'No messages selected!');
  3000. },
  3001. toTrash: function()
  3002. {
  3003. var arr = this.getSelectedMsgsIds();
  3004. var folder = this.selectedFolder;
  3005. var type = (folder == 'outbox') ? 1 : 0;
  3006. if (arr !== null)
  3007. {
  3008. for (var i = 0; i < arr.length; i++)
  3009. {
  3010. var id = arr[i], msg = this.removeMsgFromFolder(id, folder), index = this.folders.trash[type].ids.indexOf(id);
  3011. if (msg && (index == -1))
  3012. {
  3013. this.folders.trash[type].ids.push(id);
  3014. this.folders.trash[type].msgs.push(msg);
  3015. }
  3016. if (index > -1) console.log('zmail: ' + 'Message (' + id + ') already exists in trash[' + type + ']!');
  3017. }
  3018. this.selectAll(false);
  3019. this.update();
  3020. this.storage.save.call(this);
  3021. }
  3022. else console.log('zmail: ' + 'No messages selected!');
  3023. },
  3024. emptyFolder: function()
  3025. {
  3026. var data = zmail.data.getInstance();
  3027. if(this.selectedFolder == 'junk')
  3028. {
  3029. if (this.folders.junk.ids != null && this.folders.junk.ids.length > 0)
  3030. {
  3031. data.deleteMsgs(this.folders.junk.ids, 1);
  3032. this.folders.junk.ids = [];
  3033. this.folders.junk.msgs = [];
  3034. }
  3035. }
  3036. if(this.selectedFolder == 'trash')
  3037. {
  3038. if (this.folders.trash[0].ids != null && this.folders.trash[0].ids.length > 0)
  3039. {
  3040. data.deleteMsgs(this.folders.trash[0].ids, 1);
  3041. this.folders.trash[0].ids = [];
  3042. this.folders.trash[0].msgs = [];
  3043. }
  3044. if (this.folders.trash[1].ids != null && this.folders.trash[1].ids.length > 0)
  3045. {
  3046. data.deleteMsgs(this.folders.trash[1].ids, 0);
  3047. this.folders.trash[1].ids = [];
  3048. this.folders.trash[1].msgs = [];
  3049. }
  3050. }
  3051. this.update();
  3052. this.storage.save.call(this);
  3053. },
  3054. notJunk: function()
  3055. {
  3056. var arr = this.getSelectedMsgsIds();
  3057. if(this.selectedFolder == 'junk' && arr !== null)
  3058. {
  3059. for (var i = 0; i < arr.length; i++)
  3060. {
  3061. var id = arr[i], msg = this.removeMsgFromFolder(id, 'junk'), index = this.folders.inbox.ids.indexOf(id);
  3062. if (msg && (index == -1))
  3063. {
  3064. this.folders.inbox.ids.push(id);
  3065. this.folders.inbox.msgs.push(msg);
  3066. }
  3067. if (index > -1) console.log('zmail: ' + 'Message (' + id + ')already exists in inbox!');
  3068. }
  3069. this.selectAll(false);
  3070. this.update();
  3071. this.storage.save.call(this);
  3072. }
  3073. else console.log('zmail: ' + 'No messages selected!');
  3074. },
  3075. notTrash: function()
  3076. {
  3077. var arr = this.getSelectedMsgsIds();
  3078. if ((this.selectedFolder == 'trash') && (arr !== null))
  3079. {
  3080. for (var i = 0; i < arr.length; i++)
  3081. {
  3082. var id = arr[i];
  3083. if (this.folders.trash[0].ids.indexOf(id) > -1)
  3084. {
  3085. var idIndex = this.folders.trash[0].ids.indexOf(id);
  3086. var msgIndex = this.getMsgIndex(id, this.folders.trash[0].msgs);
  3087. if (msgIndex > -1)
  3088. {
  3089. var msg = this.folders.trash[0].msgs[msgIndex];
  3090. this.folders.trash[0].ids.splice(idIndex, 1);
  3091. this.folders.trash[0].msgs.splice(msgIndex, 1);
  3092. if (this.folders.inbox.ids.indexOf(id) == -1)
  3093. {
  3094. this.folders.inbox.ids.push(id);
  3095. this.folders.inbox.msgs.push(msg);
  3096. }
  3097. else console.log('zmail: ' + 'id(' + id + ') already exists in Inbox!');
  3098. }
  3099. else console.log('zmail: ' + 'trash[inbox] doesn\'t contain message with id(' + id + ')');
  3100. }
  3101. else if (this.folders.trash[1].ids.indexOf(id) > -1)
  3102. {
  3103. var idIndex = this.folders.trash[1].ids.indexOf(id);
  3104. var msgIndex = this.getMsgIndex(id, this.folders.trash[1].msgs);
  3105. if (msgIndex > -1)
  3106. {
  3107. var msg = this.folders.trash[1].msgs[msgIndex];
  3108. this.folders.trash[1].ids.splice(idIndex, 1);
  3109. this.folders.trash[1].msgs.splice(msgIndex, 1);
  3110. if (this.folders.outbox.ids.indexOf(id) == -1)
  3111. {
  3112. this.folders.outbox.ids.push(id);
  3113. this.folders.outbox.msgs.push(msg);
  3114. }
  3115. else console.log('zmail: ' + 'id(' + id + ') already exists in Inbox!');
  3116. }
  3117. else console.log('zmail: ' + 'trash[inbox] doesn\'t contain message with id(' + id + ')');
  3118. }
  3119. else console.log('zmail: ' + 'trash folder doesn\'t contain id(' + id + ')');
  3120. }
  3121. this.selectAll(false);
  3122. this.update();
  3123. this.storage.save.call(this);
  3124. }
  3125. },
  3126. notDocument: function()
  3127. {
  3128. var arr = this.getSelectedMsgsIds();
  3129. if(this.selectedFolder == 'documents' && arr !== null)
  3130. {
  3131. for (var i = 0; i < arr.length; i++)
  3132. {
  3133. var id = arr[i], msg = this.removeMsgFromFolder(id, 'documents'), index = this.folders.inbox.ids.indexOf(id);
  3134. if (msg && (index == -1))
  3135. {
  3136. this.folders.inbox.ids.push(id);
  3137. this.folders.inbox.msgs.push(msg);
  3138. }
  3139. if (index > -1) console.log('zmail: ' + 'Message (' + id + ')already exists in inbox!');
  3140. }
  3141. this.selectAll(false);
  3142. this.update();
  3143. this.storage.save.call(this);
  3144. }
  3145. else console.log('zmail: ' + 'No messages selected!');
  3146. },
  3147. deleteMsg: function()
  3148. {
  3149. var arr = this.getSelectedMsgsIds();
  3150. if (this.selectedFolder == 'trash' && arr !== null)
  3151. {
  3152. var data = zmail.data.getInstance();
  3153. var inbox = [], outbox = [];
  3154. for (var i = 0; i < arr.length; i++)
  3155. {
  3156. var id = arr[i];
  3157. if (this.folders.trash[0].ids.indexOf(id) > -1)
  3158. {
  3159. var idIndex = this.folders.trash[0].ids.indexOf(id);
  3160. var msgIndex = this.getMsgIndex(id, this.folders.trash[0].msgs);
  3161. if(msgIndex > -1)
  3162. {
  3163. inbox.push(id);
  3164. this.folders.trash[0].ids.splice(idIndex, 1);
  3165. this.folders.trash[0].msgs.splice(msgIndex, 1);
  3166. }
  3167. else console.log('zmail: ' + 'trash[inbox] doesn\'t contain a message with id(' + id + ')');
  3168. }
  3169. else if (this.folders.trash[1].ids.indexOf(id) > -1)
  3170. {
  3171. var idIndex = this.folders.trash[1].ids.indexOf(id);
  3172. var msgIndex = this.getMsgIndex(id, this.folders.trash[1].msgs);
  3173. if(msgIndex > -1)
  3174. {
  3175. outbox.push(id);
  3176. this.folders.trash[1].ids.splice(idIndex, 1);
  3177. this.folders.trash[1].msgs.splice(msgIndex, 1);
  3178. }
  3179. else console.log('zmail: ' + 'trash[outbox] doesn\'t contain a message with id(' + id + ')');
  3180. }
  3181. else console.log('zmail: ' + 'trash folder doesn\'t contain id(' + id + ')');
  3182. }
  3183. this.selectAll(false);
  3184. this.update();
  3185. this.storage.save.call(this);
  3186. if (inbox.length > 0) data.deleteMsgs(inbox, 1);
  3187. if (outbox.length > 0) data.deleteMsgs(outbox, 0);
  3188. }
  3189. },
  3190. searchFolder: function(str)
  3191. {
  3192. var msgs = this.folders[this.selectedFolder].msgs;
  3193. var m1 = [], m2 = [], sd = [], sb = [], root = this;
  3194. var cont = this.dom.searchResults.cont;
  3195. var fromUl = this.dom.searchResults.sender.list;
  3196. var subjectUl = this.dom.searchResults.subject.list;
  3197. var fromCount = this.dom.searchResults.sender.count;
  3198. var subjectCount = this.dom.searchResults.subject.count;
  3199. fromUl.zm_empty();
  3200. subjectUl.zm_empty();
  3201. cont.style.display = (str == '') ? 'none' : 'block';
  3202. for (var i = 0; i < msgs.length; i++)
  3203. {
  3204. var sender = msgs[i].f, subject = msgs[i].s.toLowerCase(), id = msgs[i].i, str = str.toLowerCase();
  3205. if ((sender.toLowerCase().match(str) !== null) && (sd.indexOf(sender) == -1))
  3206. {
  3207. m1.push([sender, id]);
  3208. sd.push(sender);
  3209. }
  3210. if ((subject.match(str) !== null) && (sb.indexOf(subject) == -1))
  3211. {
  3212. m2.push([subject, id]);
  3213. sb.push(subject);
  3214. }
  3215. }
  3216. (fromCount.innerText) ? fromCount.innerText = m1.length : fromCount.textContent = m1.length;
  3217. (subjectCount.innerText) ? subjectCount.innerText = m2.length : subjectCount.textContent = m2.length;
  3218. var printMsg = function()
  3219. {
  3220. root.printMsg.apply(root, arguments);
  3221. };
  3222. for (var a = 0; a < Math.min(5, m1.length); a++)
  3223. {
  3224. var li1 = this.create('li', this.css.searchResults.li.sub);
  3225. var t1 = m1[a][0];
  3226. this.text(li1, (t1.length > 15) ? t1.substr(0, 15) + '...' : t1);
  3227. fromUl.appendChild(li1);
  3228. li1.data = {'sender': m1[a][0], 'folder': this.selectedFolder};
  3229. li1.onclick = function()
  3230. {
  3231. var f = this.data.folder, um = [], ui = [];
  3232. var msgs = root.folders[f].msgs;
  3233. if (!msgs) return;
  3234. for (var m = 0; m < msgs.length; m++) if (msgs[m].f == this.data.sender) { um.push(msgs[m]); ui.push(msgs[m].i) };
  3235. root.selectedFolder = 'results';
  3236. root.folders.results = {'ids': ui, 'msgs': um};
  3237. root.populateHeaders();
  3238. root.selectedFolder = this.data.folder;
  3239. cont.style.display = 'none';
  3240. }
  3241. }
  3242. for (var b = 0; b < Math.min(5, m2.length); b++)
  3243. {
  3244. var li2 = this.create('li', this.css.searchResults.li.sub);
  3245. var t2 = m2[b][0];
  3246. this.text(li2, (t2.length > 15) ? t2.substr(0, 15) + '...' : t2);
  3247. subjectUl.appendChild(li2);
  3248. li2.data = {'id': m2[b][1], 'folder': this.selectedFolder};
  3249. li2.onclick = function()
  3250. {
  3251. var id = this.data.id, f = this.data.folder;
  3252. var index = root.getMsgIndex(id, root.folders[f].msgs);
  3253. var msg = root.folders[f].msgs[index];
  3254. root.selectedFolder = 'results';
  3255. root.folders.results = {'ids': [id], 'msgs': [msg]};
  3256. root.populateHeaders();
  3257. root.selectedFolder = this.data.folder;
  3258. for (var h in root.generatedHeaders)
  3259. {
  3260. root.generatedHeaders[h].cont.click();
  3261. break;
  3262. }
  3263. cont.style.display = 'none';
  3264. }
  3265. };
  3266. },
  3267. storage:
  3268. {
  3269. 'save': function()
  3270. {
  3271. var json = JSON.parse(localStorage.ccta_zmail), folders = {}, contacts = {};
  3272. folders.draft = this.folders.draft;
  3273. folders.junk = this.folders.junk.ids;
  3274. folders.trash = [this.folders.trash[0].ids, this.folders.trash[1].ids];
  3275. folders.documents = this.folders.documents.ids;
  3276. contacts.friends = this.contacts.friends;
  3277. contacts.blocked = this.contacts.blocked;
  3278. contacts.groups = this.contacts.groups;
  3279. localStorage.ccta_zmail = JSON.stringify({'folders': folders, 'contacts': contacts, 'archive': json.archive});
  3280. },
  3281. 'get': function(folder)
  3282. {
  3283. var json = JSON.parse(localStorage.ccta_zmail), folders = json.folders, contacts = json.contacts;
  3284. var x = null;
  3285. var size = function(obj)
  3286. {
  3287. if (typeof obj !== 'object') return null;
  3288. var s = 0;
  3289. for (var key in obj) s++;
  3290. return s;
  3291. };
  3292. switch(folder)
  3293. {
  3294. case 'draft': if (folders.draft !== null) x = folders.draft; break;
  3295. case 'trash0': if (folders.trash !== null) x = folders.trash[0]; break;
  3296. case 'trash1': if (folders.trash !== null) x = folders.trash[1]; break;
  3297. case 'junk': if (folders.junk !== null) x = folders.junk; break;
  3298. case 'draft': if (folders.draft !== null) x = folders.draft; break;
  3299. case 'documents': if (folders.documents !== null) x = folders.documents; break;
  3300. case 'friends': if (contacts.friends !== null) x = contacts.friends; break;
  3301. case 'blocked': if (contacts.blocked !== null) x = contacts.blocked; break;
  3302. case 'groups': if (contacts.groups !== null) x = contacts.groups; break;
  3303. }
  3304. x = (x) ? x : ((folder == 'draft')||(folder == 'groups')) ? {} : [];
  3305. console.log('zmail: ' + x, folder);
  3306. return x;
  3307. }
  3308. },
  3309. setToolbar: function()
  3310. {
  3311. var folder = this.selectedFolder, selection = this.selectedMsgs, header = this.selectedHeader;
  3312. var type = (selection.ids == null || selection.ids.length == 0) ? (header == null) ? 'default' : 'single' : 'group';
  3313. var toolbarCont = this.dom.topBar.menu;
  3314. var newMsg = this.dom.topBar.toolbar.newMsg;
  3315. var trash = this.dom.topBar.toolbar.trash;
  3316. var delMsg = this.dom.topBar.toolbar.delMsg;
  3317. var junk = this.dom.topBar.toolbar.junk;
  3318. var notJunk = this.dom.topBar.toolbar.notJunk;
  3319. var restore = this.dom.topBar.toolbar.restore;
  3320. var mark = this.dom.topBar.toolbar.mark;
  3321. var reply = this.dom.topBar.toolbar.reply;
  3322. var empty = this.dom.topBar.toolbar.empty;
  3323. var editDraft = this.dom.topBar.toolbar.editDraft;
  3324. var deleteDraft = this.dom.topBar.toolbar.deleteDraft;
  3325. var toDocuments = this.dom.topBar.toolbar.toDocuments;
  3326. var notDocument = this.dom.topBar.toolbar.notDocument;
  3327. var forwardMsg = this.dom.topBar.toolbar.forwardMsg;
  3328. var bars = {
  3329. 'inbox':
  3330. {
  3331. 'single': [reply, trash, junk, toDocuments, mark],
  3332. 'group': [trash, junk, toDocuments, mark],
  3333. 'default': []
  3334. },
  3335. 'outbox':
  3336. {
  3337. 'single': [trash, forwardMsg],
  3338. 'group': [trash],
  3339. 'default': []
  3340. },
  3341. 'junk':
  3342. {
  3343. 'single': [notJunk, trash, empty],
  3344. 'group': [notJunk, trash],
  3345. 'default': [empty]
  3346. },
  3347. 'trash':
  3348. {
  3349. 'single': [restore, delMsg, empty],
  3350. 'group': [restore, delMsg],
  3351. 'default': [empty]
  3352. },
  3353. 'draft':
  3354. {
  3355. 'single': [editDraft, deleteDraft],
  3356. 'group': [deleteDraft],
  3357. 'default': []
  3358. },
  3359. 'documents':
  3360. {
  3361. 'single': [notDocument, forwardMsg, trash],
  3362. 'group': [notDocument, forwardMsg, trash],
  3363. 'default': []
  3364. }
  3365. };
  3366. toolbarCont.zm_empty();
  3367. toolbarCont.appendChild(newMsg);
  3368. if (bars.hasOwnProperty(folder)) toolbarCont.zm_append(bars[folder][type]);
  3369. },
  3370. decodeMsg: function(m)
  3371. {
  3372. var match, f = m, create = this.create, cssStyles = this.css, text = this.text;
  3373. var re = /(?:\[(url|player|alliance|coords)\])((?:.(?!\1))+.)(?:\[\/\1\])/g;
  3374. var tags = ['ul','ol','tr','td','th','table','li','dr','dc','dl','tbody','bq','span','b','i','u','s','font','quote'];
  3375. var data = zmail.data.getInstance();
  3376. var BBCode = data.createBBCode;
  3377. var quoteCont = '<br/><div style="padding:10px; border:1px solid #5a5a5a; background:#303030; box-sizing:border-box; -moz-box-sizing:border-box; word-wrap:break-word;">';
  3378. var createLink = function(val)
  3379. {
  3380. var a = create('a', cssStyles.link._14);
  3381. text(a, val);
  3382. a.href = val;
  3383. a.target = 'blank';
  3384. return a.outerHTML;
  3385. };
  3386. var convertTag = function(tag)
  3387. {
  3388. var openTag, closeTag, op = new RegExp('\\[' + tag + '\\]', 'g'), cp = new RegExp('\\[\\/' + tag + '\\]', 'g');
  3389. switch(tag)
  3390. {
  3391. case 'dr': openTag = '<div style="text-align: right">'; closeTag = '</div>'; break;
  3392. case 'dc': openTag = '<div style="text-align: center">'; closeTag = '</div>'; break;
  3393. case 'dl': openTag = '<div style="text-align: left">'; closeTag = '</div>'; break;
  3394. case 'bq': openTag = '<div style="margin-left: 40px">'; closeTag = '</div>'; break;
  3395. case 'table': openTag = '<table rules="all" border="1" style="border-color: #999; margin: 10px 0;">'; closeTag = '</table>'; break;
  3396. case 'td': openTag = '<td style="padding: 4px 15px">'; closeTag = '</td>'; break;
  3397. case 'th': openTag = '<th style="background-color: #999; color: #333; padding: 3px 15px;">'; closeTag = '</th>'; break;
  3398. case 'quote': openTag = quoteCont; closeTag = '</div>'; break;
  3399. case 'font': openTag = ''; closeTag = ''; break;
  3400. default: openTag = '<' + tag + '>'; closeTag = '</' + tag + '>';
  3401. }
  3402. if (op.test(f)) f = f.replace(op, openTag);
  3403. if (cp.test(f)) f = f.replace(cp, closeTag);
  3404. };
  3405. while((match = re.exec(m)) !== null)
  3406. {
  3407. var code = match[1], val = match[2];
  3408. if(code == 'coords') val = val.split(':');
  3409. switch(code)
  3410. {
  3411. case 'url': f = f.replace(match[0], createLink(val)); break;
  3412. case 'alliance': f = f.replace(match[0], BBCode.alliance(val)); break;
  3413. case 'player': f = f.replace(match[0], BBCode.player(val)); break;
  3414. case 'coords': f = f.replace(match[0], BBCode.coords(val.join(':'), val[0], val[1])); break;
  3415. }
  3416. }
  3417. tags.map(convertTag);
  3418. return f;
  3419. },
  3420. formatDate: function(d,t)
  3421. {
  3422. var date = new Date(parseInt(d));
  3423. var day = date.getDate(), month = date.getMonth() + 1, year = date.getFullYear().toString().slice(2);
  3424. var hours = date.getHours(), minutes = date.getMinutes(), fullYear = date.getFullYear();
  3425. var newDate = new Date(), today = newDate.getDate(), thisMonth = newDate.getMonth() + 1, thisYear = newDate.getFullYear();
  3426. var conv = function(n){ return (n > 9) ? n : '0' + n};
  3427. if(day == today && month == thisMonth && fullYear == thisYear && t == 'header')
  3428. {
  3429. return conv(hours) + ':' + conv(minutes);
  3430. }
  3431. else
  3432. {
  3433. var f = conv(day) + '/' + conv(month) + '/' + year;
  3434. if (t == 'header') return f;
  3435. if (t == 'msg') return (f + ' ' + conv(hours) + ':' + conv(minutes));
  3436. }
  3437. },
  3438. printMsg: function(msg)
  3439. {
  3440. var b = msg.b, cssStyles = this.css, text = this.text, create = this.create, root = this;
  3441. var msgSbc = this.dom.rightBar.scrollBar.cont, msgCont = this.dom.rightBar.msgCont;
  3442. var sb = this.dom.rightBar.scrollBar.bar;
  3443. var expandCont = root.dom.rightBar.expandCont;
  3444. this.generatedSections = [];
  3445. msgCont.zm_empty();
  3446. var createSection = function(f,d,m,i,c)
  3447. {
  3448. var s_cont = create('div', cssStyles.compose.rightBar.origionalMsg.cont);
  3449. var s_remove = create('div', cssStyles.compose.rightBar.origionalMsg.close);
  3450. var s_from = create('p', cssStyles.compose.rightBar.origionalMsg.from);
  3451. var s_date = create('p', cssStyles.compose.rightBar.origionalMsg.date);
  3452. var s_message = document.createElement('div');
  3453. var s_sender = f.cloneNode(true);
  3454. text(s_from, 'From: ');
  3455. text(s_date, d);
  3456. text(s_remove, 'x');
  3457. s_message.innerHTML = m;
  3458. s_remove.data = {'index': i, 'contents': c};
  3459. s_sender.style.fontSize = '14px';
  3460. s_sender.style.fontWeight = 'normal';
  3461. s_from.zm_append([s_sender, s_date]);
  3462. s_cont.zm_append([s_from, s_message, s_remove]);
  3463. s_remove.onclick = function()
  3464. {
  3465. var index = this.data.index, sections = root.generatedSections;
  3466. var sb = root.dom.compose.rightBar.msgSb;
  3467. if(sections[index] && sections[index][2] == 1) root.generatedSections[index][2] = 0;
  3468. this.parentNode.remove();
  3469. sb.data.update();
  3470. };
  3471. root.generatedSections.push([s_cont, c, 1]);
  3472. };
  3473. if(msg.fi === -1)
  3474. {
  3475. var subject = create('p', cssStyles.message.subject);
  3476. var from = create('p', cssStyles.message.from);
  3477. var to = create('p', cssStyles.message.from);
  3478. var msgBody = create('p', cssStyles.message.body);
  3479. var date = create('span', cssStyles.message.date);
  3480. text(subject, msg.s);
  3481. text(from, 'From: System');
  3482. text(to, 'To: You');
  3483. text(date, this.formatDate(msg.d, 'msg'));
  3484. msgBody.innerHTML = this.decodeMsg(b);
  3485. from.appendChild(date);
  3486. msgCont.zm_append([subject, from, to, msgBody]);
  3487. }
  3488. if((msg.fi !== -1) && (/<cnc>/.test(b)))
  3489. {
  3490. str = b.replace(/[\t\r\n]/g, '</br>');
  3491. var sections = [];
  3492. var cnc = str.match(/<cnc>.*?<\/cnc>/g);
  3493. var re = /(?:<(cncs|cncd|cnct)>)((?:.(?!\1))+.)(?:<\/\1>)/g, match;
  3494. for(var i = 0; i < cnc.length; i++)
  3495. {
  3496. var sd, dt, txt;
  3497. while ((match = re.exec(cnc[i])) !== null)
  3498. {
  3499. var tag = match[1], val = match[2];
  3500. switch(tag)
  3501. {
  3502. case 'cncs': sd = val; break;
  3503. case 'cncd': dt = parseInt(val); break;
  3504. case 'cnct': txt = val; break;
  3505. }
  3506. };
  3507. sections.push([sd, dt, txt]);
  3508. }
  3509. for(var n = 0; n < sections.length; n++)
  3510. {
  3511. var subject = create('p', cssStyles.message.subject);
  3512. var from = create('p', cssStyles.message.from);
  3513. var msgBody = create('p', cssStyles.message.body);
  3514. var date = create('span', cssStyles.message.date);
  3515. var sender = create('a', cssStyles.link._12);
  3516. text(subject, msg.s);
  3517. text(from, 'From: ');
  3518. text(date, this.formatDate(sections[n][1], 'msg'));
  3519. text(sender, sections[n][0]);
  3520. sender.data = {'name': sections[n][0]};
  3521. sender.onclick = function(){webfrontend.gui.util.BBCode.openPlayerProfile(this.data.name)};
  3522. sender.style.marginRight = 0;
  3523. from.zm_append([sender, date]);
  3524. if (sections[n][2]) msgBody.innerHTML = this.decodeMsg(sections[n][2]);
  3525. if(n == 0)
  3526. {
  3527. var to = create('p', cssStyles.message.from);
  3528. var expandBox = create('span', cssStyles.message.expand.wrapper);
  3529. var expand = create('div', cssStyles.message.expand.cont);
  3530. var addFriend = create('a', cssStyles.message.actionLink);
  3531. var blockContact = create('a', cssStyles.message.actionLink);
  3532. var add = function(){ root.addFriend.apply(root, arguments) };
  3533. var block = function(){ root.blockContact.apply(root, arguments) };
  3534. var isFriend = (this.contacts.friends) ? this.contacts.friends.indexOf(msg.fi) > -1 : false;
  3535. var isBlocked = (this.contacts.blocked) ? this.contacts.blocked.indexOf(msg.fi) > -1 : false;
  3536. text(to, 'To: ');
  3537. text(addFriend, 'Add to contacts');
  3538. text(blockContact, 'Block');
  3539. to.style.paddingTop = 0;
  3540. addFriend.data = {'id': msg.fi};
  3541. blockContact.data = {'id': msg.fi};
  3542. addFriend.onclick = function(){ add(this.data.id); addFriend.remove(); blockContact.remove(); };
  3543. blockContact.onclick = function(){ block(this.data.id); addFriend.remove(); blockContact.remove(); };
  3544. expand.style.backgroundImage = 'url(' + root.res.expand + ')';
  3545. expand.data = {'isCollapsed': true, 'cont': to, 'bar': null};
  3546. expand.onclick = function()
  3547. {
  3548. if (this.data.isCollapsed)
  3549. {
  3550. this.data.cont.style.whiteSpace = 'normal';
  3551. this.style.backgroundImage = 'url(' + root.res.collapse + ')';
  3552. }
  3553. else
  3554. {
  3555. this.data.cont.style.whiteSpace = 'nowrap';
  3556. this.style.backgroundImage = 'url(' + root.res.expand + ')';
  3557. }
  3558. root.dom.rightBar.scrollBar.bar.data.update();
  3559. this.data.isCollapsed = !this.data.isCollapsed;
  3560. };
  3561. expandBox.appendChild(expand);
  3562. if (!isFriend && !isBlocked) from.zm_append([addFriend, blockContact]);
  3563. for(var a = 0; a < msg.t.length; a++)
  3564. {
  3565. var receiver = create('a', cssStyles.link._12);
  3566. var s = (a == msg.t.length - 1) ? msg.t[a] : msg.t[a] + ',';
  3567. receiver.data = {'name': msg.t[a]};
  3568. receiver.onclick = function(){webfrontend.gui.util.BBCode.openPlayerProfile(this.data.name)};
  3569. text(receiver, s);
  3570. to.appendChild(receiver);
  3571. }
  3572. subject.addEventListener('mouseover', function(){expandCont.style.visibility = 'visible'}, false);
  3573. subject.addEventListener('mouseout', function()
  3574. {
  3575. setTimeout(function(){if (!expandCont.data.isFocused) expandCont.style.visibility = 'hidden'}, 50);
  3576. }, false);
  3577. msgCont.zm_append([subject, from, to, msgBody]);
  3578. if (to.scrollWidth > to.offsetWidth) to.appendChild(expandBox);
  3579. }
  3580. else msgCont.zm_append([from, msgBody]);
  3581. createSection(sender, date.innerHTML, msgBody.innerHTML, n, cnc[n]);
  3582. }
  3583. }
  3584. if (this.selectedFolder == 'inbox') msgCont.appendChild(expandCont);
  3585. msgCont.style.top = 0;
  3586. sb.data.update();
  3587. },
  3588. createHeader: function(msg)
  3589. {
  3590. var create = this.create, text = this.text, cssStyles = this.css, root = this;
  3591. var selectAll = this.dom.middleBar.footer.selectAll;
  3592. var headerCont = create('div', cssStyles.header.cont);
  3593. var sender = create('a', cssStyles.header.sender);
  3594. var date = create('span', cssStyles.header.date);
  3595. var subject = create('p', cssStyles.header.subject);
  3596. var checkBox = create('div', cssStyles.header.checkBox);
  3597. var span = create('span', cssStyles.header.span);
  3598. text(sender, msg.f);
  3599. text(date, this.formatDate(msg.d, 'header'));
  3600. text(subject, msg.s);
  3601. sender.data = {'from': msg.f};
  3602. sender.onclick = function()
  3603. {
  3604. root.preventDefaults(event);
  3605. webfrontend.gui.util.BBCode.openPlayerProfile(this.data.from)
  3606. };
  3607. span.appendChild(checkBox);
  3608. headerCont.zm_append([span, sender, date, subject]);
  3609. headerCont.data = {'msg': msg, 'isSelected': false, 'isRead': msg.r};
  3610. if(!msg.r)
  3611. {
  3612. headerCont.zm_css(cssStyles.header.contUnRead);
  3613. span.style.borderBottom = cssStyles.header.contUnRead.borderBottom;
  3614. }
  3615. headerCont.onmouseover = function(){this.style.background = '#363636'};
  3616. headerCont.onmouseout = function()
  3617. {
  3618. var isSelected = this.data.isSelected, isRead = this.data.isRead;
  3619. var color = isSelected ? '#363636' : (isRead) ? 'transparent' : '#292929';
  3620. this.style.background = color;
  3621. };
  3622. headerCont.onclick = function()
  3623. {
  3624. if(!this.data.isRead)
  3625. {
  3626. var id = this.data.msg.i;
  3627. var index = root.getMsgIndex(id, root.folders.inbox.msgs);
  3628. var data = zmail.data.getInstance();
  3629. data.markRead([id], true);
  3630. this.data.isRead = true;
  3631. if (index > -1) root.folders.inbox.msgs[index].r = true;
  3632. }
  3633. if(root.selectedHeader !== null)
  3634. {
  3635. root.selectedHeader.style.background = (root.selectedHeader.data.isRead) ? 'transparent' : '#292929';
  3636. root.selectedHeader.style.fontWeight = (root.selectedHeader.data.isRead) ? 'normal' : 'bold';
  3637. root.selectedHeader.data.isSelected = false;
  3638. }
  3639. root.selectedHeader = this;
  3640. this.data.isSelected = true;
  3641. this.style.background = '#363636';
  3642. root.printMsg(this.data.msg);
  3643. root.setToolbar();
  3644. };
  3645. checkBox.data = {'id': msg.i, 'isChecked': false, 'cont': headerCont};
  3646. checkBox.onmousedown = function(){this.style.background = '#202020'};
  3647. checkBox.onmouseup = function()
  3648. {
  3649. var isChecked = this.data.isChecked, isRead = this.data.cont.data.isRead;
  3650. var index = root.selectedMsgs.ids.indexOf(this.data.id);
  3651. if(!isChecked)
  3652. {
  3653. if(index == -1)
  3654. {
  3655. root.selectedMsgs.ids.push(this.data.id);
  3656. root.selectedMsgs.headers.push(this.data.cont);
  3657. root.selectedMsgs.checkBoxes.push(this);
  3658. }
  3659. this.style.background = '#9f9f9f';
  3660. this.data.cont.style.background = '#363636';
  3661. this.data.cont.data.isSelected = true;
  3662. }
  3663. if(isChecked)
  3664. {
  3665. if(index > -1)
  3666. {
  3667. root.selectedMsgs.ids.splice(index, 1);
  3668. root.selectedMsgs.headers.splice(index, 1);
  3669. root.selectedMsgs.checkBoxes.splice(index, 1);
  3670. }
  3671. this.style.background = 'transparent';
  3672. this.data.cont.style.background = isRead ? 'transparent' : '#292929';
  3673. this.data.cont.data.isSelected = false;
  3674. }
  3675. this.data.isChecked = !isChecked;
  3676. if (root.selectedMsgs.ids != null)
  3677. {
  3678. var th = root.size(root.generatedHeaders), sh = root.selectedMsgs.ids.length;
  3679. selectAll.style.background = (sh < th) ? 'transparent': '#9f9f9f';
  3680. selectAll.data.isChecked = (sh == th);
  3681. }
  3682. root.selectedHeader = null;
  3683. root.resetMsgCont(1);
  3684. root.setToolbar();
  3685. };
  3686. checkBox.onclick = function(event)
  3687. {
  3688. root.preventDefaults(event);
  3689. };
  3690. return {'cont': headerCont, 'checkBox': checkBox};
  3691. },
  3692. populateHeaders: function()
  3693. {
  3694. try
  3695. {
  3696. switch(this.selectedFolder)
  3697. {
  3698. case 'trash': var arr = this.folders.trash[0].msgs.concat(this.folders.trash[1].msgs); break;
  3699. case 'draft':
  3700. var arr = [];
  3701. if (this.folders.draft != null || this.size(this.folders.draft) > 0)
  3702. for (var key in this.folders.draft)
  3703. {
  3704. var msg = this.folders.draft[key];
  3705. arr.push(msg);
  3706. };
  3707. break;
  3708. default: var arr = this.folders[this.selectedFolder].msgs;
  3709. }
  3710. var compare = function(a,b)
  3711. {
  3712. return (a.d < b.d) ? 1 : (a.d > b.d) ? -1 : 0;
  3713. };
  3714. arr = arr.sort(compare);
  3715. var create = this.create, text = this.text, cssStyles = this.css, root = this;
  3716. var headersCont = this.dom.middleBar.headersCont;
  3717. var headersSbc = this.dom.middleBar.scrollBar.cont;
  3718. headersSbc.zm_empty();
  3719. headersCont.zm_empty();
  3720. headersCont.style.top = 0;
  3721. this.selectedHeader = null;
  3722. this.selectedMsgs.ids = [];
  3723. this.selectedMsgs.headers = [];
  3724. this.selectedMsgs.checkBoxes = [];
  3725. this.generatedHeaders = {};
  3726. this.resetMsgCont(1);
  3727. this.setToolbar();
  3728. if(arr == null) return;
  3729. var Min = this.selectedPage * 30, Max = (this.selectedPage + 1) * 30, pages = Math.ceil(arr.length / 30);
  3730. for(var i = Min; i < Math.min(Max, arr.length); i++)
  3731. {
  3732. var msg = arr[i];
  3733. var header = this.createHeader(msg);
  3734. headersCont.appendChild(header.cont);
  3735. root.generatedHeaders[msg.i] = {
  3736. 'cont': header.cont,
  3737. 'checkBox': header.checkBox,
  3738. 'msg': msg
  3739. };
  3740. }
  3741. var selectAll = this.dom.middleBar.footer.selectAll;
  3742. var ind = this.dom.middleBar.footer.indicator;
  3743. var controlCont = this.dom.middleBar.footer.controlCont;
  3744. var pagesCount = this.dom.middleBar.footer.pagesCount;
  3745. selectAll.style.background = 'transparent';
  3746. selectAll.data.isChecked = false;
  3747. selectAll.style.display = (arr.length > 0) ? 'block' : 'none';
  3748. if(arr.length > 30)
  3749. {
  3750. var width = 197 / pages;
  3751. controlCont.style.display = 'block';
  3752. ind.style.display = 'block';
  3753. ind.style.width = width + 'px';
  3754. ind.style.marginLeft = this.selectedPage * width + 'px';
  3755. var text = 'Page ' + (this.selectedPage + 1) + '/' + pages;
  3756. (pagesCount.innerText) ? pagesCount.innerText = text : pagesCount.textContent = text;
  3757. }
  3758. if (arr.length < 30)
  3759. {
  3760. ind.style.display = 'none';
  3761. controlCont.style.display = 'none';
  3762. (pagesCount.innerText) ? pagesCount.innerText = '' : pagesCount.textContent = '';
  3763. }
  3764. if (arr.length * 30 > headersSbc.offsetHeight)
  3765. {
  3766. headersSbc.zm_empty();
  3767. var sb = create('div', cssStyles.middleBar.scrollBar.bar);
  3768. this.dom.middleBar.scrollBar.bar = sb;
  3769. headersSbc.appendChild(sb);
  3770. this.enableScroll(sb, headersSbc, headersCont);
  3771. var div = document.getElementById('zdoom_mail_container');
  3772. if (!div) sb.style.height = 421 * 401 / (Math.min(arr.length, 30) * 60) + 'px';
  3773. }
  3774. }
  3775. catch(e)
  3776. {
  3777. console.log('zmail: ' + e.toString());
  3778. }
  3779. },
  3780. findContact: function(txt)
  3781. {
  3782. var players = zmail.data.getInstance().players;
  3783. var root = this;
  3784. var resultsCont = this.dom.rightBar.contacts.contentsCont;
  3785. var cont = this.dom.rightBar.contacts.results;
  3786. var scrollbarCont = this.dom.rightBar.contacts.scrollbarCont;
  3787. var searchBox = this.dom.rightBar.contacts.search;
  3788. var lowerCont = this.dom.rightBar.contacts.lowerCont;
  3789. var saveGroup = this.dom.rightBar.contacts.buttons.saveGroup;
  3790. var arr = [];
  3791. var str = txt.replace(/[^a-zA-Z0-9\-_]/g, '').toLowerCase();
  3792. if (str == '')
  3793. {
  3794. cont.style.display = 'none';
  3795. lowerCont.style.display = 'none';
  3796. saveGroup.style.display = 'block';
  3797. return;
  3798. }
  3799. else
  3800. {
  3801. for(var i = 0; i < players.length; i++)
  3802. {
  3803. if (players[i].pn.toLowerCase().substr(0,str.length) == str) arr.push(players[i]);
  3804. if (arr.length >= 20) break;
  3805. }
  3806. if (arr.length == 0)
  3807. {
  3808. cont.style.display = 'none';
  3809. lowerCont.style.display = 'none';
  3810. saveGroup.style.display = 'block';
  3811. return;
  3812. }
  3813. }
  3814. var activate = function()
  3815. {
  3816. root.changeContactSelection.apply(root, arguments);
  3817. };
  3818. var items = [];
  3819. resultsCont.zm_empty();
  3820. scrollbarCont.zm_empty();
  3821. searchBox.data.selectedIndex = 0;
  3822. searchBox.data.isContOpen = true;
  3823. searchBox.data.selectedGroup = 'results';
  3824. for(var i = 0; i < arr.length; i++)
  3825. {
  3826. var style = (i == 0) ? 'contSelected' : 'cont';
  3827. var Item = this.create('div', this.css.compose.leftBar.recipients.searchBox.item[style]);
  3828. var player = this.create('p', this.css.compose.leftBar.recipients.searchBox.item.text);
  3829. var alliance = this.create('p', this.css.compose.leftBar.recipients.searchBox.item.text);
  3830. this.text(player, arr[i].pn);
  3831. this.text(alliance, arr[i].an);
  3832. Item.zm_append([player, alliance]);
  3833. Item.data = {'id': arr[i].p, 'index': i};
  3834. Item.onclick = function()
  3835. {
  3836. activate(this.data.index);
  3837. };
  3838. resultsCont.appendChild(Item);
  3839. items.push(Item);
  3840. }
  3841. this.setContactOptions(arr[0].p);
  3842. lowerCont.style.display = 'block';
  3843. saveGroup.style.display = 'none';
  3844. cont.style.display = 'block';
  3845. cont.style.height = Math.min(145, arr.length * 49) + 'px';
  3846. cont.style.top = searchBox.offsetTop + 30 + 'px';
  3847. if(arr.length > 5)
  3848. {
  3849. var bar = this.create('div', this.css.rightBar.contacts.results.scrollbar.bar);
  3850. scrollbarCont.appendChild(bar);
  3851. this.enableScroll(bar, scrollbarCont, resultsCont);
  3852. }
  3853. searchBox.data.isContOpen = true;
  3854. searchBox.data.results = items;
  3855. },
  3856. changeContactSelection: function(mode)
  3857. {
  3858. var searchBox = this.dom.rightBar.contacts.search;
  3859. var mainCont = this.dom.rightBar.contacts.results;
  3860. var resultsSbc = this.dom.rightBar.contacts.scrollbarCont;
  3861. var resultsCont = this.dom.rightBar.contacts.contentsCont;
  3862. var index = searchBox.data.selectedIndex;
  3863. var results = searchBox.data.results;
  3864. var length = results.length;
  3865. var newIndex = (typeof mode === 'number') ? mode : (mode) ? (index + 1) % length : (index - 1 < 0) ? length - 1 : index - 1;
  3866. var currentItem = results[index];
  3867. var newItem = results[newIndex];
  3868. currentItem.zm_css(this.css.compose.leftBar.recipients.searchBox.item.cont);
  3869. newItem.zm_css(this.css.compose.leftBar.recipients.searchBox.item.contSelected);
  3870. newItem.onmouseout = null;
  3871. if (newIndex > 2 && length > 3)
  3872. {
  3873. var ch = resultsCont.offsetHeight, ph = resultsSbc.offsetHeight;
  3874. resultsCont.style.top = -(newIndex - 2) * 49 + 'px';
  3875. resultsSbc.firstChild.style.top = (((ph - 20) / ch) * (newIndex - 2) * 49) + 10 +'px';
  3876. }
  3877. if (newIndex < 3 && length > 3)
  3878. {
  3879. resultsCont.style.top = 0;
  3880. resultsSbc.firstChild.style.top = '10px';
  3881. }
  3882. searchBox.data.selectedIndex = newIndex;
  3883. this.setContactOptions(newItem.data.id);
  3884. },
  3885. setContactOptions: function(id)
  3886. {
  3887. var addToSelection = this.dom.rightBar.contacts.buttons.addToSelection;
  3888. var addAsFriend = this.dom.rightBar.contacts.buttons.addAsFriend;
  3889. var block = this.dom.rightBar.contacts.buttons.block;
  3890. var isFriend = this.contacts.friends.indexOf(id) > -1;
  3891. var isBlocked = this.contacts.blocked.indexOf(id) > -1;
  3892. var isSelected = this.selectedContacts.indexOf(id) > -1;
  3893. addToSelection.innerHTML = (isSelected) ? 'Remove' : 'Add to selection';
  3894. addToSelection.data.mode = (isSelected) ? 'remove' : 'add';
  3895. addAsFriend.innerHTML = (isFriend) ? 'Remove Friend' : 'Add Friend';
  3896. addAsFriend.data.mode = (isFriend) ? 'remove' : 'add';
  3897. block.innerHTML = (isBlocked) ? 'Unblock' : 'Block';
  3898. block.data.mode = (isBlocked) ? 'unblock' : 'block';
  3899. addAsFriend.data.id = id;
  3900. addToSelection.data.id = id;
  3901. block.data.id = id;
  3902. (isBlocked) ? addAsFriend.data.disable() : addAsFriend.data.enable();
  3903. (isFriend) ? block.data.disable() : block.data.enable();
  3904. },
  3905. addFriend: function(id)
  3906. {
  3907. if(this.contacts.friends.indexOf(id) == -1) this.contacts.friends.push(id);
  3908. this.dom.leftBar.contacts.friends.nodeValue = 'Friends ' + this.contacts.friends.length;
  3909. if(this.selectedGroup == 'friends') this.populateContacts();
  3910. this.storage.save.call(this);
  3911. },
  3912. blockContact: function(id)
  3913. {
  3914. if(this.contacts.blocked.indexOf(id) == -1) this.contacts.blocked.push(id);
  3915. this.dom.leftBar.contacts.blocked.nodeValue = 'Blocked ' + this.contacts.blocked.length;
  3916. if(this.selectedGroup == 'blocked') this.populateContacts();
  3917. this.storage.save.call(this);
  3918. },
  3919. removeFriend: function(id)
  3920. {
  3921. if(this.contacts.friends.indexOf(id) > -1) this.contacts.friends.splice(this.contacts.friends.indexOf(id), 1);
  3922. this.dom.leftBar.contacts.friends.nodeValue = 'Friends ' + (this.contacts.friends.length || '');
  3923. if(this.selectedGroup == 'friends') this.populateContacts();
  3924. this.storage.save.call(this);
  3925. },
  3926. unblockContact: function(id)
  3927. {
  3928. if(this.contacts.blocked.indexOf(id) > -1) this.contacts.blocked.splice(this.contacts.blocked.indexOf(id), 1);
  3929. this.dom.leftBar.contacts.blocked.nodeValue = 'Blocked ' + (this.contacts.blocked.length || '');
  3930. if(this.selectedGroup == 'blocked') this.populateContacts();
  3931. this.storage.save.call(this);
  3932. },
  3933. addToSelection: function(id)
  3934. {
  3935. if(this.selectedContacts.indexOf(id) == -1)
  3936. {
  3937. this.selectedContacts.push(id);
  3938. this.addSelectedContacts();
  3939. }
  3940. },
  3941. removeFromSelection: function(id)
  3942. {
  3943. if(this.selectedContacts.indexOf(id) > -1)
  3944. {
  3945. this.selectedContacts.splice(this.selectedContacts.indexOf(id) , 1);
  3946. this.addSelectedContacts();
  3947. }
  3948. },
  3949. removeAllSelectedContacts: function()
  3950. {
  3951. var arr = this.selectedContacts, headers = this.generatedHeaders, group = this.selectedGroup;
  3952. var selectAll = this.dom.middleBar.footer.selectAll;
  3953. for (var id in headers)
  3954. {
  3955. headers[id].checkBox.style.background = 'transparent';
  3956. headers[id].cont.style.background = 'transparent';
  3957. headers[id].cont.data.isSelected = false;
  3958. };
  3959. selectAll.style.background = 'transparent';
  3960. selectAll.data.isChecked = false;
  3961. this.selectedContacts = [];
  3962. this.addSelectedContacts();
  3963. },
  3964. saveNewGroup: function()
  3965. {
  3966. var create = this.create, text = this.text, css = this.css.confirm, root = this;
  3967. var rootCont = this.dom.window.main;
  3968. var groupsTxt = this.dom.leftBar.contacts.groups;
  3969. var contacts = this.selectedContacts.map(function(x){return {'id': x, 'name': root.getPlayerNameById(x)}});
  3970. var wrapper = create('div', css.wrapper);
  3971. var cont = create('div', css.cont);
  3972. var title = create('p', css.subCont);
  3973. var input = create('textField', css.input);
  3974. var btnsCont = create('div', css.subCont);
  3975. var saveBtn = create('div', css.button);
  3976. var cancelBtn = create('div', css.button);
  3977. text(title, 'Type the name of the new group:');
  3978. text(saveBtn, 'Save');
  3979. text(cancelBtn, 'Cancel');
  3980. btnsCont.zm_append([saveBtn, cancelBtn]);
  3981. cont.zm_append([title, input, btnsCont]);
  3982. title.style.textAlign = 'left';
  3983. var removeCont = function()
  3984. {
  3985. rootCont.removeChild(wrapper);
  3986. rootCont.removeChild(cont);
  3987. };
  3988. saveBtn.onclick = function()
  3989. {
  3990. var name = input.value;
  3991. root.contacts.groups[name] = contacts;
  3992. root.storage.save.call(root);
  3993. groupsTxt.nodeValue = 'Groups ' + (root.size(root.contacts.groups) || '');
  3994. removeCont();
  3995. };
  3996. cancelBtn.onclick = removeCont;
  3997. rootCont.appendChild(wrapper);
  3998. rootCont.appendChild(cont);
  3999. },
  4000. saveExistedGroup: function()
  4001. {
  4002. var create = this.create, text = this.text, css = this.css.confirm, root = this;
  4003. var rootCont = this.dom.window.main;
  4004. var groupsTxt = this.dom.leftBar.contacts.groups;
  4005. var contacts = this.selectedContacts.map(function(x){return {'id': x, 'name': root.getPlayerNameById(x)}});
  4006. var wrapper = create('div', css.wrapper);
  4007. var cont = create('div', css.cont);
  4008. var subCont = create('div', css.subCont);
  4009. var selectBox = create('div', css.select);
  4010. var selectList = create('span', css.list.cont);
  4011. var selectUl = create('ul', css.list.ul);
  4012. var saveBtn = create('div', css.button);
  4013. var cancelBtn = create('div', css.button);
  4014. text(saveBtn, 'Update');
  4015. text(cancelBtn, 'Cancel');
  4016. selectBox.innerHTML = '+ Select a group';
  4017. selectBox.data = {'name': null};
  4018. selectList.data = {'isOpen': false, 'isFocused': false};
  4019. saveBtn.style.width = '85px';
  4020. cancelBtn.style.width = '85px';
  4021. cancelBtn.style.margin = 0;
  4022. for (var group in this.contacts.groups)
  4023. {
  4024. var li = create('li', css.list.li);
  4025. li.data = {'name': group};
  4026. text(li, group);
  4027. li.onclick = function()
  4028. {
  4029. selectBox.innerHTML = '+ ' + this.data.name;
  4030. selectBox.data.name = this.data.name;
  4031. selectList.style.display = 'none';
  4032. selectList.data.isOpen = false;
  4033. };
  4034. li.addEventListener('mouseover', function(){selectList.data.isOpen = true}, false);
  4035. selectUl.appendChild(li);
  4036. }
  4037. selectList.appendChild(selectUl);
  4038. selectBox.appendChild(selectList);
  4039. subCont.zm_append([selectBox, saveBtn, cancelBtn]);
  4040. cont.zm_append([subCont]);
  4041. selectList.addEventListener('mouseout', function()
  4042. {
  4043. this.data.isFocused = false;
  4044. setTimeout(function()
  4045. {
  4046. var isOpen = selectList.data.isOpen, isFocused = selectList.data.isFocused;
  4047. if (isOpen && !isFocused)
  4048. {
  4049. selectList.style.display = 'none';
  4050. selectList.data.isOpen = false;
  4051. }
  4052. });
  4053. }, false);
  4054. selectBox.onclick = function()
  4055. {
  4056. var isOpen = selectList.data.isOpen;
  4057. selectList.style.display = (isOpen) ? 'none' : 'block';
  4058. };
  4059. var removeCont = function()
  4060. {
  4061. rootCont.removeChild(wrapper);
  4062. rootCont.removeChild(cont);
  4063. };
  4064. saveBtn.onclick = function()
  4065. {
  4066. var name = selectBox.data.name;
  4067. if (name != null)
  4068. {
  4069. root.contacts.groups[name] = contacts;
  4070. root.storage.save.call(root);
  4071. removeCont();
  4072. }
  4073. };
  4074. cancelBtn.onclick = removeCont;
  4075. rootCont.appendChild(wrapper);
  4076. rootCont.appendChild(cont);
  4077. },
  4078. addGroupToSelection: function()
  4079. {
  4080. var arr = this.selectedContacts, headers = this.generatedHeaders;
  4081. for (var id in headers)
  4082. {
  4083. if(arr.indexOf(parseInt(id, 10)) == -1) this.selectedContacts.push(parseInt(id, 10));
  4084. headers[id].checkBox.style.background = '#9f9f9f';
  4085. headers[id].cont.style.background = '#363636';
  4086. headers[id].cont.data.isSelected = true;
  4087. };
  4088. this.addSelectedContacts();
  4089. },
  4090. removeGroupFromSelection: function()
  4091. {
  4092. var arr = this.selectedContacts, headers = this.generatedHeaders;
  4093. for (var id in headers)
  4094. {
  4095. if(arr.indexOf(parseInt(id, 10)) > -1) this.selectedContacts.splice(this.selectedContacts.indexOf(parseInt(id, 10)), 1);
  4096. headers[id].checkBox.style.background = 'transparent';
  4097. headers[id].cont.style.background = 'transparent';
  4098. headers[id].cont.data.isSelected = false;
  4099. };
  4100. this.addSelectedContacts();
  4101. },
  4102. getPlayerNameById: function(id)
  4103. {
  4104. var data = zmail.data.getInstance();
  4105. var players = data.players;
  4106. var name;
  4107. for (var i = 0; i < players.length; i++) if (players[i].p == id) { name = players[i].pn; break; }
  4108. return name;
  4109. },
  4110. getPlayerDataById: function(id)
  4111. {
  4112. var data = zmail.data.getInstance();
  4113. var players = data.players;
  4114. var playerData;
  4115. for (var i = 0; i < players.length; i++) if (players[i].p == id) { playerData = players[i]; break; }
  4116. return playerData;
  4117. },
  4118. addSelectedContacts: function()
  4119. {
  4120. var cont = this.dom.rightBar.contacts.cont;
  4121. var header = this.dom.rightBar.contacts.header;
  4122. var contactsSb = this.dom.rightBar.contacts.bar;
  4123. var root = this, sc = this.selectedContacts;
  4124. var text = sc.length == 0 ? 'No contacts selected.' : sc.length + ' contacts selected';
  4125. (header.innerText) ? header.innerText = text : header.textContent = text;
  4126. cont.zm_empty();
  4127. for(var i = 0; i < this.selectedContacts.length; i++)
  4128. {
  4129. var id = this.selectedContacts[i], name = this.getPlayerNameById(id);
  4130. var Item = this.create('div', this.css.compose.leftBar.recipients.recipient.cont);
  4131. var remove = this.create('div', this.css.compose.leftBar.recipients.recipient.remove);
  4132. this.text(Item, name);
  4133. this.text(remove, 'X');
  4134. remove.data = {'id': id, 'parent': Item};
  4135. remove.onclick = function()
  4136. {
  4137. cont.removeChild(this.data.parent)
  4138. var pid = this.data.id, index = root.selectedContacts.indexOf(pid);
  4139. if(index > -1) root.selectedContacts.splice(index, 1);
  4140. };
  4141. Item.appendChild(remove);
  4142. cont.appendChild(Item)
  4143. }
  4144. if(this.selectedContacts.length > 0)
  4145. {
  4146. this.dom.rightBar.contacts.buttons.removeAll.data.enable();
  4147. this.dom.rightBar.contacts.buttons.message.data.enable();
  4148. this.dom.rightBar.contacts.buttons.saveGroup.data.enable();
  4149. }
  4150. else
  4151. {
  4152. this.dom.rightBar.contacts.buttons.removeAll.data.disable();
  4153. this.dom.rightBar.contacts.buttons.message.data.disable();
  4154. this.dom.rightBar.contacts.buttons.saveGroup.data.disable();
  4155. }
  4156. contactsSb.data.update();
  4157. contactsSb.data.scrollToEnd();
  4158. },
  4159. populateContacts: function()
  4160. {
  4161. try
  4162. {
  4163. var data = zmail.data.getInstance();
  4164. var create = this.create, text = this.text, cssStyles = this.css
  4165. var headersCont = this.dom.middleBar.headersCont;
  4166. var headersSbc = this.dom.middleBar.scrollBar.cont, root = this;
  4167. var selectAll = this.dom.middleBar.footer.selectAll;
  4168. var ind = this.dom.middleBar.footer.indicator;
  4169. var controlCont = this.dom.middleBar.footer.controlCont;
  4170. var pagesCount = this.dom.middleBar.footer.pagesCount;
  4171. var contactsSb = this.dom.rightBar.contacts.bar;
  4172. var isAllContactsSelected = true;
  4173. var group = this.selectedGroup;
  4174. (pagesCount.innerText) ? pagesCount.innerText = '' : pagesCount.textContent = '';
  4175. ind.style.display = 'none';
  4176. controlCont.style.display = 'none';
  4177. headersSbc.zm_empty();
  4178. headersCont.zm_empty();
  4179. headersCont.style.top = 0;
  4180. this.setToolbar();
  4181. this.resetMsgCont();
  4182. this.generatedHeaders = {};
  4183. this.dom.rightBar.msgCont.appendChild(this.dom.rightBar.contacts.main);
  4184. switch(group)
  4185. {
  4186. case 'friends':
  4187. var contacts = [];
  4188. this.contacts.friends.map(function(x)
  4189. {
  4190. var c = root.getPlayerDataById(x);
  4191. c.name = c.pn;
  4192. contacts.push(c);
  4193. });
  4194. break;
  4195. case 'blocked':
  4196. var contacts = [];
  4197. this.contacts.blocked.map(function(x)
  4198. {
  4199. var c = root.getPlayerDataById(x);
  4200. c.name = c.pn;
  4201. contacts.push(c);
  4202. });
  4203. break;
  4204. case 'alliance': var contacts = data.allianceMembers; break;
  4205. case 'commanders': var contacts = data.allianceCommanders; break;
  4206. case 'officers': var contacts = data.allianceOfficers; break;
  4207. case 'groups': var contacts = root.contacts.groups; break;
  4208. case 'allies':
  4209. var contacts = {}, allies = data.allies;
  4210. for (var x in allies)
  4211. {
  4212. contacts[x] = allies[x].map(function(a){return{'id': a.i, 'name': a.n}});
  4213. }
  4214. break;
  4215. default: var contacts = false;
  4216. }
  4217. var compareRank = function(a,b)
  4218. {
  4219. return (a.roleId > b.roleId) ? 1 : (a.roleId < b.roleId) ? -1 : 0;
  4220. };
  4221. var compareName = function(a,b)
  4222. {
  4223. return (a.name.toLowerCase() > b.name.toLowerCase()) ? 1 : (a.name.toLowerCase() < b.name.toLowerCase()) ? -1 : 0;
  4224. };
  4225. if ((group == 'alliance')||(group == 'commanders')) contacts.sort(compareRank);
  4226. else if ((group == 'firends')||(group == 'blocked')) contacts.sort(compareName);
  4227. else contacts = contacts;
  4228. if ((contacts)&&(group != 'allies')&&(group != 'groups'))
  4229. {
  4230. for (var i = 0; i < contacts.length; i++)
  4231. {
  4232. var contact = contacts[i];
  4233. var id = contact.p || contact.id;
  4234. var playerName = contact.pn || contact.name;
  4235. var contactCont = create('div', cssStyles.header.cont);
  4236. var name = create('a', cssStyles.header.sender);
  4237. var rank = create('p', cssStyles.header.subject);
  4238. var checkBox = create('div', cssStyles.header.checkBox);
  4239. var span = create('span', cssStyles.header.span);
  4240. contactCont.data = {'id': id, 'name': playerName, 'isSelected': false, 'checkBox': checkBox};
  4241. if (this.selectedContacts.indexOf(id) > -1)
  4242. {
  4243. checkBox.style.background = '#9f9f9f';
  4244. contactCont.style.background = '#363636';
  4245. contactCont.data.isSelected = true;
  4246. }
  4247. else isAllContactsSelected = false;
  4248. text(name, playerName);
  4249. text(rank, (contact.an || contact.role) || '');
  4250. name.data = {'name': playerName};
  4251. name.onclick = function(event)
  4252. {
  4253. root.preventDefaults(event);
  4254. webfrontend.gui.util.BBCode.openPlayerProfile(this.data.name);
  4255. };
  4256. name.onmousedown = function(event){root.preventDefaults(event)};
  4257. name.onmouseup = function(event){root.preventDefaults(event)};
  4258. span.appendChild(checkBox);
  4259. contactCont.zm_append([span, name, rank]);
  4260. contactCont.onmouseover = function(){if (!this.data.isSelected) this.style.background = '#363636'};
  4261. contactCont.onmouseout = function(){if (!this.data.isSelected) this.style.background = 'transparent'};
  4262. contactCont.onmousedown = function(){this.data.checkBox.style.background = '#202020'};
  4263. contactCont.onclick = function()
  4264. {
  4265. var index = root.selectedContacts.indexOf(this.data.id);
  4266. var isSelected = this.data.isSelected;
  4267. if(isSelected)
  4268. {
  4269. this.data.checkBox.style.background = 'transparent';
  4270. this.style.background = 'transparent';
  4271. if (index > -1) root.selectedContacts.splice(index, 1);
  4272. }
  4273. else
  4274. {
  4275. this.data.checkBox.style.background = '#9f9f9f';
  4276. this.style.background = '#363636';
  4277. if (index == -1) root.selectedContacts.push(this.data.id);
  4278. }
  4279. this.data.isSelected = !isSelected;
  4280. root.addSelectedContacts();
  4281. var th = root.size(root.generatedHeaders), sh = root.selectedContacts.length;
  4282. selectAll.style.background = (sh == th) ? '#9f9f9f' : 'transparent';
  4283. selectAll.data.isChecked = (sh == th);
  4284. };
  4285. if ((group == 'friends')||(group == 'blocked'))
  4286. {
  4287. var remove = create('div', cssStyles.notification.remove);
  4288. remove.innerHTML = 'X';
  4289. remove.data = {'isFocused': false, 'cont': contactCont, 'id': id};
  4290. remove.onmousedown = function(event){root.preventDefaults(event)};
  4291. remove.onmouseup = function(event){root.preventDefaults(event)};
  4292. remove.onclick = function(event)
  4293. {
  4294. root.preventDefaults(event);
  4295. var cont = this.data.cont, id = this.data.id, index = root.contacts[group].indexOf(id);
  4296. var txt = (group == 'friends') ? 'Friends ' : 'Blocked ';
  4297. if (index > -1)
  4298. {
  4299. root.contacts[group].splice(index, 1);
  4300. delete root.generatedHeaders[id];
  4301. headersCont.removeChild(cont);
  4302. root.dom.leftBar.contacts[group].nodeValue = txt + (root.contacts[group].length || '');
  4303. root.storage.save.call(root);
  4304. }
  4305. }
  4306. contactCont.appendChild(remove);
  4307. contactCont.data.remove = remove;
  4308. remove.style.display = 'none';
  4309. contactCont.addEventListener('mouseover', function()
  4310. {
  4311. this.data.remove.data.isFocused = true;
  4312. this.data.remove.style.display = 'block';
  4313. }, false);
  4314. contactCont.addEventListener('mouseout', function()
  4315. {
  4316. var remove = this.data.remove;
  4317. remove.data.isFocused = false;
  4318. setTimeout(function(){if (!remove.data.isFocused) remove.style.display = 'none'}, 10);
  4319. }, false);
  4320. }
  4321. headersCont.appendChild(contactCont);
  4322. root.generatedHeaders[id] = {'cont': contactCont, 'checkBox': checkBox, 'name': playerName};
  4323. }
  4324. selectAll.style.display = (contacts.length > 0) ? 'block' : 'none';
  4325. selectAll.style.background = (isAllContactsSelected && contacts.length > 0) ? '#9f9f9f' : 'transparent';
  4326. selectAll.data.isChecked = (isAllContactsSelected && contacts.length > 0);
  4327. if (contacts.length * 60 > headersSbc.offsetHeight)
  4328. {
  4329. var sb = create('div', cssStyles.middleBar.scrollBar.bar);
  4330. headersSbc.appendChild(sb);
  4331. this.enableScroll(sb, headersSbc, headersCont);
  4332. }
  4333. contactsSb.data.update();
  4334. }
  4335. else if ((contacts)&&((group == 'allies')||(group == 'groups')))
  4336. {
  4337. for (var x in contacts)
  4338. {
  4339. var AllyName = x;
  4340. var AllyMembers = contacts[x];
  4341. var contactCont = create('div', cssStyles.header.cont);
  4342. var name = create('a', cssStyles.header.sender);
  4343. var count = create('p', cssStyles.header.subject);
  4344. var checkBox = create('div', cssStyles.header.checkBox);
  4345. var span = create('span', cssStyles.header.span);
  4346. text(name, AllyName);
  4347. text(count, AllyMembers.length + ' Members');
  4348. contactCont.data = {'am': AllyMembers, 'an': name, 'isSelected': false, 'checkBox': checkBox};
  4349. var isAllMembersSelected = true;
  4350. for (var member in AllyMembers)
  4351. {
  4352. if (this.selectedContacts.indexOf(AllyMembers[member].id) == -1)
  4353. {
  4354. isAllMembersSelected = false;
  4355. break;
  4356. }
  4357. }
  4358. if (isAllMembersSelected)
  4359. {
  4360. checkBox.style.background = '#9f9f9f';
  4361. contactCont.style.background = '#363636';
  4362. contactCont.data.isSelected = true;
  4363. }
  4364. name.data = {'name': AllyName};
  4365. name.onclick = function(event)
  4366. {
  4367. webfrontend.gui.util.BBCode.openAllianceProfile(this.data.name);
  4368. root.preventDefaults(event);
  4369. };
  4370. name.onmousedown = function(event){root.preventDefaults(event)};
  4371. name.onmouseup = function(event){root.preventDefaults(event)};
  4372. span.appendChild(checkBox);
  4373. contactCont.zm_append([span, name, count]);
  4374. contactCont.onmouseover = function(){if (!this.data.isSelected) this.style.background = '#363636'};
  4375. contactCont.onmouseout = function(){if (!this.data.isSelected) this.style.background = 'transparent'};
  4376. contactCont.onmousedown = function(){this.data.checkBox.style.background = '#202020'};
  4377. contactCont.onclick = function()
  4378. {
  4379. var isSelected = this.data.isSelected;
  4380. if(isSelected)
  4381. {
  4382. this.data.checkBox.style.background = 'transparent';
  4383. this.style.background = 'transparent';
  4384. for (var member in this.data.am)
  4385. {
  4386. var id = this.data.am[member].id;
  4387. var index = root.selectedContacts.indexOf(id);
  4388. if (index > -1) root.selectedContacts.splice(index, 1);
  4389. }
  4390. }
  4391. else
  4392. {
  4393. this.data.checkBox.style.background = '#9f9f9f';
  4394. this.style.background = '#363636';
  4395. for (var member in this.data.am)
  4396. {
  4397. var id = this.data.am[member].id;
  4398. var index = root.selectedContacts.indexOf(id);
  4399. if (index == -1) root.selectedContacts.push(id);
  4400. }
  4401. }
  4402. this.data.isSelected = !isSelected;
  4403. root.addSelectedContacts();
  4404. selectAll.style.display = 'none';
  4405. };
  4406. if ((group == 'groups'))
  4407. {
  4408. var remove = create('div', cssStyles.notification.remove);
  4409. remove.innerHTML = 'X';
  4410. remove.data = {'isFocused': false, 'cont': contactCont, 'name': AllyName};
  4411. remove.onmousedown = function(event){root.preventDefaults(event)};
  4412. remove.onmouseup = function(event){root.preventDefaults(event)};
  4413. remove.onclick = function(event)
  4414. {
  4415. root.preventDefaults(event);
  4416. var name = this.data.name, cont = this.data.cont;
  4417. delete root.contacts.groups[name];
  4418. delete root.generatedHeaders[name];
  4419. headersCont.removeChild(cont);
  4420. root.dom.leftBar.contacts.groups.nodeValue = 'Groups ' + (root.size(root.contacts.groups) || '');
  4421. root.storage.save.call(root);
  4422. }
  4423. contactCont.appendChild(remove);
  4424. remove.style.display = 'none';
  4425. contactCont.data.remove = remove;
  4426. contactCont.addEventListener('mouseover', function()
  4427. {
  4428. this.data.remove.style.display = 'block';
  4429. this.data.remove.data.isFocused = true;
  4430. }, false);
  4431. contactCont.addEventListener('mouseout', function()
  4432. {
  4433. var remove = this.data.remove;
  4434. remove.data.isFocused = false;
  4435. setTimeout(function(){if (!remove.data.isFocused) remove.style.display = 'none'}, 10);
  4436. }, false);
  4437. }
  4438. root.generatedHeaders[AllyName] = {'cont': contactCont, 'checkBox': checkBox, 'name': AllyName};
  4439. headersCont.appendChild(contactCont);
  4440. }
  4441. selectAll.style.display = 'none';
  4442. if ((root.size(contacts) * 60) > headersSbc.offsetHeight)
  4443. {
  4444. var sb = create('div', cssStyles.middleBar.scrollBar.bar);
  4445. headersSbc.appendChild(sb);
  4446. this.enableScroll(sb, headersSbc, headersCont);
  4447. }
  4448. contactsSb.data.update();
  4449. }
  4450. else selectAll.style.display = 'none';
  4451. }
  4452. catch(e)
  4453. {
  4454. console.log('zmail: ' + e.toString());
  4455. }
  4456. },
  4457. dom: {
  4458. 'window':
  4459. {
  4460. 'main': null,
  4461. 'compose': null
  4462. },
  4463. 'leftBar':
  4464. {
  4465. 'folders':
  4466. {
  4467. 'inbox': null,
  4468. 'outbox': null,
  4469. 'draft': null,
  4470. 'junk': null,
  4471. 'trash': null
  4472. },
  4473. 'items': {
  4474. 'inbox': null,
  4475. 'outbox': null,
  4476. 'draft': null,
  4477. 'junk': null,
  4478. 'trash': null,
  4479. 'documents': null,
  4480. 'alliance': null,
  4481. 'commanders': null,
  4482. 'officers': null,
  4483. 'allies': null,
  4484. 'groups': null,
  4485. 'friends': null,
  4486. 'blocked': null
  4487. },
  4488. 'contacts':
  4489. {
  4490. 'alliance': null,
  4491. 'commanders': null,
  4492. 'officers': null,
  4493. 'allies': null,
  4494. 'groups': null,
  4495. 'friends': null,
  4496. 'blocked': null
  4497. },
  4498. 'searchBox': null
  4499. },
  4500. 'rightBar':
  4501. {
  4502. 'cont': null,
  4503. 'msgCont': null,
  4504. 'expandCont': null,
  4505. 'scrollBar':
  4506. {
  4507. 'cont': null,
  4508. 'bar': null
  4509. },
  4510. 'contacts':
  4511. {
  4512. 'main': null,
  4513. 'lowerCont': null,
  4514. 'header': null,
  4515. 'cont': null,
  4516. 'bar': null,
  4517. 'search': null,
  4518. 'results': null,
  4519. 'contentsCont': null,
  4520. 'scrollbarCont': null,
  4521. 'buttons':
  4522. {
  4523. 'removeAll': null,
  4524. 'message': null,
  4525. 'addToSelection': null,
  4526. 'addAsFriend': null,
  4527. 'block': null,
  4528. 'saveGroup': null
  4529. }
  4530. }
  4531. },
  4532. 'middleBar':
  4533. {
  4534. 'headersCont': null,
  4535. 'scrollBar':
  4536. {
  4537. 'cont': null,
  4538. 'bar': null
  4539. },
  4540. 'footer':
  4541. {
  4542. 'selectAll': null,
  4543. 'pagesCount': null,
  4544. 'indicator': null,
  4545. 'controlCont': null
  4546. }
  4547. },
  4548. 'topBar':
  4549. {
  4550. 'logo': null,
  4551. 'menu': null,
  4552. 'toolbar':
  4553. {
  4554. 'newMsg': null,
  4555. 'reply': null,
  4556. 'trash': null,
  4557. 'delMsg': null,
  4558. 'junk': null,
  4559. 'notJunk': null,
  4560. 'restore': null,
  4561. 'mark': null,
  4562. 'empty': null,
  4563. 'editDraft': null,
  4564. 'deleteDraft': null,
  4565. 'toDocuments': null,
  4566. 'notDocument': null,
  4567. 'forwardMsg': null
  4568. }
  4569. },
  4570. 'toolBar':
  4571. {
  4572. 'delete': null,
  4573. 'moveToTrash': null,
  4574. 'moveToJunk': null,
  4575. 'moveToInbox': null,
  4576. 'moveToOutbox': null,
  4577. 'compose': null
  4578. },
  4579. 'searchResults':
  4580. {
  4581. 'cont': null,
  4582. 'sender':
  4583. {
  4584. 'count': null,
  4585. 'list': null
  4586. },
  4587. 'subject':
  4588. {
  4589. 'count': null,
  4590. 'list': null
  4591. }
  4592. },
  4593. 'compose':
  4594. {
  4595. 'leftBar':
  4596. {
  4597. 'recipientsMainCont': null,
  4598. 'recipientsCont': null,
  4599. 'recipientsSbc': null,
  4600. 'recipientsSb': null,
  4601. 'searchBox': null,
  4602. 'searchBoxCont': null,
  4603. 'contactsCont': null,
  4604. 'results':
  4605. {
  4606. 'mainCont': null,
  4607. 'scrollbarCont': null,
  4608. 'resultsCont': null
  4609. }
  4610. },
  4611. 'rightBar':
  4612. {
  4613. 'iframe': null,
  4614. 'subject': null,
  4615. 'msgCont': null,
  4616. 'charCount': null,
  4617. 'msgSb': null
  4618. }
  4619. }
  4620. },
  4621. css:
  4622. {
  4623. 'window':
  4624. {
  4625. 'background': '#292929',
  4626. 'width': '100%',
  4627. 'height': '471px',
  4628. 'paddingTop': '69px',
  4629. 'position': 'relative',
  4630. 'fontFamily': 'vrinda',
  4631. 'display': 'table'
  4632. },
  4633. 'topBar':
  4634. {
  4635. 'main':
  4636. {
  4637. 'width': '100%',
  4638. 'position': 'absolute',
  4639. 'top': 0,
  4640. 'left': 0
  4641. },
  4642. 'cont':
  4643. {
  4644. 'backgroundImage': null,
  4645. 'height': '68px',
  4646. 'borderBottom': '1px solid rgba(0,0,0,0.56)',
  4647. 'width': '100%'
  4648. },
  4649. 'logo':
  4650. {
  4651. 'width': '126px',
  4652. 'height': '24px',
  4653. 'display': 'inline-block',
  4654. 'verticalAlign': 'top',
  4655. 'padding': '22px 0',
  4656. 'textAlign': 'center',
  4657. 'fontSize': '18px',
  4658. 'fontWeight': 'bold',
  4659. 'color': '#cacaca'
  4660. },
  4661. 'menu':
  4662. {
  4663. 'display': 'inline-block',
  4664. 'verticalAlign': 'top',
  4665. 'height': '68px'
  4666. }
  4667. },
  4668. 'leftBar':
  4669. {
  4670. 'background': '#3a3b3b',
  4671. 'minWidth': '126px',
  4672. 'height': '471px',
  4673. 'display': 'table-cell',
  4674. 'verticalAlign': 'top',
  4675. 'position': 'relative'
  4676. },
  4677. 'rightBar':
  4678. {
  4679. 'main':
  4680. {
  4681. 'height': '471px',
  4682. 'display': 'table-cell',
  4683. 'verticalAlign': 'top',
  4684. 'width': '100%',
  4685. 'position': 'relative'
  4686. },
  4687. 'msgMask':
  4688. {
  4689. 'overflow': 'hidden',
  4690. 'position': 'relative',
  4691. 'height': '471px'
  4692. },
  4693. 'msgCont':
  4694. {
  4695. 'width': '394px',
  4696. 'position': 'absolute',
  4697. 'top': 0,
  4698. 'padding': '0 30px 0 20px',
  4699. 'overflow': 'hidden',
  4700. 'width': '100%',
  4701. 'boxSizing': 'border-box',
  4702. 'MozBoxSizing': 'border-box',
  4703. 'wordWrap': 'break-word',
  4704. 'lineHeight': '18px'
  4705. },
  4706. 'scrollBar':
  4707. {
  4708. 'cont':
  4709. {
  4710. 'width': '16px',
  4711. 'position': 'absolute',
  4712. 'background': '#333333',
  4713. 'height': '471px',
  4714. 'top': 0,
  4715. 'right': 0
  4716. },
  4717. 'bar':
  4718. {
  4719. 'width': '16px',
  4720. 'background': '#3b3b3b',
  4721. 'position': 'absolute',
  4722. 'top': '10px',
  4723. 'over': {'background': '#424242'},
  4724. 'out': {'background': '#3b3b3b'},
  4725. 'down': {'background': '#707070'},
  4726. 'up': {'background': '#3d3d3d'},
  4727. 'pointer': 'cursor'
  4728. }
  4729. },
  4730. 'contacts':
  4731. {
  4732. 'topWrapper':
  4733. {
  4734. 'width': '100%',
  4735. 'paddingBottom': '5px',
  4736. 'borderBottom': '1px solid #434343'
  4737. },
  4738. 'bottomWrapper':
  4739. {
  4740. 'marginLeft': '200px',
  4741. 'width': 'auto',
  4742. 'paddingTop': '33px',
  4743. 'height': '125px'
  4744. },
  4745. 'main':
  4746. {
  4747. 'width': 'auto',
  4748. 'height': '193px',
  4749. 'border': '1px solid #1f1f1f',
  4750. 'background': '#323232',
  4751. 'position': 'relative',
  4752. 'margin': '5px 0 5px 0'
  4753. },
  4754. 'mask':
  4755. {
  4756. 'height': '100%',
  4757. 'position': 'relative',
  4758. 'overflow': 'hidden'
  4759. },
  4760. 'scrollbar':
  4761. {
  4762. 'cont':
  4763. {
  4764. 'position': 'absolute',
  4765. 'top': 0,
  4766. 'right': 0,
  4767. 'width': '16px',
  4768. 'height': '100%',
  4769. 'overflow': 'hidden',
  4770. 'background': '#363636'
  4771. },
  4772. 'bar':
  4773. {
  4774. 'position': 'absolute',
  4775. 'top': '10px',
  4776. 'left': 0,
  4777. 'width': '16px',
  4778. 'background': '#3d3d3d'
  4779. }
  4780. },
  4781. 'cont':
  4782. {
  4783. 'position': 'absolute',
  4784. 'width': '100%',
  4785. 'padding': '5px 21px 0 5px',
  4786. 'boxSizing': 'border-box',
  4787. 'MozBoxSizing': 'border-box',
  4788. 'lineHeight': '10px'
  4789. },
  4790. 'search':
  4791. {
  4792. 'width': '188px',
  4793. 'border': '1px solid #1f1f1f',
  4794. 'background': '#323232',
  4795. 'color': '#6c6d6d',
  4796. 'fontSize': '12px',
  4797. 'marginRight': '5px',
  4798. 'paddingLeft': '10px',
  4799. 'outline': 'none',
  4800. 'focus': {'outline': 'none'},
  4801. 'blur': {'outline': 'none'},
  4802. 'height': '25px',
  4803. 'lineHeigt': '25px',
  4804. 'display': 'inline-block',
  4805. 'verticalAlign': 'top'
  4806. },
  4807. 'results':
  4808. {
  4809. 'cont':
  4810. {
  4811. 'position': 'absolute',
  4812. 'width': '198px',
  4813. 'left': '20px',
  4814. 'border': '1px solid #1f1f1f',
  4815. 'background': '#323232',
  4816. 'display': 'none',
  4817. 'maxHeight': '145px'
  4818. },
  4819. 'mask':
  4820. {
  4821. 'position': 'relative',
  4822. 'top': 0,
  4823. 'left': 0,
  4824. 'width': '186px',
  4825. 'height': '100%',
  4826. 'overflow': 'hidden'
  4827. },
  4828. 'contentsCont':
  4829. {
  4830. 'position': 'relative',
  4831. 'width': '100%'
  4832. },
  4833. 'scrollbar':
  4834. {
  4835. 'cont':
  4836. {
  4837. 'position': 'absolute',
  4838. 'top': 0,
  4839. 'right': 0,
  4840. 'width': '16px',
  4841. 'height': '100%',
  4842. 'background': '#363636'
  4843. },
  4844. 'bar':
  4845. {
  4846. 'position': 'absolute',
  4847. 'top': '10px',
  4848. 'background': '#3d3d3d',
  4849. 'width': '16px',
  4850. 'over': {'background': '#424242'},
  4851. 'out': {'background': '#3d3d3d'},
  4852. 'down': {'background': '#707070'},
  4853. 'up': {'background': '#3d3d3d'}
  4854. }
  4855. }
  4856. },
  4857. 'button':
  4858. {
  4859. 'active':
  4860. {
  4861. 'height': '25px',
  4862. 'textAlign': 'center',
  4863. 'background': '#4e4e4e',
  4864. 'color': '#8b8b8b',
  4865. 'fontSize': '12px',
  4866. 'lineHeight': '25px',
  4867. 'over': {'background': '#266589', 'color': '#c2c2c2'},
  4868. 'out': {'background': '#4e4e4e', 'color': '#8b8b8b'},
  4869. 'cursor': 'pointer',
  4870. 'marginTop': '1px'
  4871. },
  4872. 'disabled':
  4873. {
  4874. 'height': '25px',
  4875. 'textAlign': 'center',
  4876. 'background': '#3f3f3f',
  4877. 'color': '#8b8b8b',
  4878. 'fontSize': '12px',
  4879. 'lineHeight': '25px',
  4880. 'over': {'background': '#3f3f3f', 'color': '#8b8b8b'},
  4881. 'out': {'background': '#3f3f3f', 'color': '#8b8b8b'},
  4882. 'cursor': 'default',
  4883. 'marginTop': '1px'
  4884. }
  4885. },
  4886. 'saveButton':
  4887. {
  4888. 'cont':
  4889. {
  4890. 'disabled':
  4891. {
  4892. 'position': 'absolute',
  4893. 'bottom': '15px',
  4894. 'right': '30px',
  4895. 'height': '25px',
  4896. 'width': '100px',
  4897. 'textAlign': 'center',
  4898. 'background': '#3f3f3f',
  4899. 'color': '#8b8b8b',
  4900. 'fontSize': '12px',
  4901. 'lineHeight': '25px',
  4902. 'over': {'background': '#3f3f3f', 'color': '#8b8b8b'},
  4903. 'out': {'background': '#3f3f3f', 'color': '#8b8b8b'},
  4904. 'cursor': 'default'
  4905. }
  4906. },
  4907. 'span':
  4908. {
  4909. 'position': 'absolute',
  4910. 'bottom': '25px',
  4911. 'left': 0,
  4912. 'border': '2px solid #266589',
  4913. 'border-bottom': 'none',
  4914. 'width': '100%',
  4915. 'height': '52px',
  4916. 'boxSizing': 'border-box',
  4917. 'MozBoxSizing': 'border-box',
  4918. 'display': 'none'
  4919. },
  4920. 'sub':
  4921. {
  4922. 'height': '25px',
  4923. 'width': '100%',
  4924. 'textAlign': 'center',
  4925. 'background': '#3f3f3f',
  4926. 'color': '#8b8b8b',
  4927. 'fontSize': '12px',
  4928. 'lineHeight': '25px',
  4929. 'over': {'background': '#4e4e4e', 'color': '#c2c2c2'},
  4930. 'out': {'background': '#3f3f3f', 'color': '#8b8b8b'},
  4931. 'cursor': 'pointer'
  4932. }
  4933. }
  4934. }
  4935. },
  4936. 'middleBar':
  4937. {
  4938. 'cont':
  4939. {
  4940. 'background': '#2e2e2e',
  4941. 'minWidth': '197px',
  4942. 'height': '471px',
  4943. 'display': 'table-cell',
  4944. 'verticalAlign': 'top',
  4945. 'position': 'relative'
  4946. },
  4947. 'headers':
  4948. {
  4949. 'mask':
  4950. {
  4951. 'width': '180px',
  4952. 'height': '422px',
  4953. 'display': 'inline-block',
  4954. 'verticalAlign': 'top',
  4955. 'overflow': 'hidden',
  4956. 'position': 'relative'
  4957. },
  4958. 'scroll':
  4959. {
  4960. 'position': 'absolute'
  4961. }
  4962. },
  4963. 'scrollBar':
  4964. {
  4965. 'cont':
  4966. {
  4967. 'width': '16px',
  4968. 'height': '421px',
  4969. 'top': 0,
  4970. 'right': 0,
  4971. 'background': '#333333',
  4972. 'borderRight': '1px solid rgba(0,0,0,0.2)',
  4973. 'position': 'absolute'
  4974. },
  4975. 'bar':
  4976. {
  4977. 'width': '16px',
  4978. 'background': '#3b3b3b',
  4979. 'position': 'absolute',
  4980. 'top': '10px',
  4981. 'over': {'background': '#424242'},
  4982. 'out': {'background': '#3b3b3b'},
  4983. 'down': {'background': '#707070'},
  4984. 'up': {'background': '#3d3d3d'},
  4985. 'pointer': 'cursor'
  4986. }
  4987. },
  4988. 'footer':
  4989. {
  4990. 'cont':
  4991. {
  4992. 'width': '197px',
  4993. 'background': '#424343',
  4994. 'borderRight': '1px solid rgba(0,0,0,0.3)',
  4995. 'height': '48px',
  4996. 'display': 'inline-block',
  4997. 'verticalAlign': 'top',
  4998. 'position': 'relative'
  4999. },
  5000. 'pagesBar':
  5001. {
  5002. 'width': '100%',
  5003. 'height': '2px',
  5004. 'background': '#377395'
  5005. },
  5006. 'indicator':
  5007. {
  5008. 'height': '2px',
  5009. 'background': '#898989'
  5010. },
  5011. 'selectAll':
  5012. {
  5013. 'checkBox':
  5014. {
  5015. 'border': '1px solid #5b5e5e',
  5016. 'width': '10px',
  5017. 'height': '10px',
  5018. 'margin': '10px 0 0 5px',
  5019. 'cursor': 'pointer'
  5020. },
  5021. 'span':
  5022. {
  5023. 'width': '20px',
  5024. 'height': '59px',
  5025. 'position': 'absolute',
  5026. 'left': '2px',
  5027. 'top': '2px'
  5028. }
  5029. },
  5030. 'pagesControls':
  5031. {
  5032. 'cont':
  5033. {
  5034. 'width': '85px',
  5035. 'height': '20px',
  5036. 'position': 'absolute',
  5037. 'right': '11px',
  5038. 'top': '10px'
  5039. },
  5040. 'label':
  5041. {
  5042. 'position': 'absolute',
  5043. 'left': '30px',
  5044. 'top': '10px',
  5045. 'padding': 0,
  5046. 'height': '20px',
  5047. 'lineHeight': '20px',
  5048. 'color': '#7f7f7f',
  5049. 'display': 'none',
  5050. 'fontSize': '12px'
  5051. },
  5052. 'icon':
  5053. {
  5054. 'width': '20px',
  5055. 'height': '20px',
  5056. 'backgroundPosition': 'center',
  5057. 'backgroundRepeat': 'no-repeat',
  5058. 'display': 'inline-block',
  5059. 'verticalAlign': 'top',
  5060. 'margin': 0,
  5061. 'padding': 0,
  5062. 'cursor': 'pointer'
  5063. }
  5064. }
  5065. }
  5066. },
  5067. 'tableCellWrapper':
  5068. {
  5069. 'position': 'relative',
  5070. 'display': 'block'
  5071. },
  5072. 'ul':
  5073. {
  5074. 'leftBar':
  5075. {
  5076. 'main':
  5077. {
  5078. 'width': 'inherit',
  5079. 'listStyleType': 'none',
  5080. 'padding': 0,
  5081. 'margin': '10px 0 0 0'
  5082. },
  5083. 'sub':
  5084. {
  5085. 'width': 'inherit',
  5086. 'listStyleType': 'none',
  5087. 'padding': 0,
  5088. 'margin': 0
  5089. }
  5090. },
  5091. 'toolbar':
  5092. {
  5093. 'main':
  5094. {
  5095. 'listStyleType': 'none',
  5096. 'margin': 0,
  5097. 'padding': 0,
  5098. 'height': '68px'
  5099. },
  5100. 'sub':
  5101. {
  5102. 'border': '3px solid #404144',
  5103. 'display': 'none',
  5104. 'borderTop': 'none',
  5105. 'background': '#266589',
  5106. 'listStyleType': 'none',
  5107. 'width': '100%',
  5108. 'margin': 0,
  5109. 'padding': 0,
  5110. 'position': 'absolute',
  5111. 'top': '69px',
  5112. 'left': '-3px',
  5113. 'zIndex': 1000
  5114. }
  5115. }
  5116. },
  5117. 'li':
  5118. {
  5119. 'leftBar':
  5120. {
  5121. 'main':
  5122. {
  5123. 'fontSize': '24px',
  5124. 'color': '#999999',
  5125. 'minHeight': '30px',
  5126. 'textIndent': '14px'
  5127. },
  5128. 'sub':
  5129. {
  5130. 'fontSize': '12px',
  5131. 'color': '#909090',
  5132. 'background': 'transparent',
  5133. 'height': '20px',
  5134. 'lineHeight': '20px',
  5135. 'textIndent': '30px',
  5136. 'cursor': 'pointer',
  5137. 'over':
  5138. {
  5139. 'background': '#545555',
  5140. 'color': '#aeaeae'
  5141. },
  5142. 'out':
  5143. {
  5144. 'background': 'transparent',
  5145. 'color': '#909090'
  5146. }
  5147. },
  5148. 'subSelected':
  5149. {
  5150. 'fontSize': '12px',
  5151. 'color': '#aeaeae',
  5152. 'height': '20px',
  5153. 'lineHeight': '20px',
  5154. 'textIndent': '30px',
  5155. 'cursor': 'pointer',
  5156. 'background': '#545555',
  5157. 'over':
  5158. {
  5159. 'background': '#545555',
  5160. 'color': '#aeaeae'
  5161. },
  5162. 'out':
  5163. {
  5164. 'background': '#545555',
  5165. 'color': '#aeaeae'
  5166. }
  5167. }
  5168. },
  5169. 'toolbar':
  5170. {
  5171. 'textOnly':
  5172. {
  5173. 'height': '68px',
  5174. 'display': 'inline-block',
  5175. 'verticalAlign': 'top',
  5176. 'textAlign': 'left',
  5177. 'fontSize': '16px',
  5178. 'lineHeight': '68px',
  5179. 'color': '#cacaca',
  5180. 'cursor': 'pointer',
  5181. 'padding': '0 10px'
  5182. },
  5183. 'withIcon':
  5184. {
  5185. 'height': '68px',
  5186. 'display': 'inline-block',
  5187. 'verticalAlign': 'top',
  5188. 'textAlign': 'left',
  5189. 'fontSize': '16px',
  5190. 'lineHeight': '68px',
  5191. 'color': '#cacaca',
  5192. 'cursor': 'pointer',
  5193. 'padding': '0 10px 0 45px',
  5194. 'position': 'relative'
  5195. },
  5196. 'withDrop':
  5197. {
  5198. 'height': '68px',
  5199. 'display': 'inline-block',
  5200. 'verticalAlign': 'top',
  5201. 'textAlign': 'left',
  5202. 'fontSize': '16px',
  5203. 'lineHeight': '68px',
  5204. 'color': '#cacaca',
  5205. 'cursor': 'pointer',
  5206. 'padding': '0 30px 0 10px',
  5207. 'position': 'relative'
  5208. },
  5209. 'icon':
  5210. {
  5211. 'width': '30px',
  5212. 'height': '30px',
  5213. 'position': 'absolute',
  5214. 'top': '15px',
  5215. 'left': '10px'
  5216. },
  5217. 'drop':
  5218. {
  5219. 'width': '20px',
  5220. 'position': 'absolute',
  5221. 'right': 0,
  5222. 'top': 0,
  5223. 'height': '68px',
  5224. 'lineHeight': '68px',
  5225. 'fontWeight': 'bold',
  5226. 'over': {'backgroundColor': '#266589'},
  5227. 'out': {'backgroundColor': 'transparent'},
  5228. 'backgroundPosition': '0 center',
  5229. 'backgroundRepeat': 'no-repeat'
  5230. },
  5231. 'newIcon':
  5232. {
  5233. 'width': '30px',
  5234. 'height': '30px',
  5235. 'position': 'absolute',
  5236. 'top': '18px',
  5237. 'left': '10px',
  5238. 'padding': 0,
  5239. 'margin': 0,
  5240. 'backgroundPosition': 'center',
  5241. 'backgroundRepeat': 'no-repeat'
  5242. },
  5243. 'sub':
  5244. {
  5245. 'padding': '5px 10px',
  5246. 'over': {'background': '#377395', 'color': '#cacaca'},
  5247. 'out': {'background': 'transparent', 'color': '#aeaeae'},
  5248. 'color': '#aeaeae',
  5249. 'fontSize': '12px',
  5250. 'height': '20px',
  5251. 'lineHeight': '20px',
  5252. 'textAlign': 'center',
  5253. 'borderBottom': '1px solid #404040'
  5254. }
  5255. }
  5256. },
  5257. 'input':
  5258. {
  5259. 'text':
  5260. {
  5261. 'search':
  5262. {
  5263. 'width': '87px',
  5264. 'border': '1px solid #1f1f1f',
  5265. 'height': '14px',
  5266. 'margin': '10px 7px 0 7px',
  5267. 'padding': '5px 15px 5px 10px',
  5268. 'color': '#333333',
  5269. 'fontSize': '12px',
  5270. 'background': '#525252',
  5271. 'focus':
  5272. {
  5273. 'color': '#aeaeae',
  5274. 'outline': 'none'
  5275. },
  5276. 'blur':
  5277. {
  5278. 'color': '#333333'
  5279. }
  5280. }
  5281. }
  5282. },
  5283. 'header':
  5284. {
  5285. 'sender':
  5286. {
  5287. 'fontSize': '14px',
  5288. 'cursor': 'pointer',
  5289. 'color': '#377395',
  5290. 'height': '20px',
  5291. 'lineHeight': '20px',
  5292. 'margin': '2px 0 0 0',
  5293. 'display': 'block',
  5294. 'maxWidth': '96px',
  5295. 'display': 'inline-block',
  5296. 'textOverflow': 'ellipsis',
  5297. 'overflow': 'hidden',
  5298. 'whiteSpace': 'nowrap'
  5299. },
  5300. 'date':
  5301. {
  5302. 'fontSize': '12px',
  5303. 'color': '#4d4d4d',
  5304. 'position': 'absolute',
  5305. 'height': '15px',
  5306. 'right': '10px',
  5307. 'top': '8px',
  5308. 'fontWeight': 'bold',
  5309. 'cursor': 'default'
  5310. },
  5311. 'subject':
  5312. {
  5313. 'fontSize': '14px',
  5314. 'color': '#909090',
  5315. 'width': '100%',
  5316. 'height': '30px',
  5317. 'margin': 0,
  5318. 'padding': 0,
  5319. 'textOverflow': 'ellipsis',
  5320. 'overflow': 'hidden',
  5321. 'whiteSpace': 'nowrap'
  5322. },
  5323. 'cont':
  5324. {
  5325. 'width': '150px',
  5326. 'height': '49px',
  5327. 'borderBottom': '1px solid #292929',
  5328. 'position': 'relative',
  5329. 'padding': '5px 5px 5px 25px',
  5330. 'fontWeight': 'normal',
  5331. 'lineHeight': '22px'
  5332. },
  5333. 'contUnRead':
  5334. {
  5335. 'width': '150px',
  5336. 'height': '49px',
  5337. 'fontWeight': 'bold',
  5338. 'borderBottom': '1px solid #242424',
  5339. 'position': 'relative',
  5340. 'padding': '5px 5px 5px 25px',
  5341. 'background': '#292929'
  5342. },
  5343. 'checkBox':
  5344. {
  5345. 'border': '1px solid #5b5e5e',
  5346. 'width': '10px',
  5347. 'height': '10px',
  5348. 'margin': '10px 0 0 5px'
  5349. },
  5350. 'span':
  5351. {
  5352. 'width': '20px',
  5353. 'height': '59px',
  5354. 'position': 'absolute',
  5355. 'left': '2px',
  5356. 'top': 0,
  5357. 'borderBottom': '1px solid #292929',
  5358. 'cursor': 'pointer'
  5359. }
  5360. },
  5361. 'message':
  5362. {
  5363. 'subject':
  5364. {
  5365. 'color': '#6c6d6d',
  5366. 'fontSize': '18px',
  5367. 'fontWeight': 'bold',
  5368. 'padding': '13px 0 2px 0',
  5369. 'width': '100%',
  5370. 'height': '24px',
  5371. 'lineHeight': '24px',
  5372. 'borderBottom': '2px solid #3f3e3e',
  5373. 'margin': 0,
  5374. 'overflow': 'hidden',
  5375. 'textOverflow': 'ellipsis',
  5376. 'whiteSpace': 'nowrap'
  5377. },
  5378. 'date':
  5379. {
  5380. 'fontSize': '12px',
  5381. 'color': '#6c6d6d',
  5382. 'position': 'absolute',
  5383. 'top': '5px',
  5384. 'right': '10px'
  5385. },
  5386. 'from':
  5387. {
  5388. 'position': 'relative',
  5389. 'fontSize': '12px',
  5390. 'color': '#6c6d6d',
  5391. 'minHeight': '12px',
  5392. 'padding': '5px 5% 0 0',
  5393. 'margin': '0',
  5394. 'display': 'block',
  5395. 'whiteSpace': 'nowrap',
  5396. 'overflow': 'hidden',
  5397. 'maxWidth': '95%'
  5398. },
  5399. 'expand':
  5400. {
  5401. 'wrapper':
  5402. {
  5403. 'width': '5%',
  5404. 'height': '14px',
  5405. 'padding': 0,
  5406. 'display': 'block',
  5407. 'position': 'absolute',
  5408. 'bottom': '2px',
  5409. 'background': '#292929',
  5410. 'right': 0,
  5411. 'cursor': 'pointer',
  5412. },
  5413. 'cont':
  5414. {
  5415. 'lineHeight': '14px',
  5416. 'backgroundPosition': 'center',
  5417. 'backgroundRepeat': 'no-repeat',
  5418. 'opacity': 0.7,
  5419. 'width': '100%',
  5420. 'height': '100%',
  5421. 'over': {'opacity': 1},
  5422. 'out': {'opacity': 0.7}
  5423. }
  5424. },
  5425. 'actionLink':
  5426. {
  5427. 'display': 'inline-block',
  5428. 'verticalAlign': 'top',
  5429. 'color': '#b8b8b8',
  5430. 'cursor': 'pointer',
  5431. 'marginLeft': '20px',
  5432. 'opacity': 0.8,
  5433. 'over': {'opacity': 1},
  5434. 'out': {'opacity': 0.8}
  5435. },
  5436. 'body':
  5437. {
  5438. 'fontSize': '14px',
  5439. 'color': '#848585',
  5440. 'margin': '30px 0 0 0',
  5441. 'paddingBottom': '20px',
  5442. 'borderBottom': '1px solid #3f3e3e'
  5443. }
  5444. },
  5445. 'link':
  5446. {
  5447. '_12':
  5448. {
  5449. 'fontSize': '12px',
  5450. 'color': '#377395',
  5451. 'textDecoration': 'none',
  5452. 'cursor': 'pointer',
  5453. 'marginRight': '10px',
  5454. 'display': 'inline-block'
  5455. },
  5456. '_14':
  5457. {
  5458. 'fontSize': '14px',
  5459. 'color': '#377395',
  5460. 'textDecoration': 'none',
  5461. 'cursor': 'pointer'
  5462. }
  5463. },
  5464. 'searchResults':
  5465. {
  5466. 'cont':
  5467. {
  5468. 'border': '1px solid #1f1f1f',
  5469. 'background': '#266589',
  5470. 'position': 'absolute',
  5471. 'top': '37px',
  5472. 'left': '7px',
  5473. 'width': '112px',
  5474. 'display': 'none'
  5475. },
  5476. 'li':
  5477. {
  5478. 'main':
  5479. {
  5480. 'margin': 0,
  5481. 'padding': 0
  5482. },
  5483. 'sub':
  5484. {
  5485. 'color': '#969696',
  5486. 'borderBottom': '#404040',
  5487. 'textIndent': '15px',
  5488. 'cursor': 'pointer',
  5489. 'over': {'background': '#377395', 'color': '#b4b4b4'},
  5490. 'out': {'background': 'transparent', 'color': '#969696'},
  5491. 'fontSize': '12px',
  5492. 'height': '19px',
  5493. 'lineHeight': '20px',
  5494. 'borderBottom': '1px solid #377395'
  5495. }
  5496. },
  5497. 'count':
  5498. {
  5499. 'color': '#919090',
  5500. 'position': 'absolute',
  5501. 'fontSize': '12px',
  5502. 'right': '10px',
  5503. 'top': '2px'
  5504. },
  5505. 'ul':
  5506. {
  5507. 'listStyleType': 'none',
  5508. 'margin': 0,
  5509. 'padding': 0,
  5510. 'width': '100%'
  5511. },
  5512. 'text':
  5513. {
  5514. 'position': 'relative',
  5515. 'backgroundImage': '',
  5516. 'borderBottom': '1px solid rgba(0,0,0,0.30)',
  5517. 'height': '24px',
  5518. 'color': '#292929',
  5519. 'fontSize': '12px',
  5520. 'margin': 0,
  5521. 'padding': '0 5px',
  5522. 'lineHeight': '24px'
  5523. }
  5524. },
  5525. 'compose':
  5526. {
  5527. 'window':
  5528. {
  5529. 'background': '#292929',
  5530. 'width': '100%',
  5531. 'height': '471px',
  5532. 'paddingTop': '69px',
  5533. 'position': 'relative',
  5534. 'fontFamily': 'vrinda',
  5535. 'display': 'table'
  5536. },
  5537. 'topBar':
  5538. {
  5539. },
  5540. 'leftBar':
  5541. {
  5542. 'cont':
  5543. {
  5544. 'minWidth': '256px',
  5545. 'position': 'relative',
  5546. 'background': '#3a3b3b',
  5547. 'height': '471px',
  5548. 'display': 'table-cell',
  5549. 'verticalAlign': 'top'
  5550. },
  5551. 'recipients':
  5552. {
  5553. 'toText':
  5554. {
  5555. 'color': '#8d8c8c',
  5556. 'fontSize': '12px',
  5557. 'margin': '10px 0 5px 15px'
  5558. },
  5559. 'main':
  5560. {
  5561. 'position': 'relative',
  5562. 'border': '1px solid #1f1f1f',
  5563. 'background': '#323232',
  5564. 'width': '238px',
  5565. 'margin': '0 auto',
  5566. 'minHeight': '20px',
  5567. 'maxHeight': '180px'
  5568. },
  5569. 'mask':
  5570. {
  5571. 'position': 'relative',
  5572. 'overflow': 'hidden',
  5573. 'width': '100%',
  5574. 'height': '100%',
  5575. 'maxHeight': '180px'
  5576. },
  5577. 'cont':
  5578. {
  5579. 'padding': '5px 20px 0 5px',
  5580. 'position': 'absolute',
  5581. 'boxSizing': 'border-box',
  5582. 'MozBoxSizing': 'border-box',
  5583. 'width': '100%',
  5584. 'lineHeight': '10px'
  5585. },
  5586. 'count':
  5587. {
  5588. 'position': 'absolute',
  5589. 'bottom': 0,
  5590. 'left': 0,
  5591. 'padding': '5px 30px 5px 0',
  5592. 'color': '#999',
  5593. 'fontSize': '12px',
  5594. 'width': '100%',
  5595. 'boxSizing': 'border-box',
  5596. 'MozBoxSizing': 'border-box',
  5597. 'background': '#292929',
  5598. 'textAlign': 'right'
  5599. },
  5600. 'scrollbar':
  5601. {
  5602. 'cont':
  5603. {
  5604. 'position': 'absolute',
  5605. 'top': 0,
  5606. 'right': 0,
  5607. 'width': '16px',
  5608. 'height': '100%',
  5609. 'maxHeight': '180px',
  5610. 'background': '#363636'
  5611. },
  5612. 'bar':
  5613. {
  5614. 'position': 'absolute',
  5615. 'top': '10px',
  5616. 'background': '#3d3d3d',
  5617. 'width': '16px',
  5618. 'over': {'background': '#424242'},
  5619. 'out': {'background': '#3d3d3d'},
  5620. 'down': {'background': '#707070'},
  5621. 'up': {'background': '#3d3d3d'}
  5622. }
  5623. },
  5624. 'recipient':
  5625. {
  5626. 'cont':
  5627. {
  5628. 'margin': '0 5px 5px 0',
  5629. 'background': '#266589',
  5630. 'color': '#bcbcbc',
  5631. 'fontSize': '12px',
  5632. 'height': '20px',
  5633. 'lineHeight': '20px',
  5634. 'padding': '0 20px 0 10px',
  5635. 'textOverflow': 'ellipsis',
  5636. 'maxWidth': '100%',
  5637. 'overflow': 'hidden',
  5638. 'display': 'inline-block',
  5639. 'position': 'relative'
  5640. },
  5641. 'remove':
  5642. {
  5643. 'position': 'absolute',
  5644. 'top': 0,
  5645. 'right': 0,
  5646. 'width': '15px',
  5647. 'height': '20px',
  5648. 'lineHeight': '20px',
  5649. 'color': '#bcbcbc',
  5650. 'over': {'background': '#377395'},
  5651. 'out': {'background': 'transparent'},
  5652. 'fontSize': '10px',
  5653. 'textAlign': 'center',
  5654. 'cursor': 'pointer'
  5655. }
  5656. },
  5657. 'textField':
  5658. {
  5659. 'height': '15px',
  5660. 'lineHeight': '15px',
  5661. 'maxWidth': '100%',
  5662. 'minWidth': '20%',
  5663. 'width': '90%',
  5664. 'border': 'none',
  5665. 'background': 'transparent',
  5666. 'outline': 'none',
  5667. 'focus': {'outline': 'none', 'background': 'transparent'},
  5668. 'blur': {'outline': 'none', 'background': 'transparent'},
  5669. 'color': '#919191',
  5670. 'margin': 0,
  5671. 'padding': '0 5px 5px 0'
  5672. },
  5673. 'textFieldCont':
  5674. {
  5675. 'display': 'block',
  5676. 'margin': 0,
  5677. 'padding': 0,
  5678. 'lineHeight': '10px'
  5679. },
  5680. 'searchBox':
  5681. {
  5682. 'cont':
  5683. {
  5684. 'border': '1px solid #1f1f1f',
  5685. 'background': '#323232',
  5686. 'position': 'absolute',
  5687. 'left': '7px',
  5688. 'width': '243px',
  5689. 'maxHeight': '244px',
  5690. 'display': 'none'
  5691. },
  5692. 'mask':
  5693. {
  5694. 'width': '227px',
  5695. 'height': '100%',
  5696. 'overflow': 'hidden',
  5697. 'position': 'relative'
  5698. },
  5699. 'scrollbar':
  5700. {
  5701. 'cont':
  5702. {
  5703. 'position': 'absolute',
  5704. 'top': 0,
  5705. 'right': 0,
  5706. 'width': '16px',
  5707. 'height': '100%',
  5708. 'background': '#363636'
  5709. },
  5710. 'bar':
  5711. {
  5712. 'position': 'absolute',
  5713. 'top': '10px',
  5714. 'background': '#3d3d3d',
  5715. 'width': '16px',
  5716. 'over': {'background': '#424242'},
  5717. 'out': {'background': '#3d3d3d'},
  5718. 'down': {'background': '#707070'},
  5719. 'up': {'background': '#3d3d3d'}
  5720. }
  5721. },
  5722. 'itemsCont':
  5723. {
  5724. 'width': '100%',
  5725. 'position': 'absolute',
  5726. 'top': 0,
  5727. 'zIndex': 12000
  5728. },
  5729. 'item':
  5730. {
  5731. 'cont':
  5732. {
  5733. 'height': '48px',
  5734. 'borderBottom': '1px solid #3e3e3e',
  5735. 'color': '#8e8e8e',
  5736. 'background': 'transparent',
  5737. 'over': {'background': '#266589', 'color': '#bcbcbc'},
  5738. 'out': {'background': 'transparent', 'color': '#8e8e8e'}
  5739. },
  5740. 'contSelected':
  5741. {
  5742. 'height': '48px',
  5743. 'borderBottom': '1px solid #3e3e3e',
  5744. 'color': '#bcbcbc',
  5745. 'background': '#266589'
  5746. },
  5747. 'text':
  5748. {
  5749. 'fontSize': '14px',
  5750. 'textOverflow': 'ellipsis',
  5751. 'height': '15px',
  5752. 'lineHeight': '15px',
  5753. 'padding': '5px 10px 0 10px',
  5754. 'margin': 0
  5755. }
  5756. }
  5757. }
  5758. },
  5759. 'contacts':
  5760. {
  5761. 'cont':
  5762. {
  5763. 'position': 'absolute',
  5764. 'bottom': 0
  5765. }
  5766. },
  5767. 'tableOptions':
  5768. {
  5769. 'button':
  5770. {
  5771. 'height': '25px',
  5772. 'width': '40%',
  5773. 'margin': '50px 0 0 15px',
  5774. 'textAlign': 'center',
  5775. 'background': '#4e4e4e',
  5776. 'color': '#8b8b8b',
  5777. 'fontSize': '12px',
  5778. 'lineHeight': '25px',
  5779. 'over': {'background': '#266589', 'color': '#c2c2c2'},
  5780. 'out': {'background': '#4e4e4e', 'color': '#8b8b8b'},
  5781. 'cursor': 'pointer',
  5782. 'display': 'inline-block'
  5783. },
  5784. 'inputCont':
  5785. {
  5786. 'position': 'relative'
  5787. },
  5788. 'input':
  5789. {
  5790. 'width': '150px',
  5791. 'border': '1px solid #1f1f1f',
  5792. 'background': '#323232',
  5793. 'color': '#6c6d6d',
  5794. 'fontSize': '12px',
  5795. 'margin': '10px 15px 0 15px',
  5796. 'paddingLeft': '10px',
  5797. 'outline': 'none',
  5798. 'focus': {'outline': 'none'},
  5799. 'blur': {'outline': 'none'},
  5800. 'height': '23px',
  5801. 'lineHeigt': '25px'
  5802. },
  5803. 'label':
  5804. {
  5805. 'display': 'inline-block',
  5806. 'verticalAlign': 'top',
  5807. 'height': '25px',
  5808. 'marginTop': '10px',
  5809. 'lineHeight': '25px',
  5810. 'color': '#6c6d6d',
  5811. 'fontSize': '12px'
  5812. },
  5813. 'span':
  5814. {
  5815. 'position': 'absolute',
  5816. 'top': '-5px',
  5817. 'left': '25px',
  5818. 'height': '20px',
  5819. 'lineHeight': '20px',
  5820. 'color': '#6c6d6d',
  5821. 'width': '190px',
  5822. 'fontSize': '12px'
  5823. },
  5824. 'checkbox':
  5825. {
  5826. 'border': '1px solid #5b5e5e',
  5827. 'width': '10px',
  5828. 'height': '10px',
  5829. 'margin': '15px 0 0 15px',
  5830. 'cursor': 'pointer',
  5831. 'position': 'relative'
  5832. }
  5833. },
  5834. 'contacts':
  5835. {
  5836. 'main':
  5837. {
  5838. 'position': 'absolute',
  5839. 'bottom': '40px',
  5840. 'left': '16px',
  5841. 'color': '#999',
  5842. 'width': '230px'
  5843. },
  5844. 'ul':
  5845. {
  5846. 'main':
  5847. {
  5848. 'listStyleType': 'none',
  5849. 'display': 'block',
  5850. 'margin': '0',
  5851. 'padding': '0',
  5852. 'color': '#a3a2a2'
  5853. },
  5854. 'sub':
  5855. {
  5856. 'listStyleType': 'none',
  5857. 'display': 'block',
  5858. 'margin': '0',
  5859. 'padding': '0',
  5860. 'color': '#808080'
  5861. },
  5862. 'span':
  5863. {
  5864. 'listStyleType': 'none',
  5865. 'display': 'block',
  5866. 'margin': '0',
  5867. 'padding': '0',
  5868. 'width': 'inherit',
  5869. 'color': '#808080',
  5870. 'position': 'absolute',
  5871. 'top': 0
  5872. }
  5873. },
  5874. 'li':
  5875. {
  5876. 'main':
  5877. {
  5878. 'fontSize': '24px',
  5879. 'width': '240px'
  5880. },
  5881. 'sub':
  5882. {
  5883. 'fontSize': '12px',
  5884. 'position': 'relative',
  5885. 'height': '20px',
  5886. 'over': {'color': '#a3a2a2'},
  5887. 'out': {'color': '#808080'}
  5888. },
  5889. 'span':
  5890. {
  5891. 'width': '100%',
  5892. 'paddingLeft': '10px',
  5893. 'boxSizing': 'border-box',
  5894. 'MoxBoxSizing': 'border-box',
  5895. 'borderBottom': '1px solid #464646',
  5896. 'fontSize': '12px',
  5897. 'height': '24px',
  5898. 'lineHeight': '24px',
  5899. 'over': {'background': '#434343', 'color': '#a3a2a2'},
  5900. 'out': {'background': 'transparent', 'color': '#808080'}
  5901. }
  5902. },
  5903. 'span':
  5904. {
  5905. 'main':
  5906. {
  5907. 'position': 'absolute',
  5908. 'display': 'none',
  5909. 'cursor': 'pointer',
  5910. 'right': '16px',
  5911. 'top': 0
  5912. },
  5913. 'sub':
  5914. {
  5915. 'position': 'absolute',
  5916. 'bottom': '20px',
  5917. 'left': '0',
  5918. 'display': 'none',
  5919. 'background': '#3a3b3b',
  5920. 'border': '2px solid #1c1c1c',
  5921. 'width': '100%',
  5922. 'boxSizing': 'border-box',
  5923. 'MoxBoxSizing': 'border-box',
  5924. 'maxHeight': '178px',
  5925. 'overflow': 'hidden'
  5926. }
  5927. },
  5928. 'select':
  5929. {
  5930. 'position': 'relative',
  5931. 'height': '20px',
  5932. 'width': '120px',
  5933. 'marginLeft': '16px',
  5934. 'cursor': 'pointer'
  5935. },
  5936. 'scrollbar':
  5937. {
  5938. 'cont':
  5939. {
  5940. 'position': 'absolute',
  5941. 'top': 0,
  5942. 'right': 0,
  5943. 'width': '16px',
  5944. 'height': '100%',
  5945. 'background': '#363636',
  5946. 'maxHeight': '178px',
  5947. 'opacity': 0.6
  5948. },
  5949. 'bar':
  5950. {
  5951. 'position': 'absolute',
  5952. 'top': '10px',
  5953. 'background': '#454545',
  5954. 'width': '16px',
  5955. 'over': {'background': '#555555'},
  5956. 'out': {'background': '#454545'},
  5957. 'down': {'background': '#707070'},
  5958. 'up': {'background': '#454545'}
  5959. }
  5960. }
  5961. }
  5962. },
  5963. 'rightBar':
  5964. {
  5965. 'cont':
  5966. {
  5967. 'height': '471px',
  5968. 'display': 'table-cell',
  5969. 'verticalAlign': 'top',
  5970. 'position': 'relative',
  5971. 'width': '100%'
  5972. },
  5973. 'msgMask':
  5974. {
  5975. 'overflow': 'hidden',
  5976. 'position': 'relative',
  5977. 'height': '471px',
  5978. 'width': 'inherit'
  5979. },
  5980. 'msgCont':
  5981. {
  5982. 'width': '100%',
  5983. 'position': 'absolute',
  5984. 'top': 0,
  5985. 'overflowX': 'hidden',
  5986. 'padding': '100px 30px 25px 20px',
  5987. 'boxSizing': 'border-box',
  5988. 'MozBoxSizing': 'border-box'
  5989. },
  5990. 'msgHeader':
  5991. {
  5992. 'position': 'absolute',
  5993. 'top': 0,
  5994. 'left': 0,
  5995. 'padding': '0 30px 0 14px',
  5996. 'boxSizing': 'border-box',
  5997. 'MozBoxSizing': 'border-box',
  5998. 'background': '#292929',
  5999. 'width': '100%'
  6000. },
  6001. 'scrollBar':
  6002. {
  6003. 'cont':
  6004. {
  6005. 'width': '16px',
  6006. 'position': 'absolute',
  6007. 'background': '#333333',
  6008. 'height': '471px',
  6009. 'top': 0,
  6010. 'right': 0
  6011. },
  6012. 'bar':
  6013. {
  6014. 'width': '16px',
  6015. 'background': '#3b3b3b',
  6016. 'position': 'absolute',
  6017. 'top': '10px',
  6018. 'over': {'background': '#424242'},
  6019. 'out': {'background': '#3b3b3b'},
  6020. 'down': {'background': '#707070'},
  6021. 'up': {'background': '#3d3d3d'},
  6022. 'pointer': 'cursor'
  6023. }
  6024. },
  6025. 'textField':
  6026. {
  6027. 'color': '#6c6d6d',
  6028. 'fontSize': '17px',
  6029. 'fontWeight': 'bold',
  6030. 'width': '100%',
  6031. 'border': 'none',
  6032. 'borderBottom': '2px solid #3f3e3e',
  6033. 'margin': '0',
  6034. 'padding': '13px 0 2px 0',
  6035. 'outline': 'none',
  6036. 'background': 'transparent',
  6037. 'focus': {'outline': 'none'},
  6038. 'blur': {'outline': 'none'},
  6039. 'height': '24px',
  6040. 'lineHeigt': '24px'
  6041. },
  6042. 'textArea':
  6043. {
  6044. 'margin': 0,
  6045. 'padding': 0,
  6046. 'border': 'none',
  6047. 'width': '100%',
  6048. 'minHeight': '30px',
  6049. 'height': '100px',
  6050. 'cursor': 'text',
  6051. 'display': 'block'
  6052. },
  6053. 'expand':
  6054. {
  6055. 'position': 'absolute',
  6056. 'top': '7px',
  6057. 'right': '27px',
  6058. 'backgroundPosition': 'center',
  6059. 'backgroundRepeat': 'no-repeat',
  6060. 'width': '30px',
  6061. 'height': '30px',
  6062. 'visibility': 'hidden',
  6063. 'opacity': 0.3,
  6064. 'cursor': 'pointer',
  6065. 'over': {'opacity': 0.5},
  6066. 'out': {'opacity': 0.3}
  6067. },
  6068. 'toolbar':
  6069. {
  6070. 'cont':
  6071. {
  6072. 'height': '20px',
  6073. 'margin': '7px 0 10px 0'
  6074. },
  6075. 'icon':
  6076. {
  6077. 'display': 'inline-block',
  6078. 'verticalAlign': 'top',
  6079. 'cursor': 'pointer',
  6080. 'backgroundRepeat': 'no-repeat',
  6081. 'backgroundPosition': 'center',
  6082. 'width': '26px',
  6083. 'height': '20px',
  6084. 'opacity': 0.4,
  6085. 'over': {'opacity': 0.8},
  6086. 'out': {'opacity': 0.4}
  6087. }
  6088. },
  6089. 'origionalMsg':
  6090. {
  6091. 'cont':
  6092. {
  6093. 'width': '100%',
  6094. 'position': 'relative',
  6095. 'background': '#262626',
  6096. 'color': '#747474',
  6097. 'border': '1px solid #3f3e3e',
  6098. 'fontSize': '14px',
  6099. 'padding': '15px',
  6100. 'boxSizing': 'border-box',
  6101. 'MozBoxSizing': 'border-box',
  6102. 'margin': '5px 0',
  6103. 'userSelect': 'text',
  6104. 'MozUserSelect': 'text',
  6105. 'cursor': 'text',
  6106. 'lineHeight': '18px'
  6107. },
  6108. 'close':
  6109. {
  6110. 'width': '20px',
  6111. 'height': '20px',
  6112. 'position': 'absolute',
  6113. 'top': '3px',
  6114. 'right': '3px',
  6115. 'color': '#9b9b9b',
  6116. 'textAlign': 'center',
  6117. 'lineHeight': '20px',
  6118. 'fontSize': '12px',
  6119. 'fontWeight': 'bold',
  6120. 'cursor': 'pointer'
  6121. },
  6122. 'date':
  6123. {
  6124. 'fontSize': '12px',
  6125. 'position': 'absolute',
  6126. 'top': '5px',
  6127. 'right': '12px',
  6128. 'margin': 0
  6129. },
  6130. 'from':
  6131. {
  6132. 'position': 'relative',
  6133. 'fontSize': '14px',
  6134. 'paddingTop': '5px',
  6135. 'margin': '0 0 10px 0',
  6136. 'fontWeight': 'bold'
  6137. }
  6138. }
  6139. }
  6140. },
  6141. 'quote':
  6142. {
  6143. 'border': '1px solid #5a5a5a',
  6144. 'background': '#303030',
  6145. 'padding': '10px',
  6146. 'box-sizing': 'border-box',
  6147. 'MozBoxSizing': 'border-box'
  6148. },
  6149. 'notification':
  6150. {
  6151. 'cont':
  6152. {
  6153. 'background': '#292929',
  6154. 'width': '230px',
  6155. 'height': '73px',
  6156. 'border': '2px solid #8d8d8d',
  6157. 'position': 'absolute',
  6158. 'bottom': '30px',
  6159. 'right': '30px',
  6160. 'box-shadow': '5px 5px 25px rgba(0,0,0,0.7)',
  6161. 'padding': '10px',
  6162. 'color': '#9a9a9a',
  6163. 'fontSize': '12px',
  6164. 'fontFamily': 'vrinda',
  6165. 'zIndex': 1000
  6166. },
  6167. 'header':
  6168. {
  6169. 'cont':
  6170. {
  6171. 'marginBottom': '5px'
  6172. },
  6173. 'mail':
  6174. {
  6175. 'backgroundPosition': 'center left',
  6176. 'backgroundRepeat': 'no-repeat',
  6177. 'width': '40px',
  6178. 'height': '30px',
  6179. 'display': 'inline-block',
  6180. 'verticalAlign': 'top',
  6181. 'position': 'relative'
  6182. },
  6183. 'text':
  6184. {
  6185. 'display': 'inline-block',
  6186. 'verticalAlign': 'top',
  6187. 'textAlign': 'center',
  6188. 'margin': '0 0 0 5px',
  6189. 'width': '182px',
  6190. 'lineHeight': '30px',
  6191. 'height': '30px',
  6192. 'fontSize': '14px'
  6193. },
  6194. 'textMultiple':
  6195. {
  6196. 'display': 'inline-block',
  6197. 'verticalAlign': 'top',
  6198. 'textAlign': 'center',
  6199. 'margin': '0 0 0 5px',
  6200. 'width': '182px',
  6201. 'lineHeight': '15px',
  6202. 'height': '35px',
  6203. 'fontSize': '14px'
  6204. },
  6205. 'type':
  6206. {
  6207. 'backgroundPosition': 'center',
  6208. 'backgroundRepeat': 'no-repeat',
  6209. 'width': '12px',
  6210. 'height': '30px',
  6211. 'display': 'inline-block',
  6212. 'verticalAlign': 'top',
  6213. 'position': 'absolute',
  6214. 'top': 0,
  6215. 'left': '40px'
  6216. }
  6217. },
  6218. 'from':
  6219. {
  6220. 'margin': 0,
  6221. 'padding': 0,
  6222. 'whiteSpace': 'nowrap',
  6223. 'overflow': 'hidden',
  6224. 'textOverflow': 'ellipsis'
  6225. },
  6226. 'subject':
  6227. {
  6228. 'margin': 0,
  6229. 'padding': 0,
  6230. 'whiteSpace': 'nowrap',
  6231. 'overflow': 'hidden',
  6232. 'textOverflow': 'ellipsis'
  6233. },
  6234. 'remove':
  6235. {
  6236. 'position': 'absolute',
  6237. 'top': '2px',
  6238. 'right': '2px',
  6239. 'width': '20px',
  6240. 'height': '20px',
  6241. 'lineHeight': '20px',
  6242. 'textAlign': 'center',
  6243. 'color': '#9a9a9a',
  6244. 'fontSize': '10px',
  6245. 'fontWeight': 'bold',
  6246. 'cursor': 'pointer'
  6247. },
  6248. 'link':
  6249. {
  6250. 'fontSize': '12px',
  6251. 'color': '#377395',
  6252. 'textDecoration': 'none',
  6253. 'cursor': 'pointer',
  6254. 'marginRight': '10px'
  6255. },
  6256. 'button':
  6257. {
  6258. 'position': 'absolute',
  6259. 'bottom': '10px',
  6260. 'width': '100px',
  6261. 'height': '25px',
  6262. 'textAlign': 'center',
  6263. 'background': '#4e4e4e',
  6264. 'color': '#8b8b8b',
  6265. 'fontSize': '12px',
  6266. 'lineHeight': '25px',
  6267. 'over': {'background': '#266589', 'color': '#c2c2c2'},
  6268. 'out': {'background': '#4e4e4e', 'color': '#8b8b8b'},
  6269. 'cursor': 'pointer'
  6270. }
  6271. },
  6272. 'confirm':
  6273. {
  6274. 'wrapper':
  6275. {
  6276. 'position': 'absolute',
  6277. 'top': 0,
  6278. 'left': 0,
  6279. 'width': '100%',
  6280. 'height': '100%',
  6281. 'background': '#000',
  6282. 'opacity': 0.2,
  6283. 'zIndex': 20000
  6284. },
  6285. 'cont':
  6286. {
  6287. 'position': 'absolute',
  6288. 'top': '80px',
  6289. 'right': '40px',
  6290. 'background': '#292929',
  6291. 'border': '2px solid #181818',
  6292. 'width': '359px',
  6293. 'padding': '20px 10px 10px 10px',
  6294. 'zIndex': 25000
  6295. },
  6296. 'input':
  6297. {
  6298. 'width': '100%',
  6299. 'border': '1px solid #1f1f1f',
  6300. 'background': '#323232',
  6301. 'color': '#6c6d6d',
  6302. 'fontSize': '12px',
  6303. 'padding': '2px 10px',
  6304. 'margin': '0 0 10px 0',
  6305. 'outline': 'none',
  6306. 'focus': {'outline': 'none'},
  6307. 'blur': {'outline': 'none'},
  6308. 'height': '29px',
  6309. 'lineHeigt': '29px',
  6310. 'boxSizing': 'border-box',
  6311. 'MozBoxSizing': 'border-box'
  6312. },
  6313. 'select':
  6314. {
  6315. 'width': '150px',
  6316. 'border': '1px solid #1f1f1f',
  6317. 'background': '#323232',
  6318. 'color': '#6c6d6d',
  6319. 'fontSize': '12px',
  6320. 'padding': '2px 10px',
  6321. 'margin': '0 0 10px 0',
  6322. 'height': '21px',
  6323. 'lineHeigt': '21px',
  6324. 'display': 'inline-block',
  6325. 'position': 'relative',
  6326. 'verticalAlign': 'top',
  6327. 'textAlign': 'left'
  6328. },
  6329. 'button':
  6330. {
  6331. 'height': '25px',
  6332. 'width': '100px',
  6333. 'display': 'inline-block',
  6334. 'textAlign': 'center',
  6335. 'background': '#4e4e4e',
  6336. 'color': '#8b8b8b',
  6337. 'fontSize': '12px',
  6338. 'lineHeight': '25px',
  6339. 'over': {'background': '#266589', 'color': '#c2c2c2'},
  6340. 'out': {'background': '#4e4e4e', 'color': '#8b8b8b'},
  6341. 'cursor': 'pointer',
  6342. 'margin': '0 5px'
  6343. },
  6344. 'subCont':
  6345. {
  6346. 'margin': '0 0 5px 0',
  6347. 'padding': 0,
  6348. 'height': '25px',
  6349. 'lineHeight': '25px',
  6350. 'font-size': '14px',
  6351. 'color': '#6f6f6f',
  6352. 'textAlign': 'center'
  6353. },
  6354. 'list':
  6355. {
  6356. 'cont':
  6357. {
  6358. 'position': 'absolute',
  6359. 'top': '28px',
  6360. 'left': 0,
  6361. 'display': 'none',
  6362. 'background': '#323232',
  6363. 'border': '1px solid #1c1c1c',
  6364. 'width': '100%',
  6365. 'boxSizing': 'border-box',
  6366. 'MoxBoxSizing': 'border-box'
  6367. },
  6368. 'ul':
  6369. {
  6370. 'listStyleType': 'none',
  6371. 'display': 'block',
  6372. 'margin': '0',
  6373. 'padding': '0',
  6374. 'width': 'inherit',
  6375. 'color': '#808080'
  6376. },
  6377. 'li':
  6378. {
  6379. 'width': '100%',
  6380. 'paddingLeft': '10px',
  6381. 'boxSizing': 'border-box',
  6382. 'MoxBoxSizing': 'border-box',
  6383. 'borderBottom': '1px solid #464646',
  6384. 'fontSize': '12px',
  6385. 'height': '24px',
  6386. 'lineHeight': '24px',
  6387. 'over': {'background': '#434343', 'color': '#a3a2a2'},
  6388. 'out': {'background': 'transparent', 'color': '#808080'}
  6389. }
  6390. }
  6391. }
  6392. },
  6393. res:
  6394. {
  6395. 'controls':
  6396. {
  6397. 'next': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAXUlEQVQYV2Oct3DhBsZ//xISExM/MOABjPMXLvzP8P//AyAGqk08gEstRCECNCTGxzdiU4yukAGoa2FSfHwCumJ0hY1AExtwmgg05SHUQ7jdSLSv8QUJshwj1RUCALdQMQvYKq1HAAAAAElFTkSuQmCC',
  6398. 'previous': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAZUlEQVQYV2NkwALmz58vwMDIOD8xISEQJs2Irg6oyAGkCIgVEuPj4fIoCucvXNgA1FgP04xV4byFCxcAdcUj20CZiTCTQG78z8QEMl0ep4lIigVAipPi4wNw+hpbcIHEMIKHYoUATvMeC0yTB00AAAAASUVORK5CYII=',
  6399. 'first': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAd0lEQVQYV2Ocv3DhfwYg+PfnD19ycvJnEHv+/PkCDIyM8xMTEgJBfBBgRFcIVOQAUgTEConx8YxYFTKxsBQDJephktgV/v+/lImRMRqmCERTaCLUMyA3/mdiWgB0nDxOE5F9DVKcFB8fAPcMspvwseHeJ6SBaIUAZidKC2YCLWUAAAAASUVORK5CYII=',
  6400. 'last': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAdElEQVQYV2Oct3DhBsZ//xISExM/MADB3LlzeZlYWD6B2Inx8YwgGgQY5y9c+J/h//8HQAxUm3gAv0KYNgaGhn9//vThNhGhkOHf//9LmRgZo7FbjVDYCDSxF6eJ/xkYHkI9hNuNRPsayXl4mfBwIqSBaIUAjElLC7H537YAAAAASUVORK5CYII='
  6401. },
  6402. 'tools':
  6403. {
  6404. 'bold': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAjElEQVQ4jeXSIQoCURCA4QWrYLJ6AMEqWD2DN/AYJu+xySSYBG9gtQqCYLIKewDhs0xYlo3zBPGHgceUD4ZXVX8balw6s8M0Gzrr74VJNtTEe4AlnoGti0Ct3b44hBUa3DHMhro9vv0Z5tlQ+3QjbAI7FoNiNw7oVhraBnTKhvp6Y1ESuuKAWRryU30AvDon2Jg0sc0AAAAASUVORK5CYII=)',
  6405. 'italic': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAbElEQVQ4jc3SsQmDUABFUSshrZWQDQIOIKQSskoqIasEUrmKYBVwEsEqM5w02UD+I3eB09yq+udQo0tAPdYEdMeUgJ54JKAZtwS04VwaafApivygK94JKHbcC2MCWjAkoB1taSR23AmX4tCRvtMVYAewYq2yAAAAAElFTkSuQmCC)',
  6406. 'underline': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAjElEQVQ4je3TsQkCQRBG4QNBuMgabMJW7OBSwcgChIss4DoQTO3ASDC1BlMjo4PPwAEvWRB2OQzuRcP+MI8ZZqvqn8ATbSLb+bCYRJNodFFdQvRAl8ha9NmSaHbBNZGdcS8l2sZ6DpgP3hv02JcSzXD05YZX1KehvJRwiXVMtsGqqGAU4rR/Jf8v5fIG4y4UzcoLKWQAAAAASUVORK5CYII=)',
  6407. 'strikeThrough': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAABYUlEQVQ4T72UMUtDMRRGm0UoOAlO7VIRBLcurt1EsEsF0VFQBKe6Ci6CP8BJcSgUXBwEQdxEUBycBBdFJ0EQpEPBVSjP80keaA25QUoDhwe5r995N0njCkMaLsWTZdkI723ADEzBO5xByznXS8kwRUjGCLqECpzCJ2iuARdQT5GliHYJW4Uqgerke/AB6u4G1pg/srpKESnsjrDN/jBkx5qjtjwIkZatS9hiQFRibpTa8yBE64QcwhYcEPphhYbq5tL5/djj2QRJ2nANtz/3zJIHRax9Zv0wVucD/uQmdRTYm0nm5mAHXsmtWh8WFdHYOAH6v5wQ1g0I55k7hwnqL9EuY0Uv6vDOLEH6c/4a1KeZeIAy9bd/i/xBeOKp47vQfwMg0iFZ8qLoVWTuEWE1gq78SWvxfIQi6LZYAd0Mmo8OU+S7kmwftFT50FJtI2lbEtWTRHkQ3akTyXoI7lME+Ttfa410ERQq4hEAAAAASUVORK5CYII=)',
  6408. 'quote': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAyElEQVQ4T2NkoBNgxGXP////tYByE4BYiEi3vAOqK2BkZLyGTT1Wi4CWMAMV3wZiRSItgSm7D2SoAi37i64Pl0X2QIUHSLQEptwBaNFBYi2KAipcSqZF0UCLlo1aRE7ojfCgMwOG2Ulywg2oxxyY6k4RlepAioCZdheQciXRst1AS9yILhmgFnEC6XwiSodkoJqtQHwciCcCLfpOkkXE+AToawmguu1AbIKt2EE2A2ehSqRFoKD9DrTkCCH1lFokDbTkKSFLQPIAtAVOEc/UEFUAAAAASUVORK5CYII=)',
  6409. 'player': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAoUlEQVQ4jc3PsQpBYQCG4VMmk9XkJpTJBSjX4AJMymo6ZTIppUzuQLkMk9WkTCYXoNRjIcrf4fSfv7wX8D19WfaPoYERJminQpo4e3VDPwWU+2yXAloHoFMKqBeA5pVDD2z+hhxQT4FMA4+2qFWJjAPIs2VVSAvXAggGVUCLLwgcYpEaLj9A0I2BOj8ikMdAwxLQJgaalYD2MdCqBHQs2roDRL7rpNTLvRUAAAAASUVORK5CYII=)',
  6410. 'alliance': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAABGklEQVQ4jc3U0UdDYRjH8RGxq66ivyEiRv9EtxG7jRGxq4gRIyJijIjoPxgR3XYVY3Q1RoyuInYVMcani206PXsdOxT9rs55/J7f93nf876nVPqPwhrqaKDyV5ANvPnWBLu/FVzHKXbQtKhu9BWFbOIjE9jHbQL0ilao1YqArkPzBNUEqIWnCC8CaiRCj8P0A1QSvscioDIeMs1dXCZC71DLvL9gqwhoH++z5r70QZjrCu3Z8ycusLoM5DAEHWCcA4IjjMJKV/Ig26Yffq5eZto8DXAeavU8UCeYT8KkeYo7MUI5BVkPq0k156np558DqinQXjCNTW/8surgPtRuUqCzYBqanqBl9WzxovdSoGhKNeZpaPFADOf5X3Iixhnv5aZoAAAAAElFTkSuQmCC)',
  6411. 'coords': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAA00lEQVQ4jc3SIQoCQRTG8YVNWz2AYDIJpk0eYGGryQMIgrDJKphMgskDmASrJzGZBGFBEASTICz8DY7weDiLzkzwi/Ox78fOvCj6twApsAPOvHICtkA7JDIDKj7nDgxDIIUYegFSc54BD9HlPkgCXMWwQvVL0R18oFxdk4YWqu+4QhM16Ai0TNcFbqrvu0IjywKUlnO3dwJ6loG2NF0hvQx12TshAtMPbsvYF2p88VclkHhBBhvUIBWQeSMCW1mgaTDEQDGwVsgGiINCAnwvx/yX757Sbx5xpkiHLQAAAABJRU5ErkJggg==)',
  6412. 'table': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAgUlEQVQ4je3RIQ6DQBRFUSyKBIvForqnJii2UlvFhpqQsIbaWuzBjJ0MM2JSwUuee/k3P7dpIkGLR2bb2L1oMMnP9NegEQc2fBLdwnbMBgXYju7CrsNeBKkGwoAfVrwTXcN2KAH1+GLBM9ElbPvSr25Ht6OKoNqOXpgvOJrDNuroBLUtQ3//HcJ5AAAAAElFTkSuQmCC)',
  6413. 'insertunorderedList': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAO0lEQVQ4jWNgGEjw//9/g////z/4//+/Aa0tevAfAh4giRENSLEIw0c0sWj4gdHEMJoY4GA0MYzMxAAA6QxndHKcgPEAAAAASUVORK5CYII=)',
  6414. 'insertorderedList': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAcElEQVQ4je3SMQ2AQAxG4UpBAhKQgDSkIOEkIAEJOPhYbrgQBiCUiTe2aV7b/BEnYIGz3qugP4rc4K4sX/R4ux+s9XNLtqjDgLWppYRhqFeN2SJVVC4P/UREoGD7KnUFc1NLCUOHqR3KEpWautdetwOK5H3Pn7B4CQAAAABJRU5ErkJggg==)',
  6415. 'indent': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAUUlEQVQ4jdWRwQkAIAwD3X+KbBq/UiIF20p7z2A8jGt1hYLZohJI4peIVqamC095dCGyuOjSh1sMvKRWJIQQWfxvzKUQWboI7qHxpE7WQvTKBmYgK+hcRGVIAAAAAElFTkSuQmCC)',
  6416. 'outdent': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAS0lEQVQ4jWNgGEzgPxYwtC0aVOD///8LyNFEEKBbQlZwkmIRzBKaxhuyJTRNKFSziG5BR4xFyJaRbRGJjlpAF4uoAuiSsuhqETUAAAP+K+ha7EZ4AAAAAElFTkSuQmCC)',
  6417. 'justifyleft': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAALElEQVQ4jWNgGEjwn0Iw+CwafoBuQTUaJ2QDUoOO7KCkm0XDD9AtqIZ0nAAA5z6+ULjEuxYAAAAASUVORK5CYII=)',
  6418. 'justifycenter': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAALElEQVQ4jWNgGEjwn0Iw+Cwa3oBuwTUaLyQB8hI1GcFIN4uGN6BbcA25eAEAdxKecO5FA68AAAAASUVORK5CYII=)',
  6419. 'justifyright': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAALElEQVQ4jWNgGEjwn0Iw+Cwa/oBuQTcaR0QDUoOK7KCjm0XDH9At6IZUHAEA8oq+UNVXS0cAAAAASUVORK5CYII=)',
  6420. 'link': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAQCAYAAAAI0W+oAAAAiElEQVQ4je2S3Q2AIAyEHcFRGIERGIERHIERGMURGMUR3ODzwWoqIUZ8MJhwSV96lOvPDUPHbwEEIGXhFG8KfHgjAjADFvDAIjkLjMAq4SU3C/9cTD5IVd3tdQlYawrOztR0d7i8bVLos9UdU0Q59KSOPwJO+EWZIVabQYnl9jWKdwW+TqSjKWyaolPi2Vd/5AAAAABJRU5ErkJggg==)'
  6421. },
  6422. '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=",
  6423. '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==",
  6424. '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=",
  6425. 'expand': "data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAHCAYAAAG3oLd4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw\/eHBhY2tldCBiZWdpbj0i77u\/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OENBNTNFOTYyMUM5MTFFMzgxQ0U4NURBODIyODZFQjEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OENBNTNFOTcyMUM5MTFFMzgxQ0U4NURBODIyODZFQjEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Q0E1M0U5NDIxQzkxMUUzODFDRTg1REE4MjI4NkVCMSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Q0E1M0U5NTIxQzkxMUUzODFDRTg1REE4MjI4NkVCMSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI\/PkXCZdMAAAB7SURBVHjaYrhy5UoUQAAxAIk6gABiBBJODAwMpQABBOIxMAFZiwACCCTEA2R8BmIrFiDxBYjFgPg1QACBZHSBjMsgdQlA\/BDEyARiNpA6LiBmAAgwkJocIN0IxBFAnAzE9iBZkJHdQCwNxBNBNEiwA4jNgHg7EG8CYmcAZrIfR0hmuRcAAAAASUVORK5CYII=",
  6426. 'collapse': "data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAHCAYAAAG3oLd4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw\/eHBhY2tldCBiZWdpbj0i77u\/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjJFQkEwM0YyMUM5MTFFMzgwM0JDNkQ5QzlCNjQ3MUMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjJFQkEwNDAyMUM5MTFFMzgwM0JDNkQ5QzlCNjQ3MUMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCMkVCQTAzRDIxQzkxMUUzODAzQkM2RDlDOUI2NDcxQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCMkVCQTAzRTIxQzkxMUUzODAzQkM2RDlDOUI2NDcxQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI\/Pi65wUkAAAB0SURBVHjaYrhy5QoDQAAxgAiAAGIEEjwMDAxaAAEE4okyAVmvAAIIJOQEZKQBMT9IRAKII4D4FEAAMYK1AQELEH8D4o8g6elA\/AvEWADE8gABBlNjBsTbgXgTEKeD1FcwQEAxEN8E4sMgLV+gEk+BuAiIpQHP\/SBDZEL2QgAAAABJRU5ErkJggg==",
  6427. 'drop': "data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAKCAYAAAEle4U0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw\/eHBhY2tldCBiZWdpbj0i77u\/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjM5REMxOTYyMUM3MTFFM0JBODRGNUVCNzE5NTlBMUUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjM5REMxOTcyMUM3MTFFM0JBODRGNUVCNzE5NTlBMUUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCMzlEQzE5NDIxQzcxMUUzQkE4NEY1RUI3MTk1OUExRSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCMzlEQzE5NTIxQzcxMUUzQkE4NEY1RUI3MTk1OUExRSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI\/Phn5Ps0AAADuSURBVHjaYjh16pTx\/\/\/\/GUCYhQEITp8+DaIYAAKIESQCAkxQUX6AAGKAqQXS3kAMotsBAgiuDAbgAkAt34DURxYkSS4QARBAjCBzTE1Nz8JEgSpVgNQdJIWWTAyYAKSgHYhB5q8D4uMAAQRywTuY67FhFnQjgFaJAqnXUC4bNmteAXEUyA1A\/JMFiwKQ2B8omxebgr8gX8I4AAEGDjZCDiWEsdmC7jFvIDUNiP2B+AKSlDQ0uPYxMRAGR4D4GhCfh4bzalAgAPETIOYE4rnEGPIRiD2hYRAKxCCXNUH5eqCIJOgdYPJA5q6BYhQAAIt8mGSW9QmrAAAAAElFTkSuQmCC",
  6428. 'expandDocument': "data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAAEhyb7BAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw\/eHBhY2tldCBiZWdpbj0i77u\/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RkMwNUExQzUyRUU4MTFFMzg3NTJCREMxQTk3RTE1MDYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RkMwNUExQzYyRUU4MTFFMzg3NTJCREMxQTk3RTE1MDYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGQzA1QTFDMzJFRTgxMUUzODc1MkJEQzFBOTdFMTUwNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGQzA1QTFDNDJFRTgxMUUzODc1MkJEQzFBOTdFMTUwNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI\/PgfANO8AAADLSURBVHjaYvz\/\/z8DEIAJJiCeCcSMIA4jsgxAAME5TFARRiaouv8AAQSTQgZgZRgAIIBQTAQBFmRJmAP+wzgwAUZkM2Ba4GYABBC69f\/RdSA7ZzKyZfich1UBskmM6O5ABgABhM1NGAA9iD5CTUXGDEwMRACiHf4fn3tg1k3BF0awKMgF4hfEuAkGPgCxALqbiAongADDlr4YCHmEHIM+YnEidgtBBiHhCWh8YjAYwDgz\/yMA2QYhG\/KfDAMxFLdT4iKqBTbdDCIaAAAnZT5x4V7D2wAAAABJRU5ErkJggg==",
  6429. 'contractDocument': "data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAAEhyb7BAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw\/eHBhY2tldCBiZWdpbj0i77u\/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RUNCOUQ5OUYyRUU4MTFFM0I1MkY5QTdFQTI4NzY0REMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RUNCOUQ5QTAyRUU4MTFFM0I1MkY5QTdFQTI4NzY0REMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFQ0I5RDk5RDJFRTgxMUUzQjUyRjlBN0VBMjg3NjREQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFQ0I5RDk5RTJFRTgxMUUzQjUyRjlBN0VBMjg3NjREQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI\/PgMVm38AAADUSURBVHjaYvwPBAxQwATEjFDMwALEcBmAAGKEKWOCCcAY\/wECCCbFyIAA\/2EmVSMJMgAEECOyXTArkLWBTf+PbC+GChRXgQBAAMEMNWHADc4gG4PuVhTLkcFkbIpYkExgxGUfQABheBSXSQyEHI4tcNEBPLBxOhrZOpi7OIE4BZvDGQiE03\/kcMLpLib0eCLGTVgBQIARFZjEABZi3E0A\/MfIJoTCHb9xQJ+hYRiYiUUOp3psBvwn0TAMg5Al2ol0Ddwg5HzKSEmgMzFQCbCgRyO5AABZbenazpGa4wAAAABJRU5ErkJggg==",
  6430. 'arrowLeft': "data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAALCAYAAAE8d1zJAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw\/eHBhY2tldCBiZWdpbj0i77u\/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Q0NDMTZCMEQyRTAxMTFFM0FCOUVDMjExNEU2NDMwOTQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Q0NDMTZCMEUyRTAxMTFFM0FCOUVDMjExNEU2NDMwOTQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDQ0MxNkIwQjJFMDExMUUzQUI5RUMyMTE0RTY0MzA5NCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDQ0MxNkIwQzJFMDExMUUzQUI5RUMyMTE0RTY0MzA5NCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI\/PgV0+agAAADOSURBVHjaYlyxYgUDCDAxQAFAADGAREC8RoAAYoTK\/QcRAAEE40gA8QuQ9BMgfg6SBXFkoHoZAQIIpgwE6kCGgARBHBao4HOoGXCDYRZLQlXKQGlGgABCNgoEVID4DqpTGRj+ALE6jAOSsIGaywzEW6DsDyAJNgYsACSxD8l1PlDLBWB2\/IUK3IHpAAgwdFfBgBMQLwXiFCDeiizBgsQWhSpyRRLbgmbQR5AGXSA+g8vR2DxxGYjZoaG4jxgNMPACiJ2hnnQD4tdIoQDDAgDdNimjM3GYdAAAAABJRU5ErkJggg==",
  6431. 'arrowRight': "data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAALCAYAAAE8d1zJAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw\/eHBhY2tldCBiZWdpbj0i77u\/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTEyMTUyQkMyRTAxMTFFMzk2OThFRTA1MDBFRkVGQkUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTEyMTUyQkQyRTAxMTFFMzk2OThFRTA1MDBFRkVGQkUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFMTIxNTJCQTJFMDExMUUzOTY5OEVFMDUwMEVGRUZCRSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFMTIxNTJCQjJFMDExMUUzOTY5OEVFMDUwMEVGRUZCRSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI\/PhpmJE8AAADMSURBVHjaYlyxYgUDCDAxQAAzQAAxAEVUQDx1gABiBLI+ABn8IHGAAGKEKYQp\/g\/FNiAOI1TiCEAAISvzBuKNQMzCACXghkEBSLszSEIAKqAOxDdhsgABhGyUBBC\/QLYdBp4DcR02Z4FAIxA\/QdfBAPcoVIIRyf1NQCwJcy4MyADxUxgHIMBQwgHJo3OAOBqI96FLMkE9\/h8Jb4F6aS+UvwuIRbF5DxdwBeJXQPwTiHWJ0bAP6jF2IL7MBA1yRiTsA8SvgdgNyndGDnEARs4t\/52DDUYAAAAASUVORK5CYII="
  6432. }
  6433. }
  6434. });
  6435. }
  6436. function initialize_zmail()
  6437. {
  6438. console.log('zmail: ' + 'zmail retrying...');
  6439. if (typeof qx != 'undefined' && typeof qx.core != 'undefined' && typeof qx.core.Init != 'undefined' && typeof ClientLib != 'undefined' && typeof webfrontend != 'undefined' && typeof phe != 'undefined')
  6440. {
  6441. var app = qx.core.Init.getApplication();
  6442. if (app.initDone == true)
  6443. {
  6444. try
  6445. {
  6446. var isDefined = function(a){return (typeof a == 'undefined') ? false : true};
  6447. var data = ClientLib.Data.MainData.GetInstance();
  6448. var net = ClientLib.Net.CommunicationManager.GetInstance();
  6449. if (isDefined(data) && isDefined(net))
  6450. {
  6451. var alliance = data.get_Alliance();
  6452. var player = data.get_Player();
  6453. var mail = data.get_Mail();
  6454. if (isDefined(alliance) && isDefined(player) && isDefined(mail) && isDefined(alliance.get_Exists()) && isDefined(alliance.get_Relationships()) && isDefined(player.get_Name()) && player.get_Name() != '')
  6455. {
  6456. try
  6457. {
  6458. console.log('zmail: ' + 'initializing zmail');
  6459. createClass();
  6460. zmail.data.getInstance();
  6461. }
  6462. catch(e)
  6463. {
  6464. console.log('zmail: ' + "Zmail script init error:");
  6465. console.log('zmail: ' + e.toString());
  6466. }
  6467. }
  6468. else window.setTimeout(initialize_zmail, 10000);
  6469. }
  6470. else window.setTimeout(initialize_zmail, 10000);
  6471. }
  6472. catch(e)
  6473. {
  6474. console.log('zmail: ' + e.toString());
  6475. }
  6476. }
  6477. else window.setTimeout(initialize_zmail, 10000);
  6478. }
  6479. else window.setTimeout(initialize_zmail, 10000);
  6480. };
  6481. window.setTimeout(initialize_zmail, 10000);
  6482. }
  6483.  
  6484. var script = document.createElement("script");
  6485. var txt = injectFunction.toString();
  6486. script.innerHTML = "(" + txt + ")();";
  6487. script.type = "text/javascript";
  6488. document.getElementsByTagName("head")[0].appendChild(script);
  6489. })();