dojo.date.diff = function()

in plugins/struts2-dojo-plugin/src/main/resources/org/apache/struts2/static/dojo/src/date/common.js [197:315]


dojo.date.diff = function (dtA, dtB, interv) {
	if (typeof dtA == "number") {
		dtA = new Date(dtA);
	}
	if (typeof dtB == "number") {
		dtB = new Date(dtB);
	}
	var yeaDiff = dtB.getFullYear() - dtA.getFullYear();
	var monDiff = (dtB.getMonth() - dtA.getMonth()) + (yeaDiff * 12);
	var msDiff = dtB.getTime() - dtA.getTime();
	var secDiff = msDiff / 1000;
	var minDiff = secDiff / 60;
	var houDiff = minDiff / 60;
	var dayDiff = houDiff / 24;
	var weeDiff = dayDiff / 7;
	var delta = 0;
	with (dojo.date.dateParts) {
		switch (interv) {
		  case YEAR:
			delta = yeaDiff;
			break;
		  case QUARTER:
			var mA = dtA.getMonth();
			var mB = dtB.getMonth();
			var qA = Math.floor(mA / 3) + 1;
			var qB = Math.floor(mB / 3) + 1;
			qB += (yeaDiff * 4);
			delta = qB - qA;
			break;
		  case MONTH:
			delta = monDiff;
			break;
		  case WEEK:
			delta = parseInt(weeDiff);
			break;
		  case DAY:
			delta = dayDiff;
			break;
		  case WEEKDAY:
			var days = Math.round(dayDiff);
			var weeks = parseInt(days / 7);
			var mod = days % 7;
			if (mod == 0) {
				days = weeks * 5;
			} else {
				var adj = 0;
				var aDay = dtA.getDay();
				var bDay = dtB.getDay();
				weeks = parseInt(days / 7);
				mod = days % 7;
				var dtMark = new Date(dtA);
				dtMark.setDate(dtMark.getDate() + (weeks * 7));
				var dayMark = dtMark.getDay();
				if (dayDiff > 0) {
					switch (true) {
					  case aDay == 6:
						adj = -1;
						break;
					  case aDay == 0:
						adj = 0;
						break;
					  case bDay == 6:
						adj = -1;
						break;
					  case bDay == 0:
						adj = -2;
						break;
					  case (dayMark + mod) > 5:
						adj = -2;
						break;
					  default:
						break;
					}
				} else {
					if (dayDiff < 0) {
						switch (true) {
						  case aDay == 6:
							adj = 0;
							break;
						  case aDay == 0:
							adj = 1;
							break;
						  case bDay == 6:
							adj = 2;
							break;
						  case bDay == 0:
							adj = 1;
							break;
						  case (dayMark + mod) < 0:
							adj = 2;
							break;
						  default:
							break;
						}
					}
				}
				days += adj;
				days -= (weeks * 2);
			}
			delta = days;
			break;
		  case HOUR:
			delta = houDiff;
			break;
		  case MINUTE:
			delta = minDiff;
			break;
		  case SECOND:
			delta = secDiff;
			break;
		  case MILLISECOND:
			delta = msDiff;
			break;
		  default:
			break;
		}
	}
	return Math.round(delta);
};