(function($) {

	$.fn.instasub = function(options) {

		var elem = this;

		var messageLabel;
		var messageEnabled = false;
		var timeout;
		var data = {};

		var ajaxSuccess = function(data) {
			if (data) {
				if (data.ok && options.okCallback) {
					options.okCallback();
				}
				if (data.error && options.errorCallback) {
					options.errorCallback();
				}
				if (data.message) {
					setMessage(data.message);
					showMessage();
					setTimeout(hideMessage, 3000);
				} else {
					disableMessage();
				}
			}
		}

		var ajaxError = function(a, b, c) {
			$(options.icon).empty();
		}

		var disableMessage = function() {
			messageEnabled = false;
			
			$(options.icon).unbind('.instasub');
		}

		var enableMessage = function() {
			messageEnabled = true;
			
			$(options.icon).bind('mouseenter.instasub', function() {
				showMessage();
			}).bind('mouseleave.instasub', function() {
				hideMessage();
			});
		}

		var setMessage = function(message) {
			if (!messageEnabled)
				enableMessage();
			
			messageLabel = $(options.message);
			messageLabel.text(message);
		}

		var showMessage = function() {
			messageLabel.slideDown();
		}

		var hideMessage = function() {
			messageLabel.slideUp();
		}

		var validate = function() {

			if (elem.val() != "") {

				$(options.icon).html(options.loadImg);

				data = {
					'name'	: elem.attr('name'),
					'value'	: elem.val()
				};

				$.ajax({
					'url'		: options.url,
					'type'		: options.method,
					'data'		: data,
					'dataType'	: 'json',
					'success'	: ajaxSuccess,
					'error'		: ajaxError
				});
			}
		}

		var validate_with_delay = function() {
			clearTimeout(timeout);
			timeout = setTimeout(validate, 1000);
		}


		/////////////////////
		// HANDLERS
		this.blur(function() {
			validate();
		});
		this.keyup(function() {
			validate_with_delay();
		});
	}

})(jQuery);
