﻿var DateRangeSelector = function(options) {
	var defaults = {
		fromTxt: '#from',
		toTxt: '#to',
		minDate: null,
		minDateRange: 1,
		todayMin: true,
		datePickerOptions: {},
		onSelect: null
	};
	
	var _options = $.extend({}, defaults, options);
	var _datePickerOptions = $.extend({}, {}, _options.datePickerOptions);
	
	var today = new Date();
	if(_options.minDate) {
		_options.minDate = new Date(Date.parse(_options.minDate));
		if(_options.minDate < today && _options.todayMin)
			_options.minDate = today;
	} else {
		if(_options.todayMin)
			_options.minDate = today;
	}
	
	var _txtFrom = $(_options.fromTxt);
	var _txtTo = $(_options.toTxt);
	var _beforeShowFrom = null;
	var _minDate;
	
	var toDatapickerOptions = $.extend({}, {
		onSelect: function(dateText, inst) {
			if(_options.onSelect) {
				var from = tryGetDate(_txtFrom.val());
				var to = tryGetDate(dateText);
				
				if(!from || !to)
					return;
				
				_options.onSelect(from, to, to - from);
			}
		}
	}, _datePickerOptions);

	
	var tryGetDate = function(txt) {
		try {
			var dt = Date.parse(txt);
			return dt;
		} catch(err) { }
		return null;
	}
	
	this.getStartDate = function() {
		return tryGetDate(_txtFrom.val());
	}
	
	this.getEndDate = function() {
		return tryGetDate(_txtTo.val());
	}
	
	var dtoptions = {
		beforeShow: function(inst) {
			_beforeShowFrom = tryGetDate($(inst).val());
		},
		onSelect: function(dateText, inst) {
			var from = tryGetDate(dateText);
			if(!from)
				return;
			
			var to = tryGetDate(_txtTo.val());
			var diff = 0;
			if(to && _beforeShowFrom) {
				diff = Math.round( Math.abs(to - _beforeShowFrom));
			}
			if(diff < _options.minDateRange)
				diff = 259200000;
			
			var newTo = new Date(from + diff);
			
			if(_txtTo.attr('disabled')) {
				_txtTo.removeAttr('disabled');
				_txtTo.datepicker(toDatapickerOptions);
			}
			
			_txtTo.val((newTo.getMonth() + 1) + '/' + newTo.getDate() + '/' +  newTo.getFullYear());
			_txtTo.datepicker('option', 'minDate', new Date(from + (86400000 * _options.minDateRange)));
			
			if(_options.onSelect)
				_options.onSelect(from, newTo, diff);
		},
		minDate: _options.minDate
	};
	
	var fromDatapickerOptions = $.extend({}, dtoptions, _datePickerOptions);
	_txtFrom.datepicker(fromDatapickerOptions);
	
	if(!_txtTo.val())
		_txtTo.attr('disabled', 'disabled');
	else {
		_txtTo.datepicker(toDatapickerOptions);
		var from = tryGetDate(_txtFrom.val());
		if(from)
			_txtTo.datepicker('option', 'minDate', new Date(from + (86400000 * _options.minDateRange)));
	}
};

