var lunarInfo = new Array(
  0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,
  0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977,
  0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970,
  0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950,
  0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557,
  0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8, 0x0e950, 0x06aa0,
  0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0,
  0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0, 0x195a6,
  0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570,
  0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0,
  0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5,
  0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930,
  0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530,
  0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45,
  0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0);

var Gan = new Array("甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸");
var Zhi = new Array("子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥");

var animalNumberArray = [];
animalNumberArray[0] = ["01", "13", "25", "37", "49"];
animalNumberArray[1] = ["12", "24", "36", "48"];
animalNumberArray[2] = ["11", "23", "35", "47"];
animalNumberArray[3] = ["10", "22", "34", "46"];
animalNumberArray[4] = ["09", "21", "33", "45"];
animalNumberArray[5] = ["08", "20", "32", "44"];
animalNumberArray[6] = ["07", "19", "31", "43"];
animalNumberArray[7] = ["06", "18", "30", "42"];
animalNumberArray[8] = ["05", "17", "29", "41"];
animalNumberArray[9] = ["04", "16", "28", "40"];
animalNumberArray[10] = ["03", "15", "27", "39"];
animalNumberArray[11] = ["02", "14", "26", "38"];

var boseNumberArray = [];
boseNumberArray["red"] = ["01", "02", "07", "08", "12", "13", "18", "19", "23", "24", "29", "30", "34", "35", "40", "45", "46"];
boseNumberArray["blue"] = ["03", "04", "09", "10", "14", "15", "20", "25", "26", "31", "36", "37", "41", "42", "47", "48"];
boseNumberArray["green"] = ["05", "06", "11", "16", "17", "21", "22", "27", "28", "32", "33", "38", "39", "43", "44", "49"];

var xiaoWeiNumberArray = [];
xiaoWeiNumberArray['0尾'] = ['10', '20', '30', '40'];
xiaoWeiNumberArray['1尾'] = ['01', '11', '21', '31', '41'];
xiaoWeiNumberArray['2尾'] = ['02', '12', '22', '32', '42'];
xiaoWeiNumberArray['3尾'] = ['03', '13', '23', '33', '43'];
xiaoWeiNumberArray['4尾'] = ['04', '14', '24', '34', '44'];
xiaoWeiNumberArray['5尾'] = ['05', '15', '25', '35', '45'];
xiaoWeiNumberArray['6尾'] = ['06', '16', '26', '36', '46'];
xiaoWeiNumberArray['7尾'] = ['07', '17', '27', '37', '47'];
xiaoWeiNumberArray['8尾'] = ['08', '18', '28', '38', '48'];
xiaoWeiNumberArray['9尾'] = ['09', '19', '29', '39', '49'];


var teMaTouNumberArray = [];
teMaTouNumberArray['零头'] = ['01', '02', '03', '04','05','06','07','08','09'];
teMaTouNumberArray['一头'] = ['10', '11', '12', '13', '14','15','16','17','18','19'];
teMaTouNumberArray['二头'] = ['20', '21', '22', '23', '24','25','26','27','28','29'];
teMaTouNumberArray['三头'] = ['30', '31', '32', '33', '34','35','36','37','38','39'];
teMaTouNumberArray['四头'] = ['40', '41', '42', '43', '44', '45', '46', '47', '48', '49'];


var Animals = new Array("鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪");

//获取干支
function get_ganzhi(year) {
  var num = year - 1900 + 36;
  return (Gan[num % 10] + Zhi[num % 12]);
}

var gzwxArr = [];
gzwxArr['金'] = ["甲子", "乙丑", "乙未", "甲午", "壬申", "癸酉", "壬寅", "癸卯", "庚辰", "辛巳", "庚戌", "辛亥"];
gzwxArr['火'] = ["丙寅", "丁卯", "丙申", "丁酉", "甲戌", "乙亥", "甲辰", "乙巳", "戊子", "己丑", "戊午", "己未"];
gzwxArr['木'] = ["戊辰", "己巳", "戊戌", "己亥", "壬午", "癸未", "壬子", "癸丑", "庚寅", "辛卯", "庚申", "辛酉"];
gzwxArr['土'] = ["庚午", "辛未", "庚子", "辛丑", "戊寅", "己卯", "戊申", "己酉", "丙戌", "丁亥", "丙辰", "丁巳"];
gzwxArr['水'] = ["丙子", "丁丑", "丙午", "丁未", "甲申", "乙酉", "甲寅", "乙卯", "壬辰", "癸巳", "壬戌", "癸亥"];

//获取干支五行
function get_ganzhiwx(year) {
  var type = get_ganzhi(year);
  for (var gzwx in gzwxArr) {
    if (gzwxArr[gzwx].indexOf(type) != -1) {
      return gzwx;
    }
  }
}

var lYearDays = function (y) {
  var i, sum = 348;
  for (i = 0x8000; i > 0x8; i >>= 1) sum += (lunarInfo[y - 1900] & i) ? 1 : 0;
  return (sum + leapDays(y));
}

//==== 传回农历 y年闰月的天数
function leapDays(y) {
  if (leapMonth(y))
    return ((lunarInfo[y - 1900] & 0x10000) ? 30 : 29);
  else
    return (0);
}

//==== 传回农历 y年闰哪个月 1-12 , 没闰传回 0
var leapMonth = function (y) {
  return (lunarInfo[y - 1900] & 0xf);
};

//==== 传回农历 y年m月的总天数
var monthDays = function (y, m) {
  return ((lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29);
};

//==== 算出农历, 传入日期物件, 传回农历日期物件
//      该物件属性有 .year .month .day .isLeap .yearCyl .dayCyl .monCyl
var lunar = function (objDate) {
  var i, leap = 0, temp = 0;
  var baseDate = new Date(1900, 0, 31);
  var offset = (objDate - baseDate) / 86400000;

  this.dayCyl = offset + 40;
  this.monCyl = 14;

  for (i = 1900; i < 2050 && offset > 0; i++) {
    temp = lYearDays(i);
    offset -= temp;
    this.monCyl += 12;
  }
  if (offset < 0) {
    offset += temp;
    i--;
    this.monCyl -= 12;
  }

  this.year = i;
  this.yearCyl = i - 1864;

  leap = leapMonth(i); //闰哪个月
  this.isLeap = false;

  for (i = 1; i < 13 && offset > 0; i++) {
    //闰月
    if (leap > 0 && i == (leap + 1) && this.isLeap == false) {
      --i;
      this.isLeap = true;
      temp = leapDays(this.year);
    } else {
      temp = monthDays(this.year, i);
    }

    //解除闰月
    if (this.isLeap == true && i == (leap + 1)) this.isLeap = false;

    offset -= temp;
    if (this.isLeap == false) this.monCyl++;
  }

  if (offset == 0 && leap > 0 && i == leap + 1)
    if (this.isLeap) {
      this.isLeap = false;
    } else {
      this.isLeap = true;
      --i;
      --this.monCyl;
    }

  if (offset < 0) {
    offset += temp;
    --i;
    --this.monCyl;
  }

  this.month = i;
  this.day = offset + 1;
};

const AnimalsHelper = {
  //==== 传回农历 y年的总天数
  getAnimal(date) {
    if (!date) {
      date = new Date();
    }
    //获取生肖
    return Animals[(new lunar(date).year - 4) % 12];
  },

  //获取生肖号码
  getSXHM(animal) {
    var date = new Date();
    var tm = this.getAnimal(date);
    var animalNumbers = [];
    animalNumbers[tm] = animalNumberArray[0];
    var index = Animals.indexOf(tm);
    for (var i = 1; i < animalNumberArray.length; i++) {
      animalNumbers[Animals[(index + i) % 12]] = animalNumberArray[i];
    }

    var result = [];
    var argLength = arguments.length;
    for (var k = 0; k < argLength; k++) {
      result = result.concat(animalNumbers[arguments[k]]);

    }
    return result;
  },
  /**
   * 获取号码生肖
   * @returns
   */
  getHMSHENGXIAO(num, date) {
    var sxs = ["兔", "马", "猴", "猪", "牛", "龙", "鼠", "虎", "蛇", "羊", "鸡", "狗"];
    for (var i = 0; sxs.length; i++) {
      if (this.getSXHMARR(sxs[i], date).indexOf(num) != -1) {
        return sxs[i];
      }
    }
  },

  /**
   * 获取生肖号码
   * @param animal
   * @returns
   */
  getSXHMARR(arr, date) {
    var tm = this.getAnimal(date);
    var animalNumbers = [];
    animalNumbers[tm] = animalNumberArray[0];
    var index = Animals.indexOf(tm);
    for (var i = 1; i < animalNumberArray.length; i++) {
      animalNumbers[Animals[(index + i) % 12]] = animalNumberArray[i];
    }

    var result = [];
    for (var k = 0; k < arr.length; k++) {
      result = result.concat(animalNumbers[arr[k]]);

    }
    return result;
  },

  /**
   * 天肖
   * @returns
   */
  getTIANX() {
    return getSXHM("兔", "马", "猴", "猪", "牛", "龙");
  },

  /**
   * 地肖
   * @returns
   */
  getDIX() {
    return getSXHM("鼠", "虎", "蛇", "羊", "鸡", "狗");
  },

  /**
   * 家肖
   * @returns
   */
  getJIAX() {
    return getSXHM("羊", "马", "牛", "猪", "狗", "鸡");
  },

  /**
   * 野肖
   * @returns
   */
  getYEX() {
    return getSXHM("猴", "蛇", "龙", "兔", "虎", "鼠");
  },

  /**
   * 前肖
   * @returns
   */
  getQIANX() {
    return getSXHM("鼠", "牛", "虎", "兔", "龙", "蛇");
  },

  /**
   * 后肖
   * @returns
   */
  getHOUX() {
    return getSXHM("马", "羊", "猴", "鸡", "狗", "猪");
  },

  /*
   * 获取五行号码
   * @returns
   */
  getAllWxArr(date) {
    var wxNumberArr = [];
    wxNumberArr["金"] = [];
    wxNumberArr["木"] = [];
    wxNumberArr["水"] = [];
    wxNumberArr["火"] = [];
    wxNumberArr["土"] = [];
    var currentYear = (new lunar(date).year);
    for (var i = 1; i <= 49; i++) {
      var number = i.toString();
      if (i < 10) {
        number = "0" + i;
      }
      wxNumberArr[get_ganzhiwx(currentYear)].push(number);
      currentYear--;
    }
    return wxNumberArr;
  },

  /**
   * 获取当前年的对于的五行type号码
   * @param type
   * @returns {*}
   */
  getWUXIN(type) {
    return this.getAllWxArr(new Date())[type];
  },

  getHmWx(number, date) {
    var wxNumberArr = this.getAllWxArr(date);
    for (var wx in wxNumberArr) {
      if (wxNumberArr[wx].indexOf(number) != -1) {
        return wx;
      }
    }
  },

  /*
  * 获取波色
  * @returns
  */
  getBOSE(num) {
    for (var item in boseNumberArray) {
      for (var res in boseNumberArray[item]) {
        if (parseInt(boseNumberArray[item][res]) == num) {
          return item;
        }
      }
    }
    // return boseNumberArray[num];
  },

  /*
* 获取波色
* @returns
*/


getBOSETPE(type) {
        if(type=="红" || type=="红波"){
          return boseNumberArray['red'];
        }
        if(type=="绿" || type=="绿波"){
          return boseNumberArray['blue'];
        }
        if(type=="蓝"  || type=="蓝波"){
          return boseNumberArray['green'];
        }
  },

  /**
   * 获取尾号
   * @returns
   */
  getXiaoWei(type) {
    return xiaoWeiNumberArray[type];
  },

  getTeMaTou(type){
      return teMaTouNumberArray[type];
  },
  getBanBoType(type){
      if(type=="红单"){
        return ["01","07","13","19","23","29","35","45"];
      }
      if(type=="红双"){
        return ["02","08","12","18","24","30","34","40","46"];
      }
      if(type=="红大"){
        return ["29","30","34","35","40","45","46"];
      }
      if(type=="红小"){
        return ["01","02","07","08","12","13","18","19","23","24"];
      }
      if(type=="红合单"){
        return ["01","07","07","08","12","13","18","19","23","24"];
      }
      if(type=="红合双"){
        return ["02","08","13","19","24","35","40","46"];
      }
      if(type=="绿单"){
        return ["05","11","17","21","27","33","39"];
      }
      if(type=="绿双"){
        return ["06","16","22","28","32","38","44"];
      }
      if(type=="绿大"){
        return ["27","28","32","33","38","39","43","44"];
      }
      if(type=="绿小"){
        return ["06","06","11","16","17","21","22"];
      }
      if(type=="绿合单"){
        return ["05","16","21","27","32","38","43"];
      }
      if(type=="绿合双"){
        return ["06","11","17","22","28","33","39","44"];
      }
      if(type=="蓝单"){
        return ["03","09","15","25","31","37","41","47"];
      }
      if(type=="蓝双"){
        return ["04","10","14","20","26","36","42","48"];
      }
      if(type=="蓝大"){
        return ["25","26","31","36","37","41","42","47","48"];
      }
      if(type=="蓝小"){
        return ["03","04","09","10","14","15","20"];
      }
      if(type=="蓝合单"){
        return ["03","09","10","14","36","41","47"];
      }
      if(type=="蓝合双"){
        return ["04","15","20","26","31","37","42","48"];
      }

  }
}