Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 
 

674 lignes
19 KiB

  1. ///// CALENDAR
  2. Calendar=function() {
  3. this.views=[];
  4. this.events = {};
  5. this.has_event = {};
  6. this.weekdays = new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
  7. }
  8. Calendar.prototype.init=function (parent) {
  9. this.wrapper = $a(parent, 'div', 'cal_wrapper');
  10. this.page_head = new PageHeader(this.wrapper,'Calendar')
  11. this.body = $a(this.wrapper, 'div', 'cal_body');
  12. this.make_head_buttons();
  13. this.make_header();
  14. this.todays_date = new Date();
  15. this.selected_date = this.todays_date;
  16. this.selected_hour = 8;
  17. // Create views
  18. this.views['Month'] = new Calendar.MonthView(this);
  19. this.views['Week'] = new Calendar.WeekView(this);
  20. this.views['Day'] = new Calendar.DayView(this);
  21. // Month view as initial
  22. this.cur_view = this.views['Day'];
  23. this.views['Day'].show();
  24. setTimeout(_c.set_height, 100);
  25. set_resize_observer(_c.set_height);
  26. }
  27. Calendar.prototype.rename_notify = function(dt, old_name, new_name) {
  28. // calendar
  29. if(dt = 'Event' && this.has_event[old_name])
  30. this.has_event[old_name] = false;
  31. }
  32. _c.set_height = function() {
  33. // calculate heights
  34. var cal_body_h = get_window_height() - _c.calendar.page_head.wrapper.offsetHeight - 32;
  35. var cal_view_body_h = cal_body_h - _c.calendar.view_header.offsetHeight - 32;
  36. var header_h = _c.calendar.cur_view.head_wrapper ? _c.calendar.cur_view.head_wrapper.offsetHeight : 0;
  37. var cal_view_main_h = cal_view_body_h - header_h;
  38. // set heights
  39. $y(_c.calendar.body, {height:cal_body_h + 'px'})
  40. $y(_c.calendar.cur_view.body, {height:cal_view_body_h + 'px'})
  41. $y(_c.calendar.cur_view.main, {height:cal_view_main_h + 'px', overflow:'auto'})
  42. }
  43. //------------------------------------------------------
  44. Calendar.prototype.make_header = function() {
  45. var me = this;
  46. this.view_header = $a(this.body, 'div', 'cal_month_head', {paddingTop:'8px'});
  47. var tab = make_table(this.view_header, 1, 3, '50%', ['100px', null, '100px'], {verticalAlign:'middle'});
  48. $y(tab, {margin:'auto'});
  49. var lbtn = $btn($td(tab, 0, 0),'< Prev', function() { me.cur_view.prev() });
  50. var rbtn = $btn($td(tab, 0, 2),'Next >', function() { me.cur_view.next() });
  51. $y($td(tab, 0, 1), {fontSize:'16px', textAlign:'center'})
  52. this.view_title = $td(tab, 0, 1);
  53. }
  54. //------------------------------------------------------
  55. Calendar.prototype.make_head_buttons = function() {
  56. var me = this;
  57. this.page_head.add_button('New Event', function() { me.add_event(); }, 0, 'ui-icon-plus', 1);
  58. this.page_head.add_button('Month View', function() { me.refresh('Month'); }, 0, 'ui-icon-calculator');
  59. this.page_head.add_button('Weekly View',function() { me.refresh('Week'); }, 0, 'ui-icon-note');
  60. this.page_head.add_button('Daily View', function() { me.refresh('Day'); }, 0, 'ui-icon-calendar');
  61. }
  62. //------------------------------------------------------
  63. Calendar.prototype.show_event = function(ev, cal_ev) {
  64. var me = this;
  65. if(!this.event_dialog) {
  66. var d = new Dialog(400, 400, 'Calendar Event');
  67. d.make_body([
  68. ['HTML','Heading']
  69. ,['Text','Description']
  70. ,['Check', 'Public Event']
  71. ,['Check', 'Cancel Event']
  72. ,['HTML', 'Event Link']
  73. ,['Button', 'Save']
  74. ])
  75. // show the event when the dialog opens
  76. d.onshow = function() {
  77. // heading
  78. var c = me.selected_date;
  79. var tmp = time_to_ampm(this.ev.event_hour);
  80. tmp = tmp[0]+':'+tmp[1]+' '+tmp[2];
  81. this.widgets['Heading'].innerHTML =
  82. '<div style="text-align: center; padding:4px; font-size: 14px">'
  83. + _c.calendar.weekdays[c.getDay()] + ', ' + c.getDate() + ' ' + month_list_full[c.getMonth()] + ' ' + c.getFullYear()
  84. + ' - <b>'+tmp+'</b></div>';
  85. // set
  86. this.widgets['Description'].value = cstr(this.ev.description);
  87. this.widgets['Public Event'].checked = false;
  88. this.widgets['Cancel Event'].checked = false;
  89. if(this.ev.event_type=='Public')
  90. this.widgets['Public Event'].checked = true;
  91. this.widgets['Event Link'].innerHTML = '';
  92. // link
  93. var div = $a(this.widgets['Event Link'], 'div', 'link_type', {margin:'4px 0px'});
  94. div.onclick = function() { me.event_dialog.hide(); loaddoc('Event', me.event_dialog.ev.name); }
  95. div.innerHTML = 'View Event details, add or edit participants';
  96. }
  97. // event save
  98. d.widgets['Save'].onclick = function() {
  99. var d = me.event_dialog;
  100. // save values
  101. d.ev.description = d.widgets['Description'].value;
  102. if(d.widgets['Cancel Event'].checked) d.ev.event_type='Cancel';
  103. else if(d.widgets['Public Event'].checked) d.ev.event_type='Public';
  104. me.event_dialog.hide();
  105. // if new event
  106. if(d.cal_ev)
  107. var cal_ev = d.cal_ev;
  108. else
  109. var cal_ev = me.set_event(d.ev);
  110. cal_ev.save();
  111. if(me.cur_view)me.cur_view.refresh();
  112. }
  113. this.event_dialog = d;
  114. }
  115. this.event_dialog.ev = ev;
  116. this.event_dialog.cal_ev = cal_ev ? cal_ev : null;
  117. this.event_dialog.show();
  118. }
  119. //------------------------------------------------------
  120. Calendar.prototype.add_event = function() {
  121. var ev = LocalDB.create('Event');
  122. ev = locals['Event'][ev];
  123. ev.event_date = dateutil.obj_to_str(this.selected_date);
  124. ev.event_hour = this.selected_hour+':00';
  125. ev.event_type = 'Private';
  126. this.show_event(ev);
  127. }
  128. //------------------------------------------------------
  129. Calendar.prototype.get_month_events = function(call_back) {
  130. // ret fn
  131. var me = this;
  132. var f = function(r, rt) {
  133. var el = me.get_daily_event_list(new Date());
  134. if($i('today_events_td'))
  135. $i('today_events_td').innerHTML = "Today's Events ("+el.length+")";
  136. if(me.cur_view) me.cur_view.refresh();
  137. if(call_back)call_back();
  138. }
  139. //load
  140. var y=this.selected_date.getFullYear(); var m = this.selected_date.getMonth();
  141. if(!this.events[y] || !this.events[y][m]) {
  142. $c('webnotes.widgets.event.load_month_events', args = {
  143. 'month': m + 1,
  144. 'year' : y},
  145. f);
  146. }
  147. }
  148. //------------------------------------------------------
  149. Calendar.prototype.get_daily_event_list=function(day) {
  150. var el = [];
  151. var d = day.getDate(); var m = day.getMonth(); var y = day.getFullYear()
  152. if(this.events[y] && this.events[y][m] &&
  153. this.events[y][m][d]) {
  154. var l = this.events[y][m][d]
  155. for(var i in l) {
  156. for(var j in l[i]) el[el.length] = l[i][j];
  157. }
  158. return el;
  159. }
  160. else return [];
  161. }
  162. //------------------------------------------------------
  163. Calendar.prototype.set_event = function(ev) {
  164. var dt = dateutil.str_to_obj(ev.event_date);
  165. var m = dt.getMonth();
  166. var d = dt.getDate();
  167. var y = dt.getFullYear();
  168. if(!this.events[y]) this.events[y] = [];
  169. if(!this.events[y][m]) this.events[y][m] = [];
  170. if(!this.events[y][m][d]) this.events[y][m][d] = [];
  171. if(!this.events[y][m][d][cint(cint(ev.event_hour))]) this.events[y][m][d][cint(ev.event_hour)] = [];
  172. var l = this.events[y][m][d][cint(ev.event_hour)];
  173. var cal_ev = new Calendar.CalEvent(ev, this);
  174. l[l.length] = cal_ev;
  175. this.has_event[ev.name] = true;
  176. return cal_ev;
  177. }
  178. //------------------------------------------------------
  179. Calendar.prototype.refresh = function(viewtype){//Sets the viewtype of the Calendar and Calls the View class based on the viewtype
  180. if(viewtype)
  181. this.viewtype = viewtype;
  182. // switch view if reqd
  183. if(this.cur_view.viewtype!=this.viewtype) {
  184. this.cur_view.hide();
  185. this.cur_view = this.views[this.viewtype];
  186. this.cur_view.in_home = false; // for home page
  187. this.cur_view.show();
  188. }
  189. else{
  190. this.cur_view.refresh(this);
  191. }
  192. _c.set_height();
  193. }
  194. //------------------------------------------------------
  195. Calendar.CalEvent= function(doc, cal) {
  196. this.body = document.createElement('div');
  197. var v = locals['Event'][doc.name].description;
  198. if(v==null)v='';
  199. this.body.innerHTML = v;
  200. this.doc = doc;
  201. var me = this;
  202. this.body.onclick = function() {
  203. if(me.doc.name) {
  204. cal.show_event(me.doc, me);
  205. }
  206. }
  207. }
  208. Calendar.CalEvent.prototype.show = function(vu) {
  209. var t = this.doc.event_type;
  210. this.my_class = 'cal_event cal_event_'+ t;
  211. if(this.body.parentNode)
  212. this.body.parentNode.removeChild(this.body);
  213. vu.body.appendChild(this.body);
  214. // refresh
  215. var v = this.doc.description;
  216. if(v==null)v='';
  217. this.body.innerHTML = v;
  218. this.body.className = this.my_class;
  219. }
  220. Calendar.CalEvent.prototype.save = function() {
  221. var me = this;
  222. save_doclist('Event', me.doc.name, 'Save', function(r) {
  223. me.doc = locals['Event'][r.docname];
  224. _c.calendar.has_event[r.docname] = true;
  225. } );
  226. }
  227. // ----------
  228. Calendar.View =function() { this.daystep = 0; this.monthstep = 0; }
  229. Calendar.View.prototype.init=function(cal) {
  230. this.cal = cal;
  231. this.body = $a(cal.body, 'div', 'cal_view_body');
  232. this.body.style.display = 'none';
  233. this.create_table();
  234. }
  235. Calendar.View.prototype.show=function() {
  236. this.get_events(); this.refresh(); this.body.style.display = 'block';
  237. }
  238. Calendar.View.prototype.hide=function() { this.body.style.display = 'none';}
  239. Calendar.View.prototype.next = function() {
  240. var s = this.cal.selected_date;
  241. this.cal.selected_date = new Date(s.getFullYear(), s.getMonth() + this.monthstep, s.getDate() + this.daystep);
  242. this.get_events(); this.refresh();
  243. }
  244. Calendar.View.prototype.prev = function() {
  245. var s = this.cal.selected_date;
  246. this.cal.selected_date = new Date(s.getFullYear(), s.getMonth() - this.monthstep, s.getDate() - this.daystep);
  247. this.get_events(); this.refresh();
  248. }
  249. Calendar.View.prototype.get_events = function() { this.cal.get_month_events(); }
  250. Calendar.View.prototype.add_unit = function(vu) { this.viewunits[this.viewunits.length] = vu; }
  251. Calendar.View.prototype.refresh_units = function() {
  252. if(isIE)_c.calendar.cur_view.refresh_units_main();
  253. else setTimeout('_c.calendar.cur_view.refresh_units_main()', 2); /* FF BUG */
  254. }
  255. Calendar.View.prototype.refresh_units_main = function() {
  256. for(var r in this.table.rows)
  257. for(var c in this.table.rows[r].cells)
  258. if(this.table.rows[r].cells[c].viewunit) this.table.rows[r].cells[c].viewunit.refresh();
  259. }
  260. // ................. Month View..........................
  261. Calendar.MonthView = function(cal) { this.init(cal); this.monthstep = 1; this.rows = 5; this.cells = 7; }
  262. Calendar.MonthView.prototype=new Calendar.View();
  263. Calendar.MonthView.prototype.create_table = function() {
  264. // create head
  265. this.head_wrapper = $a(this.body, 'div', 'cal_month_head');
  266. // create headers
  267. this.headtable = $a(this.head_wrapper, 'table', 'cal_month_headtable');
  268. var r = this.headtable.insertRow(0);
  269. for(var j=0;j<7;j++) {
  270. var cell = r.insertCell(j);
  271. cell.innerHTML = _c.calendar.weekdays[j]; $w(cell, (100 / 7) + '%');
  272. }
  273. this.main = $a(this.body, 'div', 'cal_month_body');
  274. this.table = $a(this.main, 'table', 'cal_month_table');
  275. var me = this;
  276. // create body
  277. for(var i=0;i<5;i++) {
  278. var r = this.table.insertRow(i);
  279. for(var j=0;j<7;j++) {
  280. var cell = r.insertCell(j);
  281. cell.viewunit = new Calendar.MonthViewUnit(cell);
  282. }
  283. }
  284. }
  285. Calendar.MonthView.prototype.refresh = function() {
  286. var c =this.cal.selected_date;
  287. var me=this;
  288. // fill other days
  289. var cur_row = 0;
  290. var cur_month = c.getMonth();
  291. var cur_year = c.getFullYear();
  292. var d = new Date(cur_year, cur_month, 1);
  293. var day = 1 - d.getDay();
  294. // set day headers
  295. var d = new Date(cur_year, cur_month, day);
  296. this.cal.view_title.innerHTML = month_list_full[cur_month] + ' ' + cur_year;
  297. for(var i=0;i<6;i++) {
  298. if((i<5) || cur_month==d.getMonth()) { // if this month
  299. for(var j=0;j<7;j++) {
  300. var cell = this.table.rows[cur_row].cells[j];
  301. if((i<5) || cur_month==d.getMonth()) { // if this month
  302. cell.viewunit.day = d;
  303. cell.viewunit.hour = 8;
  304. if(cur_month == d.getMonth()) {
  305. cell.viewunit.is_disabled = false;
  306. if(same_day(this.cal.todays_date, d))
  307. cell.viewunit.is_today = true;
  308. else
  309. cell.viewunit.is_today = false;
  310. } else {
  311. cell.viewunit.is_disabled = true;
  312. }
  313. }
  314. // new date
  315. day++;
  316. d = new Date(cur_year, cur_month, day);
  317. }
  318. }
  319. cur_row++;
  320. if(cur_row == 5) {cur_row = 0;} // back to top
  321. }
  322. this.refresh_units();
  323. }
  324. // ................. Daily View..........................
  325. Calendar.DayView=function(cal){ this.init(cal); this.daystep = 1; }
  326. Calendar.DayView.prototype=new Calendar.View();
  327. Calendar.DayView.prototype.create_table = function() {
  328. // create body
  329. this.main = $a(this.body, 'div', 'cal_day_body');
  330. this.table = $a(this.main, 'table', 'cal_day_table');
  331. var me = this;
  332. for(var i=0;i<12;i++) {
  333. var r = this.table.insertRow(i);
  334. for(var j=0;j<2;j++) {
  335. var cell = r.insertCell(j);
  336. if(j==0) {
  337. var tmp = time_to_ampm((i*2)+':00');
  338. cell.innerHTML = tmp[0]+':'+tmp[1]+' '+tmp[2];
  339. $w(cell, '10%');
  340. } else {
  341. cell.viewunit = new Calendar.DayViewUnit(cell);
  342. cell.viewunit.hour = i*2;
  343. $w(cell, '90%');
  344. if((i>=4)&&(i<=10)) {
  345. cell.viewunit.is_daytime = true;
  346. }
  347. }
  348. }
  349. }
  350. }
  351. Calendar.DayView.prototype.refresh = function() {
  352. var c =this.cal.selected_date;
  353. // fill other days
  354. var me=this;
  355. this.cal.view_title.innerHTML = _c.calendar.weekdays[c.getDay()] + ', ' + c.getDate() + ' ' + month_list_full[c.getMonth()] + ' ' + c.getFullYear();
  356. // headers
  357. var d = c;
  358. for(var i=0;i<12;i++) {
  359. var cell = this.table.rows[i].cells[1];
  360. if(same_day(this.cal.todays_date, d)) cell.viewunit.is_today = true;
  361. else cell.viewunit.is_today = false;
  362. cell.viewunit.day = d;
  363. //cell.viewunit.refresh();
  364. }
  365. this.refresh_units();
  366. }
  367. // ................. Weekly View..........................
  368. Calendar.WeekView=function(cal) { this.init(cal); this.daystep = 7; }
  369. Calendar.WeekView.prototype=new Calendar.View();
  370. Calendar.WeekView.prototype.create_table = function() {
  371. // create head
  372. this.head_wrapper = $a(this.body, 'div', 'cal_month_head');
  373. // day headers
  374. this.headtable = $a(this.head_wrapper, 'table', 'cal_month_headtable');
  375. var r = this.headtable.insertRow(0);
  376. for(var j=0;j<8;j++) {
  377. var cell = r.insertCell(j);
  378. $w(cell, (100 / 8) + '%');
  379. }
  380. // hour header
  381. // create body
  382. this.main = $a(this.body, 'div', 'cal_week_body');
  383. this.table = $a(this.main, 'table', 'cal_week_table');
  384. var me = this;
  385. for(var i=0;i<12;i++) {
  386. var r = this.table.insertRow(i);
  387. for(var j=0;j<8;j++) {
  388. var cell = r.insertCell(j);
  389. if(j==0) {
  390. var tmp = time_to_ampm((i*2)+':00');
  391. cell.innerHTML = tmp[0]+':'+tmp[1]+' '+tmp[2];
  392. $w(cell, '10%');
  393. } else {
  394. cell.viewunit = new Calendar.WeekViewUnit(cell);
  395. cell.viewunit.hour = i*2;
  396. if((i>=4)&&(i<=10)) {
  397. cell.viewunit.is_daytime = true;
  398. }
  399. }
  400. }
  401. }
  402. }
  403. Calendar.WeekView.prototype.refresh = function() {
  404. var c =this.cal.selected_date;
  405. // fill other days
  406. var me=this;
  407. this.cal.view_title.innerHTML = month_list_full[c.getMonth()] + ' ' + c.getFullYear();
  408. // headers
  409. var d = new Date(c.getFullYear(), c.getMonth(), c.getDate() - c.getDay());
  410. for (var k=1;k<8;k++) {
  411. this.headtable.rows[0].cells[k].innerHTML = _c.calendar.weekdays[d.getDay()] + ' ' + d.getDate();
  412. for(var i=0;i<12;i++) {
  413. var cell = this.table.rows[i].cells[k];
  414. if(same_day(this.cal.todays_date, d)) cell.viewunit.is_today = true;
  415. else cell.viewunit.is_today = false;
  416. cell.viewunit.day = d;
  417. //cell.viewunit.refresh();
  418. }
  419. d=new Date(d.getFullYear(),d.getMonth(),d.getDate() + 1);
  420. }
  421. this.refresh_units();
  422. }
  423. //------------------------------------------------------.
  424. Calendar.ViewUnit = function() {}
  425. Calendar.ViewUnit.prototype.init = function(parent) {
  426. parent.style.border = "1px solid #CCC" ;
  427. this.body = $a(parent, 'div', this.default_class);
  428. this.parent = parent;
  429. var me = this;
  430. this.body.onclick = function() {
  431. _c.calendar.selected_date = me.day;
  432. _c.calendar.selected_hour = me.hour;
  433. if(_c.calendar.cur_vu && _c.calendar.cur_vu!=me){
  434. _c.calendar.cur_vu.deselect();
  435. me.select();
  436. _c.calendar.cur_vu = me;
  437. }
  438. }
  439. this.body.ondblclick = function() {
  440. _c.calendar.add_event();
  441. }
  442. }
  443. Calendar.ViewUnit.prototype.set_header=function(v) {
  444. this.header.innerHTML = v;
  445. }
  446. Calendar.ViewUnit.prototype.set_today = function() {
  447. this.is_today = true;
  448. this.set_display();
  449. }
  450. Calendar.ViewUnit.prototype.clear = function() {
  451. if(this.header)this.header.innerHTML = '';
  452. // clear body
  453. while(this.body.childNodes.length)
  454. this.body.removeChild(this.body.childNodes[0]);
  455. }
  456. Calendar.ViewUnit.prototype.set_display = function() {
  457. var cn = '#FFF';
  458. // colors
  459. var col_tod_sel = '#EEE';
  460. var col_tod = '#FFF';
  461. var col_sel = '#EEF';
  462. if(this.is_today) {
  463. if(this.selected) cn = col_tod_sel;
  464. else cn = col_tod;
  465. } else
  466. if(this.selected) cn = col_sel;
  467. if(this.header) {
  468. if(this.is_disabled) {
  469. this.body.className = this.default_class + ' cal_vu_disabled';
  470. this.header.style.color = '#BBB';
  471. } else {
  472. this.body.className = this.default_class;
  473. this.header.style.color = '#000';
  474. }
  475. if(this.day&&this.day.getDay()==0)
  476. this.header.style.backgroundColor = '#FEE';
  477. else
  478. this.header.style.backgroundColor = '';
  479. }
  480. this.parent.style.backgroundColor = cn;
  481. }
  482. Calendar.ViewUnit.prototype.is_selected = function() {
  483. return (same_day(this.day, _c.calendar.selected_date)&&this.hour==_c.calendar.selected_hour)
  484. }
  485. Calendar.ViewUnit.prototype.get_event_list = function() {
  486. var y = this.day.getFullYear();
  487. var m = this.day.getMonth();
  488. var d = this.day.getDate();
  489. if(_c.calendar.events[y] && _c.calendar.events[y][m] &&
  490. _c.calendar.events[y][m][d] &&
  491. _c.calendar.events[y][m][d][this.hour]) {
  492. return _c.calendar.events[y][m][d][this.hour];
  493. } else
  494. return [];
  495. }
  496. Calendar.ViewUnit.prototype.refresh = function() {
  497. this.clear();
  498. if(this.is_selected()) {
  499. if(_c.calendar.cur_vu)_c.calendar.cur_vu.deselect();
  500. this.selected = true;
  501. _c.calendar.cur_vu = this;
  502. }
  503. this.set_display();
  504. this.el = this.get_event_list();
  505. if(this.onrefresh)this.onrefresh();
  506. for(var i in this.el) {
  507. this.el[i].show(this);
  508. }
  509. var me = this;
  510. }
  511. Calendar.ViewUnit.prototype.select=function() { this.selected = true; this.set_display(); }
  512. Calendar.ViewUnit.prototype.deselect=function() { this.selected = false; this.set_display(); }
  513. Calendar.ViewUnit.prototype.setevent=function() { }
  514. Calendar.MonthViewUnit=function(parent) {
  515. this.header = $a(parent, 'div' , "cal_month_date");
  516. this.default_class = "cal_month_unit";
  517. this.init(parent);
  518. this.onrefresh = function() {
  519. this.header.innerHTML = this.day.getDate();
  520. }
  521. }
  522. Calendar.MonthViewUnit.prototype = new Calendar.ViewUnit();
  523. Calendar.MonthViewUnit.prototype.is_selected = function() {
  524. return same_day(this.day, _c.calendar.selected_date)
  525. }
  526. Calendar.MonthViewUnit.prototype.get_event_list = function() {
  527. return _c.calendar.get_daily_event_list(this.day);
  528. }
  529. Calendar.DayViewUnit= function(parent) { this.default_class = "cal_day_unit"; this.init(parent); }
  530. Calendar.DayViewUnit.prototype = new Calendar.ViewUnit();
  531. Calendar.DayViewUnit.prototype.onrefresh = function() {
  532. if(this.el.length<3) this.body.style.height = '30px';
  533. else this.body.style.height = '';
  534. }
  535. Calendar.WeekViewUnit=function(parent) { this.default_class = "cal_week_unit"; this.init(parent); }
  536. Calendar.WeekViewUnit.prototype = new Calendar.ViewUnit();
  537. Calendar.WeekViewUnit.prototype.onrefresh = function() {
  538. if(this.el.length<3) this.body.style.height = '30px';
  539. else this.body.style.height = '';
  540. }