/** Date utility ************/
var cal_disp_format = /^[m]{1,2}\/[d]{1,2}\/[y]{2,4}$/;
function DateUtil(){}

DateUtil.prototype.setDateTo = function(textBox, offset, dateString ){
	if(textBox){
		var dateObj = new Date();
		if( dateString ){
			dateObj = this.toJSDate(dateString);
			if( dateObj == null ){dateObj = new Date();}
		}
		textBox.value = this.addDays(dateObj, offset);
	}
};

// add days to given date
DateUtil.prototype.addDays = function( dateNow, daysToAdd, preferedDay ){
	var inDD,inMM,inYY,nDays;
	var t = dateNow.getTime() + (daysToAdd * ONE_DAY);
	var newDate = new Date(t);
	// If a week-day is prefered
	var dow = 0;
	if(preferedDay){
		var prefdayno;
		prefdayno = newDate.getDay();
		for(var i=0;i<7;i++){
			if(weekDays[i]== preferedDay.toUpperCase()){ prefdayno = i; break; }
		}
		dow = prefdayno-newDate.getDay();
		dow = ((dow<0)?(7+dow):dow);
	}
	if( dow > 0 ){
		t = newDate.getTime() + (dow * ONE_DAY);
		newDate = new Date(t);
	}

	inYY = newDate.getYear();
	if (inYY < 1900) {
		inYY = inYY + 1900;
	}
	// classic leap year calculation
   	var monthDays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	if( ((inYY % 4 == 0) && (inYY % 100 != 0)) ||(inYY % 400 == 0))
		monthDays[1] = 29;
   	inDD = newDate.getDate();
   	inMM = newDate.getMonth();
   	nDays = monthDays[inMM];
	if (inMM != 11){
		if (inDD > nDays){
			inMM= inMM + 1;
			inDD= inDD - nDays;
		}
	} else if (inDD > nDays){
		inMM= 0;
		inDD= inDD - nDays;
		inYY = inYY + 1;
	}
	inMM = inMM + 1;
	if (inDD <= 9){
		inDD = "0" + inDD;
	}
	if(inMM <= 9){
		inMM = "0" + inMM;
	}
   	return inMM + "/" + inDD + "/" + inYY;
};

// convert mm/dd/yyyy to date object
DateUtil.prototype.toJSDate = function(dateString){
	if( !this.validate(dateString, false) ){
		return null;
	}
	var arrayDate = dateString.split('/');
	var inEntMM = parseInt(arrayDate[0],10);
	var inEntDD = parseInt(arrayDate[1],10);
	var inEntYY = parseInt(arrayDate[2],10);
	if( inEntDD < 10 ){
		inEntDD= "0" + inEntDD;
	}
   	if( inEntMM < 10 ){
   		inEntMM = "0" + inEntMM;
   	}
	if( inEntYY  < 100 ){
		inEntYY  = Number(inEntYY) + (inEntYY  < 30 ? 2000 : 1900);
	}
	return new Date(inEntYY,inEntMM - 1,inEntDD);
};

DateUtil.prototype.formatDate = function(dateString){
    var today = new Date();
    var year = today.getFullYear().toString();
    var str = year.substr(0,2);
    var date_array = dateString.split('/');
    if (date_array.length == 3) {
        if( isNaN(date_array[0])
    		|| isNaN(date_array[1])
    		|| isNaN(date_array[2]) ){
        	return dateString;
        }
        var mm = parseInt(date_array[0],10);
        var dd = parseInt(date_array[1],10);
        var yyyy = parseInt(date_array[2],10);
        if( yyyy < 100 ){
        	if( yyyy < 10 ){yyyy = '0'+yyyy;}
        	yyyy = str + yyyy;
        }
        if( mm < 10 ){	mm = '0'+mm;	}
        if( dd < 10 ){	dd = '0'+dd;	}
    	dateString = mm+'/'+dd+'/'+yyyy;
	}
	return dateString;
};

DateUtil.prototype.dateDifference = function( date1, date2 ){
	return Math.ceil((date1.getTime() - date2.getTime())/ONE_DAY);
};

//validate date
DateUtil.prototype.validate = function( dateString, returnErrorMsg ){
	if( dateString == null
		|| emptyStringRegEx.test(dateString)
		|| cal_disp_format.test(dateString) ){

		if( returnErrorMsg ){	return "Please enter a date";	}
		else{	return false;	}
	}
	var reg_exp = /^\-?\d+$/;
	var arr_date = dateString.split('/');
	var errorMessage = '', valid = false, NUM_CENTYEAR = 30;
	if (arr_date.length != 3){
		errorMessage = "Invalid date format: '" + dateString + "'.\nPlease correct format to mm/dd/yyyy.";
	}
	else if (!arr_date[1]){
		errorMessage = "Invalid date format: '" + dateString + "'.\nThe day entered does not exist in that month.";
	}
	else if ((!reg_exp.exec(arr_date[1]))||(arr_date[1].length != 2)){
		errorMessage = "Invalid day of month: '" + arr_date[1] + "'.\nPlease correct format to mm/dd/yyyy.";
	}
	else if (!arr_date[0]){
		errorMessage = "Invalid date format: '" + dateString + "'.\nPlease enter a value for the month";
	}
	else if ((!reg_exp.exec(arr_date[0]))||(arr_date[0].length != 2)){
		errorMessage = "Invalid month: '" + arr_date[0] + "'.\nPlease correct format to mm/dd/yyyy.";
	}
	else if (!arr_date[2]){
		errorMessage = "Invalid date format: '" + dateString + "'.\nnPlease enter a value for the year";
	}
	else if (!reg_exp.exec(arr_date[2])){
		errorMessage = "Invalid year: '" + arr_date[2] + "'.\nPlease correct format to mm/dd/yyyy.";
	}
	else if ((arr_date[2].length != 4) && (arr_date[2].length != 2)){
		errorMessage = "Invalid date format: '" + dateString + "'.\nPlease correct year format to mm/dd/yyyy.";
	}
	else {
		valid = true;
	}
	var dt_date = new Date();
	dt_date.setDate(1);
	if (arr_date[0] < 1 || arr_date[0] > 12){
		errorMessage = "Invalid month: '" + arr_date[0] + "'.\nPlease enter a month value between 01-12.";
		valid = false;
	}
	dt_date.setMonth(arr_date[0]-1);
	if (arr_date[2] < 100)
		arr_date[2] = Number(arr_date[2]) + (arr_date[2] < NUM_CENTYEAR ? 2000 : 1900);
	dt_date.setFullYear(arr_date[2]);
	var dt_numdays = new Date(arr_date[2], arr_date[0], 0);
	dt_date.setDate(arr_date[1]);
	if (dt_date.getDate() != (arr_date[1])){
		errorMessage = "Invalid day of month: '" + arr_date[1] + "'.\nPlease enter a day value between 01-"+dt_numdays.getDate()+".";
		valid = false;
	}
	if( returnErrorMsg ){
		return errorMessage;
	}
	else {
		return valid;
	}
};
var ONE_DAY = 1000*60*60*24;
var weekDays = new Array("SUN","MON","TUE","WED","THU","FRI","SAT");
var emptyStringRegEx = /^\s*$/;
