var SotonDateValidation = function(g_form) {
	this.g_form = g_form;
	this.user_date_format = g_user_date_format.toUpperCase();
	// note, in strict D = D or DD
	this._formats = [
		this.user_date_format,
		'DDMMYYYY', 
		'DDMMYY',
		'YYYY/M/D',
		'D/M/YYYY',
		'D/M/YY',
		'YYYY-M-D',
		'D-M-YYYY',
		'D-M-YY'
	];
};

SotonDateValidation.prototype = {
	parse: function(value) {
		var date = moment(value, this._formats, true); // strict
		return date;
	},
	
	format: function(date) {
		return date.format(this.user_date_format);
	},
	
	/*
	 * Validate two dates that represent a range (start-end)
	 * @param {String} start_name Name of start variable
	 * @param {String} end_name Name of end variable
	 * @param {String} change_name Name of the variable that is changing (to add message to)
	 * @param {Object} params Parameters for the comparison, otherwise defaults to isBefore
	 * @return {boolean} Whether the values are valid
	 */
	validateRange: function(start_name, end_name, change_name, params) {
		var g_form = this.g_form;

		g_form.hideFieldMsg(change_name, true);
		
		if (!params) {
			params = {};
		}
		
		var start_value = g_form.getValue(start_name);
		var end_value = g_form.getValue(end_name);
		
		var start_date = this.parse(start_value);
		var end_date = this.parse(end_value);

		var start_label = g_form.getLabel(start_name);
		var end_label = g_form.getLabel(end_name);
		
		// need two dates to validate
		if (!start_date.isValid() || !end_date.isValid()) {
			return false;
		}
		
		var days = end_date.diff(start_date, 'days');
		
		var err = '';

		// start after end
		if (!start_date.isBefore(end_date)) {
			err = start_label + " must come before " + end_label;
		}
		// not enough days before end
		else if (params.minimum && days < params.minimum) {
			err = "Must be at least " + params.minimum + " days between " + start_label + " and " + end_label;
		}
		// too many days before end
		else if (params.maximum && days > params.maximum) {
			err = "Based on " + start_label + ", " + end_label + " can be no later than " + start_date.add(params.maximum, 'days').format(this._formats[0]);
		}
		if (err) {
			// allow portal to finish its re-valuing
			setTimeout(function() {
				g_form.setValue(change_name, '');
				g_form.hideFieldMsg(change_name, true);
				g_form.showFieldMsg(change_name, err, "error");
			}, 0);
			return false;
		}
		
		return true;
	},
	
	validate: function(name, newValue) {
		// this function is now handled by the "ServiceLine - Field Fixes" widget
		return true;
		/*
		var g_form = this.g_form;
		
		g_form.hideFieldMsg(name, true);
		
		var date = this.parse(newValue);
		
		if (!date.isValid()) {
			// allow portal to finish its re-valuing
			setTimeout(function() {
				g_form.setValue(name, '');
				g_form.hideFieldMsg(name, true);
				g_form.showFieldMsg(name, "Enter date in format " + g_user_date_format.toUpperCase(), "error");
			}, 0);
			return false;
		}
		
		var user_format = date.format(g_user_date_format.toUpperCase());
		
		// date not in default format, re-assign it
		if (newValue != user_format) {
			// allow portal to finish its re-valuing
			setTimeout(function() {
				g_form.setValue(name, user_format);
			}, 0);
			return false;
		}
		
		return true;
		*/
	}
};