1102377b526d4fbaa75cb602b0aa4a636c9ac136
[lichviet-widget] / qml / lichvietwidget / main.js
1
2
3 var IMGS_RESOURCE_PATH = "/opt/lichvietwidget/qml/lichvietwidget/imgs/";
4
5 function refresh(day_center_img, day_left_img, day_right_img, month_left_img, month_right_img, year_1_img, year_2_img,year_3_img,year_4_img, txt_detail) {
6     var date = new Date();
7
8     var lunar = getLunarDate(date.getDate(),date.getMonth()+1,date.getFullYear());
9     var lunarCanChi = getCanChi(lunar);
10     var xday = lunar.day;
11     var xmonth = lunar.month;
12     var xyear = lunar.year;
13
14     txt_detail.text = "Ngày <b>"+lunarCanChi[0]+"</b>, Tháng <b>"+lunarCanChi[1]+"</b><br>Năm <b>"+lunarCanChi[2]+"</b>";
15
16     if (xday <= 9){
17         day_center_img.visible = true;
18         day_center_img.source = IMGS_RESOURCE_PATH + xday + ".png";
19         day_left_img.visible = false;
20         day_right_img.visible = false;
21     }else{
22         var strxday = xday+'';
23         var firstday = strxday[0];
24         var secondday = strxday[1];
25         day_center_img.visible = false;
26         day_left_img.visible = true;
27         day_left_img.source = IMGS_RESOURCE_PATH + firstday + ".png";
28         day_right_img.visible = true;
29         day_right_img.source = IMGS_RESOURCE_PATH + secondday + ".png";
30     }
31
32     if (xmonth <=9){
33         month_left_img.source = IMGS_RESOURCE_PATH +"0.png";
34         month_right_img.source = IMGS_RESOURCE_PATH + xmonth + ".png";
35     }else
36     {
37         var strxmonth = xmonth+'';
38         var firstmonth = strxmonth[0];
39         var secondmonth = strxmonth[1];
40         month_left_img.source = IMGS_RESOURCE_PATH + firstmonth +".png";
41         month_right_img.source = IMGS_RESOURCE_PATH + secondmonth + ".png";
42     }
43
44     var strxyear = xyear+'';
45     year_1_img.source = IMGS_RESOURCE_PATH + strxyear[0] +".png";
46     year_2_img.source = IMGS_RESOURCE_PATH + strxyear[1] + ".png";
47     year_3_img.source = IMGS_RESOURCE_PATH + strxyear[2] +".png";
48     year_4_img.source = IMGS_RESOURCE_PATH + strxyear[3] + ".png";
49
50 }
51
52 /**
53  * Copyright 2004 Ho Ngoc Duc [http://come.to/duc]. All Rights Reserved.<p>
54  * Permission to use, copy, modify, and redistribute this software and its
55  * documentation for personal, non-commercial use is hereby granted provided that
56  * this copyright notice appears in all copies.
57  */
58
59 var ABOUT = "\u00C2m l\u1ECBch Vi\u1EC7t Nam - Version 0.8"+"\n\u00A9 2004 H\u1ED3 Ng\u1ECDc \u0110\u1EE9c [http://come.to/duc]";
60 var TK19 = new Array(
61         0x30baa3, 0x56ab50, 0x422ba0, 0x2cab61, 0x52a370, 0x3c51e8, 0x60d160, 0x4ae4b0, 0x376926, 0x58daa0,
62         0x445b50, 0x3116d2, 0x562ae0, 0x3ea2e0, 0x28e2d2, 0x4ec950, 0x38d556, 0x5cb520, 0x46b690, 0x325da4,
63         0x5855d0, 0x4225d0, 0x2ca5b3, 0x52a2b0, 0x3da8b7, 0x60a950, 0x4ab4a0, 0x35b2a5, 0x5aad50, 0x4455b0,
64         0x302b74, 0x562570, 0x4052f9, 0x6452b0, 0x4e6950, 0x386d56, 0x5e5aa0, 0x46ab50, 0x3256d4, 0x584ae0,
65         0x42a570, 0x2d4553, 0x50d2a0, 0x3be8a7, 0x60d550, 0x4a5aa0, 0x34ada5, 0x5a95d0, 0x464ae0, 0x2eaab4,
66         0x54a4d0, 0x3ed2b8, 0x64b290, 0x4cb550, 0x385757, 0x5e2da0, 0x4895d0, 0x324d75, 0x5849b0, 0x42a4b0,
67         0x2da4b3, 0x506a90, 0x3aad98, 0x606b50, 0x4c2b60, 0x359365, 0x5a9370, 0x464970, 0x306964, 0x52e4a0,
68         0x3cea6a, 0x62da90, 0x4e5ad0, 0x392ad6, 0x5e2ae0, 0x4892e0, 0x32cad5, 0x56c950, 0x40d4a0, 0x2bd4a3,
69         0x50b690, 0x3a57a7, 0x6055b0, 0x4c25d0, 0x3695b5, 0x5a92b0, 0x44a950, 0x2ed954, 0x54b4a0, 0x3cb550,
70         0x286b52, 0x4e55b0, 0x3a2776, 0x5e2570, 0x4852b0, 0x32aaa5, 0x56e950, 0x406aa0, 0x2abaa3, 0x50ab50
71 ); /* Years 2000-2099 */
72
73 var TK20 = new Array(
74         0x3c4bd8, 0x624ae0, 0x4ca570, 0x3854d5, 0x5cd260, 0x44d950, 0x315554, 0x5656a0, 0x409ad0, 0x2a55d2,
75         0x504ae0, 0x3aa5b6, 0x60a4d0, 0x48d250, 0x33d255, 0x58b540, 0x42d6a0, 0x2cada2, 0x5295b0, 0x3f4977,
76         0x644970, 0x4ca4b0, 0x36b4b5, 0x5c6a50, 0x466d50, 0x312b54, 0x562b60, 0x409570, 0x2c52f2, 0x504970,
77         0x3a6566, 0x5ed4a0, 0x48ea50, 0x336a95, 0x585ad0, 0x442b60, 0x2f86e3, 0x5292e0, 0x3dc8d7, 0x62c950,
78         0x4cd4a0, 0x35d8a6, 0x5ab550, 0x4656a0, 0x31a5b4, 0x5625d0, 0x4092d0, 0x2ad2b2, 0x50a950, 0x38b557,
79         0x5e6ca0, 0x48b550, 0x355355, 0x584da0, 0x42a5b0, 0x2f4573, 0x5452b0, 0x3ca9a8, 0x60e950, 0x4c6aa0,
80         0x36aea6, 0x5aab50, 0x464b60, 0x30aae4, 0x56a570, 0x405260, 0x28f263, 0x4ed940, 0x38db47, 0x5cd6a0,
81         0x4896d0, 0x344dd5, 0x5a4ad0, 0x42a4d0, 0x2cd4b4, 0x52b250, 0x3cd558, 0x60b540, 0x4ab5a0, 0x3755a6,
82         0x5c95b0, 0x4649b0, 0x30a974, 0x56a4b0, 0x40aa50, 0x29aa52, 0x4e6d20, 0x39ad47, 0x5eab60, 0x489370,
83         0x344af5, 0x5a4970, 0x4464b0, 0x2c74a3, 0x50ea50, 0x3d6a58, 0x6256a0, 0x4aaad0, 0x3696d5, 0x5c92e0
84 ); /* Years 1900-1999 */
85
86 var TK21 = new Array(
87         0x46c960, 0x2ed954, 0x54d4a0, 0x3eda50, 0x2a7552, 0x4e56a0, 0x38a7a7, 0x5ea5d0, 0x4a92b0, 0x32aab5,
88         0x58a950, 0x42b4a0, 0x2cbaa4, 0x50ad50, 0x3c55d9, 0x624ba0, 0x4ca5b0, 0x375176, 0x5c5270, 0x466930,
89         0x307934, 0x546aa0, 0x3ead50, 0x2a5b52, 0x504b60, 0x38a6e6, 0x5ea4e0, 0x48d260, 0x32ea65, 0x56d520,
90         0x40daa0, 0x2d56a3, 0x5256d0, 0x3c4afb, 0x6249d0, 0x4ca4d0, 0x37d0b6, 0x5ab250, 0x44b520, 0x2edd25,
91         0x54b5a0, 0x3e55d0, 0x2a55b2, 0x5049b0, 0x3aa577, 0x5ea4b0, 0x48aa50, 0x33b255, 0x586d20, 0x40ad60,
92         0x2d4b63, 0x525370, 0x3e49e8, 0x60c970, 0x4c54b0, 0x3768a6, 0x5ada50, 0x445aa0, 0x2fa6a4, 0x54aad0,
93         0x4052e0, 0x28d2e3, 0x4ec950, 0x38d557, 0x5ed4a0, 0x46d950, 0x325d55, 0x5856a0, 0x42a6d0, 0x2c55d4,
94         0x5252b0, 0x3ca9b8, 0x62a930, 0x4ab490, 0x34b6a6, 0x5aad50, 0x4655a0, 0x2eab64, 0x54a570, 0x4052b0,
95         0x2ab173, 0x4e6930, 0x386b37, 0x5e6aa0, 0x48ad50, 0x332ad5, 0x582b60, 0x42a570, 0x2e52e4, 0x50d160,
96         0x3ae958, 0x60d520, 0x4ada90, 0x355aa6, 0x5a56d0, 0x462ae0, 0x30a9d4, 0x54a2d0, 0x3ed150, 0x28e952
97 ); /* Years 2000-2099 */
98
99 var TK22 = new Array(
100                 0x4eb520, 0x38d727, 0x5eada0, 0x4a55b0, 0x362db5, 0x5a45b0, 0x44a2b0, 0x2eb2b4, 0x54a950, 0x3cb559,
101                 0x626b20, 0x4cad50, 0x385766, 0x5c5370, 0x484570, 0x326574, 0x5852b0, 0x406950, 0x2a7953, 0x505aa0,
102                 0x3baaa7, 0x5ea6d0, 0x4a4ae0, 0x35a2e5, 0x5aa550, 0x42d2a0, 0x2de2a4, 0x52d550, 0x3e5abb, 0x6256a0,
103                 0x4c96d0, 0x3949b6, 0x5e4ab0, 0x46a8d0, 0x30d4b5, 0x56b290, 0x40b550, 0x2a6d52, 0x504da0, 0x3b9567,
104                 0x609570, 0x4a49b0, 0x34a975, 0x5a64b0, 0x446a90, 0x2cba94, 0x526b50, 0x3e2b60, 0x28ab61, 0x4c9570,
105                 0x384ae6, 0x5cd160, 0x46e4a0, 0x2eed25, 0x54da90, 0x405b50, 0x2c36d3, 0x502ae0, 0x3a93d7, 0x6092d0,
106                 0x4ac950, 0x32d556, 0x58b4a0, 0x42b690, 0x2e5d94, 0x5255b0, 0x3e25fa, 0x6425b0, 0x4e92b0, 0x36aab6,
107                 0x5c6950, 0x4674a0, 0x31b2a5, 0x54ad50, 0x4055a0, 0x2aab73, 0x522570, 0x3a5377, 0x6052b0, 0x4a6950,
108                 0x346d56, 0x585aa0, 0x42ab50, 0x2e56d4, 0x544ae0, 0x3ca570, 0x2864d2, 0x4cd260, 0x36eaa6, 0x5ad550,
109                 0x465aa0, 0x30ada5, 0x5695d0, 0x404ad0, 0x2aa9b3, 0x50a4d0, 0x3ad2b7, 0x5eb250, 0x48b540, 0x33d556
110 ); /* Years 2100-2199 */
111
112 var CAN = new Array("Gi\341p", "\u1EA4t", "B\355nh", "\u0110inh", "M\u1EADu", "K\u1EF7", "Canh", "T\342n", "Nh\342m", "Qu\375");
113 var CHI = new Array("T\375", "S\u1EEDu", "D\u1EA7n", "Mão", "Th\354n", "T\u1EF5", "Ng\u1ECD", "M\371i", "Th\342n", "D\u1EADu", "Tu\u1EA5t", "H\u1EE3i");
114 var TUAN = new Array("Ch\u1EE7 Nh\u1EADt", "Th\u1EE9 Hai", "Th\u1EE9 Ba", "Th\u1EE9 T\u01B0", "Th\u1EE9 N\u0103m", "Th\u1EE9 S\341u", "Th\u1EE9 B\u1EA3y");
115 var GIO_HD = new Array("110100101100", "001101001011", "110011010010", "101100110100", "001011001101", "010010110011");
116 var TIETKHI = new Array("Xu\u00E2n ph\u00E2n", "Thanh minh", "C\u1ED1c v\u0169", "L\u1EADp h\u1EA1", "Ti\u1EC3u m\u00E3n", "Mang ch\u1EE7ng",
117         "H\u1EA1 ch\u00ED", "Ti\u1EC3u th\u1EED", "\u0110\u1EA1i th\u1EED", "L\u1EADp thu", "X\u1EED th\u1EED", "B\u1EA1ch l\u1ED9",
118         "Thu ph\u00E2n", "H\u00E0n l\u1ED9", "S\u01B0\u01A1ng gi\u00E1ng", "L\u1EADp \u0111\u00F4ng", "Ti\u1EC3u tuy\u1EBFt", "\u0110\u1EA1i tuy\u1EBFt",
119         "\u0110\u00F4ng ch\u00ED", "Ti\u1EC3u h\u00E0n", "\u0110\u1EA1i h\u00E0n", "L\u1EADp xu\u00E2n", "V\u0169 Th\u1EE7y", "Kinh tr\u1EADp"
120 );
121
122 var LML,RMM;
123
124 /* Create lunar date object, stores (lunar) date, month, year, leap month indicator, and Julian date number */
125 function LunarDate(dd, mm, yy, leap, jd) {
126         this.day = dd;
127         this.month = mm;
128         this.year = yy;
129         this.leap = leap;
130         this.jd = jd;
131 }
132
133 var PI = Math.PI;
134
135 /* Discard the fractional part of a number, e.g., INT(3.2) = 3 */
136 function INT(d) {
137         return Math.floor(d);
138 }
139
140 function jdn(dd, mm, yy) {
141         var a = INT((14 - mm) / 12);
142         var y = yy+4800-a;
143         var m = mm+12*a-3;
144         var jd = dd + INT((153*m+2)/5) + 365*y + INT(y/4) - INT(y/100) + INT(y/400) - 32045;
145         return jd;
146         //return 367*yy - INT(7*(yy+INT((mm+9)/12))/4) - INT(3*(INT((yy+(mm-9)/7)/100)+1)/4) + INT(275*mm/9)+dd+1721029;
147 }
148
149 function jdn2date(jd) {
150         var Z, A, alpha, B, C, D, E, dd, mm, yyyy, F;
151         Z = jd;
152         if (Z < 2299161) {
153           A = Z;
154         } else {
155           alpha = INT((Z-1867216.25)/36524.25);
156           A = Z + 1 + alpha - INT(alpha/4);
157         }
158         B = A + 1524;
159         C = INT( (B-122.1)/365.25);
160         D = INT( 365.25*C );
161         E = INT( (B-D)/30.6001 );
162         dd = INT(B - D - INT(30.6001*E));
163         if (E < 14) {
164           mm = E - 1;
165         } else {
166           mm = E - 13;
167         }
168         if (mm < 3) {
169           yyyy = C - 4715;
170         } else {
171           yyyy = C - 4716;
172         }
173         return new Array(dd, mm, yyyy);
174 }
175
176 function decodeLunarYear(yy, k) {
177         var monthLengths, regularMonths, offsetOfTet, leapMonth, leapMonthLength, solarNY, currentJD, j, mm;
178         var ly = new Array();
179         monthLengths = new Array(29, 30);
180         var regularMonths = new Array(12);
181         offsetOfTet = k >> 17;
182         leapMonth = k & 0xf;
183         leapMonthLength = monthLengths[k >> 16 & 0x1];
184         solarNY = jdn(1, 1, yy);
185         currentJD = solarNY+offsetOfTet;
186         j = k >> 4;
187         for(var i = 0; i < 12; i++) {
188                 regularMonths[12 - i - 1] = monthLengths[j & 0x1];
189                 j >>= 1;
190         }
191         if (leapMonth == 0) {
192                 for(mm = 1; mm <= 12; mm++) {
193                         ly.push(new LunarDate(1, mm, yy, 0, currentJD));
194                         currentJD += regularMonths[mm-1];
195                 }
196         } else {
197                 for(mm = 1; mm <= leapMonth; mm++) {
198                         ly.push(new LunarDate(1, mm, yy, 0, currentJD));
199                         currentJD += regularMonths[mm-1];
200                 }
201                 ly.push(new LunarDate(1, leapMonth, yy, 1, currentJD));
202                 currentJD += leapMonthLength;
203                 for(mm = leapMonth+1; mm <= 12; mm++) {
204                         ly.push(new LunarDate(1, mm, yy, 0, currentJD));
205                         currentJD += regularMonths[mm-1];
206                 }
207         }
208
209        LML = leapMonthLength;
210        RMM = regularMonths;
211         return ly;
212 }
213
214 function leapMonth(yyyy){
215     var yearCode = getYearCode(yyyy);
216     return yearCode & 0xf;
217 }
218
219 function monthLength(yyyy){
220     var yearCode = getYearCode(yyyy);
221     return yearCode >> 16 & 0x1;
222 }
223
224 function getYearCode(yyyy){
225     var yearCode;
226     if (yyyy < 1900) {
227             yearCode = TK19[yyyy - 1800];
228     } else if (yyyy < 2000) {
229             yearCode = TK20[yyyy - 1900];
230     } else if (yyyy < 2100) {
231             yearCode = TK21[yyyy - 2000];
232     } else {
233             yearCode = TK22[yyyy - 2100];
234     }
235     return yearCode;
236 }
237
238 function getYearInfo(yyyy) {
239         var yearCode;
240         if (yyyy < 1900) {
241                 yearCode = TK19[yyyy - 1800];
242         } else if (yyyy < 2000) {
243                 yearCode = TK20[yyyy - 1900];
244         } else if (yyyy < 2100) {
245                 yearCode = TK21[yyyy - 2000];
246         } else {
247                 yearCode = TK22[yyyy - 2100];
248         }
249         return decodeLunarYear(yyyy, yearCode);
250 }
251
252 var FIRST_DAY = jdn(25, 1, 1800); // Tet am lich 1800
253 var LAST_DAY = jdn(31, 12, 2199);
254
255 function findLunarDate(jd, ly) {
256         if (jd > LAST_DAY || jd < FIRST_DAY || ly[0].jd > jd) {
257                 return new LunarDate(0, 0, 0, 0, jd);
258         }
259         var i = ly.length-1;
260         while (jd < ly[i].jd) {
261                 i--;
262         }
263         var off = jd - ly[i].jd;
264         var ret = new LunarDate(ly[i].day+off, ly[i].month, ly[i].year, ly[i].leap, jd);
265         return ret;
266 }
267
268 function getLunarDate(dd, mm, yyyy) {
269         var ly, jd;
270         if (yyyy < 1800 || 2199 < yyyy) {
271                 //return new LunarDate(0, 0, 0, 0, 0);
272         }
273         ly = getYearInfo(yyyy);
274         jd = jdn(dd, mm, yyyy);
275         if (jd < ly[0].jd) {
276                 ly = getYearInfo(yyyy - 1);
277         }
278         return findLunarDate(jd, ly);
279 }
280
281 /* Compute the longitude of the sun at any time.
282  * Parameter: floating number jdn, the number of days since 1/1/4713 BC noon
283  * Algorithm from: "Astronomical Algorithms" by Jean Meeus, 1998
284  */
285 function SunLongitude(jdn) {
286         var T, T2, dr, M, L0, DL, lambda, theta, omega;
287         T = (jdn - 2451545.0 ) / 36525; // Time in Julian centuries from 2000-01-01 12:00:00 GMT
288         T2 = T*T;
289         dr = PI/180; // degree to radian
290         M = 357.52910 + 35999.05030*T - 0.0001559*T2 - 0.00000048*T*T2; // mean anomaly, degree
291         L0 = 280.46645 + 36000.76983*T + 0.0003032*T2; // mean longitude, degree
292         DL = (1.914600 - 0.004817*T - 0.000014*T2)*Math.sin(dr*M);
293         DL = DL + (0.019993 - 0.000101*T)*Math.sin(dr*2*M) + 0.000290*Math.sin(dr*3*M);
294     theta = L0 + DL; // true longitude, degree
295     // obtain apparent longitude by correcting for nutation and aberration
296     omega = 125.04 - 1934.136 * T;
297     lambda = theta - 0.00569 - 0.00478 * Math.sin(omega * dr);
298     // Convert to radians
299     lambda = lambda*dr;
300         lambda = lambda - PI*2*(INT(lambda/(PI*2))); // Normalize to (0, 2*PI)
301     return lambda;
302 }
303
304 /* Compute the sun segment at start (00:00) of the day with the given integral Julian day number.
305  * The time zone if the time difference between local time and UTC: 7.0 for UTC+7:00.
306  * The function returns a number between 0 and 23.
307  * From the day after March equinox and the 1st major term after March equinox, 0 is returned.
308  * After that, return 1, 2, 3 ...
309  */
310 function getSunLongitude(dayNumber, timeZone) {
311         return INT(SunLongitude(dayNumber - 0.5 - timeZone/24.0) / PI * 12);
312 }
313
314 var today = new Date();
315 //var currentLunarYear = getYearInfo(today.getFullYear());
316 var currentLunarDate = getLunarDate(today.getDate(), today.getMonth()+1, today.getFullYear());
317 var currentMonth = today.getMonth()+1;
318 var currentYear = today.getFullYear();
319
320 function parseQuery(q) {
321         var ret = new Array();
322         if (q.length < 2) return ret;
323         var s = q.substring(1, q.length);
324         var arr = s.split("&");
325         var i, j;
326         for (i = 0; i < arr.length; i++) {
327                 var a = arr[i].split("=");
328                 for (j = 0; j < a.length; j++) {
329                         ret.push(a[j]);
330                 }
331         }
332         return ret;
333 }
334
335 function getSelectedMonth() {
336         var query = window.location.search;
337         var arr = parseQuery(query);
338         var idx;
339         for (idx = 0; idx < arr.length; idx++) {
340                 if (arr[idx] == "mm") {
341                         currentMonth = parseInt(arr[idx+1]);
342                 } else if (arr[idx] == "yy") {
343                         currentYear = parseInt(arr[idx+1]);
344                 }
345         }
346 }
347
348 function getMonth(mm, yy) {
349         var ly1, ly2, tet1, jd1, jd2, mm1, yy1, result, i;
350         if (mm < 12) {
351                 mm1 = mm + 1;
352                 yy1 = yy;
353         } else {
354                 mm1 = 1;
355                 yy1 = yy + 1;
356         }
357         jd1 = jdn(1, mm, yy);
358         jd2 = jdn(1, mm1, yy1);
359         ly1 = getYearInfo(yy);
360         //alert('1/'+mm+'/'+yy+' = '+jd1+'; 1/'+mm1+'/'+yy1+' = '+jd2);
361         tet1 = ly1[0].jd;
362         result = new Array();
363         if (tet1 <= jd1) { /* tet(yy) = tet1 < jd1 < jd2 <= 1.1.(yy+1) < tet(yy+1) */
364                 for (i = jd1; i < jd2; i++) {
365                         result.push(findLunarDate(i, ly1));
366                 }
367         } else if (jd1 < tet1 && jd2 < tet1) { /* tet(yy-1) < jd1 < jd2 < tet1 = tet(yy) */
368                 ly1 = getYearInfo(yy - 1);
369                 for (i = jd1; i < jd2; i++) {
370                         result.push(findLunarDate(i, ly1));
371                 }
372         } else if (jd1 < tet1 && tet1 <= jd2) { /* tet(yy-1) < jd1 < tet1 <= jd2 < tet(yy+1) */
373                 ly2 = getYearInfo(yy - 1);
374                 for (i = jd1; i < tet1; i++) {
375                         result.push(findLunarDate(i, ly2));
376                 }
377                 for (i = tet1; i < jd2; i++) {
378                         result.push(findLunarDate(i, ly1));
379                 }
380         }
381         return result;
382 }
383
384 function getDayName(lunarDate) {
385         if (lunarDate.day == 0) {
386                 return "";
387         }
388         var cc = getCanChi(lunarDate);
389         var s = "Ng\u00E0y " + cc[0] +", th\341ng "+cc[1] + ", n\u0103m " + cc[2];
390         return s;
391 }
392
393 function getYearCanChi(year) {
394         return CAN[(year+6) % 10] + " " + CHI[(year+8) % 12];
395 }
396
397 /*
398  * Can cua gio Chinh Ty (00:00) cua ngay voi JDN nay
399  */
400 function getCanHour0(jdn) {
401         return CAN[(jdn-1)*2 % 10];
402 }
403
404 function getCanChi(lunar) {
405         var dayName, monthName, yearName;
406         dayName = CAN[(lunar.jd + 9) % 10] + " " + CHI[(lunar.jd+1)%12];
407         monthName = CAN[(lunar.year*12+lunar.month+3) % 10] + " " + CHI[(lunar.month+1)%12];
408         if (lunar.leap == 1) {
409                 monthName += " (N)";
410         }
411         yearName = getYearCanChi(lunar.year);
412         return new Array(dayName, monthName, yearName);
413 }
414
415 function getDayString(lunar, solarDay, solarMonth, solarYear) {
416         var s;
417         var dayOfWeek = TUAN[(lunar.jd + 1) % 7];
418         s = dayOfWeek + " " + solarDay + "/" + solarMonth + "/" + solarYear;
419         s += " -+- ";
420         s = s + "Ng\u00E0y " + lunar.day+" th\341ng "+lunar.month;
421         if (lunar.leap == 1) {
422                 s = s + " nhu\u1EADn";
423         }
424         return s;
425 }
426
427 function getTodayString() {
428         var s = getDayString(currentLunarDate, today.getDate(), today.getMonth()+1, today.getFullYear());
429         s += " n\u0103m " + getYearCanChi(currentLunarDate.year);
430         return s;
431 }
432
433 function getCurrentTime() {
434         today = new Date();
435         var Std = today.getHours();
436         var Min = today.getMinutes();
437         var Sec = today.getSeconds();
438         var s1  = ((Std < 10) ? "0" + Std : Std);
439         var s2  = ((Min < 10) ? "0" + Min : Min);
440         //var s3  = ((Sec < 10) ? "0" + Sec : Sec);
441         //return s1 + ":" + s2 + ":" + s3;
442         return s1 + ":" + s2;
443 }
444
445 function getGioHoangDao(jd) {
446         var chiOfDay = (jd+1) % 12;
447         var gioHD = GIO_HD[chiOfDay % 6]; // same values for Ty' (1) and Ngo. (6), for Suu and Mui etc.
448         var ret = "";
449         var count = 0;
450         for (var i = 0; i < 12; i++) {
451                 if (gioHD.charAt(i) == '1') {
452                         ret += CHI[i];
453                         ret += ' ('+(i*2+23)%24+'h-'+(i*2+1)%24+'h)';
454                         if (count++ < 5) ret += ', ';
455                         if (count == 3) ret += '<br>';
456                 }
457         }
458         return ret;
459 }
460
461 function getTHU(jd){
462     return TUAN[(jd+1)%7];
463 }
464
465 function getTHUINT(jd){
466     return (jd+1)%7;
467 }