
function DateRange(from,to){
	this.from=from;
	this.to=to;
}
DateRange.prototype.withinRange=function(value){
	return(this.from.getTime()<=value.getTime()&&value.getTime()<=this.to.getTime());
}
DateRange.prototype.intersectsRange=function(dateRange){
	return(
		(dateRange.from.getTime()<=this.to.getTime()&&this.to.getTime()<=dateRange.to.getTime()) ||
		(dateRange.from.getTime()<=this.from.getTime()&&this.from.getTime()<=dateRange.to.getTime()) );
}
DateRange.prototype.intersectsRanges=function(dateRangeArray){
	for(var i=0;i<dateRangeArray.length;++i){
		if(this.intersectsRange(dateRangeArray[i])){
			return true;
		}
	}
}

Date.Days=['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
Date.Months=['January','February','March','April','May','June','July','August','September','October','November','December'];
Date.prototype.padded=function(value){return (value<10?('0'+value):value.toString());}
Date.prototype.getFullMonth=function(){return Date.Months[this.getMonth()];}
Date.prototype.getShortMonth=function(){return Date.Months[this.getMonth()].substring(0,3);}
Date.prototype.getFullDay=function(){return Date.Days[this.getDay()];}
Date.prototype.getShortDay=function(){return Date.Days[this.getDay()].substring(0,3);}
Date.prototype.format=function(formatString){
	var s=new String(formatString);
	s=s.replace('HH',this.padded(this.getHours()));
	s=s.replace('H',this.getHours().toString());
	s=s.replace('MM',this.padded(this.getMinutes()));
	s=s.replace('M',this.getMinutes().toString());
	s=s.replace('SS',this.padded(this.getSeconds()));
	s=s.replace('S',this.getSeconds().toString());
	s=s.replace('YYYY',this.getFullYear().toString());
	s=s.replace('YY',this.getFullYear().toString().substring(2,4));
	s=s.replace('DDDD',this.getFullDay());
	s=s.replace('DDD',this.getShortDay());
	s=s.replace('DD',this.padded(this.getDate()));
	s=s.replace('D',this.getDate().toString());
	s=s.replace('mmmm',this.getFullMonth());
	s=s.replace('mmm',this.getShortMonth());
	s=s.replace('mm',this.padded(this.getMonth()+1));
//	s=s.replace('m',(this.getMonth()+1).toString()); // Fails on ...ember months.
	return s;
}


Date.prototype.withinRange=function(dateRange){
	return(dateRange.from.getTime()<=this.getTime()&&this.getTime()<=dateRange.to.getTime());
}
Date.prototype.withinRanges=function(dateRangeArray){
	for(var i=0;i<dateRangeArray.length;++i){
		if(this.withinRange(dateRangeArray[i])){
			return true;
		}
	}
	return false;
}


Date.prototype.dateWithinRange=function(dateRange){
	var from=new Date(dateRange.from.getTime());
	var to=new Date(dateRange.to.getTime());
	from.setHours(0,0,0,0);
	to.setHours(23,59,59,999);
	return(from.getTime()<=this.getTime()&&this.getTime()<=to.getTime());
}
Date.prototype.dateWithinRanges=function(dateRangeArray){
	for(var i=0;i<dateRangeArray.length;++i){
		if(this.dateWithinRange(dateRangeArray[i])){
			return true;
		}
	}
	return false;
}
Date.prototype.monthWithinRange=function(dateRange){
	var from=new Date(dateRange.from.getTime());
	var to=new Date(dateRange.to.getTime());
	from.setDate(1);
	from.setHours(0,0,0,0);
	to.setMonth(dateRange.to.getMonth()+1,1);
	to.setHours(0,0,0,0);
	to.setTime(to.getTime()-1);
	return(from.getTime()<=this.getTime()&&this.getTime()<=to.getTime());
}
Date.prototype.monthWithinRanges=function(dateRangeArray){
	for(var i=0;i<dateRangeArray.length;++i){
		if(this.monthWithinRange(dateRangeArray[i])){
			return true;
		}
	}
	return false;
}

