/*
 DateFormat.js - 格式化日期
 使用方法：
     1，导入DateFormat.js文件到页面中；
     2，在JavaScript脚本中构造一个实例，DateFormat df = new DateFormat();
     3，如果是格式化日期，则执行format()方法；
　　　　var date_str = df.format(日期对象, "格式化后的样式，如yyyy-MM-dd");
　　 4，如果是转换成日期，则执行parse()方法；
        var date = df.parse("需要转换成日期的字符串", "字符串的格式，如yyyy-MM-dd");
*/

/**
 * 验证字符串是否会合法的yyyy-mm-dd日期格式,且检验日期是否有效
 * str:要进行检证的字符串
 * msg:提示信息
 */
function checkDate(str,msg){
    if (str == null || str == "") return true;
 	var  reg  =  /^(\d{4})-(\d{2})-(\d{2})$/;
   	var  r  =  str.match(reg);
   	if(r==null){alert(msg+"的日期格式(YYYY-MM-DD)不正确,请重输!");return  false; }
   	r[2]=r[2]-1;
   	var  d=  new  Date(r[1],r[2],r[3]);
   	if(d.getFullYear()!=r[1] || d.getMonth()!=r[2] ||d.getDate()!=r[3] ){
   		alert("你输入的"+msg +"不正确,请重输!");
    	return  false;
   	}
   	return  true;
}

/*
 * 比较两个日期,先验证日期格式是否正确,两个日期都存在时d2大于d1返回true,调用strUtil的isNull函数
 */
function compareDate(d1,msg1,d2,msg2) {
	// 日期格式验证
	if (!checkDate(d1, msg1) || !checkDate(d2, msg2)) {
		return false;
	}
	// 两个日期都有时d2大于等于d1返回true
	if (!isNull(d1) && !isNull(d2)) {
		if (d1 > d2) {
			alert(msg1 + "不能大于" + msg2);
			return false;
		}
	}
	return true;
}

function DateFormat() {
    /*
     pattern:基本和java相同, 支持如下:
     y:年 1996(yyyy); 96(yy)
     M:月 July(MMMM); Jul(MMM); 07(MM); 7(M)
     d:日(d or dd)
     E:星期几 Tuesday(EEEE); Tue(EEE)
    */

    var shortWeek = new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
    var longWeek = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");

    var shortMonth = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
    var longMonth = new Array("January","February","March","April","May","June","July","August","September","October","November","December");

    this.parse = function(dateStr, pattern) {
        var year="",month="",date="";
        //年
        year = getFieldValue(pattern,"y",dateStr);
        if (year.length==2)
          year = "19" + year;
        year = parseInt(year);
	
        //月
        month = getFieldValue(pattern,"M",dateStr);
        month = parseInt(month)-1;
	
        //日
       date = getFieldValue(pattern,"d",dateStr);
       date = parseInt(date);
       return new Date(year,month,date);
    }

    function getFieldValue(pattern,targ, dateStr) {
        var i = pattern.indexOf(targ);
        var val="";
        while (i >= 0 && i<pattern.length && pattern.substring(i,i+1)==targ) {
            val += dateStr.substring(i,i+1);
	    i++;
        }
        return val;
    }

    this.format = function (dateObj, pattern) {
        var year = dateObj.getYear(), month=dateObj.getMonth(), date=dateObj.getDate();
        var res = pattern;
        res = setFieldValue(res, "y", year);
        res = setFieldValue(res, "M", month);
        res = setFieldValue(res, "d", date);
        res = setFieldValue(res, "E", dateObj.getDay());
        return res;
    }

    function setFieldValue(pattern, targ, value) {
        var i1 = pattern.indexOf(targ);
        if (i1 < 0) {
            return pattern;
        }
	var i2 = i1+1;
        while (i2 > 0 && i2 < pattern.length && pattern.substring(i2,i2+1) == targ) {
            i2++;
        }
        var targs = pattern.substring(i1,i2);
        var l = targs.length;

        switch(targ) {
            case "y":
                if (l == 4) {
                    if (value < 10)
                        value = "190" + value;
                    else if (value < 100)
                        value = "19" + value;
                } else if (l < 4) {
                    value = "" + (value % Math.pow(10,l));
                    for (var i=0; i<l; i++) {
                        if (value.length < (i+1))
                            value = "0" + value;
                    }
                }
                break;
            case "M":
                value++;
                if (l == 2 && value < 10) {
                    value = "0"+value;
                } else if (l ==3 ) {
                    value = shortMonth[value];
                } else if (l > 3) {
                    value=longMonth[value];
                }
                break;
            case "d":
                if (l == 2 && value < 10) {
                    value = "0" + value;
                }
                break;
            case "E":
                if (l > 3)
                    value = longWeek[value];
                else
                    value = shortWeek[value];
                break;
        }
        pattern = pattern.substring(0,i1) + value+pattern.substring(i2,pattern.length);
        return pattern;
    }
}
