/**
 * Validator
 * @uses Inputs
 * @uses Trim
 * @version 1.0.3
 */
var has_errors = false;
var errors_map = {};

function validator_map(map)
{
	errors_map = map;
}

function validator_unmap()
{
	errors_map = {};
}

function validator_errors()
{
	return has_errors;
}

function validator_get(object, all)
{
	object = validator_get_object(object);
	if (object === null)
		throw "";

	var value = "";

	var tag_name = object[0].tagName;
	switch (tag_name)
	{
		case "INPUT":
			value = trim(object.val());
			break;
		case "TEXTAREA":
			value = object.val();
			break;
		case "SELECT":
			if (all)
			{
				value = inputs_select_get_values(object);
				if (!value.length)
					value = "";
			}
			else
			{
				value = object.val();
				if (value === null)
					value = "";

				if (typeof value == "object")
					break;

				value = trim(value);
			}
			break;
	}

	if (value !== "")
		return value;

	validator_parse_string(object);
	return null;
}

function validator_show_error(object, text, clear)
{
	has_errors = true;

	object = validator_get_object(object);
	if (object === null)
	{
		alert(text);
		return;
	}

	if (clear)
		validator_reset();

	object.addClass("error_selected");

	var errors = validator_find_container(object);
	if (!errors)
		return;

	if (errors.text() != "")
		text = "<br />" + text;

	errors.append(text);
	errors.show();
}

function validator_parse_string(object)
{
	object = validator_get_object(object);
	if (!object.length)
		throw "";

	var name = validator_name(object);

	validator_show_error(object, "Поле <b>" + name + "</b> обязательно для заполнения");
}

function validator_name(object)
{
	var name = object.attr("title");
	if (name !== "")
		return name;

	var id = object.attr("id");
	if (id !== "")
	{
		var label = $("label[for=" + id + "]");
		if (label.length == 1)
			return trim(label.text(), "\\s:");
	}

	return object.attr("name");
}

function validator_parse_object(param)
{
	for (var key in param)
		validator_show_error(key, "Поле <b>" + param[key] + "</b> обязательно для заполнения");
}

function validator_reset()
{
	$(".error_selected").removeClass("error_selected");
	$(".errors").empty();
	$(".errors").hide();

	has_errors = false;
}

function validator_get_object(object)
{
	if (typeof object != "string")
		return object;

	if (typeof errors_map[object] != "undefined")
		object = errors_map[object];

	if (typeof object != "string")
		return object;

	return $("#" + object);
}

function validator_find_container(object)
{
	while (object.length)
	{
		var errors = object.find(".errors");
		if (errors.length)
			return errors;

		object = object.parent();
	}

	alert("Errors: Can't find '.errors' container");
	return null;
}

function validator_form(inputs, form)
{
	validator_reset();

	for (var name in inputs)
	{
		var input = inputs[name];
		if (input['value'] !== "")
			continue;

		var element = form.find("[name='" + input['name'] + "']");
		if (!element.length)
			continue;

		validator_parse_string(element);
	}

	return !(validator_errors());
}
