var cabanovaFieldStates = {};
var cabanovaFieldValues = {};
var cabanovaFieldEffects = {};

function cabanovaFieldFocus(field)
{
	var fname = field.name;
	var fstate = cabanovaFieldStates[fname];
	
	if (cabanovaFieldValues[fname] == undefined)
	{
		cabanovaFieldValues[fname] = field.value;
	}
	
	var newstate;
	if (fstate == "ok") newstate = "ok";
	else if (fstate == "error") newstate = "error";
	else if (fstate == "hint") newstate = "hint";

	if (newstate != undefined)
	{
		var ficon = $("form_help_icon_" + fname);
		ficon.className = "form_" + newstate;
		
		var fbg = $("form_help_bg_" + fname);
		fbg.className = "form_bg_" + newstate;
		
		var fsign = $("form_help_sign_" + fname);
		fsign.className = "form_" + newstate;
	}

	var ftext = $("form_help_hint_text_" + fname);
	if (ftext != null && ftext.offsetHeight < 80)
	{
		ftext.style.height = "80px";
	}
	
	if (cabanovaFieldEffects[fname] != undefined) cabanovaFieldEffects[fname].cancel();
	cabanovaFieldEffects[fname] = new Effect.Appear(
		"form_help_" + fname,
		{
			duration: 0.2
		}
	);
}

function cabanovaFieldBlur(field)
{
	var fname = field.name;
	
	if (cabanovaFieldEffects[fname] != undefined) cabanovaFieldEffects[fname].cancel();
	cabanovaFieldEffects[fname] = new Effect.Fade(
		"form_help_" + fname,
		{
			duration: 0.2,
			from: 1,
			to: 0
		}
	);
}

var cabanovaFieldIntervals = {};
var cabanovaFieldValidateValues = {};
var cabanovaFields = {};
var cabanovaFieldsList = {};
var cabanovaFieldsValuesMap = {};
var cabanovaFieldsTransport = {};
var cabanovaFieldsProgress = {};

function cabanovaFieldValidateInit(field, match_field_name, extra_field_name)
{
	var fname = field.name;
	
	clearTimeout(cabanovaFieldIntervals[fname]);
	cabanovaFieldIntervals[fname] = null;
	
	cabanovaFieldValidateValues[fname] = field.value;
	
	cabanovaFieldIntervals[fname] = setTimeout(
		function()
		{
			cabanovaFieldValidate(field, match_field_name, extra_field_name)
		}
		, 250, field, match_field_name, extra_field_name
	);
}

function cabanovaFieldValidate(field, match_field_name, extra_field_name)
{
	var fname = field.name;
	var fvalue = field.value;
	
	var ok = true;
	if (cabanovaFieldsValuesMap[fname] == undefined)
	{
		cabanovaFieldsValuesMap[fname] = {};
	}
	
	if (cabanovaFields[fname] == "running")
	{
		cabanovaFieldsList[fname] = true;
		return ;
	}
	else
	{
		cabanovaFieldsList[fname] = false;
	}

/*
	if (cabanovaFieldsValuesMap[fname][fvalue] == undefined)
	{
		cabanovaFieldsValuesMap[fname][fvalue] = true;
	}
	else
	{
		if (cabanovaFieldsTransport[fname + "___" + fvalue] != undefined)
		{
			cabanovaFieldValidateSuccess(cabanovaFieldsTransport[fname + "___" + fvalue], fname, field, match_field_name, extra_field_name);
			return ;
		}
		else
		{
			return ;
		}
	}
*/

	clearTimeout(cabanovaFieldIntervals[fname]);
	cabanovaFieldIntervals[fname] = null;
	
	cabanovaFieldValidateValues[fname] = fvalue;
	
	if (cabanovaFieldValues[fname] == undefined)
	{
		cabanovaFieldValues[fname] = fvalue;
		return ;
	}
	else if (cabanovaFieldValues[fname] == fvalue)
	{
		//return ;
	}
	
	var form_object = null;
	var _field = field;
	while (_field != null && form_object == null)
	{
		_field = _field.parentNode;
		if (_field.nodeName.toLowerCase() == "form")
		{
			form_object = _field;
			break;
		}
	}
	
	var fieldValue = fvalue;
	if (field.type == "checkbox")
	{
		fieldValue = field.checked ? fvalue : "";
	}
	
	var params = {"__DAZOOT_AJAX_FORM__": true, field: field.name, value: fieldValue};
	if (match_field_name != null)
	{
		var match_field = $(match_field_name + "_id");
		if (match_field)
		{
			params.field_match = match_field_name;
			params.field_match_value = match_field.value;
		}
	}
	if (extra_field_name != null)
	{
		var extra_field = $(extra_field_name + "_id");
		if (extra_field)
		{
			params.field_extra = extra_field_name;
			params.field_extra_value = extra_field.value;
		}
	}
	
	cabanovaFields[fname] = "running";

	new Ajax.Request(
		form_object.action,
		{
			method: "post",
			parameters: params,
			onSuccess: function(transport)
			{
				cabanovaFieldsTransport[fname + "___" + fvalue] = transport.responseText;
				cabanovaFieldValidateSuccess(transport.responseText, fname, field, match_field_name, extra_field_name);
			},
			onFailure: function()
			{
				errorMessage("Could not complete the request");
			}
		}
	);	
}

function cabanovaFieldValidateSuccess(responseText, fname, field, match_field_name, extra_field_name)
{
	cabanovaFields[fname] = "finished";
	if (responseText == undefined)
	{
		return ;
	}
	var json = responseText.evalJSON();
	if (json == false)
	{
		errorMessage("Could not complete the request");
	}
	else
	{
		if (cabanovaFieldValidateValues[fname] != json.field_value && json.field_value != undefined) return ;

		var ftext = $("form_help_hint_text_" + fname);
		var fsign = $("form_help_sign_" + fname);
		var fbg = $("form_help_bg_" + fname);
		var ficon = $("form_help_icon_" + fname);

		if (json.status == "error")
		{
			cabanovaFieldStates[fname] = "error";
			if (ftext) ftext.innerHTML = json.message;
			fsign.className = "form_error";
			fbg.className = "form_bg_error";
			ficon.className = "form_error";
		} else
		{
			cabanovaFieldStates[fname] = "ok";
			if (ftext) ftext.innerHTML = json.message;
			fsign.className = "form_ok";
			fbg.className = "form_bg_ok";
			ficon.className = "form_ok";
		}
		if (ftext)
		{
			if (ftext.offsetHeight < 80)
			{
				ftext.style.height = "80px";
			}
		}
		if (cabanovaFieldsList[fname])
		{
			cabanovaFieldsList[fname] = false;
			cabanovaFieldValidate(field, match_field_name, extra_field_name);
		}
	}
}

function hideCabanovaField(field_name)
{
	var field = $(field_name + "_id");

	var row_object = null;
	while (field != null && row_object == null)
	{
		field = field.parentNode;
		if (field.nodeName.toLowerCase() == "tr")
		{
			row_object = field;
			break;
		}
	}
	if (row_object == null) return ;
	row_object.style.display = "none";
}

function showCabanovaField(field_name)
{
	var field = $(field_name + "_id");

	var row_object = null;
	while (field != null && row_object == null)
	{
		field = field.parentNode;
		if (field.nodeName.toLowerCase() == "tr")
		{
			row_object = field;
			break;
		}
	}
	if (row_object == null) return ;
	row_object.style.display = "";
}