//2011年11月06日　1年を元年と表示されるように修正。
//2011年11月06日　新年号に対応できるようにした。暫定的に2011年11月06日から「次の元号」にした。

/* 明治はもう・・・ */
function typJpYear(){
  this.name="";
  this.alphaName="";
  this.begin=0;
  this.end  =99999999;
}
function TJpYear(){
  this.items=[];
  this.items[0]=new typJpYear();
  this.items[0].name ="明治";
  this.items[0].alphaName="M";
  this.items[0].begin=18680908;
  this.items[0].end  =19120729;
  this.items[1]=new typJpYear();
  this.items[1].name ="大正";
  this.items[1].alphaName="T";
  this.items[1].begin=19120730;
  this.items[1].end  =19261224;
  this.items[2]=new typJpYear();
  this.items[2].name ="昭和";
  this.items[2].alphaName="S";
  this.items[2].begin=19261225;
  this.items[2].end  =19890107;
  this.items[3]=new typJpYear();
  this.items[3].name ="平成";
  this.items[3].alphaName="H";
  this.items[3].begin=19890108;
  this.items[3].end  =99999999;
  //this.items[4]=new typJpYear();
  //this.items[4].name ="次の元号";
  //this.items[4].alphaName="K";
  //this.items[4].begin=20111107;
  //this.items[4].end  =99999999;

  
  /*
    "2009", "平成21", "H21", "h21" -> 2009
  */
  this.worldToJpYear=function(ADate, AFormat){
    var num=ADate.getDateNum();
  
    for (var i=0,imax=this.items.length; i<imax; i++){
      if ((this.items[i].begin<=num) && (this.items[i].end>=num)){
        switch (AFormat){
          case "gg":

			//1年->元年
		  	//▼///////////////////////////////////////////////////////////////////// 
			  	var nendo = 0;
				var nendo = parseInt(num/10000)-parseInt(this.items[i].begin/10000)+1;
				if(nendo == 1){
					nendo = '元';
				}
			//▲/////////////////////////////////////////////////////////////////////
				
	            return this.items[i].name+(
	              //parseInt(num/10000)-parseInt(this.items[i].begin/10000)+1
				  nendo
	            );
          case "g":
        	return this.items[i].alphaName+(
              parseInt(num/10000)-parseInt(this.items[i].begin/10000)+1
            );
        }
        return;
      }
    }
    return;
  }
  /*
    "2009", "平成21", "H21", "h21" -> 2009
    2009.07.13 年度を強制的に数値化していてエラーになっていたのを改修
  */
  this.jpToWorldYear=function(AYYYY){
    AYYYY=AYYYY+"";
    var yyyy1=AYYYY.left(1).toUpperCase();
    var yyyy2=AYYYY.left(2);
    //var r=AYYYY.toNum();
    var r=AYYYY;
    for (var i=0,imax=this.items.length; i<imax; i++){
      if (yyyy1==this.items[i].alphaName){
        r=r.replace(this.items[i].alphaName,"").replace(this.items[i].alphaName.toLowerCase(),"");
        r=r.toNum()+parseInt(this.items[i].begin/10000)-1;
        break;
      }
      if (yyyy2==this.items[i].name){
        r=r.replace(this.items[i].name,"");
        r=r.toNum()+parseInt(this.items[i].begin/10000)-1;
        break;
      }
    }
    return r;
  }
}
var JpYear=new TJpYear();
/*
  "10","1.5","-1","1E5", -> true
  "1A","1.1.1"           -> false
*/
String.prototype.isNum=function(){
  if ((this=="") || (isNaN(this))){
    return false;
  }else if (typeof (this-0)=="number"){
    return true;
  }else{
    return false;
  }
}
/*
  "123"   -> true
  "123.1" -> false
  "123.0" -> true
  2009.07.13 追加
*/
String.prototype.isInteger=function(){
  return (this.isNum() && !String(this.toNum()).match(/\./))
}
/*
  "100" -> 100
  "1A"  -> NaN
*/
String.prototype.toNum=function(){
  return this-0;
}
/*
  "100" -> 100
  "1A"  -> arguments[0]
*/
String.prototype.toNumDef=function(){
  if (this.isNum()){
    return this-0;
  }else if(arguments.length){
    return arguments[0];
  }else{
    return NaN;
  }
}
/*
  " AAA " -> "AAA"
*/
String.prototype.trim = function() {
  return this.replace(/^\s+|\s+$/g, '');
}
/*
  "1234567890".(2,3) -> "345"
*/
String.prototype.mid=function (iPos, iLength){
  return this.substring(iPos, iPos + iLength);
}
/*
  "1234567890".right(3) -> "890"
*/
String.prototype.right=function (iLength){
  return this.substring(this.length-iLength, this.length);
}
/*
  "1234567890".left(3) -> "123"
*/
String.prototype.left=function (iLength){
  return this.substring(0, iLength);
}
/*
  "123+456=579" -> "123%2B456%3D579"
  通常のescapeでは"+"がそのまま残り稀に不具合が発生する
  この関数では強制的にbase64へ変換している
*/
String.prototype.escape = function() {
  var s=escape(this);
  s=s.replace(/\+/g, "%2B");
  return s;
}
/*
  "123%2B456%3D579" -> "123+456=579"
*/
String.prototype.unescape = function() {
  return unescape(this);
}
/*
  " <a&bc> " -> "&nbsp;&lt;a&amp;bc&gt;&nbsp;"
*/
String.prototype.htmlEscape = function() {
  var s=this.replace(/&/g,"&amp;");
  s=s.replace(/>/g,"&gt;");
  s=s.replace(/</g,"&lt;");
  s=s.replace(/ /g,"&nbsp;");
  return s;
}
/*
  "&nbsp;&lt;a&amp;bc&gt;&nbsp;" -> " <a&bc> "
*/
String.prototype.htmlUnescape = function() {
  var s=this.replace(/&nbsp;/g," ");
  s=s.replace(/&lt;/g,"<");
  s=s.replace(/&gt;/g,">");
  s=s.replace(/&amp;/g,"&");
  return s;
}
/*
  "123".placeChar("0",5)  -> "12300"
  "123".placeChar("0",-5) -> "00123"
*/
String.prototype.placeChar=function(AChar, ACount) {
  var c="";
  for (var i=0; i<Math.abs(ACount); i++){
    c+=AChar;
  }
  if (ACount>0){
    c=(this+c).left(ACount);
  }else{
    c=(c+this).right(Math.abs(ACount));
  }
  return c;
}
String.prototype.toArray=function(){
  return this.split(",");
}
/*
  "20091203", "2009/12/03", "2009.12.03",
  "2009年12月03日", "平成21年12月3日", "H21.12.3", "h21.12.3"
  "2009/12/03 10:20:30"をDate型に変換して返す。
  変換できなかった場合や
  1月32日のように月の日付範囲外の場合は undefined となる。
  
*/
String.prototype.toDatetime=function() {
  var ymd=this.trim().replace(/[年月時分.:\b\s]/g, "/"
                               ).replace(/[日秒ミリ]/g, "").split("/");
  var ymdCount=ymd.length;
  if (ymdCount==1){
    if (ymd[0].length==8){
      ymd[2]=ymd[0].right(2); //DD
      ymd[1]=ymd[0].mid(4,2); //MM
      ymd[0]=ymd[0].left(4);  //YYYY
      ymdCount=ymd.length;
    }else{
      return;
    }
  }
  var r=new Date();
  if (ymdCount>=3) {
    ymd[0]=JpYear.jpToWorldYear(ymd[0]);
    r.setFullYear(ymd[0],ymd[1]-1,ymd[2]);
    if (String(ymd[0]+ymd[1].placeChar("0",-2)+ymd[2].placeChar("0",-2)).toNum()!=r.getDateNum()){
      return;
    }
  }else{
    return;
  }
  var cr=0;
  r.setHours(0,0,0,0);
  if (ymdCount>=5) {
    r.setHours(ymd[3],ymd[4]);
    cr=ymd[3].placeChar("0",-2)+ymd[4].placeChar("0",-2);
    if (String(cr+"00000").toNum()!=r.getTimeNum()){
      return;
    }
  }
  if (ymdCount>=6) {
    r.setSeconds(ymd[5]);
    cr+=ymd[5].placeChar("0",-2);
    if (String(cr+"000").toNum()!=r.getTimeNum()){
      return;
    }
  }
  if (ymdCount>=7) {
    r.setMilliseconds(ymd[6]);
    cr+=ymd[6].placeChar("0",-3);
    if (String(cr).toNum()!=r.getTimeNum()){
      return;
    }
  }
  return r;
}
String.prototype.toProgram=function(){
  var s=this.replace(/\r\n/g, "\n").replace(/\r/g, "\n").replace(/\n/g, "<br>");
  return s;
}

function Now(){
  return new Date();
}
/*
  Date型 -> 任意日付フォーマット
  value
    yyyy: 西暦年
    gg  : 和暦年(平成, 昭和...)
    g   : 和暦年(H, S...)
    MM  : 月
    DD  : 日
    hh  : 時
    mm  : 分
    ss  : 秒
  [ADate] 任意
    変換対象Date
*/
Date.prototype.format=function(value, ADate){
  if (!ADate){
    ADate=this;
  }
  var yyyy=ADate.getFullYear();
  var gg  =JpYear.worldToJpYear(ADate, "gg");
  var g   =JpYear.worldToJpYear(ADate, "g");
  var MM  =ADate.getMonth()+1;
  var dd  =ADate.getDate();
  var hh  =ADate.getHours();
  var mm  =ADate.getMinutes();
  var ss  =ADate.getSeconds();
  var zzz =ADate.getMilliseconds();
  var a   =ADate.getWeekName();
  var aaa =a+"曜日";
/* rep 2010.10.21 明治のMが月のMと同じだったために
	意図しない変換が行われていたのを修正
	var r=value.replace("yyyy", yyyy).replace(
                      "gg", gg).replace("g", g).replace(
                      "MM", String(MM).placeChar("0",-2)).replace(
                      "dd", String(dd).placeChar("0",-2)).replace(
                      "hh", String(hh).placeChar("0",-2)).replace(
                      "mm", String(mm).placeChar("0",-2)).replace(
                      "ss", String(ss).placeChar("0",-2)).replace(
                      "zzz", String(zzz).placeChar("0",-3)).replace(
                      "y", yyyy).replace(
                      "M", MM).replace(
                      "d", dd).replace(
                      "h", hh).replace(
                      "m", mm).replace(
                      "s", ss).replace(
                      "z", zzz).replace(
                      "aaa", aaa).replace(
                      "a", a);
*/
	var r=value.replace("yyyy", yyyy).replace(
                      "MM", String(MM).placeChar("0",-2)).replace(
                      "dd", String(dd).placeChar("0",-2)).replace(
                      "hh", String(hh).placeChar("0",-2)).replace(
                      "mm", String(mm).placeChar("0",-2)).replace(
                      "ss", String(ss).placeChar("0",-2)).replace(
                      "zzz", String(zzz).placeChar("0",-3)).replace(
                      "y", yyyy).replace(
                      "M", MM).replace(
                      "d", dd).replace(
                      "h", hh).replace(
                      "m", mm).replace(
                      "s", ss).replace(
                      "z", zzz).replace(
                      "gg", gg).replace(
                      "g", g).replace(
                      "aaa", aaa).replace(
                      "a", a);
	return r;
}

/*
  YYYYMMDD の数値型を返す
*/
Date.prototype.getDateNum=function(){
  return String(this.getFullYear()
        +String(this.getMonth()+1).placeChar("0",-2)
        +String(this.getDate()).placeChar("0",-2)).toNum();
}
/*
  HHMMSSZZZの数値型を返す
*/
Date.prototype.getTimeNum=function(){
  return String(String(this.getHours()).placeChar("0",-2)
        +String(this.getMinutes()).placeChar("0",-2)
        +String(this.getSeconds()).placeChar("0",-2)
        +String(this.getMilliseconds()).placeChar("0",-3)).toNum();
}
/*
  曜日を返す
*/
Date.prototype.getWeekName=function(){
  var names=new Array("日", "月", "火", "水", "木", "金", "土");
  return names[this.getDay()];
}
/*
  祝日・祭日名を返す
*/
Date.prototype.getDayTypeName=function(ANo){
  var r="";
  switch (Math.abs(ANo)){
    case 1:
      r="元旦";
      break;
    case 2:
      r="成人の日";
      break;
    case 3:
      r="成人の日";
      break;
    case 4:
      r="建国記念の日";
      break;
    case 5:
      r="昭和天皇の大喪の礼";
      break;
    case 6:
      r="春分の日";
      break;
    case 7:
      r="天皇誕生日";
      break;
    case 8:
      r="みどりの日";
      break;
    case 9:
      r="昭和の日";
      break;
    case 10:
      r="皇太子明仁親王の結婚の儀";
      break;
    case 11:
      r="憲法記念日";
      break;
    case 12:
      r="みどりの日";
      break;
    case 13:
      r="こどもの日";
      break;
    case 14:
      r="皇太子徳仁親王の結婚の儀";
      break;
    case 15:
      r="海の日";
      break;
    case 16:
      r="海の日";
      break;
    case 17:
      r="敬老の日";
      break;
    case 18:
      r="敬老の日";
      break;
    case 19:
      r="国民の休日";
      break;
    case 20:
      r="秋分の日";
      break;
    case 21:
      r="体育の日";
      break;
    case 22:
      r="体育の日";
      break;
    case 23:
      r="文化の日";
      break;
    case 24:
      r="即位礼正殿の儀";
      break;
    case 25:
      r="勤労感謝の日";
      break;
    case 26:
      r="天皇誕生日";
      break;
    case 99:
      r="振替休日";
      break;
  }
  return r;
}

/*
  当月最終日を返す
*/
Date.prototype.getLastDate=function(){
  var d=new Date(this.getFullYear(), this.getMonth()+1, 0);
  return d;
  //return d.getDate();
}
// 春分(3月)
Date.prototype.getSpringHoliday=function(){
  var yyyy=this.getFullYear();
  switch (yyyy%4){
    case 0:
      if ((yyyy>=1900)&&(yyyy<=1956)){
        r=21;
      }else if ((yyyy>=1960)&&(yyyy<=2088)){
        r=20;
      }else if ((yyyy>=2092)&&(yyyy<=2096)){
        r=19;
      }
      break;
    case 1:
      if ((yyyy>=1901)&&(yyyy<=1989)){
        r=21;
      }else if ((yyyy>=1993)&&(yyyy<=2097)){
        r=20;
      }
      break;
    case 2:
      if ((yyyy>=1902)&&(yyyy<=2022)){
        r=21;
      }else if ((yyyy>=2026)&&(yyyy<=2098)){
        r=20;
      }
      break;
    case 3:
      if ((yyyy>=1902)&&(yyyy<=1923)){
        r=22;
      }else if ((yyyy>=1927)&&(yyyy<=2055)){
        r=21;
      }else if ((yyyy>=2059)&&(yyyy<=2099)){
        r=20;
      }
      break;
  }
  return r;
}
// 春分(9月)
Date.prototype.getAutumnHoliday=function(){
  var yyyy=this.getFullYear();
  switch (yyyy%4){
    case 0:
      if ((yyyy>=1900)&&(yyyy<=2008)){
        r=23;
      }else if ((yyyy>=2012)&&(yyyy<=2096)){
        r=22;
      }
      break;
    case 1:
      if ((yyyy>=1901)&&(yyyy<=1917)){
        r=24;
      }else if ((yyyy>=1921)&&(yyyy<=2041)){
        r=23;
      }else if ((yyyy>=2045)&&(yyyy<=2097)){
        r=22;
      }
      break;
    case 2:
      if ((yyyy>=1902)&&(yyyy<=1946)){
        r=24;
      }else if ((yyyy>=1950)&&(yyyy<=2074)){
        r=23;
      }else if ((yyyy>=2078)&&(yyyy<=2098)){
        r=22;
      }
      break;
    case 3:
      if ((yyyy>=1903)&&(yyyy<=1979)){
        r=24;
      }else if ((yyyy>=1983)&&(yyyy<=2099)){
        r=23;
      }
      break;
  }
  return r;
}
Date.prototype.getDayType=function(){
  if (arguments.length==0){
    arguments[0]=0;
  }
  var yyyy=this.getFullYear();
  var mm  =this.getMonth()+1;
  var dd  =this.getDate();
  var r=0;
  var aa  =this.getDay();
  var num =Math.floor(((dd-1)/7))+1;
  var sp  =this.getSpringHoliday();
  var au  =this.getAutumnHoliday();
  switch (mm){
    case 1:
      if ((yyyy>=1948) && (dd==1)){
        r=1; // 元旦
      }else if ((yyyy>=1948) && (yyyy<=1999) && (dd==15)){
        r=2; // 旧成人の日
      }else if ((yyyy>=1999) && (num==2) && (aa==1)){
        r=3; // 新成人の日
      }
      break;
    case 2:
      if ((yyyy>=1966) && (dd==11)){
        r=4; // 建国記念の日
      }else if ((yyyy==1989) && (dd==24)){
        r=5; // 昭和天皇の大喪の礼
      }
      break;
    case 3:
      if ((yyyy>=1948) && (dd==sp)){
        r=6; // 春分の日
      }
      break;
    case 4:
      if ((yyyy>=1948) && (yyyy>=1988) && (dd==29)){
        r=7; // 天皇誕生日
      }else if ((yyyy>=1989) && (yyyy>=2006) && (dd==29)){
        r=8; // みどりの日
      }else if ((yyyy>=2007) && (dd==29)){
        r=9; // 昭和の日
      }else if ((yyyy==1959) && (dd==10)){
        r=10; // 皇太子明仁親王の結婚の儀
      }
      break;
    case 5:
      if ((yyyy>=1948) && (dd==3)){
        r=11; // 憲法記念日
      }else if ((yyyy>=2007) && (dd==4)){
        r=12; // みどりの日
      }else if ((yyyy>=1948) && (dd==5)){
        r=13; // こどもの日
      }
      break;
    case 6:
      if ((yyyy==1993) && (dd==9)){
        r=14; // 皇太子徳仁親王の結婚の儀
      }
      break;
    case 7:
      if ((yyyy<=2002) && (dd==20)){
        r=15; // 旧海の日
      }else if ((yyyy>=2003) && (num==3) && (aa==1)){
        r=16; // 新海の日
      }
      break;
    case 8:
      break;
    case 9:
      if ((yyyy<=2002) && (dd==15)){
        r=17; // 旧敬老の日
      }else if ((yyyy>=2003) && (num==3) && (aa==1)){
        r=18; // 敬老の日
      }else if ((yyyy>=1948) && (dd==au)){
        r=20; // 秋分の日
      }else if ((yyyy>=2003) && (dd==22)){
        // 祝日に挟まれている必要あり
        
        var p=this.dateAdd(0,0,-1);
        var pr1=p.getDayType(2);
        var p=this.dateAdd(0,0,1);
        var pr2=p.getDayType(2);
        if (((pr1!=0)&&(pr1!=99))&&((pr2!=0)&&(pr2!=99))){
          r=19; // 国民の休日
        }
      }
      break;
    case 10:
      if ((yyyy>=1966) && (yyyy<=1999) && (dd==10)){
        r=21; // 旧体育の日
      }else if ((yyyy>=2000) && (num==2) && (aa==1)){
        r=22; // 新体育の日
      }
      break;
    case 11:
      if ((yyyy>=1948) && (dd==3)){
        r=23; // 文化の日
      }else if ((yyyy==1990) && (dd==12)){
        r=24; // 即位礼正殿の儀
      }else if ((yyyy>=1948) && (dd==23)){
        r=25; // 勤労感謝の日
      }
      break;
    case 12:
      if ((yyyy>=1989) && (dd==23)){
        r=26; // 天皇誕生日
      }
      break;
  }
  //振替休日
  var arg=0;
  if (arguments[0]==1) {
    arg=arguments[1]+1;
    if ((r==0)&&(arguments[2]==0)){
      return 0;
    }else if ((r!=0)&&(aa==0)){
      return -r;
    }else{
      var p=this.dateAdd(0,0,-1);
      var pr=p.getDayType(1, arg, r);
      if (pr<0){
        r=-r;
      }
    }
  }else if (arguments[0]==0) {
    var p=this.dateAdd(0,0,-1);
    var pr=p.getDayType(1, arg, r);
    if (pr<0){
      if ((r!=0)&&(pr!=0)){
        r=r;
      }else{
        r=99;
      }
    }
  }
  return r;
}

/*
  日付期間を返す
*/
Date.prototype.getDatePeriod=function(value){
  return Math.floor((value-this)/(1000*60*60*24));
}
/*
  年月日期間を返す
  2009/01/31.dateAdd(1,2,3) -> 2010/03/01
  
  2009.07.13 追加
*/
Date.prototype.dateAdd=function(y,m,d){
  return new Date(this.getFullYear()+y, this.getMonth()+m, this.getDate()+d);
}

/* デバッグ用です */
/*
  経過時間
*/
Date.prototype.getRangeTime=function(ABegin){
  var r=new Date();
  var fn=r.getTime();
  var mt=fn-ABegin;
  var y,M,d,h,m,s,z;
  
  d=Math.floor(mt/(1000*60*60*24));
  mt-=(d*1000*60*60*24);
  h=Math.floor(mt/(1000*60*60));
  mt-=(h*1000*60*60);
  m=Math.floor(mt/(1000*60));
  mt-=(m*1000*60);
  s=Math.floor(mt/(1000));
  mt-=(m*1000);
  z=mt%1000;
  
  return new Array(d,h,m,s,z);
}

/*
  {"a","b","c"} ("b") -> 1
  {"a","b","c"} ("x") -> -1
*/
Array.prototype.indexOf=function(value){
  for(var i in this){
    if( this.hasOwnProperty(i) && this[i]===value){
      return i;
    }
  }
  return -1;
}
/*
  {"a","b","c"} (1,"x") -> {"a","x","b","c"}
*/
Array.prototype.insertItem=function(APos, value){
  return this.slice(0,APos).concat(value, this.slice(APos));
}
/*
  {"a","b","c"} ("x") -> {"a","b","c","x"}
*/
Array.prototype.addItem=function(value){
  return this.concat(value);
}
/*
  {"a","b","c"} (1) -> {"a","c"}
*/
Array.prototype.deleteItem=function(APos){
  this[APos]=undefined;
  return this.slice(0,APos).concat(this.slice(APos+1));
}


