
Ext.define('Ext.ux.form.field.plugin.Unique', {
	extend: 'Ext.AbstractPlugin',
	alias: ['plugin.uniquevalidation'],

	_isValid: true,
	_ajaxReq: null,
	asJson: false,

	init: function (i_cmp) {

		var i_plugin = this;

		i_plugin.validateValue = Ext.Function.createBuffered(i_plugin.validateValue, 250);

		if (Ext.isObject(i_plugin.errorMessage)) {
			i_plugin.errorMessage = ip2.i18n(i_plugin.errorMessage);
		}

		i_plugin.id = 'Unique';
		i_plugin.component = i_cmp;

		i_cmp.getErrors = (function(f_old) {
			return function(value) {
				var a_errors = f_old.apply(this, arguments) || [];

				if (!i_plugin._isValid) {
					a_errors.push(i_plugin.errorMessage);
				}

				return a_errors;
			};
		})(i_cmp.getErrors);

		i_cmp.validate = (function(f_old) {
			return function() {

				i_plugin.validateValue(i_cmp.getValue(), function() {
					f_old.call(i_cmp);
				});

				return i_plugin._isValid;
			};
		})(i_cmp.validate);
	},
	getDataParent: function(i_parent) {

		while (i_parent && !i_parent.dataParent) {
			i_parent = i_parent.up();
		}

		return i_parent.dataParent;
	},
	getDataLanguage: function (i_parent) {

		while (i_parent && !i_parent.language) {
			i_parent = i_parent.up();
		}

		if (i_parent) {
			return i_parent.language ? i_parent.language : 'da';
		}
		else {
			return 'da';
		}
	},
	parseHandler: function(resp) {
		var o_resp = Ext.decode(resp);

		return o_resp.success;
	},

	validateValue: function(value, f_callback) {

		var i_plugin = this;
		var i_cmp = i_plugin.component;
		var o_params = {};

		if (i_cmp) {
			if (ip2.isEqual(i_cmp.originalValue, value)) {
				i_plugin._isValid = true;
				i_plugin._ajaxReq = null;
				f_callback(true);
				return;
			}
	
			if (i_plugin._ajaxReq) {
				Ext.Ajax.abort(i_plugin._ajaxReq);
			}
	
			Ext.Object.each(i_plugin.extraParams, function(key, val) {
				o_params[key] = Ext.isFunction(val) ? val.call(i_plugin.component, value) : val;
			});
	
			if (i_plugin.valueKey) {
				if (ip2.isStringedObject(value)) {
					value = JSON.parse(value);
				}
				o_params[i_plugin.valueKey] = value;
			}
	
			var s_language = i_plugin.getDataLanguage(i_cmp);
	
			if (s_language) {
				o_params.language = s_language;
			}
	
			if (i_plugin.asJson) {
				i_plugin._ajaxReq = Ext.Ajax.request({
					url: i_plugin.serviceUrl,
					jsonData: o_params,
					success: function (o_resp) {
						
						if (i_plugin.parseHandler) {
							var b_valid = i_plugin.parseHandler.call(i_plugin.component, o_resp.responseText);
	
							i_plugin._isValid = b_valid;
							i_plugin._ajaxReq = null;
							f_callback(b_valid);
						}
						
					}
				});
			}
			else {
				i_plugin._ajaxReq = Ext.Ajax.request({
					url: i_plugin.serviceUrl,
					params: o_params,
					success: function (o_resp) {

						if (i_plugin.parseHandler) {

							var b_valid = i_plugin.parseHandler.call(i_plugin.component, o_resp.responseText);
							i_plugin._isValid = b_valid;
							i_plugin._ajaxReq = null;
							f_callback(b_valid);
						}
						
					}
				});
			}
		}

		
	}
});
