]> git.datanom.net - webcal.git/blame - js/calendar_db.js
Initial upload
[webcal.git] / js / calendar_db.js
CommitLineData
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
6var 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
15function 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
35function 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
44function 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
81function 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
140function 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
166function f_tcalToggle () {\r
167 return this.b_visible ? this.f_hide() : this.f_show();\r
168}\r
169\r
170function 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
273function 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
298function 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
307function 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
312f_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
316if (document.addEventListener)\r
317 window.addEventListener('scroll', f_tcalHideAll, false);\r
318if (window.attachEvent)\r
319 window.attachEvent('onscroll', f_tcalHideAll);\r
320 \r
321// global variables\r
322var s_userAgent = navigator.userAgent.toLowerCase(),\r
323 re_webkit = /WebKit\/(\d+)/i;\r
324var 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
327var 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
This page took 0.0764089999999999 seconds and 5 git commands to generate.