calendar.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935
  1. // <script>
  2. /*
  3. =============================================================
  4. WebIntelligence(r) Report Panel
  5. Copyright(c) 2001-2003 Business Objects S.A.
  6. All rights reserved
  7. Use and support of this software is governed by the terms
  8. and conditions of the software license agreement and support
  9. policy of Business Objects S.A. and/or its subsidiaries.
  10. The Business Objects products and technology are protected
  11. by the US patent number 5,555,403 and 6,247,008
  12. File: calendar.js
  13. palette.js, menu.js and dom.js must also be included before
  14. =============================================================
  15. */
  16. _firstWeekDay=0
  17. _dateObj=new Date
  18. // ================================================================================
  19. // ================================================================================
  20. //
  21. // OBJECT newCalendarTextField (Constructor)
  22. //
  23. // creates a calendar text field and button widget
  24. //
  25. // ================================================================================
  26. // ================================================================================
  27. function newCalendarTextFieldButton(id,textId,changeCB,maxChar,keyUpCB,enterCB,noMargin,tooltip,width,focusCB,blurCB,format,arrDays,arrMonth,AM,PM)
  28. {
  29. var o=newWidget(id)
  30. o.changeCB=changeCB
  31. o.keyUpCB=keyUpCB
  32. o.enterCB=enterCB
  33. o.focusCB=focusCB
  34. o.blurCB=blurCB
  35. o.getValue=CTFB_getValue
  36. o.setValue=CTFB_setValue
  37. o.width=width?width:150
  38. o.setFormatInfo=CTFB_setFormatInfo
  39. o.setFormatInfo(format,arrDays,arrMonth,AM,PM)
  40. o.widResize=o.resize
  41. o.resize=CTFB_resize
  42. o.text=newTextFieldWidget(textId?textId:"text_"+id,CTFB_changeCB,maxChar,CTFB_keyUpCB,CTFB_enterCB,noMargin,tooltip,width-22,CTFB_focusCB,CTFB_blurCB)
  43. o.text.ctfb=o
  44. o.calendar=newCalendarButton("calendar_"+id,CTFB_CalendarChangeCB)
  45. o.calendar.ctfb=o
  46. o.calendar.menu.alignLeft=true
  47. o.getHTML=CTFB_getHTML
  48. o.oldInit=o.init
  49. o.init=CTFB_init
  50. o.setDateValueFromString=CTFB_setDateValueFromString
  51. o.setStringFromDateValue=CTFB_setStringFromDateValue
  52. return o
  53. }
  54. // ================================================================================
  55. function CTFB_setFormatInfo(format,arrDays,arrMonth,AM,PM)
  56. {
  57. var o=this
  58. o.arrMonthNames=arrMonth?arrMonth:_month
  59. o.arrDayNames=arrDays?arrDays:_day
  60. o.format=format?format:"MM/dd/yyyy hh:mm:ss a"
  61. o.AM=AM?AM:_AM
  62. o.PM=PM?PM:_PM
  63. }
  64. // ================================================================================
  65. function CTFB_resize(w,h)
  66. {
  67. var o=this
  68. o.text.resize(w!=null?(Math.max(0,w-22)):null,h)
  69. o.widResize(w,h)
  70. }
  71. // ================================================================================
  72. function CTFB_getHTML()
  73. {
  74. var o=this
  75. return '<table cellpadding="0" border="0" cellspacing="0" id="'+o.id+'" style="width:'+o.width+'px"><tr valign="middle"><td width="100%">'+o.text.getHTML()+'</td><td>'+o.calendar.getHTML()+'</td></tr></table>'
  76. }
  77. // ================================================================================
  78. function CTFB_init()
  79. {
  80. var o=this
  81. o.oldInit()
  82. o.text.init()
  83. o.calendar.init()
  84. }
  85. // ================================================================================
  86. function CTFB_changeCB()
  87. // PRIVATE
  88. {
  89. if (this.ctfb.changeCB) this.ctfb.changeCB()
  90. }
  91. // ================================================================================
  92. function CTFB_keyUpCB()
  93. // PRIVATE
  94. {
  95. if (this.ctfb.keyUpCB) this.ctfb.keyUpCB()
  96. }
  97. // ================================================================================
  98. function CTFB_enterCB()
  99. // PRIVATE
  100. {
  101. if (this.ctfb.enterCB) this.ctfb.enterCB()
  102. }
  103. // ================================================================================
  104. function CTFB_focusCB()
  105. // PRIVATE
  106. {
  107. if (this.ctfb.focusCB) this.ctfb.focusCB()
  108. }
  109. // ================================================================================
  110. function CTFB_blurCB()
  111. // PRIVATE
  112. {
  113. if (this.ctfb.blurCB) this.ctfb.blurCB()
  114. }
  115. // ================================================================================
  116. function CTFB_getValue()
  117. {
  118. return this.text.getValue()
  119. }
  120. // ================================================================================
  121. function CTFB_setValue(v)
  122. {
  123. this.text.setValue(v)
  124. }
  125. // ================================================================================
  126. function CTFB_CalendarChangeCB()
  127. // PRIVATE
  128. {
  129. var c=this,o=c.ctfb
  130. o.setStringFromDateValue()
  131. var v=c.get()
  132. if (o.changeCB)
  133. o.changeCB()
  134. }
  135. // ================================================================================
  136. function CTFB_setDateValueFromString()
  137. {
  138. var o=this
  139. var strDateValue=o.getValue()
  140. var strInputFormat=o.format
  141. var strRet = setDateValue(strDateValue, strInputFormat);
  142. if(strRet == ",,")
  143. o.calendar.menu.setToday(true);
  144. else
  145. {
  146. var arr = strRet.split(",");//strRet = strMonth + ',' + strDay + ',' + strYear;
  147. var strDay=arr[1],strMonth=arr[0],strYear=arr[2];
  148. o.calendar.set(parseInt(strDay), parseInt(strMonth), parseInt(strYear))
  149. o.calendar.menu.update()
  150. }
  151. }
  152. // ================================================================================
  153. function CTFB_setStringFromDateValue() {
  154. var o=this
  155. var format=""+o.format
  156. var date=_dateObj
  157. var menu=o.calendar.menu
  158. //date.setDate(menu.day+1)
  159. date.setYear(menu.year)
  160. date.setMonth(menu.month)
  161. date.setDate(menu.day+1)
  162. date.setHours(0)
  163. date.setMinutes(0)
  164. date.setSeconds(0)
  165. var result=formatDate(date,format);
  166. o.setValue(result)
  167. }
  168. // ================================================================================
  169. // ================================================================================
  170. //
  171. // OBJECT newCalendarButton (Constructor)
  172. //
  173. // creates a calendar button widget
  174. //
  175. // ================================================================================
  176. // ================================================================================
  177. function newCalendarButton(id,changeCB)
  178. // CONSTRUCTOR
  179. {
  180. var o=newIconWidget(id,_skin+"menus.gif",IconCalendarMenuWidget_ClickCB,null,_openCalendarLab,16,16,0,114,0,114)
  181. o.setClasses("iconhover", "iconcheck", "iconhover", "iconcheckhover")
  182. o.changeCB=changeCB
  183. o.menu=newCalendarMenuWidget("iconMenu_menu_"+id,IconCalendarMenuWidget_hideCB,IconCalendarMenuWidget_closeCB)
  184. o.menu.parCalendar=o
  185. o.set=CalendarButton_set
  186. o.get=CalendarButton_get
  187. o.getMenu=IconMenuWidget_getMenu
  188. return o
  189. }
  190. // ================================================================================
  191. // ================================================================================
  192. //
  193. // OBJECT newCalendarIconButton (Constructor)
  194. //
  195. // creates a calendar icon button widget
  196. //
  197. // ================================================================================
  198. // ================================================================================
  199. function newCalendarIconButton(id,src,changeCB,text,alt,w,h,dx,dy,disDx,disDy)
  200. // CONSTRUCTOR
  201. {
  202. var o=newIconMenuWidget(id,src,IconCalendarMenuWidget_ClickCB,text,_openCalendarLab,w,h,dx,dy,disDx,disDy,false)
  203. o.changeCB=changeCB
  204. o.menu=newCalendarMenuWidget("iconMenu_menu_"+id,IconCalendarMenuWidget_hideCB,IconMenuCalendarMenuWidget_closeCB)
  205. o.menu.parCalendar=o
  206. o.set=CalendarButton_set
  207. o.get=CalendarButton_get
  208. o.getMenu=IconMenuWidget_getMenu
  209. return o
  210. }
  211. function IconMenuCalendarMenuWidget_closeCB()
  212. {
  213. var menu=this,o=menu.parCalendar
  214. o.outEnable=true
  215. if (!o.menu.isShown())
  216. {
  217. IconWidget_outCB(o.icon.index)
  218. IconWidget_outCB(o.arrow.index)
  219. }
  220. else
  221. {
  222. IconWidget_overCB(o.icon.index)
  223. IconWidget_overCB(o.arrow.index)
  224. }
  225. }
  226. // ================================================================================
  227. function IconCalendarMenuWidget_ClickCB()
  228. {
  229. var o=this,l=o.layer
  230. o.outEnable=false
  231. if (o.ctfb)
  232. o.ctfb.setDateValueFromString()
  233. o.menu.show(true,getPosScrolled(l).x + (o.menu.alignLeft?o.getWidth():0) ,getPosScrolled(l).y+o.getHeight()+1)
  234. IconWidget_overCB(o.index)
  235. }
  236. // ================================================================================
  237. function IconCalendarMenuWidget_hideCB()
  238. {
  239. var o=this.parCalendar
  240. if (o.changeCB)
  241. o.changeCB()
  242. }
  243. // ================================================================================
  244. function IconCalendarMenuWidget_closeCB()
  245. {
  246. var menu=this,o=menu.parCalendar
  247. o.outEnable=true
  248. if (!o.menu.isShown())
  249. IconWidget_outCB(o.index)
  250. else
  251. IconWidget_overCB(o.index)
  252. }
  253. // ================================================================================
  254. function CalendarButton_set(day,month,year)
  255. // day [int] 1..31
  256. // month [int] 1..12
  257. // year [int] year
  258. {
  259. var o=this.menu
  260. o.day=day?day-1:0
  261. o.month=month?month-1:0
  262. o.year=year?year:2000
  263. o.day=Math.min(Math.max(o.day,0),30)
  264. o.month=Math.min(Math.max(o.month,0),11)
  265. }
  266. // ================================================================================
  267. function CalendarButton_get(day,month,year)
  268. {
  269. var o=this.menu
  270. return {day:o.day+1,month:o.month+1,year:o.year}
  271. }
  272. // ================================================================================
  273. // ================================================================================
  274. //
  275. // OBJECT newCalendarMenuWidget (Constructor)
  276. //
  277. // creates a calendar menu widget
  278. //
  279. // ================================================================================
  280. // ================================================================================
  281. function newCalendarWidget(id,changeCB)
  282. // id [String] the calendar id for DHTML processing
  283. // Returns [CalendarWidget] the new instance
  284. {
  285. var o=newWidget(id)
  286. // Private Fields
  287. o.day=0
  288. o.month=0
  289. o.year=2000
  290. o.daysL=new Array
  291. o.changeCB=changeCB
  292. var p1=o.p1=newIconWidget(id+"_p1",_skin+'../lov.gif',CalendarWidget_clickCB,"",_calendarPrevMonthLab,8,4,46,12)
  293. var p2=o.p2=newIconWidget(id+"_p2",_skin+'../lov.gif',CalendarWidget_clickCB,"",_calendarPrevYearLab,8,4,46,12)
  294. var n1=o.n1=newIconWidget(id+"_n1",_skin+'../lov.gif',CalendarWidget_clickCB,"",_calendarNextMonthLab,8,4,46,0)
  295. var n2=o.n2=newIconWidget(id+"_n2",_skin+'../lov.gif',CalendarWidget_clickCB,"",_calendarNextYearLab,8,4,46,0)
  296. p1.allowDblClick=true
  297. p2.allowDblClick=true
  298. n1.allowDblClick=true
  299. n2.allowDblClick=true
  300. p1.margin=p2.margin=n1.margin=n2.margin=0
  301. var t=o.today=newButtonWidget(id+"_t",_today,CalendarWidget_clickCB)
  302. t.par=p1.par=p2.par=n1.par=n2.par=o
  303. t.today=p1.p1=p2.p2=n1.n1=n2.n2=true
  304. // Public Methods
  305. o.init=CalendarWidget_init
  306. o.getHTML=CalendarWidget_getHTML
  307. // Private methods
  308. o.update=CalendarWidget_update
  309. o.setToday=CalendarWidget_setToday
  310. o.set=CalendarWidget_set
  311. o.get=CalendarWidget_get
  312. o.focus=CalendarWidget_focus
  313. o.focusOnDay=CalendarWidget_focusOnDay
  314. o.isCalendar=true
  315. return o
  316. }
  317. // ================================================================================
  318. function CalendarWidget_set(day,month,year)
  319. // day [int] 1..31
  320. // month [int] 1..12
  321. // year [int] year
  322. {
  323. var o=this
  324. o.day=day?day-1:0
  325. o.month=month?month-1:0
  326. o.year=year?year:2000
  327. o.day=Math.min(Math.max(o.day,0),30)
  328. o.month=Math.min(Math.max(o.month,0),11)
  329. }
  330. // ================================================================================
  331. function CalendarWidget_get(day,month,year)
  332. {
  333. var o=this
  334. return {day:o.day+1,month:o.month+1,year:o.year}
  335. }
  336. // ================================================================================
  337. function CalendarWidget_init()
  338. // Redefined for disable the default widget init function
  339. // Return [void]
  340. {
  341. var o=this
  342. o.p1.init()
  343. o.p2.init()
  344. o.n1.init()
  345. o.n2.init()
  346. o.today.init()
  347. var l=o.layer=getLayer(o.id)
  348. o.layer._widget=o.widx
  349. o.css=o.layer.style
  350. for (var i=0;i<42;i++)
  351. o.daysL[i]=getElemBySub(l,""+i)
  352. o.update()
  353. }
  354. // ================================================================================
  355. function CalendarWidget_getHTML()
  356. {
  357. var o=this,d=_moz?10:12
  358. var keysCbs=' onkeydown="'+_codeWinName+'.MenuWidget_keyDown(\''+o.id+'\',event);return true" '
  359. var s='<table onmousedown="'+_codeWinName+'._minb(event)" onmouseup="'+_codeWinName+'._minb(event)" '+keysCbs+' style="cursor:default" class="calendarFrame" id="'+o.id+'" border="0" cellpadding="0" cellspacing="0">'+
  360. // Month year zone
  361. '<tr>'+
  362. '<td align="center" style="padding:1px" >'+
  363. '<table class="dialogzone" width="100%" cellpadding="0" border="0" cellspacing="0">'+
  364. '<tr>'+
  365. '<td style="padding-top:1px">'+o.n1.getHTML()+'</td>'+
  366. '<td rowspan="2" width="100%" align="center" class="dialogzone"><span subid="month" tabIndex=0>'+convStr(_month[o.month])+'</span>&nbsp;&nbsp;<span subid="year" tabIndex=0>'+convStr(o.year)+'</span></td>'+
  367. '<td style="padding-top:1px">'+o.n2.getHTML()+'</td>'+
  368. '</tr>'+
  369. '<tr valign="top">'+
  370. '<td style="padding-bottom:1px">'+o.p1.getHTML()+'</td><td style="padding-bottom:1px">'+o.p2.getHTML()+'</td>'+
  371. '</tr>'+
  372. '</table>'+
  373. '</td>'+
  374. '</tr>'
  375. // Days header
  376. s+='<tr><td align="center"><table style="margin:2px;margin-top:6px" cellpadding="0" border="0" cellspacing="0">'
  377. for (var i=0;i<7;i++)
  378. {
  379. var j=(i+_firstWeekDay)%7
  380. if ((j%7)==0) s+='<tr align="center">'
  381. s+='<td class="calendarTextPart">'+_day[j]+'</td>'
  382. if ((j%7)==6) s+='</tr>'
  383. }
  384. s+='<tr><td colspan="7" style="padding:2px;"><table width="100%" height="3" cellpadding="0" cellspacing="0" border="0" style="'+backImgOffset(_skin+"menus.gif",0,80)+';"><tbody><tr><td></td></tr></tbody></table></td></tr>'
  385. // Days
  386. for (var i=0;i<6;i++)
  387. {
  388. s+='<tr align="right">'
  389. for (var j=0;j<7;j++)
  390. {
  391. s+='<td class="calendarTextPart" onmousedown="'+_codeWinName+'.CalendarWidget_mouseDown(this)" onmouseover="'+_codeWinName+'.CalendarWidget_mouseOver(this)" onmouseout="'+_codeWinName+'.CalendarWidget_mouseOut(this)" onkeydown="'+_codeWinName+'.CalendarWidget_keyDown(this,event)">'+
  392. '<div subid="'+(j+(i*7))+'" class="menuCalendar"></div></td>'
  393. }
  394. s+='</tr>'
  395. }
  396. s+='<tr><td colspan="7" style="padding:2px;"><table width="100%" height="3" cellpadding="0" cellspacing="0" border="0" style="'+backImgOffset(_skin+"menus.gif",0,80)+';"><tbody><tr><td></td></tr></tbody></table></td></tr>'
  397. s+='<tr><td colspan="7" align="center" style="padding-bottom=3px;padding-top:3px;">'+o.today.getHTML()+'</td></tr>'
  398. // End menu
  399. s+='</table></td></tr>'
  400. s+='</table>'
  401. return s
  402. }
  403. // ================================================================================
  404. function CalendarWidget_mouseDown(lay)
  405. {
  406. lay=lay.childNodes[0]
  407. var o=getWidget(lay),index=parseInt(lay.getAttribute("subid"))
  408. var day=index-o.dateOffset
  409. if ((day<0)||(day>o.lastDate))
  410. return
  411. o.day=day
  412. o.update()
  413. if (o.changeCB)
  414. o.changeCB()
  415. }
  416. // ================================================================================
  417. function CalendarWidget_clickCB()
  418. // PRIVATE
  419. {
  420. var o=m=this
  421. // Modify current month
  422. if (o.p1||o.n1)
  423. {
  424. m=o.par
  425. m.month=(m.month+(o.p1?-1:1))%12
  426. if (m.month==-1)
  427. m.month=11
  428. m.update()
  429. }
  430. // Modify current year
  431. if (o.p2||o.n2)
  432. {
  433. m=o.par
  434. m.year=m.year+(o.p2?-1:1)
  435. m.update()
  436. }
  437. if (o.today)
  438. {
  439. m=o.par
  440. m.setToday(true)
  441. if (m.changeCB)
  442. m.changeCB()
  443. }
  444. }
  445. // ================================================================================
  446. // ================================================================================
  447. //
  448. // OBJECT newCalendarMenuWidget (Constructor)
  449. //
  450. // creates a calendar menu widget
  451. //
  452. // ================================================================================
  453. // ================================================================================
  454. function newCalendarMenuWidget(id,changeCB,closeCB)
  455. // id [String] the calendar id for DHTML processing
  456. // Returns [CalendarMenuWidget] the new instance
  457. {
  458. var o=newMenuWidget(id,closeCB)
  459. // Private Fields
  460. o.day=0
  461. o.month=0
  462. o.year=2000
  463. o.daysL=new Array
  464. o.changeCB=changeCB
  465. var p1=o.p1=newIconWidget(id+"_p1",_skin+'../lov.gif',CalendarMenuWidget_clickCB,"",_calendarPrevMonthLab,8,4,46,12)
  466. var p2=o.p2=newIconWidget(id+"_p2",_skin+'../lov.gif',CalendarMenuWidget_clickCB,"",_calendarPrevYearLab,8,4,46,12)
  467. var n1=o.n1=newIconWidget(id+"_n1",_skin+'../lov.gif',CalendarMenuWidget_clickCB,"",_calendarNextMonthLab,8,4,46,0)
  468. var n2=o.n2=newIconWidget(id+"_n2",_skin+'../lov.gif',CalendarMenuWidget_clickCB,"",_calendarNextYearLab,8,4,46,0)
  469. p1.allowDblClick=true
  470. p2.allowDblClick=true
  471. n1.allowDblClick=true
  472. n2.allowDblClick=true
  473. p1.margin=p2.margin=n1.margin=n2.margin=0
  474. var t=o.today=newButtonWidget(id+"_t",_today,CalendarMenuWidget_clickCB)
  475. t.par=p1.par=p2.par=n1.par=n2.par=o
  476. t.today=p1.p1=p2.p2=n1.n1=n2.n2=true
  477. // Public Methods
  478. o.getHTML=CalendarMenuWidget_getHTML
  479. o.oldMenuInit=o.justInTimeInit
  480. o.justInTimeInit=CalendarMenuWidget_justInTimeInit
  481. // Private methods
  482. o.update=CalendarWidget_update
  483. o.setToday=CalendarWidget_setToday
  484. o.focus=CalendarWidget_focus
  485. o.focusOnDay=CalendarWidget_focusOnDay
  486. o.isCalendar=true
  487. return o
  488. }
  489. // ================================================================================
  490. function CalendarMenuWidget_justInTimeInit()
  491. {
  492. var o=this
  493. o.oldMenuInit()
  494. o.p1.init()
  495. o.p2.init()
  496. o.n1.init()
  497. o.n2.init()
  498. o.today.init()
  499. var l=o.layer
  500. for (var i=0;i<42;i++)
  501. o.daysL[i]=getElemBySub(l,""+i)
  502. o.update()
  503. }
  504. // ================================================================================
  505. function CalendarMenuWidget_getHTML()
  506. {
  507. var o=this,d=_moz?10:12
  508. var keysCbs=' onkeydown="'+_codeWinName+'.MenuWidget_keyDown(\''+o.id+'\',event);return true" '
  509. //var s=o.getShadowHTML()
  510. var s=''
  511. s+='<a style="position:absolute;left:-30px;top:-30px; visibility:hidden" id="startLink_'+o.id+'" href="javascript:void(0)" onfocus="'+_codeWinName+'.MenuWidget_keepFocus(\''+o.id+'\');return false;" ></a>'
  512. s+='<table onmousedown="'+_codeWinName+'._minb(event)" onmouseup="'+_codeWinName+'._minb(event)" '+keysCbs+' style="cursor:default" class="menuFrame" id="'+o.id+'" border="0" cellpadding="0" cellspacing="0">'+
  513. // Month year zone
  514. '<tr>'+
  515. '<td align="center" style="padding:1px" >'+
  516. '<table class="dialogzone" width="100%" cellpadding="0" border="0" cellspacing="0">'+
  517. '<tr>'+
  518. '<td style="padding-top:1px">'+o.n1.getHTML()+'</td>'+
  519. '<td rowspan="2" width="100%" align="center" class="dialogzone"><span subid="month" tabIndex=0>'+convStr(_month[o.month])+'</span>&nbsp;&nbsp;<span subid="year" tabIndex=0>'+convStr(o.year)+'</span></td>'+
  520. '<td style="padding-top:1px">'+o.n2.getHTML()+'</td>'+
  521. '</tr>'+
  522. '<tr valign="top">'+
  523. '<td style="padding-bottom:1px">'+o.p1.getHTML()+'</td><td style="padding-bottom:1px">'+o.p2.getHTML()+'</td>'+
  524. '</tr>'+
  525. '</table>'+
  526. '</td>'+
  527. '</tr>'
  528. // Days header
  529. s+='<tr><td align="center"><table style="margin:2px;margin-top:6px" cellpadding="0" border="0" cellspacing="0">'
  530. for (var i=0;i<7;i++)
  531. {
  532. var j=(i+_firstWeekDay)%7
  533. if ((j%7)==0) s+='<tr align="center">'
  534. s+='<td class="calendarTextPart">'+_day[j]+'</td>'
  535. if ((j%7)==6) s+='</tr>'
  536. }
  537. s+='<tr><td colspan="7" style="padding:2px;"><table width="100%" height="3" cellpadding="0" cellspacing="0" border="0" style="'+backImgOffset(_skin+"menus.gif",0,80)+';"><tbody><tr><td></td></tr></tbody></table></td></tr>'
  538. // Days
  539. for (var i=0;i<6;i++)
  540. {
  541. s+='<tr align="right">'
  542. for (var j=0;j<7;j++)
  543. {
  544. s+='<td class="calendarTextPart" onmousedown="'+_codeWinName+'.CalendarMenuWidget_mouseDown(this)" onmouseover="'+_codeWinName+'.CalendarWidget_mouseOver(this)" onmouseout="'+_codeWinName+'.CalendarWidget_mouseOut(this)" onkeydown="'+_codeWinName+'.CalendarMenuWidget_keyDown(this,event)">'+
  545. '<div subid="'+(j+(i*7))+'" class="menuCalendar"></div></td>'
  546. }
  547. s+='</tr>'
  548. }
  549. s+='<tr><td colspan="7" style="padding:2px;"><table width="100%" height="3" cellpadding="0" cellspacing="0" border="0" style="'+backImgOffset(_skin+"menus.gif",0,80)+';"><tbody><tr><td></td></tr></tbody></table></td></tr>'
  550. s+='<tr><td colspan="7" align="center" style="padding-bottom=3px;padding-top:3px;">'+o.today.getHTML()+'</td></tr>'
  551. // End menu
  552. s+='</table></td></tr>'
  553. s+='</table>'
  554. s+='<a style="position:absolute;left:-30px;top:-30px; visibility:hidden" id="endLink_'+o.id+'" href="javascript:void(0)" onfocus="'+_codeWinName+'.MenuWidget_keepFocus(\''+o.id+'\');return false;" ></a>'
  555. return s
  556. }
  557. // ================================================================================
  558. function CalendarMenuWidget_clickCB()
  559. // PRIVATE
  560. {
  561. var o=m=this
  562. // Modify current month
  563. if (o.p1||o.n1)
  564. {
  565. m=o.par
  566. m.month=(m.month+(o.p1?-1:1))%12
  567. if (m.month==-1)
  568. m.month=11
  569. m.update()
  570. }
  571. // Modify current year
  572. if (o.p2||o.n2)
  573. {
  574. m=o.par
  575. m.year=m.year+(o.p2?-1:1)
  576. m.update()
  577. }
  578. if (o.today)
  579. {
  580. m=o.par
  581. m.setToday(true)
  582. m.show(false)
  583. if (m.changeCB)
  584. m.changeCB()
  585. //give focus to parent textfield when close menu
  586. var cal = m.parCalendar
  587. if( cal && cal.ctfb && cal.ctfb.text)
  588. cal.ctfb.text.focus()
  589. else
  590. cal.focus()
  591. }
  592. }
  593. // ================================================================================
  594. function CalendarWidget_update()
  595. // PRIVATE
  596. {
  597. var o=this
  598. if (o.layer==null)
  599. return
  600. var month=getElemBySub(o.layer,"month"),year=getElemBySub(o.layer,"year"),l=o.layer
  601. month.innerHTML=convStr(_month[o.month])
  602. year.innerHTML=convStr(""+o.year)
  603. _dateObj.setYear(o.year)
  604. _dateObj.setMonth(o.month)
  605. _dateObj.setDate(1)
  606. var offset=_dateObj.getDay()
  607. var last=26
  608. for (var i=26;i<33;i++)
  609. {
  610. _dateObj.setDate(i)
  611. if (_dateObj.getMonth()==o.month)
  612. last=i-1
  613. else
  614. break
  615. }
  616. o.lastDate=last
  617. o.dateOffset=offset
  618. o.day=Math.min(last,o.day)
  619. for (var i=0;i<42;i++)
  620. {
  621. var j=i-offset,lay=o.daysL[i],cName="menuCalendar"
  622. if ((j<0)||(j>last))
  623. {
  624. lay.innerHTML=""
  625. lay.tabIndex=-1 //cannot receive focus
  626. }
  627. else
  628. {
  629. lay.innerHTML=""+(j+1)
  630. lay.tabIndex=0 //can receive focus
  631. if (j==o.day)
  632. {
  633. cName="menuCalendarSel"
  634. lay.title=_calendarSelectionLab+(j+1)
  635. }
  636. }
  637. lay.className=cName
  638. }
  639. }
  640. // ================================================================================
  641. function CalendarWidget_setToday(update)
  642. {
  643. _dateObj=new Date
  644. var o=this
  645. o.day=_dateObj.getDate()-1
  646. o.month=_dateObj.getMonth()
  647. o.year=_dateObj.getFullYear()
  648. if (update)
  649. o.update()
  650. }
  651. // ================================================================================
  652. function CalendarMenuWidget_mouseDown(lay)
  653. {
  654. lay=lay.childNodes[0]
  655. var o=getWidget(lay),index=parseInt(lay.getAttribute("subid"))
  656. var day=index-o.dateOffset
  657. if ((day<0)||(day>o.lastDate))
  658. return
  659. o.day=day
  660. o.update()
  661. o.show(false)
  662. if (o.changeCB)
  663. o.changeCB()
  664. //give focus to parent textfield when close menu
  665. var cal = o.parCalendar
  666. if( cal && cal.ctfb && cal.ctfb.text)
  667. cal.ctfb.text.focus()
  668. else
  669. cal.focus()
  670. }
  671. // ================================================================================
  672. function CalendarWidget_mouseOver(lay)
  673. {
  674. lay=lay.childNodes[0]
  675. var o=getWidget(lay),index=parseInt(lay.getAttribute("subid"))
  676. var day=index-o.dateOffset,cName=""
  677. if ((day<0)||(day>o.lastDate))
  678. cName="menuCalendar"
  679. else
  680. cName="menuCalendarSel"
  681. lay.className=cName
  682. }
  683. // ================================================================================
  684. function CalendarWidget_mouseOut(lay)
  685. {
  686. lay=lay.childNodes[0]
  687. var o=getWidget(lay),index=parseInt(lay.getAttribute("subid"))
  688. var day=index-o.dateOffset,cName=""
  689. if (o.day!=day)
  690. lay.className="menuCalendar"
  691. }
  692. // ================================================================================
  693. function getElemBySub(l,subId)
  694. {
  695. if (l.getAttribute&&(l.getAttribute("subid")==subId))
  696. return l
  697. var sub=l.childNodes,len=sub.length
  698. for (var i=0;i<len;i++)
  699. {
  700. var r=getElemBySub(sub[i],subId)
  701. if (r) return r
  702. }
  703. return null
  704. }
  705. // ================================================================================
  706. function CalendarWidget_focus()
  707. {
  708. var o=this
  709. o.n1.focus()
  710. if(o.endLink) o.endLink.show(true)
  711. if(o.startLink) o.startLink.show(true)
  712. }
  713. function CalendarWidget_focusOnDay()
  714. {
  715. var o=this
  716. o.day.focus()
  717. }
  718. function CalendarWidget_keyDown(lay,e)
  719. {
  720. var k=eventGetKey(e)
  721. if(k==13)//enter
  722. {
  723. CalendarWidget_mouseDown(lay)
  724. }
  725. }
  726. function CalendarMenuWidget_keyDown(lay,e)
  727. {
  728. var k=eventGetKey(e)
  729. if(k==13)//enter
  730. {
  731. CalendarMenuWidget_mouseDown(lay)
  732. }
  733. }