var monthLength = [31,28,31,30,31,30,31,31,30,31,30,31];

var monthName = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];

function isLeap(yyyy) {

	if (yyyy%4 != 0) return 0;

	if (yyyy%100 != 0) return 1;

	return yyyy%400 == 0;

}

function getMonthLength(mm,yyyy) {

	if (mm==2) return isLeap(yyyy)?29:28;

	return monthLength[mm-1];

}



function DateRange(str) { // convert a single date string into a Date Range

	var fields = str.split(/\W+/); // split on non-alphanumeric

	if (fields.length == 1) { // just a year

		this.dateFrom = new Date("1 Jan " + fields[0]);

		this.dateTo = new Date("31 Dec " + fields[0]);

		}

	else if (fields.length == 2) {

		if (!isNaN(parseInt(fields[0])))

			this.dateFrom = new Date(fields[0] + "/1/" + fields[1]);

 		else

			this.dateFrom = new Date("1 " + fields[0] + " " + fields[1]);

		if (!isNaN(this.dateFrom))

			this.dateTo = new Date(this.dateFrom.getFullYear(),

			                       this.dateFrom.getMonth(),

								   getMonthLength(this.dateFrom.getMonth()+1, fields[1]));

		}	

	else {

		if (!isNaN(parseInt(fields[0])) && !isNaN(parseInt(fields[1])))

			this.dateFrom = new Date (fields[1] + "/" + fields[0] + "/" + fields[2]);		

		else

			this.dateFrom = new Date(fields[0] + " " + fields[1] + " " + fields[2]);

		this.dateTo = this.dateFrom;	

		}	

	this.error = isNaN(this.dateFrom) || isNaN(this.dateTo);

	this.asSortDates = DateRangeAsSortDates;

	this.asEnglishSortDates = DateRangeAsEnglishSortDates;

	this.mergeWith = DateRangeMergeWith;

}



function makeSortDate(date) {

	var mm = date.getMonth()+1;

	var dd = date.getDate();

	mm = ((mm < 10)?"0":"") + mm;

	dd = ((dd < 10)?"0":"") + dd;

	yyyy = date.getFullYear();

	if (yyyy < 1000)

		yyyy = '0' + yyyy;

	return yyyy+mm+dd;

}



function DateRangeAsSortDates() {

	return new Array(makeSortDate(this.dateFrom), makeSortDate(this.dateTo));

}



function makeEnglishSortDate(date) {

	var dd = date.getDate();

	dd = ((dd < 10)?"0":"") + dd;

	return dd+" "+monthName[date.getMonth()]+" "+date.getFullYear();

}



function DateRangeAsEnglishSortDates() {

	return new Array(makeEnglishSortDate(this.dateFrom), makeEnglishSortDate(this.dateTo));

}

function DateRangeMergeWith(other) {

	if (this.error || other.error) {

		this.error = true;

		return;

		}

	if (other.dateFrom.getTime() < this.dateFrom.getTime())

		this.dateFrom = other.dateFrom;

	if (other.dateTo.getTime() > this.dateTo.getTime())

		this.dateTo = other.dateTo;

}
