
/*
Changes:
06/12/05 Rev 1.04 Used the Chinese traditional calendar.
06/12/14 Rev 1.05 Fixed yearly display date.
07/01/01 Rev 1.06 Corrected Tiet Khi, added Khong Vong.
07/01/22 Rev 1.07 Changed to run with FireFox or NetScape.
07/01/26 Rev 1.07-1 Changed Q11 & Q12.
*/

var Today = new Date();
var CY = Today.getFullYear();
var CM = Today.getMonth()+1;
var CD = Today.getDate();
var CL = new BatTu(CD, CM, CY);

var IE, NS;

function Init()
{
  IE = (navigator.appName == "Microsoft Internet Explorer" && parseInt(navigator.appVersion) >= 4);
  NS = (navigator.appName == "Netscape" && parseInt(navigator.appVersion) >= 4);
}

function Write(Id, val)
{
  if (IE) eval('document.all.'+Id).innerText = val;
  else document.getElementById(Id).innerHTML = val;
}

function Read(Id)
{
  var val;
  if (IE) val = eval('document.all.'+Id).innerText;
  else val = document.getElementById(Id).innerHTML;
  return val;
}

function SetColor(Id, val)
{
  if (IE) eval('document.all.'+Id).style.color = val;
  else document.getElementById(Id).style.color = val;
}

function SetView(Id, val)
{
  if (IE) eval('document.all.'+Id).style.visibility = val;
  else document.getElementById(Id).style.visibility = val;
}

function SetValue(Id, val)
{
  if (IE) eval('document.all.'+Id).value = val;
  else document.getElementById(Id).value = val;
}

function ClickIt()
{
}

function isLeapYear(year)
{
  return ((0 == (year%4)) && ((0 != (year%100)) || (0 == (year%400))));
  // is it leap year ? returns a boolean
  // ie, if the year divides by 4, but not by 100 except when it divides by
  // 400, it is leap year
}

function soNgay(year, mon)
{
  var mdays = new Array( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );
  var nd = mdays[mon-1];
  if (mon == 2 && isLeapYear(year)) nd++;
  return nd;
}

function capThoi()
{
  var td = new Date();

  document.TuTru.year.value  = CY;
  document.TuTru.month.value = CM;
  document.TuTru.day.value   = td.getDate();
  document.TuTru.hour.value  = td.getHours();
  document.TuTru.min.value   = td.getMinutes();
  document.TuTru.sec.value   = td.getSeconds();
  doiLich();
  delete td;
}

function doiLich()
{
  var yy = parseInt(TuTru.year.value);
  if (isNaN(yy))
  {
    alert("Xin vui lòng điền vào năm!");
    TuTru.year.focus();
    return;
  }
  var mm = parseInt(TuTru.month.value);
  var dd = parseInt(TuTru.day.value);
  var hh = parseInt(TuTru.hour.value);
  var oLunar = new LunarDate(dd, mm, yy);
  if (yy >= 1900)
  {
    var can = ThienCan(oLunar.dd);
    Write('dd_can', can); // Can ngày sẽ dùng cho giờ
    Write('dd_chi', DiaChi(oLunar.dd));
    Write('mm_can', ThienCan(oLunar.mm)); 
    Write('mm_chi', DiaChi(oLunar.mm));
    Write('yy_can', TueCan(oLunar.year));
    Write('yy_chi', TueChi(oLunar.year));
    var g = parseInt(hh) + 1;
    g = parseInt(g / 2);
    if (g >= 12) g = 11;
    Write('hh_can', ThoiCan(can, g));
    Write('hh_chi', CHI[g]);
    if (oLunar.isLeap)
      TuTru.leapYear.checked = true;
    else
      TuTru.leapYear.checked = false;
    TuTru.al_thang.value = oLunar.month;
    TuTru.al_ngay.value = oLunar.day;
    TuTru.al_gio.value = g;
  }
  if (yy > 1863 && yy < 1924)
    TuTru.Nguyen[0].checked = true;
  else if (yy > 1923 && yy < 1984)
    TuTru.Nguyen[1].checked = true;
  else
    TuTru.Nguyen[2].checked = true;

  // Clean up
  delete oLunar;
}

function createMenu(tok)
{
  var k, a, z;

  switch(tok)
  {
  case 'M':
  case 'n':
  case 'T':
    if (tok == 'M')
      k = Today.getMonth()+1;
    else if (tok == 'T')
      k = CL.tiet;
    else // Tháng âm lịch
      k = CL.month;
    a = 1; z = 12; break;
  case 'D':
    k = Today.getDate();
    a = 1; z = 31; break;
  case 'd': // Ngày âm lịch
    k = CL.day;
    a = 1; z = 30; break;
  case 't': // Tiết ngày sau tiết lệnh
    k = CL.tn;
    a = 1; z = 30; break;
  case 'H':
    k = Today.getHours();
    a = 0; z = 23; break;
  case 'm':
    k = Today.getMinutes();
    a = 0; z = 59; break;
  case 's':
    k = Today.getSeconds();
    a = 0; z = 59; break;
  case 'Q':
    k = 1; a = 1; z = 8; break;
  case 'Y':
    k = 0; a = 0; z = 6; break;
  }

  for (i=a;i<=z;i++)
  {
    document.write("<option value=" + i + (i == k ? " selected>" : ">") + i + "</option>");
  }
}

function layNamSinh(can, chi)
{
  var found = 0;
  var i = 0, j = 0;
  var y = 1924;
  // Tam Nguyên 60 Hoa Giáp
  if (document.all.Nguyen[0].checked == true)
    y = 1864;
  else if (document.all.Nguyen[1].checked == true)
    y = 1924;
  else
    y = 1984;

  for (i=0; i<60; i++)
  {
    var j = y+i;
    if ((can == TueCan(j)) && (chi == TueChi(j)))
    {
      found = 1; break;
    }
  }
  if (found) y += i;
  TuTru.year.value = y;
  Write('yy_can', can);
  Write('yy_chi', chi);
  layThang();

  // Reset selections
  SetView('achi', "hidden");
  SetView('dchi', "hidden");
  SetValue('can', 0);
  SetValue('achi', 0);
  SetValue('dchi', 0);
}

// Lấy Can cho năm sinh
function layTueCan()
{
  var can = parseInt(document.all.can.value);
  if (can)
  {
    if (can%2)
    {
      SetView('achi', "hidden");
      SetView('dchi', "visible");
      SetValue('achi', 0);
      SetValue('dchi', 0);
    }
    else
    {
      SetView('dchi', "hidden");
      SetView('achi', "visible");
      SetValue('achi', 0);
      SetValue('dchi', 0);
    }
  }
  else
  {
    SetView('achi', "hidden");
    SetView('dchi', "hidden");
    SetValue('achi', 0);
    SetValue('dchi', 0);
  }
}

// Lấy Dương Chi cho năm sinh
function layDChi()
{
  var can = parseInt(document.all.can.value);
  if (can == 0) return;
  var chi = parseInt(document.all.dchi.value);
  if (chi == 0) return;
  layNamSinh(CAN[can-1], CHI[chi-1]);
}

// Lấy Âm Chi cho năm sinh
function layAChi()
{
  var can = parseInt(document.all.can.value);
  if (can == 0) return;
  var chi = parseInt(document.all.achi.value);
  if (chi == 0) return;
  layNamSinh(CAN[can-1], CHI[chi-1]);
}

function doiALquaDL(nam, can, chi, mm, dd)
{
  var found = 0;
  var i = 0, j = 0;
  var y = 1924;
  // Tam Nguyên 60 Hoa Giáp
  if (!nam)
  {
    if (TuTru.Nguyen[0].checked == true)
      y = 1864;
    else if (TuTru.Nguyen[1].checked == true)
      y = 1924;
    else
      y = 1984;
  }
  else
  {
    if ((nam >= 1864) && (nam <= 1923))
      y = 1864;
    else if ((nam >= 1924) && (nam <= 1983))
      y = 1924;
    else
      y = 1984;
  }

  for (i=0; i<60; i++)
  {
    var j = y+i;
    if ((can == TueCan(j)) && (chi == TueChi(j)))
    {
      found = 1; break;
    }
  }
  if (found) y += i;

  // >>>>>>>>>>>> FireFox does not execute this function ????
  return convertLunar2Solar(dd, mm, y, 0, 0);
}

function chuyenLich()
{
  var can = Read('yy_can');
  var chi = Read('yy_chi');
  var mm = parseInt(TuTru.al_thang.value);
  var dd = parseInt(TuTru.al_ngay.value);
  var cvtdate = doiALquaDL(0, can, chi, mm, dd);
  var oLunar = new LunarDate(cvtdate[0], cvtdate[1], cvtdate[2]);
  var day = cvtdate[0];
  var mon = cvtdate[1];
  var year= cvtdate[2];
  if (year >= 1900)
  {
    /*
    if (oLunar.day != dd)
      alert("dd="+dd+" cvt_day="+oLunar.day+" days="+day+" mm="+mm+" mon="+mon+" yy="+year);
    */
    // Chỉnh lại ngày, tháng, năm
    if (oLunar.day < dd) day++;
    else if (oLunar.day > dd) day--;
    if (mon==12 && day>31)
    {
      day = 1; mon = 1; year++;
    }
    else if (day > 0)
    {
      var days = soNgay(year, mon);
      if (day > days)
      {
        day = 1; mon++
      }
    }
    else
    {
      mon--;
      day = soNgay(year, mon);
    }
  }

  document.TuTru.year.value  = year;
  document.TuTru.month.value = mon;
  document.TuTru.day.value   = day;

  var hh = parseInt(TuTru.al_gio.value) * 2;
  if (hh) hh -= 1;
  document.TuTru.hour.value  = hh;
  doiLich();

  // Clean up
  delete oLunar;
  for (var i=0; i<3; i++)
    delete cvtdate[i];
  delete cvtdate;
}

function layLich()
{
  if (TuTru.Lich[1].checked == true)
  {
    SetView('NamSinh', "visible");
    SetView('HoaGiap', "visible");
  }
  else
  {
    SetView('NamSinh', "hidden");
    SetView('HoaGiap', "hidden");
  }
}

function layThang()
{
  var mm = parseInt(TuTru.al_thang.value) - 1;
  var tc = Read('yy_can'); // Tuế Can
  var can = NguyetCan(tc, mm);
  Write('mm_can', can);
  mm += 2;
  if (mm > 11) mm -= 12;
  Write('mm_chi', CHI[mm]);
  chuyenLich();
}

function layNgay()
{
  var can = Read('yy_can');
  var chi = Read('yy_chi');
  var mm = parseInt(TuTru.al_thang.value);
  var dd = parseInt(TuTru.al_ngay.value);
  var cvtdate = doiALquaDL(0, can, chi, mm, dd);
  var oLunar = new LunarDate(cvtdate[0], cvtdate[1], cvtdate[2])
  var day = cvtdate[0];
  var mon = cvtdate[1];
  var year= cvtdate[2];
  /*
  if (oLunar.day != dd)
    alert("dd="+dd+" cvt_day="+oLunar.day+" days="+day+" mm="+mm+" mon="+mon+" yy="+year);
  */
  // Chỉnh lại ngày, tháng, năm
  if (oLunar.day < dd) day++;
  else if (oLunar.day > dd) day--;
  if (mon==12 && day>31)
  {
    day = 1; mon = 1; year++;
  }
  else if (day > 0)
  {
    var days = soNgay(year, mon);
    if (day > days)
    {
      day = 1; mon++
    }
  }
  else
  {
    mon--;
    day = soNgay(year, mon);
  }
  document.TuTru.year.value  = year;
  document.TuTru.month.value = mon;
  document.TuTru.day.value   = day;
  doiLich();

  // Clean up
  delete oLunar;
  for (var i=0; i<3; i++)
    delete cvtdate[i];
  delete cvtdate;
}

function layGio()
{
  var hh = parseInt(TuTru.al_gio.value) * 2;
  if (hh) hh -= 1
  document.TuTru.hour.value = hh;
  doiLich();
}

// An instance for array
function makeArray(elm, init)
{
  this.length = elm;
  for (var i = 1; i <= elm; i++)
    this[i] = init
}

var can_so = new Array( 6, 2, 8, 7, 1, 9, 3, 4, 6, 2 );
var sinhso = new Array( 1, 5, 3, 3, 5, 2, 2, 5, 4, 4, 5, 1 );
var thanhso = new Array(0, 6, 7, 8, 9, 10 );
var canHanh = new Array( "Mộc", "Mộc", "Hỏa", "Hỏa", "Thổ", "Thổ", "Kim", "Kim", "Thủy", "Thủy" );
var chiHanh = new Array( "Thủy", "Thổ", "Mộc", "Mộc", "Thổ", "Hỏa", "Hỏa", "Thổ", "Kim", "Kim", "Thổ", "Thủy" );

// Lấy số từ Thiên Can
function canSo(can)
{
  var i = 0;
  for (i = 0; i < 10; i++)
  {
    if (can == CAN[i]) break;
  }
  if (i < 10)
    return can_so[i];
  return 0;
}

// Lấy số từ Địa Chi
function chiSo1(chi)
{
  var i = 0;
  for (i = 0; i < 12; i++)
  {
    if (chi == CHI[i]) break;
  }
  if (i < 12)
    return sinhso[i];
  return 0;
}

// Lấy số thành của Địa Chi
function chiSo2(chi)
{
  var i = 0, ts = 0;
  for (i = 0; i < 12; i++)
  {
    if (chi == CHI[i]) break;
  }
  if (i < 12)
  {
    ts = sinhso[i];
    return thanhso[ts];
  }
  return 0;
}

// Lựa ra số chẵn
function soChan(so)
{
  var i = 0, ts = 0;
  for (i = 0; i < 12; i++)
  {
    if ((so[i] % 2) == 0)
      ts += so[i];
  }
  return ts;
}

// Lựa ra số lẻ
function soLe(so)
{
  var i = 0, ts = 0;
  for (i = 0; i < 12; i++)
  {
    if ((so[i] % 2) == 1)
      ts += so[i];
  }
  return ts;
}

// Lấy Âm Dương (0: Kh có, 1: D, 2: A)
function amDuong(can)
{
  var i = 0, found = 0;
  for (i = 0; i < 10; i++)
  {
    if (can == CAN[i])
    {
      found = 1; break;
    }
  }
  if (found)
    return ((i % 2) + 1);
  return 0;
}

function giamSo(amDuong, phai, loaiSo, tso)
{
  var so = 0;
  if (loaiSo == 1) // số lẻ
  {
    if (tso > 25)
      so = tso - 25;
    else
      so = tso;
  }
  else // số chẵn
  {
    if (tso > 30)
      so = tso - 30;
    else
      so = tso;
  }
  if (so == 10 || so == 20 || so == 30 || so == 40)
    so = so / 10;
  else
    so = so % 10;

  if (so != 5)
    return so;

  // Thượng Nguyên
  if (TuTru.Nguyen[0].checked == true)
  {
    if (phai == 0) // Nam
      so = 8;
    else
      so = 2;
  }
  // Trung Nguyên
  else if (TuTru.Nguyen[1].checked == true)
  {
    if (amDuong == 1)
    {
      if (phai == 0) // Nam
        so = 8;
      else
        so = 2;
    }
    else if (amDuong == 2)
    {
      if (phai == 0) // Nam
        so = 2;
      else
        so = 8;
    }
  }
  // Hạ Nguyên
  else
  {
    if (phai == 0) // Nam
      so = 9;
    else
      so = 7;
  }
  return so;
}

// Lấy ngày Xuân Phân **
function layXuanPhan(year)
{		
  return TietKhi(year, 5);
}

// Lấy ngày Hạ Chí **
function layHaChi(year)
{		
  return TietKhi(year, 11);
}

// Lấy ngày Thu Phân **
function layThuPhan(year)
{		
  return TietKhi(year, 17);
}

// Lấy ngày Đông Chí **
function layDongChi(year)
{		
  return TietKhi(year, 23);
}

// Tìm Hóa Công, 1 trong 3 Phúc Thần
function layHoaCong(dd, mm, yy)
{
  hc = 1; // Khảm
  if (mm == 12)
  {
    if (dd <= layDongChi(yy))
      hc = 7; // Đoài
    else
      hc = 1;
  }
  else if ((mm == 1) || (mm == 2))
  {
    hc = 1;
  }
  else if (mm == 3)
  {
    if (dd <= layXuanPhan(yy))
      hc = 1;
    else
      hc = 3; // Chấn
  }
  else if ((mm == 4) || (mm == 5))
  {
    hc = 3;
  }
  else if (mm == 6)
  {
    if (dd <= layHaChi(yy))
      hc = 3;
    else
      hc = 9; // Ly
  }
  else if ((mm == 7) || (mm == 8))
  {
    hc = 9;
  }
  else if (mm == 9)
  {
    if (dd <= layThuPhan(yy))
      hc = 9;
    else
      hc = 7; // Đoài
  }
  else if ((mm == 10) || (mm == 11))
  {
    hc = 7;
  }
  return hc;
}

// Thiên Nguyên Khí
function layTNK(can)
{
  var i = 0, tnk
  for (i = 0; i < 10; i++)
    if (can == CAN[i]) break;
  switch(i)
  {
  case 0:
  case 8: tnk = 6; break;
  case 1:
  case 9: tnk = 2; break;
  case 2: tnk = 8; break;
  case 3: tnk = 7; break;
  case 4: tnk = 1; break;
  case 5: tnk = 9; break;
  case 6: tnk = 3; break;
  case 7: tnk = 4; break;
  }
  return tnk;
}

// Địa Nguyên Khí
function layDNK(chi)
{
  var i = 0, dnk = 0
  for (i=0; i<12; i++)
    if (chi == CHI[i]) break;
  switch(i)
  {
  case 0: dnk = 1; break;
  case 1:
  case 2: dnk = 8; break;
  case 3: dnk = 3; break;
  case 4: break;
  case 5: dnk = 4; break;
  case 6: dnk = 9; break;
  case 7:
  case 8: dnk = 2; break;
  case 9: dnk = 7; break;
  case 10:
  case 11: dnk = 6; break;
  }
  return dnk;
}

var quai_danh = new Array( "?", "Khảm", "Khôn", "Chấn", "Tốn", "?", "Kiền", "Đoài", "Cấn", "Ly" );
var que_tuong = new Array( "?", "Thủy", "Địa", "Lôi", "Phong", "?", "Thiên", "Trạch", "Sơn", "Hỏa" );

// Cách lấy Trùng Quái
function layTrungQuai(t_quai, h_quai)
{
  var tq = "" // Trùng Quái

  if (t_quai == h_quai)
  {
    tq = quai_danh[t_quai] + " vi " + que_tuong[h_quai];
    return tq;
  }

  tq = que_tuong[t_quai] + " " + que_tuong[h_quai] + " ";

  switch(t_quai)
  {
  case 1: // Khảm (Thủy)
    switch(h_quai) {
    case 2: tq += "Tỷ"; break // Khôn (Địa)
    case 3: tq += "Truân"; break // Chấn (Lôi)
    case 4: tq += "Tỉnh"; break // Tốn (Phong)
    case 6: tq += "Nhu"; break // Kiền (Thiên)
    case 7: tq += "Tiết"; break // Đoài (Trạch)
    case 8: tq += "Kiển"; break // Cấn (Sơn)
    case 9: tq += "Ký Tế"; break // Ly (Hỏa)
    } break;
  case 2: // Khôn (Địa)
    switch(h_quai) {
    case 1: tq += "Sư"; break // Khảm (Thủy)
    case 3: tq += "Phục"; break // Chấn (Lôi)
    case 4: tq += "Thăng"; break // Tốn (Phong)
    case 6: tq += "Thái"; break // Kiền (Thiên)
    case 7: tq += "Lâm"; break // Đoài (Trạch)
    case 8: tq += "Khiêm"; break // Cấn (Sơn)
    case 9: tq += "Minh Di"; break // Ly (Hỏa)
    } break;
  case 3: // Chấn (Lôi)
    switch(h_quai) {
    case 1: tq += "Giải"; break // Khảm (Thủy)
    case 2: tq += "Dự"; break // Khôn (Địa)
    case 4: tq += "Hằng"; break // Tốn (Phong)
    case 6: tq += "Đại Tráng"; break // Kiền (Thiên)
    case 7: tq += "Qui Muội"; break // Đoài (Trạch)
    case 8: tq += "Tiểu Quá"; break // Cấn (Sơn)
    case 9: tq += "Phong"; break // Ly (Hỏa)
    } break;
  case 4: // Tốn (Phong)
    switch(h_quai) {
    case 1: tq += "Hoán"; break // Khảm (Thủy)
    case 2: tq += "Quán"; break // Khôn (Địa)
    case 3: tq += "Ích"; break // Chấn (Lôi)
    case 6: tq += "Tiểu Súc"; break // Kiền (Thiên)
    case 7: tq += "Trung Phu"; break // Đoài (Trạch)
    case 8: tq += "Tiệm"; break // Cấn (Sơn)
    case 9: tq += "Gia Nhân"; break // Ly (Hỏa)
    } break;
  case 6: // Kiền
    switch(h_quai) {
    case 1: tq += "Tụng"; break // Khảm (Thủy)
    case 2: tq += "Bĩ"; break // Khôn (Địa)
    case 3: tq += "Vô Vọng"; break // Chấn (Lôi)
    case 4: tq += "Cấu"; break // Tốn (Phong)
    case 7: tq += "Lý"; break // Đoài (Trạch)
    case 8: tq += "Độn"; break // Cấn (Sơn)
    case 9: tq += "Đồng Nhân"; break // Ly (Hỏa)
    } break;
  case 7: // Đoài (Trạch)
    switch(h_quai) {
    case 1: tq += "Khốn"; break // Khảm (Thủy)
    case 2: tq += "Tụy"; break // Khôn (Địa)
    case 3: tq += "Tùy"; break // Chấn (Lôi)
    case 4: tq += "Đại Quá"; break // Tốn (Phong)
    case 6: tq += "Quải"; break // Kiền (Thiên)
    case 8: tq += "Hàm"; break // Cấn (Sơn)
    case 9: tq += "Cách"; break // Ly (Hỏa)
    } break;
  case 8: // Cấn (Sơn)
    switch(h_quai) {
    case 1: tq += "Mông"; break // Khảm (Thủy)
    case 2: tq += "Bác"; break // Khôn (Địa)
    case 3: tq += "Di"; break // Chấn (Lôi)
    case 4: tq += "Cổ"; break // Tốn (Phong)
    case 6: tq += "Đại Súc"; break // Kiền (Thiên)
    case 7: tq += "Tổn"; break // Đoài (Trạch)
    case 9: tq += "Bí"; break // Ly (Hỏa)
    } break;
  case 9: // Ly (Hỏa)
    switch(h_quai) {
    case 1: tq += "Vị Tế"; break // Khảm (Thủy)
    case 2: tq += "Tấn"; break // Khôn (Địa)
    case 3: tq += "Phệ Hạp"; break // Chấn (Lôi)
    case 4: tq += "Đỉnh"; break // Tốn (Phong)
    case 6: tq += "Đại Hữu"; break // Kiền (Thiên)
    case 7: tq += "Khuê"; break // Đoài (Trạch)
    case 8: tq += "Lữ"; break // Cấn (Sơn)
    } break;
  }
  return tq;
}

// Cách lấy Trùng Quái Số
function soQue(t_quai, h_quai)
{
  var i;
  switch(t_quai)
  {
  case 1: // Khảm (Thủy)
    switch(h_quai) {
    case 1: i = 29; break // Khảm (Thủy)
    case 2: i =  8; break // Khôn (Địa)
    case 3: i =  3; break // Chấn (Lôi)
    case 4: i = 48; break // Tốn (Phong)
    case 6: i =  5; break // Kiền (Thiên)
    case 7: i = 60; break // Đoài (Trạch)
    case 8: i = 39; break // Cấn (Sơn)
    case 9: i = 63; break // Ly (Hỏa)
    } break;
  case 2: // Khôn (Địa)
    switch(h_quai) {
    case 1: i =  7; break // Khảm (Thủy)
    case 2: i =  2; break // Khôn (Địa)
    case 3: i = 24; break // Chấn (Lôi)
    case 4: i = 46; break // Tốn (Phong)
    case 6: i = 11; break // Kiền (Thiên)
    case 7: i = 19; break // Đoài (Trạch)
    case 8: i = 15; break // Cấn (Sơn)
    case 9: i = 36; break // Ly (Hỏa)
    } break;
  case 3: // Chấn (Lôi)
    switch(h_quai) {
    case 1: i = 40; break // Khảm (Thủy)
    case 2: i = 16; break // Khôn (Địa)
    case 3: i = 51; break // Chấn (Lôi)
    case 4: i = 32; break // Tốn (Phong)
    case 6: i = 34; break // Kiền (Thiên)
    case 7: i = 54; break // Đoài (Trạch)
    case 8: i = 62; break // Cấn (Sơn)
    case 9: i = 55; break // Ly (Hỏa)
    } break;
  case 4: // Tốn (Phong)
    switch(h_quai) {
    case 1: i = 59; break // Khảm (Thủy)
    case 2: i = 20; break // Khôn (Địa)
    case 3: i = 42; break // Chấn (Lôi)
    case 4: i = 57; break // Tốn (Phong)
    case 6: i =  9; break // Kiền (Thiên)
    case 7: i = 61; break // Đoài (Trạch)
    case 8: i = 53; break // Cấn (Sơn)
    case 9: i = 37; break // Ly (Hỏa)
    } break;
  case 6: // Kiền (Thiên)
    switch(h_quai) {
    case 1: i =  6; break // Khảm (Thủy)
    case 2: i = 12; break // Khôn (Địa)
    case 3: i = 25; break // Chấn (Lôi)
    case 4: i = 44; break // Tốn (Phong)
    case 6: i =  1; break // Kiền (Thiên)
    case 7: i = 10; break // Đoài (Trạch)
    case 8: i = 33; break // Cấn (Sơn)
    case 9: i = 13; break // Ly (Hỏa)
    } break;
  case 7: // Đoài (Trạch)
    switch(h_quai) {
    case 1: i = 47; break // Khảm (Thủy)
    case 2: i = 45; break // Khôn (Địa)
    case 3: i = 17; break // Chấn (Lôi)
    case 4: i = 28; break // Tốn (Phong)
    case 6: i = 43; break // Kiền (Thiên)
    case 7: i = 58; break // Đoài (Trạch)
    case 8: i = 31; break // Cấn (Sơn)
    case 9: i = 49; break // Ly (Hỏa)
    } break;
  case 8: // Cấn (Sơn)
    switch(h_quai) {
    case 1: i =  4; break // Khảm (Thủy)
    case 2: i = 23; break // Khôn (Địa)
    case 3: i = 27; break // Chấn (Lôi)
    case 4: i = 18; break // Tốn (Phong)
    case 6: i = 26; break // Kiền (Thiên)
    case 7: i = 41; break // Đoài (Trạch)
    case 8: i = 52; break // Cấn (Sơn)
    case 9: i = 22; break // Ly (Hỏa)
    } break;
  case 9: // Ly (Hỏa)
    switch(h_quai) {
    case 1: i = 64; break // Khảm (Thủy)
    case 2: i = 35; break // Khôn (Địa)
    case 3: i = 21; break // Chấn (Lôi)
    case 4: i = 50; break // Tốn (Phong)
    case 6: i = 14; break // Kiền (Thiên)
    case 7: i = 38; break // Đoài (Trạch)
    case 8: i = 56; break // Cấn (Sơn)
    case 9: i = 30; break // Ly (Hỏa)
    } break;
  }
  return i;
}

// Cách lấy Hỗ Quái cho thượng quái
function layHoQuai1(t_quai, h_quai)
{
  var hq = 0;
  switch(t_quai)
  {
  case 2: // Khôn (Địa)
  case 8: // Cấn (Sơn)
    switch(h_quai)
    {
    case 1: hq = 2; break; // Khảm (Thủy)
    case 2: hq = 2; break; // Khôn (Địa)
    case 3: hq = 2; break; // Chấn (Lôi)
    case 4: hq = 3; break; // Tốn (Phong)
    case 6: hq = 3; break; // Kiền (Thiên)
    case 7: hq = 2; break; // Đoài (Trạch)
    case 8: hq = 3; break; // Cấn (Sơn)
    case 9: hq = 3; break; // Ly (Hỏa)
    } break;
  case 6: // Kiền
  case 7: // Đoài (Trạch)
    switch(h_quai)
    {
    case 1: hq = 4; break; // Khảm (Thủy)
    case 2: hq = 4; break; // Khôn (Địa)
    case 3: hq = 4; break; // Chấn (Lôi)
    case 4: hq = 6; break; // Tốn (Phong)
    case 6: hq = 6; break; // Kiền (Thiên)
    case 7: hq = 4; break; // Đoài (Trạch)
    case 8: hq = 6; break; // Cấn (Sơn)
    case 9: hq = 6; break; // Ly (Hỏa)
    } break;
  case 3: // Chấn (Lôi)
  case 9: // Ly (Hỏa)
    switch(h_quai)
    {
    case 1: hq = 1; break; // Khảm (Thủy)
    case 2: hq = 1; break; // Khôn (Địa)
    case 3: hq = 1; break; // Chấn (Lôi)
    case 4: hq = 7; break; // Tốn (Phong)
    case 6: hq = 7; break; // Kiền (Thiên)
    case 7: hq = 1; break; // Đoài (Trạch)
    case 8: hq = 7; break; // Cấn (Sơn)
    case 9: hq = 7; break; // Ly (Hỏa)
    } break;
  case 1: // Khảm (Thủy)
  case 4: // Tốn (Phong)
    switch(h_quai)
    {
    case 1: hq = 8; break; // Khảm (Thủy)
    case 2: hq = 8; break; // Khôn (Địa)
    case 3: hq = 8; break; // Chấn (Lôi)
    case 4: hq = 9; break; // Tốn (Phong)
    case 6: hq = 9; break; // Kiền (Thiên)
    case 7: hq = 8; break; // Đoài (Trạch)
    case 8: hq = 9; break; // Cấn (Sơn)
    case 9: hq = 9; break; // Ly (Hỏa)
    } break;
  }
  return hq;
}

// Cách lấy Hỗ Quái cho hạ quái
function layHoQuai2(t_quai, h_quai)
{
  var hq = 0;
  switch(t_quai)
  {
  case 3: // Chấn (Lôi)
  case 6: // Kiền
  case 7: // Đoài (Trạch)
  case 9: // Ly (Hỏa)
    switch(h_quai)
    {
    case 1: hq = 9; break; // Khảm (Thủy)
    case 2: hq = 8; break; // Khôn (Địa)
    case 3: hq = 8; break; // Chấn (Lôi)
    case 4: hq = 6; break; // Tốn (Phong)
    case 6: hq = 6; break; // Kiền (Thiên)
    case 7: hq = 9; break; // Đoài (Trạch)
    case 8: hq = 4; break; // Cấn (Sơn)
    case 9: hq = 4; break; // Ly (Hỏa)
    } break;
  case 1: // Khảm (Thủy)
  case 2: // Khôn (Địa)
  case 4: // Tốn (Phong)
  case 8: // Cấn (Sơn)
    switch(h_quai)
    {
    case 1: hq = 3; break; // Khảm (Thủy)
    case 2: hq = 2; break; // Khôn (Địa)
    case 3: hq = 2; break; // Chấn (Lôi)
    case 4: hq = 7; break; // Tốn (Phong)
    case 6: hq = 7; break; // Kiền (Thiên)
    case 7: hq = 3; break; // Đoài (Trạch)
    case 8: hq = 1; break; // Cấn (Sơn)
    case 9: hq = 1; break; // Ly (Hỏa)
    } break;
  }
  return hq;
}

// Hào Tượng
function ghiHao(vi, hao)
{
  this.vi  = vi; // hào vị [1-6]
  this.hao = hao; // hào âm=6 (lục) hay dương=9 (cửu)
  this.cnt = 0; // số đếm
  this.nd  = 0; // đặt Nguyên Đường vào hay không
  this.dv1 = 0; // Đại vận khởi
  this.dv2 = 0; // Đại vận tận
}

// Tượng Quẻ (Trùng Quái) gồm cả hỗ quẻ
function queTuong(t_q, h_q, que)
{
  // Chủ quẻ
  this.t_q = t_q // Thượng Quái
  this.h_q = h_q // Hạ Quái
  this.ten = layTrungQuai(t_q, h_q) // Tên gọi
  this.hao = que // Thực Quẻ gồm 6 hào
  this.van = 0; // Tổng số năm của đại vận
  // Hỗ quẻ
  this.t_ho = layHoQuai1(t_q, h_q)
  this.h_ho = layHoQuai2(t_q, h_q)
  this.h_ten = layTrungQuai(this.t_ho, this.h_ho) 
  this.h_hao = lapQue(this.t_ho, this.h_ho)
}

// Tượng Quẻ (Trùng Quái) Lưu Vận (Niên hoặc Nguyệt)
function queLuuVan(t_q, h_q, que)
{
  this.t_q = t_q // Thượng Quái
  this.h_q = h_q // Hạ Quái
  this.hao = que // Thực Quẻ gồm 6 hào
  this.van = 0   // vận, tuổi, tháng
}

function xoaTuong(que)
{
  if (que == null) return;
  for (var i=0; i < que.hao.length; i++)
  {
    delete que.hao[i];
    delete que.h_hao[i];
  }
  delete que.hao;
  delete que.h_hao;
  delete que;
  que = null;
}

function xoaLuuVan(que)
{
  if (que == null) return;
  for (var i=0; i < que.hao.length; i++)
    delete que.hao[i];
  delete que.hao;
  delete que;
  que = null;
}

// Quẻ Khảm
function que1(q)
{
  var i = q.length;
  q.push(new ghiHao(++i, 6)) // hào lục sơ hay 4
  q.push(new ghiHao(++i, 9)) // hào cửu 2 hay 5
  q.push(new ghiHao(++i, 6)) // hào lục 3 hay 6
  return q;
}

// Quẻ Khôn
function que2(q)
{
  var i = q.length;
  q.push(new ghiHao(++i, 6)) // hào lục sơ hay 4
  q.push(new ghiHao(++i, 6)) // hào lục 2 hay 5
  q.push(new ghiHao(++i, 6)) // hào lục 3 hay 6
  return q;
}

// Quẻ Chấn
function que3(q)
{
  var i = q.length;
  q.push(new ghiHao(++i, 9)) // hào cửu sơ hay 4
  q.push(new ghiHao(++i, 6)) // hào lục 2 hay 5
  q.push(new ghiHao(++i, 6)) // hào lục 3 hay 6
  return q;
}

// Quẻ Tốn
function que4(q)
{
  var i = q.length;
  q.push(new ghiHao(++i, 6)) // hào lục sơ hay 4
  q.push(new ghiHao(++i, 9)) // hào cửu 2 hay 5
  q.push(new ghiHao(++i, 9)) // hào cửu 3 hay 6
  return q;
}

// Quẻ Kiền
function que6(q)
{
  var i = q.length;
  q.push(new ghiHao(++i, 9)) // hào cửu sơ hay 4
  q.push(new ghiHao(++i, 9)) // hào cửu 2 hay 5
  q.push(new ghiHao(++i, 9)) // hào cửu 3 hay 6
  return q;
}

// Quẻ Đoài
function que7(q)
{
  var i = q.length;
  q.push(new ghiHao(++i, 9)) // hào cửu sơ hay 4
  q.push(new ghiHao(++i, 9)) // hào cửu 2 hay 5
  q.push(new ghiHao(++i, 6)) // hào lục 3 hay 6
  return q;
}

// Quẻ Cấn
function que8(q)
{
  var i = q.length;
  q.push(new ghiHao(++i, 6)) // hào lục sơ hay 4
  q.push(new ghiHao(++i, 6)) // hào lục 2 hay 5
  q.push(new ghiHao(++i, 9)) // hào cửu 3 hay 6
  return q;
}

// Quẻ Ly
function que9(q)
{
  var i = q.length;
  q.push(new ghiHao(++i, 9)) // hào cửu sơ hay 4
  q.push(new ghiHao(++i, 6)) // hào lục 2 hay 5
  q.push(new ghiHao(++i, 9)) // hào cửu 3 hay 6
  return q;
}

var namNu = new Array( "Nam", "Nữ" );

// An Nguyên Đuờng cho quẻ bát thuần Kiền hoặc Khôn
function anQueThuan(que, gio, xt)
{
  var hao = que[0].hao;
  var phai=0, order=0;
  var i, j, k=0, g = gio + 1;
  var v=2, ii = 0, vv = 3;

  if (TuTru.Phai[1].checked == true)
    phai = 1;

  if (g > 6) g -= 6;

  if (hao == 9) // quẻ Kiền
  {
    switch(phai)
    {
    case 0: // Nam
      if (gio < 6) // giờ dương
      {
        ii = 0; vv = 3;
      }
      else // giờ âm
      {
        ii = 3; vv = 6;
      }
      break;
    case 1: // Nữ
      order = 0;
      if ((gio < 6) && (xt == 1)) // giờ dương & sau đông chí
      {
        ii = 3; vv = 6;
        order = 1 // reversed
      }
      else if ((gio > 5) && (xt == 1)) // giờ âm & sau đông chí
      {
        ii = 0; vv = 3;
        order = 1 // reversed
      }
      else if ((gio < 6) && (xt == 2)) // giờ dương & sau hạ chí
      {
        ii = 0; vv = 3;
      }
      else if ((gio > 5) && (xt == 2)) // giờ âm & sau hạ chí
      {
        ii = 3; vv = 6;
      }
      break;
    }
  }
  else // quẻ Khôn
  {
    switch(phai)
    {
    case 1: // Nữ
      if (gio < 6) // giờ dương
      {
        ii = 0; vv = 3;
      }
      else // giờ âm
      {
        ii = 3; vv = 6;
      }
      break;
    case 0: // Nam
      order = 0;
      if ((gio < 6) && (xt == 1)) // giờ dương & sau đông chí
      {
        ii = 0; vv = 3;
      }
      else if ((gio > 5) && (xt == 1)) // giờ âm & sau đông chí
      {
        ii = 3; vv = 6;
      }
      else if ((gio < 6) && (xt == 2)) // giờ dương & sau hạ chí
      {
        ii = 3; vv = 6;
        order = 1 // reversed
      }
      else if ((gio > 5) && (xt == 2)) // giờ âm & sau hạ chí
      {
        ii = 0; vv = 3;
        order = 1 // reversed
      }
      break;
    }
  }

  /*
  var s = "ii=" + ii + " vv=" + vv + " g=" + g + " order=" + order
  */

  for (j=0; j<v; j++)
  {
    for (i=ii; i<vv; i++)
    {
      var x = i;
      if (order)
        x = vv - (i+1);
      if (que[x].cnt < 2)
      {
        que[x].cnt++;
        k++;
      }
      if (k == g) // found it
      {
        que[x].nd = 1;
        break;
      }
    }
    if (k == g) break; // found
  }
}

// An Nguyên Đường
function an_ND(que, chiGio, xt)
{
  var g, i, gio, hc = 0 // hao counter
  for (g = 0; g < 12; g++)
    if (chiGio == CHI[g]) break;

  var hao
  // Bát Thuần Kiền hay Khôn, kết quả hc=0
  switch(g)
  {
  // Giờ Dương
  case 0: case 1: case 2: case 3: case 4: case 5: gio = 1; hao = 9
    for (i = 0; i < que.length; i++)
      if (que[i].hao == hao) hc++;
    break;
  // Giờ Âm
  case 6: case 7: case 8: case 9: case 10: case 11: gio = 2; hao = 6
    for (i = 0; i < que.length; i++)
      if (que[i].hao == hao) hc++;
    break;
  }
  if (hc == 0) hc = 6;
  if (hc < 6)
  {
    g++
    if (g > 6) g -= 6;
  }
  var j=0, k=0, v=0;

  // Algorithms for settling a Main Hall of Life (ND)
  switch(hc)
  {
  case 1: v = 3;
  case 2: if (v == 0) v = 5;
    for (j=0; j<v; j++)
    {
      if (j == (v-1)) // the last round changes Yang to Yin or vice versa
        hao = ((hao == 9) ? 6 : 9);
      for (i = 0; i < que.length; i++)
      {
        if (que[i].hao == hao)
        {
          if (que[i].cnt < 2)
          {
            que[i].cnt++;
            k++;
          }
          if (k == g) // found it
          {
            que[i].nd = 1;
            break;
          }
        }
      }
      if (k == g) break; // found
    }
    break;
  case 3: v = 2;
    for (j=0; j<v; j++)
    {
      for (i = 0; i < que.length; i++)
      {
        if (que[i].hao == hao)
        {
          if (que[i].cnt < 2)
          {
            que[i].cnt++;
            k++
          }
          if (k == g) // found it
          {
            que[i].nd = 1;
            break;
          }
        }
      }
      if (k == g) break; // found
    }
    break;
  case 4: case 5: v = 2;
    for (j=0; j<v; j++)
    {
      if (j == (v-1)) // the last round changes Yang to Yin or vice versa
        hao = ((hao == 9) ? 6 : 9);
      for (i = 0; i < que.length; i++)
      {
        if (que[i].hao == hao)
        {
          if (que[i].cnt < 1)
          {
            que[i].cnt++;
            k++;
          }
          if (k == g) // found it
          {
            que[i].nd = 1;
            break;
          }
        }
      }
      if (k == g) break; // found
    }
    break;
  case 6:
    anQueThuan(que, g, xt);
    break;
  }
/*
  var s = ((gio == 1) ? "Yang Yao=" : "Yin Yao=") + hc + " Gio=" + g + " Found=" + k;
  for (i = 0; i < que.length; i++)
    if (que[i].nd == 1)
      break;
  s += "\nChiGio=" + chiGio + " ND=" + (i+1)
*/
}

// Lấy Nội (Hạ) Quẻ
function layNoiQue(hq)
{
  var que = new Array();

  switch(hq)
  {
  case 1: que = que1(que); break; // Thủy
  case 2: que = que2(que); break; // Địa
  case 3: que = que3(que); break; // Lôi
  case 4: que = que4(que); break; // Phong
  case 6: que = que6(que); break; // Thiên
  case 7: que = que7(que); break; // Trạch
  case 8: que = que8(que); break; // Sơn
  case 9: que = que9(que); break; // Hỏa
  }
  return que;
}

// Lập Trùng Quẻ
function lapQue(tq, hq)
{
  var que;
  switch(tq)
  {
  case 1: // Khảm Thủy
    que = que1(layNoiQue(hq)); break;
  case 2: // Khôn Địa
    que = que2(layNoiQue(hq)); break;
  case 3: // Chấn Lôi
    que = que3(layNoiQue(hq)); break;
  case 4: // Tốn Phong
    que = que4(layNoiQue(hq)); break;
  case 6: // Kiền Thiên
    que = que6(layNoiQue(hq)); break;
  case 7: // Đoài Trạch
    que = que7(layNoiQue(hq)); break;
  case 8: // Cấn Sơn
    que = que8(layNoiQue(hq)); break;
  case 9: // Ly Hỏa
    que = que9(layNoiQue(hq)); break;
  }
  return que;
}

// Lấy Quẻ Tiên Thiên
function lapQueTT(flag, l_so, c_so, chiGio, xt)
{
  var tq, hq, i;
  if (flag) { tq = c_so; hq = l_so }
  else { hq = c_so; tq = l_so }

  var que = lapQue(tq, hq);

  an_ND(que, chiGio, xt);

  // Tạo tượng quẻ (trùng quái)
  var TT = new queTuong(tq, hq, que);

  // Tìm Nguyên Đường và an Đại Vận
  for (i = 0; i < que.length; i++)
    if (que[i].nd == 1) break;
  // Ghi nhận tổng số năm của đại vận
  TT.van = anDaiVan(que, i, 0);

  return TT;
}

// Cách lấy Biến Quái, động hào phải là 1-3
function layBienQuai(quai, donghao)
{
  var bq = quai
  if (donghao > 3 || donghao < 0)
    return bq;

  switch(quai)
  {
  case 1: switch(donghao) // Khảm
    {
    case 1: bq = 7; break;
    case 2: bq = 2; break;
    case 3: bq = 4; break;
    } break;
  case 2: switch(donghao) // Khôn
    {
    case 1: bq = 3; break;
    case 2: bq = 1; break;
    case 3: bq = 8; break;
    } break;
  case 3: switch(donghao) // Chấn
    {
    case 1: bq = 2; break;
    case 2: bq = 7; break;
    case 3: bq = 9; break;
    } break;
  case 4: switch(donghao) // Tốn
    {
    case 1: bq = 6; break;
    case 2: bq = 8; break;
    case 3: bq = 1; break;
    } break;
  case 6: switch(donghao) // Kiền
    {
    case 1: bq = 4; break;
    case 2: bq = 9; break;
    case 3: bq = 7; break;
    } break;
  case 7: switch(donghao) // Đoài
    {
    case 1: bq = 1; break;
    case 2: bq = 3; break;
    case 3: bq = 6; break;
    } break;
  case 8: switch(donghao) // Cấn
    {
    case 1: bq = 9; break;
    case 2: bq = 4; break;
    case 3: bq = 2; break;
    } break;
  case 9: switch(donghao) // Ly
    {
    case 1: bq = 8; break;
    case 2: bq = 6; break;
    case 3: bq = 3; break;
    } break;
  }
  return bq;
}

// An Đại Vận
function anDaiVan(que, ii, v)
{
  var k, dv = v;
  for (k=ii; k<que.length; k++)
  {
    que[k].dv1 = dv + 1;
    que[k].dv2 = dv + que[k].hao;
    dv += que[k].hao;
  }
  for (k=0; k<ii; k++)
  {
    que[k].dv1 = dv + 1;
    que[k].dv2 = dv + que[k].hao;
    dv += que[k].hao;
  }
  return dv;
}

// Lấy Quẻ Hậu Thiên
function lapQueHT(flag, l_so, c_so, TT, TTvan)
{
  var tq, hq;
  if (flag) { tq = l_so; hq = c_so }
  else { hq = l_so; tq = c_so }

  var HT = lapQue(tq, hq) // Quẻ Hậu Thiên

  var i, j;
  // Tìm lại Nguyên Đường của Tiên Thiên
  for (i = 0; i < TT.length; i++)
    if (TT[i].nd == 1) break;

  // TT ra HT thì ngược (a reversed order)
  var t_bien, h_bien;
  switch(i)
  {
  case 0: case 1: case 2: j = i + 3; h_bien = hq; t_bien = layBienQuai(tq, i+1); break;
  case 3: case 4: case 5: j = i - 3; t_bien = tq; h_bien = layBienQuai(hq, j+1); break;
  }

  // Biến quẻ
  HT[j].nd = 1;
  if (HT[j].hao == 9) HT[j].hao = 6;
  else HT[j].hao = 9;

  // Tạo tượng quẻ (trùng quái)
  var queHT = new queTuong(t_bien, h_bien, HT);
  // An Đại Vận
  queHT.van = anDaiVan(HT, j, TTvan);

  return queHT;
}

// Thời Xuân Thu làm chủ
function xuanThu(dd, mm, yy)
{
  var xt = 1;
  if (mm == 12)
  {
    if (dd <= layDongChi(yy))
      xt = 2;
    else
      xt = 1;
  }
  else if (mm >= 1 && mm <= 5)
      xt = 1;
  else if (mm == 6)
  {
    if (dd <= layHaChi(yy))
      xt = 1;
    else
      xt = 2;
  }
  else if (mm >= 7 && mm <= 11)
      xt = 2;

  return xt;
}

// Tìm Không Vong; nhập Can & Chi Năm; return chi đầu trong mỗi cặp
function khongVong(can, chi)
{
  // Trong vòng ------------ Giáp Tý,  G.  Tuất, G. Thân, G.  Ngọ, G. Thìn, G. Dần
  // Không Vong luôn có đôi: Tuất Hợi, Thân Dậu, Ngọ Mùi, Thìn Tỵ, Dần Mão, Tý Sửu
  var KV1 = [10,8,6,4,2,0];
  //var KV2 = [11,9,7,5,3,1];
  var canvi = canVi(can);
  var chivi = chiVi(chi);
  var biet  = chivi - canvi;
  if (biet < 0) biet += 12;
  switch(biet)
  {
  case  0: kv=KV1[0]; break;
  case  2: kv=KV1[5]; break;
  case  4: kv=KV1[4]; break;
  case  6: kv=KV1[3]; break;
  case  8: kv=KV1[2]; break;
  case 10: kv=KV1[1]; break;
  }
  return kv;
}

// Tìm Không Vong Thời; Nhập Can ngày, return chi GIỜ đầu trong mỗi cặp
function gioKhongVong(can)
{
  // Không Vong luôn có đôi: Tuất Hợi, Thân Dậu, Ngọ Mùi, Thìn Tỵ, Dần Mão, Tý Sửu
  var KV1 = [10,8,6,4,2,0];
  //var KV2 = [11,9,7,5,3,1];
  var can = canVi(can);
  var kv=0;
  switch(can)
  {
  case 0: case 5: kv=KV1[1]; break; // Ngày Giáp Kỷ  : giờ Thân Dậu
  case 1: case 6: kv=KV1[2]; break; // Ngày Ất Canh  : giờ Ngọ Mùi
  case 2: case 7: kv=KV1[3]; break; // Ngày Bính Tân : giờ Thìn Tỵ
  case 3: case 8: kv=KV1[4]; break; // Ngày Đinh Nhâm: giờ Dần Mão
  case 4: case 9: kv=KV1[0]; break; // Ngày Mậu Quí  : giờ Tý Sửu
  }
  return kv;
}

// Lấy Nạp Âm Ngu Hành Vị trí (0-29), a true value
function napAmVi(can, chi)
{
  var na;
  switch(can) {
  case 0:
    switch(chi) {
    case  0: na =  0; break;
    case  2: na = 25; break;
    case  4: na = 20; break;
    case  6: na = 15; break;
    case  8: na = 10; break;
    case 10: na =  5; break;
    } break;
  case 1:
    switch(chi) {
    case  1: na =  0; break;
    case  3: na = 25; break;
    case  5: na = 20; break;
    case  7: na = 15; break;
    case  9: na = 10; break;
    case 11: na =  5; break;
    } break;
  case 2:
    switch(chi) {
    case  0: na =  6; break;
    case  2: na =  1; break;
    case  4: na = 26; break;
    case  6: na = 21; break;
    case  8: na = 16; break;
    case 10: na = 11; break;
    } break;
  case 3:
    switch(chi) {
    case  1: na =  6; break;
    case  3: na =  1; break;
    case  5: na = 26; break;
    case  7: na = 21; break;
    case  9: na = 16; break;
    case 11: na = 11; break;
    } break;
  case 4:
    switch(chi) {
    case  0: na = 12; break;
    case  2: na =  7; break;
    case  4: na =  2; break;
    case  6: na = 27; break;
    case  8: na = 22; break;
    case 10: na = 17; break;
    } break;
  case 5:
    switch(chi) {
    case  1: na = 12; break;
    case  3: na =  7; break;
    case  5: na =  2; break;
    case  7: na = 27; break;
    case  9: na = 22; break;
    case 11: na = 17; break;
    } break;
  case 6:
    switch(chi) {
    case  0: na = 18; break;
    case  2: na = 13; break;
    case  4: na =  8; break;
    case  6: na =  3; break;
    case  8: na = 28; break;
    case 10: na = 23; break;
    } break;
  case 7:
    switch(chi) {
    case  1: na = 18; break;
    case  3: na = 13; break;
    case  5: na =  8; break;
    case  7: na =  3; break;
    case  9: na = 28; break;
    case 11: na = 23; break;
    } break;
  case 8:
    switch(chi) {
    case  0: na = 24; break;
    case  2: na = 19; break;
    case  4: na = 14; break;
    case  6: na =  9; break;
    case  8: na =  4; break;
    case 10: na = 29; break;
    } break;
  case 9:
    switch(chi) {
    case  1: na = 24; break;
    case  3: na = 19; break;
    case  5: na = 14; break;
    case  7: na =  9; break;
    case  9: na =  4; break;
    case 11: na = 29; break;
    } break;
  }
  return na;
}

// Lấy Nạp Âm Ngu Hành Vị trí (0-29), a true value
function layNapAmVi(can, chi)
{
  return napAmVi(canVi(can), chiVi(chi));
}

var napAm5Hanh = new Array(
	"Hải trung Kim", "Lô trung Hỏa", "Đại lâm Mộc", "Lộ bàng Thổ", "Kiếm phong Kim", "Sơn đầu Hỏa",
	"Giản hạ Thủy", "Thành đầu Thổ", "Bạch lạp Kim", "Dương liễu Mộc", "Tuyền trung Thủy", "Ốc thượng Thổ",
	"Phích lịch Hỏa", "Tùng bách Mộc", "Trường lưu Thủy", "Sa trung Kim", "Sơn hạ Hỏa", "Bình địa Mộc",
	"Bích thượng Thổ", "Kim bạc Kim", "Phúc đăng Hỏa", "Thiên hà Thủy", "Đại dịch Thổ", "Sai xuyến Kim",
	"Tang thác Mộc", "Đại khê Thủy", "Sa trung Thổ", "Thiên thượng Hỏa", "Thạch lựu Mộc", "Đại hải Thủy" );

// Lấy Nạp Âm Ngũ Hành
function napAm(can, chi)
{
  var v = napAmVi(can, chi);
  return napAm5Hanh[v];
}

// Lấy Nạp Âm Ngũ Hành
function napAmNghia(can, chi)
{
  var Nghia = new Array(
	"vàng dưới biển", "lửa trong lò", "cây rừng lớn", "đất bên đường", "vàng mũi kiếm", "lửa đầu núi",
	"nước dưới khe", "đất đầu thành", "vàng chân đèn", "gổ dương liễu", "nước dưới suối", "đất trên nóc",
	"lửa sấm sét", "gổ cây tùng", "nước nguồn chảy", "vàng trong cát", "lửa dưới núi", "cây đồng bằng",
	"đất trên vách", "vàng pha bạc", "lửa đèn lồng", "nước ngân hà", "khu đất rộng", "vàng trang sức",
	"gỗ cây dâu", "nước khe lớn", "đất lẫn cát", "lửa trên trời", "gỗ thạch lựu", "nước biển rộng" );

  var v = napAmVi(can, chi);
  return Nghia[v];
}

// Điều chỉnh lại theo luật Hà Lạc Bát Tự
function BatTu(dd, mm, yy)
{
  var oSinh = new LunarDate(dd,mm,yy);
  var t = TietKhi(yy,(mm-1)*2);
  var oTiet = new LunarDate(t,mm,yy); // Tiết lệnh

  this.tue = oSinh.year;
  this.tiet= mm-1;

  if (this.tiet == 0)
  {
    this.tiet = 12;
    if (this.tue == yy)
      this.tue--;
  }
  if (oSinh.dd < oTiet.dd)
  {
    if (this.tiet <= 12)
    {
      this.tiet--;
      if (this.tiet == 0)
      {
        this.tiet = 12;
        if (this.tue == yy)
          this.tue--;
      }
    }
    t = TietKhi(this.tue, this.tiet*2);
    delete oTiet;
    oTiet = new LunarDate(t,this.tiet+1, this.tue);
  }
  if (this.tiet == 1 && this.tue < yy) this.tue=yy;

  this.tn = oSinh.dd - oTiet.dd + 1; // Tiết ngày

  var s = "Tiết "+oTiet.year+" mm="+oTiet.month+" dd="+oTiet.day+" DAYS="+oTiet.dd+"\n";
  s += "Sinh="+oSinh.year+" mm="+oSinh.month+" dd="+oSinh.day+" DAYS="+oSinh.dd+"\n";
  s += " Dùng năm="+this.tue+" tháng="+oTiet.month+" Lenh tiet="+this.tiet+" tn="+this.tn;
  //alert(s);

  this.y = yy;
  this.m = mm;
  this.d = dd;
  this.day = oSinh.day;
  this.month = oSinh.month;
  this.year = oSinh.year;
  this.isLeap = oSinh.isLeap;
  this.dd = oSinh.dd;
  this.mm = oSinh.mm;
  this.yy = oSinh.yy;

  delete oTiet;
  delete oSinh;
}

var DUONG = "visible";
var AM = "hidden";
var queTT, queHT;
var oTuoi;

function layQue()
{
  var can = new makeArray(4, "i");
  var chi = new makeArray(4, "i");
  var cacso = new makeArray(12, 0);
  var s = " ";

  doiLich();
  var yy = parseInt(TuTru.year.value);
  var mm = parseInt(TuTru.month.value);
  var dd = parseInt(TuTru.day.value);
  // Tính tuổi trong năm sinh
  if (oTuoi != null) delete oTuoi;
  oTuoi = new BatTu(dd, mm, yy);
  var c = (oTuoi.tiet+1)%12;
  var tiet = oTuoi.tiet*2; // Thực Tiết
  if (tiet == 24) tiet = 0;
  can[0] = TueCan(oTuoi.tue);
  chi[0] = TueChi(oTuoi.tue);
  can[1] = NguyetCan(can[0], oTuoi.tiet-1);
  chi[1] = CHI[c];
  can[2] = Read('dd_can');
  chi[2] = Read('dd_chi');
  can[3] = Read('hh_can');
  chi[3] = Read('hh_chi');

  var i = 0, j = 0, ad, tsc, tsl, l_so, c_so, phai = 0;
  for (i=0; i<4; i++)
  {
    cacso[j] = canSo(can[i]);  j++;
    cacso[j] = chiSo1(chi[i]); j++;
    cacso[j] = chiSo2(chi[i]); j++;
  }
  for (i=0; i<12; i++)
    s += cacso[i] + " ";
  tsc = soChan(cacso);
  tsl = soLe(cacso);

  var soCL = s // output

  if (TuTru.Phai[1].checked == true)
    phai = 1;

  var flag = 0 // Dương Nam & Âm Nữ

  if (ad = amDuong(can[0]))
  {
    if (ad == 1)
    {
      if (phai) flag = 1; // Dương Nữ
      s = "Dương ";
    }
    else
    {
      if (phai == 0) flag = 1; // Âm Nam 
      s = "Âm ";
    }
  }
  s += namNu[phai];

  var phaiTinh = s; // output

  l_so = giamSo(ad, phai, 1, tsl);
  c_so = giamSo(ad, phai, 2, tsc);

  s += "\nL=" + l_so;
  s += "\nC=" + c_so;
  s += (flag ? "\nChẵn trên" : "\nLẻ trên" );

  var hc = layHoaCong(dd, mm, yy);
/*
  s += "; Hóa Công=" + hc + " TNK=" + layTNK(can[0]) + " DNK=" + layDNK(chi[0])
*/

  if (queTT != null) xoaTuong(queTT);
  if (queHT != null) xoaTuong(queHT);

  var xt = xuanThu(dd, mm, yy);
  queTT = lapQueTT(flag, l_so, c_so, chi[3], xt);
  queHT = lapQueHT(flag, l_so, c_so, queTT.hao, queTT.van);
  //var queTT = lapQueTT(flag, 6, 6, chi[3], xt);
  /*
  s = " TT: " + queTT.ten + "\n";
  for (i=1; i <= queTT.hao.length; i++)
  {
    s += "H" + queTT.hao[6-i].vi + "=" + queTT.hao[6-i].hao + " DV=" + queTT.hao[6-i].dv1 + "-" + queTT.hao[6-i].dv2 + "\n";
  }
  for (i = 0; i < queTT.hao.length; i++)
    if (queTT.hao[i].nd == 1) break;
  s += "Que ND=" + (i+1)
  */

  s = "Năm " + can[0] + " " + chi[0];
  s += ", lệnh tiết " + TIET[tiet] + " " + can[1] + " " + chi[1];
  s += ", ngày " + can[2] + " " + chi[2];
  s += ", giờ " + can[3] + " " + chi[3];
  Write('Xem8Tu', s);
  Write('TTBonQue', queTT.ten); // Tên Trùng Quái
  SetColor('TTBonQue', "blue");
  Write('TT_TQuai', quai_danh[queTT.t_q]); // Thượng Quái
  Write('TT_HQuai', quai_danh[queTT.h_q]); // Hạ Quái
  var hObj, j, hid, hao;
  var TTnd;
  for (i=0; i < queTT.hao.length; i++)
  {
    j=i+1;
    hao = ((queTT.hao[6-j].hao == 9) ? DUONG : AM);
    hid = 'TT_hao'+(6-i);
    SetView(hid+'C', hao);
    if (queTT.hao[6-j].nd)
    {
      TTnd = 6-j;
      SetColor(hid, "red");
    }
    else
      SetColor(hid, "black");
  }
  TTnd++;

  for (i=0; i < queTT.hao.length; i++)
  {
    j=i+1;
    Write('TT_DV'+(6-i), queTT.hao[6-j].dv1 + "-" + queTT.hao[6-j].dv2);
  }

  Write('TTHoQue', queTT.h_ten);
  SetColor('TTHoQue', "blue");
  Write('TT_HoTQ', quai_danh[queTT.t_ho]); // Thượng Hỗ Quái
  Write('TT_HoHQ', quai_danh[queTT.h_ho]); // Hạ Hỗ Quái
  for (i=0; i < queTT.hao.length; i++)
  {
    j=i+1;
    hao = ((queTT.h_hao[6-j].hao == 9) ? DUONG : AM);
    SetView('TT_hoh'+(6-i)+'C', hao);
  }

  Write('HTBienQue', queHT.ten);
  SetColor('HTBienQue', "blue");
  Write('HT_TQuai', quai_danh[queHT.t_q]); // Thượng Quái
  Write('HT_HQuai', quai_danh[queHT.h_q]); // Hạ Quái
  var HTnd;
  for (i=0; i < queHT.hao.length; i++)
  {
    j=i+1;
    hao = ((queHT.hao[6-j].hao == 9) ? DUONG : AM);
    hid = 'HT_hao'+(6-i);
    SetView(hid+'C', hao);
    if (queHT.hao[6-j].nd)
    {
      HTnd = 6-j;
      SetColor(hid, "red");
    }
    else
      SetColor(hid, "black");
  }
  HTnd++;

  for (i=0; i < queHT.hao.length; i++)
  {
    j=i+1;
    Write('HT_DV'+(6-i), queHT.hao[6-j].dv1 + "-" + queHT.hao[6-j].dv2);
  }

  Write('HTHoQue', queHT.h_ten);
  SetColor('HTHoQue', "blue");
  Write('HT_HoTQ', quai_danh[queHT.t_ho]); // Thượng Hỗ Quái
  Write('HT_HoHQ', quai_danh[queHT.h_ho]); // Hạ Hỗ Quái
  for (i=0; i < queHT.hao.length; i++)
  {
    j=i+1;
    hao = ((queHT.h_hao[6-j].hao == 9) ? DUONG : AM);
    SetView('HT_hoh'+(6-i)+'C', hao);
  }
  var tuoi = parseInt(CL.tue) - parseInt(oTuoi.tue) + 1;
  var kv = khongVong(can[0],chi[0]);
  Write('m_nam', oTuoi.tue);
  Write('m_nam_cc', can[0]+" "+chi[0]);
  Write('m_nam_kv', CHI[kv]+" "+CHI[kv+1]);

  kv = khongVong(can[1],chi[1]);
  Write('m_tiet', oTuoi.tiet);
  Write('m_tiet_cc', can[1]+" "+chi[1]);
  Write('m_tiet_kv', CHI[kv]+" "+CHI[kv+1]);

  kv = khongVong(can[2],chi[2]);
  Write('m_nhat', oTuoi.day);
  Write('m_nhat_cc', can[2]+" "+chi[2]);
  Write('m_nhat_kv', CHI[kv]+" "+CHI[kv+1]);

  kv = khongVong(can[3],chi[3]);
  Write('m_thoi', TuTru.hour.value);
  Write('m_thoi_cc', can[3]+" "+chi[3]);
  Write('m_thoi_kv', CHI[kv]+" "+CHI[kv+1]);

  kv = gioKhongVong(can[2]); // Nhật -> Giờ
  Write('m_ngay_cc', can[2]);
  Write('m_gio_kv', CHI[kv]+" "+CHI[kv+1]);

  Write('m_phai', phaiTinh);
  Write('m_tuoi', tuoi);
  Write('m_mang', napAm(canVi(can[0]), chiVi(chi[0]))+" ("+napAmNghia(canVi(can[0]), chiVi(chi[0]))+")");

  Write('m_8chu', soCL);
  Write('m_dSo', tsl);
  Write('m_aSo', tsc);
  Write('m_ttnd', TTnd);
  Write('m_htnd', HTnd);
  Write('m_hc', quai_danh[hc]);
  Write('m_tnk', quai_danh[layTNK(can[0])]);
  Write('m_dnk', quai_danh[layDNK(chi[0])]);

  SetView('HaLac', "visible");

  layLuuNien();
  // Clean up
  for (i=0; i<12; i++)
    delete cacso[i];
  for (i=0; i<4; i++)
  {
    delete can[i];
    delete chi[i];
  }
}

function xoaQue()
{
  document.all.HaLac.style.visibility = "hidden";
  capThoi();
  document.all.LN_Thang.value = CL.tiet;
  document.all.LN_Ngay.value =  CL.tn;
}

// Lấy Hào Ứng
function layHaoUng(the)
{
  var ung = 0;
  switch(the) // Ứng cách Thế 3 hào (toán)
  {
  case 0: case 1: case 2: ung = the + 3; break
  case 3: case 4: case 5: ung = the - 3; break
  }
  return ung;
}

// Lấy Lưu Niên Quẻ
function layLuuQue(que, tt)
{
  // Chủ hay bổn quẻ
  var lq = lapQue(que.t_q, que.h_q);
  var i, j;

  if (tt > que.van) tt = que.van;

  // Tìm năm tuổi thuộc trong Đại Vận nào
  for (i=0; i < que.hao.length; i++)
    if ((tt >= que.hao[i].dv1) && (tt <= que.hao[i].dv2))
      break;

  // The first year in a period, qui luật:
  //   - Nếu năm đó là năm Dương và là Dương hào thì bất biến.
  //   - Chỉ biến năm Âm hoặc Âm hào
  var bt = tt - que.hao[i].dv1 // biến theo từng tuổi
  var vanNam = oTuoi.tue + que.hao[i].dv1 - 1
  var can = TueCan(vanNam)
  var ad = amDuong(can)
  var dhao = 0 // đại vận là dương hào hay không

  /*
  var s = "Tuoi=" + tt + " Year=" + vanNam + " Can=" + can + ", năm " + ((ad == 1) ? "dương" : "âm")
  */

  var tb, hb // Thượng và Hạ Biến quái
  if ((ad == 1) && (lq[i].hao == 9)) // bất biến
  {
    dhao = 1;
    tb = que.t_q;
    hb = que.h_q;
  }
  else // biến năm đầu tiên của đại vận
  {
    switch(i)
    {
    case 0: case 1: case 2: j = i;   tb = que.t_q; hb = layBienQuai(que.h_q, j+1); break
    case 3: case 4: case 5: j = i-3; hb = que.h_q; tb = layBienQuai(que.t_q, j+1); break
    }

    // Biến Hào quẻ
    if (lq[i].hao == 9) { lq[i].hao = 6; dhao = 1 }
    else lq[i].hao = 9;
  }

  // Biến từng năm sau năm đầu tiên trong vận
  // - Nếu năm đầu là dương hào tức hào Thế, thì 
  //     năm kế biến hào Ứng, năm thứ 3 trở về hào Thế. Những năm sau đó theo quy luật thường lệ.
  // - Qui luật thường lệ: sau năm đầu tức động hào của đại vận, mỗi năm sau đó tăng lên 1 hào đến
  //     thượng hào rồi quay lại sơ hào.

  var c, k=i // keep i
  for (c=0; c<bt; c++)
  {
    if (dhao && (c < 2)) // 2 năm sau hào dương của năm đầu
    {
      if (c == 0) k = layHaoUng(i);
      else k = i // trở về hào Thế; sau đó như thường lệ
    }
    else // Qui luật thường lệ
    {
      if (k == 5) k = 0;
      else k += 1;
    }
    switch(k)
    {
    case 0: case 1: case 2: j = k;   hb = layBienQuai(hb, j+1); break // biến hạ quái
    case 3: case 4: case 5: j = k-3; tb = layBienQuai(tb, j+1); break // biến thượng quái
    }

    // Biến Hào quẻ
    if (lq[k].hao == 9) lq[k].hao = 6;
    else lq[k].hao = 9;
  }

  // Tạo tượng quẻ (trùng quái)
  var lv = new queLuuVan(tb, hb, lq);

  // An lại Đại Vận và Nguyên Đuờng
  for (i = 0; i < que.length; i++)
  {
    lq[i].dv1 = que.hao[i].dv1;
    lq[i].dv2 = que.hao[i].dv2;
  }
  lq[k].nd  = 1 // Last count
  lv.van = tt;
  return lv;
}

var queLN // quẻ lưu niên (N)
var queLT; // quẻ lưu nguyệt (T)
var queNN; // quẻ lưu nhật (n)
var LuuNien;

// Liệt kê Lưu Niên
function keLuuNien()
{
  var i;
  var can = TueCan(LuuNien);
  var chi = TueChi(LuuNien);
  document.all.LN_Tuoi.value = queLN.van;
  Write('LN_Nien', LuuNien + " - " + can + " " + chi + "\n" + napAm(canVi(can), chiVi(chi)));
  Write('LN1_Que', layTrungQuai(queLN.t_q, queLN.h_q));
  Write('LN1_TQ', quai_danh[queLN.t_q]);
  Write('LN1_HQ', quai_danh[queLN.h_q]);
  var hObj, hid, hao;
  for (i=0; i < queLN.hao.length; i++)
  {
    var j=i+1;
    hao = ((queLN.hao[6-j].hao == 9) ? DUONG : AM);
    hid = 'LN1_h'+(6-i);
    hObj = eval(hid+'C');
    hObj.style.visibility = hao;
    hObj = eval(hid);
    if (queLN.hao[6-j].nd)
      hObj.style.color = "red";
    else
      hObj.style.color = "black";
  }
}

function layLuuNien()
{
  var s;
  var c = parseInt(CL.tue);
  var b = parseInt(oTuoi.tue);

  if (b >= c) c = b;
  var t = c - b + 1;

  if (queLN != null) xoaLuuVan(queLN);
  if (t <= queTT.van)
    queLN = layLuuQue(queTT, t);
  else
    queLN = layLuuQue(queHT, t);
  t = queLN.van + b -1;
  if (c >= t) c = t;
  LuuNien = c; // Lưu lại để kê cả lưu niên lẫn lưu nguyệt
  keLuuNien();
  luuThang(); // gọi luuNgay()
}

// Gia Giảm Năm
function giaGiamNam(gg)
{
  var t = parseInt(document.all.LN_Tuoi.value);
  var y = parseInt(oTuoi.tue);

  switch(gg)
  {
  case 1:
    if ((t > 1) && (t <= queHT.van)) {
      t -= 1;
      y += (t-1);
    }
    else return // invalid
    break;
  case 2: 
    if ((t > 0) && (t < queHT.van)) {
      y += t;
      t += 1;
    }
    else return // invalid
    break;
  }
  LuuNien = y // Lưu lại để kê cả lưu niên lẫn lưu nguyệt

  if (queLN != null) xoaLuuVan(queLN);

  if (t <= queTT.van)
    queLN = layLuuQue(queTT, t);
  else
    queLN = layLuuQue(queHT, t);
  keLuuNien();
  luuThang();
}

// Nguyệt tức Tháng âm lịch
var NGUYET = new Array("Giêng", "Hai", "Ba", "Tư", "Năm", "Sáu", "Bảy", "Tám", "Chín", "Mười", "Mười Một", "Chạp");

// Liệt kê Lưu Nguyệt
function keLuuNguyet()
{
  var i;
  var can = NguyetCan(TueCan(LuuNien), queLT.van-1);
  var chi = CHI[(queLT.van+1)%12];
  document.all.LN_Thang.value = queLT.van;
  Write('LN_Nguyet', can + " " + chi + "\n" + napAm(canVi(can), chiVi(chi)));
  Write('LN2_Que', layTrungQuai(queLT.t_q, queLT.h_q));
  Write('LN2_TQ', quai_danh[queLT.t_q]);
  Write('LN2_HQ', quai_danh[queLT.h_q]);
  var hObj, hid, hao;
  for (i=0; i < queLT.hao.length; i++)
  {
    var j=i+1;
    hao = ((queLT.hao[6-j].hao == 9) ? DUONG : AM);
    hid = 'LN2_h'+(6-i);
    SetView(hid+'C', hao);
    if (queLT.hao[6-j].nd)
      SetColor(hid, "red");
    else
      SetColor(hid, "black");
  }
}

// Quẻ Lưu Nguyệt
function luuNguyet(nn)
{
  // Chủ hay bổn quẻ
  var lq = lapQue(queLN.t_q, queLN.h_q);
  var tb, hb // Thượng và Hạ Biến Quái

  var i, j, c, k, u = 0 // u = Ứng
  for (i=0; i < queLN.hao.length; i++)
    if (queLN.hao[i].nd == 1) break;

  // nn = 1, Tháng Giêng là lẻ
  if (nn % 2)
  {
    k = ((nn + 1) / 2); u = 0;
  }
  // nn = 2, Tháng 2 là chẵn
  else
  {
    k = (nn / 2); u = 1;
  }

  tb = queLN.t_q;
  hb = queLN.h_q;
  // Biến từ hào kế hào có Nguyên Đường thành hào Thế. Hào Thế dùng cho những tháng lẻ (dương)
  for (c=0; c < k; c++)
  {
    i++; if (i == 6) i = 0;

    switch(i)
    {
    case 0: case 1: case 2: j = i;   hb = layBienQuai(hb, j+1); break // biến hạ quái
    case 3: case 4: case 5: j = i-3; tb = layBienQuai(tb, j+1); break // biến thượng quái
    }

    // Biến Hào quẻ
    if (lq[i].hao == 9) lq[i].hao = 6;
    else lq[i].hao = 9;
  }
  if (u)
  {
    i = layHaoUng(i) // Hào Ứng dùng cho những tháng chẵn (âm)
    switch(i)
    {
    case 0: case 1: case 2: j = i;   hb = layBienQuai(hb, j+1); break // biến hạ quái
    case 3: case 4: case 5: j = i-3; tb = layBienQuai(tb, j+1); break // biến thượng quái
    }

    // Biến Hào quẻ
    if (lq[i].hao == 9) lq[i].hao = 6;
    else lq[i].hao = 9;
  }
  lq[i].nd  = 1; // an Nguyên Đường

  // Tạo tượng quẻ (trùng quái)
  var ln = new queLuuVan(tb, hb, lq);
  ln.van = nn; // Ghi nhớ tháng để kể ra
  return ln;
}

function luuThang()
{
  var t = parseInt(document.all.LN_Thang.value);
  if (queLT != null) xoaLuuVan(queLT);
  queLT = luuNguyet(t);
  keLuuNguyet();
}

// Gia Giảm Tháng
function giaGiamThang(gg)
{
  var t = parseInt(document.all.LN_Thang.value);
  switch(gg)
  {
  case 1:
    if ((t > 1) && (t <= 12)) {
      t -= 1;
    }
    else return; // invalid
    break;
  case 2: 
    if ((t > 0) && (t < 12)) {
      t += 1;
    }
    else return; // invalid
    break;
  }
  if (queLT != null) xoaLuuVan(queLT);
  queLT = luuNguyet(t);
  keLuuNguyet();
}

function yKienXayDung()
{
  var s = "Xin cám ơn quí vị dùng kế chương này. Nếu quí vị có ý kiến và có lòng\n";
  s += "hảo tâm muốn đóng góp xây dựng để có bản kế chương tốt đẹp hơn trong\n";
  s += "tương lai; xin vui lòng liên lạc với tác giả Thiên Y qua địa chỉ sau:\n";
  s += "\tthien.y@operamail.com\n";
  s += "Đa tạ";
  alert(s);
}

function XemCanChi(m)
{
}

function xemHao(muc)
{
}

function chiTiet(muc)
{
}

