function DateAdd(flg,n,nDate,fmt){
//  機能　　　　：指定日の過去または未来の日を求める関数
//  関数名　　　：DateAdd()
//  引数　　　　：flg     "y","m","d"      加算単位（文字属性）
//  　　　　　　：n      ｎ日後またはｎ日前（数値属性）前の時は−値とする
//  　　　　　　：nDate  指定日（文字属性：yyyy/m/d or yyyy/mm/dd）
//	　　　　　　：fmt    戻り値の形式 "yyyy/m/d" "yyyy/mm/dd" "yyyymmdd"
//  戻り値　　　：日付形式（yyyy/m/d）
//
//  呼出例　　　：DatedAdd("d",100,"","yyyy/m/d")  当日の10日後の日付を求める
//  　　　　　　：DatedAdd("d",-25,"2003/1/20","yyyymmdd") 2003/1/20の25日前の日付を求める
//

    if (nDate == ""){
        var wDate = new Date();
    }else{
    	var wymd = nDate.split("/");
        if (wymd[1].length == 1){wymd[1] = "0" + wymd[1]};
        if (wymd[2].length == 1){wymd[2] = "0" + wymd[2]};
		if (ValidDate(wymd[0] + "/" + wymd[1] + "/" + wymd[2])){
        	var wDate = new Date(nDate);
    	}else{
        	return "<FONT COLOR='red'>日付形式エラー(" + nDate + ")</FONT>";
        }
    }
    if (isNaN(n)){
    	return "<FONT COLOR='red'>加算数値エラー(" + n + ")</FONT>";
    }
	if (fmt == "yyyy/m/d" || fmt == "yyyy/mm/dd" || fmt == "yyyymmdd"){
	    wfmt = fmt;
    }else{
    	wfmt = "yyyy/m/d";
    }

    switch (flg.toLowerCase()){
        case "d":
	        var wY = wDate.getFullYear();
    	    var wM = wDate.getMonth() + 1;
        	var wD = wDate.getDate();
            return DateDAdd(n,wY + "/" + wM + "/" + wD,wfmt);
            break;
        case "m":
            var tYear = wDate.getFullYear();
            var tMonth = wDate.getMonth() + 1 + n;
            var tDate = wDate.getDate();
            if (tMonth == 2){
                if (tDate > 28){
                    return DateDAdd(-1,tYear + "/3/1",wfmt)  
                }else{
                    if (wfmt == "yyyy/m/d"){
                    	return tYear + "/" + tMonth + "/" + tDate;
                    }else{
                    	if (tMonth < 10){yMonth = "0" + tMonth};
                        if (tDate < 10){tDate = "0" + tDate};
		               	if(wfmt == "yyyy/mm/dd"){
                     		return tYear + "/" + tMonth + "/" + tDate;
						}else{
                    		return tYear + tMonth + tDate;
					    }
					}
                }
            }else{
                if (tMonth == 4 || tMonth == 6 || tMonth == 9 || tMonth == 11){
                    if (tDate == 31){
						tDate = 30;
                    }
				}
                if (wfmt == "yyyy/m/d"){
                	return (tYear + "/" + tMonth + "/" + tDate);
                }else{
                	if (tMonth < 10){tMonth = "0" + tMonth};
                    if (tDate < 10){tDate = "0" + tDate};
                    if (wfmt == "yyyy/mm/dd"){
                    	return (tYear + "/" + tMonth + "/" + tDate);
                    }else{
                       	return (tYear + tMonth + tDate);
                    }
               }
            }
            break;
        case "y":
            var tYear = wDate.getFullYear()+n;
            var tMonth = wDate.getMonth()+1;
            var tDate = wDate.getDate();
            if (tMonth == 2){
                if (tDate > 28){
                    return DateDAdd(-1,tYear + "/3/1",wfmt)  
                }else{
	                if (wfmt == "yyyy/m/d"){
    	            	return (tYear + "/" + tMonth + "/" + tDate);
        	        }else{
            	    	if (tMonth < 10){tMonth = "0" + tMonth};
                	    if (tDate < 10){tDate = "0" + tDate};
                    	if (wfmt == "yyyy/mm/dd"){
                    		return (tYear + "/" + tMonth + "/" + tDate);
                    	}else{
                       		return (tYear + tMonth + tDate);
                    	}
               		}
				}
            }else{
                if (wfmt == "yyyy/m/d"){
                	return (tYear + "/" + tMonth + "/" + tDate);
                }else{
                	if (tMonth < 10){tMonth = "0" + tMonth};
                    if (tDate < 10){tDate = "0" + tDate};
                    if (wfmt == "yyyy/mm/dd"){
                    	return (tYear + "/" + tMonth + "/" + tDate);
                    }else{
                       	return (tYear + tMonth + tDate);
                    }
               	}
            }
            break;
        default:
            return "<FONT COLOR='red'>加算単位エラー（" + flg + ")</FONT>";
            break;
    }
}

function EDate(nDate,fmt){
//  機能　　　　：指定日の月末日を求める
//  関数　　　　：EDate()
//  引数　　　　：指定日(文字形式：yyyy/m/d or yyyy/mm/dd）
//	　　　　　　：fmt 戻り値の形式 "yyyy/m/d" "yyyy/mm/dd" "yyyymmdd"
//  戻り値　　　：月末日(文字形式：yyyy/m/d）

    if (nDate == ""){
        var wDate = new Date();
    }else{
    	var wymd = nDate.split("/");
        if (wymd[1].length == 1){wymd[1] = "0" + wymd[1]};
        if (wymd[2].length == 1){wymd[2] = "0" + wymd[2]};
		if (ValidDate(wymd[0] + "/" + wymd[1] + "/" + wymd[2])){
	        var wDate = new Date(nDate);
    	}else{
        	return "<FONT COLOR='red'>日付形式エラー(" + nDate + ")</FONT>";
		}
    }
	if (fmt == "yyyy/m/d" || fmt == "yyyy/mm/dd" || fmt == "yyyymmdd"){
	    wfmt = fmt;
    }else{
    	wfmt = "yyyy/m/d";
    }

    var tYear = wDate.getFullYear();
    var tMonth = wDate.getMonth() + 2;

	/*MIY追加　年末は翌年からマイナス１としなければ・・・*/
	//以下がないと2005/13/01で判断する　
	if (tMonth>12){
		tYear++;
		tMonth=1;
	}
	//alert(tYear);
	//alert(tMonth);

    return DateDAdd(-1,tYear + "/" + tMonth + "/1",wfmt);

}

function DateDAdd(n,nDate,fmt){

    if (nDate == ""){
        var wDate = new Date();
    }else{
    	var wymd = nDate.split("/");
        if (wymd[1].length == 1){wymd[1] = "0" + wymd[1]};
        if (wymd[2].length == 1){wymd[2] = "0" + wymd[2]};
		if (ValidDate(wymd[0] + "/" + wymd[1] + "/" + wymd[2])){
	        var wDate = new Date(nDate);
    	}else{
        	return "<FONT COLOR='red'>日付形式エラー(" + nDate + ")</FONT>";
		}
    }
	if (fmt == "yyyy/m/d" || fmt == "yyyy/mm/dd" || fmt == "yyyymmdd"){
	    wfmt = fmt;
    }else{
    	wfmt = "yyyy/m/d";
    }

    var wdaysMS = n * 1000 * 60 * 60 * 24;
    var DateMS = wDate.getTime();
    DateMS += wdaysMS;
    wDate.setTime(DateMS);
    var tYear = wDate.getFullYear();
    var tMonth = wDate.getMonth() + 1;
    var tDate = wDate.getDate();

    if (wfmt == "yyyy/m/d"){
    	return (tYear + "/" + tMonth + "/" + tDate);
    }else{
    	if (tMonth < 10){tMonth = "0" + tMonth};
        if (tDate < 10){tDate = "0" + tDate};
        if (wfmt == "yyyy/mm/dd"){
        	return (tYear + "/" + tMonth + "/" + tDate);
        }else{
        	return (tYear + tMonth + tDate);
        }
  	}
}


function ValidDate(dateStr) {
// Checks for the following valid date formats:
// YYYY/MM/DD

var datePat = /^(\d{4})(\/)(\d{2})\2(\d{2})$/;
var DateArray = dateStr.match(datePat);

    if (DateArray == null) {
	    return false;
    }

    wyear = dateStr.substr(0,4);
    wmonth = eval(dateStr.substr(5,2));
    wday = eval(dateStr.substr(8,2));

    if (mon_chk(wmonth)){
    }else{
        return false;
    }

    dd = daymonth(wyear,wmonth);
    if (wday > dd){
        return false;
    }
    
    return true;
}

/* 日付の範囲チェック */
function daymonth(year,month){
	day = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	if(month==2 && leapyear(year)) return 29;
	return day[month-1];
}
/* うるう年のチェック */
function leapyear(year){
	return year%4==0 && (year%100!=0 || year%400==0);
}

/* 月の範囲チェック */
function mon_chk(month){	
	if((month >= 1) && (month <= 12)) return true;
	return false;
}

