/**
 * Checks to see if a Username entered into a field has already been used or not
 * @constructor
 * @param field_id Text input id that username is entered into
 * @param result_id Html element id that the result text will be shown in
 */
nmdgf.widgets.UsernameAvailable = function(field_id, result_id, customer_id) {
	this.field_id = field_id;
	this.result_id = result_id;
	this.customer_id = customer_id || null;
	nmdgf.addOnLoad(this.initialize, this);
}
nmdgf.widgets.UsernameAvailable.prototype = {

	/**
	 * Field username is entered into
	 */
	field_id : null,

	/**
	 * Element to place result text into
	 */
	result_id : null,
	
	/**
	 * ID of the current customer
	 */
	customer_id : null,
	
	/**
	 * Local variable to store when last keyup event was fired
	 */
	lastKeypress : null,
	
	/**
	 * Length of time in milliseconds to wait for as a delay when the user types before checking username
	 */
	interval : 500,
	
	/**
	 * Current sequence of requests sent
	 */
	sequence : 0,

	/**
	 * url to send request to
	 */
	url :'/register/check-username/',
	
	/**
	 * CSS class used on result text container if username is available
	 */
	valid_css : 'username-available',
	
	/**
	 * CSS class used on result text container if username is NOT available
	 */
	invalid_css : 'username-not-available',

	/**
	 * Sets up event listeners
	 */
	initialize : function() {
		nmdgf.addListener(this.field_id, 'keypress', this.keypress, this);
	},

	/**
	 * Handles keyup event, and fires ajax request to check name after a proper delay in typing has occured
	 */
	keypress : function() {
		this.lastKeypress = new Date().getTime();
		var that = this;
		var sequence = this.sequence+1;
		this.sequence = sequence;
		setTimeout( function() {
			var currentTime = new Date().getTime();
			if ((currentTime - that.lastKeypress) > that.interval) {
				that.checkUsername(sequence);
			}
		}, (that.interval + 100));
	},
	
	/**
	 * Sends ajax request to check username availability
	 */
	checkUsername : function(sequence) {
		var username = nmdgf.byId(this.field_id).value;
		if(username !== '') {
			nmdgf.ajax('POST', this.url, {
				success : function(r) {
					if(this.sequence === sequence) {
						var result = nmdgf.parseJSON(r.responseText);
						nmdgf.byId(this.result_id).innerHTML = result.text;
						if(result.available === true) {
							this.displayValidResult(result);
						}else {
							this.displayInvalidResult(result);
						}
					}
				}, scope : this
			}, 'username='+username+'&customer_id='+this.customer_id);
		}else {
			nmdgf.removeClass(this.result_id, this.invalid_css);
			nmdgf.removeClass(this.result_id, this.valid_css);
			nmdgf.byId(this.result_id).innerHTML = '';
		}
	},
	
	displayValidResult : function(result) {
		nmdgf.removeClass(this.result_id, this.invalid_css);
		nmdgf.addClass(this.result_id, this.valid_css);
	},
	
	displayInvalidResult : function(result) {
		nmdgf.removeClass(this.result_id, this.valid_css);
		nmdgf.addClass(this.result_id, this.invalid_css);
	}
	
};
