3 var IMGS_RESOURCE_PATH = "/opt/lichvietwidget/qml/lichvietwidget/imgs/";
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) {
8 var lunar = getLunarDate(date.getDate(),date.getMonth(),date.getFullYear());
9 var lunarCanChi = getCanChi(lunar);
10 var xday = lunar.day; //need to replace it by lunar day
11 var xmonth = lunar.month;
12 var xyear = lunar.year;
14 txt_detail.text = "Ngày <b>"+lunarCanChi[0]+"</b>, Tháng <b>"+lunarCanChi[1]+"</b><br>Năm <b>"+lunarCanChi[2]+"</b>";
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;
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";
33 month_left_img.source = IMGS_RESOURCE_PATH +"0.png";
34 month_right_img.source = IMGS_RESOURCE_PATH + xmonth + ".png";
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";
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";
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.
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]";
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 */
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 */
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 */
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 */
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"
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) {
135 /* Discard the fractional part of a number, e.g., INT(3.2) = 3 */
137 return Math.floor(d);
140 function jdn(dd, mm, yy) {
141 var a = INT((14 - mm) / 12);
144 var jd = dd + INT((153*m+2)/5) + 365*y + INT(y/4) - INT(y/100) + INT(y/400) - 32045;
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;
149 function jdn2date(jd) {
150 var Z, A, alpha, B, C, D, E, dd, mm, yyyy, F;
155 alpha = INT((Z-1867216.25)/36524.25);
156 A = Z + 1 + alpha - INT(alpha/4);
159 C = INT( (B-122.1)/365.25);
161 E = INT( (B-D)/30.6001 );
162 dd = INT(B - D - INT(30.6001*E));
173 return new Array(dd, mm, yyyy);
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;
183 leapMonthLength = monthLengths[k >> 16 & 0x1];
184 solarNY = jdn(1, 1, yy);
185 currentJD = solarNY+offsetOfTet;
187 for(var i = 0; i < 12; i++) {
188 regularMonths[12 - i - 1] = monthLengths[j & 0x1];
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];
197 for(mm = 1; mm <= leapMonth; mm++) {
198 ly.push(new LunarDate(1, mm, yy, 0, currentJD));
199 currentJD += regularMonths[mm-1];
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];
209 LML = leapMonthLength;
214 function leapMonth(yyyy){
215 var yearCode = getYearCode(yyyy);
216 return yearCode & 0xf;
219 function monthLength(yyyy){
220 var yearCode = getYearCode(yyyy);
221 return yearCode >> 16 & 0x1;
224 function getYearCode(yyyy){
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];
233 yearCode = TK22[yyyy - 2100];
238 function getYearInfo(yyyy) {
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];
247 yearCode = TK22[yyyy - 2100];
249 return decodeLunarYear(yyyy, yearCode);
252 var FIRST_DAY = jdn(25, 1, 1800); // Tet am lich 1800
253 var LAST_DAY = jdn(31, 12, 2199);
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);
260 while (jd < ly[i].jd) {
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);
268 function getLunarDate(dd, mm, yyyy) {
270 if (yyyy < 1800 || 2199 < yyyy) {
271 //return new LunarDate(0, 0, 0, 0, 0);
273 ly = getYearInfo(yyyy);
274 jd = jdn(dd, mm, yyyy);
276 ly = getYearInfo(yyyy - 1);
278 return findLunarDate(jd, ly);
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
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
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
300 lambda = lambda - PI*2*(INT(lambda/(PI*2))); // Normalize to (0, 2*PI)
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 ...
310 function getSunLongitude(dayNumber, timeZone) {
311 return INT(SunLongitude(dayNumber - 0.5 - timeZone/24.0) / PI * 12);
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();
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("&");
326 for (i = 0; i < arr.length; i++) {
327 var a = arr[i].split("=");
328 for (j = 0; j < a.length; j++) {
335 function getSelectedMonth() {
336 var query = window.location.search;
337 var arr = parseQuery(query);
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]);
348 function getMonth(mm, yy) {
349 var ly1, ly2, tet1, jd1, jd2, mm1, yy1, result, i;
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);
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));
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));
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));
377 for (i = tet1; i < jd2; i++) {
378 result.push(findLunarDate(i, ly1));
384 function getDayName(lunarDate) {
385 if (lunarDate.day == 0) {
388 var cc = getCanChi(lunarDate);
389 var s = "Ng\u00E0y " + cc[0] +", th\341ng "+cc[1] + ", n\u0103m " + cc[2];
393 function getYearCanChi(year) {
394 return CAN[(year+6) % 10] + " " + CHI[(year+8) % 12];
398 * Can cua gio Chinh Ty (00:00) cua ngay voi JDN nay
400 function getCanHour0(jdn) {
401 return CAN[(jdn-1)*2 % 10];
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) {
411 yearName = getYearCanChi(lunar.year);
412 return new Array(dayName, monthName, yearName);
415 function getDayString(lunar, solarDay, solarMonth, solarYear) {
417 var dayOfWeek = TUAN[(lunar.jd + 1) % 7];
418 s = dayOfWeek + " " + solarDay + "/" + solarMonth + "/" + solarYear;
420 s = s + "Ng\u00E0y " + lunar.day+" th\341ng "+lunar.month;
421 if (lunar.leap == 1) {
422 s = s + " nhu\u1EADn";
427 function getTodayString() {
428 var s = getDayString(currentLunarDate, today.getDate(), today.getMonth()+1, today.getFullYear());
429 s += " n\u0103m " + getYearCanChi(currentLunarDate.year);
433 function getCurrentTime() {
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;
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.
450 for (var i = 0; i < 12; i++) {
451 if (gioHD.charAt(i) == '1') {
453 ret += ' ('+(i*2+23)%24+'h-'+(i*2+1)%24+'h)';
454 if (count++ < 5) ret += ', ';
455 if (count == 3) ret += '<br>';
462 return TUAN[(jd+1)%7];
465 function getTHUINT(jd){