]>
Commit | Line | Data |
---|---|---|
a5eae6b7 MR |
1 | // Tigra Calendar v4.0.2 (2009-01-12) Database (yyyy-mm-dd)\r |
2 | // http://www.softcomplex.com/products/tigra_calendar/\r | |
3 | // Public Domain Software... You're welcome.\r | |
4 | \r | |
5 | // default settins\r | |
6 | var A_TCALDEF = {\r | |
7 | 'months' : ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\r | |
8 | 'weekdays' : ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\r | |
9 | 'yearscroll': true, // show year scroller\r | |
10 | 'weekstart': 0, // first day of week: 0-Su or 1-Mo\r | |
11 | 'centyear' : 70, // 2 digit years less than 'centyear' are in 20xx, othewise in 19xx.\r | |
12 | 'imgpath' : 'img/' // directory with calendar images\r | |
13 | }\r | |
14 | // date parsing function\r | |
15 | function f_tcalParseDate (s_date) {\r | |
16 | \r | |
17 | var re_date = /^\s*(\d{2,4})\-(\d{1,2})\-(\d{1,2})\s*$/;\r | |
18 | if (!re_date.exec(s_date))\r | |
19 | return alert ("Invalid date: '" + s_date + "'.\nAccepted format is yyyy-mm-dd.")\r | |
20 | var n_day = Number(RegExp.$3),\r | |
21 | n_month = Number(RegExp.$2),\r | |
22 | n_year = Number(RegExp.$1);\r | |
23 | \r | |
24 | if (n_year < 100)\r | |
25 | n_year += (n_year < this.a_tpl.centyear ? 2000 : 1900);\r | |
26 | if (n_month < 1 || n_month > 12)\r | |
27 | return alert ("Invalid month value: '" + n_month + "'.\nAllowed range is 01-12.");\r | |
28 | var d_numdays = new Date(n_year, n_month, 0);\r | |
29 | if (n_day > d_numdays.getDate())\r | |
30 | return alert("Invalid day of month value: '" + n_day + "'.\nAllowed range for selected month is 01 - " + d_numdays.getDate() + ".");\r | |
31 | \r | |
32 | return new Date (n_year, n_month - 1, n_day);\r | |
33 | }\r | |
34 | // date generating function\r | |
35 | function f_tcalGenerDate (d_date) {\r | |
36 | return (\r | |
37 | d_date.getFullYear() + "-"\r | |
38 | + (d_date.getMonth() < 9 ? '0' : '') + (d_date.getMonth() + 1) + "-"\r | |
39 | + (d_date.getDate() < 10 ? '0' : '') + d_date.getDate()\r | |
40 | );\r | |
41 | }\r | |
42 | \r | |
43 | // implementation\r | |
44 | function tcal (a_cfg, a_tpl) {\r | |
45 | \r | |
46 | // apply default template if not specified\r | |
47 | if (!a_tpl)\r | |
48 | a_tpl = A_TCALDEF;\r | |
49 | \r | |
50 | // register in global collections\r | |
51 | if (!window.A_TCALS)\r | |
52 | window.A_TCALS = [];\r | |
53 | if (!window.A_TCALSIDX)\r | |
54 | window.A_TCALSIDX = [];\r | |
55 | \r | |
56 | this.s_id = a_cfg.id ? a_cfg.id : A_TCALS.length;\r | |
57 | window.A_TCALS[this.s_id] = this;\r | |
58 | window.A_TCALSIDX[window.A_TCALSIDX.length] = this;\r | |
59 | \r | |
60 | // assign methods\r | |
61 | this.f_show = f_tcalShow;\r | |
62 | this.f_hide = f_tcalHide;\r | |
63 | this.f_toggle = f_tcalToggle;\r | |
64 | this.f_update = f_tcalUpdate;\r | |
65 | this.f_relDate = f_tcalRelDate;\r | |
66 | this.f_parseDate = f_tcalParseDate;\r | |
67 | this.f_generDate = f_tcalGenerDate;\r | |
68 | \r | |
69 | // create calendar icon\r | |
70 | this.s_iconId = 'tcalico_' + this.s_id;\r | |
71 | this.e_icon = f_getElement(this.s_iconId);\r | |
72 | if (!this.e_icon) {\r | |
73 | document.write('<img src="' + a_tpl.imgpath + 'cal.gif" id="' + this.s_iconId + '" onclick="A_TCALS[\'' + this.s_id + '\'].f_toggle()" class="tcalIcon" alt="Open Calendar" />');\r | |
74 | this.e_icon = f_getElement(this.s_iconId);\r | |
75 | }\r | |
76 | // save received parameters\r | |
77 | this.a_cfg = a_cfg;\r | |
78 | this.a_tpl = a_tpl;\r | |
79 | }\r | |
80 | \r | |
81 | function f_tcalShow (d_date) {\r | |
82 | \r | |
83 | // find input field\r | |
84 | if (!this.a_cfg.controlname)\r | |
85 | throw("TC: control name is not specified");\r | |
86 | if (this.a_cfg.formname) {\r | |
87 | var e_form = document.forms[this.a_cfg.formname];\r | |
88 | if (!e_form)\r | |
89 | throw("TC: form '" + this.a_cfg.formname + "' can not be found");\r | |
90 | this.e_input = e_form.elements[this.a_cfg.controlname];\r | |
91 | }\r | |
92 | else\r | |
93 | this.e_input = f_getElement(this.a_cfg.controlname);\r | |
94 | \r | |
95 | if (!this.e_input || !this.e_input.tagName || this.e_input.tagName != 'INPUT')\r | |
96 | throw("TC: element '" + this.a_cfg.controlname + "' does not exist in "\r | |
97 | + (this.a_cfg.formname ? "form '" + this.a_cfg.controlname + "'" : 'this document'));\r | |
98 | \r | |
99 | // dynamically create HTML elements if needed\r | |
100 | this.e_div = f_getElement('tcal');\r | |
101 | if (!this.e_div) {\r | |
102 | this.e_div = document.createElement("DIV");\r | |
103 | this.e_div.id = 'tcal';\r | |
104 | document.body.appendChild(this.e_div);\r | |
105 | }\r | |
106 | this.e_shade = f_getElement('tcalShade');\r | |
107 | if (!this.e_shade) {\r | |
108 | this.e_shade = document.createElement("DIV");\r | |
109 | this.e_shade.id = 'tcalShade';\r | |
110 | document.body.appendChild(this.e_shade);\r | |
111 | }\r | |
112 | this.e_iframe = f_getElement('tcalIF')\r | |
113 | if (b_ieFix && !this.e_iframe) {\r | |
114 | this.e_iframe = document.createElement("IFRAME");\r | |
115 | this.e_iframe.style.filter = 'alpha(opacity=0)';\r | |
116 | this.e_iframe.id = 'tcalIF';\r | |
117 | this.e_iframe.src = this.a_tpl.imgpath + 'pixel.gif';\r | |
118 | document.body.appendChild(this.e_iframe);\r | |
119 | }\r | |
120 | \r | |
121 | // hide all calendars\r | |
122 | f_tcalHideAll();\r | |
123 | \r | |
124 | // generate HTML and show calendar\r | |
125 | this.e_icon = f_getElement(this.s_iconId);\r | |
126 | if (!this.f_update())\r | |
127 | return;\r | |
128 | \r | |
129 | this.e_div.style.visibility = 'visible';\r | |
130 | this.e_shade.style.visibility = 'visible';\r | |
131 | if (this.e_iframe)\r | |
132 | this.e_iframe.style.visibility = 'visible';\r | |
133 | \r | |
134 | // change icon and status\r | |
135 | this.e_icon.src = this.a_tpl.imgpath + 'no_cal.gif';\r | |
136 | this.e_icon.title = 'Close Calendar';\r | |
137 | this.b_visible = true;\r | |
138 | }\r | |
139 | \r | |
140 | function f_tcalHide (n_date) {\r | |
141 | if (n_date) {\r | |
142 | this.e_input.value = this.f_generDate(new Date(n_date));\r | |
143 | if (this.e_input.onchange) {\r | |
144 | this.e_input.onchange(this.e_input);\r | |
145 | }\r | |
146 | }\r | |
147 | \r | |
148 | // no action if not visible\r | |
149 | if (!this.b_visible)\r | |
150 | return;\r | |
151 | \r | |
152 | // hide elements\r | |
153 | if (this.e_iframe)\r | |
154 | this.e_iframe.style.visibility = 'hidden';\r | |
155 | if (this.e_shade)\r | |
156 | this.e_shade.style.visibility = 'hidden';\r | |
157 | this.e_div.style.visibility = 'hidden';\r | |
158 | \r | |
159 | // change icon and status\r | |
160 | this.e_icon = f_getElement(this.s_iconId);\r | |
161 | this.e_icon.src = this.a_tpl.imgpath + 'cal.gif';\r | |
162 | this.e_icon.title = 'Open Calendar';\r | |
163 | this.b_visible = false;\r | |
164 | }\r | |
165 | \r | |
166 | function f_tcalToggle () {\r | |
167 | return this.b_visible ? this.f_hide() : this.f_show();\r | |
168 | }\r | |
169 | \r | |
170 | function f_tcalUpdate (d_date) {\r | |
171 | \r | |
172 | var d_client = new Date();\r | |
173 | d_client.setHours(0);\r | |
174 | d_client.setMinutes(0);\r | |
175 | d_client.setSeconds(0);\r | |
176 | d_client.setMilliseconds(0);\r | |
177 | \r | |
178 | var d_today = this.a_cfg.today ? this.f_parseDate(this.a_cfg.today) : d_client;\r | |
179 | var d_selected = this.e_input.value == ''\r | |
180 | ? (this.a_cfg.selected ? this.f_parseDate(this.a_cfg.selected) : d_today)\r | |
181 | : this.f_parseDate(this.e_input.value);\r | |
182 | \r | |
183 | // figure out date to display\r | |
184 | if (!d_date)\r | |
185 | // selected by default\r | |
186 | d_date = d_selected;\r | |
187 | else if (typeof(d_date) == 'number')\r | |
188 | // get from number\r | |
189 | d_date = new Date(d_date);\r | |
190 | else if (typeof(d_date) == 'string')\r | |
191 | // parse from string\r | |
192 | this.f_parseDate(d_date);\r | |
193 | \r | |
194 | if (!d_date) return false;\r | |
195 | \r | |
196 | // first date to display\r | |
197 | var d_firstday = new Date(d_date);\r | |
198 | d_firstday.setDate(1);\r | |
199 | d_firstday.setDate(1 - (7 + d_firstday.getDay() - this.a_tpl.weekstart) % 7);\r | |
200 | \r | |
201 | var a_class, s_html = '<table class="ctrl"><tbody><tr>'\r | |
202 | + (this.a_tpl.yearscroll ? '<td' + this.f_relDate(d_date, -1, 'y') + ' title="Previous Year"><img src="' + this.a_tpl.imgpath + 'prev_year.gif" /></td>' : '')\r | |
203 | + '<td' + this.f_relDate(d_date, -1) + ' title="Previous Month"><img src="' + this.a_tpl.imgpath + 'prev_mon.gif" /></td><th>'\r | |
204 | + this.a_tpl.months[d_date.getMonth()] + ' ' + d_date.getFullYear()\r | |
205 | + '</th><td' + this.f_relDate(d_date, 1) + ' title="Next Month"><img src="' + this.a_tpl.imgpath + 'next_mon.gif" /></td>'\r | |
206 | + (this.a_tpl.yearscroll ? '<td' + this.f_relDate(d_date, 1, 'y') + ' title="Next Year"><img src="' + this.a_tpl.imgpath + 'next_year.gif" /></td></td>' : '')\r | |
207 | + '</tr></tbody></table><table><tbody><tr class="wd">';\r | |
208 | \r | |
209 | // print weekdays titles\r | |
210 | for (var i = 0; i < 7; i++)\r | |
211 | s_html += '<th>' + this.a_tpl.weekdays[(this.a_tpl.weekstart + i) % 7] + '</th>';\r | |
212 | s_html += '</tr>' ;\r | |
213 | \r | |
214 | // print calendar table\r | |
215 | var d_current = new Date(d_firstday);\r | |
216 | while (d_current.getMonth() == d_date.getMonth() ||\r | |
217 | d_current.getMonth() == d_firstday.getMonth()) {\r | |
218 | \r | |
219 | // print row heder\r | |
220 | s_html +='<tr>';\r | |
221 | for (var n_wday = 0; n_wday < 7; n_wday++) {\r | |
222 | \r | |
223 | a_class = [];\r | |
224 | // other month\r | |
225 | if (d_current.getMonth() != d_date.getMonth())\r | |
226 | a_class[a_class.length] = 'othermonth';\r | |
227 | // weekend\r | |
228 | if (d_current.getDay() == 0 || d_current.getDay() == 6)\r | |
229 | a_class[a_class.length] = 'weekend';\r | |
230 | // today\r | |
231 | if (d_current.valueOf() == d_today.valueOf())\r | |
232 | a_class[a_class.length] = 'today';\r | |
233 | // selected\r | |
234 | if (d_current.valueOf() == d_selected.valueOf())\r | |
235 | a_class[a_class.length] = 'selected';\r | |
236 | \r | |
237 | s_html += '<td onclick="A_TCALS[\'' + this.s_id + '\'].f_hide(' + d_current.valueOf() + ')"' + (a_class.length ? ' class="' + a_class.join(' ') + '">' : '>') + d_current.getDate() + '</td>'\r | |
238 | d_current.setDate(d_current.getDate() + 1);\r | |
239 | }\r | |
240 | // print row footer\r | |
241 | s_html +='</tr>';\r | |
242 | }\r | |
243 | s_html +='</tbody></table>';\r | |
244 | \r | |
245 | // update HTML, positions and sizes\r | |
246 | this.e_div.innerHTML = s_html;\r | |
247 | \r | |
248 | var n_width = this.e_div.offsetWidth;\r | |
249 | var n_height = this.e_div.offsetHeight;\r | |
250 | var n_top = f_getPosition (this.e_icon, 'Top') + this.e_icon.offsetHeight;\r | |
251 | var n_left = f_getPosition (this.e_icon, 'Left') - n_width + this.e_icon.offsetWidth;\r | |
252 | if (n_left < 0) n_left = 0;\r | |
253 | \r | |
254 | this.e_div.style.left = n_left + 'px';\r | |
255 | this.e_div.style.top = n_top + 'px';\r | |
256 | \r | |
257 | this.e_shade.style.width = (n_width + 8) + 'px';\r | |
258 | this.e_shade.style.left = (n_left - 1) + 'px';\r | |
259 | this.e_shade.style.top = (n_top - 1) + 'px';\r | |
260 | this.e_shade.innerHTML = b_ieFix\r | |
261 | ? '<table><tbody><tr><td rowspan="2" colspan="2" width="6"><img src="' + this.a_tpl.imgpath + 'pixel.gif"></td><td width="7" height="7" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + this.a_tpl.imgpath + 'shade_tr.png\', sizingMethod=\'scale\');"><img src="' + this.a_tpl.imgpath + 'pixel.gif"></td></tr><tr><td height="' + (n_height - 7) + '" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + this.a_tpl.imgpath + 'shade_mr.png\', sizingMethod=\'scale\');"><img src="' + this.a_tpl.imgpath + 'pixel.gif"></td></tr><tr><td width="7" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + this.a_tpl.imgpath + 'shade_bl.png\', sizingMethod=\'scale\');"><img src="' + this.a_tpl.imgpath + 'pixel.gif"></td><td style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + this.a_tpl.imgpath + 'shade_bm.png\', sizingMethod=\'scale\');" height="7" align="left"><img src="' + this.a_tpl.imgpath + 'pixel.gif"></td><td style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + this.a_tpl.imgpath + 'shade_br.png\', sizingMethod=\'scale\');"><img src="' + this.a_tpl.imgpath + 'pixel.gif"></td></tr><tbody></table>'\r | |
262 | : '<table><tbody><tr><td rowspan="2" width="6"><img src="' + this.a_tpl.imgpath + 'pixel.gif"></td><td rowspan="2"><img src="' + this.a_tpl.imgpath + 'pixel.gif"></td><td width="7" height="7"><img src="' + this.a_tpl.imgpath + 'shade_tr.png"></td></tr><tr><td background="' + this.a_tpl.imgpath + 'shade_mr.png" height="' + (n_height - 7) + '"><img src="' + this.a_tpl.imgpath + 'pixel.gif"></td></tr><tr><td><img src="' + this.a_tpl.imgpath + 'shade_bl.png"></td><td background="' + this.a_tpl.imgpath + 'shade_bm.png" height="7" align="left"><img src="' + this.a_tpl.imgpath + 'pixel.gif"></td><td><img src="' + this.a_tpl.imgpath + 'shade_br.png"></td></tr><tbody></table>';\r | |
263 | \r | |
264 | if (this.e_iframe) {\r | |
265 | this.e_iframe.style.left = n_left + 'px';\r | |
266 | this.e_iframe.style.top = n_top + 'px';\r | |
267 | this.e_iframe.style.width = (n_width + 6) + 'px';\r | |
268 | this.e_iframe.style.height = (n_height + 6) +'px';\r | |
269 | }\r | |
270 | return true;\r | |
271 | }\r | |
272 | \r | |
273 | function f_getPosition (e_elemRef, s_coord) {\r | |
274 | var n_pos = 0, n_offset,\r | |
275 | e_elem = e_elemRef;\r | |
276 | \r | |
277 | while (e_elem) {\r | |
278 | n_offset = e_elem["offset" + s_coord];\r | |
279 | n_pos += n_offset;\r | |
280 | e_elem = e_elem.offsetParent;\r | |
281 | }\r | |
282 | // margin correction in some browsers\r | |
283 | if (b_ieMac)\r | |
284 | n_pos += parseInt(document.body[s_coord.toLowerCase() + 'Margin']);\r | |
285 | else if (b_safari)\r | |
286 | n_pos -= n_offset;\r | |
287 | \r | |
288 | e_elem = e_elemRef;\r | |
289 | while (e_elem != document.body) {\r | |
290 | n_offset = e_elem["scroll" + s_coord];\r | |
291 | if (n_offset && e_elem.style.overflow == 'scroll')\r | |
292 | n_pos -= n_offset;\r | |
293 | e_elem = e_elem.parentNode;\r | |
294 | }\r | |
295 | return n_pos;\r | |
296 | }\r | |
297 | \r | |
298 | function f_tcalRelDate (d_date, d_diff, s_units) {\r | |
299 | var s_units = (s_units == 'y' ? 'FullYear' : 'Month');\r | |
300 | var d_result = new Date(d_date);\r | |
301 | d_result['set' + s_units](d_date['get' + s_units]() + d_diff);\r | |
302 | if (d_result.getDate() != d_date.getDate())\r | |
303 | d_result.setDate(0);\r | |
304 | return ' onclick="A_TCALS[\'' + this.s_id + '\'].f_update(' + d_result.valueOf() + ')"';\r | |
305 | }\r | |
306 | \r | |
307 | function f_tcalHideAll () {\r | |
308 | for (var i = 0; i < window.A_TCALSIDX.length; i++)\r | |
309 | window.A_TCALSIDX[i].f_hide();\r | |
310 | } \r | |
311 | \r | |
312 | f_getElement = document.all ?\r | |
313 | function (s_id) { return document.all[s_id] } :\r | |
314 | function (s_id) { return document.getElementById(s_id) };\r | |
315 | \r | |
316 | if (document.addEventListener)\r | |
317 | window.addEventListener('scroll', f_tcalHideAll, false);\r | |
318 | if (window.attachEvent)\r | |
319 | window.attachEvent('onscroll', f_tcalHideAll);\r | |
320 | \r | |
321 | // global variables\r | |
322 | var s_userAgent = navigator.userAgent.toLowerCase(),\r | |
323 | re_webkit = /WebKit\/(\d+)/i;\r | |
324 | var b_mac = s_userAgent.indexOf('mac') != -1,\r | |
325 | b_ie5 = s_userAgent.indexOf('msie 5') != -1,\r | |
326 | b_ie6 = s_userAgent.indexOf('msie 6') != -1 && s_userAgent.indexOf('opera') == -1;\r | |
327 | var b_ieFix = b_ie5 || b_ie6,\r | |
328 | b_ieMac = b_mac && b_ie5,\r | |
329 | b_safari = b_mac && re_webkit.exec(s_userAgent) && Number(RegExp.$1) < 500;\r |